Add picture and email verified columns to the user, migrations, fixing OAuth with Google, creating types for OAuth

This commit is contained in:
Bradley Shellnut 2024-09-20 17:25:51 -07:00
parent cb271d377e
commit 3aa1c77947
12 changed files with 2037 additions and 116 deletions

View file

@ -1,5 +1,5 @@
import 'dotenv/config' import 'dotenv/config'
import env from '$lib/server/api/common/env' import env from './src/lib/server/api/common/env'
import { defineConfig } from 'drizzle-kit' import { defineConfig } from 'drizzle-kit'
export default defineConfig({ export default defineConfig({

View file

@ -27,7 +27,7 @@
"@faker-js/faker": "^8.4.1", "@faker-js/faker": "^8.4.1",
"@melt-ui/pp": "^0.3.2", "@melt-ui/pp": "^0.3.2",
"@melt-ui/svelte": "^0.83.0", "@melt-ui/svelte": "^0.83.0",
"@playwright/test": "^1.47.1", "@playwright/test": "^1.47.2",
"@sveltejs/adapter-auto": "^3.2.5", "@sveltejs/adapter-auto": "^3.2.5",
"@sveltejs/enhanced-img": "^0.3.8", "@sveltejs/enhanced-img": "^0.3.8",
"@sveltejs/kit": "^2.5.28", "@sveltejs/kit": "^2.5.28",
@ -64,13 +64,13 @@
"svelte-sequential-preprocessor": "^2.0.1", "svelte-sequential-preprocessor": "^2.0.1",
"sveltekit-flash-message": "^2.4.4", "sveltekit-flash-message": "^2.4.4",
"sveltekit-rate-limiter": "^0.5.2", "sveltekit-rate-limiter": "^0.5.2",
"sveltekit-superforms": "^2.18.1", "sveltekit-superforms": "^2.19.0",
"tailwindcss": "^3.4.12", "tailwindcss": "^3.4.12",
"ts-node": "^10.9.2", "ts-node": "^10.9.2",
"tslib": "^2.7.0", "tslib": "^2.7.0",
"tsx": "^4.19.1", "tsx": "^4.19.1",
"typescript": "^5.6.2", "typescript": "^5.6.2",
"vite": "^5.4.6", "vite": "^5.4.7",
"vitest": "^1.6.0", "vitest": "^1.6.0",
"zod": "^3.23.8" "zod": "^3.23.8"
}, },
@ -88,13 +88,13 @@
"@neondatabase/serverless": "^0.9.5", "@neondatabase/serverless": "^0.9.5",
"@paralleldrive/cuid2": "^2.2.2", "@paralleldrive/cuid2": "^2.2.2",
"@resvg/resvg-js": "^2.6.2", "@resvg/resvg-js": "^2.6.2",
"@sveltejs/adapter-node": "^5.2.3", "@sveltejs/adapter-node": "^5.2.4",
"@sveltejs/adapter-vercel": "^5.4.4", "@sveltejs/adapter-vercel": "^5.4.4",
"@types/feather-icons": "^4.29.4", "@types/feather-icons": "^4.29.4",
"@vercel/og": "^0.5.20", "@vercel/og": "^0.5.20",
"bits-ui": "^0.21.13", "bits-ui": "^0.21.15",
"boardgamegeekclient": "^1.9.1", "boardgamegeekclient": "^1.9.1",
"bullmq": "^5.13.1", "bullmq": "^5.13.2",
"class-variance-authority": "^0.7.0", "class-variance-authority": "^0.7.0",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"cookie": "^0.6.0", "cookie": "^0.6.0",

View file

@ -45,11 +45,11 @@ importers:
specifier: ^2.6.2 specifier: ^2.6.2
version: 2.6.2 version: 2.6.2
'@sveltejs/adapter-node': '@sveltejs/adapter-node':
specifier: ^5.2.3 specifier: ^5.2.4
version: 5.2.3(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1))) version: 5.2.4(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))
'@sveltejs/adapter-vercel': '@sveltejs/adapter-vercel':
specifier: ^5.4.4 specifier: ^5.4.4
version: 5.4.4(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1))) version: 5.4.4(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))
'@types/feather-icons': '@types/feather-icons':
specifier: ^4.29.4 specifier: ^4.29.4
version: 4.29.4 version: 4.29.4
@ -57,14 +57,14 @@ importers:
specifier: ^0.5.20 specifier: ^0.5.20
version: 0.5.20 version: 0.5.20
bits-ui: bits-ui:
specifier: ^0.21.13 specifier: ^0.21.15
version: 0.21.13(svelte@5.0.0-next.175) version: 0.21.15(svelte@5.0.0-next.175)
boardgamegeekclient: boardgamegeekclient:
specifier: ^1.9.1 specifier: ^1.9.1
version: 1.9.1 version: 1.9.1
bullmq: bullmq:
specifier: ^5.13.1 specifier: ^5.13.2
version: 5.13.1 version: 5.13.2
class-variance-authority: class-variance-authority:
specifier: ^0.7.0 specifier: ^0.7.0
version: 0.7.0 version: 0.7.0
@ -91,7 +91,7 @@ importers:
version: 4.29.2 version: 4.29.2
formsnap: formsnap:
specifier: ^1.0.1 specifier: ^1.0.1
version: 1.0.1(svelte@5.0.0-next.175)(sveltekit-superforms@2.18.1(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)))(@types/json-schema@7.0.15)(svelte@5.0.0-next.175)) version: 1.0.1(svelte@5.0.0-next.175)(sveltekit-superforms@2.19.0(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))(@types/json-schema@7.0.15)(svelte@5.0.0-next.175))
handlebars: handlebars:
specifier: ^4.7.8 specifier: ^4.7.8
version: 4.7.8 version: 4.7.8
@ -181,20 +181,20 @@ importers:
specifier: ^0.83.0 specifier: ^0.83.0
version: 0.83.0(svelte@5.0.0-next.175) version: 0.83.0(svelte@5.0.0-next.175)
'@playwright/test': '@playwright/test':
specifier: ^1.47.1 specifier: ^1.47.2
version: 1.47.1 version: 1.47.2
'@sveltejs/adapter-auto': '@sveltejs/adapter-auto':
specifier: ^3.2.5 specifier: ^3.2.5
version: 3.2.5(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1))) version: 3.2.5(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))
'@sveltejs/enhanced-img': '@sveltejs/enhanced-img':
specifier: ^0.3.8 specifier: ^0.3.8
version: 0.3.8(rollup@4.21.2)(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)) version: 0.3.8(rollup@4.21.2)(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1))
'@sveltejs/kit': '@sveltejs/kit':
specifier: ^2.5.28 specifier: ^2.5.28
version: 2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)) version: 2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1))
'@sveltejs/vite-plugin-svelte': '@sveltejs/vite-plugin-svelte':
specifier: ^3.1.2 specifier: ^3.1.2
version: 3.1.2(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)) version: 3.1.2(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1))
'@types/cookie': '@types/cookie':
specifier: ^0.6.0 specifier: ^0.6.0
version: 0.6.0 version: 0.6.0
@ -287,13 +287,13 @@ importers:
version: 2.0.1 version: 2.0.1
sveltekit-flash-message: sveltekit-flash-message:
specifier: ^2.4.4 specifier: ^2.4.4
version: 2.4.4(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175) version: 2.4.4(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)
sveltekit-rate-limiter: sveltekit-rate-limiter:
specifier: ^0.5.2 specifier: ^0.5.2
version: 0.5.2(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1))) version: 0.5.2(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))
sveltekit-superforms: sveltekit-superforms:
specifier: ^2.18.1 specifier: ^2.19.0
version: 2.18.1(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)))(@types/json-schema@7.0.15)(svelte@5.0.0-next.175) version: 2.19.0(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))(@types/json-schema@7.0.15)(svelte@5.0.0-next.175)
tailwindcss: tailwindcss:
specifier: ^3.4.12 specifier: ^3.4.12
version: 3.4.12(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.6.2)) version: 3.4.12(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.6.2))
@ -310,8 +310,8 @@ importers:
specifier: ^5.6.2 specifier: ^5.6.2
version: 5.6.2 version: 5.6.2
vite: vite:
specifier: ^5.4.6 specifier: ^5.4.7
version: 5.4.6(@types/node@20.16.5)(sass@1.79.1) version: 5.4.7(@types/node@20.16.5)(sass@1.79.1)
vitest: vitest:
specifier: ^1.6.0 specifier: ^1.6.0
version: 1.6.0(@types/node@20.16.5)(sass@1.79.1) version: 1.6.0(@types/node@20.16.5)(sass@1.79.1)
@ -329,11 +329,11 @@ packages:
resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
engines: {node: '>=6.0.0'} engines: {node: '>=6.0.0'}
'@ark/schema@0.2.0': '@ark/schema@0.10.0':
resolution: {integrity: sha512-IkNWCSHdjaoemMXpps4uFHEAQzwJPbTAS8K2vcQpk90sa+eNBuPSVyB/81/Qyl1VYW0iX3ceGC5NL/OznQv1jg==} resolution: {integrity: sha512-zpfXwWLOzj9aUK+dXQ6aleJAOgle4/WrHDop5CMX2M88dFQ85NdH8O0v0pvMAQnfFcaQAZ/nVDYLlBJsFc09XA==}
'@ark/util@0.1.0': '@ark/util@0.10.0':
resolution: {integrity: sha512-qCLYICQoCy3kEKDVwirQp8qvxhY7NJd8BhhoHaj1l3wCFAk9NUbcDsxAkPStZEMdPI/d7NcbGJe8SWZuRG2twQ==} resolution: {integrity: sha512-uK+9VU5doGMYOoOZVE+XaSs1vYACoaEJdrDkuBx26S4X7y3ChyKsPnIg/9pIw2vUySph1GkAXbvBnfVE2GmXgQ==}
'@asteasolutions/zod-to-openapi@7.1.1': '@asteasolutions/zod-to-openapi@7.1.1':
resolution: {integrity: sha512-lF0d1gAc0lYLO9/BAGivwTwE2Sh9h6CHuDcbk5KnGBfIuAsAkDC+Fdat4dkQY3CS/zUWKHRmFEma0B7X132Ymw==} resolution: {integrity: sha512-lF0d1gAc0lYLO9/BAGivwTwE2Sh9h6CHuDcbk5KnGBfIuAsAkDC+Fdat4dkQY3CS/zUWKHRmFEma0B7X132Ymw==}
@ -1706,8 +1706,8 @@ packages:
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
engines: {node: '>=14'} engines: {node: '>=14'}
'@playwright/test@1.47.1': '@playwright/test@1.47.2':
resolution: {integrity: sha512-dbWpcNQZ5nj16m+A5UNScYx7HX5trIy7g4phrcitn+Nk83S32EBX/CLU4hiF4RGKX/yRc93AAqtfaXB7JWBd4Q==} resolution: {integrity: sha512-jTXRsoSPONAs8Za9QEQdyjFn+0ZQFjCiIztAIF6bi1HqhBzG9Ma7g1WotyiGqFSBRZjIEqMdT8RUlbk1QVhzCQ==}
engines: {node: '>=18'} engines: {node: '>=18'}
hasBin: true hasBin: true
@ -1946,8 +1946,8 @@ packages:
peerDependencies: peerDependencies:
'@sveltejs/kit': ^2.0.0 '@sveltejs/kit': ^2.0.0
'@sveltejs/adapter-node@5.2.3': '@sveltejs/adapter-node@5.2.4':
resolution: {integrity: sha512-0KNrTc9NiEhB1vyVL0HiqZaW2P5JWNJgTYT5PnUZCLO9Oydx8G+6PNtJPJ/NNPyeGrn+6LwR5L8GNRvA4b5Bpw==} resolution: {integrity: sha512-L9Kngx1ce2SMCbyGBbRaJovl5lzdwH650SzOa50txAAssMfWLj2f8yPsA2eCX8EhT6AxD4RHLNrVa5W8VUYz8w==}
peerDependencies: peerDependencies:
'@sveltejs/kit': ^2.4.0 '@sveltejs/kit': ^2.4.0
@ -2231,8 +2231,8 @@ packages:
aria-query@5.3.0: aria-query@5.3.0:
resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
arktype@2.0.0-beta.0: arktype@2.0.0-rc.8:
resolution: {integrity: sha512-fE3ssMiXjr/bLqFPzlDhRlXngdyHQreu7p7i8+dtcY1CA+f8WrVUcue6JxywhnqEJXPG4HOcIwQcC+q4VfeUMQ==} resolution: {integrity: sha512-ByrqjptsavUCUL9ptts6BUL2LCNkVZyniOdaBw76dlBQ6gYIhYSeycuuj4gRFwcAafszOnAPD2fAqHK7bbo/Zw==}
array-flatten@1.1.1: array-flatten@1.1.1:
resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
@ -2272,8 +2272,8 @@ packages:
bindings@1.5.0: bindings@1.5.0:
resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==}
bits-ui@0.21.13: bits-ui@0.21.15:
resolution: {integrity: sha512-7nmOh6Ig7ND4DXZHv1FhNsY9yUGrad0+mf3tc4YN//3MgnJT1LnHtk4HZAKgmxCOe7txSX7/39LtYHbkrXokAQ==} resolution: {integrity: sha512-+m5WSpJnFdCcNdXSTIVC1WYBozipO03qRh03GFWgrdxoHiolCfwW71EYG4LPCWYPG6KcTZV0Cj6iHSiZ7cdKdg==}
peerDependencies: peerDependencies:
svelte: ^4.0.0 || ^5.0.0-next.118 svelte: ^4.0.0 || ^5.0.0-next.118
@ -2311,8 +2311,8 @@ packages:
resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==}
engines: {node: '>=6'} engines: {node: '>=6'}
bullmq@5.13.1: bullmq@5.13.2:
resolution: {integrity: sha512-9Ss2GzV+VVA2Q/+qUxQ7zxAwfLWBwc7DIUNboq0EdXGRf2Ia+Qi7BwT51rnxglu4b/0SRsSElevRT8IZc7HvtQ==} resolution: {integrity: sha512-McGE8k3mrCvdUHdU0sHkTKDS1xr4pff+hbEKBY51wk5S6Za0gkuejYA620VQTo3Zz37E/NVWMgumwiXPQ3yZcA==}
bytes@3.1.2: bytes@3.1.2:
resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
@ -3702,13 +3702,13 @@ packages:
pkg-types@1.2.0: pkg-types@1.2.0:
resolution: {integrity: sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==} resolution: {integrity: sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==}
playwright-core@1.47.1: playwright-core@1.47.2:
resolution: {integrity: sha512-i1iyJdLftqtt51mEk6AhYFaAJCDx0xQ/O5NU8EKaWFgMjItPVma542Nh/Aq8aLCjIJSzjaiEQGW/nyqLkGF1OQ==} resolution: {integrity: sha512-3JvMfF+9LJfe16l7AbSmU555PaTl2tPyQsVInqm3id16pdDfvZ8TTZ/pyzmkbDrZTQefyzU7AIHlZqQnxpqHVQ==}
engines: {node: '>=18'} engines: {node: '>=18'}
hasBin: true hasBin: true
playwright@1.47.1: playwright@1.47.2:
resolution: {integrity: sha512-SUEKi6947IqYbKxRiqnbUobVZY4bF1uu+ZnZNJX9DfU1tlf2UhWfvVjLf01pQx9URsOr18bFVUKXmanYWhbfkw==} resolution: {integrity: sha512-nx1cLMmQWqmA3UsnjaaokyoUpdVaaDhJhMoxX2qj3McpjnsqFHs516QAKYhqHAgOP+oCFTEOCOAaD1RgD/RQfA==}
engines: {node: '>=18'} engines: {node: '>=18'}
hasBin: true hasBin: true
@ -4490,8 +4490,8 @@ packages:
peerDependencies: peerDependencies:
'@sveltejs/kit': 1.x || 2.x '@sveltejs/kit': 1.x || 2.x
sveltekit-superforms@2.18.1: sveltekit-superforms@2.19.0:
resolution: {integrity: sha512-bdWXlWfvG0AauTj8KGZ00dZGix4jxzGM5ywXFZuodJjwGyEpnfNbui4n1KX5KdIqsVoTU1cKrxt0gZnuJivJsw==} resolution: {integrity: sha512-WJmdYf8WpuDkl6zxdRP72R+wDefx1OhIQYKdsIQqNkFntNq0/BUrkMdUr1i7d/FbX0gS1A9GRflCx3WiYQlAXg==}
peerDependencies: peerDependencies:
'@sveltejs/kit': 1.x || 2.x '@sveltejs/kit': 1.x || 2.x
svelte: 3.x || 4.x || >=5.0.0-next.51 svelte: 3.x || 4.x || >=5.0.0-next.51
@ -4716,8 +4716,8 @@ packages:
engines: {node: ^18.0.0 || >=20.0.0} engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true hasBin: true
vite@5.4.6: vite@5.4.7:
resolution: {integrity: sha512-IeL5f8OO5nylsgzd9tq4qD2QqI0k2CQLGrWD0rCN0EQJZpBK5vJAx0I+GDkMOXxQX/OfFHMuLIx6ddAxGX/k+Q==} resolution: {integrity: sha512-5l2zxqMEPVENgvzTuBpHer2awaetimj2BGkhBPdnwKbPNOlHsODU+oiazEZzLK7KhAnOrO+XGYJYn4ZlUhDtDQ==}
engines: {node: ^18.0.0 || >=20.0.0} engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
@ -4889,12 +4889,12 @@ snapshots:
'@jridgewell/gen-mapping': 0.3.5 '@jridgewell/gen-mapping': 0.3.5
'@jridgewell/trace-mapping': 0.3.25 '@jridgewell/trace-mapping': 0.3.25
'@ark/schema@0.2.0': '@ark/schema@0.10.0':
dependencies: dependencies:
'@ark/util': 0.1.0 '@ark/util': 0.10.0
optional: true optional: true
'@ark/util@0.1.0': '@ark/util@0.10.0':
optional: true optional: true
'@asteasolutions/zod-to-openapi@7.1.1(zod@3.23.8)': '@asteasolutions/zod-to-openapi@7.1.1(zod@3.23.8)':
@ -5925,9 +5925,9 @@ snapshots:
'@pkgjs/parseargs@0.11.0': '@pkgjs/parseargs@0.11.0':
optional: true optional: true
'@playwright/test@1.47.1': '@playwright/test@1.47.2':
dependencies: dependencies:
playwright: 1.47.1 playwright: 1.47.2
'@polka/url@1.0.0-next.25': {} '@polka/url@1.0.0-next.25': {}
@ -6100,41 +6100,41 @@ snapshots:
'@sodaru/yup-to-json-schema@2.0.1': '@sodaru/yup-to-json-schema@2.0.1':
optional: true optional: true
'@sveltejs/adapter-auto@3.2.5(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)))': '@sveltejs/adapter-auto@3.2.5(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))':
dependencies: dependencies:
'@sveltejs/kit': 2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)) '@sveltejs/kit': 2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1))
import-meta-resolve: 4.1.0 import-meta-resolve: 4.1.0
'@sveltejs/adapter-node@5.2.3(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)))': '@sveltejs/adapter-node@5.2.4(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))':
dependencies: dependencies:
'@rollup/plugin-commonjs': 26.0.1(rollup@4.21.2) '@rollup/plugin-commonjs': 26.0.1(rollup@4.21.2)
'@rollup/plugin-json': 6.1.0(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) '@rollup/plugin-node-resolve': 15.2.3(rollup@4.21.2)
'@sveltejs/kit': 2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)) '@sveltejs/kit': 2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1))
rollup: 4.21.2 rollup: 4.21.2
'@sveltejs/adapter-vercel@5.4.4(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)))': '@sveltejs/adapter-vercel@5.4.4(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))':
dependencies: dependencies:
'@sveltejs/kit': 2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)) '@sveltejs/kit': 2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1))
'@vercel/nft': 0.27.4 '@vercel/nft': 0.27.4
esbuild: 0.21.5 esbuild: 0.21.5
transitivePeerDependencies: transitivePeerDependencies:
- encoding - encoding
- supports-color - supports-color
'@sveltejs/enhanced-img@0.3.8(rollup@4.21.2)(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1))': '@sveltejs/enhanced-img@0.3.8(rollup@4.21.2)(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1))':
dependencies: dependencies:
magic-string: 0.30.11 magic-string: 0.30.11
svelte: 5.0.0-next.175 svelte: 5.0.0-next.175
svelte-parse-markup: 0.1.5(svelte@5.0.0-next.175) svelte-parse-markup: 0.1.5(svelte@5.0.0-next.175)
vite: 5.4.6(@types/node@20.16.5)(sass@1.79.1) vite: 5.4.7(@types/node@20.16.5)(sass@1.79.1)
vite-imagetools: 7.0.4(rollup@4.21.2) vite-imagetools: 7.0.4(rollup@4.21.2)
transitivePeerDependencies: transitivePeerDependencies:
- rollup - rollup
'@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1))': '@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1))':
dependencies: dependencies:
'@sveltejs/vite-plugin-svelte': 3.1.2(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)) '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1))
'@types/cookie': 0.6.0 '@types/cookie': 0.6.0
cookie: 0.6.0 cookie: 0.6.0
devalue: 5.0.0 devalue: 5.0.0
@ -6148,28 +6148,28 @@ snapshots:
sirv: 2.0.4 sirv: 2.0.4
svelte: 5.0.0-next.175 svelte: 5.0.0-next.175
tiny-glob: 0.2.9 tiny-glob: 0.2.9
vite: 5.4.6(@types/node@20.16.5)(sass@1.79.1) vite: 5.4.7(@types/node@20.16.5)(sass@1.79.1)
'@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1))': '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1))':
dependencies: dependencies:
'@sveltejs/vite-plugin-svelte': 3.1.2(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)) '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1))
debug: 4.3.6 debug: 4.3.6
svelte: 5.0.0-next.175 svelte: 5.0.0-next.175
vite: 5.4.6(@types/node@20.16.5)(sass@1.79.1) vite: 5.4.7(@types/node@20.16.5)(sass@1.79.1)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1))': '@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1))':
dependencies: 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.6(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)) '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1))
debug: 4.3.6 debug: 4.3.6
deepmerge: 4.3.1 deepmerge: 4.3.1
kleur: 4.1.5 kleur: 4.1.5
magic-string: 0.30.11 magic-string: 0.30.11
svelte: 5.0.0-next.175 svelte: 5.0.0-next.175
svelte-hmr: 0.16.0(svelte@5.0.0-next.175) svelte-hmr: 0.16.0(svelte@5.0.0-next.175)
vite: 5.4.6(@types/node@20.16.5)(sass@1.79.1) vite: 5.4.7(@types/node@20.16.5)(sass@1.79.1)
vitefu: 0.2.5(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)) vitefu: 0.2.5(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1))
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -6465,10 +6465,10 @@ snapshots:
dependencies: dependencies:
dequal: 2.0.3 dequal: 2.0.3
arktype@2.0.0-beta.0: arktype@2.0.0-rc.8:
dependencies: dependencies:
'@ark/schema': 0.2.0 '@ark/schema': 0.10.0
'@ark/util': 0.1.0 '@ark/util': 0.10.0
optional: true optional: true
array-flatten@1.1.1: {} array-flatten@1.1.1: {}
@ -6501,7 +6501,7 @@ snapshots:
dependencies: dependencies:
file-uri-to-path: 1.0.0 file-uri-to-path: 1.0.0
bits-ui@0.21.13(svelte@5.0.0-next.175): bits-ui@0.21.15(svelte@5.0.0-next.175):
dependencies: dependencies:
'@internationalized/date': 3.5.5 '@internationalized/date': 3.5.5
'@melt-ui/svelte': 0.76.2(svelte@5.0.0-next.175) '@melt-ui/svelte': 0.76.2(svelte@5.0.0-next.175)
@ -6559,7 +6559,7 @@ snapshots:
builtin-modules@3.3.0: {} builtin-modules@3.3.0: {}
bullmq@5.13.1: bullmq@5.13.2:
dependencies: dependencies:
cron-parser: 4.9.0 cron-parser: 4.9.0
ioredis: 5.4.1 ioredis: 5.4.1
@ -7233,11 +7233,11 @@ snapshots:
cross-spawn: 7.0.3 cross-spawn: 7.0.3
signal-exit: 4.1.0 signal-exit: 4.1.0
formsnap@1.0.1(svelte@5.0.0-next.175)(sveltekit-superforms@2.18.1(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)))(@types/json-schema@7.0.15)(svelte@5.0.0-next.175)): formsnap@1.0.1(svelte@5.0.0-next.175)(sveltekit-superforms@2.19.0(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))(@types/json-schema@7.0.15)(svelte@5.0.0-next.175)):
dependencies: dependencies:
nanoid: 5.0.7 nanoid: 5.0.7
svelte: 5.0.0-next.175 svelte: 5.0.0-next.175
sveltekit-superforms: 2.18.1(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)))(@types/json-schema@7.0.15)(svelte@5.0.0-next.175) sveltekit-superforms: 2.19.0(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))(@types/json-schema@7.0.15)(svelte@5.0.0-next.175)
forwarded@0.2.0: {} forwarded@0.2.0: {}
@ -7953,11 +7953,11 @@ snapshots:
mlly: 1.7.1 mlly: 1.7.1
pathe: 1.1.2 pathe: 1.1.2
playwright-core@1.47.1: {} playwright-core@1.47.2: {}
playwright@1.47.1: playwright@1.47.2:
dependencies: dependencies:
playwright-core: 1.47.1 playwright-core: 1.47.2
optionalDependencies: optionalDependencies:
fsevents: 2.3.2 fsevents: 2.3.2
@ -8790,19 +8790,19 @@ snapshots:
magic-string: 0.30.11 magic-string: 0.30.11
zimmerframe: 1.1.2 zimmerframe: 1.1.2
sveltekit-flash-message@2.4.4(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175): sveltekit-flash-message@2.4.4(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175):
dependencies: dependencies:
'@sveltejs/kit': 2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)) '@sveltejs/kit': 2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1))
svelte: 5.0.0-next.175 svelte: 5.0.0-next.175
sveltekit-rate-limiter@0.5.2(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1))): sveltekit-rate-limiter@0.5.2(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1))):
dependencies: dependencies:
'@isaacs/ttlcache': 1.4.1 '@isaacs/ttlcache': 1.4.1
'@sveltejs/kit': 2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)) '@sveltejs/kit': 2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1))
sveltekit-superforms@2.18.1(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)))(@types/json-schema@7.0.15)(svelte@5.0.0-next.175): sveltekit-superforms@2.19.0(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))(@types/json-schema@7.0.15)(svelte@5.0.0-next.175):
dependencies: dependencies:
'@sveltejs/kit': 2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)) '@sveltejs/kit': 2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1))
devalue: 5.0.0 devalue: 5.0.0
just-clone: 6.2.0 just-clone: 6.2.0
memoize-weak: 1.0.2 memoize-weak: 1.0.2
@ -8815,7 +8815,7 @@ snapshots:
'@sodaru/yup-to-json-schema': 2.0.1 '@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) '@typeschema/class-validator': 0.2.0(@types/json-schema@7.0.15)(class-validator@0.14.1)
'@vinejs/vine': 1.8.0 '@vinejs/vine': 1.8.0
arktype: 2.0.0-beta.0 arktype: 2.0.0-rc.8
class-validator: 0.14.1 class-validator: 0.14.1
joi: 17.13.3 joi: 17.13.3
json-schema-to-ts: 3.1.1 json-schema-to-ts: 3.1.1
@ -9043,7 +9043,7 @@ snapshots:
debug: 4.3.6 debug: 4.3.6
pathe: 1.1.2 pathe: 1.1.2
picocolors: 1.1.0 picocolors: 1.1.0
vite: 5.4.6(@types/node@20.16.5)(sass@1.79.1) vite: 5.4.7(@types/node@20.16.5)(sass@1.79.1)
transitivePeerDependencies: transitivePeerDependencies:
- '@types/node' - '@types/node'
- less - less
@ -9055,7 +9055,7 @@ snapshots:
- supports-color - supports-color
- terser - terser
vite@5.4.6(@types/node@20.16.5)(sass@1.79.1): vite@5.4.7(@types/node@20.16.5)(sass@1.79.1):
dependencies: dependencies:
esbuild: 0.21.5 esbuild: 0.21.5
postcss: 8.4.47 postcss: 8.4.47
@ -9065,9 +9065,9 @@ snapshots:
fsevents: 2.3.3 fsevents: 2.3.3
sass: 1.79.1 sass: 1.79.1
vitefu@0.2.5(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)): vitefu@0.2.5(vite@5.4.7(@types/node@20.16.5)(sass@1.79.1)):
optionalDependencies: optionalDependencies:
vite: 5.4.6(@types/node@20.16.5)(sass@1.79.1) vite: 5.4.7(@types/node@20.16.5)(sass@1.79.1)
vitest@1.6.0(@types/node@20.16.5)(sass@1.79.1): vitest@1.6.0(@types/node@20.16.5)(sass@1.79.1):
dependencies: dependencies:
@ -9088,7 +9088,7 @@ snapshots:
strip-literal: 2.1.0 strip-literal: 2.1.0
tinybench: 2.9.0 tinybench: 2.9.0
tinypool: 0.8.4 tinypool: 0.8.4
vite: 5.4.6(@types/node@20.16.5)(sass@1.79.1) vite: 5.4.7(@types/node@20.16.5)(sass@1.79.1)
vite-node: 1.6.0(@types/node@20.16.5)(sass@1.79.1) vite-node: 1.6.0(@types/node@20.16.5)(sass@1.79.1)
why-is-node-running: 2.3.0 why-is-node-running: 2.3.0
optionalDependencies: optionalDependencies:

