Slowly reverting tsyringe to test it that works better.

This commit is contained in:
Bradley Shellnut 2024-08-02 17:49:08 -07:00
parent 4dbc93f819
commit e655c0d319
26 changed files with 358 additions and 406 deletions

View file

@ -1 +1 @@
22.1.0 20.16.0

View file

@ -22,24 +22,21 @@
"site:update": "pnpm update -i -L", "site:update": "pnpm update -i -L",
"test:unit": "vitest" "test:unit": "vitest"
}, },
"engines": {
"node": "22.x"
},
"devDependencies": { "devDependencies": {
"@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.45.3", "@playwright/test": "^1.45.3",
"@sveltejs/adapter-auto": "^3.2.2", "@sveltejs/adapter-auto": "^3.2.2",
"@sveltejs/enhanced-img": "^0.3.1", "@sveltejs/enhanced-img": "^0.3.1",
"@sveltejs/kit": "^2.5.18", "@sveltejs/kit": "^2.5.20",
"@sveltejs/vite-plugin-svelte": "^3.1.1", "@sveltejs/vite-plugin-svelte": "^3.1.1",
"@types/cookie": "^0.6.0", "@types/cookie": "^0.6.0",
"@types/node": "^20.14.13", "@types/node": "^20.14.14",
"@types/pg": "^8.11.6", "@types/pg": "^8.11.6",
"@typescript-eslint/eslint-plugin": "^7.17.0", "@typescript-eslint/eslint-plugin": "^7.18.0",
"@typescript-eslint/parser": "^7.17.0", "@typescript-eslint/parser": "^7.18.0",
"autoprefixer": "^10.4.19", "autoprefixer": "^10.4.19",
"drizzle-kit": "^0.23.0", "drizzle-kit": "^0.23.1",
"eslint": "^8.57.0", "eslint": "^8.57.0",
"eslint-config-prettier": "^9.1.0", "eslint-config-prettier": "^9.1.0",
"eslint-plugin-svelte": "^2.43.0", "eslint-plugin-svelte": "^2.43.0",
@ -58,7 +55,7 @@
"satori": "^0.10.14", "satori": "^0.10.14",
"satori-html": "^0.3.2", "satori-html": "^0.3.2",
"svelte": "5.0.0-next.175", "svelte": "5.0.0-next.175",
"svelte-check": "^3.8.4", "svelte-check": "^3.8.5",
"svelte-headless-table": "^0.18.2", "svelte-headless-table": "^0.18.2",
"svelte-meta-tags": "^3.1.2", "svelte-meta-tags": "^3.1.2",
"svelte-preprocess": "^6.0.2", "svelte-preprocess": "^6.0.2",
@ -69,7 +66,7 @@
"tailwindcss": "^3.4.7", "tailwindcss": "^3.4.7",
"ts-node": "^10.9.2", "ts-node": "^10.9.2",
"tslib": "^2.6.3", "tslib": "^2.6.3",
"tsx": "^4.16.2", "tsx": "^4.16.5",
"typescript": "^5.5.4", "typescript": "^5.5.4",
"vite": "^5.3.5", "vite": "^5.3.5",
"vitest": "^1.6.0", "vitest": "^1.6.0",
@ -86,14 +83,15 @@
"@lukeed/uuid": "^2.0.1", "@lukeed/uuid": "^2.0.1",
"@neondatabase/serverless": "^0.9.4", "@neondatabase/serverless": "^0.9.4",
"@paralleldrive/cuid2": "^2.2.2", "@paralleldrive/cuid2": "^2.2.2",
"@resvg/resvg-js": "^2.6.2",
"@sveltejs/adapter-node": "^5.2.0", "@sveltejs/adapter-node": "^5.2.0",
"@sveltejs/adapter-vercel": "^5.4.1", "@sveltejs/adapter-vercel": "^5.4.1",
"@types/feather-icons": "^4.29.4", "@types/feather-icons": "^4.29.4",
"@vercel/og": "^0.5.20", "@vercel/og": "^0.5.20",
"arctic": "^1.9.2", "arctic": "^1.9.2",
"bits-ui": "^0.21.12", "bits-ui": "^0.21.13",
"boardgamegeekclient": "^1.9.1", "boardgamegeekclient": "^1.9.1",
"bullmq": "^5.11.0", "bullmq": "^5.12.0",
"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",
@ -103,7 +101,7 @@
"feather-icons": "^4.29.2", "feather-icons": "^4.29.2",
"formsnap": "^1.0.1", "formsnap": "^1.0.1",
"handlebars": "^4.7.8", "handlebars": "^4.7.8",
"hono": "^4.5.2", "hono": "^4.5.3",
"hono-rate-limiter": "^0.4.0", "hono-rate-limiter": "^0.4.0",
"html-entities": "^2.5.2", "html-entities": "^2.5.2",
"iconify-icon": "^2.1.0", "iconify-icon": "^2.1.0",
@ -118,8 +116,6 @@
"qrcode": "^1.5.3", "qrcode": "^1.5.3",
"radix-svelte": "^0.9.0", "radix-svelte": "^0.9.0",
"rate-limit-redis": "^4.2.0", "rate-limit-redis": "^4.2.0",
"reflect-metadata": "^0.2.2",
"@resvg/resvg-js": "^2.6.2",
"svelte-french-toast": "^1.2.0", "svelte-french-toast": "^1.2.0",
"svelte-lazy-loader": "^1.0.0", "svelte-lazy-loader": "^1.0.0",
"tailwind-merge": "^2.4.0", "tailwind-merge": "^2.4.0",

View file

@ -13,7 +13,7 @@ importers:
version: 5.0.13 version: 5.0.13
'@hono/zod-validator': '@hono/zod-validator':
specifier: ^0.2.2 specifier: ^0.2.2
version: 0.2.2(hono@4.5.2)(zod@3.23.8) version: 0.2.2(hono@4.5.3)(zod@3.23.8)
'@iconify-icons/line-md': '@iconify-icons/line-md':
specifier: ^1.2.30 specifier: ^1.2.30
version: 1.2.30 version: 1.2.30
@ -40,10 +40,10 @@ importers:
version: 2.6.2 version: 2.6.2
'@sveltejs/adapter-node': '@sveltejs/adapter-node':
specifier: ^5.2.0 specifier: ^5.2.0
version: 5.2.0(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8))) version: 5.2.0(@sveltejs/kit@2.5.20(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))
'@sveltejs/adapter-vercel': '@sveltejs/adapter-vercel':
specifier: ^5.4.1 specifier: ^5.4.1
version: 5.4.1(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8))) version: 5.4.1(@sveltejs/kit@2.5.20(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))
'@types/feather-icons': '@types/feather-icons':
specifier: ^4.29.4 specifier: ^4.29.4
version: 4.29.4 version: 4.29.4
@ -54,14 +54,14 @@ importers:
specifier: ^1.9.2 specifier: ^1.9.2
version: 1.9.2 version: 1.9.2
bits-ui: bits-ui:
specifier: ^0.21.12 specifier: ^0.21.13
version: 0.21.12(svelte@5.0.0-next.175) version: 0.21.13(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.11.0 specifier: ^5.12.0
version: 5.11.0 version: 5.12.0
class-variance-authority: class-variance-authority:
specifier: ^0.7.0 specifier: ^0.7.0
version: 0.7.0 version: 0.7.0
@ -85,16 +85,16 @@ 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.16.1(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)) version: 1.0.1(svelte@5.0.0-next.175)(sveltekit-superforms@2.16.1(@sveltejs/kit@2.5.20(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))(svelte@5.0.0-next.175))
handlebars: handlebars:
specifier: ^4.7.8 specifier: ^4.7.8
version: 4.7.8 version: 4.7.8
hono: hono:
specifier: ^4.5.2 specifier: ^4.5.3
version: 4.5.2 version: 4.5.3
hono-rate-limiter: hono-rate-limiter:
specifier: ^0.4.0 specifier: ^0.4.0
version: 0.4.0(hono@4.5.2) version: 0.4.0(hono@4.5.3)
html-entities: html-entities:
specifier: ^2.5.2 specifier: ^2.5.2
version: 2.5.2 version: 2.5.2
@ -148,10 +148,10 @@ importers:
version: 2.4.0 version: 2.4.0
tailwind-variants: tailwind-variants:
specifier: ^0.2.1 specifier: ^0.2.1
version: 0.2.1(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4))) version: 0.2.1(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4)))
tailwindcss-animate: tailwindcss-animate:
specifier: ^1.0.7 specifier: ^1.0.7
version: 1.0.7(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4))) version: 1.0.7(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4)))
zod-to-json-schema: zod-to-json-schema:
specifier: ^3.23.2 specifier: ^3.23.2
version: 3.23.2(zod@3.23.8) version: 3.23.2(zod@3.23.8)
@ -167,37 +167,37 @@ importers:
version: 1.45.3 version: 1.45.3
'@sveltejs/adapter-auto': '@sveltejs/adapter-auto':
specifier: ^3.2.2 specifier: ^3.2.2
version: 3.2.2(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8))) version: 3.2.2(@sveltejs/kit@2.5.20(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))
'@sveltejs/enhanced-img': '@sveltejs/enhanced-img':
specifier: ^0.3.1 specifier: ^0.3.1
version: 0.3.1(rollup@4.18.1)(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)) version: 0.3.1(rollup@4.18.1)(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8))
'@sveltejs/kit': '@sveltejs/kit':
specifier: ^2.5.18 specifier: ^2.5.20
version: 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)) version: 2.5.20(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8))
'@sveltejs/vite-plugin-svelte': '@sveltejs/vite-plugin-svelte':
specifier: ^3.1.1 specifier: ^3.1.1
version: 3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)) version: 3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8))
'@types/cookie': '@types/cookie':
specifier: ^0.6.0 specifier: ^0.6.0
version: 0.6.0 version: 0.6.0
'@types/node': '@types/node':
specifier: ^20.14.13 specifier: ^20.14.14
version: 20.14.13 version: 20.14.14
'@types/pg': '@types/pg':
specifier: ^8.11.6 specifier: ^8.11.6
version: 8.11.6 version: 8.11.6
'@typescript-eslint/eslint-plugin': '@typescript-eslint/eslint-plugin':
specifier: ^7.17.0 specifier: ^7.18.0
version: 7.17.0(@typescript-eslint/parser@7.17.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)
'@typescript-eslint/parser': '@typescript-eslint/parser':
specifier: ^7.17.0 specifier: ^7.18.0
version: 7.17.0(eslint@8.57.0)(typescript@5.5.4) version: 7.18.0(eslint@8.57.0)(typescript@5.5.4)
autoprefixer: autoprefixer:
specifier: ^10.4.19 specifier: ^10.4.19
version: 10.4.19(postcss@8.4.40) version: 10.4.19(postcss@8.4.40)
drizzle-kit: drizzle-kit:
specifier: ^0.23.0 specifier: ^0.23.1
version: 0.23.0 version: 0.23.1
eslint: eslint:
specifier: ^8.57.0 specifier: ^8.57.0
version: 8.57.0 version: 8.57.0
@ -206,7 +206,7 @@ importers:
version: 9.1.0(eslint@8.57.0) version: 9.1.0(eslint@8.57.0)
eslint-plugin-svelte: eslint-plugin-svelte:
specifier: ^2.43.0 specifier: ^2.43.0
version: 2.43.0(eslint@8.57.0)(svelte@5.0.0-next.175)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)) version: 2.43.0(eslint@8.57.0)(svelte@5.0.0-next.175)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))
just-clone: just-clone:
specifier: ^6.2.0 specifier: ^6.2.0
version: 6.2.0 version: 6.2.0
@ -230,7 +230,7 @@ importers:
version: 16.1.0(postcss@8.4.40) version: 16.1.0(postcss@8.4.40)
postcss-load-config: postcss-load-config:
specifier: ^5.1.0 specifier: ^5.1.0
version: 5.1.0(jiti@1.21.6)(postcss@8.4.40)(tsx@4.16.2) version: 5.1.0(jiti@1.21.6)(postcss@8.4.40)(tsx@4.16.5)
postcss-preset-env: postcss-preset-env:
specifier: ^9.6.0 specifier: ^9.6.0
version: 9.6.0(postcss@8.4.40) version: 9.6.0(postcss@8.4.40)
@ -253,8 +253,8 @@ importers:
specifier: 5.0.0-next.175 specifier: 5.0.0-next.175
version: 5.0.0-next.175 version: 5.0.0-next.175
svelte-check: svelte-check:
specifier: ^3.8.4 specifier: ^3.8.5
version: 3.8.4(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.40)(tsx@4.16.2))(postcss@8.4.40)(sass@1.77.8)(svelte@5.0.0-next.175) version: 3.8.5(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.40)(tsx@4.16.5))(postcss@8.4.40)(sass@1.77.8)(svelte@5.0.0-next.175)
svelte-headless-table: svelte-headless-table:
specifier: ^0.18.2 specifier: ^0.18.2
version: 0.18.2(svelte@5.0.0-next.175) version: 0.18.2(svelte@5.0.0-next.175)
@ -263,40 +263,40 @@ importers:
version: 3.1.2(svelte@5.0.0-next.175)(typescript@5.5.4) version: 3.1.2(svelte@5.0.0-next.175)(typescript@5.5.4)
svelte-preprocess: svelte-preprocess:
specifier: ^6.0.2 specifier: ^6.0.2
version: 6.0.2(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.40)(tsx@4.16.2))(postcss@8.4.40)(sass@1.77.8)(svelte@5.0.0-next.175)(typescript@5.5.4) version: 6.0.2(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.40)(tsx@4.16.5))(postcss@8.4.40)(sass@1.77.8)(svelte@5.0.0-next.175)(typescript@5.5.4)
svelte-sequential-preprocessor: svelte-sequential-preprocessor:
specifier: ^2.0.1 specifier: ^2.0.1
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.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175) version: 2.4.4(@sveltejs/kit@2.5.20(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))(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.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8))) version: 0.5.2(@sveltejs/kit@2.5.20(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))
sveltekit-superforms: sveltekit-superforms:
specifier: ^2.16.1 specifier: ^2.16.1
version: 2.16.1(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175) version: 2.16.1(@sveltejs/kit@2.5.20(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))(svelte@5.0.0-next.175)
tailwindcss: tailwindcss:
specifier: ^3.4.7 specifier: ^3.4.7
version: 3.4.7(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)) version: 3.4.7(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))
ts-node: ts-node:
specifier: ^10.9.2 specifier: ^10.9.2
version: 10.9.2(@types/node@20.14.13)(typescript@5.5.4) version: 10.9.2(@types/node@20.14.14)(typescript@5.5.4)
tslib: tslib:
specifier: ^2.6.3 specifier: ^2.6.3
version: 2.6.3 version: 2.6.3
tsx: tsx:
specifier: ^4.16.2 specifier: ^4.16.5
version: 4.16.2 version: 4.16.5
typescript: typescript:
specifier: ^5.5.4 specifier: ^5.5.4
version: 5.5.4 version: 5.5.4
vite: vite:
specifier: ^5.3.5 specifier: ^5.3.5
version: 5.3.5(@types/node@20.14.13)(sass@1.77.8) version: 5.3.5(@types/node@20.14.14)(sass@1.77.8)
vitest: vitest:
specifier: ^1.6.0 specifier: ^1.6.0
version: 1.6.0(@types/node@20.14.13)(sass@1.77.8) version: 1.6.0(@types/node@20.14.14)(sass@1.77.8)
zod: zod:
specifier: ^3.23.8 specifier: ^3.23.8
version: 3.23.8 version: 3.23.8
@ -565,6 +565,9 @@ packages:
peerDependencies: peerDependencies:
postcss: ^8.4 postcss: ^8.4
'@drizzle-team/brocli@0.8.2':
resolution: {integrity: sha512-zTrFENsqGvOkBOuHDC1pXCkDXNd2UhP4lI3gYGhQ1R1SPeAAfqzPsV1dcpMy4uNU6kB5VpU5NGhvwxVNETR02A==}
'@emnapi/core@0.45.0': '@emnapi/core@0.45.0':
resolution: {integrity: sha512-DPWjcUDQkCeEM4VnljEOEcXdAD7pp8zSZsgOujk/LGIwCXWbXJngin+MO4zbH429lzeC3WbYLGjE2MaUOwzpyw==} resolution: {integrity: sha512-DPWjcUDQkCeEM4VnljEOEcXdAD7pp8zSZsgOujk/LGIwCXWbXJngin+MO4zbH429lzeC3WbYLGjE2MaUOwzpyw==}
@ -1964,8 +1967,8 @@ packages:
svelte: ^4.0.0 || ^5.0.0-next.0 svelte: ^4.0.0 || ^5.0.0-next.0
vite: '>= 5.0.0' vite: '>= 5.0.0'
'@sveltejs/kit@2.5.18': '@sveltejs/kit@2.5.20':
resolution: {integrity: sha512-+g06hvpVAnH7b4CDjhnTDgFWBKBiQJpuSmQeGYOuzbO3SC3tdYjRNlDCrafvDtKbGiT2uxY5Dn9qdEUGVZdWOQ==} resolution: {integrity: sha512-47rJ5BoYwURE/Rp7FNMLp3NzdbWC9DQ/PmKd0mebxT2D/PrPxZxcLImcD3zsWdX2iS6oJk8ITJbO/N2lWnnUqA==}
engines: {node: '>=18.13'} engines: {node: '>=18.13'}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
@ -2018,8 +2021,8 @@ packages:
'@types/json-schema@7.0.15': '@types/json-schema@7.0.15':
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
'@types/node@20.14.13': '@types/node@20.14.14':
resolution: {integrity: sha512-+bHoGiZb8UiQ0+WEtmph2IWQCjIqg8MDZMAV+ppRRhUZnquF5mQkP/9vpSwJClEiSM/C7fZZExPzfU0vJTyp8w==} resolution: {integrity: sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ==}
'@types/pg@8.11.6': '@types/pg@8.11.6':
resolution: {integrity: sha512-/2WmmBXHLsfRqzfHW7BNZ8SbYzE8OSk7i3WjFYvfgRHj7S1xj+16Je5fUKv3lVdVzk/zn9TXOqf+avFCFIE0yQ==} resolution: {integrity: sha512-/2WmmBXHLsfRqzfHW7BNZ8SbYzE8OSk7i3WjFYvfgRHj7S1xj+16Je5fUKv3lVdVzk/zn9TXOqf+avFCFIE0yQ==}
@ -2033,8 +2036,8 @@ packages:
'@types/validator@13.12.0': '@types/validator@13.12.0':
resolution: {integrity: sha512-nH45Lk7oPIJ1RVOF6JgFI6Dy0QpHEzq4QecZhvguxYPDwT8c93prCMqAtiIttm39voZ+DDR+qkNnMpJmMBRqag==} resolution: {integrity: sha512-nH45Lk7oPIJ1RVOF6JgFI6Dy0QpHEzq4QecZhvguxYPDwT8c93prCMqAtiIttm39voZ+DDR+qkNnMpJmMBRqag==}
'@typescript-eslint/eslint-plugin@7.17.0': '@typescript-eslint/eslint-plugin@7.18.0':
resolution: {integrity: sha512-pyiDhEuLM3PuANxH7uNYan1AaFs5XE0zw1hq69JBvGvE7gSuEoQl1ydtEe/XQeoC3GQxLXyOVa5kNOATgM638A==} resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==}
engines: {node: ^18.18.0 || >=20.0.0} engines: {node: ^18.18.0 || >=20.0.0}
peerDependencies: peerDependencies:
'@typescript-eslint/parser': ^7.0.0 '@typescript-eslint/parser': ^7.0.0
@ -2044,8 +2047,8 @@ packages:
typescript: typescript:
optional: true optional: true
'@typescript-eslint/parser@7.17.0': '@typescript-eslint/parser@7.18.0':
resolution: {integrity: sha512-puiYfGeg5Ydop8eusb/Hy1k7QmOU6X3nvsqCgzrB2K4qMavK//21+PzNE8qeECgNOIoertJPUC1SpegHDI515A==} resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==}
engines: {node: ^18.18.0 || >=20.0.0} engines: {node: ^18.18.0 || >=20.0.0}
peerDependencies: peerDependencies:
eslint: ^8.56.0 eslint: ^8.56.0
@ -2054,12 +2057,12 @@ packages:
typescript: typescript:
optional: true optional: true
'@typescript-eslint/scope-manager@7.17.0': '@typescript-eslint/scope-manager@7.18.0':
resolution: {integrity: sha512-0P2jTTqyxWp9HiKLu/Vemr2Rg1Xb5B7uHItdVZ6iAenXmPo4SZ86yOPCJwMqpCyaMiEHTNqizHfsbmCFT1x9SA==} resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==}
engines: {node: ^18.18.0 || >=20.0.0} engines: {node: ^18.18.0 || >=20.0.0}
'@typescript-eslint/type-utils@7.17.0': '@typescript-eslint/type-utils@7.18.0':
resolution: {integrity: sha512-XD3aaBt+orgkM/7Cei0XNEm1vwUxQ958AOLALzPlbPqb8C1G8PZK85tND7Jpe69Wualri81PLU+Zc48GVKIMMA==} resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==}
engines: {node: ^18.18.0 || >=20.0.0} engines: {node: ^18.18.0 || >=20.0.0}
peerDependencies: peerDependencies:
eslint: ^8.56.0 eslint: ^8.56.0
@ -2068,12 +2071,12 @@ packages:
typescript: typescript:
optional: true optional: true
'@typescript-eslint/types@7.17.0': '@typescript-eslint/types@7.18.0':
resolution: {integrity: sha512-a29Ir0EbyKTKHnZWbNsrc/gqfIBqYPwj3F2M+jWE/9bqfEHg0AMtXzkbUkOG6QgEScxh2+Pz9OXe11jHDnHR7A==} resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==}
engines: {node: ^18.18.0 || >=20.0.0} engines: {node: ^18.18.0 || >=20.0.0}
'@typescript-eslint/typescript-estree@7.17.0': '@typescript-eslint/typescript-estree@7.18.0':
resolution: {integrity: sha512-72I3TGq93t2GoSBWI093wmKo0n6/b7O4j9o8U+f65TVD0FS6bI2180X5eGEr8MA8PhKMvYe9myZJquUT2JkCZw==} resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==}
engines: {node: ^18.18.0 || >=20.0.0} engines: {node: ^18.18.0 || >=20.0.0}
peerDependencies: peerDependencies:
typescript: '*' typescript: '*'
@ -2081,14 +2084,14 @@ packages:
typescript: typescript:
optional: true optional: true
'@typescript-eslint/utils@7.17.0': '@typescript-eslint/utils@7.18.0':
resolution: {integrity: sha512-r+JFlm5NdB+JXc7aWWZ3fKSm1gn0pkswEwIYsrGPdsT2GjsRATAKXiNtp3vgAAO1xZhX8alIOEQnNMl3kbTgJw==} resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==}
engines: {node: ^18.18.0 || >=20.0.0} engines: {node: ^18.18.0 || >=20.0.0}
peerDependencies: peerDependencies:
eslint: ^8.56.0 eslint: ^8.56.0
'@typescript-eslint/visitor-keys@7.17.0': '@typescript-eslint/visitor-keys@7.18.0':
resolution: {integrity: sha512-RVGC9UhPOCsfCdI9pU++K4nD7to+jTcMIbXTSOcrLqUEW6gF2pU1UUbYJKc9cvcRSK1UDeMJ7pdMxf4bhMpV/A==} resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==}
engines: {node: ^18.18.0 || >=20.0.0} engines: {node: ^18.18.0 || >=20.0.0}
'@ungap/structured-clone@1.2.0': '@ungap/structured-clone@1.2.0':
@ -2259,8 +2262,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.12: bits-ui@0.21.13:
resolution: {integrity: sha512-Cf0iB+ZKwA0ZjkpixrhrZK9PC6pGPFleW/65Xc/z0lpGvWaFtdOhiYEntCHHxZ0VihP3aJaG0OBhUBIbmAePaA==} resolution: {integrity: sha512-7nmOh6Ig7ND4DXZHv1FhNsY9yUGrad0+mf3tc4YN//3MgnJT1LnHtk4HZAKgmxCOe7txSX7/39LtYHbkrXokAQ==}
peerDependencies: peerDependencies:
svelte: ^4.0.0 || ^5.0.0-next.118 svelte: ^4.0.0 || ^5.0.0-next.118
@ -2306,8 +2309,8 @@ packages:
resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==}
engines: {node: '>=6'} engines: {node: '>=6'}
bullmq@5.11.0: bullmq@5.12.0:
resolution: {integrity: sha512-qVzyWGZqie3VHaYEgRXhId/j8ebfmj6MExEJyUByMsUJA5pVciVle3hKLer5fyMwtQ8lTMP7GwhXV/NZ+HzlRA==} resolution: {integrity: sha512-kOtSQx9ymylslsLNFD0xOMJM9mHqnq3x6KD7+DYkHByWe0HFRdblpYKhZyL4uR3rwaKZwzOrJVl3RwRaDjZxSg==}
bytes@3.1.2: bytes@3.1.2:
resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
@ -2524,6 +2527,15 @@ packages:
supports-color: supports-color:
optional: true optional: true
debug@4.3.6:
resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==}
engines: {node: '>=6.0'}
peerDependencies:
supports-color: '*'
peerDependenciesMeta:
supports-color:
optional: true
decamelize@1.2.0: decamelize@1.2.0:
resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
@ -2606,8 +2618,8 @@ packages:
resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==}
engines: {node: '>=12'} engines: {node: '>=12'}
drizzle-kit@0.23.0: drizzle-kit@0.23.1:
resolution: {integrity: sha512-w9jE97z193dd4jzAyj4Uv2SOh8Ydue70Ki6W0awy4bGM1aPXan6zD6Yv+nNTA6oGgNTDl2MJFxutjHG4fden5g==} resolution: {integrity: sha512-posGQhj8/K4S4CPhk7BO9+IcpNdIh96t0DvcAr/NvMKhPhe5D0MELzmpq9R2MpmSP3fd+Z3upwidtetrw7xnjg==}
hasBin: true hasBin: true
drizzle-orm@0.32.1: drizzle-orm@0.32.1:
@ -3070,8 +3082,8 @@ packages:
peerDependencies: peerDependencies:
hono: ^4.1.1 hono: ^4.1.1
hono@4.5.2: hono@4.5.3:
resolution: {integrity: sha512-93P8XEALrHAUGRZoqXs8MDL3w9mDgRpbW9Sy5x4LS7srg78bKUw7EGynxze+Ft1e/rLGmDAbxeSTMu6dHUSRDw==} resolution: {integrity: sha512-r26WwwbKD3BAYdfB294knNnegNda7VfV1tVn66D9Kvl9WQTdrR+5eKdoeaQNHQcC3Gr0KBikzAtjd6VsRGVSaw==}
engines: {node: '>=16.0.0'} engines: {node: '>=16.0.0'}
html-entities@2.5.2: html-entities@2.5.2:
@ -4340,8 +4352,8 @@ packages:
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
svelte-check@3.8.4: svelte-check@3.8.5:
resolution: {integrity: sha512-61aHMkdinWyH8BkkTX9jPLYxYzaAAz/FK/VQqdr2FiCQQ/q04WCwDlpGbHff1GdrMYTmW8chlTFvRWL9k0A8vg==} resolution: {integrity: sha512-3OGGgr9+bJ/+1nbPgsvulkLC48xBsqsgtc8Wam281H4G9F5v3mYGa2bHRsPuwHC5brKl4AxJH95QF73kmfihGQ==}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
svelte: ^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0 svelte: ^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0
@ -4617,8 +4629,8 @@ packages:
tslib@2.6.3: tslib@2.6.3:
resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==}
tsx@4.16.2: tsx@4.16.5:
resolution: {integrity: sha512-C1uWweJDgdtX2x600HjaFaucXTilT7tgUZHbOE4+ypskZ1OP8CRCSDkCxG6Vya9EwaFIVagWwpaVAn5wzypaqQ==} resolution: {integrity: sha512-ArsiAQHEW2iGaqZ8fTA1nX0a+lN5mNTyuGRRO6OW3H/Yno1y9/t1f9YOI1Cfoqz63VAthn++ZYcbDP7jPflc+A==}
engines: {node: '>=18.0.0'} engines: {node: '>=18.0.0'}
hasBin: true hasBin: true
@ -5153,6 +5165,8 @@ snapshots:
dependencies: dependencies:
postcss: 8.4.40 postcss: 8.4.40
'@drizzle-team/brocli@0.8.2': {}
'@emnapi/core@0.45.0': '@emnapi/core@0.45.0':
dependencies: dependencies:
tslib: 2.6.3 tslib: 2.6.3
@ -5525,9 +5539,9 @@ snapshots:
'@hapi/hoek': 9.3.0 '@hapi/hoek': 9.3.0
optional: true optional: true
'@hono/zod-validator@0.2.2(hono@4.5.2)(zod@3.23.8)': '@hono/zod-validator@0.2.2(hono@4.5.3)(zod@3.23.8)':
dependencies: dependencies:
hono: 4.5.2 hono: 4.5.3
zod: 3.23.8 zod: 3.23.8
'@humanwhocodes/config-array@0.11.14': '@humanwhocodes/config-array@0.11.14':
@ -6116,41 +6130,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.2(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))': '@sveltejs/adapter-auto@3.2.2(@sveltejs/kit@2.5.20(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))':
dependencies: dependencies:
'@sveltejs/kit': 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)) '@sveltejs/kit': 2.5.20(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8))
import-meta-resolve: 4.1.0 import-meta-resolve: 4.1.0
'@sveltejs/adapter-node@5.2.0(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))': '@sveltejs/adapter-node@5.2.0(@sveltejs/kit@2.5.20(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))':
dependencies: dependencies:
'@rollup/plugin-commonjs': 26.0.1(rollup@4.18.1) '@rollup/plugin-commonjs': 26.0.1(rollup@4.18.1)
'@rollup/plugin-json': 6.1.0(rollup@4.18.1) '@rollup/plugin-json': 6.1.0(rollup@4.18.1)
'@rollup/plugin-node-resolve': 15.2.3(rollup@4.18.1) '@rollup/plugin-node-resolve': 15.2.3(rollup@4.18.1)
'@sveltejs/kit': 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)) '@sveltejs/kit': 2.5.20(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8))
rollup: 4.18.1 rollup: 4.18.1
'@sveltejs/adapter-vercel@5.4.1(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))': '@sveltejs/adapter-vercel@5.4.1(@sveltejs/kit@2.5.20(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))':
dependencies: dependencies:
'@sveltejs/kit': 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)) '@sveltejs/kit': 2.5.20(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8))
'@vercel/nft': 0.27.2 '@vercel/nft': 0.27.2
esbuild: 0.21.5 esbuild: 0.21.5
transitivePeerDependencies: transitivePeerDependencies:
- encoding - encoding
- supports-color - supports-color
'@sveltejs/enhanced-img@0.3.1(rollup@4.18.1)(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8))': '@sveltejs/enhanced-img@0.3.1(rollup@4.18.1)(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8))':
dependencies: dependencies:
magic-string: 0.30.10 magic-string: 0.30.10
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.3.5(@types/node@20.14.13)(sass@1.77.8) vite: 5.3.5(@types/node@20.14.14)(sass@1.77.8)
vite-imagetools: 7.0.2(rollup@4.18.1) vite-imagetools: 7.0.2(rollup@4.18.1)
transitivePeerDependencies: transitivePeerDependencies:
- rollup - rollup
'@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8))': '@sveltejs/kit@2.5.20(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8))':
dependencies: dependencies:
'@sveltejs/vite-plugin-svelte': 3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)) '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8))
'@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
@ -6164,28 +6178,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.3.5(@types/node@20.14.13)(sass@1.77.8) vite: 5.3.5(@types/node@20.14.14)(sass@1.77.8)
'@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8))': '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8))':
dependencies: dependencies:
'@sveltejs/vite-plugin-svelte': 3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)) '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8))
debug: 4.3.4 debug: 4.3.4
svelte: 5.0.0-next.175 svelte: 5.0.0-next.175
vite: 5.3.5(@types/node@20.14.13)(sass@1.77.8) vite: 5.3.5(@types/node@20.14.14)(sass@1.77.8)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8))': '@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8))':
dependencies: dependencies:
'@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)) '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8))
debug: 4.3.4 debug: 4.3.4
deepmerge: 4.3.1 deepmerge: 4.3.1
kleur: 4.1.5 kleur: 4.1.5
magic-string: 0.30.10 magic-string: 0.30.10
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.3.5(@types/node@20.14.13)(sass@1.77.8) vite: 5.3.5(@types/node@20.14.14)(sass@1.77.8)
vitefu: 0.2.5(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)) vitefu: 0.2.5(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8))
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -6215,13 +6229,13 @@ snapshots:
'@types/json-schema@7.0.15': '@types/json-schema@7.0.15':
optional: true optional: true
'@types/node@20.14.13': '@types/node@20.14.14':
dependencies: dependencies:
undici-types: 5.26.5 undici-types: 5.26.5
'@types/pg@8.11.6': '@types/pg@8.11.6':
dependencies: dependencies:
'@types/node': 20.14.13 '@types/node': 20.14.14
pg-protocol: 1.6.1 pg-protocol: 1.6.1
pg-types: 4.0.2 pg-types: 4.0.2
@ -6232,14 +6246,14 @@ snapshots:
'@types/validator@13.12.0': '@types/validator@13.12.0':
optional: true optional: true
'@typescript-eslint/eslint-plugin@7.17.0(@typescript-eslint/parser@7.17.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)': '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)':
dependencies: dependencies:
'@eslint-community/regexpp': 4.10.0 '@eslint-community/regexpp': 4.10.0
'@typescript-eslint/parser': 7.17.0(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.4)
'@typescript-eslint/scope-manager': 7.17.0 '@typescript-eslint/scope-manager': 7.18.0
'@typescript-eslint/type-utils': 7.17.0(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4)
'@typescript-eslint/utils': 7.17.0(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4)
'@typescript-eslint/visitor-keys': 7.17.0 '@typescript-eslint/visitor-keys': 7.18.0
eslint: 8.57.0 eslint: 8.57.0
graphemer: 1.4.0 graphemer: 1.4.0
ignore: 5.3.1 ignore: 5.3.1
@ -6250,12 +6264,12 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/parser@7.17.0(eslint@8.57.0)(typescript@5.5.4)': '@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4)':
dependencies: dependencies:
'@typescript-eslint/scope-manager': 7.17.0 '@typescript-eslint/scope-manager': 7.18.0
'@typescript-eslint/types': 7.17.0 '@typescript-eslint/types': 7.18.0
'@typescript-eslint/typescript-estree': 7.17.0(typescript@5.5.4) '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4)
'@typescript-eslint/visitor-keys': 7.17.0 '@typescript-eslint/visitor-keys': 7.18.0
debug: 4.3.4 debug: 4.3.4
eslint: 8.57.0 eslint: 8.57.0
optionalDependencies: optionalDependencies:
@ -6263,16 +6277,16 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/scope-manager@7.17.0': '@typescript-eslint/scope-manager@7.18.0':
dependencies: dependencies:
'@typescript-eslint/types': 7.17.0 '@typescript-eslint/types': 7.18.0
'@typescript-eslint/visitor-keys': 7.17.0 '@typescript-eslint/visitor-keys': 7.18.0
'@typescript-eslint/type-utils@7.17.0(eslint@8.57.0)(typescript@5.5.4)': '@typescript-eslint/type-utils@7.18.0(eslint@8.57.0)(typescript@5.5.4)':
dependencies: dependencies:
'@typescript-eslint/typescript-estree': 7.17.0(typescript@5.5.4) '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4)
'@typescript-eslint/utils': 7.17.0(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4)
debug: 4.3.5 debug: 4.3.6
eslint: 8.57.0 eslint: 8.57.0
ts-api-utils: 1.3.0(typescript@5.5.4) ts-api-utils: 1.3.0(typescript@5.5.4)
optionalDependencies: optionalDependencies:
@ -6280,12 +6294,12 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/types@7.17.0': {} '@typescript-eslint/types@7.18.0': {}
'@typescript-eslint/typescript-estree@7.17.0(typescript@5.5.4)': '@typescript-eslint/typescript-estree@7.18.0(typescript@5.5.4)':
dependencies: dependencies:
'@typescript-eslint/types': 7.17.0 '@typescript-eslint/types': 7.18.0
'@typescript-eslint/visitor-keys': 7.17.0 '@typescript-eslint/visitor-keys': 7.18.0
debug: 4.3.4 debug: 4.3.4
globby: 11.1.0 globby: 11.1.0
is-glob: 4.0.3 is-glob: 4.0.3
@ -6297,20 +6311,20 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/utils@7.17.0(eslint@8.57.0)(typescript@5.5.4)': '@typescript-eslint/utils@7.18.0(eslint@8.57.0)(typescript@5.5.4)':
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
'@typescript-eslint/scope-manager': 7.17.0 '@typescript-eslint/scope-manager': 7.18.0
'@typescript-eslint/types': 7.17.0 '@typescript-eslint/types': 7.18.0
'@typescript-eslint/typescript-estree': 7.17.0(typescript@5.5.4) '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4)
eslint: 8.57.0 eslint: 8.57.0
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
- typescript - typescript
'@typescript-eslint/visitor-keys@7.17.0': '@typescript-eslint/visitor-keys@7.18.0':
dependencies: dependencies:
'@typescript-eslint/types': 7.17.0 '@typescript-eslint/types': 7.18.0
eslint-visitor-keys: 3.4.3 eslint-visitor-keys: 3.4.3
'@ungap/structured-clone@1.2.0': {} '@ungap/structured-clone@1.2.0': {}
@ -6499,7 +6513,7 @@ snapshots:
dependencies: dependencies:
file-uri-to-path: 1.0.0 file-uri-to-path: 1.0.0
bits-ui@0.21.12(svelte@5.0.0-next.175): bits-ui@0.21.13(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)
@ -6568,7 +6582,7 @@ snapshots:
builtin-modules@3.3.0: {} builtin-modules@3.3.0: {}
bullmq@5.11.0: bullmq@5.12.0:
dependencies: dependencies:
cron-parser: 4.9.0 cron-parser: 4.9.0
ioredis: 5.4.1 ioredis: 5.4.1
@ -6770,6 +6784,10 @@ snapshots:
dependencies: dependencies:
ms: 2.1.2 ms: 2.1.2
debug@4.3.6:
dependencies:
ms: 2.1.2
decamelize@1.2.0: {} decamelize@1.2.0: {}
deep-eql@4.1.3: deep-eql@4.1.3:
@ -6826,8 +6844,9 @@ snapshots:
dotenv@16.4.5: {} dotenv@16.4.5: {}
drizzle-kit@0.23.0: drizzle-kit@0.23.1:
dependencies: dependencies:
'@drizzle-team/brocli': 0.8.2
'@esbuild-kit/esm-loader': 2.6.5 '@esbuild-kit/esm-loader': 2.6.5
esbuild: 0.19.12 esbuild: 0.19.12
esbuild-register: 3.5.0(esbuild@0.19.12) esbuild-register: 3.5.0(esbuild@0.19.12)
@ -7001,7 +7020,7 @@ snapshots:
dependencies: dependencies:
eslint: 8.57.0 eslint: 8.57.0
eslint-plugin-svelte@2.43.0(eslint@8.57.0)(svelte@5.0.0-next.175)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)): eslint-plugin-svelte@2.43.0(eslint@8.57.0)(svelte@5.0.0-next.175)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4)):
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
'@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/sourcemap-codec': 1.4.15
@ -7010,7 +7029,7 @@ snapshots:
esutils: 2.0.3 esutils: 2.0.3
known-css-properties: 0.34.0 known-css-properties: 0.34.0
postcss: 8.4.40 postcss: 8.4.40
postcss-load-config: 3.1.4(postcss@8.4.40)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)) postcss-load-config: 3.1.4(postcss@8.4.40)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))
postcss-safe-parser: 6.0.0(postcss@8.4.40) postcss-safe-parser: 6.0.0(postcss@8.4.40)
postcss-selector-parser: 6.1.0 postcss-selector-parser: 6.1.0
semver: 7.6.2 semver: 7.6.2
@ -7237,11 +7256,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.16.1(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)): formsnap@1.0.1(svelte@5.0.0-next.175)(sveltekit-superforms@2.16.1(@sveltejs/kit@2.5.20(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))(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.16.1(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175) sveltekit-superforms: 2.16.1(@sveltejs/kit@2.5.20(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))(svelte@5.0.0-next.175)
forwarded@0.2.0: {} forwarded@0.2.0: {}
@ -7373,11 +7392,11 @@ snapshots:
hex-rgb@4.3.0: {} hex-rgb@4.3.0: {}
hono-rate-limiter@0.4.0(hono@4.5.2): hono-rate-limiter@0.4.0(hono@4.5.3):
dependencies: dependencies:
hono: 4.5.2 hono: 4.5.3
hono@4.5.2: {} hono@4.5.3: {}
html-entities@2.5.2: {} html-entities@2.5.2: {}
@ -8090,30 +8109,30 @@ snapshots:
'@csstools/utilities': 1.0.0(postcss@8.4.40) '@csstools/utilities': 1.0.0(postcss@8.4.40)
postcss: 8.4.40 postcss: 8.4.40
postcss-load-config@3.1.4(postcss@8.4.40)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)): postcss-load-config@3.1.4(postcss@8.4.40)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4)):
dependencies: dependencies:
lilconfig: 2.1.0 lilconfig: 2.1.0
yaml: 1.10.2 yaml: 1.10.2
optionalDependencies: optionalDependencies:
postcss: 8.4.40 postcss: 8.4.40
ts-node: 10.9.2(@types/node@20.14.13)(typescript@5.5.4) ts-node: 10.9.2(@types/node@20.14.14)(typescript@5.5.4)
postcss-load-config@4.0.2(postcss@8.4.40)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)): postcss-load-config@4.0.2(postcss@8.4.40)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4)):
dependencies: dependencies:
lilconfig: 3.1.1 lilconfig: 3.1.1
yaml: 2.4.3 yaml: 2.4.3
optionalDependencies: optionalDependencies:
postcss: 8.4.40 postcss: 8.4.40
ts-node: 10.9.2(@types/node@20.14.13)(typescript@5.5.4) ts-node: 10.9.2(@types/node@20.14.14)(typescript@5.5.4)
postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.40)(tsx@4.16.2): postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.40)(tsx@4.16.5):
dependencies: dependencies:
lilconfig: 3.1.1 lilconfig: 3.1.1
yaml: 2.4.2 yaml: 2.4.2
optionalDependencies: optionalDependencies:
jiti: 1.21.6 jiti: 1.21.6
postcss: 8.4.40 postcss: 8.4.40
tsx: 4.16.2 tsx: 4.16.5
postcss-logical@7.0.1(postcss@8.4.40): postcss-logical@7.0.1(postcss@8.4.40):
dependencies: dependencies:
@ -8684,14 +8703,14 @@ snapshots:
supports-preserve-symlinks-flag@1.0.0: {} supports-preserve-symlinks-flag@1.0.0: {}
svelte-check@3.8.4(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.40)(tsx@4.16.2))(postcss@8.4.40)(sass@1.77.8)(svelte@5.0.0-next.175): svelte-check@3.8.5(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.40)(tsx@4.16.5))(postcss@8.4.40)(sass@1.77.8)(svelte@5.0.0-next.175):
dependencies: dependencies:
'@jridgewell/trace-mapping': 0.3.25 '@jridgewell/trace-mapping': 0.3.25
chokidar: 3.6.0 chokidar: 3.6.0
picocolors: 1.0.0 picocolors: 1.0.0
sade: 1.8.1 sade: 1.8.1
svelte: 5.0.0-next.175 svelte: 5.0.0-next.175
svelte-preprocess: 5.1.4(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.40)(tsx@4.16.2))(postcss@8.4.40)(sass@1.77.8)(svelte@5.0.0-next.175)(typescript@5.5.4) svelte-preprocess: 5.1.4(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.40)(tsx@4.16.5))(postcss@8.4.40)(sass@1.77.8)(svelte@5.0.0-next.175)(typescript@5.5.4)
typescript: 5.5.4 typescript: 5.5.4
transitivePeerDependencies: transitivePeerDependencies:
- '@babel/core' - '@babel/core'
@ -8747,7 +8766,7 @@ snapshots:
dependencies: dependencies:
svelte: 5.0.0-next.175 svelte: 5.0.0-next.175
svelte-preprocess@5.1.4(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.40)(tsx@4.16.2))(postcss@8.4.40)(sass@1.77.8)(svelte@5.0.0-next.175)(typescript@5.5.4): svelte-preprocess@5.1.4(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.40)(tsx@4.16.5))(postcss@8.4.40)(sass@1.77.8)(svelte@5.0.0-next.175)(typescript@5.5.4):
dependencies: dependencies:
'@types/pug': 2.0.10 '@types/pug': 2.0.10
detect-indent: 6.1.0 detect-indent: 6.1.0
@ -8757,16 +8776,16 @@ snapshots:
svelte: 5.0.0-next.175 svelte: 5.0.0-next.175
optionalDependencies: optionalDependencies:
postcss: 8.4.40 postcss: 8.4.40
postcss-load-config: 5.1.0(jiti@1.21.6)(postcss@8.4.40)(tsx@4.16.2) postcss-load-config: 5.1.0(jiti@1.21.6)(postcss@8.4.40)(tsx@4.16.5)
sass: 1.77.8 sass: 1.77.8
typescript: 5.5.4 typescript: 5.5.4
svelte-preprocess@6.0.2(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.40)(tsx@4.16.2))(postcss@8.4.40)(sass@1.77.8)(svelte@5.0.0-next.175)(typescript@5.5.4): svelte-preprocess@6.0.2(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.40)(tsx@4.16.5))(postcss@8.4.40)(sass@1.77.8)(svelte@5.0.0-next.175)(typescript@5.5.4):
dependencies: dependencies:
svelte: 5.0.0-next.175 svelte: 5.0.0-next.175
optionalDependencies: optionalDependencies:
postcss: 8.4.40 postcss: 8.4.40
postcss-load-config: 5.1.0(jiti@1.21.6)(postcss@8.4.40)(tsx@4.16.2) postcss-load-config: 5.1.0(jiti@1.21.6)(postcss@8.4.40)(tsx@4.16.5)
sass: 1.77.8 sass: 1.77.8
typescript: 5.5.4 typescript: 5.5.4
@ -8821,19 +8840,19 @@ snapshots:
magic-string: 0.30.10 magic-string: 0.30.10
zimmerframe: 1.1.2 zimmerframe: 1.1.2
sveltekit-flash-message@2.4.4(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175): sveltekit-flash-message@2.4.4(@sveltejs/kit@2.5.20(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))(svelte@5.0.0-next.175):
dependencies: dependencies:
'@sveltejs/kit': 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)) '@sveltejs/kit': 2.5.20(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8))
svelte: 5.0.0-next.175 svelte: 5.0.0-next.175
sveltekit-rate-limiter@0.5.2(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8))): sveltekit-rate-limiter@0.5.2(@sveltejs/kit@2.5.20(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8))):
dependencies: dependencies:
'@isaacs/ttlcache': 1.4.1 '@isaacs/ttlcache': 1.4.1
'@sveltejs/kit': 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)) '@sveltejs/kit': 2.5.20(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8))
sveltekit-superforms@2.16.1(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175): sveltekit-superforms@2.16.1(@sveltejs/kit@2.5.20(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))(svelte@5.0.0-next.175):
dependencies: dependencies:
'@sveltejs/kit': 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)) '@sveltejs/kit': 2.5.20(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8))
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
@ -8858,16 +8877,16 @@ snapshots:
tailwind-merge@2.4.0: {} tailwind-merge@2.4.0: {}
tailwind-variants@0.2.1(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4))): tailwind-variants@0.2.1(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))):
dependencies: dependencies:
tailwind-merge: 2.4.0 tailwind-merge: 2.4.0
tailwindcss: 3.4.7(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)) tailwindcss: 3.4.7(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))
tailwindcss-animate@1.0.7(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4))): tailwindcss-animate@1.0.7(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))):
dependencies: dependencies:
tailwindcss: 3.4.7(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)) tailwindcss: 3.4.7(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))
tailwindcss@3.4.7(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)): tailwindcss@3.4.7(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4)):
dependencies: dependencies:
'@alloc/quick-lru': 5.2.0 '@alloc/quick-lru': 5.2.0
arg: 5.0.2 arg: 5.0.2
@ -8886,7 +8905,7 @@ snapshots:
postcss: 8.4.40 postcss: 8.4.40
postcss-import: 15.1.0(postcss@8.4.40) postcss-import: 15.1.0(postcss@8.4.40)
postcss-js: 4.0.1(postcss@8.4.40) postcss-js: 4.0.1(postcss@8.4.40)
postcss-load-config: 4.0.2(postcss@8.4.40)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)) postcss-load-config: 4.0.2(postcss@8.4.40)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))
postcss-nested: 6.0.1(postcss@8.4.40) postcss-nested: 6.0.1(postcss@8.4.40)
postcss-selector-parser: 6.1.0 postcss-selector-parser: 6.1.0
resolve: 1.22.8 resolve: 1.22.8
@ -8953,14 +8972,14 @@ snapshots:
ts-interface-checker@0.1.13: {} ts-interface-checker@0.1.13: {}
ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4): ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4):
dependencies: dependencies:
'@cspotcode/source-map-support': 0.8.1 '@cspotcode/source-map-support': 0.8.1
'@tsconfig/node10': 1.0.11 '@tsconfig/node10': 1.0.11
'@tsconfig/node12': 1.0.11 '@tsconfig/node12': 1.0.11
'@tsconfig/node14': 1.0.3 '@tsconfig/node14': 1.0.3
'@tsconfig/node16': 1.0.4 '@tsconfig/node16': 1.0.4
'@types/node': 20.14.13 '@types/node': 20.14.14
acorn: 8.11.3 acorn: 8.11.3
acorn-walk: 8.3.2 acorn-walk: 8.3.2
arg: 4.1.3 arg: 4.1.3
@ -8976,7 +8995,7 @@ snapshots:
tslib@2.6.3: {} tslib@2.6.3: {}
tsx@4.16.2: tsx@4.16.5:
dependencies: dependencies:
esbuild: 0.21.5 esbuild: 0.21.5
get-tsconfig: 4.7.5 get-tsconfig: 4.7.5
@ -9061,13 +9080,13 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- rollup - rollup
vite-node@1.6.0(@types/node@20.14.13)(sass@1.77.8): vite-node@1.6.0(@types/node@20.14.14)(sass@1.77.8):
dependencies: dependencies:
cac: 6.7.14 cac: 6.7.14
debug: 4.3.4 debug: 4.3.4
pathe: 1.1.2 pathe: 1.1.2
picocolors: 1.0.0 picocolors: 1.0.0
vite: 5.3.5(@types/node@20.14.13)(sass@1.77.8) vite: 5.3.5(@types/node@20.14.14)(sass@1.77.8)
transitivePeerDependencies: transitivePeerDependencies:
- '@types/node' - '@types/node'
- less - less
@ -9078,21 +9097,21 @@ snapshots:
- supports-color - supports-color
- terser - terser
vite@5.3.5(@types/node@20.14.13)(sass@1.77.8): vite@5.3.5(@types/node@20.14.14)(sass@1.77.8):
dependencies: dependencies:
esbuild: 0.21.5 esbuild: 0.21.5
postcss: 8.4.40 postcss: 8.4.40
rollup: 4.17.2 rollup: 4.17.2
optionalDependencies: optionalDependencies:
'@types/node': 20.14.13 '@types/node': 20.14.14
fsevents: 2.3.3 fsevents: 2.3.3
sass: 1.77.8 sass: 1.77.8
vitefu@0.2.5(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)): vitefu@0.2.5(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)):
optionalDependencies: optionalDependencies:
vite: 5.3.5(@types/node@20.14.13)(sass@1.77.8) vite: 5.3.5(@types/node@20.14.14)(sass@1.77.8)
vitest@1.6.0(@types/node@20.14.13)(sass@1.77.8): vitest@1.6.0(@types/node@20.14.14)(sass@1.77.8):
dependencies: dependencies:
'@vitest/expect': 1.6.0 '@vitest/expect': 1.6.0
'@vitest/runner': 1.6.0 '@vitest/runner': 1.6.0
@ -9111,11 +9130,11 @@ snapshots:
strip-literal: 2.1.0 strip-literal: 2.1.0
tinybench: 2.8.0 tinybench: 2.8.0
tinypool: 0.8.4 tinypool: 0.8.4
vite: 5.3.5(@types/node@20.14.13)(sass@1.77.8) vite: 5.3.5(@types/node@20.14.14)(sass@1.77.8)
vite-node: 1.6.0(@types/node@20.14.13)(sass@1.77.8) vite-node: 1.6.0(@types/node@20.14.14)(sass@1.77.8)
why-is-node-running: 2.2.2 why-is-node-running: 2.2.2
optionalDependencies: optionalDependencies:
'@types/node': 20.14.13 '@types/node': 20.14.14
transitivePeerDependencies: transitivePeerDependencies:
- less - less
- lightningcss - lightningcss

