diff --git a/.node-version b/.node-version index 7d1aef0..593cb75 100644 --- a/.node-version +++ b/.node-version @@ -1 +1 @@ -22.1.0 \ No newline at end of file +20.16.0 \ No newline at end of file diff --git a/package.json b/package.json index 1d103b0..cea884a 100644 --- a/package.json +++ b/package.json @@ -22,24 +22,21 @@ "site:update": "pnpm update -i -L", "test:unit": "vitest" }, - "engines": { - "node": "22.x" - }, "devDependencies": { "@melt-ui/pp": "^0.3.2", "@melt-ui/svelte": "^0.83.0", "@playwright/test": "^1.45.3", "@sveltejs/adapter-auto": "^3.2.2", "@sveltejs/enhanced-img": "^0.3.1", - "@sveltejs/kit": "^2.5.18", + "@sveltejs/kit": "^2.5.20", "@sveltejs/vite-plugin-svelte": "^3.1.1", "@types/cookie": "^0.6.0", - "@types/node": "^20.14.13", + "@types/node": "^20.14.14", "@types/pg": "^8.11.6", - "@typescript-eslint/eslint-plugin": "^7.17.0", - "@typescript-eslint/parser": "^7.17.0", + "@typescript-eslint/eslint-plugin": "^7.18.0", + "@typescript-eslint/parser": "^7.18.0", "autoprefixer": "^10.4.19", - "drizzle-kit": "^0.23.0", + "drizzle-kit": "^0.23.1", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-svelte": "^2.43.0", @@ -58,7 +55,7 @@ "satori": "^0.10.14", "satori-html": "^0.3.2", "svelte": "5.0.0-next.175", - "svelte-check": "^3.8.4", + "svelte-check": "^3.8.5", "svelte-headless-table": "^0.18.2", "svelte-meta-tags": "^3.1.2", "svelte-preprocess": "^6.0.2", @@ -69,7 +66,7 @@ "tailwindcss": "^3.4.7", "ts-node": "^10.9.2", "tslib": "^2.6.3", - "tsx": "^4.16.2", + "tsx": "^4.16.5", "typescript": "^5.5.4", "vite": "^5.3.5", "vitest": "^1.6.0", @@ -86,14 +83,15 @@ "@lukeed/uuid": "^2.0.1", "@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", "@types/feather-icons": "^4.29.4", "@vercel/og": "^0.5.20", "arctic": "^1.9.2", - "bits-ui": "^0.21.12", + "bits-ui": "^0.21.13", "boardgamegeekclient": "^1.9.1", - "bullmq": "^5.11.0", + "bullmq": "^5.12.0", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", "cookie": "^0.6.0", @@ -103,7 +101,7 @@ "feather-icons": "^4.29.2", "formsnap": "^1.0.1", "handlebars": "^4.7.8", - "hono": "^4.5.2", + "hono": "^4.5.3", "hono-rate-limiter": "^0.4.0", "html-entities": "^2.5.2", "iconify-icon": "^2.1.0", @@ -118,8 +116,6 @@ "qrcode": "^1.5.3", "radix-svelte": "^0.9.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-lazy-loader": "^1.0.0", "tailwind-merge": "^2.4.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4b9fcca..a1ed975 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.2)(zod@3.23.8) + version: 0.2.2(hono@4.5.3)(zod@3.23.8) '@iconify-icons/line-md': specifier: ^1.2.30 version: 1.2.30 @@ -40,10 +40,10 @@ importers: version: 2.6.2 '@sveltejs/adapter-node': 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': 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': specifier: ^4.29.4 version: 4.29.4 @@ -54,14 +54,14 @@ importers: specifier: ^1.9.2 version: 1.9.2 bits-ui: - specifier: ^0.21.12 - version: 0.21.12(svelte@5.0.0-next.175) + specifier: ^0.21.13 + version: 0.21.13(svelte@5.0.0-next.175) boardgamegeekclient: specifier: ^1.9.1 version: 1.9.1 bullmq: - specifier: ^5.11.0 - version: 5.11.0 + specifier: ^5.12.0 + version: 5.12.0 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.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: specifier: ^4.7.8 version: 4.7.8 hono: - specifier: ^4.5.2 - version: 4.5.2 + specifier: ^4.5.3 + version: 4.5.3 hono-rate-limiter: specifier: ^0.4.0 - version: 0.4.0(hono@4.5.2) + version: 0.4.0(hono@4.5.3) html-entities: specifier: ^2.5.2 version: 2.5.2 @@ -148,10 +148,10 @@ importers: version: 2.4.0 tailwind-variants: 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: 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: specifier: ^3.23.2 version: 3.23.2(zod@3.23.8) @@ -167,37 +167,37 @@ importers: version: 1.45.3 '@sveltejs/adapter-auto': specifier: ^3.2.2 - version: 3.2.2(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.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': 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': - specifier: ^2.5.18 - 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)) + 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)) '@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.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': specifier: ^0.6.0 version: 0.6.0 '@types/node': - specifier: ^20.14.13 - version: 20.14.13 + specifier: ^20.14.14 + version: 20.14.14 '@types/pg': specifier: ^8.11.6 version: 8.11.6 '@typescript-eslint/eslint-plugin': - specifier: ^7.17.0 - version: 7.17.0(@typescript-eslint/parser@7.17.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) + specifier: ^7.18.0 + 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': - specifier: ^7.17.0 - version: 7.17.0(eslint@8.57.0)(typescript@5.5.4) + specifier: ^7.18.0 + version: 7.18.0(eslint@8.57.0)(typescript@5.5.4) autoprefixer: specifier: ^10.4.19 version: 10.4.19(postcss@8.4.40) drizzle-kit: - specifier: ^0.23.0 - version: 0.23.0 + specifier: ^0.23.1 + version: 0.23.1 eslint: specifier: ^8.57.0 version: 8.57.0 @@ -206,7 +206,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.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: specifier: ^6.2.0 version: 6.2.0 @@ -230,7 +230,7 @@ importers: version: 16.1.0(postcss@8.4.40) postcss-load-config: specifier: ^5.1.0 - version: 5.1.0(jiti@1.21.6)(postcss@8.4.40)(tsx@4.16.2) + version: 5.1.0(jiti@1.21.6)(postcss@8.4.40)(tsx@4.16.5) postcss-preset-env: specifier: ^9.6.0 version: 9.6.0(postcss@8.4.40) @@ -253,8 +253,8 @@ importers: specifier: 5.0.0-next.175 version: 5.0.0-next.175 svelte-check: - specifier: ^3.8.4 - version: 3.8.4(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.40)(tsx@4.16.2))(postcss@8.4.40)(sass@1.77.8)(svelte@5.0.0-next.175) + specifier: ^3.8.5 + 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: specifier: ^0.18.2 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) svelte-preprocess: 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: specifier: ^2.0.1 version: 2.0.1 sveltekit-flash-message: specifier: ^2.4.4 - version: 2.4.4(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.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: 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: 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: 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: 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: specifier: ^2.6.3 version: 2.6.3 tsx: - specifier: ^4.16.2 - version: 4.16.2 + specifier: ^4.16.5 + version: 4.16.5 typescript: specifier: ^5.5.4 version: 5.5.4 vite: 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: 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: specifier: ^3.23.8 version: 3.23.8 @@ -565,6 +565,9 @@ packages: peerDependencies: postcss: ^8.4 + '@drizzle-team/brocli@0.8.2': + resolution: {integrity: sha512-zTrFENsqGvOkBOuHDC1pXCkDXNd2UhP4lI3gYGhQ1R1SPeAAfqzPsV1dcpMy4uNU6kB5VpU5NGhvwxVNETR02A==} + '@emnapi/core@0.45.0': resolution: {integrity: sha512-DPWjcUDQkCeEM4VnljEOEcXdAD7pp8zSZsgOujk/LGIwCXWbXJngin+MO4zbH429lzeC3WbYLGjE2MaUOwzpyw==} @@ -1964,8 +1967,8 @@ packages: svelte: ^4.0.0 || ^5.0.0-next.0 vite: '>= 5.0.0' - '@sveltejs/kit@2.5.18': - resolution: {integrity: sha512-+g06hvpVAnH7b4CDjhnTDgFWBKBiQJpuSmQeGYOuzbO3SC3tdYjRNlDCrafvDtKbGiT2uxY5Dn9qdEUGVZdWOQ==} + '@sveltejs/kit@2.5.20': + resolution: {integrity: sha512-47rJ5BoYwURE/Rp7FNMLp3NzdbWC9DQ/PmKd0mebxT2D/PrPxZxcLImcD3zsWdX2iS6oJk8ITJbO/N2lWnnUqA==} engines: {node: '>=18.13'} hasBin: true peerDependencies: @@ -2018,8 +2021,8 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@20.14.13': - resolution: {integrity: sha512-+bHoGiZb8UiQ0+WEtmph2IWQCjIqg8MDZMAV+ppRRhUZnquF5mQkP/9vpSwJClEiSM/C7fZZExPzfU0vJTyp8w==} + '@types/node@20.14.14': + resolution: {integrity: sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ==} '@types/pg@8.11.6': resolution: {integrity: sha512-/2WmmBXHLsfRqzfHW7BNZ8SbYzE8OSk7i3WjFYvfgRHj7S1xj+16Je5fUKv3lVdVzk/zn9TXOqf+avFCFIE0yQ==} @@ -2033,8 +2036,8 @@ packages: '@types/validator@13.12.0': resolution: {integrity: sha512-nH45Lk7oPIJ1RVOF6JgFI6Dy0QpHEzq4QecZhvguxYPDwT8c93prCMqAtiIttm39voZ+DDR+qkNnMpJmMBRqag==} - '@typescript-eslint/eslint-plugin@7.17.0': - resolution: {integrity: sha512-pyiDhEuLM3PuANxH7uNYan1AaFs5XE0zw1hq69JBvGvE7gSuEoQl1ydtEe/XQeoC3GQxLXyOVa5kNOATgM638A==} + '@typescript-eslint/eslint-plugin@7.18.0': + resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 @@ -2044,8 +2047,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@7.17.0': - resolution: {integrity: sha512-puiYfGeg5Ydop8eusb/Hy1k7QmOU6X3nvsqCgzrB2K4qMavK//21+PzNE8qeECgNOIoertJPUC1SpegHDI515A==} + '@typescript-eslint/parser@7.18.0': + resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -2054,12 +2057,12 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@7.17.0': - resolution: {integrity: sha512-0P2jTTqyxWp9HiKLu/Vemr2Rg1Xb5B7uHItdVZ6iAenXmPo4SZ86yOPCJwMqpCyaMiEHTNqizHfsbmCFT1x9SA==} + '@typescript-eslint/scope-manager@7.18.0': + resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/type-utils@7.17.0': - resolution: {integrity: sha512-XD3aaBt+orgkM/7Cei0XNEm1vwUxQ958AOLALzPlbPqb8C1G8PZK85tND7Jpe69Wualri81PLU+Zc48GVKIMMA==} + '@typescript-eslint/type-utils@7.18.0': + resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -2068,12 +2071,12 @@ packages: typescript: optional: true - '@typescript-eslint/types@7.17.0': - resolution: {integrity: sha512-a29Ir0EbyKTKHnZWbNsrc/gqfIBqYPwj3F2M+jWE/9bqfEHg0AMtXzkbUkOG6QgEScxh2+Pz9OXe11jHDnHR7A==} + '@typescript-eslint/types@7.18.0': + resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/typescript-estree@7.17.0': - resolution: {integrity: sha512-72I3TGq93t2GoSBWI093wmKo0n6/b7O4j9o8U+f65TVD0FS6bI2180X5eGEr8MA8PhKMvYe9myZJquUT2JkCZw==} + '@typescript-eslint/typescript-estree@7.18.0': + resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' @@ -2081,14 +2084,14 @@ packages: typescript: optional: true - '@typescript-eslint/utils@7.17.0': - resolution: {integrity: sha512-r+JFlm5NdB+JXc7aWWZ3fKSm1gn0pkswEwIYsrGPdsT2GjsRATAKXiNtp3vgAAO1xZhX8alIOEQnNMl3kbTgJw==} + '@typescript-eslint/utils@7.18.0': + resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 - '@typescript-eslint/visitor-keys@7.17.0': - resolution: {integrity: sha512-RVGC9UhPOCsfCdI9pU++K4nD7to+jTcMIbXTSOcrLqUEW6gF2pU1UUbYJKc9cvcRSK1UDeMJ7pdMxf4bhMpV/A==} + '@typescript-eslint/visitor-keys@7.18.0': + resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} engines: {node: ^18.18.0 || >=20.0.0} '@ungap/structured-clone@1.2.0': @@ -2259,8 +2262,8 @@ packages: bindings@1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - bits-ui@0.21.12: - resolution: {integrity: sha512-Cf0iB+ZKwA0ZjkpixrhrZK9PC6pGPFleW/65Xc/z0lpGvWaFtdOhiYEntCHHxZ0VihP3aJaG0OBhUBIbmAePaA==} + bits-ui@0.21.13: + resolution: {integrity: sha512-7nmOh6Ig7ND4DXZHv1FhNsY9yUGrad0+mf3tc4YN//3MgnJT1LnHtk4HZAKgmxCOe7txSX7/39LtYHbkrXokAQ==} peerDependencies: svelte: ^4.0.0 || ^5.0.0-next.118 @@ -2306,8 +2309,8 @@ packages: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} - bullmq@5.11.0: - resolution: {integrity: sha512-qVzyWGZqie3VHaYEgRXhId/j8ebfmj6MExEJyUByMsUJA5pVciVle3hKLer5fyMwtQ8lTMP7GwhXV/NZ+HzlRA==} + bullmq@5.12.0: + resolution: {integrity: sha512-kOtSQx9ymylslsLNFD0xOMJM9mHqnq3x6KD7+DYkHByWe0HFRdblpYKhZyL4uR3rwaKZwzOrJVl3RwRaDjZxSg==} bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} @@ -2524,6 +2527,15 @@ packages: supports-color: 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: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} @@ -2606,8 +2618,8 @@ packages: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} - drizzle-kit@0.23.0: - resolution: {integrity: sha512-w9jE97z193dd4jzAyj4Uv2SOh8Ydue70Ki6W0awy4bGM1aPXan6zD6Yv+nNTA6oGgNTDl2MJFxutjHG4fden5g==} + drizzle-kit@0.23.1: + resolution: {integrity: sha512-posGQhj8/K4S4CPhk7BO9+IcpNdIh96t0DvcAr/NvMKhPhe5D0MELzmpq9R2MpmSP3fd+Z3upwidtetrw7xnjg==} hasBin: true drizzle-orm@0.32.1: @@ -3070,8 +3082,8 @@ packages: peerDependencies: hono: ^4.1.1 - hono@4.5.2: - resolution: {integrity: sha512-93P8XEALrHAUGRZoqXs8MDL3w9mDgRpbW9Sy5x4LS7srg78bKUw7EGynxze+Ft1e/rLGmDAbxeSTMu6dHUSRDw==} + hono@4.5.3: + resolution: {integrity: sha512-r26WwwbKD3BAYdfB294knNnegNda7VfV1tVn66D9Kvl9WQTdrR+5eKdoeaQNHQcC3Gr0KBikzAtjd6VsRGVSaw==} engines: {node: '>=16.0.0'} html-entities@2.5.2: @@ -4340,8 +4352,8 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - svelte-check@3.8.4: - resolution: {integrity: sha512-61aHMkdinWyH8BkkTX9jPLYxYzaAAz/FK/VQqdr2FiCQQ/q04WCwDlpGbHff1GdrMYTmW8chlTFvRWL9k0A8vg==} + svelte-check@3.8.5: + resolution: {integrity: sha512-3OGGgr9+bJ/+1nbPgsvulkLC48xBsqsgtc8Wam281H4G9F5v3mYGa2bHRsPuwHC5brKl4AxJH95QF73kmfihGQ==} hasBin: true peerDependencies: 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: resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} - tsx@4.16.2: - resolution: {integrity: sha512-C1uWweJDgdtX2x600HjaFaucXTilT7tgUZHbOE4+ypskZ1OP8CRCSDkCxG6Vya9EwaFIVagWwpaVAn5wzypaqQ==} + tsx@4.16.5: + resolution: {integrity: sha512-ArsiAQHEW2iGaqZ8fTA1nX0a+lN5mNTyuGRRO6OW3H/Yno1y9/t1f9YOI1Cfoqz63VAthn++ZYcbDP7jPflc+A==} engines: {node: '>=18.0.0'} hasBin: true @@ -5153,6 +5165,8 @@ snapshots: dependencies: postcss: 8.4.40 + '@drizzle-team/brocli@0.8.2': {} + '@emnapi/core@0.45.0': dependencies: tslib: 2.6.3 @@ -5525,9 +5539,9 @@ snapshots: '@hapi/hoek': 9.3.0 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: - hono: 4.5.2 + hono: 4.5.3 zod: 3.23.8 '@humanwhocodes/config-array@0.11.14': @@ -6116,41 +6130,41 @@ snapshots: '@sodaru/yup-to-json-schema@2.0.1': optional: true - '@sveltejs/adapter-auto@3.2.2(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.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: - '@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 - '@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: '@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.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 - '@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: - '@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 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.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: magic-string: 0.30.10 svelte: 5.0.0-next.175 svelte-parse-markup: 0.1.5(svelte@5.0.0-next.175) - vite: 5.3.5(@types/node@20.14.13)(sass@1.77.8) + vite: 5.3.5(@types/node@20.14.14)(sass@1.77.8) vite-imagetools: 7.0.2(rollup@4.18.1) transitivePeerDependencies: - 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: - '@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 cookie: 0.6.0 devalue: 5.0.0 @@ -6164,28 +6178,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.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: - '@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 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: - 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: - '@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 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.13)(sass@1.77.8) - vitefu: 0.2.5(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.14)(sass@1.77.8)) transitivePeerDependencies: - supports-color @@ -6215,13 +6229,13 @@ snapshots: '@types/json-schema@7.0.15': optional: true - '@types/node@20.14.13': + '@types/node@20.14.14': dependencies: undici-types: 5.26.5 '@types/pg@8.11.6': dependencies: - '@types/node': 20.14.13 + '@types/node': 20.14.14 pg-protocol: 1.6.1 pg-types: 4.0.2 @@ -6232,14 +6246,14 @@ snapshots: '@types/validator@13.12.0': 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: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.17.0(eslint@8.57.0)(typescript@5.5.4) - '@typescript-eslint/scope-manager': 7.17.0 - '@typescript-eslint/type-utils': 7.17.0(eslint@8.57.0)(typescript@5.5.4) - '@typescript-eslint/utils': 7.17.0(eslint@8.57.0)(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 7.17.0 + '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/type-utils': 7.18.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.18.0 eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 @@ -6250,12 +6264,12 @@ snapshots: transitivePeerDependencies: - 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: - '@typescript-eslint/scope-manager': 7.17.0 - '@typescript-eslint/types': 7.17.0 - '@typescript-eslint/typescript-estree': 7.17.0(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 7.17.0 + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 7.18.0 debug: 4.3.4 eslint: 8.57.0 optionalDependencies: @@ -6263,16 +6277,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@7.17.0': + '@typescript-eslint/scope-manager@7.18.0': dependencies: - '@typescript-eslint/types': 7.17.0 - '@typescript-eslint/visitor-keys': 7.17.0 + '@typescript-eslint/types': 7.18.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: - '@typescript-eslint/typescript-estree': 7.17.0(typescript@5.5.4) - '@typescript-eslint/utils': 7.17.0(eslint@8.57.0)(typescript@5.5.4) - debug: 4.3.5 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) + debug: 4.3.6 eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: @@ -6280,12 +6294,12 @@ snapshots: transitivePeerDependencies: - 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: - '@typescript-eslint/types': 7.17.0 - '@typescript-eslint/visitor-keys': 7.17.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -6297,20 +6311,20 @@ snapshots: transitivePeerDependencies: - 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: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@typescript-eslint/scope-manager': 7.17.0 - '@typescript-eslint/types': 7.17.0 - '@typescript-eslint/typescript-estree': 7.17.0(typescript@5.5.4) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) eslint: 8.57.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@7.17.0': + '@typescript-eslint/visitor-keys@7.18.0': dependencies: - '@typescript-eslint/types': 7.17.0 + '@typescript-eslint/types': 7.18.0 eslint-visitor-keys: 3.4.3 '@ungap/structured-clone@1.2.0': {} @@ -6499,7 +6513,7 @@ snapshots: dependencies: 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: '@internationalized/date': 3.5.5 '@melt-ui/svelte': 0.76.2(svelte@5.0.0-next.175) @@ -6568,7 +6582,7 @@ snapshots: builtin-modules@3.3.0: {} - bullmq@5.11.0: + bullmq@5.12.0: dependencies: cron-parser: 4.9.0 ioredis: 5.4.1 @@ -6770,6 +6784,10 @@ snapshots: dependencies: ms: 2.1.2 + debug@4.3.6: + dependencies: + ms: 2.1.2 + decamelize@1.2.0: {} deep-eql@4.1.3: @@ -6826,8 +6844,9 @@ snapshots: dotenv@16.4.5: {} - drizzle-kit@0.23.0: + drizzle-kit@0.23.1: dependencies: + '@drizzle-team/brocli': 0.8.2 '@esbuild-kit/esm-loader': 2.6.5 esbuild: 0.19.12 esbuild-register: 3.5.0(esbuild@0.19.12) @@ -7001,7 +7020,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.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: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@jridgewell/sourcemap-codec': 1.4.15 @@ -7010,7 +7029,7 @@ snapshots: esutils: 2.0.3 known-css-properties: 0.34.0 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-selector-parser: 6.1.0 semver: 7.6.2 @@ -7237,11 +7256,11 @@ snapshots: cross-spawn: 7.0.3 signal-exit: 4.1.0 - formsnap@1.0.1(svelte@5.0.0-next.175)(sveltekit-superforms@2.16.1(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.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: nanoid: 5.0.7 svelte: 5.0.0-next.175 - sveltekit-superforms: 2.16.1(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.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: {} @@ -7373,11 +7392,11 @@ snapshots: 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: - hono: 4.5.2 + hono: 4.5.3 - hono@4.5.2: {} + hono@4.5.3: {} html-entities@2.5.2: {} @@ -8090,30 +8109,30 @@ snapshots: '@csstools/utilities': 1.0.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)): dependencies: lilconfig: 2.1.0 yaml: 1.10.2 optionalDependencies: 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: lilconfig: 3.1.1 yaml: 2.4.3 optionalDependencies: 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: lilconfig: 3.1.1 yaml: 2.4.2 optionalDependencies: jiti: 1.21.6 postcss: 8.4.40 - tsx: 4.16.2 + tsx: 4.16.5 postcss-logical@7.0.1(postcss@8.4.40): dependencies: @@ -8684,14 +8703,14 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte-check@3.8.4(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.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: '@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.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 transitivePeerDependencies: - '@babel/core' @@ -8747,7 +8766,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.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: '@types/pug': 2.0.10 detect-indent: 6.1.0 @@ -8757,16 +8776,16 @@ snapshots: svelte: 5.0.0-next.175 optionalDependencies: 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 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: svelte: 5.0.0-next.175 optionalDependencies: 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 typescript: 5.5.4 @@ -8821,19 +8840,19 @@ snapshots: magic-string: 0.30.10 zimmerframe: 1.1.2 - sveltekit-flash-message@2.4.4(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.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: - '@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 - 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: '@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: - '@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 just-clone: 6.2.0 memoize-weak: 1.0.2 @@ -8858,16 +8877,16 @@ snapshots: 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: 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: - 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: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -8886,7 +8905,7 @@ snapshots: postcss: 8.4.40 postcss-import: 15.1.0(postcss@8.4.40) postcss-js: 4.0.1(postcss@8.4.40) - postcss-load-config: 4.0.2(postcss@8.4.40)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)) + postcss-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-selector-parser: 6.1.0 resolve: 1.22.8 @@ -8953,14 +8972,14 @@ snapshots: 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: '@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.13 + '@types/node': 20.14.14 acorn: 8.11.3 acorn-walk: 8.3.2 arg: 4.1.3 @@ -8976,7 +8995,7 @@ snapshots: tslib@2.6.3: {} - tsx@4.16.2: + tsx@4.16.5: dependencies: esbuild: 0.21.5 get-tsconfig: 4.7.5 @@ -9061,13 +9080,13 @@ snapshots: transitivePeerDependencies: - 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: cac: 6.7.14 debug: 4.3.4 pathe: 1.1.2 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: - '@types/node' - less @@ -9078,21 +9097,21 @@ snapshots: - supports-color - 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: esbuild: 0.21.5 postcss: 8.4.40 rollup: 4.17.2 optionalDependencies: - '@types/node': 20.14.13 + '@types/node': 20.14.14 fsevents: 2.3.3 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: - 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: '@vitest/expect': 1.6.0 '@vitest/runner': 1.6.0 @@ -9111,11 +9130,11 @@ snapshots: strip-literal: 2.1.0 tinybench: 2.8.0 tinypool: 0.8.4 - vite: 5.3.5(@types/node@20.14.13)(sass@1.77.8) - vite-node: 1.6.0(@types/node@20.14.13)(sass@1.77.8) + 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) why-is-node-running: 2.2.2 optionalDependencies: - '@types/node': 20.14.13 + '@types/node': 20.14.14 transitivePeerDependencies: - less - lightningcss diff --git a/src/hooks.server.ts b/src/hooks.server.ts index f1e2dd8..80631d4 100644 --- a/src/hooks.server.ts +++ b/src/hooks.server.ts @@ -1,22 +1,11 @@ -// import * as Sentry from '@sentry/sveltekit'; -import 'reflect-metadata' import { hc } from 'hono/client'; import { sequence } from '@sveltejs/kit/hooks'; import { redirect, type Handle } from '@sveltejs/kit'; import { dev } from '$app/environment'; -import { lucia } from '$lib/server/auth'; import type { ApiRoutes } from '$lib/server/api'; import { parseApiResponse } from '$lib/utils/api'; 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 }) => { /* ------------------------------ Register api ------------------------------ */ const { api } = hc('/', { @@ -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 ----------------------------- */ 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; } 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, '/'); return data?.user; } @@ -50,49 +43,4 @@ const apiClient: Handle = async ({ event, resolve }) => { return response; }; -export const authentication: Handle = async function ({ event, resolve }) { - 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(); +export const handle: Handle = sequence(apiClient); diff --git a/src/lib/server/api/controllers/iam.controller.ts b/src/lib/server/api/controllers/iam.controller.ts index 35e6fc6..3b7e5d4 100644 --- a/src/lib/server/api/controllers/iam.controller.ts +++ b/src/lib/server/api/controllers/iam.controller.ts @@ -1,11 +1,11 @@ import { Hono } from 'hono'; -import { injectable } from 'tsyringe'; +// import { injectable } from 'tsyringe'; import type { HonoTypes } from '../types'; import { requireAuth } from "../middleware/auth.middleware"; import type { Controller } from '../interfaces/controller.interface'; -@injectable() -export class IamController implements Controller { +// @injectable() +class IamController implements Controller { controller = new Hono(); constructor( @@ -19,3 +19,6 @@ export class IamController implements Controller { }); } } + +const iamControllerInstance = new IamController(); +export default iamControllerInstance; \ No newline at end of file diff --git a/src/lib/server/api/controllers/login.controller.ts b/src/lib/server/api/controllers/login.controller.ts index 996e98e..968857d 100644 --- a/src/lib/server/api/controllers/login.controller.ts +++ b/src/lib/server/api/controllers/login.controller.ts @@ -1,27 +1,31 @@ -import 'reflect-metadata'; +// import 'reflect-metadata'; import { Hono } from 'hono'; import { zValidator } from '@hono/zod-validator'; -import { inject, injectable } from 'tsyringe'; +// import { inject, injectable } from 'tsyringe'; import type { HonoTypes } from '../types'; import { limiter } from '../middleware/rate-limiter.middleware'; import type { Controller } from '../interfaces/controller.interface'; 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() -export class LoginController implements Controller { +// @injectable() +class LoginController implements Controller { controller = new Hono(); - constructor( - @inject(LoginRequestsService) private readonly loginRequestsService: LoginRequestsService - ) { } + // constructor( + // @inject(LoginRequestsService) private readonly loginRequestsService: LoginRequestsService + // ) { } routes() { return this.controller .post('/', zValidator('json', signInEmailDto), limiter({ limit: 10, minutes: 60 }), async (c) => { 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' }); }) } } + +const loginControllerInstance = new LoginController(); +export default loginControllerInstance; diff --git a/src/lib/server/api/controllers/user.controller.ts b/src/lib/server/api/controllers/user.controller.ts index 4ac575b..6eb6d05 100644 --- a/src/lib/server/api/controllers/user.controller.ts +++ b/src/lib/server/api/controllers/user.controller.ts @@ -1,12 +1,12 @@ -import 'reflect-metadata'; +// import 'reflect-metadata'; import { Hono } from 'hono'; -import { injectable } from 'tsyringe'; +// import { injectable } from 'tsyringe'; import { requireAuth } from "../middleware/auth.middleware"; import type { HonoTypes } from '../types'; import type { Controller } from '../interfaces/controller.interface'; -@injectable() -export class UserController implements Controller { +// @injectable() +class UserController implements Controller { controller = new Hono(); constructor( @@ -24,3 +24,5 @@ export class UserController implements Controller { }); } } + +export const userControllerInstance = new UserController(); diff --git a/src/lib/server/api/index.ts b/src/lib/server/api/index.ts index 2a9ed1b..51184a2 100644 --- a/src/lib/server/api/index.ts +++ b/src/lib/server/api/index.ts @@ -1,13 +1,13 @@ -import 'reflect-metadata' +// import 'reflect-metadata' import { Hono } from 'hono'; import { hc } from 'hono/client'; import { cors } from 'hono/cors'; import { logger } from 'hono/logger'; import { validateAuthSession, verifyOrigin } from './middleware/auth.middleware'; import { config } from './common/config'; -import { container } from 'tsyringe'; -import { IamController } from './controllers/iam.controller'; -import { LoginController } from './controllers/login.controller'; +// import { container } from 'tsyringe'; +import iamControllerInstance from './controllers/iam.controller'; +import loginControllerInstance from './controllers/login.controller'; /* ----------------------------------- Api ---------------------------------- */ const app = new Hono().basePath('/api'); @@ -34,8 +34,10 @@ app.use( /* --------------------------------- Routes --------------------------------- */ const routes = app - .route('/user', container.resolve(IamController).routes()) - .route('/login', container.resolve(LoginController).routes()) + // .route('/user', container.resolve(IamController).routes()) + // .route('/login', container.resolve(LoginController).routes()) + .route('/user', iamControllerInstance.routes()) + .route('/login', loginControllerInstance.routes()) .get('/', (c) => c.json({ message: 'Server is healthy' })); /* -------------------------------------------------------------------------- */ diff --git a/src/lib/server/api/providers/database.provider.ts b/src/lib/server/api/providers/database.provider.ts index c7da118..36c3eae 100644 --- a/src/lib/server/api/providers/database.provider.ts +++ b/src/lib/server/api/providers/database.provider.ts @@ -1,11 +1,11 @@ -import { container } from 'tsyringe'; -import { db } from '../infrastructure/database'; +// import { container } from 'tsyringe'; +// import { db } from '../infrastructure/database'; -// Symbol -export const DatabaseProvider = Symbol('DATABASE_TOKEN'); +// // Symbol +// export const DatabaseProvider = Symbol('DATABASE_TOKEN'); -// Type -export type DatabaseProvider = typeof db; +// // Type +// export type DatabaseProvider = typeof db; -// Register -container.register(DatabaseProvider, { useValue: db }); +// // Register +// container.register(DatabaseProvider, { useValue: db }); diff --git a/src/lib/server/api/providers/index.ts b/src/lib/server/api/providers/index.ts index 0ac960b..4a221f6 100644 --- a/src/lib/server/api/providers/index.ts +++ b/src/lib/server/api/providers/index.ts @@ -1,3 +1,3 @@ -export * from './database.provider'; -export * from './lucia.provider'; -export * from './redis.provider'; +// export * from './database.provider'; +// export * from './lucia.provider'; +// export * from './redis.provider'; diff --git a/src/lib/server/api/providers/lucia.provider.ts b/src/lib/server/api/providers/lucia.provider.ts index 6546d43..108a476 100644 --- a/src/lib/server/api/providers/lucia.provider.ts +++ b/src/lib/server/api/providers/lucia.provider.ts @@ -1,11 +1,11 @@ -import { container } from 'tsyringe'; -import { lucia } from '../infrastructure/auth/lucia'; +// import { container } from 'tsyringe'; +// import { lucia } from '../infrastructure/auth/lucia'; -// Symbol -export const LuciaProvider = Symbol('LUCIA_PROVIDER'); +// // Symbol +// export const LuciaProvider = Symbol('LUCIA_PROVIDER'); -// Type -export type LuciaProvider = typeof lucia; +// // Type +// export type LuciaProvider = typeof lucia; -// Register -container.register(LuciaProvider, { useValue: lucia }); +// // Register +// container.register(LuciaProvider, { useValue: lucia }); diff --git a/src/lib/server/api/providers/redis.provider.ts b/src/lib/server/api/providers/redis.provider.ts index 26496de..77cb10c 100644 --- a/src/lib/server/api/providers/redis.provider.ts +++ b/src/lib/server/api/providers/redis.provider.ts @@ -1,14 +1,14 @@ -import { container } from 'tsyringe'; -import RedisClient from 'ioredis' -import { config } from '../common/config'; +// import { container } from 'tsyringe'; +// import RedisClient from 'ioredis' +// import { config } from '../common/config'; -// Symbol -export const RedisProvider = Symbol('REDIS_TOKEN'); +// // Symbol +// export const RedisProvider = Symbol('REDIS_TOKEN'); -// Type -export type RedisProvider = RedisClient; +// // Type +// export type RedisProvider = RedisClient; -// Register -container.register(RedisProvider, { - useValue: new RedisClient(config.REDIS_URL) -}); +// // Register +// container.register(RedisProvider, { +// useValue: new RedisClient(config.REDIS_URL) +// }); diff --git a/src/lib/server/api/repositories/credentials.repository.ts b/src/lib/server/api/repositories/credentials.repository.ts index 3c9ee07..2b9e26f 100644 --- a/src/lib/server/api/repositories/credentials.repository.ts +++ b/src/lib/server/api/repositories/credentials.repository.ts @@ -6,7 +6,7 @@ import { takeFirstOrThrow } from "../infrastructure/database/utils"; export type CreateCredentials = InferInsertModel; export type UpdateCredentials = Partial; -export class CredentialsRepository { +class CredentialsRepository { async findOneByUserId(userId: string) { return db.query.credentialsTable.findFirst({ @@ -56,4 +56,6 @@ export class CredentialsRepository { .returning() .then(takeFirstOrThrow); } -} \ No newline at end of file +} + +export const credentialsRepository = new CredentialsRepository(); diff --git a/src/lib/server/api/repositories/users.repository.ts b/src/lib/server/api/repositories/users.repository.ts index addeaf8..b045974 100644 --- a/src/lib/server/api/repositories/users.repository.ts +++ b/src/lib/server/api/repositories/users.repository.ts @@ -22,7 +22,7 @@ storing data. They should not contain any business logic, only database queries. export type CreateUser = InferInsertModel; export type UpdateUser = Partial; -export class UsersRepository { +class UsersRepository { async findOneById(id: string) { return db.query.usersTable.findFirst({ where: eq(usersTable.id, id) @@ -60,3 +60,5 @@ export class UsersRepository { .then(takeFirstOrThrow); } } + +export const usersRepository = new UsersRepository(); diff --git a/src/lib/server/api/services/hashing.service.ts b/src/lib/server/api/services/hashing.service.ts index 5a03f4e..78fac43 100644 --- a/src/lib/server/api/services/hashing.service.ts +++ b/src/lib/server/api/services/hashing.service.ts @@ -1,4 +1,4 @@ -import { injectable } from "tsyringe"; +// import { injectable } from "tsyringe"; import { Argon2id } from "oslo/password"; /* ---------------------------------- 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, // ensure that you configure them properly. -@injectable() -export class HashingService { +// @injectable() +class HashingService { private readonly hasher = new Argon2id(); async hash(data: string) { @@ -31,4 +31,6 @@ export class HashingService { async verify(hash: string, data: string) { return this.hasher.verify(hash, data) } -} \ No newline at end of file +} + +export const hashingService = new HashingService() diff --git a/src/lib/server/api/services/iam.service.ts b/src/lib/server/api/services/iam.service.ts index 84b44da..f289169 100644 --- a/src/lib/server/api/services/iam.service.ts +++ b/src/lib/server/api/services/iam.service.ts @@ -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'; /* -------------------------------------------------------------------------- */ @@ -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. */ /* -------------------------------------------------------------------------- */ -@injectable() +// @injectable() export class IamService { - constructor( - @inject(LuciaProvider) private readonly lucia: LuciaProvider, - ) { } + // constructor( + // @inject(LuciaProvider) private readonly lucia: LuciaProvider, + // ) { } async logout(sessionId: string) { - return this.lucia.invalidateSession(sessionId); + return lucia.invalidateSession(sessionId); } } diff --git a/src/lib/server/api/services/loginrequest.service.ts b/src/lib/server/api/services/loginrequest.service.ts index f2138b3..21ac3b8 100644 --- a/src/lib/server/api/services/loginrequest.service.ts +++ b/src/lib/server/api/services/loginrequest.service.ts @@ -1,24 +1,28 @@ -import { inject, injectable } from 'tsyringe'; +// import { inject, injectable } from 'tsyringe'; import { BadRequest } from '../common/errors'; -import { DatabaseProvider } from '../providers'; -import { MailerService } from './mailer.service'; -import { TokensService } from './tokens.service'; -import { LuciaProvider } from '../providers/lucia.provider'; -import { UsersRepository } from '../repositories/users.repository'; +// import { DatabaseProvider } from '../providers'; +// import { MailerService } from './mailer.service'; +// import { TokensService } from './tokens.service'; +// import { LuciaProvider } from '../providers/lucia.provider'; +// import { UsersRepository } from '../repositories/users.repository'; import type { SignInEmailDto } from '../../../dtos/signin-email.dto'; -import { CredentialsRepository } from '../repositories/credentials.repository'; 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() -export class LoginRequestsService { - constructor( - @inject(LuciaProvider) private readonly lucia: LuciaProvider, - @inject(DatabaseProvider) private readonly db: DatabaseProvider, - @inject(TokensService) private readonly tokensService: TokensService, - @inject(MailerService) private readonly mailerService: MailerService, - @inject(UsersRepository) private readonly usersRepository: UsersRepository, - @inject(CredentialsRepository) private readonly credentialsRepository: CredentialsRepository, - ) { } +// @injectable() +class LoginRequestsService { + // constructor( + // @inject(LuciaProvider) private readonly lucia: LuciaProvider, + // @inject(DatabaseProvider) private readonly db: DatabaseProvider, + // @inject(TokensService) private readonly tokensService: TokensService, + // @inject(MailerService) private readonly mailerService: MailerService, + // @inject(UsersRepository) private readonly usersRepository: UsersRepository, + // @inject(CredentialsRepository) private readonly credentialsRepository: CredentialsRepository, + // ) { } // async create(data: RegisterEmailDto) { // // generate a token, expiry date, and hash @@ -35,25 +39,25 @@ export class LoginRequestsService { async verify(data: SignInEmailDto, req: HonoRequest) { const requestIpAddress = req.header('x-real-ip'); 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) { throw BadRequest('User not found'); } - const credential = await this.credentialsRepository.findPasswordCredentialsByUserId(existingUser.id); + const credential = await credentialsRepository.findPasswordCredentialsByUserId(existingUser.id); if (!credential) { 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'); } - 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_address: requestIpAddress || 'unknown', twoFactorAuthEnabled: @@ -66,8 +70,8 @@ export class LoginRequestsService { // Create a new user and send a welcome email - or other onboarding process private async handleNewUserRegistration(email: string) { - const newUser = await this.usersRepository.create({ email, verified: true, avatar: null }) - this.mailerService.sendWelcome({ to: email, props: null }); + const newUser = await usersRepository.create({ email, verified: true, avatar: null }) + mailerService.sendWelcome({ to: email, props: null }); // TODO: add whatever onboarding process or extra data you need here return newUser } @@ -88,4 +92,6 @@ export class LoginRequestsService { // return loginRequest // }) // } -} \ No newline at end of file +} + +export const loginRequestsService = new LoginRequestsService(); diff --git a/src/lib/server/api/services/mailer.service.ts b/src/lib/server/api/services/mailer.service.ts index f644f11..031e57a 100644 --- a/src/lib/server/api/services/mailer.service.ts +++ b/src/lib/server/api/services/mailer.service.ts @@ -3,7 +3,7 @@ import path from 'path'; import nodemailer from 'nodemailer'; import handlebars from 'handlebars'; import { fileURLToPath } from 'url'; -import { injectable } from 'tsyringe'; +// import { injectable } from 'tsyringe'; /* -------------------------------------------------------------------------- */ /* Service */ @@ -34,8 +34,8 @@ type SendTemplate = { props: T; }; -@injectable() -export class MailerService { +// @injectable() +class MailerService { private nodemailer = nodemailer.createTransport({ host: 'smtp.ethereal.email', port: 587, @@ -102,3 +102,5 @@ export class MailerService { ); } } + +export const mailerService = new MailerService(); diff --git a/src/lib/server/api/services/queues.service.ts b/src/lib/server/api/services/queues.service.ts index 97e7ca3..ce723e4 100644 --- a/src/lib/server/api/services/queues.service.ts +++ b/src/lib/server/api/services/queues.service.ts @@ -1,13 +1,13 @@ -import { injectable } from "tsyringe"; +// import { injectable } from "tsyringe"; import RedisClient from 'ioredis' import { config } from "../common/config"; import { Queue, Worker, type Processor } from 'bullmq'; -@injectable() +// @injectable() export class QueuesServices { connection = new RedisClient(config.REDIS_URL); - constructor() { } + // constructor() { } createQueue(name: string) { return new Queue(name, { connection: this.connection }) diff --git a/src/lib/server/api/services/tokens.service.ts b/src/lib/server/api/services/tokens.service.ts index a3f712e..3c0ddaf 100644 --- a/src/lib/server/api/services/tokens.service.ts +++ b/src/lib/server/api/services/tokens.service.ts @@ -1,11 +1,11 @@ -import { inject, injectable } from "tsyringe"; +// import { inject, injectable } from "tsyringe"; import { generateRandomString } from "oslo/crypto"; import { TimeSpan, createDate, type TimeSpanUnit } from 'oslo'; -import { HashingService } from "./hashing.service"; +import { hashingService } from "./hashing.service"; -@injectable() -export class TokensService { - constructor(@inject(HashingService) private readonly hashingService: HashingService) { } +// @injectable() +class TokensService { + // constructor(@inject(HashingService) private readonly hashingService: HashingService) { } generateToken() { 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) { const token = this.generateToken() - const hashedToken = await this.hashingService.hash(token) + const hashedToken = await hashingService.hash(token) return { token, hashedToken, @@ -30,6 +30,8 @@ export class TokensService { } async verifyHashedToken(hashedToken: string, token: string) { - return this.hashingService.verify(hashedToken, token) + return hashingService.verify(hashedToken, token) } } + +export const tokensService = new TokensService() \ No newline at end of file diff --git a/src/lib/server/api/services/users.service.ts b/src/lib/server/api/services/users.service.ts index 8040442..a1b06c0 100644 --- a/src/lib/server/api/services/users.service.ts +++ b/src/lib/server/api/services/users.service.ts @@ -1,17 +1,19 @@ -import { inject, injectable } from 'tsyringe'; -import type { UsersRepository } from '../repositories/users.repository'; +// import { inject, injectable } from 'tsyringe'; +// import type { UsersRepository } from '../repositories/users.repository'; -@injectable() +import { usersRepository } from "../repositories/users.repository"; + +// @injectable() export class UsersService { - constructor( - @inject('UsersRepository') private readonly usersRepository: UsersRepository - ) { } + // constructor( + // @inject('UsersRepository') private readonly usersRepository: UsersRepository + // ) { } async findOneByUsername(username: string) { - return this.usersRepository.findOneByUsername(username); + return usersRepository.findOneByUsername(username); } async findOneById(id: string) { - return this.usersRepository.findOneById(id); + return usersRepository.findOneById(id); } } \ No newline at end of file diff --git a/src/routes/(app)/about/+page.ts b/src/routes/(app)/about/+page.ts index 763e9db..3e13462 100644 --- a/src/routes/(app)/about/+page.ts +++ b/src/routes/(app)/about/+page.ts @@ -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 -// // it in dev so that we get hot module replacement... -// export const csr = dev; +// we don't need any JS on this page, though we'll load +// it in dev so that we get hot module replacement... +export const csr = dev; -// // since there's no dynamic data here, we can prerender -// // it so that it gets served as a static asset in prod -// export const prerender = true; +// since there's no dynamic data here, we can prerender +// it so that it gets served as a static asset in prod +export const prerender = true; diff --git a/src/routes/(app)/privacy/+page.server.ts b/src/routes/(app)/privacy/+page.server.ts index 10cfeb3..c8cacf0 100644 --- a/src/routes/(app)/privacy/+page.server.ts +++ b/src/routes/(app)/privacy/+page.server.ts @@ -1 +1 @@ -// export const prerender = true; \ No newline at end of file +export const prerender = true; \ No newline at end of file diff --git a/src/routes/(app)/terms/+page.server.ts b/src/routes/(app)/terms/+page.server.ts index 4973a60..189f71e 100644 --- a/src/routes/(app)/terms/+page.server.ts +++ b/src/routes/(app)/terms/+page.server.ts @@ -1 +1 @@ -// export const prerender = true; +export const prerender = true; diff --git a/svelte.config.js b/svelte.config.js index 435efb8..298318b 100644 --- a/svelte.config.js +++ b/svelte.config.js @@ -1,4 +1,4 @@ -import 'reflect-metadata' +// import 'reflect-metadata' import adapter from '@sveltejs/adapter-vercel'; import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; import { preprocessMeltUI } from '@melt-ui/pp'; diff --git a/vite.config.ts.timestamp-1722555436409-2175218f70ffd.mjs b/vite.config.ts.timestamp-1722555436409-2175218f70ffd.mjs deleted file mode 100644 index 4b25ada..0000000 --- a/vite.config.ts.timestamp-1722555436409-2175218f70ffd.mjs +++ /dev/null @@ -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==