View file

@ -0,0 +1,9 @@
export type OAuthUser = {
sub: string;
given_name?: string;
family_name?: string;
picture?: string;
username: string;
email?: string;
email_verified?: boolean;
}

View file

@ -7,6 +7,7 @@ import { OAuth2RequestError } from 'arctic'
import { getCookie, setCookie } from 'hono/cookie' import { getCookie, setCookie } from 'hono/cookie'
import { TimeSpan } from 'oslo' import { TimeSpan } from 'oslo'
import { inject, injectable } from 'tsyringe' import { inject, injectable } from 'tsyringe'
import type {OAuthUser} from "$lib/server/api/common/types/oauth-user";
@injectable() @injectable()
export class OAuthController extends Controller { export class OAuthController extends Controller {
@ -25,8 +26,6 @@ export class OAuthController extends Controller {
const state = c.req.query('state')?.toString() ?? null const state = c.req.query('state')?.toString() ?? null
const storedState = getCookie(c).github_oauth_state ?? null const storedState = getCookie(c).github_oauth_state ?? null
console.log('code', code, 'state', state, 'storedState', storedState)
if (!code || !state || !storedState || state !== storedState) { if (!code || !state || !storedState || state !== storedState) {
return c.body(null, 400) return c.body(null, 400)
} }
@ -39,7 +38,13 @@ export class OAuthController extends Controller {
}) })
const githubUser: GitHubUser = await githubUserResponse.json() const githubUser: GitHubUser = await githubUserResponse.json()
const userId = await this.oauthService.handleOAuthUser(githubUser.id, githubUser.login, 'github') const oAuthUser: OAuthUser = {
sub: `${githubUser.id}`,
username: githubUser.login,
email: null
}
const userId = await this.oauthService.handleOAuthUser(oAuthUser, 'github')
const session = await this.luciaService.lucia.createSession(userId, {}) const session = await this.luciaService.lucia.createSession(userId, {})
const sessionCookie = this.luciaService.lucia.createSessionCookie(session.id) const sessionCookie = this.luciaService.lucia.createSessionCookie(session.id)
@ -75,23 +80,29 @@ export class OAuthController extends Controller {
const storedState = getCookie(c).google_oauth_state ?? null const storedState = getCookie(c).google_oauth_state ?? null
const storedCodeVerifier = getCookie(c).google_oauth_code_verifier ?? null const storedCodeVerifier = getCookie(c).google_oauth_code_verifier ?? null
console.log('code', code, 'state', state, 'storedState', storedState)
if (!code || !storedState || !storedCodeVerifier || state !== storedState) { if (!code || !storedState || !storedCodeVerifier || state !== storedState) {
return c.body(null, 400) return c.body(null, 400)
} }
const tokens = await google.validateAuthorizationCode(code, storedCodeVerifier) const tokens = await google.validateAuthorizationCode(code, storedCodeVerifier)
console.log('tokens', tokens) const googleUserResponse = await fetch("https://openidconnect.googleapis.com/v1/userinfo", {
const googleUserResponse = await fetch('https://www.googleapis.com/oauth2/v3/userinfo', {
headers: { headers: {
Authorization: `Bearer ${tokens.accessToken}`, Authorization: `Bearer ${tokens.accessToken}`,
}, },
}) })
console.log('googleUserResponse', googleUserResponse)
const googleUser: GoogleUser = await googleUserResponse.json() const googleUser: GoogleUser = await googleUserResponse.json()
const userId = await this.oauthService.handleOAuthUser(googleUser.id, googleUser.login, 'github') const oAuthUser: OAuthUser = {
sub: googleUser.sub,
given_name: googleUser.given_name,
family_name: googleUser.family_name,
picture: googleUser.picture,
username: googleUser.email,
email: googleUser.email,
email_verified: googleUser.email_verified,
}
const userId = await this.oauthService.handleOAuthUser(oAuthUser, 'google')
const session = await this.luciaService.lucia.createSession(userId, {}) const session = await this.luciaService.lucia.createSession(userId, {})
const sessionCookie = this.luciaService.lucia.createSessionCookie(session.id) const sessionCookie = this.luciaService.lucia.createSessionCookie(session.id)
@ -129,6 +140,11 @@ interface GitHubUser {
} }
interface GoogleUser { interface GoogleUser {
id: number sub: string
login: string name: string
given_name: string
family_name: string
picture: string
email: string
email_verified: boolean
} }