View file

@ -1,22 +1,11 @@
// import * as Sentry from '@sentry/sveltekit';
import 'reflect-metadata'
import { hc } from 'hono/client'; import { hc } from 'hono/client';
import { sequence } from '@sveltejs/kit/hooks'; import { sequence } from '@sveltejs/kit/hooks';
import { redirect, type Handle } from '@sveltejs/kit'; import { redirect, type Handle } from '@sveltejs/kit';
import { dev } from '$app/environment'; import { dev } from '$app/environment';
import { lucia } from '$lib/server/auth';
import type { ApiRoutes } from '$lib/server/api'; import type { ApiRoutes } from '$lib/server/api';
import { parseApiResponse } from '$lib/utils/api'; import { parseApiResponse } from '$lib/utils/api';
import { StatusCodes } from '$lib/constants/status-codes'; import { StatusCodes } from '$lib/constants/status-codes';
// TODO: Fix Sentry as it is not working on SvelteKit v2
// Sentry.init({
// dsn: 'https://742e43279df93a3c4a4a78c12eb1f879@o4506057768632320.ingest.sentry.io/4506057770401792',
// tracesSampleRate: 1,
// environment: dev ? 'development' : 'production',
// enabled: !dev
// });
const apiClient: Handle = async ({ event, resolve }) => { const apiClient: Handle = async ({ event, resolve }) => {
/* ------------------------------ Register api ------------------------------ */ /* ------------------------------ Register api ------------------------------ */
const { api } = hc<ApiRoutes>('/', { const { api } = hc<ApiRoutes>('/', {
@ -27,14 +16,18 @@ const apiClient: Handle = async ({ event, resolve }) => {
} }
}); });
/* ----------------------------- Logging Request ---------------------------- */
console.log('Request Method:', event.request.method);
console.log('Request URL:', event.request.url);
/* ----------------------------- Auth functions ----------------------------- */ /* ----------------------------- Auth functions ----------------------------- */
async function getAuthedUser() { async function getAuthedUser() {
const { data } = await api.iam.user.$get().then(parseApiResponse) const { data } = await api.user.me.$get().then(parseApiResponse)
return data && data.user; return data && data.user;
} }
async function getAuthedUserOrThrow() { async function getAuthedUserOrThrow() {
const { data } = await api.iam.user.$get().then(parseApiResponse); const { data } = await api.user.me.$get().then(parseApiResponse);
if (!data || !data.user) throw redirect(StatusCodes.TEMPORARY_REDIRECT, '/'); if (!data || !data.user) throw redirect(StatusCodes.TEMPORARY_REDIRECT, '/');
return data?.user; return data?.user;
} }
@ -50,49 +43,4 @@ const apiClient: Handle = async ({ event, resolve }) => {
return response; return response;
}; };
export const authentication: Handle = async function ({ event, resolve }) { export const handle: Handle = sequence(apiClient);
event.locals.startTimer = Date.now();
const ip = event.request.headers.get('x-forwarded-for') as string;
const country = event.request.headers.get('x-vercel-ip-country') as string;
event.locals.ip = dev ? '127.0.0.1' : ip; // || event.getClientAddress();
event.locals.country = dev ? 'us' : country;
const sessionId = event.cookies.get(lucia.sessionCookieName);
if (!sessionId) {
event.locals.user = null;
event.locals.session = null;
return resolve(event);
}
const { session, user } = await lucia.validateSession(sessionId);
if (session && session.fresh) {
const sessionCookie = lucia.createSessionCookie(session.id);
console.log('sessionCookie', JSON.stringify(sessionCookie, null, 2));
// sveltekit types deviates from the de-facto standard, you can use 'as any' too
event.cookies.set(sessionCookie.name, sessionCookie.value, {
path: '.',
...sessionCookie.attributes,
});
}
console.log('session from hooks', JSON.stringify(session, null, 2));
if (!session) {
const sessionCookie = lucia.createBlankSessionCookie();
console.log('blank sessionCookie', JSON.stringify(sessionCookie, null, 2));
event.cookies.set(sessionCookie.name, sessionCookie.value, {
path: '.',
...sessionCookie.attributes,
});
}
event.locals.user = user;
event.locals.session = session;
return resolve(event);
};
export const handle: Handle = sequence(
// Sentry.sentryHandle(),
authentication,
apiClient
);
// export const handleError = Sentry.handleErrorWithSentry();

