From 14fe604bf49fec733aae886acbde3ade67db314f Mon Sep 17 00:00:00 2001 From: Bradley Shellnut Date: Tue, 13 Aug 2024 15:19:57 -0700 Subject: [PATCH] Fix tests, write random name generator, install faker, and update dependencies. --- package.json | 25 +- pnpm-lock.yaml | 281 +++++++++--------- .../tables/categoriesToExternalIdsTable.ts | 2 +- .../database/tables/categoriesToGames.ts | 2 +- .../database/tables/collectionItems.ts | 2 +- .../database/tables/expansions.ts | 2 +- .../database/tables/mechanics.ts | 6 +- .../database/tables/mechanicsToGames.ts | 2 - .../database/tables/publishers.ts | 2 +- .../database/tables/wishlistItems.ts | 2 +- .../repositories/collections.repository.ts | 33 +- .../repositories/credentials.repository.ts | 12 +- .../api/repositories/roles.repository.ts | 12 +- .../api/repositories/user_roles.repository.ts | 8 +- .../api/repositories/users.repository.ts | 12 +- .../api/repositories/wishlists.repository.ts | 43 ++- .../api/services/collections.service.ts | 11 + .../server/api/services/user_roles.service.ts | 5 +- src/lib/server/api/services/users.service.ts | 16 +- .../server/api/services/wishlists.service.ts | 26 ++ .../api/tests/login-requests.service.test.ts | 72 ----- .../server/api/tests/users.service.test.ts | 111 +++++++ src/lib/tests/randomDataUtil.test.ts | 7 + src/lib/utils/randomDataUtil.ts | 40 +++ 24 files changed, 469 insertions(+), 265 deletions(-) create mode 100644 src/lib/server/api/services/wishlists.service.ts delete mode 100644 src/lib/server/api/tests/login-requests.service.test.ts create mode 100644 src/lib/server/api/tests/users.service.test.ts create mode 100644 src/lib/tests/randomDataUtil.test.ts create mode 100644 src/lib/utils/randomDataUtil.ts diff --git a/package.json b/package.json index 76cc897..e8f3cd7 100644 --- a/package.json +++ b/package.json @@ -23,15 +23,16 @@ "test:unit": "vitest" }, "devDependencies": { + "@faker-js/faker": "^8.4.1", "@melt-ui/pp": "^0.3.2", "@melt-ui/svelte": "^0.83.0", "@playwright/test": "^1.46.0", - "@sveltejs/adapter-auto": "^3.2.2", - "@sveltejs/enhanced-img": "^0.3.1", - "@sveltejs/kit": "^2.5.20", + "@sveltejs/adapter-auto": "^3.2.4", + "@sveltejs/enhanced-img": "^0.3.3", + "@sveltejs/kit": "^2.5.22", "@sveltejs/vite-plugin-svelte": "^3.1.1", "@types/cookie": "^0.6.0", - "@types/node": "^20.14.14", + "@types/node": "^20.14.15", "@types/pg": "^8.11.6", "@typescript-eslint/eslint-plugin": "^7.18.0", "@typescript-eslint/parser": "^7.18.0", @@ -63,12 +64,12 @@ "sveltekit-flash-message": "^2.4.4", "sveltekit-rate-limiter": "^0.5.2", "sveltekit-superforms": "^2.16.1", - "tailwindcss": "^3.4.7", + "tailwindcss": "^3.4.9", "ts-node": "^10.9.2", "tslib": "^2.6.3", - "tsx": "^4.16.5", + "tsx": "^4.17.0", "typescript": "^5.5.4", - "vite": "^5.3.5", + "vite": "^5.4.0", "vitest": "^1.6.0", "zod": "^3.23.8" }, @@ -84,14 +85,14 @@ "@neondatabase/serverless": "^0.9.4", "@paralleldrive/cuid2": "^2.2.2", "@resvg/resvg-js": "^2.6.2", - "@sveltejs/adapter-node": "^5.2.0", - "@sveltejs/adapter-vercel": "^5.4.1", + "@sveltejs/adapter-node": "^5.2.2", + "@sveltejs/adapter-vercel": "^5.4.3", "@types/feather-icons": "^4.29.4", "@vercel/og": "^0.5.20", "arctic": "^1.9.2", "bits-ui": "^0.21.13", "boardgamegeekclient": "^1.9.1", - "bullmq": "^5.12.0", + "bullmq": "^5.12.5", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", "cookie": "^0.6.0", @@ -101,7 +102,7 @@ "feather-icons": "^4.29.2", "formsnap": "^1.0.1", "handlebars": "^4.7.8", - "hono": "^4.5.3", + "hono": "^4.5.5", "hono-rate-limiter": "^0.4.0", "html-entities": "^2.5.2", "iconify-icon": "^2.1.0", @@ -119,7 +120,7 @@ "reflect-metadata": "^0.2.2", "svelte-french-toast": "^1.2.0", "svelte-lazy-loader": "^1.0.0", - "tailwind-merge": "^2.4.0", + "tailwind-merge": "^2.5.2", "tailwind-variants": "^0.2.1", "tailwindcss-animate": "^1.0.7", "tsyringe": "^4.8.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6e072f3..afa7e6e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: version: 5.0.13 '@hono/zod-validator': specifier: ^0.2.2 - version: 0.2.2(hono@4.5.3)(zod@3.23.8) + version: 0.2.2(hono@4.5.5)(zod@3.23.8) '@iconify-icons/line-md': specifier: ^1.2.30 version: 1.2.30 @@ -39,11 +39,11 @@ importers: specifier: ^2.6.2 version: 2.6.2 '@sveltejs/adapter-node': - specifier: ^5.2.0 - 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))) + specifier: ^5.2.2 + version: 5.2.2(@sveltejs/kit@2.5.22(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8))) '@sveltejs/adapter-vercel': - specifier: ^5.4.1 - 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))) + specifier: ^5.4.3 + version: 5.4.3(@sveltejs/kit@2.5.22(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8))) '@types/feather-icons': specifier: ^4.29.4 version: 4.29.4 @@ -60,8 +60,8 @@ importers: specifier: ^1.9.1 version: 1.9.1 bullmq: - specifier: ^5.12.0 - version: 5.12.0 + specifier: ^5.12.5 + version: 5.12.5 class-variance-authority: specifier: ^0.7.0 version: 0.7.0 @@ -85,16 +85,16 @@ importers: version: 4.29.2 formsnap: specifier: ^1.0.1 - version: 1.0.1(svelte@5.0.0-next.175)(sveltekit-superforms@2.16.1(@sveltejs/kit@2.5.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)) + version: 1.0.1(svelte@5.0.0-next.175)(sveltekit-superforms@2.16.1(@sveltejs/kit@2.5.22(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)))(svelte@5.0.0-next.175)) handlebars: specifier: ^4.7.8 version: 4.7.8 hono: - specifier: ^4.5.3 - version: 4.5.3 + specifier: ^4.5.5 + version: 4.5.5 hono-rate-limiter: specifier: ^0.4.0 - version: 0.4.0(hono@4.5.3) + version: 0.4.0(hono@4.5.5) html-entities: specifier: ^2.5.2 version: 2.5.2 @@ -144,14 +144,14 @@ importers: specifier: ^1.0.0 version: 1.0.0 tailwind-merge: - specifier: ^2.4.0 - version: 2.4.0 + specifier: ^2.5.2 + version: 2.5.2 tailwind-variants: specifier: ^0.2.1 - version: 0.2.1(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))) + version: 0.2.1(tailwindcss@3.4.9(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4))) tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))) + version: 1.0.7(tailwindcss@3.4.9(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4))) tsyringe: specifier: ^4.8.0 version: 4.8.0 @@ -159,6 +159,9 @@ importers: specifier: ^3.23.2 version: 3.23.2(zod@3.23.8) devDependencies: + '@faker-js/faker': + specifier: ^8.4.1 + version: 8.4.1 '@melt-ui/pp': specifier: ^0.3.2 version: 0.3.2(@melt-ui/svelte@0.83.0(svelte@5.0.0-next.175))(svelte@5.0.0-next.175) @@ -169,23 +172,23 @@ importers: specifier: ^1.46.0 version: 1.46.0 '@sveltejs/adapter-auto': - specifier: ^3.2.2 - 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))) + specifier: ^3.2.4 + version: 3.2.4(@sveltejs/kit@2.5.22(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8))) '@sveltejs/enhanced-img': - 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.14)(sass@1.77.8)) + specifier: ^0.3.3 + version: 0.3.3(rollup@4.18.1)(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)) '@sveltejs/kit': - specifier: ^2.5.20 - 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)) + specifier: ^2.5.22 + version: 2.5.22(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)) '@sveltejs/vite-plugin-svelte': specifier: ^3.1.1 - version: 3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)) + version: 3.1.1(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)) '@types/cookie': specifier: ^0.6.0 version: 0.6.0 '@types/node': - specifier: ^20.14.14 - version: 20.14.14 + specifier: ^20.14.15 + version: 20.14.15 '@types/pg': specifier: ^8.11.6 version: 8.11.6 @@ -209,7 +212,7 @@ importers: version: 9.1.0(eslint@8.57.0) eslint-plugin-svelte: specifier: ^2.43.0 - version: 2.43.0(eslint@8.57.0)(svelte@5.0.0-next.175)(ts-node@10.9.2(@types/node@20.14.14)(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.15)(typescript@5.5.4)) just-clone: specifier: ^6.2.0 version: 6.2.0 @@ -233,7 +236,7 @@ importers: version: 16.1.0(postcss@8.4.41) postcss-load-config: specifier: ^5.1.0 - version: 5.1.0(jiti@1.21.6)(postcss@8.4.41)(tsx@4.16.5) + version: 5.1.0(jiti@1.21.6)(postcss@8.4.41)(tsx@4.17.0) postcss-preset-env: specifier: ^9.6.0 version: 9.6.0(postcss@8.4.41) @@ -257,7 +260,7 @@ importers: version: 5.0.0-next.175 svelte-check: specifier: ^3.8.5 - version: 3.8.5(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.41)(tsx@4.16.5))(postcss@8.4.41)(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.41)(tsx@4.17.0))(postcss@8.4.41)(sass@1.77.8)(svelte@5.0.0-next.175) svelte-headless-table: specifier: ^0.18.2 version: 0.18.2(svelte@5.0.0-next.175) @@ -266,40 +269,40 @@ importers: version: 3.1.2(svelte@5.0.0-next.175)(typescript@5.5.4) svelte-preprocess: specifier: ^6.0.2 - version: 6.0.2(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.41)(tsx@4.16.5))(postcss@8.4.41)(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.41)(tsx@4.17.0))(postcss@8.4.41)(sass@1.77.8)(svelte@5.0.0-next.175)(typescript@5.5.4) svelte-sequential-preprocessor: specifier: ^2.0.1 version: 2.0.1 sveltekit-flash-message: specifier: ^2.4.4 - version: 2.4.4(@sveltejs/kit@2.5.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) + version: 2.4.4(@sveltejs/kit@2.5.22(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)))(svelte@5.0.0-next.175) sveltekit-rate-limiter: specifier: ^0.5.2 - version: 0.5.2(@sveltejs/kit@2.5.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))) + version: 0.5.2(@sveltejs/kit@2.5.22(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8))) sveltekit-superforms: specifier: ^2.16.1 - 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) + version: 2.16.1(@sveltejs/kit@2.5.22(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)))(svelte@5.0.0-next.175) tailwindcss: - specifier: ^3.4.7 - version: 3.4.7(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4)) + specifier: ^3.4.9 + version: 3.4.9(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4)) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.14.14)(typescript@5.5.4) + version: 10.9.2(@types/node@20.14.15)(typescript@5.5.4) tslib: specifier: ^2.6.3 version: 2.6.3 tsx: - specifier: ^4.16.5 - version: 4.16.5 + specifier: ^4.17.0 + version: 4.17.0 typescript: specifier: ^5.5.4 version: 5.5.4 vite: - specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.14)(sass@1.77.8) + specifier: ^5.4.0 + version: 5.4.0(@types/node@20.14.15)(sass@1.77.8) vitest: specifier: ^1.6.0 - version: 1.6.0(@types/node@20.14.14)(sass@1.77.8) + version: 1.6.0(@types/node@20.14.15)(sass@1.77.8) zod: specifier: ^3.23.8 version: 3.23.8 @@ -1159,6 +1162,10 @@ packages: '@exodus/schemasafe@1.3.0': resolution: {integrity: sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==} + '@faker-js/faker@8.4.1': + resolution: {integrity: sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0, npm: '>=6.14.13'} + '@floating-ui/core@1.6.1': resolution: {integrity: sha512-42UH54oPZHPdRHdw6BgoBD6cg/eVTmVrFcgeRDM3jbO7uxSoipVcmcIGFcA5jmOHO5apcyvBhkSKES3fQJnu7A==} @@ -1950,29 +1957,29 @@ packages: '@sodaru/yup-to-json-schema@2.0.1': resolution: {integrity: sha512-lWb0Wiz8KZ9ip/dY1eUqt7fhTPmL24p6Hmv5Fd9pzlzAdw/YNcWZr+tiCT4oZ4Zyxzi9+1X4zv82o7jYvcFxYA==} - '@sveltejs/adapter-auto@3.2.2': - resolution: {integrity: sha512-Mso5xPCA8zgcKrv+QioVlqMZkyUQ5MjDJiEPuG/Z7cV/5tmwV7LmcVWk5tZ+H0NCOV1x12AsoSpt/CwFwuVXMA==} + '@sveltejs/adapter-auto@3.2.4': + resolution: {integrity: sha512-a64AKYbfTUrVwU0xslzv1Jf3M8bj0IwhptaXmhgIkjXspBXhD0od9JiItQHchijpLMGdEDcYBlvqySkEawv6mQ==} peerDependencies: '@sveltejs/kit': ^2.0.0 - '@sveltejs/adapter-node@5.2.0': - resolution: {integrity: sha512-HVZoei2078XSyPmvdTHE03VXDUD0ytTvMuMHMQP0j6zX4nPDpCcKrgvU7baEblMeCCMdM/shQvstFxOJPQKlUQ==} + '@sveltejs/adapter-node@5.2.2': + resolution: {integrity: sha512-BCX4zP0cf86TXpmvLQTnnT/tp7P12UMezf+5LwljP1MJC1fFzn9XOXpAHQCyP+pyHGy2K7p5gY0LyLcZFAL02w==} peerDependencies: '@sveltejs/kit': ^2.4.0 - '@sveltejs/adapter-vercel@5.4.1': - resolution: {integrity: sha512-JLcD1OgMnu9lQ8EssxVGxv7w0waWuyVzItTT1eqIH98Krufd9qfr1uC9zgo82z3dJ9v1AfPEbvIX5tonceg7XQ==} + '@sveltejs/adapter-vercel@5.4.3': + resolution: {integrity: sha512-srZBkMpeaa7lflO1ZGdKTW3jWHscE9rdAkyxgRlVMVyugjcPOZ3dcpEfpoM4wtVCbpEOdHniWqQR9yL+zs4ybA==} peerDependencies: '@sveltejs/kit': ^2.4.0 - '@sveltejs/enhanced-img@0.3.1': - resolution: {integrity: sha512-75A4YiXQp+GRc54EyiNOlhHnHt9O8e0CdCHLm3RWESLRaazd5OIciSa4SbKIo9DM84yGwSVShU0buyUmNJvgWg==} + '@sveltejs/enhanced-img@0.3.3': + resolution: {integrity: sha512-nsqJkVuYLUXARDLjMoGKAt4oLzwtY8X2E8rIl/TJl7ueLjpTISxrAhVRN3r8yMO+R+so4G6Taiix2mpiPpqZeg==} peerDependencies: svelte: ^4.0.0 || ^5.0.0-next.0 vite: '>= 5.0.0' - '@sveltejs/kit@2.5.20': - resolution: {integrity: sha512-47rJ5BoYwURE/Rp7FNMLp3NzdbWC9DQ/PmKd0mebxT2D/PrPxZxcLImcD3zsWdX2iS6oJk8ITJbO/N2lWnnUqA==} + '@sveltejs/kit@2.5.22': + resolution: {integrity: sha512-PQ98baF2WzvG5yiO4cZKJZJG60XjHTZD1jyho3u9Kmthx2ytdGYyVPPvKXgKXpKSq4wwctD9dl0d2blSbJMcOg==} engines: {node: '>=18.13'} hasBin: true peerDependencies: @@ -2025,8 +2032,8 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@20.14.14': - resolution: {integrity: sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ==} + '@types/node@20.14.15': + resolution: {integrity: sha512-Fz1xDMCF/B00/tYSVMlmK7hVeLh7jE5f3B7X1/hmV0MJBwE27KlS7EvD/Yp+z1lm8mVhwV5w+n8jOZG8AfTlKw==} '@types/pg@8.11.6': resolution: {integrity: sha512-/2WmmBXHLsfRqzfHW7BNZ8SbYzE8OSk7i3WjFYvfgRHj7S1xj+16Je5fUKv3lVdVzk/zn9TXOqf+avFCFIE0yQ==} @@ -2313,8 +2320,8 @@ packages: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} - bullmq@5.12.0: - resolution: {integrity: sha512-kOtSQx9ymylslsLNFD0xOMJM9mHqnq3x6KD7+DYkHByWe0HFRdblpYKhZyL4uR3rwaKZwzOrJVl3RwRaDjZxSg==} + bullmq@5.12.5: + resolution: {integrity: sha512-lchCvFuPdaIbq01qnyS7MOt2piPeCDHzCqIxNAQEgDSzZ+Eb4RBboUUMgmW90UtMjV46mEqsWY9B1l/7/C13SA==} bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} @@ -3083,8 +3090,8 @@ packages: peerDependencies: hono: ^4.1.1 - hono@4.5.3: - resolution: {integrity: sha512-r26WwwbKD3BAYdfB294knNnegNda7VfV1tVn66D9Kvl9WQTdrR+5eKdoeaQNHQcC3Gr0KBikzAtjd6VsRGVSaw==} + hono@4.5.5: + resolution: {integrity: sha512-fXBXHqaVfimWofbelLXci8pZyIwBMkDIwCa4OwZvK+xVbEyYLELVP4DfbGaj1aEM6ZY3hHgs4qLvCO2ChkhgQw==} engines: {node: '>=16.0.0'} html-entities@2.5.2: @@ -4526,8 +4533,8 @@ packages: tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - tailwind-merge@2.4.0: - resolution: {integrity: sha512-49AwoOQNKdqKPd9CViyH5wJoSKsCDjUlzL8DxuGp3P1FsGY36NJDAa18jLZcaHAUUuTj+JB8IAo8zWgBNvBF7A==} + tailwind-merge@2.5.2: + resolution: {integrity: sha512-kjEBm+pvD+6eAwzJL2Bi+02/9LFLal1Gs61+QB7HvTfQQ0aXwC5LGT8PEt1gS0CWKktKe6ysPTAy3cBC5MeiIg==} tailwind-variants@0.2.1: resolution: {integrity: sha512-2xmhAf4UIc3PijOUcJPA1LP4AbxhpcHuHM2C26xM0k81r0maAO6uoUSHl3APmvHZcY5cZCY/bYuJdfFa4eGoaw==} @@ -4540,8 +4547,8 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders' - tailwindcss@3.4.7: - resolution: {integrity: sha512-rxWZbe87YJb4OcSopb7up2Ba4U82BoiSGUdoDr3Ydrg9ckxFS/YWsvhN323GMcddgU65QRy7JndC7ahhInhvlQ==} + tailwindcss@3.4.9: + resolution: {integrity: sha512-1SEOvRr6sSdV5IDf9iC+NU4dhwdqzF4zKKq3sAbasUWHEM6lsMhX+eNN5gkPx1BvLFEnZQEUFbXnGj8Qlp83Pg==} engines: {node: '>=14.0.0'} hasBin: true @@ -4636,8 +4643,8 @@ packages: tslib@2.6.3: resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} - tsx@4.16.5: - resolution: {integrity: sha512-ArsiAQHEW2iGaqZ8fTA1nX0a+lN5mNTyuGRRO6OW3H/Yno1y9/t1f9YOI1Cfoqz63VAthn++ZYcbDP7jPflc+A==} + tsx@4.17.0: + resolution: {integrity: sha512-eN4mnDA5UMKDt4YZixo9tBioibaMBpoxBkD+rIPAjVmYERSG0/dWEY1CEFuV89CgASlKL499q8AhmkMnnjtOJg==} engines: {node: '>=18.0.0'} hasBin: true @@ -4740,8 +4747,8 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - vite@5.3.5: - resolution: {integrity: sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==} + vite@5.4.0: + resolution: {integrity: sha512-5xokfMX0PIiwCMCMb9ZJcMyh5wbBun0zUzKib+L65vAZ8GY9ePZMXxFrHbr/Kyll2+LSCY7xtERPpxkBDKngwg==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -4749,6 +4756,7 @@ packages: less: '*' lightningcss: ^1.21.0 sass: '*' + sass-embedded: '*' stylus: '*' sugarss: '*' terser: ^5.4.0 @@ -4761,6 +4769,8 @@ packages: optional: true sass: optional: true + sass-embedded: + optional: true stylus: optional: true sugarss: @@ -5499,6 +5509,8 @@ snapshots: '@exodus/schemasafe@1.3.0': optional: true + '@faker-js/faker@8.4.1': {} + '@floating-ui/core@1.6.1': dependencies: '@floating-ui/utils': 0.2.2 @@ -5544,9 +5556,9 @@ snapshots: '@hapi/hoek': 9.3.0 optional: true - '@hono/zod-validator@0.2.2(hono@4.5.3)(zod@3.23.8)': + '@hono/zod-validator@0.2.2(hono@4.5.5)(zod@3.23.8)': dependencies: - hono: 4.5.3 + hono: 4.5.5 zod: 3.23.8 '@humanwhocodes/config-array@0.11.14': @@ -6136,41 +6148,41 @@ snapshots: '@sodaru/yup-to-json-schema@2.0.1': optional: true - '@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)))': + '@sveltejs/adapter-auto@3.2.4(@sveltejs/kit@2.5.22(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)))': dependencies: - '@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/kit': 2.5.22(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)) import-meta-resolve: 4.1.0 - '@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)))': + '@sveltejs/adapter-node@5.2.2(@sveltejs/kit@2.5.22(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)))': dependencies: '@rollup/plugin-commonjs': 26.0.1(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) - '@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/kit': 2.5.22(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)) rollup: 4.18.1 - '@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)))': + '@sveltejs/adapter-vercel@5.4.3(@sveltejs/kit@2.5.22(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)))': dependencies: - '@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/kit': 2.5.22(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)) '@vercel/nft': 0.27.2 esbuild: 0.21.5 transitivePeerDependencies: - encoding - 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.14)(sass@1.77.8))': + '@sveltejs/enhanced-img@0.3.3(rollup@4.18.1)(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8))': dependencies: magic-string: 0.30.10 svelte: 5.0.0-next.175 svelte-parse-markup: 0.1.5(svelte@5.0.0-next.175) - vite: 5.3.5(@types/node@20.14.14)(sass@1.77.8) + vite: 5.4.0(@types/node@20.14.15)(sass@1.77.8) vite-imagetools: 7.0.2(rollup@4.18.1) transitivePeerDependencies: - rollup - '@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/kit@2.5.22(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8))': dependencies: - '@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)) + '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)) '@types/cookie': 0.6.0 cookie: 0.6.0 devalue: 5.0.0 @@ -6184,28 +6196,28 @@ snapshots: sirv: 2.0.4 svelte: 5.0.0-next.175 tiny-glob: 0.2.9 - vite: 5.3.5(@types/node@20.14.14)(sass@1.77.8) + vite: 5.4.0(@types/node@20.14.15)(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))': + '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8))': dependencies: - '@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)) + '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)) debug: 4.3.4 svelte: 5.0.0-next.175 - vite: 5.3.5(@types/node@20.14.14)(sass@1.77.8) + vite: 5.4.0(@types/node@20.14.15)(sass@1.77.8) transitivePeerDependencies: - supports-color - '@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))': + '@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.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-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)) debug: 4.3.4 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.10 svelte: 5.0.0-next.175 svelte-hmr: 0.16.0(svelte@5.0.0-next.175) - vite: 5.3.5(@types/node@20.14.14)(sass@1.77.8) - vitefu: 0.2.5(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)) + vite: 5.4.0(@types/node@20.14.15)(sass@1.77.8) + vitefu: 0.2.5(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)) transitivePeerDependencies: - supports-color @@ -6235,13 +6247,13 @@ snapshots: '@types/json-schema@7.0.15': optional: true - '@types/node@20.14.14': + '@types/node@20.14.15': dependencies: undici-types: 5.26.5 '@types/pg@8.11.6': dependencies: - '@types/node': 20.14.14 + '@types/node': 20.14.15 pg-protocol: 1.6.1 pg-types: 4.0.2 @@ -6588,7 +6600,7 @@ snapshots: builtin-modules@3.3.0: {} - bullmq@5.12.0: + bullmq@5.12.5: dependencies: cron-parser: 4.9.0 ioredis: 5.4.1 @@ -7007,7 +7019,6 @@ snapshots: '@esbuild/win32-arm64': 0.23.0 '@esbuild/win32-ia32': 0.23.0 '@esbuild/win32-x64': 0.23.0 - optional: true escalade@3.1.2: {} @@ -7024,7 +7035,7 @@ snapshots: dependencies: eslint: 8.57.0 - eslint-plugin-svelte@2.43.0(eslint@8.57.0)(svelte@5.0.0-next.175)(ts-node@10.9.2(@types/node@20.14.14)(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.15)(typescript@5.5.4)): dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@jridgewell/sourcemap-codec': 1.4.15 @@ -7033,7 +7044,7 @@ snapshots: esutils: 2.0.3 known-css-properties: 0.34.0 postcss: 8.4.41 - postcss-load-config: 3.1.4(postcss@8.4.41)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4)) + postcss-load-config: 3.1.4(postcss@8.4.41)(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4)) postcss-safe-parser: 6.0.0(postcss@8.4.41) postcss-selector-parser: 6.1.0 semver: 7.6.2 @@ -7260,11 +7271,11 @@ snapshots: cross-spawn: 7.0.3 signal-exit: 4.1.0 - formsnap@1.0.1(svelte@5.0.0-next.175)(sveltekit-superforms@2.16.1(@sveltejs/kit@2.5.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)): + formsnap@1.0.1(svelte@5.0.0-next.175)(sveltekit-superforms@2.16.1(@sveltejs/kit@2.5.22(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)))(svelte@5.0.0-next.175)): dependencies: nanoid: 5.0.7 svelte: 5.0.0-next.175 - sveltekit-superforms: 2.16.1(@sveltejs/kit@2.5.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-superforms: 2.16.1(@sveltejs/kit@2.5.22(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)))(svelte@5.0.0-next.175) forwarded@0.2.0: {} @@ -7396,11 +7407,11 @@ snapshots: hex-rgb@4.3.0: {} - hono-rate-limiter@0.4.0(hono@4.5.3): + hono-rate-limiter@0.4.0(hono@4.5.5): dependencies: - hono: 4.5.3 + hono: 4.5.5 - hono@4.5.3: {} + hono@4.5.5: {} html-entities@2.5.2: {} @@ -8115,30 +8126,30 @@ snapshots: '@csstools/utilities': 1.0.0(postcss@8.4.41) postcss: 8.4.41 - postcss-load-config@3.1.4(postcss@8.4.41)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4)): + postcss-load-config@3.1.4(postcss@8.4.41)(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4)): dependencies: lilconfig: 2.1.0 yaml: 1.10.2 optionalDependencies: postcss: 8.4.41 - ts-node: 10.9.2(@types/node@20.14.14)(typescript@5.5.4) + ts-node: 10.9.2(@types/node@20.14.15)(typescript@5.5.4) - postcss-load-config@4.0.2(postcss@8.4.41)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4)): + postcss-load-config@4.0.2(postcss@8.4.41)(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4)): dependencies: lilconfig: 3.1.1 yaml: 2.4.3 optionalDependencies: postcss: 8.4.41 - ts-node: 10.9.2(@types/node@20.14.14)(typescript@5.5.4) + ts-node: 10.9.2(@types/node@20.14.15)(typescript@5.5.4) - postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.41)(tsx@4.16.5): + postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.41)(tsx@4.17.0): dependencies: lilconfig: 3.1.1 yaml: 2.4.2 optionalDependencies: jiti: 1.21.6 postcss: 8.4.41 - tsx: 4.16.5 + tsx: 4.17.0 postcss-logical@7.0.1(postcss@8.4.41): dependencies: @@ -8708,14 +8719,14 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte-check@3.8.5(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.41)(tsx@4.16.5))(postcss@8.4.41)(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.41)(tsx@4.17.0))(postcss@8.4.41)(sass@1.77.8)(svelte@5.0.0-next.175): dependencies: '@jridgewell/trace-mapping': 0.3.25 chokidar: 3.6.0 picocolors: 1.0.0 sade: 1.8.1 svelte: 5.0.0-next.175 - svelte-preprocess: 5.1.4(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.41)(tsx@4.16.5))(postcss@8.4.41)(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.41)(tsx@4.17.0))(postcss@8.4.41)(sass@1.77.8)(svelte@5.0.0-next.175)(typescript@5.5.4) typescript: 5.5.4 transitivePeerDependencies: - '@babel/core' @@ -8771,7 +8782,7 @@ snapshots: dependencies: svelte: 5.0.0-next.175 - svelte-preprocess@5.1.4(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.41)(tsx@4.16.5))(postcss@8.4.41)(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.41)(tsx@4.17.0))(postcss@8.4.41)(sass@1.77.8)(svelte@5.0.0-next.175)(typescript@5.5.4): dependencies: '@types/pug': 2.0.10 detect-indent: 6.1.0 @@ -8781,16 +8792,16 @@ snapshots: svelte: 5.0.0-next.175 optionalDependencies: postcss: 8.4.41 - postcss-load-config: 5.1.0(jiti@1.21.6)(postcss@8.4.41)(tsx@4.16.5) + postcss-load-config: 5.1.0(jiti@1.21.6)(postcss@8.4.41)(tsx@4.17.0) sass: 1.77.8 typescript: 5.5.4 - svelte-preprocess@6.0.2(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.41)(tsx@4.16.5))(postcss@8.4.41)(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.41)(tsx@4.17.0))(postcss@8.4.41)(sass@1.77.8)(svelte@5.0.0-next.175)(typescript@5.5.4): dependencies: svelte: 5.0.0-next.175 optionalDependencies: postcss: 8.4.41 - postcss-load-config: 5.1.0(jiti@1.21.6)(postcss@8.4.41)(tsx@4.16.5) + postcss-load-config: 5.1.0(jiti@1.21.6)(postcss@8.4.41)(tsx@4.17.0) sass: 1.77.8 typescript: 5.5.4 @@ -8845,19 +8856,19 @@ snapshots: magic-string: 0.30.10 zimmerframe: 1.1.2 - 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): + sveltekit-flash-message@2.4.4(@sveltejs/kit@2.5.22(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)))(svelte@5.0.0-next.175): dependencies: - '@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/kit': 2.5.22(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)) svelte: 5.0.0-next.175 - 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))): + sveltekit-rate-limiter@0.5.2(@sveltejs/kit@2.5.22(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8))): dependencies: '@isaacs/ttlcache': 1.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)) + '@sveltejs/kit': 2.5.22(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)) - 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): + sveltekit-superforms@2.16.1(@sveltejs/kit@2.5.22(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)))(svelte@5.0.0-next.175): dependencies: - '@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/kit': 2.5.22(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)) devalue: 5.0.0 just-clone: 6.2.0 memoize-weak: 1.0.2 @@ -8880,18 +8891,18 @@ snapshots: tabbable@6.2.0: {} - tailwind-merge@2.4.0: {} + tailwind-merge@2.5.2: {} - tailwind-variants@0.2.1(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))): + tailwind-variants@0.2.1(tailwindcss@3.4.9(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4))): dependencies: - tailwind-merge: 2.4.0 - tailwindcss: 3.4.7(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4)) + tailwind-merge: 2.5.2 + tailwindcss: 3.4.9(ts-node@10.9.2(@types/node@20.14.15)(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))): + tailwindcss-animate@1.0.7(tailwindcss@3.4.9(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4))): dependencies: - tailwindcss: 3.4.7(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4)) + tailwindcss: 3.4.9(ts-node@10.9.2(@types/node@20.14.15)(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.9(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -8910,7 +8921,7 @@ snapshots: postcss: 8.4.41 postcss-import: 15.1.0(postcss@8.4.41) postcss-js: 4.0.1(postcss@8.4.41) - postcss-load-config: 4.0.2(postcss@8.4.41)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4)) + postcss-load-config: 4.0.2(postcss@8.4.41)(ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4)) postcss-nested: 6.0.1(postcss@8.4.41) postcss-selector-parser: 6.1.0 resolve: 1.22.8 @@ -8977,14 +8988,14 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4): + ts-node@10.9.2(@types/node@20.14.15)(typescript@5.5.4): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.14.14 + '@types/node': 20.14.15 acorn: 8.11.3 acorn-walk: 8.3.2 arg: 4.1.3 @@ -9002,9 +9013,9 @@ snapshots: tslib@2.6.3: {} - tsx@4.16.5: + tsx@4.17.0: dependencies: - esbuild: 0.21.5 + esbuild: 0.23.0 get-tsconfig: 4.7.5 optionalDependencies: fsevents: 2.3.3 @@ -9091,38 +9102,39 @@ snapshots: transitivePeerDependencies: - rollup - vite-node@1.6.0(@types/node@20.14.14)(sass@1.77.8): + vite-node@1.6.0(@types/node@20.14.15)(sass@1.77.8): dependencies: cac: 6.7.14 debug: 4.3.4 pathe: 1.1.2 picocolors: 1.0.0 - vite: 5.3.5(@types/node@20.14.14)(sass@1.77.8) + vite: 5.4.0(@types/node@20.14.15)(sass@1.77.8) transitivePeerDependencies: - '@types/node' - less - lightningcss - sass + - sass-embedded - stylus - sugarss - supports-color - terser - vite@5.3.5(@types/node@20.14.14)(sass@1.77.8): + vite@5.4.0(@types/node@20.14.15)(sass@1.77.8): dependencies: esbuild: 0.21.5 postcss: 8.4.41 rollup: 4.17.2 optionalDependencies: - '@types/node': 20.14.14 + '@types/node': 20.14.15 fsevents: 2.3.3 sass: 1.77.8 - vitefu@0.2.5(vite@5.3.5(@types/node@20.14.14)(sass@1.77.8)): + vitefu@0.2.5(vite@5.4.0(@types/node@20.14.15)(sass@1.77.8)): optionalDependencies: - vite: 5.3.5(@types/node@20.14.14)(sass@1.77.8) + vite: 5.4.0(@types/node@20.14.15)(sass@1.77.8) - vitest@1.6.0(@types/node@20.14.14)(sass@1.77.8): + vitest@1.6.0(@types/node@20.14.15)(sass@1.77.8): dependencies: '@vitest/expect': 1.6.0 '@vitest/runner': 1.6.0 @@ -9141,15 +9153,16 @@ snapshots: strip-literal: 2.1.0 tinybench: 2.8.0 tinypool: 0.8.4 - vite: 5.3.5(@types/node@20.14.14)(sass@1.77.8) - vite-node: 1.6.0(@types/node@20.14.14)(sass@1.77.8) + vite: 5.4.0(@types/node@20.14.15)(sass@1.77.8) + vite-node: 1.6.0(@types/node@20.14.15)(sass@1.77.8) why-is-node-running: 2.2.2 optionalDependencies: - '@types/node': 20.14.14 + '@types/node': 20.14.15 transitivePeerDependencies: - less - lightningcss - sass + - sass-embedded - stylus - sugarss - supports-color diff --git a/src/lib/server/api/infrastructure/database/tables/categoriesToExternalIdsTable.ts b/src/lib/server/api/infrastructure/database/tables/categoriesToExternalIdsTable.ts index b06a267..c8ab5f3 100644 --- a/src/lib/server/api/infrastructure/database/tables/categoriesToExternalIdsTable.ts +++ b/src/lib/server/api/infrastructure/database/tables/categoriesToExternalIdsTable.ts @@ -1,6 +1,6 @@ import { pgTable, primaryKey, uuid } from 'drizzle-orm/pg-core'; import { categoriesTable } from './categories.table'; -import externalIds from './externalIds'; +import { externalIds } from './externalIds'; import { relations } from 'drizzle-orm'; export const categoriesToExternalIdsTable = pgTable( diff --git a/src/lib/server/api/infrastructure/database/tables/categoriesToGames.ts b/src/lib/server/api/infrastructure/database/tables/categoriesToGames.ts index 4343a7c..a977fdd 100644 --- a/src/lib/server/api/infrastructure/database/tables/categoriesToGames.ts +++ b/src/lib/server/api/infrastructure/database/tables/categoriesToGames.ts @@ -1,7 +1,7 @@ import { pgTable, primaryKey, uuid } from 'drizzle-orm/pg-core'; import { relations } from 'drizzle-orm'; import { categoriesTable } from './categories.table'; -import games from './games'; +import { games } from './games'; export const categories_to_games_table = pgTable( 'categories_to_games', diff --git a/src/lib/server/api/infrastructure/database/tables/collectionItems.ts b/src/lib/server/api/infrastructure/database/tables/collectionItems.ts index 131ac2f..14ea009 100644 --- a/src/lib/server/api/infrastructure/database/tables/collectionItems.ts +++ b/src/lib/server/api/infrastructure/database/tables/collectionItems.ts @@ -2,7 +2,7 @@ import { integer, pgTable, text, uuid } from 'drizzle-orm/pg-core'; import { createId as cuid2 } from '@paralleldrive/cuid2'; import { type InferSelectModel, relations } from 'drizzle-orm'; import { collections } from './collections'; -import games from './games'; +import {games} from './games'; import { timestamps } from '../utils'; export const collection_items = pgTable('collection_items', { diff --git a/src/lib/server/api/infrastructure/database/tables/expansions.ts b/src/lib/server/api/infrastructure/database/tables/expansions.ts index 200bfff..3390b88 100644 --- a/src/lib/server/api/infrastructure/database/tables/expansions.ts +++ b/src/lib/server/api/infrastructure/database/tables/expansions.ts @@ -1,7 +1,7 @@ import { pgTable, text, uuid } from 'drizzle-orm/pg-core'; import { createId as cuid2 } from '@paralleldrive/cuid2'; import { type InferSelectModel, relations } from 'drizzle-orm'; -import games from './games'; +import {games} from './games'; import { timestamps } from '../utils'; export const expansions = pgTable('expansions', { diff --git a/src/lib/server/api/infrastructure/database/tables/mechanics.ts b/src/lib/server/api/infrastructure/database/tables/mechanics.ts index 72f5902..2f489bc 100644 --- a/src/lib/server/api/infrastructure/database/tables/mechanics.ts +++ b/src/lib/server/api/infrastructure/database/tables/mechanics.ts @@ -1,8 +1,8 @@ import { pgTable, text, uuid } from 'drizzle-orm/pg-core'; import { createId as cuid2 } from '@paralleldrive/cuid2'; import { type InferSelectModel, relations } from 'drizzle-orm'; -import mechanicsToGames from './mechanicsToGames'; -import mechanicsToExternalIds from './mechanicsToExternalIds'; +import {mechanics_to_games} from './mechanicsToGames'; +import {mechanicsToExternalIds} from './mechanicsToExternalIds'; import { timestamps } from '../utils'; export const mechanics = pgTable('mechanics', { @@ -18,6 +18,6 @@ export const mechanics = pgTable('mechanics', { export type Mechanics = InferSelectModel; export const mechanics_relations = relations(mechanics, ({ many }) => ({ - mechanics_to_games: many(mechanicsToGames), + mechanics_to_games: many(mechanics_to_games), mechanicsToExternalIds: many(mechanicsToExternalIds), })); diff --git a/src/lib/server/api/infrastructure/database/tables/mechanicsToGames.ts b/src/lib/server/api/infrastructure/database/tables/mechanicsToGames.ts index 6faf721..c81cde4 100644 --- a/src/lib/server/api/infrastructure/database/tables/mechanicsToGames.ts +++ b/src/lib/server/api/infrastructure/database/tables/mechanicsToGames.ts @@ -32,5 +32,3 @@ export const mechanics_to_games_relations = relations(mechanics_to_games, ({ one references: [games.id], }), })); - -export default mechanics_to_games; diff --git a/src/lib/server/api/infrastructure/database/tables/publishers.ts b/src/lib/server/api/infrastructure/database/tables/publishers.ts index 65a0c2d..48d0e66 100644 --- a/src/lib/server/api/infrastructure/database/tables/publishers.ts +++ b/src/lib/server/api/infrastructure/database/tables/publishers.ts @@ -2,7 +2,7 @@ import { pgTable, text, uuid } from 'drizzle-orm/pg-core'; import { createId as cuid2 } from '@paralleldrive/cuid2'; import { type InferSelectModel, relations } from 'drizzle-orm'; import {publishers_to_games} from './publishersToGames'; -import publishersToExternalIds from './publishersToExternalIds'; +import {publishersToExternalIds} from './publishersToExternalIds'; import { timestamps } from '../utils'; export const publishers = pgTable('publishers', { diff --git a/src/lib/server/api/infrastructure/database/tables/wishlistItems.ts b/src/lib/server/api/infrastructure/database/tables/wishlistItems.ts index 1aaecac..b46ca72 100644 --- a/src/lib/server/api/infrastructure/database/tables/wishlistItems.ts +++ b/src/lib/server/api/infrastructure/database/tables/wishlistItems.ts @@ -1,7 +1,7 @@ import { pgTable, text, uuid } from 'drizzle-orm/pg-core'; import { createId as cuid2 } from '@paralleldrive/cuid2'; import { type InferSelectModel, relations } from 'drizzle-orm'; -import wishlists from './wishlists'; +import {wishlists} from './wishlists'; import {games} from './games'; import { timestamps } from '../utils'; diff --git a/src/lib/server/api/repositories/collections.repository.ts b/src/lib/server/api/repositories/collections.repository.ts index 80f4a31..e1fd4f1 100644 --- a/src/lib/server/api/repositories/collections.repository.ts +++ b/src/lib/server/api/repositories/collections.repository.ts @@ -1,11 +1,42 @@ import {inject, injectable} from "tsyringe"; +import { eq, type InferInsertModel } from "drizzle-orm"; import {DatabaseProvider} from "$lib/server/api/providers"; +import { collections } from "../infrastructure/database/tables"; +import { takeFirstOrThrow } from "../infrastructure/database/utils"; + +export type CreateCollection = InferInsertModel; +export type UpdateCollection = Partial; @injectable() export class CollectionsRepository { constructor(@inject(DatabaseProvider) private readonly db: DatabaseProvider) { } async findAll() { - return db.query.collections.findMany(); + return this.db.query.collections.findMany(); + } + + async findOneById(id: string) { + return this.db.query.collections.findFirst({ + where: eq(collections.id, id) + }) + } + + async findOneByUserId(userId: string) { + return this.db.query.collections.findFirst({ + where: eq(collections.user_id, userId) + }) + } + + async create(data: CreateCollection) { + return this.db.insert(collections).values(data).returning().then(takeFirstOrThrow); + } + + async update(id: string, data: UpdateCollection) { + return this.db + .update(collections) + .set(data) + .where(eq(collections.id, id)) + .returning() + .then(takeFirstOrThrow); } } \ No newline at end of file diff --git a/src/lib/server/api/repositories/credentials.repository.ts b/src/lib/server/api/repositories/credentials.repository.ts index 4d7c468..2084a6b 100644 --- a/src/lib/server/api/repositories/credentials.repository.ts +++ b/src/lib/server/api/repositories/credentials.repository.ts @@ -12,13 +12,13 @@ export class CredentialsRepository { constructor(@inject(DatabaseProvider) private readonly db: DatabaseProvider) { } async findOneByUserId(userId: string) { - return db.query.credentialsTable.findFirst({ + return this.db.query.credentialsTable.findFirst({ where: eq(credentialsTable.user_id, userId) }); } async findPasswordCredentialsByUserId(userId: string) { - return db.query.credentialsTable.findFirst({ + return this.db.query.credentialsTable.findFirst({ where: and( eq(credentialsTable.user_id, userId), eq(credentialsTable.type, CredentialsType.PASSWORD) @@ -27,7 +27,7 @@ export class CredentialsRepository { } async findTOTPCredentialsByUserId(userId: string) { - return db.query.credentialsTable.findFirst({ + return this.db.query.credentialsTable.findFirst({ where: and( eq(credentialsTable.user_id, userId), eq(credentialsTable.type, CredentialsType.TOTP) @@ -36,7 +36,7 @@ export class CredentialsRepository { } async findOneById(id: string) { - return db.query.credentialsTable.findFirst({ + return this.db.query.credentialsTable.findFirst({ where: eq(credentialsTable.id, id) }); } @@ -48,11 +48,11 @@ export class CredentialsRepository { } async create(data: CreateCredentials) { - return db.insert(credentialsTable).values(data).returning().then(takeFirstOrThrow); + return this.db.insert(credentialsTable).values(data).returning().then(takeFirstOrThrow); } async update(id: string, data: UpdateCredentials) { - return db + return this.db .update(credentialsTable) .set(data) .where(eq(credentialsTable.id, id)) diff --git a/src/lib/server/api/repositories/roles.repository.ts b/src/lib/server/api/repositories/roles.repository.ts index 816fa84..b1ab846 100644 --- a/src/lib/server/api/repositories/roles.repository.ts +++ b/src/lib/server/api/repositories/roles.repository.ts @@ -28,7 +28,7 @@ export class RolesRepository { constructor(@inject(DatabaseProvider) private readonly db: DatabaseProvider) { } async findOneById(id: string) { - return db.query.roles.findFirst({ + return this.db.query.roles.findFirst({ where: eq(roles.id, id) }); } @@ -40,11 +40,11 @@ export class RolesRepository { } async findAll() { - return db.query.roles.findMany(); + return this.db.query.roles.findMany(); } async findOneByName(name: string) { - return db.query.roles.findFirst({ + return this.db.query.roles.findFirst({ where: eq(roles.name, name) }); } @@ -56,11 +56,11 @@ export class RolesRepository { } async create(data: CreateRole) { - return db.insert(roles).values(data).returning().then(takeFirstOrThrow); + return this.db.insert(roles).values(data).returning().then(takeFirstOrThrow); } async update(id: string, data: UpdateRole) { - return db + return this.db .update(roles) .set(data) .where(eq(roles.id, id)) @@ -69,7 +69,7 @@ export class RolesRepository { } async delete(id: string) { - return db + return this.db .delete(roles) .where(eq(roles.id, id)) .returning() diff --git a/src/lib/server/api/repositories/user_roles.repository.ts b/src/lib/server/api/repositories/user_roles.repository.ts index 2dfcd4d..cbc688f 100644 --- a/src/lib/server/api/repositories/user_roles.repository.ts +++ b/src/lib/server/api/repositories/user_roles.repository.ts @@ -28,7 +28,7 @@ export class UserRolesRepository { constructor(@inject(DatabaseProvider) private readonly db: DatabaseProvider) { } async findOneById(id: string) { - return db.query.user_roles.findFirst({ + return this.db.query.user_roles.findFirst({ where: eq(user_roles.id, id) }); } @@ -40,17 +40,17 @@ export class UserRolesRepository { } async findAllByUserId(userId: string) { - return db.query.user_roles.findMany({ + return this.db.query.user_roles.findMany({ where: eq(user_roles.user_id, userId) }); } async create(data: CreateUserRole) { - return db.insert(user_roles).values(data).returning().then(takeFirstOrThrow); + return this.db.insert(user_roles).values(data).returning().then(takeFirstOrThrow); } async delete(id: string) { - return db + return this.db .delete(user_roles) .where(eq(user_roles.id, id)) .returning() diff --git a/src/lib/server/api/repositories/users.repository.ts b/src/lib/server/api/repositories/users.repository.ts index 4106263..e65ec7a 100644 --- a/src/lib/server/api/repositories/users.repository.ts +++ b/src/lib/server/api/repositories/users.repository.ts @@ -28,7 +28,7 @@ export class UsersRepository { constructor(@inject(DatabaseProvider) private readonly db: DatabaseProvider) { } async findOneById(id: string) { - return db.query.usersTable.findFirst({ + return this.db.query.usersTable.findFirst({ where: eq(usersTable.id, id) }); } @@ -40,23 +40,23 @@ export class UsersRepository { } async findOneByUsername(username: string) { - return db.query.usersTable.findFirst({ + return this.db.query.usersTable.findFirst({ where: eq(usersTable.username, username) }); } async findOneByEmail(email: string) { - return db.query.usersTable.findFirst({ + return this.db.query.usersTable.findFirst({ where: eq(usersTable.email, email) }); } async create(data: CreateUser) { - return db.insert(usersTable).values(data).returning().then(takeFirstOrThrow); + return this.db.insert(usersTable).values(data).returning().then(takeFirstOrThrow); } async update(id: string, data: UpdateUser) { - return db + return this.db .update(usersTable) .set(data) .where(eq(usersTable.id, id)) @@ -65,7 +65,7 @@ export class UsersRepository { } async delete(id: string) { - return db + return this.db .delete(usersTable) .where(eq(usersTable.id, id)) .returning() diff --git a/src/lib/server/api/repositories/wishlists.repository.ts b/src/lib/server/api/repositories/wishlists.repository.ts index 9cdf394..a566d06 100644 --- a/src/lib/server/api/repositories/wishlists.repository.ts +++ b/src/lib/server/api/repositories/wishlists.repository.ts @@ -1,9 +1,48 @@ import {inject, injectable} from "tsyringe"; import {DatabaseProvider} from "$lib/server/api/providers"; +import { eq, type InferInsertModel } from "drizzle-orm"; +import { wishlists } from "../infrastructure/database/tables"; +import { takeFirstOrThrow } from "../infrastructure/database/utils"; + +export type CreateWishlist = InferInsertModel; +export type UpdateWishlist = Partial; @injectable() -export class CollectionsService { +export class WishlistsRepository { constructor(@inject(DatabaseProvider) private readonly db: DatabaseProvider) { } - + async findAll() { + return this.db.query.wishlists.findMany(); + } + + async findOneById(id: string) { + return this.db.query.wishlists.findFirst({ + where: eq(wishlists.id, id) + }) + } + + async findOneByUserId(userId: string) { + return this.db.query.wishlists.findFirst({ + where: eq(wishlists.user_id, userId) + }) + } + + async findAllByUserId(userId: string) { + return this.db.query.wishlists.findMany({ + where: eq(wishlists.user_id, userId) + }) + } + + async create(data: CreateWishlist) { + return this.db.insert(wishlists).values(data).returning().then(takeFirstOrThrow); + } + + async update(id: string, data: UpdateWishlist) { + return this.db + .update(wishlists) + .set(data) + .where(eq(wishlists.id, id)) + .returning() + .then(takeFirstOrThrow); + } } \ No newline at end of file diff --git a/src/lib/server/api/services/collections.service.ts b/src/lib/server/api/services/collections.service.ts index 61e4337..fb39773 100644 --- a/src/lib/server/api/services/collections.service.ts +++ b/src/lib/server/api/services/collections.service.ts @@ -1,4 +1,6 @@ import { inject, injectable } from "tsyringe"; +import { generateRandomAnimalName } from "$lib/utils/randomDataUtil"; +import { CollectionsRepository } from "../repositories/collections.repository"; @injectable() export class CollectionsService { @@ -6,5 +8,14 @@ export class CollectionsService { @inject(CollectionsRepository) private readonly collectionsRepository: CollectionsRepository ) { } + async createEmptyNoName(userId: string) { + return this.createEmpty(userId, null); + } + async createEmpty(userId: string, name: string | null) { + return this.collectionsRepository.create({ + user_id: userId, + name: name ?? generateRandomAnimalName(), + }); + } } \ No newline at end of file diff --git a/src/lib/server/api/services/user_roles.service.ts b/src/lib/server/api/services/user_roles.service.ts index 25044bd..63a56b2 100644 --- a/src/lib/server/api/services/user_roles.service.ts +++ b/src/lib/server/api/services/user_roles.service.ts @@ -1,9 +1,8 @@ import {inject, injectable} from "tsyringe"; import {type CreateUserRole, UserRolesRepository} from "$lib/server/api/repositories/user_roles.repository"; import db from "$db"; -import {eq} from "drizzle-orm"; -import {roles, userRoles} from "$db/schema"; import {RolesService} from "$lib/server/api/services/roles.service"; +import { user_roles } from "../infrastructure/database/tables"; @injectable() export class UserRolesService { @@ -33,7 +32,7 @@ export class UserRolesService { } // Create a UserRole entry linking the user and the role - return db.insert(userRoles).values({ + return db.insert(user_roles).values({ user_id: userId, role_id: role.id, primary, diff --git a/src/lib/server/api/services/users.service.ts b/src/lib/server/api/services/users.service.ts index be3dbce..02c2d78 100644 --- a/src/lib/server/api/services/users.service.ts +++ b/src/lib/server/api/services/users.service.ts @@ -5,14 +5,18 @@ import {TokensService} from "$lib/server/api/services/tokens.service"; import {CredentialsRepository} from "$lib/server/api/repositories/credentials.repository"; import {CredentialsType} from "$lib/server/api/infrastructure/database/tables"; import {UserRolesService} from "$lib/server/api/services/user_roles.service"; +import { CollectionsService } from './collections.service'; +import { WishlistsService } from './wishlists.service'; @injectable() export class UsersService { constructor( + @inject(CollectionsService) private readonly collectionsService: CollectionsService, @inject(CredentialsRepository) private readonly credentialsRepository: CredentialsRepository, @inject(TokensService) private readonly tokenService: TokensService, @inject(UsersRepository) private readonly usersRepository: UsersRepository, @inject(UserRolesService) private readonly userRolesService: UserRolesService, + @inject(WishlistsService) private readonly wishlistsService: WishlistsService ) { } async create(data: SignupUsernameEmailDto) { @@ -41,16 +45,12 @@ export class UsersService { return null; } - this.userRolesService.addRoleToUser(user.id, 'user', true); + await this.userRolesService.addRoleToUser(user.id, 'user', true); -// await db.insert(collections).values({ -// user_id: user[0].id, -// }); -// await db.insert(wishlists).values({ -// user_id: user[0].id, -// }); + await this.wishlistsService.createEmptyNoName(user.id); + await this.collectionsService.createEmptyNoName(user.id); - return this.usersRepository.create(data); + return user; } async findOneByUsername(username: string) { diff --git a/src/lib/server/api/services/wishlists.service.ts b/src/lib/server/api/services/wishlists.service.ts new file mode 100644 index 0000000..47aa57a --- /dev/null +++ b/src/lib/server/api/services/wishlists.service.ts @@ -0,0 +1,26 @@ +import { inject, injectable } from "tsyringe"; +import { WishlistsRepository } from "../repositories/wishlists.repository"; +import { generateRandomAnimalName } from "$lib/utils/randomDataUtil"; + +@injectable() +export class WishlistsService { + + constructor( + @inject(WishlistsRepository) private readonly wishlistsRepository: WishlistsRepository + ) { } + + async findAllByUserId(userId: string) { + return this.wishlistsRepository.findAllByUserId(userId); + } + + async createEmptyNoName(userId: string) { + return this.createEmpty(userId, null); + } + + async createEmpty(userId: string, name: string | null) { + return this.wishlistsRepository.create({ + user_id: userId, + name: name ?? generateRandomAnimalName(), + }); + } +} \ No newline at end of file diff --git a/src/lib/server/api/tests/login-requests.service.test.ts b/src/lib/server/api/tests/login-requests.service.test.ts deleted file mode 100644 index 33329e5..0000000 --- a/src/lib/server/api/tests/login-requests.service.test.ts +++ /dev/null @@ -1,72 +0,0 @@ -// import 'reflect-metadata'; -// import { LoginRequestsService } from '../services/login-requests.service'; -// import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest'; -// import { TokensService } from '../services/tokens.service'; -// import { MailerService } from '../services/mailer.service'; -// import { UsersRepository } from '../repositories/users.repository'; -// import { DatabaseProvider, LuciaProvider } from '../providers'; -// import { LoginRequestsRepository } from '../repositories/login-requests.repository'; -// import { PgDatabase } from 'drizzle-orm/pg-core'; -// import { container } from 'tsyringe'; - -// describe('LoginRequestService', () => { -// let service: LoginRequestsService; -// let tokensService = vi.mocked(TokensService.prototype) -// let mailerService = vi.mocked(MailerService.prototype); -// let usersRepository = vi.mocked(UsersRepository.prototype); -// let loginRequestsRepository = vi.mocked(LoginRequestsRepository.prototype); -// let luciaProvider = vi.mocked(LuciaProvider); -// let databaseProvider = vi.mocked(PgDatabase); - -// beforeAll(() => { -// service = container -// .register(TokensService, { useValue: tokensService }) -// .register(MailerService, { useValue: mailerService }) -// .register(UsersRepository, { useValue: usersRepository }) -// .register(LoginRequestsRepository, { useValue: loginRequestsRepository }) -// .register(LuciaProvider, { useValue: luciaProvider }) -// .register(DatabaseProvider, { useValue: databaseProvider }) -// .resolve(LoginRequestsService); -// }); - - -// afterAll(() => { -// vi.resetAllMocks() -// }) - -// describe('Create', () => { -// tokensService.generateTokenWithExpiryAndHash = vi.fn().mockResolvedValue({ -// token: "1", -// expiry: new Date(), -// hashedToken: "xyz" -// } satisfies Awaited>) - -// loginRequestsRepository.create = vi.fn().mockResolvedValue({ -// createdAt: new Date(), -// email: 'me@test.com', -// expiresAt: new Date(), -// hashedToken: '111', -// id: '1', -// updatedAt: new Date() -// } satisfies Awaited>) - -// mailerService.sendLoginRequest = vi.fn().mockResolvedValue(null) - -// const spy_mailerService_sendLoginRequest = vi.spyOn(mailerService, 'sendLoginRequest') -// const spy_tokensService_generateTokenWithExpiryAndHash = vi.spyOn(tokensService, 'generateTokenWithExpiryAndHash') -// const spy_loginRequestsRepository_create = vi.spyOn(loginRequestsRepository, 'create') - -// it('should resolve', async () => { -// await expect(service.create({ email: "test" })).resolves.toBeUndefined() -// }) -// it('should generate a token with expiry and hash', async () => { -// expect(spy_tokensService_generateTokenWithExpiryAndHash).toBeCalledTimes(1) -// }) -// it('should send an email with token', async () => { -// expect(spy_mailerService_sendLoginRequest).toHaveBeenCalledTimes(1) -// }) -// it('should create a new login request record', async () => { -// expect(spy_loginRequestsRepository_create).toBeCalledTimes(1) -// }) -// }) -// }); diff --git a/src/lib/server/api/tests/users.service.test.ts b/src/lib/server/api/tests/users.service.test.ts new file mode 100644 index 0000000..5fe24d3 --- /dev/null +++ b/src/lib/server/api/tests/users.service.test.ts @@ -0,0 +1,111 @@ +import 'reflect-metadata'; +import { container } from 'tsyringe'; +import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest'; +import { UsersService } from '../services/users.service'; +import { CredentialsRepository } from '../repositories/credentials.repository'; +import { TokensService } from '../services/tokens.service'; +import { UserRolesService } from '../services/user_roles.service'; +import { UsersRepository } from '../repositories/users.repository'; +import { Argon2id } from 'oslo/password'; +import { WishlistsService } from '../services/wishlists.service'; +import { CollectionsService } from '../services/collections.service'; +// import { LoginRequestsService } from '../services/login-requests.service'; +// import { TokensService } from '../services/tokens.service'; +// import { MailerService } from '../services/mailer.service'; +// import { UsersRepository } from '../repositories/users.repository'; +// import { DatabaseProvider, LuciaProvider } from '../providers'; +// import { LoginRequestsRepository } from '../repositories/login-requests.repository'; +// import { PgDatabase } from 'drizzle-orm/pg-core'; + +describe('UsersService', () => { + let service: UsersService; + const credentialsRepository = vi.mocked(CredentialsRepository.prototype); + const tokensService = vi.mocked(TokensService.prototype); + const usersRepository = vi.mocked(UsersRepository.prototype); + const userRolesService = vi.mocked(UserRolesService.prototype); + const wishlistsService = vi.mocked(WishlistsService.prototype); + const collectionsService = vi.mocked(CollectionsService.prototype); + + beforeAll(() => { + service = container + .register(CredentialsRepository, { useValue: credentialsRepository }) + .register(TokensService, { useValue: tokensService }) + .register(UsersRepository, { useValue: usersRepository }) + .register(UserRolesService, { useValue: userRolesService }) + .register(WishlistsService, { useValue: wishlistsService }) + .register(CollectionsService, { useValue: collectionsService }) + .resolve(UsersService); + }); + + afterAll(() => { + vi.resetAllMocks() + }) + + describe('Create User', () => { + const hashedPassword = new Argon2id().hash('111'); + tokensService.createHashedToken = vi.fn().mockResolvedValue(hashedPassword) + + usersRepository.create = vi.fn().mockResolvedValue({ + id: '3e0e9f0f-0a0b-4f0b-8f0b-0a0b4f0b8f0b', + cuid: 'ciglo1j8q0000t9j4xq8d6p5e', + first_name: 'test', + last_name: 'test', + email: 'test@example.com', + username: 'test', + verified: false, + receive_email: false, + theme: 'system', + createdAt: new Date(), + updatedAt: new Date() + } satisfies Awaited>) + + credentialsRepository.create = vi.fn().mockResolvedValue({ + id: '3e0e9f0f-0a0b-4f0b-8f0b-0a0b4f0b8f0b', + user_id: '3e0e9f0f-0a0b-4f0b-8f0b-0a0b4f0b8f0b', + type: 'PASSWORD', + secret_data: hashedPassword + }) + + userRolesService.addRoleToUser = vi.fn().mockResolvedValue(undefined) + + wishlistsService.createEmptyNoName = vi.fn().mockResolvedValue(undefined) + + collectionsService.createEmptyNoName = vi.fn().mockResolvedValue(undefined) + + const spy_tokensService_createHashToken = vi.spyOn(tokensService, 'createHashedToken'); + const spy_usersRepository_create = vi.spyOn(usersRepository, 'create'); + const spy_credentialsRepository_create = vi.spyOn(credentialsRepository, 'create'); + const spy_userRolesService_addRoleToUser = vi.spyOn(userRolesService, 'addRoleToUser'); + const spy_wishlistsService_createEmptyNoName = vi.spyOn(wishlistsService, 'createEmptyNoName'); + const spy_collectionsService_createEmptyNoName = vi.spyOn(collectionsService, 'createEmptyNoName'); + + it('should resolve', async () => { + await expect(service.create({ + firstName: 'test', + lastName: 'test', + email: 'test@example.com', + username: 'test', + password: '111', + confirm_password: '111' + })).resolves.not.toThrow() + }) + it('should generate a hashed token', async () => { + expect(spy_tokensService_createHashToken).toBeCalledTimes(1) + }) + it('should create a new user', async () => { + expect(spy_usersRepository_create).toHaveBeenCalledTimes(1) + }) + it('should create a new credential', async () => { + expect(spy_credentialsRepository_create).toBeCalledTimes(1) + }) + it('should add role to user', async () => { + expect(spy_userRolesService_addRoleToUser).toBeCalledTimes(1) + }) + it('should create a new wishlist', async () => { + expect(spy_wishlistsService_createEmptyNoName).toBeCalledTimes(1) + }) + it('should create a new collection', async () => { + expect(spy_collectionsService_createEmptyNoName).toBeCalledTimes(1) + }) + }) +}); diff --git a/src/lib/tests/randomDataUtil.test.ts b/src/lib/tests/randomDataUtil.test.ts new file mode 100644 index 0000000..1fda57f --- /dev/null +++ b/src/lib/tests/randomDataUtil.test.ts @@ -0,0 +1,7 @@ +import { generateRandomAnimalName } from '$lib/utils/randomDataUtil'; +import { expect, test } from 'vitest'; + +test('generateRandomAnimalName', () => { + expect(generateRandomAnimalName()).not.toBeUndefined(); + expect(generateRandomAnimalName()).not.toEqual(generateRandomAnimalName()); +}); \ No newline at end of file diff --git a/src/lib/utils/randomDataUtil.ts b/src/lib/utils/randomDataUtil.ts new file mode 100644 index 0000000..6d7af68 --- /dev/null +++ b/src/lib/utils/randomDataUtil.ts @@ -0,0 +1,40 @@ +import { faker } from '@faker-js/faker'; + +export function generateRandomAnimalName() { + return fromRandomAnimalTypeGetAnimalName(faker.animal.type()); +} + +function fromRandomAnimalTypeGetAnimalName(animalType: string) { + switch (animalType) { + case 'bear': + return faker.animal.bear(); + case 'bird': + return faker.animal.bird(); + case 'cat': + return faker.animal.cat(); + case 'cetacean': + return faker.animal.cetacean(); + case 'cow': + return faker.animal.cow(); + case 'crocodilia': + return faker.animal.crocodilia(); + case 'dog': + return faker.animal.dog(); + case 'fish': + return faker.animal.fish(); + case 'horse': + return faker.animal.horse(); + case 'insect': + return faker.animal.insect(); + case 'lion': + return faker.animal.lion(); + case 'rabbit': + return faker.animal.rabbit(); + case 'rodent': + return faker.animal.rodent(); + case 'snake': + return faker.animal.snake(); + default: + return faker.animal.type(); + } +} \ No newline at end of file