View file

@ -0,0 +1,2 @@
ALTER TABLE "users" ADD COLUMN "email_verified" boolean DEFAULT false;--> statement-breakpoint
ALTER TABLE "users" ADD COLUMN "picture" text;

File diff suppressed because it is too large Load diff

View file

@ -8,6 +8,13 @@
"when": 1725489682980, "when": 1725489682980,
"tag": "0000_volatile_warhawk", "tag": "0000_volatile_warhawk",
"breakpoints": true "breakpoints": true
},
{
"idx": 1,
"version": "7",
"when": 1726877846811,
"tag": "0001_pink_the_enforcers",
"breakpoints": true
} }
] ]
} }

View file

@ -15,6 +15,8 @@ export const usersTable = pgTable('users', {
last_name: text('last_name'), last_name: text('last_name'),
verified: boolean('verified').default(false), verified: boolean('verified').default(false),
receive_email: boolean('receive_email').default(false), receive_email: boolean('receive_email').default(false),
email_verified: boolean('email_verified').default(false),
picture: text('picture'),
mfa_enabled: boolean('mfa_enabled').notNull().default(false), mfa_enabled: boolean('mfa_enabled').notNull().default(false),
theme: text('theme').default('system'), theme: text('theme').default('system'),
...timestamps, ...timestamps,

View file

@ -1,6 +1,7 @@
import { inject, injectable } from 'tsyringe' import { inject, injectable } from 'tsyringe'
import { FederatedIdentityRepository } from '../repositories/federated_identity.repository' import { FederatedIdentityRepository } from '../repositories/federated_identity.repository'
import { UsersService } from './users.service' import { UsersService } from './users.service'
import type {OAuthUser} from "$lib/server/api/common/types/oauth-user";
@injectable() @injectable()
export class OAuthService { export class OAuthService {
@ -9,14 +10,14 @@ export class OAuthService {
@inject(UsersService) private readonly usersService: UsersService, @inject(UsersService) private readonly usersService: UsersService,
) {} ) {}
async handleOAuthUser(oauthUserId: number, oauthUsername: string, oauthProvider: string) { async handleOAuthUser(oAuthUser: OAuthUser, oauthProvider: string) {
const federatedUser = await this.federatedIdentityRepository.findOneByFederatedUserIdAndProvider(`${oauthUserId}`, oauthProvider) const federatedUser = await this.federatedIdentityRepository.findOneByFederatedUserIdAndProvider(oAuthUser.sub, oauthProvider)
if (federatedUser) { if (federatedUser) {
return federatedUser.user_id return federatedUser.user_id
} }
const user = await this.usersService.createOAuthUser(oauthUserId, oauthUsername, oauthProvider) const user = await this.usersService.createOAuthUser(oAuthUser, oauthProvider)
if (!user) { if (!user) {
throw new Error('Failed to create user') throw new Error('Failed to create user')

View file

@ -5,11 +5,12 @@ import { WishlistsRepository } from '$lib/server/api/repositories/wishlists.repo
import { TokensService } from '$lib/server/api/services/tokens.service' import { TokensService } from '$lib/server/api/services/tokens.service'
import { UserRolesService } from '$lib/server/api/services/user_roles.service' import { UserRolesService } from '$lib/server/api/services/user_roles.service'
import { inject, injectable } from 'tsyringe' import { inject, injectable } from 'tsyringe'
import { CredentialsType } from '../databases/tables' import {CredentialsType, RoleName} from '../databases/tables'
import { type UpdateUser, UsersRepository } from '../repositories/users.repository' import { type UpdateUser, UsersRepository } from '../repositories/users.repository'
import { CollectionsService } from './collections.service' import { CollectionsService } from './collections.service'
import { DrizzleService } from './drizzle.service' import { DrizzleService } from './drizzle.service'
import { WishlistsService } from './wishlists.service' import { WishlistsService } from './wishlists.service'
import type {OAuthUser} from "$lib/server/api/common/types/oauth-user";
@injectable() @injectable()
export class UsersService { export class UsersService {
@ -58,18 +59,23 @@ export class UsersService {
return null return null
} }
await this.userRolesService.addRoleToUser(createdUser.id, 'user', true, trx) await this.userRolesService.addRoleToUser(createdUser.id, RoleName.USER, true, trx)
await this.wishlistsService.createEmptyNoName(createdUser.id, trx) await this.wishlistsService.createEmptyNoName(createdUser.id, trx)
await this.collectionsService.createEmptyNoName(createdUser.id, trx) await this.collectionsService.createEmptyNoName(createdUser.id, trx)
}) })
} }
async createOAuthUser(oauthUserId: number, oauthUsername: string, oauthProvider: string) { async createOAuthUser(oAuthUser: OAuthUser, oauthProvider: string) {
return await this.drizzleService.db.transaction(async (trx) => { return await this.drizzleService.db.transaction(async (trx) => {
const createdUser = await this.usersRepository.create( const createdUser = await this.usersRepository.create(
{ {
username: oauthUsername, username: oAuthUser.username || oAuthUser.username,
email: oAuthUser.email || null,
first_name: oAuthUser.given_name || null,
last_name: oAuthUser.family_name || null,
picture: oAuthUser.picture || null,
email_verified: oAuthUser.email_verified || false,
}, },
trx, trx,
) )
@ -82,13 +88,13 @@ export class UsersService {
{ {
identity_provider: oauthProvider, identity_provider: oauthProvider,
user_id: createdUser.id, user_id: createdUser.id,
federated_user_id: `${oauthUserId}`, federated_user_id: oAuthUser.sub,
federated_username: oauthUsername, federated_username: oAuthUser.email || oAuthUser.username,
}, },
trx, trx,
) )
await this.userRolesService.addRoleToUser(createdUser.id, 'user', true, trx) await this.userRolesService.addRoleToUser(createdUser.id, RoleName.USER, true, trx)
await this.wishlistsService.createEmptyNoName(createdUser.id, trx) await this.wishlistsService.createEmptyNoName(createdUser.id, trx)
await this.collectionsService.createEmptyNoName(createdUser.id, trx) await this.collectionsService.createEmptyNoName(createdUser.id, trx)

View file

@ -9,7 +9,9 @@ export async function GET(event: RequestEvent): Promise<Response> {
const state = generateState() const state = generateState()
const codeVerifier = generateCodeVerifier(); const codeVerifier = generateCodeVerifier();
const url = await google.createAuthorizationURL(state, codeVerifier) const url = await google.createAuthorizationURL(state, codeVerifier, {
scopes: ["profile", "email", "openid"]
})
event.cookies.set('google_oauth_state', state, { event.cookies.set('google_oauth_state', state, {
path: '/', path: '/',