View file

@ -1,11 +1,11 @@
import { Hono } from 'hono'; import { Hono } from 'hono';
import { injectable } from 'tsyringe'; // import { injectable } from 'tsyringe';
import type { HonoTypes } from '../types'; import type { HonoTypes } from '../types';
import { requireAuth } from "../middleware/auth.middleware"; import { requireAuth } from "../middleware/auth.middleware";
import type { Controller } from '../interfaces/controller.interface'; import type { Controller } from '../interfaces/controller.interface';
@injectable() // @injectable()
export class IamController implements Controller { class IamController implements Controller {
controller = new Hono<HonoTypes>(); controller = new Hono<HonoTypes>();
constructor( constructor(
@ -19,3 +19,6 @@ export class IamController implements Controller {
}); });
} }
} }
const iamControllerInstance = new IamController();
export default iamControllerInstance;

View file

@ -1,27 +1,31 @@
import 'reflect-metadata'; // import 'reflect-metadata';
import { Hono } from 'hono'; import { Hono } from 'hono';
import { zValidator } from '@hono/zod-validator'; import { zValidator } from '@hono/zod-validator';
import { inject, injectable } from 'tsyringe'; // import { inject, injectable } from 'tsyringe';
import type { HonoTypes } from '../types'; import type { HonoTypes } from '../types';
import { limiter } from '../middleware/rate-limiter.middleware'; import { limiter } from '../middleware/rate-limiter.middleware';
import type { Controller } from '../interfaces/controller.interface'; import type { Controller } from '../interfaces/controller.interface';
import { signInEmailDto } from '$lib/dtos/signin-email.dto'; import { signInEmailDto } from '$lib/dtos/signin-email.dto';
import { LoginRequestsService } from '../services/loginrequest.service'; import { loginRequestsService } from '../services/loginrequest.service';
// import { LoginRequestsService } from '../services/loginrequest.service';
@injectable() // @injectable()
export class LoginController implements Controller { class LoginController implements Controller {
controller = new Hono<HonoTypes>(); controller = new Hono<HonoTypes>();
constructor( // constructor(
@inject(LoginRequestsService) private readonly loginRequestsService: LoginRequestsService // @inject(LoginRequestsService) private readonly loginRequestsService: LoginRequestsService
) { } // ) { }
routes() { routes() {
return this.controller return this.controller
.post('/', zValidator('json', signInEmailDto), limiter({ limit: 10, minutes: 60 }), async (c) => { .post('/', zValidator('json', signInEmailDto), limiter({ limit: 10, minutes: 60 }), async (c) => {
const { username, password } = c.req.valid('json'); const { username, password } = c.req.valid('json');
await this.loginRequestsService.verify({ username, password }, c.req); await loginRequestsService.verify({ username, password }, c.req);
return c.json({ message: 'Verification email sent' }); return c.json({ message: 'Verification email sent' });
}) })
} }
} }
const loginControllerInstance = new LoginController();
export default loginControllerInstance;

View file

@ -1,12 +1,12 @@
import 'reflect-metadata'; // import 'reflect-metadata';
import { Hono } from 'hono'; import { Hono } from 'hono';
import { injectable } from 'tsyringe'; // import { injectable } from 'tsyringe';
import { requireAuth } from "../middleware/auth.middleware"; import { requireAuth } from "../middleware/auth.middleware";
import type { HonoTypes } from '../types'; import type { HonoTypes } from '../types';
import type { Controller } from '../interfaces/controller.interface'; import type { Controller } from '../interfaces/controller.interface';
@injectable() // @injectable()
export class UserController implements Controller { class UserController implements Controller {
controller = new Hono<HonoTypes>(); controller = new Hono<HonoTypes>();
constructor( constructor(
@ -24,3 +24,5 @@ export class UserController implements Controller {
}); });
} }
} }
export const userControllerInstance = new UserController();

View file

@ -1,13 +1,13 @@
import 'reflect-metadata' // import 'reflect-metadata'
import { Hono } from 'hono'; import { Hono } from 'hono';
import { hc } from 'hono/client'; import { hc } from 'hono/client';
import { cors } from 'hono/cors'; import { cors } from 'hono/cors';
import { logger } from 'hono/logger'; import { logger } from 'hono/logger';
import { validateAuthSession, verifyOrigin } from './middleware/auth.middleware'; import { validateAuthSession, verifyOrigin } from './middleware/auth.middleware';
import { config } from './common/config'; import { config } from './common/config';
import { container } from 'tsyringe'; // import { container } from 'tsyringe';
import { IamController } from './controllers/iam.controller'; import iamControllerInstance from './controllers/iam.controller';
import { LoginController } from './controllers/login.controller'; import loginControllerInstance from './controllers/login.controller';
/* ----------------------------------- Api ---------------------------------- */ /* ----------------------------------- Api ---------------------------------- */
const app = new Hono().basePath('/api'); const app = new Hono().basePath('/api');
@ -34,8 +34,10 @@ app.use(
/* --------------------------------- Routes --------------------------------- */ /* --------------------------------- Routes --------------------------------- */
const routes = app const routes = app
.route('/user', container.resolve(IamController).routes()) // .route('/user', container.resolve(IamController).routes())
.route('/login', container.resolve(LoginController).routes()) // .route('/login', container.resolve(LoginController).routes())
.route('/user', iamControllerInstance.routes())
.route('/login', loginControllerInstance.routes())
.get('/', (c) => c.json({ message: 'Server is healthy' })); .get('/', (c) => c.json({ message: 'Server is healthy' }));
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */

View file

@ -1,11 +1,11 @@
import { container } from 'tsyringe'; // import { container } from 'tsyringe';
import { db } from '../infrastructure/database'; // import { db } from '../infrastructure/database';
// Symbol // // Symbol
export const DatabaseProvider = Symbol('DATABASE_TOKEN'); // export const DatabaseProvider = Symbol('DATABASE_TOKEN');
// Type // // Type
export type DatabaseProvider = typeof db; // export type DatabaseProvider = typeof db;
// Register // // Register
container.register<DatabaseProvider>(DatabaseProvider, { useValue: db }); // container.register<DatabaseProvider>(DatabaseProvider, { useValue: db });

View file

@ -1,3 +1,3 @@
export * from './database.provider'; // export * from './database.provider';
export * from './lucia.provider'; // export * from './lucia.provider';
export * from './redis.provider'; // export * from './redis.provider';

View file

@ -1,11 +1,11 @@
import { container } from 'tsyringe'; // import { container } from 'tsyringe';
import { lucia } from '../infrastructure/auth/lucia'; // import { lucia } from '../infrastructure/auth/lucia';
// Symbol // // Symbol
export const LuciaProvider = Symbol('LUCIA_PROVIDER'); // export const LuciaProvider = Symbol('LUCIA_PROVIDER');
// Type // // Type
export type LuciaProvider = typeof lucia; // export type LuciaProvider = typeof lucia;
// Register // // Register
container.register<LuciaProvider>(LuciaProvider, { useValue: lucia }); // container.register<LuciaProvider>(LuciaProvider, { useValue: lucia });

View file

@ -1,14 +1,14 @@
import { container } from 'tsyringe'; // import { container } from 'tsyringe';
import RedisClient from 'ioredis' // import RedisClient from 'ioredis'
import { config } from '../common/config'; // import { config } from '../common/config';
// Symbol // // Symbol
export const RedisProvider = Symbol('REDIS_TOKEN'); // export const RedisProvider = Symbol('REDIS_TOKEN');
// Type // // Type
export type RedisProvider = RedisClient; // export type RedisProvider = RedisClient;
// Register // // Register
container.register<RedisProvider>(RedisProvider, { // container.register<RedisProvider>(RedisProvider, {
useValue: new RedisClient(config.REDIS_URL) // useValue: new RedisClient(config.REDIS_URL)
}); // });

View file

@ -6,7 +6,7 @@ import { takeFirstOrThrow } from "../infrastructure/database/utils";
export type CreateCredentials = InferInsertModel<typeof credentialsTable>; export type CreateCredentials = InferInsertModel<typeof credentialsTable>;
export type UpdateCredentials = Partial<CreateCredentials>; export type UpdateCredentials = Partial<CreateCredentials>;
export class CredentialsRepository { class CredentialsRepository {
async findOneByUserId(userId: string) { async findOneByUserId(userId: string) {
return db.query.credentialsTable.findFirst({ return db.query.credentialsTable.findFirst({
@ -56,4 +56,6 @@ export class CredentialsRepository {
.returning() .returning()
.then(takeFirstOrThrow); .then(takeFirstOrThrow);
} }
} }
export const credentialsRepository = new CredentialsRepository();

View file

@ -22,7 +22,7 @@ storing data. They should not contain any business logic, only database queries.
export type CreateUser = InferInsertModel<typeof usersTable>; export type CreateUser = InferInsertModel<typeof usersTable>;
export type UpdateUser = Partial<CreateUser>; export type UpdateUser = Partial<CreateUser>;
export class UsersRepository { class UsersRepository {
async findOneById(id: string) { async findOneById(id: string) {
return db.query.usersTable.findFirst({ return db.query.usersTable.findFirst({
where: eq(usersTable.id, id) where: eq(usersTable.id, id)
@ -60,3 +60,5 @@ export class UsersRepository {
.then(takeFirstOrThrow); .then(takeFirstOrThrow);
} }
} }
export const usersRepository = new UsersRepository();

View file

@ -1,4 +1,4 @@
import { injectable } from "tsyringe"; // import { injectable } from "tsyringe";
import { Argon2id } from "oslo/password"; import { Argon2id } from "oslo/password";
/* ---------------------------------- Note ---------------------------------- */ /* ---------------------------------- Note ---------------------------------- */
@ -20,8 +20,8 @@ node_modules/.pnpm/@node-rs+argon2@1.7.0/node_modules/@node-rs/argon2/index.js:1
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
// If you don't use a hasher from oslo, which are preconfigured with recommended parameters from OWASP, // If you don't use a hasher from oslo, which are preconfigured with recommended parameters from OWASP,
// ensure that you configure them properly. // ensure that you configure them properly.
@injectable() // @injectable()
export class HashingService { class HashingService {
private readonly hasher = new Argon2id(); private readonly hasher = new Argon2id();
async hash(data: string) { async hash(data: string) {
@ -31,4 +31,6 @@ export class HashingService {
async verify(hash: string, data: string) { async verify(hash: string, data: string) {
return this.hasher.verify(hash, data) return this.hasher.verify(hash, data)
} }
} }
export const hashingService = new HashingService()

View file

@ -1,4 +1,5 @@
import { inject, injectable } from 'tsyringe'; // import { inject, injectable } from 'tsyringe';
import { lucia } from '../infrastructure/auth/lucia';
import { LuciaProvider } from '../providers/lucia.provider'; import { LuciaProvider } from '../providers/lucia.provider';
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
@ -18,13 +19,13 @@ Create private functions to handle complex logic and keep the public methods as
simple as possible. This makes the service easier to read, test and understand. simple as possible. This makes the service easier to read, test and understand.
*/ */
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
@injectable() // @injectable()
export class IamService { export class IamService {
constructor( // constructor(
@inject(LuciaProvider) private readonly lucia: LuciaProvider, // @inject(LuciaProvider) private readonly lucia: LuciaProvider,
) { } // ) { }
async logout(sessionId: string) { async logout(sessionId: string) {
return this.lucia.invalidateSession(sessionId); return lucia.invalidateSession(sessionId);
} }
} }

View file

@ -1,24 +1,28 @@
import { inject, injectable } from 'tsyringe'; // import { inject, injectable } from 'tsyringe';
import { BadRequest } from '../common/errors'; import { BadRequest } from '../common/errors';
import { DatabaseProvider } from '../providers'; // import { DatabaseProvider } from '../providers';
import { MailerService } from './mailer.service'; // import { MailerService } from './mailer.service';
import { TokensService } from './tokens.service'; // import { TokensService } from './tokens.service';
import { LuciaProvider } from '../providers/lucia.provider'; // import { LuciaProvider } from '../providers/lucia.provider';
import { UsersRepository } from '../repositories/users.repository'; // import { UsersRepository } from '../repositories/users.repository';
import type { SignInEmailDto } from '../../../dtos/signin-email.dto'; import type { SignInEmailDto } from '../../../dtos/signin-email.dto';
import { CredentialsRepository } from '../repositories/credentials.repository';
import type { HonoRequest } from 'hono'; import type { HonoRequest } from 'hono';
import { credentialsRepository } from '../repositories/credentials.repository';
import { usersRepository } from '../repositories/users.repository';
import { lucia } from '../infrastructure/auth/lucia';
import { tokensService } from './tokens.service';
import { mailerService } from './mailer.service';
@injectable() // @injectable()
export class LoginRequestsService { class LoginRequestsService {
constructor( // constructor(
@inject(LuciaProvider) private readonly lucia: LuciaProvider, // @inject(LuciaProvider) private readonly lucia: LuciaProvider,
@inject(DatabaseProvider) private readonly db: DatabaseProvider, // @inject(DatabaseProvider) private readonly db: DatabaseProvider,
@inject(TokensService) private readonly tokensService: TokensService, // @inject(TokensService) private readonly tokensService: TokensService,
@inject(MailerService) private readonly mailerService: MailerService, // @inject(MailerService) private readonly mailerService: MailerService,
@inject(UsersRepository) private readonly usersRepository: UsersRepository, // @inject(UsersRepository) private readonly usersRepository: UsersRepository,
@inject(CredentialsRepository) private readonly credentialsRepository: CredentialsRepository, // @inject(CredentialsRepository) private readonly credentialsRepository: CredentialsRepository,
) { } // ) { }
// async create(data: RegisterEmailDto) { // async create(data: RegisterEmailDto) {
// // generate a token, expiry date, and hash // // generate a token, expiry date, and hash
@ -35,25 +39,25 @@ export class LoginRequestsService {
async verify(data: SignInEmailDto, req: HonoRequest) { async verify(data: SignInEmailDto, req: HonoRequest) {
const requestIpAddress = req.header('x-real-ip'); const requestIpAddress = req.header('x-real-ip');
const requestIpCountry = req.header('x-vercel-ip-country'); const requestIpCountry = req.header('x-vercel-ip-country');
const existingUser = await this.usersRepository.findOneByUsername(data.username); const existingUser = await usersRepository.findOneByUsername(data.username);
if (!existingUser) { if (!existingUser) {
throw BadRequest('User not found'); throw BadRequest('User not found');
} }
const credential = await this.credentialsRepository.findPasswordCredentialsByUserId(existingUser.id); const credential = await credentialsRepository.findPasswordCredentialsByUserId(existingUser.id);
if (!credential) { if (!credential) {
throw BadRequest('Invalid credentials'); throw BadRequest('Invalid credentials');
} }
if (!await this.tokensService.verifyHashedToken(credential.hashedPassword, data.password)) { if (!await tokensService.verifyHashedToken(credential.hashedPassword, data.password)) {
throw BadRequest('Invalid credentials'); throw BadRequest('Invalid credentials');
} }
const totpCredentials = await this.credentialsRepository.findTOTPCredentialsByUserId(existingUser.id); const totpCredentials = await credentialsRepository.findTOTPCredentialsByUserId(existingUser.id);
return this.lucia.createSession(existingUser.id, { return lucia.createSession(existingUser.id, {
ip_country: requestIpCountry || 'unknown', ip_country: requestIpCountry || 'unknown',
ip_address: requestIpAddress || 'unknown', ip_address: requestIpAddress || 'unknown',
twoFactorAuthEnabled: twoFactorAuthEnabled:
@ -66,8 +70,8 @@ export class LoginRequestsService {
// Create a new user and send a welcome email - or other onboarding process // Create a new user and send a welcome email - or other onboarding process
private async handleNewUserRegistration(email: string) { private async handleNewUserRegistration(email: string) {
const newUser = await this.usersRepository.create({ email, verified: true, avatar: null }) const newUser = await usersRepository.create({ email, verified: true, avatar: null })
this.mailerService.sendWelcome({ to: email, props: null }); mailerService.sendWelcome({ to: email, props: null });
// TODO: add whatever onboarding process or extra data you need here // TODO: add whatever onboarding process or extra data you need here
return newUser return newUser
} }
@ -88,4 +92,6 @@ export class LoginRequestsService {
// return loginRequest // return loginRequest
// }) // })
// } // }
} }
export const loginRequestsService = new LoginRequestsService();

View file

@ -3,7 +3,7 @@ import path from 'path';
import nodemailer from 'nodemailer'; import nodemailer from 'nodemailer';
import handlebars from 'handlebars'; import handlebars from 'handlebars';
import { fileURLToPath } from 'url'; import { fileURLToPath } from 'url';
import { injectable } from 'tsyringe'; // import { injectable } from 'tsyringe';
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
/* Service */ /* Service */
@ -34,8 +34,8 @@ type SendTemplate<T> = {
props: T; props: T;
}; };
@injectable() // @injectable()
export class MailerService { class MailerService {
private nodemailer = nodemailer.createTransport({ private nodemailer = nodemailer.createTransport({
host: 'smtp.ethereal.email', host: 'smtp.ethereal.email',
port: 587, port: 587,
@ -102,3 +102,5 @@ export class MailerService {
); );
} }
} }
export const mailerService = new MailerService();

View file

@ -1,13 +1,13 @@
import { injectable } from "tsyringe"; // import { injectable } from "tsyringe";
import RedisClient from 'ioredis' import RedisClient from 'ioredis'
import { config } from "../common/config"; import { config } from "../common/config";
import { Queue, Worker, type Processor } from 'bullmq'; import { Queue, Worker, type Processor } from 'bullmq';
@injectable() // @injectable()
export class QueuesServices { export class QueuesServices {
connection = new RedisClient(config.REDIS_URL); connection = new RedisClient(config.REDIS_URL);
constructor() { } // constructor() { }
createQueue(name: string) { createQueue(name: string) {
return new Queue(name, { connection: this.connection }) return new Queue(name, { connection: this.connection })

View file

@ -1,11 +1,11 @@
import { inject, injectable } from "tsyringe"; // import { inject, injectable } from "tsyringe";
import { generateRandomString } from "oslo/crypto"; import { generateRandomString } from "oslo/crypto";
import { TimeSpan, createDate, type TimeSpanUnit } from 'oslo'; import { TimeSpan, createDate, type TimeSpanUnit } from 'oslo';
import { HashingService } from "./hashing.service"; import { hashingService } from "./hashing.service";
@injectable() // @injectable()
export class TokensService { class TokensService {
constructor(@inject(HashingService) private readonly hashingService: HashingService) { } // constructor(@inject(HashingService) private readonly hashingService: HashingService) { }
generateToken() { generateToken() {
const alphabet = '23456789ACDEFGHJKLMNPQRSTUVWXYZ'; // alphabet with removed look-alike characters (0, 1, O, I) const alphabet = '23456789ACDEFGHJKLMNPQRSTUVWXYZ'; // alphabet with removed look-alike characters (0, 1, O, I)
@ -21,7 +21,7 @@ export class TokensService {
async generateTokenWithExpiryAndHash(number: number, lifespan: TimeSpanUnit) { async generateTokenWithExpiryAndHash(number: number, lifespan: TimeSpanUnit) {
const token = this.generateToken() const token = this.generateToken()
const hashedToken = await this.hashingService.hash(token) const hashedToken = await hashingService.hash(token)
return { return {
token, token,
hashedToken, hashedToken,
@ -30,6 +30,8 @@ export class TokensService {
} }
async verifyHashedToken(hashedToken: string, token: string) { async verifyHashedToken(hashedToken: string, token: string) {
return this.hashingService.verify(hashedToken, token) return hashingService.verify(hashedToken, token)
} }
} }
export const tokensService = new TokensService()

View file

@ -1,17 +1,19 @@
import { inject, injectable } from 'tsyringe'; // import { inject, injectable } from 'tsyringe';
import type { UsersRepository } from '../repositories/users.repository'; // import type { UsersRepository } from '../repositories/users.repository';
@injectable() import { usersRepository } from "../repositories/users.repository";
// @injectable()
export class UsersService { export class UsersService {
constructor( // constructor(
@inject('UsersRepository') private readonly usersRepository: UsersRepository // @inject('UsersRepository') private readonly usersRepository: UsersRepository
) { } // ) { }
async findOneByUsername(username: string) { async findOneByUsername(username: string) {
return this.usersRepository.findOneByUsername(username); return usersRepository.findOneByUsername(username);
} }
async findOneById(id: string) { async findOneById(id: string) {
return this.usersRepository.findOneById(id); return usersRepository.findOneById(id);
} }
} }

View file

@ -1,9 +1,9 @@
// import { dev } from '$app/environment'; import { dev } from '$app/environment';
// // we don't need any JS on this page, though we'll load // we don't need any JS on this page, though we'll load
// // it in dev so that we get hot module replacement... // it in dev so that we get hot module replacement...
// export const csr = dev; export const csr = dev;
// // since there's no dynamic data here, we can prerender // since there's no dynamic data here, we can prerender
// // it so that it gets served as a static asset in prod // it so that it gets served as a static asset in prod
// export const prerender = true; export const prerender = true;

View file

@ -1 +1 @@
// export const prerender = true; export const prerender = true;

View file

@ -1 +1 @@
// export const prerender = true; export const prerender = true;

View file

@ -1,4 +1,4 @@
import 'reflect-metadata' // import 'reflect-metadata'
import adapter from '@sveltejs/adapter-vercel'; import adapter from '@sveltejs/adapter-vercel';
import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
import { preprocessMeltUI } from '@melt-ui/pp'; import { preprocessMeltUI } from '@melt-ui/pp';

View file

@ -1,41 +0,0 @@
// vite.config.ts
import { sveltekit } from "file:///home/bshellnu/projects/websites/boredgame/node_modules/.pnpm/@sveltejs+kit@2.5.18_@sveltejs+vite-plugin-svelte@3.1.1_svelte@5.0.0-next.175_vite@5.3.5_@typ_ps3ubydtq463bedtodypwfb5fu/node_modules/@sveltejs/kit/src/exports/vite/index.js";
import { defineConfig } from "file:///home/bshellnu/projects/websites/boredgame/node_modules/.pnpm/vite@5.3.5_@types+node@20.14.13_sass@1.77.8/node_modules/vite/dist/node/index.js";
var vite_config_default = defineConfig({
plugins: [
// sentrySvelteKit({
// sourceMapsUploadOptions: {
// org: process.env.SENTRY_ORG,
// project: process.env.SENTRY_PROJECT,
// authToken: process.env.SENTRY_AUTH_TOKEN,
// cleanArtifacts: true,
// }
// }),
sveltekit()
],
test: {
include: ["src/**/*.{test,spec}.{js,ts}"]
},
css: {
devSourcemap: true,
preprocessorOptions: {
postcss: {
additionalData: `
@custom-media --below_small (width < 400px);
@custom-media --below_med (width < 700px);
@custom-media --below_large (width < 900px);
@custom-media --below_xlarge (width < 1200px);
@custom-media --above_small (width > 400px);
@custom-media --above_med (width > 700px);
@custom-media --above_large (width > 900px);
@custom-media --above_xlarge (width > 1200px);
`
}
}
}
});
export {
vite_config_default as default
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvaG9tZS9ic2hlbGxudS9wcm9qZWN0cy93ZWJzaXRlcy9ib3JlZGdhbWVcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIi9ob21lL2JzaGVsbG51L3Byb2plY3RzL3dlYnNpdGVzL2JvcmVkZ2FtZS92aXRlLmNvbmZpZy50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vaG9tZS9ic2hlbGxudS9wcm9qZWN0cy93ZWJzaXRlcy9ib3JlZGdhbWUvdml0ZS5jb25maWcudHNcIjsvLyBpbXBvcnQgeyBzZW50cnlTdmVsdGVLaXQgfSBmcm9tIFwiQHNlbnRyeS9zdmVsdGVraXRcIjtcbmltcG9ydCB7IHN2ZWx0ZWtpdCB9IGZyb20gJ0BzdmVsdGVqcy9raXQvdml0ZSc7XG5pbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tICd2aXRlJztcblxuLy8gVE9ETzogRml4IFNlbnRyeVxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHtcblx0cGx1Z2luczogW1xuXHRcdC8vIHNlbnRyeVN2ZWx0ZUtpdCh7XG5cdFx0Ly8gXHRzb3VyY2VNYXBzVXBsb2FkT3B0aW9uczoge1xuXHRcdC8vIFx0XHRvcmc6IHByb2Nlc3MuZW52LlNFTlRSWV9PUkcsXG5cdFx0Ly8gXHRcdHByb2plY3Q6IHByb2Nlc3MuZW52LlNFTlRSWV9QUk9KRUNULFxuXHRcdC8vIFx0XHRhdXRoVG9rZW46IHByb2Nlc3MuZW52LlNFTlRSWV9BVVRIX1RPS0VOLFxuXHRcdC8vIFx0XHRjbGVhbkFydGlmYWN0czogdHJ1ZSxcblx0XHQvLyBcdH1cblx0XHQvLyB9KSxcblx0XHRzdmVsdGVraXQoKVxuXHRdLFxuXHR0ZXN0OiB7XG5cdFx0aW5jbHVkZTogWydzcmMvKiovKi57dGVzdCxzcGVjfS57anMsdHN9J11cblx0fSxcblx0Y3NzOiB7XG5cdFx0ZGV2U291cmNlbWFwOiB0cnVlLFxuXHRcdHByZXByb2Nlc3Nvck9wdGlvbnM6IHtcblx0XHRcdHBvc3Rjc3M6IHtcblx0XHRcdFx0YWRkaXRpb25hbERhdGE6IGBcblx0XHRcdFx0QGN1c3RvbS1tZWRpYSAtLWJlbG93X3NtYWxsICh3aWR0aCA8IDQwMHB4KTtcblx0XHRcdFx0QGN1c3RvbS1tZWRpYSAtLWJlbG93X21lZCAod2lkdGggPCA3MDBweCk7XG5cdFx0XHRcdEBjdXN0b20tbWVkaWEgLS1iZWxvd19sYXJnZSAod2lkdGggPCA5MDBweCk7XG5cdFx0XHRcdEBjdXN0b20tbWVkaWEgLS1iZWxvd194bGFyZ2UgKHdpZHRoIDwgMTIwMHB4KTtcblxuXHRcdFx0XHRAY3VzdG9tLW1lZGlhIC0tYWJvdmVfc21hbGwgKHdpZHRoID4gNDAwcHgpO1xuXHRcdFx0XHRAY3VzdG9tLW1lZGlhIC0tYWJvdmVfbWVkICh3aWR0aCA+IDcwMHB4KTtcblx0XHRcdFx0QGN1c3RvbS1tZWRpYSAtLWFib3ZlX2xhcmdlICh3aWR0aCA+IDkwMHB4KTtcblx0XHRcdFx0QGN1c3RvbS1tZWRpYSAtLWFib3ZlX3hsYXJnZSAod2lkdGggPiAxMjAwcHgpO1xuXHRcdFx0XHRgXG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxufSk7XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQ0EsU0FBUyxpQkFBaUI7QUFDMUIsU0FBUyxvQkFBb0I7QUFHN0IsSUFBTyxzQkFBUSxhQUFhO0FBQUEsRUFDM0IsU0FBUztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQVNSLFVBQVU7QUFBQSxFQUNYO0FBQUEsRUFDQSxNQUFNO0FBQUEsSUFDTCxTQUFTLENBQUMsOEJBQThCO0FBQUEsRUFDekM7QUFBQSxFQUNBLEtBQUs7QUFBQSxJQUNKLGNBQWM7QUFBQSxJQUNkLHFCQUFxQjtBQUFBLE1BQ3BCLFNBQVM7QUFBQSxRQUNSLGdCQUFnQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFXakI7QUFBQSxJQUNEO0FBQUEsRUFDRDtBQUNELENBQUM7IiwKICAibmFtZXMiOiBbXQp9Cg==