From 354838f4f6f35a6b88e8e80f779b94611aefc754 Mon Sep 17 00:00:00 2001 From: Bradley Shellnut Date: Tue, 30 Jan 2024 18:19:51 -0800 Subject: [PATCH 01/34] Migrating to Drizzle. --- drizzle.config.ts | 11 + package.json | 5 + pnpm-lock.yaml | 708 ++++++++++++++++++++++++++++++++++++++++++++-- src/schema.ts | 27 ++ 4 files changed, 726 insertions(+), 25 deletions(-) create mode 100644 drizzle.config.ts create mode 100644 src/schema.ts diff --git a/drizzle.config.ts b/drizzle.config.ts new file mode 100644 index 0000000..cda1800 --- /dev/null +++ b/drizzle.config.ts @@ -0,0 +1,11 @@ +import 'dotenv/config'; +import { defineConfig } from 'drizzle-kit'; + +export default defineConfig({ + schema: './src/schema.ts', + out: './drizzle', + driver: 'mysql2', + dbCredentials: { + connectionString: process.env.DATABASE_URL + } +}); \ No newline at end of file diff --git a/package.json b/package.json index 3f19f84..48920c0 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", "autoprefixer": "^10.4.17", + "drizzle-kit": "^0.20.13", "eslint": "^8.56.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-svelte": "^2.35.1", @@ -78,9 +79,11 @@ "@fontsource/fira-mono": "^4.5.10", "@iconify-icons/line-md": "^1.2.26", "@iconify-icons/mdi": "^1.2.47", + "@lucia-auth/adapter-drizzle": "^1.0.0", "@lucia-auth/adapter-prisma": "4.0.0", "@lukeed/uuid": "^2.0.1", "@paralleldrive/cuid2": "^2.2.2", + "@planetscale/database": "^1.14.0", "@prisma/client": "^5.8.1", "@sentry/sveltekit": "^7.88.0", "@sveltejs/adapter-vercel": "^5.1.0", @@ -91,6 +94,7 @@ "class-variance-authority": "^0.7.0", "clsx": "^2.1.0", "cookie": "^0.5.0", + "drizzle-orm": "^0.29.3", "feather-icons": "^4.29.1", "formsnap": "^0.4.3", "html-entities": "^2.4.0", @@ -99,6 +103,7 @@ "loader": "^2.1.1", "lucia": "3.0.1", "lucide-svelte": "^0.298.0", + "mysql2": "^3.9.1", "open-props": "^1.6.18", "oslo": "^1.0.3", "radix-svelte": "^0.9.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ba7d2bb..835f2d4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,9 @@ dependencies: '@iconify-icons/mdi': specifier: ^1.2.47 version: 1.2.48 + '@lucia-auth/adapter-drizzle': + specifier: ^1.0.0 + version: 1.0.0(lucia@3.0.1) '@lucia-auth/adapter-prisma': specifier: 4.0.0 version: 4.0.0(@prisma/client@5.8.1)(lucia@3.0.1) @@ -23,6 +26,9 @@ dependencies: '@paralleldrive/cuid2': specifier: ^2.2.2 version: 2.2.2 + '@planetscale/database': + specifier: ^1.14.0 + version: 1.14.0 '@prisma/client': specifier: ^5.8.1 version: 5.8.1(prisma@5.8.1) @@ -53,6 +59,9 @@ dependencies: cookie: specifier: ^0.5.0 version: 0.5.0 + drizzle-orm: + specifier: ^0.29.3 + version: 0.29.3(@planetscale/database@1.14.0)(mysql2@3.9.1) feather-icons: specifier: ^4.29.1 version: 4.29.1 @@ -77,6 +86,9 @@ dependencies: lucide-svelte: specifier: ^0.298.0 version: 0.298.0(svelte@4.2.9) + mysql2: + specifier: ^3.9.1 + version: 3.9.1 open-props: specifier: ^1.6.18 version: 1.6.18 @@ -145,6 +157,9 @@ devDependencies: autoprefixer: specifier: ^10.4.17 version: 10.4.17(postcss@8.4.33) + drizzle-kit: + specifier: ^0.20.13 + version: 0.20.13 eslint: specifier: ^8.56.0 version: 8.56.0 @@ -674,6 +689,12 @@ packages: postcss-selector-parser: 6.0.13 dev: true + /@drizzle-team/studio@0.0.39: + resolution: {integrity: sha512-c5Hkm7MmQC2n5qAsKShjQrHoqlfGslB8+qWzsGGZ+2dHMRTNG60UuzalF0h0rvBax5uzPXuGkYLGaQ+TUX3yMw==} + dependencies: + superjson: 2.2.1 + dev: true + /@emnapi/core@0.45.0: resolution: {integrity: sha512-DPWjcUDQkCeEM4VnljEOEcXdAD7pp8zSZsgOujk/LGIwCXWbXJngin+MO4zbH429lzeC3WbYLGjE2MaUOwzpyw==} requiresBuild: true @@ -689,6 +710,20 @@ packages: tslib: 2.6.2 optional: true + /@esbuild-kit/core-utils@3.3.2: + resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} + dependencies: + esbuild: 0.18.20 + source-map-support: 0.5.21 + dev: true + + /@esbuild-kit/esm-loader@2.6.5: + resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} + dependencies: + '@esbuild-kit/core-utils': 3.3.2 + get-tsconfig: 4.7.2 + dev: true + /@esbuild/aix-ppc64@0.19.10: resolution: {integrity: sha512-Q+mk96KJ+FZ30h9fsJl+67IjNJm3x2eX+GBWGmocAKgzp27cowCOOqSdscX80s0SpdFXZnIv/+1xD1EctFx96Q==} engines: {node: '>=12'} @@ -703,7 +738,15 @@ packages: cpu: [ppc64] os: [aix] requiresBuild: true - dev: false + optional: true + + /@esbuild/android-arm64@0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true optional: true /@esbuild/android-arm64@0.19.10: @@ -720,7 +763,15 @@ packages: cpu: [arm64] os: [android] requiresBuild: true - dev: false + optional: true + + /@esbuild/android-arm@0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true optional: true /@esbuild/android-arm@0.19.10: @@ -737,7 +788,15 @@ packages: cpu: [arm] os: [android] requiresBuild: true - dev: false + optional: true + + /@esbuild/android-x64@0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true optional: true /@esbuild/android-x64@0.19.10: @@ -754,7 +813,15 @@ packages: cpu: [x64] os: [android] requiresBuild: true - dev: false + optional: true + + /@esbuild/darwin-arm64@0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true optional: true /@esbuild/darwin-arm64@0.19.10: @@ -771,7 +838,15 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: false + optional: true + + /@esbuild/darwin-x64@0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true optional: true /@esbuild/darwin-x64@0.19.10: @@ -788,7 +863,15 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: false + optional: true + + /@esbuild/freebsd-arm64@0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true optional: true /@esbuild/freebsd-arm64@0.19.10: @@ -805,7 +888,15 @@ packages: cpu: [arm64] os: [freebsd] requiresBuild: true - dev: false + optional: true + + /@esbuild/freebsd-x64@0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true optional: true /@esbuild/freebsd-x64@0.19.10: @@ -822,7 +913,15 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true - dev: false + optional: true + + /@esbuild/linux-arm64@0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true optional: true /@esbuild/linux-arm64@0.19.10: @@ -839,7 +938,15 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: false + optional: true + + /@esbuild/linux-arm@0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true optional: true /@esbuild/linux-arm@0.19.10: @@ -856,7 +963,15 @@ packages: cpu: [arm] os: [linux] requiresBuild: true - dev: false + optional: true + + /@esbuild/linux-ia32@0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true optional: true /@esbuild/linux-ia32@0.19.10: @@ -873,7 +988,15 @@ packages: cpu: [ia32] os: [linux] requiresBuild: true - dev: false + optional: true + + /@esbuild/linux-loong64@0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true optional: true /@esbuild/linux-loong64@0.19.10: @@ -890,7 +1013,15 @@ packages: cpu: [loong64] os: [linux] requiresBuild: true - dev: false + optional: true + + /@esbuild/linux-mips64el@0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true optional: true /@esbuild/linux-mips64el@0.19.10: @@ -907,7 +1038,15 @@ packages: cpu: [mips64el] os: [linux] requiresBuild: true - dev: false + optional: true + + /@esbuild/linux-ppc64@0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true optional: true /@esbuild/linux-ppc64@0.19.10: @@ -924,7 +1063,15 @@ packages: cpu: [ppc64] os: [linux] requiresBuild: true - dev: false + optional: true + + /@esbuild/linux-riscv64@0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true optional: true /@esbuild/linux-riscv64@0.19.10: @@ -941,7 +1088,15 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true - dev: false + optional: true + + /@esbuild/linux-s390x@0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true optional: true /@esbuild/linux-s390x@0.19.10: @@ -958,7 +1113,15 @@ packages: cpu: [s390x] os: [linux] requiresBuild: true - dev: false + optional: true + + /@esbuild/linux-x64@0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true optional: true /@esbuild/linux-x64@0.19.10: @@ -975,7 +1138,15 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: false + optional: true + + /@esbuild/netbsd-x64@0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true optional: true /@esbuild/netbsd-x64@0.19.10: @@ -992,7 +1163,15 @@ packages: cpu: [x64] os: [netbsd] requiresBuild: true - dev: false + optional: true + + /@esbuild/openbsd-x64@0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true optional: true /@esbuild/openbsd-x64@0.19.10: @@ -1009,7 +1188,15 @@ packages: cpu: [x64] os: [openbsd] requiresBuild: true - dev: false + optional: true + + /@esbuild/sunos-x64@0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true optional: true /@esbuild/sunos-x64@0.19.10: @@ -1026,7 +1213,15 @@ packages: cpu: [x64] os: [sunos] requiresBuild: true - dev: false + optional: true + + /@esbuild/win32-arm64@0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true optional: true /@esbuild/win32-arm64@0.19.10: @@ -1043,7 +1238,15 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true - dev: false + optional: true + + /@esbuild/win32-ia32@0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true optional: true /@esbuild/win32-ia32@0.19.10: @@ -1060,7 +1263,15 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true - dev: false + optional: true + + /@esbuild/win32-x64@0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true optional: true /@esbuild/win32-x64@0.19.10: @@ -1077,7 +1288,6 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: false optional: true /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): @@ -1432,6 +1642,14 @@ packages: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 + /@lucia-auth/adapter-drizzle@1.0.0(lucia@3.0.1): + resolution: {integrity: sha512-3NJbAgEcgFn1bJ+s/XVBdatnQZCtSjKJ880H25SVB9X+V2jhYfsSu/mcW3PSis5bLial188Pd4oNTTHonh+6vg==} + peerDependencies: + lucia: 3.x + dependencies: + lucia: 3.0.1 + dev: false + /@lucia-auth/adapter-prisma@4.0.0(@prisma/client@5.8.1)(lucia@3.0.1): resolution: {integrity: sha512-TJg4/U1K1slS4A/OzDYCgmHTrIArntIynue14zGIEaMDu+OD+tGyq9WwQWqOabpx2Gm9xtDsoK+tTokAY3Up7A==} peerDependencies: @@ -2146,6 +2364,11 @@ packages: '@noble/hashes': 1.3.2 dev: false + /@planetscale/database@1.14.0: + resolution: {integrity: sha512-7BB+iH6EH4YJuDeVeEbxpo60BFz3wIXJNXCmBGl40eC4HStRMGZ1COxKfiuPcINWwwrJhAhI9AEI97AOZYT7JQ==} + engines: {node: '>=16'} + dev: false + /@playwright/test@1.41.1: resolution: {integrity: sha512-9g8EWTjiQ9yFBXc6HjCWe41msLpxEX0KhmfmPl9RPLJdfzL4F0lg2BdJ91O9azFdl11y1pmpwdjBiSxvqc+btw==} engines: {node: '>=16'} @@ -3254,6 +3477,10 @@ packages: /buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + /cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -3276,6 +3503,11 @@ packages: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} + /camelcase@7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} + dev: true + /camelize@1.0.1: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} @@ -3304,6 +3536,11 @@ packages: supports-color: 7.2.0 dev: true + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + /check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} dependencies: @@ -3339,6 +3576,17 @@ packages: resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} dev: false + /cli-color@2.0.3: + resolution: {integrity: sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==} + engines: {node: '>=0.10'} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-iterator: 2.0.3 + memoizee: 0.4.15 + timers-ext: 0.1.7 + dev: true + /clsx@2.0.0: resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} engines: {node: '>=6'} @@ -3392,6 +3640,11 @@ packages: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} + /commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + dev: true + /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -3408,6 +3661,13 @@ packages: resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} + /copy-anything@3.0.5: + resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} + engines: {node: '>=12.13'} + dependencies: + is-what: 4.1.16 + dev: true + /core-js@3.33.2: resolution: {integrity: sha512-XeBzWI6QL3nJQiHmdzbAOiMYqjrb7hwU7A39Qhvd/POSa/t9E1AeZyEZx3fNvp/vtM8zXwhoL0FsiS0hD0pruQ==} requiresBuild: true @@ -3489,6 +3749,13 @@ packages: engines: {node: '>=4'} hasBin: true + /d@1.0.1: + resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} + dependencies: + es5-ext: 0.10.62 + type: 1.2.0 + dev: true + /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -3537,6 +3804,11 @@ packages: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} dev: false + /denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + dev: false + /dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -3565,6 +3837,12 @@ packages: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} + /difflib@0.2.4: + resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} + dependencies: + heap: 0.2.7 + dev: true + /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -3582,6 +3860,110 @@ packages: esutils: 2.0.3 dev: true + /dreamopt@0.8.0: + resolution: {integrity: sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==} + engines: {node: '>=0.4.0'} + dependencies: + wordwrap: 1.0.0 + dev: true + + /drizzle-kit@0.20.13: + resolution: {integrity: sha512-j9oZSQXNWG+KBJm0Sg3S/zJpncHGKnpqNfFuM4NUxUMGTcihDHhP9SW6Jncqwb5vsP1Xm0a8JLm3PZUIspC/oA==} + hasBin: true + dependencies: + '@drizzle-team/studio': 0.0.39 + '@esbuild-kit/esm-loader': 2.6.5 + camelcase: 7.0.1 + chalk: 5.3.0 + commander: 9.5.0 + env-paths: 3.0.0 + esbuild: 0.19.11 + esbuild-register: 3.5.0(esbuild@0.19.11) + glob: 8.1.0 + hanji: 0.0.5 + json-diff: 0.9.0 + minimatch: 7.4.6 + semver: 7.5.4 + zod: 3.22.4 + transitivePeerDependencies: + - supports-color + dev: true + + /drizzle-orm@0.29.3(@planetscale/database@1.14.0)(mysql2@3.9.1): + resolution: {integrity: sha512-uSE027csliGSGYD0pqtM+SAQATMREb3eSM/U8s6r+Y0RFwTKwftnwwSkqx3oS65UBgqDOM0gMTl5UGNpt6lW0A==} + peerDependencies: + '@aws-sdk/client-rds-data': '>=3' + '@cloudflare/workers-types': '>=3' + '@libsql/client': '*' + '@neondatabase/serverless': '>=0.1' + '@opentelemetry/api': ^1.4.1 + '@planetscale/database': '>=1' + '@types/better-sqlite3': '*' + '@types/pg': '*' + '@types/react': '>=18' + '@types/sql.js': '*' + '@vercel/postgres': '*' + better-sqlite3: '>=7' + bun-types: '*' + expo-sqlite: '>=13.2.0' + knex: '*' + kysely: '*' + mysql2: '>=2' + pg: '>=8' + postgres: '>=3' + react: '>=18' + sql.js: '>=1' + sqlite3: '>=5' + peerDependenciesMeta: + '@aws-sdk/client-rds-data': + optional: true + '@cloudflare/workers-types': + optional: true + '@libsql/client': + optional: true + '@neondatabase/serverless': + optional: true + '@opentelemetry/api': + optional: true + '@planetscale/database': + optional: true + '@types/better-sqlite3': + optional: true + '@types/pg': + optional: true + '@types/react': + optional: true + '@types/sql.js': + optional: true + '@vercel/postgres': + optional: true + better-sqlite3: + optional: true + bun-types: + optional: true + expo-sqlite: + optional: true + knex: + optional: true + kysely: + optional: true + mysql2: + optional: true + pg: + optional: true + postgres: + optional: true + react: + optional: true + sql.js: + optional: true + sqlite3: + optional: true + dependencies: + '@planetscale/database': 1.14.0 + mysql2: 3.9.1 + dev: false + /electron-to-chromium@1.4.576: resolution: {integrity: sha512-yXsZyXJfAqzWk1WKryr0Wl0MN2D47xodPvEEwlVePBnhU5E7raevLQR+E6b9JAD3GfL/7MbAL9ZtWQQPcLx7wA==} dev: true @@ -3597,9 +3979,89 @@ packages: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} dev: false + /env-paths@3.0.0: + resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /es5-ext@0.10.62: + resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==} + engines: {node: '>=0.10'} + requiresBuild: true + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + next-tick: 1.1.0 + dev: true + + /es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-symbol: 3.1.3 + dev: true + /es6-promise@3.3.1: resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} + /es6-symbol@3.1.3: + resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} + dependencies: + d: 1.0.1 + ext: 1.7.0 + dev: true + + /es6-weak-map@2.0.3: + resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + dev: true + + /esbuild-register@3.5.0(esbuild@0.19.11): + resolution: {integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==} + peerDependencies: + esbuild: '>=0.12 <1' + dependencies: + debug: 4.3.4 + esbuild: 0.19.11 + transitivePeerDependencies: + - supports-color + dev: true + + /esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + dev: true + /esbuild@0.19.10: resolution: {integrity: sha512-S1Y27QGt/snkNYrRcswgRFqZjaTG5a5xM3EQo97uNBnH505pdzSNe/HLBq1v0RO7iK/ngdbhJB6mDAp0OK+iUA==} engines: {node: '>=12'} @@ -3659,7 +4121,6 @@ packages: '@esbuild/win32-arm64': 0.19.11 '@esbuild/win32-ia32': 0.19.11 '@esbuild/win32-x64': 0.19.11 - dev: false /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} @@ -3831,6 +4292,13 @@ packages: engines: {node: '>=0.10.0'} dev: true + /event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + dev: true + /execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} @@ -3846,6 +4314,12 @@ packages: strip-final-newline: 3.0.0 dev: true + /ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + dependencies: + type: 2.7.2 + dev: true + /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true @@ -4014,6 +4488,12 @@ packages: wide-align: 1.1.5 dev: false + /generate-function@2.3.1: + resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} + dependencies: + is-property: 1.0.2 + dev: false + /get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} dev: true @@ -4032,6 +4512,12 @@ packages: engines: {node: '>=16'} dev: true + /get-tsconfig@4.7.2: + resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} + dependencies: + resolve-pkg-maps: 1.0.0 + dev: true + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -4064,6 +4550,17 @@ packages: once: 1.4.0 path-is-absolute: 1.0.1 + /glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + dev: true + /glob@9.3.2: resolution: {integrity: sha512-BTv/JhKXFEHsErMte/AnfiSv8yYOLLiyH2lTg8vn02O21zWFgHPTfxtgn1QRe7NRgggUhC8hacR2Re94svHqeA==} engines: {node: '>=16 || 14 >=14.17'} @@ -4112,6 +4609,13 @@ packages: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true + /hanji@0.0.5: + resolution: {integrity: sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==} + dependencies: + lodash.throttle: 4.1.1 + sisteransi: 1.0.5 + dev: true + /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -4150,6 +4654,10 @@ packages: dependencies: function-bind: 1.1.2 + /heap@0.2.7: + resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} + dev: true + /hex-rgb@4.3.0: resolution: {integrity: sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw==} engines: {node: '>=6'} @@ -4179,6 +4687,13 @@ packages: '@iconify/types': 2.0.0 dev: false + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: false + /ignore@5.3.0: resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} engines: {node: '>= 4'} @@ -4290,6 +4805,14 @@ packages: engines: {node: '>=8'} dev: true + /is-promise@2.2.2: + resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + dev: true + + /is-property@1.0.2: + resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} + dev: false + /is-reference@3.0.2: resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} dependencies: @@ -4307,6 +4830,11 @@ packages: which-typed-array: 1.1.13 dev: false + /is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + engines: {node: '>=12.13'} + dev: true + /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -4343,6 +4871,15 @@ packages: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} dev: true + /json-diff@0.9.0: + resolution: {integrity: sha512-cVnggDrVkAAA3OvFfHpFEhOnmcsUpleEKq4d4O8sQWWSH40MBrWstKigVB1kGrgLWzuom+7rRdaCsnBD6VyObQ==} + hasBin: true + dependencies: + cli-color: 2.0.3 + difflib: 0.2.4 + dreamopt: 0.8.0 + dev: true + /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true @@ -4455,6 +4992,14 @@ packages: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true + /lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + dev: true + + /long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + dev: false + /loupe@2.3.7: resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} dependencies: @@ -4472,6 +5017,22 @@ packages: dependencies: yallist: 4.0.0 + /lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + dev: false + + /lru-cache@8.0.5: + resolution: {integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==} + engines: {node: '>=16.14'} + dev: false + + /lru-queue@0.1.0: + resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} + dependencies: + es5-ext: 0.10.62 + dev: true + /lucia@3.0.1: resolution: {integrity: sha512-srwUkTCGgr6N4mFpaKZVZy5kwiRZdsrbIDv9Wrjar+xyw1MjojYQQ7oRbegjRWOZ3yI8xOOclK3sz/rga2J7/w==} dependencies: @@ -4537,6 +5098,19 @@ packages: dev: false optional: true + /memoizee@0.4.15: + resolution: {integrity: sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-weak-map: 2.0.3 + event-emitter: 0.3.5 + is-promise: 2.2.2 + lru-queue: 0.1.0 + next-tick: 1.1.0 + timers-ext: 0.1.7 + dev: true + /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} dev: true @@ -4572,12 +5146,18 @@ packages: dependencies: brace-expansion: 1.1.11 + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimatch@7.4.6: resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 - dev: false /minimatch@9.0.3: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} @@ -4651,6 +5231,20 @@ packages: /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + /mysql2@3.9.1: + resolution: {integrity: sha512-3njoWAAhGBYy0tWBabqUQcLtczZUxrmmtc2vszQUekg3kTJyZ5/IeLC3Fo04u6y6Iy5Sba7pIIa2P/gs8D3ZeQ==} + engines: {node: '>= 8.0'} + dependencies: + denque: 2.1.0 + generate-function: 2.3.1 + iconv-lite: 0.6.3 + long: 5.2.3 + lru-cache: 8.0.5 + named-placeholders: 1.1.3 + seq-queue: 0.0.5 + sqlstring: 2.3.3 + dev: false + /mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} dependencies: @@ -4658,6 +5252,13 @@ packages: object-assign: 4.1.1 thenify-all: 1.6.0 + /named-placeholders@1.1.3: + resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==} + engines: {node: '>=12.0.0'} + dependencies: + lru-cache: 7.18.3 + dev: false + /nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -4672,6 +5273,10 @@ packages: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true + /next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + dev: true + /node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -5471,6 +6076,10 @@ packages: engines: {node: '>=8'} dev: false + /resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + dev: true + /resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true @@ -5530,6 +6139,10 @@ packages: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} dev: false + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: false + /sander@0.5.1: resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} dependencies: @@ -5605,6 +6218,10 @@ packages: dependencies: lru-cache: 6.0.0 + /seq-queue@0.0.5: + resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} + dev: false + /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: false @@ -5691,6 +6308,10 @@ packages: mrmime: 2.0.0 totalist: 3.0.1 + /sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: true + /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -5709,9 +6330,20 @@ packages: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + + /sqlstring@2.3.3: + resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} + engines: {node: '>= 0.6'} dev: false /stackback@0.0.2: @@ -5786,6 +6418,13 @@ packages: pirates: 4.0.6 ts-interface-checker: 0.1.13 + /superjson@2.2.1: + resolution: {integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==} + engines: {node: '>=16'} + dependencies: + copy-anything: 3.0.5 + dev: true + /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -6077,6 +6716,13 @@ packages: dependencies: any-promise: 1.3.0 + /timers-ext@0.1.7: + resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} + dependencies: + es5-ext: 0.10.62 + next-tick: 1.1.0 + dev: true + /tiny-glob@0.2.9: resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} dependencies: @@ -6181,6 +6827,14 @@ packages: engines: {node: '>=10'} dev: true + /type@1.2.0: + resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} + dev: true + + /type@2.7.2: + resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} + dev: true + /typescript@5.3.3: resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} engines: {node: '>=14.17'} @@ -6447,6 +7101,10 @@ packages: string-width: 4.2.3 dev: false + /wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + dev: true + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} diff --git a/src/schema.ts b/src/schema.ts new file mode 100644 index 0000000..6e9369d --- /dev/null +++ b/src/schema.ts @@ -0,0 +1,27 @@ +import { DrizzleMySQLAdapter } from "@lucia-auth/adapter-drizzle"; +import mysql from "mysql2/promise"; +import { int, mysqlEnum, mysqlTable, uniqueIndex, datetime, varchar, serial } from 'drizzle-orm/mysql-core'; +import { drizzle } from "drizzle-orm/mysql2"; + +const connection = await mysql.createConnection(); +const db = drizzle(connection); + +const userTable = mysqlTable("user", { + id: varchar("id", { + length: 255 + }).primaryKey() +}); + +const sessionTable = mysqlTable("session", { + id: varchar("id", { + length: 255 + }).primaryKey(), + userId: varchar("user_id", { + length: 255 + }) + .notNull() + .references(() => userTable.id), + expiresAt: datetime("expires_at").notNull() +}); + +const adapter = new DrizzleMySQLAdapter(db, sessionTable, userTable); From 3494876abbae659761f310f628390be884ff72e0 Mon Sep 17 00:00:00 2001 From: Bradley Shellnut Date: Fri, 2 Feb 2024 17:56:31 -0800 Subject: [PATCH 02/34] Migrating to drizzle schemas. --- package.json | 1 + pnpm-lock.yaml | 13 +- src/lib/drizzle.ts | 13 ++ src/lib/server/auth.ts | 7 +- src/schema.ts | 304 +++++++++++++++++++++++++++++++++++++++-- 5 files changed, 320 insertions(+), 18 deletions(-) create mode 100644 src/lib/drizzle.ts diff --git a/package.json b/package.json index 48920c0..eb85754 100644 --- a/package.json +++ b/package.json @@ -104,6 +104,7 @@ "lucia": "3.0.1", "lucide-svelte": "^0.298.0", "mysql2": "^3.9.1", + "nanoid": "^5.0.5", "open-props": "^1.6.18", "oslo": "^1.0.3", "radix-svelte": "^0.9.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 835f2d4..fd92865 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -89,6 +89,9 @@ dependencies: mysql2: specifier: ^3.9.1 version: 3.9.1 + nanoid: + specifier: ^5.0.5 + version: 5.0.5 open-props: specifier: ^1.6.18 version: 1.6.18 @@ -1713,7 +1716,7 @@ packages: '@internationalized/date': 3.5.1 dequal: 2.0.3 focus-trap: 7.5.4 - nanoid: 5.0.4 + nanoid: 5.0.5 svelte: 4.2.9 dev: false @@ -1727,7 +1730,7 @@ packages: '@internationalized/date': 3.5.0 dequal: 2.0.3 focus-trap: 7.5.4 - nanoid: 5.0.4 + nanoid: 5.0.5 svelte: 4.2.9 dev: true @@ -3420,7 +3423,7 @@ packages: dependencies: '@internationalized/date': 3.5.1 '@melt-ui/svelte': 0.68.0(svelte@4.2.9) - nanoid: 5.0.4 + nanoid: 5.0.5 svelte: 4.2.9 dev: false @@ -5264,8 +5267,8 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - /nanoid@5.0.4: - resolution: {integrity: sha512-vAjmBf13gsmhXSgBrtIclinISzFFy22WwCYoyilZlsrRXNIHSwgFQ1bEdjRwMT3aoadeIF6HMuDRlOxzfXV8ig==} + /nanoid@5.0.5: + resolution: {integrity: sha512-/Veqm+QKsyMY3kqi4faWplnY1u+VuKO3dD2binyPIybP31DRO29bPF+1mszgLnrR2KqSLceFLBNw0zmvDzN1QQ==} engines: {node: ^18 || >=20} hasBin: true diff --git a/src/lib/drizzle.ts b/src/lib/drizzle.ts new file mode 100644 index 0000000..15d2cd4 --- /dev/null +++ b/src/lib/drizzle.ts @@ -0,0 +1,13 @@ +import { drizzle } from "drizzle-orm/planetscale-serverless"; +import { connect } from "@planetscale/database"; + +// create the connection +const connection = connect({ + host: process.env["DATABASE_HOST"], + username: process.env["DATABASE_USERNAME"], + password: process.env["DATABASE_PASSWORD"], +}); + +const db = drizzle(connection); + +export default db; \ No newline at end of file diff --git a/src/lib/server/auth.ts b/src/lib/server/auth.ts index 4fde8d7..21f848b 100644 --- a/src/lib/server/auth.ts +++ b/src/lib/server/auth.ts @@ -1,10 +1,11 @@ // lib/server/lucia.ts import { Lucia, TimeSpan } from 'lucia'; -import { PrismaAdapter } from '@lucia-auth/adapter-prisma'; +import { DrizzleMySQLAdapter } from "@lucia-auth/adapter-drizzle"; import { dev } from '$app/environment'; -import prisma_client from '$lib/prisma'; +import db from '$lib/drizzle'; +import { sessionTable, userTable } from '../../schema'; -const adapter = new PrismaAdapter(prisma_client.session, prisma_client.user); +const adapter = new DrizzleMySQLAdapter(db, sessionTable, userTable); export const lucia = new Lucia(adapter, { getSessionAttributes: (attributes) => { diff --git a/src/schema.ts b/src/schema.ts index 6e9369d..f10bfb8 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -1,27 +1,311 @@ -import { DrizzleMySQLAdapter } from "@lucia-auth/adapter-drizzle"; -import mysql from "mysql2/promise"; -import { int, mysqlEnum, mysqlTable, uniqueIndex, datetime, varchar, serial } from 'drizzle-orm/mysql-core'; -import { drizzle } from "drizzle-orm/mysql2"; +import { sql } from 'drizzle-orm'; +import { mysqlTable, datetime, varchar, boolean, timestamp } from 'drizzle-orm/mysql-core'; +import { nanoid } from 'nanoid'; -const connection = await mysql.createConnection(); -const db = drizzle(connection); +model User { + id String @id @default(cuid()) + username String @unique + hashed_password String? + email String? @unique + firstName String? + lastName String? + roles UserRole[] + verified Boolean @default(false) + receiveEmail Boolean @default(false) + collection Collection? + wishlist Wishlist? + list List[] + theme String @default("system") + created_at DateTime @default(now()) @db.Timestamp(6) + updated_at DateTime @updatedAt @db.Timestamp(6) + sessions Session[] -const userTable = mysqlTable("user", { + @@map("users") +} + +export const userTable = mysqlTable("users", { id: varchar("id", { length: 255 }).primaryKey() + .$defaultFn(() => nanoid()), + username: varchar("username", { + length: 255 + }).unique(), + hashedPassword: varchar("hashed_password", { + length: 255 + }), + email: varchar("email", { + length: 255 + }).unique(), + firstName: varchar("first_name", { + length: 255 + }), + lastName: varchar("last_name", { + length: 255 + }), + verified: boolean("verified").default(false), + receiveEmail: boolean("receive_email").default(false), + theme: varchar("theme", { + length: 255 + }).default("system"), + createdAt: timestamp("created_at").default(sql`(now(6))`), + updatedAt: timestamp("updated_at").default(sql`(now(6))`) }); -const sessionTable = mysqlTable("session", { +// model Session { +// id String @id @unique +// userId String +// ip_country String +// ip_address String +// expiresAt DateTime +// user User @relation(references: [id], fields: [userId], onDelete: Cascade) + +// @@index([userId]) +// @@map("sessions") +// } + +export const sessionTable = mysqlTable("sessions", { id: varchar("id", { length: 255 - }).primaryKey(), + }).primaryKey() + .$defaultFn(() => nanoid()), userId: varchar("user_id", { length: 255 }) .notNull() .references(() => userTable.id), + ipCountry: varchar("ip_country", { + length: 255 + }), + ipAddress: varchar("ip_address", { + length: 255 + }), expiresAt: datetime("expires_at").notNull() }); -const adapter = new DrizzleMySQLAdapter(db, sessionTable, userTable); +model Role { + id String @id @default(cuid()) + name String @unique + userRoles UserRole[] + + @@map("roles") +} + +model UserRole { + id String @id @default(cuid()) + user User @relation(fields: [user_id], references: [id]) + user_id String + role Role @relation(fields: [role_id], references: [id]) + role_id String + created_at DateTime @default(now()) @db.Timestamp(6) + updated_at DateTime @updatedAt @db.Timestamp(6) + + @@unique([user_id, role_id]) + @@index([user_id]) + @@index([role_id]) + @@map("user_roles") +} + +model Collection { + id String @id @default(cuid()) + user_id String @unique + user User @relation(references: [id], fields: [user_id]) + items CollectionItem[] + + @@index([user_id]) + @@map("collections") +} + +model CollectionItem { + id String @id @default(cuid()) + collection_id String + collection Collection @relation(references: [id], fields: [collection_id], onDelete: Cascade) + game_id String @unique + game Game @relation(references: [id], fields: [game_id]) + times_played Int + + @@index([game_id, collection_id]) + @@index([game_id]) + @@index([collection_id]) + @@map("collection_items") +} + +model Wishlist { + id String @id @default(cuid()) + user_id String @unique + user User @relation(references: [id], fields: [user_id]) + items WishlistItem[] + + @@index([user_id]) + @@map("wishlists") +} + +model WishlistItem { + id String @id @default(cuid()) + wishlist_id String + wishlist Wishlist @relation(references: [id], fields: [wishlist_id], onDelete: Cascade) + game_id String @unique + game Game @relation(references: [id], fields: [game_id]) + created_at DateTime @default(now()) @db.Timestamp(6) + updated_at DateTime @updatedAt @db.Timestamp(6) + + @@index([game_id, wishlist_id]) + @@index([game_id]) + @@index([wishlist_id]) + @@map("wishlist_items") +} + +model List { + id String @id @default(cuid()) + name String + user_id String @unique + user User @relation(references: [id], fields: [user_id]) + items ListItem[] + + @@index([user_id]) + @@map("lists") +} + +model ListItem { + id String @id @default(cuid()) + list_id String + list List @relation(references: [id], fields: [list_id], onDelete: Cascade) + game_id String @unique + game Game @relation(references: [id], fields: [game_id]) + created_at DateTime @default(now()) @db.Timestamp(6) + updated_at DateTime @updatedAt @db.Timestamp(6) + + @@index([game_id, list_id]) + @@index([game_id]) + @@index([list_id]) + @@map("list_items") +} + +model Game { + id String @id @default(cuid()) + name String + slug String + description String? @db.LongText + year_published Int? @db.Year + min_players Int? + max_players Int? + playtime Int? + min_playtime Int? + max_playtime Int? + min_age Int? + image_url String? + thumb_url String? + url String? + rules_url String? + categories Category[] + mechanics Mechanic[] + designers Designer[] + publishers Publisher[] + artists Artist[] + names GameName[] + expansions Expansion[] @relation("BaseToExpansion") + expansion_of Expansion[] @relation("ExpansionToBase") + collection_items CollectionItem[] + wishlist_items WishlistItem[] + list_items ListItem[] + external_id Int @unique + last_sync_at DateTime? @db.Timestamp(6) + created_at DateTime @default(now()) @db.Timestamp(6) + updated_at DateTime @updatedAt @db.Timestamp(6) + + @@fulltext([name]) + @@fulltext([slug]) + @@map("games") +} + +model GameName { + id String @id @default(cuid()) + name String + slug String + game_id String + game Game @relation(references: [id], fields: [game_id]) + created_at DateTime @default(now()) @db.Timestamp(6) + updated_at DateTime @updatedAt @db.Timestamp(6) + + @@index([game_id]) + @@map("game_names") +} + +model Publisher { + id String @id @default(cuid()) + name String + slug String + external_id Int @unique + games Game[] + created_at DateTime @default(now()) @db.Timestamp(6) + updated_at DateTime @updatedAt @db.Timestamp(6) + + @@fulltext([name]) + @@map("publishers") +} + +model Category { + id String @id @default(cuid()) + name String + slug String + games Game[] + external_id Int @unique + created_at DateTime @default(now()) @db.Timestamp(6) + updated_at DateTime @updatedAt @db.Timestamp(6) + + @@fulltext([name]) + @@map("categories") +} + +model Mechanic { + id String @id @default(cuid()) + name String + slug String + games Game[] + external_id Int @unique + created_at DateTime @default(now()) @db.Timestamp(6) + updated_at DateTime @updatedAt @db.Timestamp(6) + + @@fulltext([name]) + @@map("mechanics") +} + +model Designer { + id String @id @default(cuid()) + name String + slug String + external_id Int @unique + games Game[] + created_at DateTime @default(now()) @db.Timestamp(6) + updated_at DateTime @updatedAt @db.Timestamp(6) + + @@fulltext([name]) + @@map("designers") +} + +model Artist { + id String @id @default(cuid()) + name String + slug String @unique + external_id Int @unique + games Game[] + created_at DateTime @default(now()) @db.Timestamp(6) + updated_at DateTime @updatedAt @db.Timestamp(6) + + @@fulltext([name]) + @@map("artists") +} + +model Expansion { + id String @id @default(cuid()) + base_game Game @relation(name: "BaseToExpansion", fields: [base_game_id], references: [id]) + base_game_id String + game Game @relation(name: "ExpansionToBase", fields: [game_id], references: [id]) + game_id String + created_at DateTime @default(now()) @db.Timestamp(6) + updated_at DateTime @updatedAt @db.Timestamp(6) + + @@index([base_game_id]) + @@index([game_id]) + @@map("expansions") +} \ No newline at end of file From 30cd8ceb97028af9ae0b35df4b84a747eb4afb8f Mon Sep 17 00:00:00 2001 From: Bradley Shellnut Date: Sat, 3 Feb 2024 18:21:32 -0800 Subject: [PATCH 03/34] Updating schema for drizzle, adding migrate and push. --- drizzle.config.ts | 2 +- drizzle/0000_smooth_thunderbolt.sql | 169 ++++ drizzle/meta/0000_snapshot.json | 1118 +++++++++++++++++++++++++++ drizzle/meta/_journal.json | 13 + package.json | 9 +- pnpm-lock.yaml | 8 + src/lib/server/auth.ts | 4 +- src/migrate.ts | 12 + src/schema.ts | 670 ++++++++++------ 9 files changed, 1777 insertions(+), 228 deletions(-) create mode 100644 drizzle/0000_smooth_thunderbolt.sql create mode 100644 drizzle/meta/0000_snapshot.json create mode 100644 drizzle/meta/_journal.json create mode 100644 src/migrate.ts diff --git a/drizzle.config.ts b/drizzle.config.ts index cda1800..e06904c 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -6,6 +6,6 @@ export default defineConfig({ out: './drizzle', driver: 'mysql2', dbCredentials: { - connectionString: process.env.DATABASE_URL + uri: `${process.env.DATABASE_URL}` } }); \ No newline at end of file diff --git a/drizzle/0000_smooth_thunderbolt.sql b/drizzle/0000_smooth_thunderbolt.sql new file mode 100644 index 0000000..d8fa1f7 --- /dev/null +++ b/drizzle/0000_smooth_thunderbolt.sql @@ -0,0 +1,169 @@ +CREATE TABLE `artists` ( + `id` varchar(255) NOT NULL, + `name` varchar(255), + `slug` varchar(255), + `external_id` int, + `created_at` datetime DEFAULT (now(6)), + `updated_at` datetime DEFAULT (now(6)), + CONSTRAINT `artists_id` PRIMARY KEY(`id`) +); +--> statement-breakpoint +CREATE TABLE `categories` ( + `id` varchar(255) NOT NULL, + `name` varchar(255), + `slug` varchar(255), + `external_id` int, + `created_at` datetime DEFAULT (now(6)), + `updated_at` datetime DEFAULT (now(6)), + CONSTRAINT `categories_id` PRIMARY KEY(`id`) +); +--> statement-breakpoint +CREATE TABLE `collection_items` ( + `id` varchar(255) NOT NULL, + `collection_id` varchar(255) NOT NULL, + `game_id` varchar(255) NOT NULL, + `created_at` datetime DEFAULT (now(6)), + `updated_at` datetime DEFAULT (now(6)), + CONSTRAINT `collection_items_id` PRIMARY KEY(`id`) +); +--> statement-breakpoint +CREATE TABLE `collections` ( + `id` varchar(255) NOT NULL, + `user_id` varchar(255) NOT NULL, + `created_at` datetime DEFAULT (now(6)), + `updated_at` datetime DEFAULT (now(6)), + CONSTRAINT `collections_id` PRIMARY KEY(`id`) +); +--> statement-breakpoint +CREATE TABLE `designers` ( + `id` varchar(255) NOT NULL, + `name` varchar(255), + `slug` varchar(255), + `external_id` int, + `created_at` datetime DEFAULT (now(6)), + `updated_at` datetime DEFAULT (now(6)), + CONSTRAINT `designers_id` PRIMARY KEY(`id`) +); +--> statement-breakpoint +CREATE TABLE `expansions` ( + `id` varchar(255) NOT NULL, + `base_game_id` varchar(255) NOT NULL, + `game_id` varchar(255) NOT NULL, + `created_at` datetime DEFAULT (now(6)), + `updated_at` datetime DEFAULT (now(6)), + CONSTRAINT `expansions_id` PRIMARY KEY(`id`) +); +--> statement-breakpoint +CREATE TABLE `games` ( + `id` varchar(255) NOT NULL, + `name` varchar(255), + `slug` varchar(255), + `description` text, + `year_published` year, + `min_players` int, + `max_players` int, + `playtime` int, + `min_playtime` int, + `max_playtime` int, + `min_age` int, + `image_url` varchar(255), + `thumb_url` varchar(255), + `url` varchar(255), + `external_id` int, + `last_sync_at` datetime, + `created_at` datetime DEFAULT (now(6)), + `updated_at` datetime DEFAULT (now(6)), + CONSTRAINT `games_id` PRIMARY KEY(`id`), + CONSTRAINT `games_external_id_unique` UNIQUE(`external_id`) +); +--> statement-breakpoint +CREATE TABLE `mechanics` ( + `id` varchar(255) NOT NULL, + `name` varchar(255), + `slug` varchar(255), + `external_id` int, + `created_at` datetime DEFAULT (now(6)), + `updated_at` datetime DEFAULT (now(6)), + CONSTRAINT `mechanics_id` PRIMARY KEY(`id`) +); +--> statement-breakpoint +CREATE TABLE `publishers` ( + `id` varchar(255) NOT NULL, + `name` varchar(255), + `slug` varchar(255), + `external_id` int, + `created_at` datetime DEFAULT (now(6)), + `updated_at` datetime DEFAULT (now(6)), + CONSTRAINT `publishers_id` PRIMARY KEY(`id`) +); +--> statement-breakpoint +CREATE TABLE `roles` ( + `id` varchar(255) NOT NULL, + `name` varchar(255), + CONSTRAINT `roles_id` PRIMARY KEY(`id`), + CONSTRAINT `roles_name_unique` UNIQUE(`name`) +); +--> statement-breakpoint +CREATE TABLE `sessions` ( + `id` varchar(255) NOT NULL, + `user_id` varchar(255) NOT NULL, + `ip_country` varchar(255), + `ip_address` varchar(255), + `expires_at` datetime NOT NULL, + CONSTRAINT `sessions_id` PRIMARY KEY(`id`) +); +--> statement-breakpoint +CREATE TABLE `user_roles` ( + `id` varchar(255) NOT NULL, + `user_id` varchar(255) NOT NULL, + `role_id` varchar(255) NOT NULL, + `created_at` datetime DEFAULT (now(6)), + `updated_at` datetime DEFAULT (now(6)), + CONSTRAINT `user_roles_id` PRIMARY KEY(`id`) +); +--> statement-breakpoint +CREATE TABLE `users` ( + `id` varchar(255) NOT NULL, + `username` varchar(255), + `hashed_password` varchar(255), + `email` varchar(255), + `first_name` varchar(255), + `last_name` varchar(255), + `verified` boolean DEFAULT false, + `receive_email` boolean DEFAULT false, + `theme` varchar(255) DEFAULT 'system', + `created_at` datetime DEFAULT (now(6)), + `updated_at` datetime DEFAULT (now(6)), + CONSTRAINT `users_id` PRIMARY KEY(`id`), + CONSTRAINT `users_username_unique` UNIQUE(`username`), + CONSTRAINT `users_email_unique` UNIQUE(`email`) +); +--> statement-breakpoint +CREATE TABLE `wishlist_items` ( + `id` varchar(255) NOT NULL, + `wishlist_id` varchar(255) NOT NULL, + `game_id` varchar(255) NOT NULL, + `created_at` datetime DEFAULT (now(6)), + `updated_at` datetime DEFAULT (now(6)), + CONSTRAINT `wishlist_items_id` PRIMARY KEY(`id`) +); +--> statement-breakpoint +CREATE TABLE `wishlists` ( + `id` varchar(255) NOT NULL, + `user_id` varchar(255) NOT NULL, + `created_at` datetime DEFAULT (now(6)), + `updated_at` datetime DEFAULT (now(6)), + CONSTRAINT `wishlists_id` PRIMARY KEY(`id`) +); +--> statement-breakpoint +ALTER TABLE `collection_items` ADD CONSTRAINT `collection_items_collection_id_collections_id_fk` FOREIGN KEY (`collection_id`) REFERENCES `collections`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE `collection_items` ADD CONSTRAINT `collection_items_game_id_games_id_fk` FOREIGN KEY (`game_id`) REFERENCES `games`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE `collections` ADD CONSTRAINT `collections_user_id_users_id_fk` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE `expansions` ADD CONSTRAINT `expansions_base_game_id_games_id_fk` FOREIGN KEY (`base_game_id`) REFERENCES `games`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE `expansions` ADD CONSTRAINT `expansions_game_id_games_id_fk` FOREIGN KEY (`game_id`) REFERENCES `games`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE `sessions` ADD CONSTRAINT `sessions_user_id_users_id_fk` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE `user_roles` ADD CONSTRAINT `user_roles_user_id_users_id_fk` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE `user_roles` ADD CONSTRAINT `user_roles_role_id_roles_id_fk` FOREIGN KEY (`role_id`) REFERENCES `roles`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE `wishlist_items` ADD CONSTRAINT `wishlist_items_wishlist_id_wishlists_id_fk` FOREIGN KEY (`wishlist_id`) REFERENCES `wishlists`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE `wishlist_items` ADD CONSTRAINT `wishlist_items_game_id_games_id_fk` FOREIGN KEY (`game_id`) REFERENCES `games`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE `wishlists` ADD CONSTRAINT `wishlists_user_id_users_id_fk` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE cascade ON UPDATE no action; \ No newline at end of file diff --git a/drizzle/meta/0000_snapshot.json b/drizzle/meta/0000_snapshot.json new file mode 100644 index 0000000..40431d3 --- /dev/null +++ b/drizzle/meta/0000_snapshot.json @@ -0,0 +1,1118 @@ +{ + "version": "5", + "dialect": "mysql", + "id": "4a97ddeb-b977-401f-ad10-a4ae738d1254", + "prevId": "00000000-0000-0000-0000-000000000000", + "tables": { + "artists": { + "name": "artists", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "external_id": { + "name": "external_id", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + }, + "updated_at": { + "name": "updated_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "artists_id": { + "name": "artists_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "categories": { + "name": "categories", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "external_id": { + "name": "external_id", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + }, + "updated_at": { + "name": "updated_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "categories_id": { + "name": "categories_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "collection_items": { + "name": "collection_items", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "collection_id": { + "name": "collection_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + }, + "updated_at": { + "name": "updated_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + } + }, + "indexes": {}, + "foreignKeys": { + "collection_items_collection_id_collections_id_fk": { + "name": "collection_items_collection_id_collections_id_fk", + "tableFrom": "collection_items", + "tableTo": "collections", + "columnsFrom": [ + "collection_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "collection_items_game_id_games_id_fk": { + "name": "collection_items_game_id_games_id_fk", + "tableFrom": "collection_items", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "collection_items_id": { + "name": "collection_items_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "collections": { + "name": "collections", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + }, + "updated_at": { + "name": "updated_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + } + }, + "indexes": {}, + "foreignKeys": { + "collections_user_id_users_id_fk": { + "name": "collections_user_id_users_id_fk", + "tableFrom": "collections", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "collections_id": { + "name": "collections_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "designers": { + "name": "designers", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "external_id": { + "name": "external_id", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + }, + "updated_at": { + "name": "updated_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "designers_id": { + "name": "designers_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "expansions": { + "name": "expansions", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "base_game_id": { + "name": "base_game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + }, + "updated_at": { + "name": "updated_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + } + }, + "indexes": {}, + "foreignKeys": { + "expansions_base_game_id_games_id_fk": { + "name": "expansions_base_game_id_games_id_fk", + "tableFrom": "expansions", + "tableTo": "games", + "columnsFrom": [ + "base_game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "expansions_game_id_games_id_fk": { + "name": "expansions_game_id_games_id_fk", + "tableFrom": "expansions", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "expansions_id": { + "name": "expansions_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "games": { + "name": "games", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "year_published": { + "name": "year_published", + "type": "year", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "min_players": { + "name": "min_players", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "max_players": { + "name": "max_players", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "playtime": { + "name": "playtime", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "min_playtime": { + "name": "min_playtime", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "max_playtime": { + "name": "max_playtime", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "min_age": { + "name": "min_age", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "image_url": { + "name": "image_url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "thumb_url": { + "name": "thumb_url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "external_id": { + "name": "external_id", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "last_sync_at": { + "name": "last_sync_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + }, + "updated_at": { + "name": "updated_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "games_id": { + "name": "games_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "games_external_id_unique": { + "name": "games_external_id_unique", + "columns": [ + "external_id" + ] + } + } + }, + "mechanics": { + "name": "mechanics", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "external_id": { + "name": "external_id", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + }, + "updated_at": { + "name": "updated_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "mechanics_id": { + "name": "mechanics_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "publishers": { + "name": "publishers", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "external_id": { + "name": "external_id", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + }, + "updated_at": { + "name": "updated_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "publishers_id": { + "name": "publishers_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "roles": { + "name": "roles", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "roles_id": { + "name": "roles_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "roles_name_unique": { + "name": "roles_name_unique", + "columns": [ + "name" + ] + } + } + }, + "sessions": { + "name": "sessions", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "ip_country": { + "name": "ip_country", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "ip_address": { + "name": "ip_address", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "datetime", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "sessions_user_id_users_id_fk": { + "name": "sessions_user_id_users_id_fk", + "tableFrom": "sessions", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "sessions_id": { + "name": "sessions_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "user_roles": { + "name": "user_roles", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "role_id": { + "name": "role_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + }, + "updated_at": { + "name": "updated_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + } + }, + "indexes": {}, + "foreignKeys": { + "user_roles_user_id_users_id_fk": { + "name": "user_roles_user_id_users_id_fk", + "tableFrom": "user_roles", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_roles_role_id_roles_id_fk": { + "name": "user_roles_role_id_roles_id_fk", + "tableFrom": "user_roles", + "tableTo": "roles", + "columnsFrom": [ + "role_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "user_roles_id": { + "name": "user_roles_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "users": { + "name": "users", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "username": { + "name": "username", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "hashed_password": { + "name": "hashed_password", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "first_name": { + "name": "first_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "last_name": { + "name": "last_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "verified": { + "name": "verified", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": false + }, + "receive_email": { + "name": "receive_email", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": false + }, + "theme": { + "name": "theme", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'system'" + }, + "created_at": { + "name": "created_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + }, + "updated_at": { + "name": "updated_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "users_id": { + "name": "users_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "users_username_unique": { + "name": "users_username_unique", + "columns": [ + "username" + ] + }, + "users_email_unique": { + "name": "users_email_unique", + "columns": [ + "email" + ] + } + } + }, + "wishlist_items": { + "name": "wishlist_items", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "wishlist_id": { + "name": "wishlist_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + }, + "updated_at": { + "name": "updated_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + } + }, + "indexes": {}, + "foreignKeys": { + "wishlist_items_wishlist_id_wishlists_id_fk": { + "name": "wishlist_items_wishlist_id_wishlists_id_fk", + "tableFrom": "wishlist_items", + "tableTo": "wishlists", + "columnsFrom": [ + "wishlist_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "wishlist_items_game_id_games_id_fk": { + "name": "wishlist_items_game_id_games_id_fk", + "tableFrom": "wishlist_items", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "wishlist_items_id": { + "name": "wishlist_items_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "wishlists": { + "name": "wishlists", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + }, + "updated_at": { + "name": "updated_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + } + }, + "indexes": {}, + "foreignKeys": { + "wishlists_user_id_users_id_fk": { + "name": "wishlists_user_id_users_id_fk", + "tableFrom": "wishlists", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "wishlists_id": { + "name": "wishlists_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + } + }, + "schemas": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json new file mode 100644 index 0000000..027688f --- /dev/null +++ b/drizzle/meta/_journal.json @@ -0,0 +1,13 @@ +{ + "version": "5", + "dialect": "pg", + "entries": [ + { + "idx": 0, + "version": "5", + "when": 1707012854588, + "tag": "0000_smooth_thunderbolt", + "breakpoints": true + } + ] +} \ No newline at end of file diff --git a/package.json b/package.json index eb85754..b5d132e 100644 --- a/package.json +++ b/package.json @@ -16,11 +16,9 @@ "lint": "prettier --plugin-search-dir . --check . && eslint .", "format": "prettier --plugin-search-dir . --write .", "site:update": "pnpm update -i -L", - "db:studio": "prisma studio", - "db:push": "prisma db push", - "db:generate": "prisma generate", - "db:seed": "prisma db seed", - "i-changed-the-schema": "pnpm run db:push && pnpm run db:generate" + "generate": "drizzle-kit generate:mysql", + "migrate": "tsx ./src/migrate.ts", + "db:push": "drizzle-kit push:mysql" }, "prisma": { "seed": "node --loader ts-node/esm prisma/seed.ts" @@ -39,6 +37,7 @@ "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", "autoprefixer": "^10.4.17", + "dotenv": "^16.4.1", "drizzle-kit": "^0.20.13", "eslint": "^8.56.0", "eslint-config-prettier": "^9.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fd92865..e759db2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -160,6 +160,9 @@ devDependencies: autoprefixer: specifier: ^10.4.17 version: 10.4.17(postcss@8.4.33) + dotenv: + specifier: ^16.4.1 + version: 16.4.1 drizzle-kit: specifier: ^0.20.13 version: 0.20.13 @@ -3863,6 +3866,11 @@ packages: esutils: 2.0.3 dev: true + /dotenv@16.4.1: + resolution: {integrity: sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==} + engines: {node: '>=12'} + dev: true + /dreamopt@0.8.0: resolution: {integrity: sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==} engines: {node: '>=0.4.0'} diff --git a/src/lib/server/auth.ts b/src/lib/server/auth.ts index 21f848b..3f35e08 100644 --- a/src/lib/server/auth.ts +++ b/src/lib/server/auth.ts @@ -3,9 +3,9 @@ import { Lucia, TimeSpan } from 'lucia'; import { DrizzleMySQLAdapter } from "@lucia-auth/adapter-drizzle"; import { dev } from '$app/environment'; import db from '$lib/drizzle'; -import { sessionTable, userTable } from '../../schema'; +import { sessions, users } from '../../schema'; -const adapter = new DrizzleMySQLAdapter(db, sessionTable, userTable); +const adapter = new DrizzleMySQLAdapter(db, sessions, users); export const lucia = new Lucia(adapter, { getSessionAttributes: (attributes) => { diff --git a/src/migrate.ts b/src/migrate.ts new file mode 100644 index 0000000..69d656b --- /dev/null +++ b/src/migrate.ts @@ -0,0 +1,12 @@ +import { drizzle } from "drizzle-orm/mysql2"; +import { migrate } from "drizzle-orm/mysql2/migrator"; +import { createConnection } from "mysql2"; + +const connection = createConnection({ + uri: process.env.DATABASE_URL +}) +const db = drizzle(connection); + +await migrate(db, { migrationsFolder: "drizzle" }); + +await connection.end(); \ No newline at end of file diff --git a/src/schema.ts b/src/schema.ts index f10bfb8..a566559 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -1,29 +1,29 @@ import { sql } from 'drizzle-orm'; -import { mysqlTable, datetime, varchar, boolean, timestamp } from 'drizzle-orm/mysql-core'; +import { mysqlTable, datetime, varchar, boolean, timestamp, year, int, text } from 'drizzle-orm/mysql-core'; import { nanoid } from 'nanoid'; -model User { - id String @id @default(cuid()) - username String @unique - hashed_password String? - email String? @unique - firstName String? - lastName String? - roles UserRole[] - verified Boolean @default(false) - receiveEmail Boolean @default(false) - collection Collection? - wishlist Wishlist? - list List[] - theme String @default("system") - created_at DateTime @default(now()) @db.Timestamp(6) - updated_at DateTime @updatedAt @db.Timestamp(6) - sessions Session[] +// model User { +// id String @id @default(cuid()) +// username String @unique +// hashed_password String? +// email String? @unique +// firstName String? +// lastName String? +// roles UserRole[] +// verified Boolean @default(false) +// receiveEmail Boolean @default(false) +// collection Collection? +// wishlist Wishlist? +// list List[] +// theme String @default("system") +// created_at DateTime @default(now()) @db.Timestamp(6) +// updated_at DateTime @updatedAt @db.Timestamp(6) +// sessions Session[] - @@map("users") -} +// @@map("users") +// } -export const userTable = mysqlTable("users", { +export const users = mysqlTable("users", { id: varchar("id", { length: 255 }).primaryKey() @@ -48,10 +48,12 @@ export const userTable = mysqlTable("users", { theme: varchar("theme", { length: 255 }).default("system"), - createdAt: timestamp("created_at").default(sql`(now(6))`), - updatedAt: timestamp("updated_at").default(sql`(now(6))`) + createdAt: datetime("created_at").default(sql`(now(6))`), + updatedAt: datetime("updated_at").default(sql`(now(6))`) }); + + // model Session { // id String @id @unique // userId String @@ -64,7 +66,7 @@ export const userTable = mysqlTable("users", { // @@map("sessions") // } -export const sessionTable = mysqlTable("sessions", { +export const sessions = mysqlTable("sessions", { id: varchar("id", { length: 255 }).primaryKey() @@ -73,7 +75,7 @@ export const sessionTable = mysqlTable("sessions", { length: 255 }) .notNull() - .references(() => userTable.id), + .references(() => users.id, { onDelete: 'cascade' }), ipCountry: varchar("ip_country", { length: 255 }), @@ -83,229 +85,457 @@ export const sessionTable = mysqlTable("sessions", { expiresAt: datetime("expires_at").notNull() }); -model Role { - id String @id @default(cuid()) - name String @unique - userRoles UserRole[] +// model Role { +// id String @id @default(cuid()) +// name String @unique +// userRoles UserRole[] - @@map("roles") -} +// @@map("roles") +// } -model UserRole { - id String @id @default(cuid()) - user User @relation(fields: [user_id], references: [id]) - user_id String - role Role @relation(fields: [role_id], references: [id]) - role_id String - created_at DateTime @default(now()) @db.Timestamp(6) - updated_at DateTime @updatedAt @db.Timestamp(6) +export const roles = mysqlTable("roles", { + id: varchar("id", { + length: 255 + }).primaryKey() + .$defaultFn(() => nanoid()), + name: varchar("name", { + length: 255 + }).unique() +}); - @@unique([user_id, role_id]) - @@index([user_id]) - @@index([role_id]) - @@map("user_roles") -} +// model UserRole { +// id String @id @default(cuid()) +// user User @relation(fields: [user_id], references: [id]) +// user_id String +// role Role @relation(fields: [role_id], references: [id]) +// role_id String +// created_at DateTime @default(now()) @db.Timestamp(6) +// updated_at DateTime @updatedAt @db.Timestamp(6) -model Collection { - id String @id @default(cuid()) - user_id String @unique - user User @relation(references: [id], fields: [user_id]) - items CollectionItem[] +// @@unique([user_id, role_id]) +// @@index([user_id]) +// @@index([role_id]) +// @@map("user_roles") +// } - @@index([user_id]) - @@map("collections") -} +export const userRoles = mysqlTable("user_roles", { + id: varchar("id", { + length: 255 + }).primaryKey() + .$defaultFn(() => nanoid()), + userId: varchar("user_id", { + length: 255 + }) + .notNull() + .references(() => users.id, { onDelete: 'cascade' }), + roleId: varchar("role_id", { + length: 255 + }) + .notNull() + .references(() => roles.id, { onDelete: 'cascade' }), + createdAt: datetime("created_at").default(sql`(now(6))`), + updatedAt: datetime("updated_at").default(sql`(now(6))`) +}); -model CollectionItem { - id String @id @default(cuid()) - collection_id String - collection Collection @relation(references: [id], fields: [collection_id], onDelete: Cascade) - game_id String @unique - game Game @relation(references: [id], fields: [game_id]) - times_played Int +// model Game { +// id String @id @default(cuid()) +// name String +// slug String +// description String? @db.LongText +// year_published Int? @db.Year +// min_players Int? +// max_players Int? +// playtime Int? +// min_playtime Int? +// max_playtime Int? +// min_age Int? +// image_url String? +// thumb_url String? +// url String? +// rules_url String? +// categories Category[] +// mechanics Mechanic[] +// designers Designer[] +// publishers Publisher[] +// artists Artist[] +// names GameName[] +// expansions Expansion[] @relation("BaseToExpansion") +// expansion_of Expansion[] @relation("ExpansionToBase") +// collection_items CollectionItem[] +// wishlist_items WishlistItem[] +// list_items ListItem[] +// external_id Int @unique +// last_sync_at DateTime? @db.Timestamp(6) +// created_at DateTime @default(now()) @db.Timestamp(6) +// updated_at DateTime @updatedAt @db.Timestamp(6) - @@index([game_id, collection_id]) - @@index([game_id]) - @@index([collection_id]) - @@map("collection_items") -} +// @@fulltext([name]) +// @@fulltext([slug]) +// @@map("games") +// } -model Wishlist { - id String @id @default(cuid()) - user_id String @unique - user User @relation(references: [id], fields: [user_id]) - items WishlistItem[] +export const games = mysqlTable("games", { + id: varchar("id", { + length: 255 + }).primaryKey() + .$defaultFn(() => nanoid()), + name: varchar("name", { + length: 255 + }), + slug: varchar("slug", { + length: 255 + }), + description: text("description"), + yearPublished: year("year_published"), + minPlayers: int("min_players"), + maxPlayers: int("max_players"), + playtime: int("playtime"), + minPlaytime: int("min_playtime"), + maxPlaytime: int("max_playtime"), + minAge: int("min_age"), + imageUrl: varchar("image_url", { + length: 255 + }), + thumbUrl: varchar("thumb_url", { + length: 255 + }), + url: varchar("url", { + length: 255 + }), + externalId: int("external_id").unique(), + lastSyncAt: datetime("last_sync_at"), + createdAt: datetime("created_at").default(sql`(now(6))`), + updatedAt: datetime("updated_at").default(sql`(now(6))`) +}) - @@index([user_id]) - @@map("wishlists") -} +// model Expansion { +// id String @id @default(cuid()) +// base_game Game @relation(name: "BaseToExpansion", fields: [base_game_id], references: [id]) +// base_game_id String +// game Game @relation(name: "ExpansionToBase", fields: [game_id], references: [id]) +// game_id String +// created_at DateTime @default(now()) @db.Timestamp(6) +// updated_at DateTime @updatedAt @db.Timestamp(6) -model WishlistItem { - id String @id @default(cuid()) - wishlist_id String - wishlist Wishlist @relation(references: [id], fields: [wishlist_id], onDelete: Cascade) - game_id String @unique - game Game @relation(references: [id], fields: [game_id]) - created_at DateTime @default(now()) @db.Timestamp(6) - updated_at DateTime @updatedAt @db.Timestamp(6) +// @@index([base_game_id]) +// @@index([game_id]) +// @@map("expansions") +// } - @@index([game_id, wishlist_id]) - @@index([game_id]) - @@index([wishlist_id]) - @@map("wishlist_items") -} +export const expansions = mysqlTable("expansions", { + id: varchar("id", { + length: 255 + }).primaryKey() + .$defaultFn(() => nanoid()), + baseGameId: varchar("base_game_id", { + length: 255 + }) + .notNull() + .references(() => games.id, { onDelete: 'cascade' }), + gameId: varchar("game_id", { + length: 255 + }) + .notNull() + .references(() => games.id, { onDelete: 'cascade' }), + createdAt: datetime("created_at").default(sql`(now(6))`), + updatedAt: datetime("updated_at").default(sql`(now(6))`) +}) -model List { - id String @id @default(cuid()) - name String - user_id String @unique - user User @relation(references: [id], fields: [user_id]) - items ListItem[] +// model Collection { +// id String @id @default(cuid()) +// user_id String @unique +// user User @relation(references: [id], fields: [user_id]) +// items CollectionItem[] - @@index([user_id]) - @@map("lists") -} +// @@index([user_id]) +// @@map("collections") +// } -model ListItem { - id String @id @default(cuid()) - list_id String - list List @relation(references: [id], fields: [list_id], onDelete: Cascade) - game_id String @unique - game Game @relation(references: [id], fields: [game_id]) - created_at DateTime @default(now()) @db.Timestamp(6) - updated_at DateTime @updatedAt @db.Timestamp(6) +export const collections = mysqlTable("collections", { + id: varchar("id", { + length: 255 + }).primaryKey() + .$defaultFn(() => nanoid()), + userId: varchar("user_id", { + length: 255 + }) + .notNull() + .references(() => users.id, { onDelete: 'cascade' }), + createdAt: datetime("created_at").default(sql`(now(6))`), + updatedAt: datetime("updated_at").default(sql`(now(6))`) +}) - @@index([game_id, list_id]) - @@index([game_id]) - @@index([list_id]) - @@map("list_items") -} +// model CollectionItem { +// id String @id @default(cuid()) +// collection_id String +// collection Collection @relation(references: [id], fields: [collection_id], onDelete: Cascade) +// game_id String @unique +// game Game @relation(references: [id], fields: [game_id]) +// times_played Int -model Game { - id String @id @default(cuid()) - name String - slug String - description String? @db.LongText - year_published Int? @db.Year - min_players Int? - max_players Int? - playtime Int? - min_playtime Int? - max_playtime Int? - min_age Int? - image_url String? - thumb_url String? - url String? - rules_url String? - categories Category[] - mechanics Mechanic[] - designers Designer[] - publishers Publisher[] - artists Artist[] - names GameName[] - expansions Expansion[] @relation("BaseToExpansion") - expansion_of Expansion[] @relation("ExpansionToBase") - collection_items CollectionItem[] - wishlist_items WishlistItem[] - list_items ListItem[] - external_id Int @unique - last_sync_at DateTime? @db.Timestamp(6) - created_at DateTime @default(now()) @db.Timestamp(6) - updated_at DateTime @updatedAt @db.Timestamp(6) +// @@index([game_id, collection_id]) +// @@index([game_id]) +// @@index([collection_id]) +// @@map("collection_items") +// } - @@fulltext([name]) - @@fulltext([slug]) - @@map("games") -} +export const collectionItems = mysqlTable("collection_items", { + id: varchar("id", { + length: 255 + }).primaryKey() + .$defaultFn(() => nanoid()), + collectionId: varchar("collection_id", { + length: 255 + }) + .notNull() + .references(() => collections.id, { onDelete: 'cascade' }), + gameId: varchar("game_id", { + length: 255 + }) + .notNull() + .references(() => games.id, { onDelete: 'cascade' }), + createdAt: datetime("created_at").default(sql`(now(6))`), + updatedAt: datetime("updated_at").default(sql`(now(6))`) +}) -model GameName { - id String @id @default(cuid()) - name String - slug String - game_id String - game Game @relation(references: [id], fields: [game_id]) - created_at DateTime @default(now()) @db.Timestamp(6) - updated_at DateTime @updatedAt @db.Timestamp(6) +// model Wishlist { +// id String @id @default(cuid()) +// user_id String @unique +// user User @relation(references: [id], fields: [user_id]) +// items WishlistItem[] - @@index([game_id]) - @@map("game_names") -} +// @@index([user_id]) +// @@map("wishlists") +// } -model Publisher { - id String @id @default(cuid()) - name String - slug String - external_id Int @unique - games Game[] - created_at DateTime @default(now()) @db.Timestamp(6) - updated_at DateTime @updatedAt @db.Timestamp(6) +export const wishlists = mysqlTable("wishlists", { + id: varchar("id", { + length: 255 + }).primaryKey() + .$defaultFn(() => nanoid()), + userId: varchar("user_id", { + length: 255 + }) + .notNull() + .references(() => users.id, { onDelete: 'cascade' }), + createdAt: datetime("created_at").default(sql`(now(6))`), + updatedAt: datetime("updated_at").default(sql`(now(6))`) +}); - @@fulltext([name]) - @@map("publishers") -} +// model WishlistItem { +// id String @id @default(cuid()) +// wishlist_id String +// wishlist Wishlist @relation(references: [id], fields: [wishlist_id], onDelete: Cascade) +// game_id String @unique +// game Game @relation(references: [id], fields: [game_id]) +// created_at DateTime @default(now()) @db.Timestamp(6) +// updated_at DateTime @updatedAt @db.Timestamp(6) -model Category { - id String @id @default(cuid()) - name String - slug String - games Game[] - external_id Int @unique - created_at DateTime @default(now()) @db.Timestamp(6) - updated_at DateTime @updatedAt @db.Timestamp(6) +// @@index([game_id, wishlist_id]) +// @@index([game_id]) +// @@index([wishlist_id]) +// @@map("wishlist_items") +// } - @@fulltext([name]) - @@map("categories") -} +export const wishlistItems = mysqlTable("wishlist_items", { + id: varchar("id", { + length: 255 + }).primaryKey() + .$defaultFn(() => nanoid()), + wishlistId: varchar("wishlist_id", { + length: 255 + }) + .notNull() + .references(() => wishlists.id, { onDelete: 'cascade' }), + gameId: varchar("game_id", { + length: 255 + }) + .notNull() + .references(() => games.id, { onDelete: 'cascade' }), + createdAt: datetime("created_at").default(sql`(now(6))`), + updatedAt: datetime("updated_at").default(sql`(now(6))`) +}); -model Mechanic { - id String @id @default(cuid()) - name String - slug String - games Game[] - external_id Int @unique - created_at DateTime @default(now()) @db.Timestamp(6) - updated_at DateTime @updatedAt @db.Timestamp(6) +// model List { +// id String @id @default(cuid()) +// name String +// user_id String @unique +// user User @relation(references: [id], fields: [user_id]) +// items ListItem[] - @@fulltext([name]) - @@map("mechanics") -} +// @@index([user_id]) +// @@map("lists") +// } -model Designer { - id String @id @default(cuid()) - name String - slug String - external_id Int @unique - games Game[] - created_at DateTime @default(now()) @db.Timestamp(6) - updated_at DateTime @updatedAt @db.Timestamp(6) +// model ListItem { +// id String @id @default(cuid()) +// list_id String +// list List @relation(references: [id], fields: [list_id], onDelete: Cascade) +// game_id String @unique +// game Game @relation(references: [id], fields: [game_id]) +// created_at DateTime @default(now()) @db.Timestamp(6) +// updated_at DateTime @updatedAt @db.Timestamp(6) - @@fulltext([name]) - @@map("designers") -} +// @@index([game_id, list_id]) +// @@index([game_id]) +// @@index([list_id]) +// @@map("list_items") +// } -model Artist { - id String @id @default(cuid()) - name String - slug String @unique - external_id Int @unique - games Game[] - created_at DateTime @default(now()) @db.Timestamp(6) - updated_at DateTime @updatedAt @db.Timestamp(6) +// model GameName { +// id String @id @default(cuid()) +// name String +// slug String +// game_id String +// game Game @relation(references: [id], fields: [game_id]) +// created_at DateTime @default(now()) @db.Timestamp(6) +// updated_at DateTime @updatedAt @db.Timestamp(6) - @@fulltext([name]) - @@map("artists") -} +// @@index([game_id]) +// @@map("game_names") +// } -model Expansion { - id String @id @default(cuid()) - base_game Game @relation(name: "BaseToExpansion", fields: [base_game_id], references: [id]) - base_game_id String - game Game @relation(name: "ExpansionToBase", fields: [game_id], references: [id]) - game_id String - created_at DateTime @default(now()) @db.Timestamp(6) - updated_at DateTime @updatedAt @db.Timestamp(6) +// model Publisher { +// id String @id @default(cuid()) +// name String +// slug String +// external_id Int @unique +// games Game[] +// created_at DateTime @default(now()) @db.Timestamp(6) +// updated_at DateTime @updatedAt @db.Timestamp(6) - @@index([base_game_id]) - @@index([game_id]) - @@map("expansions") -} \ No newline at end of file +// @@fulltext([name]) +// @@map("publishers") +// } + +export const publishers = mysqlTable("publishers", { + id: varchar("id", { + length: 255 + }).primaryKey() + .$defaultFn(() => nanoid()), + name: varchar("name", { + length: 255 + }), + slug: varchar("slug", { + length: 255 + }), + externalId: int("external_id"), + createdAt: datetime("created_at").default(sql`(now(6))`), + updatedAt: datetime("updated_at").default(sql`(now(6))`) +}) + +// model Category { +// id String @id @default(cuid()) +// name String +// slug String +// games Game[] +// external_id Int @unique +// created_at DateTime @default(now()) @db.Timestamp(6) +// updated_at DateTime @updatedAt @db.Timestamp(6) + +// @@fulltext([name]) +// @@map("categories") +// } + +export const categories = mysqlTable("categories", { + id: varchar("id", { + length: 255 + }).primaryKey() + .$defaultFn(() => nanoid()), + name: varchar("name", { + length: 255 + }), + slug: varchar("slug", { + length: 255 + }), + externalId: int("external_id"), + createdAt: datetime("created_at").default(sql`(now(6))`), + updatedAt: datetime("updated_at").default(sql`(now(6))`) +}) + +// model Mechanic { +// id String @id @default(cuid()) +// name String +// slug String +// games Game[] +// external_id Int @unique +// created_at DateTime @default(now()) @db.Timestamp(6) +// updated_at DateTime @updatedAt @db.Timestamp(6) + +// @@fulltext([name]) +// @@map("mechanics") +// } + +export const mechanics = mysqlTable("mechanics", { + id: varchar("id", { + length: 255 + }).primaryKey() + .$defaultFn(() => nanoid()), + name: varchar("name", { + length: 255 + }), + slug: varchar("slug", { + length: 255 + }), + externalId: int("external_id"), + createdAt: datetime("created_at").default(sql`(now(6))`), + updatedAt: datetime("updated_at").default(sql`(now(6))`) +}) + +// model Designer { +// id String @id @default(cuid()) +// name String +// slug String +// external_id Int @unique +// games Game[] +// created_at DateTime @default(now()) @db.Timestamp(6) +// updated_at DateTime @updatedAt @db.Timestamp(6) + +// @@fulltext([name]) +// @@map("designers") +// } + +export const designers = mysqlTable("designers", { + id: varchar("id", { + length: 255 + }).primaryKey() + .$defaultFn(() => nanoid()), + name: varchar("name", { + length: 255 + }), + slug: varchar("slug", { + length: 255 + }), + externalId: int("external_id"), + createdAt: datetime("created_at").default(sql`(now(6))`), + updatedAt: datetime("updated_at").default(sql`(now(6))`) +}) + +// model Artist { +// id String @id @default(cuid()) +// name String +// slug String @unique +// external_id Int @unique +// games Game[] +// created_at DateTime @default(now()) @db.Timestamp(6) +// updated_at DateTime @updatedAt @db.Timestamp(6) + +// @@fulltext([name]) +// @@map("artists") +// } + +export const artists = mysqlTable("artists", { + id: varchar("id", { + length: 255 + }).primaryKey() + .$defaultFn(() => nanoid()), + name: varchar("name", { + length: 255 + }), + slug: varchar("slug", { + length: 255 + }), + externalId: int("external_id"), + createdAt: datetime("created_at").default(sql`(now(6))`), + updatedAt: datetime("updated_at").default(sql`(now(6))`) +}) From e229fd9b1c24d2233b8c1f71805db10abc02c6f0 Mon Sep 17 00:00:00 2001 From: Bradley Shellnut Date: Sun, 4 Feb 2024 17:53:23 -0800 Subject: [PATCH 04/34] Create join tables for things that can connect to games. --- drizzle/0001_dapper_spiral.sql | 24 + drizzle/meta/0001_snapshot.json | 1233 +++++++++++++++++++++++++++++++ drizzle/meta/_journal.json | 7 + src/schema.ts | 247 ++++++- 4 files changed, 1482 insertions(+), 29 deletions(-) create mode 100644 drizzle/0001_dapper_spiral.sql create mode 100644 drizzle/meta/0001_snapshot.json diff --git a/drizzle/0001_dapper_spiral.sql b/drizzle/0001_dapper_spiral.sql new file mode 100644 index 0000000..efd59eb --- /dev/null +++ b/drizzle/0001_dapper_spiral.sql @@ -0,0 +1,24 @@ +CREATE TABLE `artists_to_games` ( + `artist_id` varchar(255), + `game_id` varchar(255) +); +--> statement-breakpoint +CREATE TABLE `categories_to_games` ( + `category_id` varchar(255), + `game_id` varchar(255) +); +--> statement-breakpoint +CREATE TABLE `designers_to_games` ( + `designer_id` varchar(255), + `game_id` varchar(255) +); +--> statement-breakpoint +CREATE TABLE `mechanics_to_games` ( + `mechanic_id` varchar(255), + `game_id` varchar(255) +); +--> statement-breakpoint +CREATE TABLE `publishers_to_games` ( + `publisher_id` varchar(255), + `game_id` varchar(255) +); diff --git a/drizzle/meta/0001_snapshot.json b/drizzle/meta/0001_snapshot.json new file mode 100644 index 0000000..08fc2ae --- /dev/null +++ b/drizzle/meta/0001_snapshot.json @@ -0,0 +1,1233 @@ +{ + "version": "5", + "dialect": "mysql", + "id": "ab7f5925-a7ee-4cc4-8def-045d0cb29d75", + "prevId": "4a97ddeb-b977-401f-ad10-a4ae738d1254", + "tables": { + "artists": { + "name": "artists", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "external_id": { + "name": "external_id", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + }, + "updated_at": { + "name": "updated_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "artists_id": { + "name": "artists_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "artists_to_games": { + "name": "artists_to_games", + "columns": { + "artist_id": { + "name": "artist_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "categories": { + "name": "categories", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "external_id": { + "name": "external_id", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + }, + "updated_at": { + "name": "updated_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "categories_id": { + "name": "categories_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "categories_to_games": { + "name": "categories_to_games", + "columns": { + "category_id": { + "name": "category_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "collection_items": { + "name": "collection_items", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "collection_id": { + "name": "collection_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + }, + "updated_at": { + "name": "updated_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + } + }, + "indexes": {}, + "foreignKeys": { + "collection_items_collection_id_collections_id_fk": { + "name": "collection_items_collection_id_collections_id_fk", + "tableFrom": "collection_items", + "tableTo": "collections", + "columnsFrom": [ + "collection_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "collection_items_game_id_games_id_fk": { + "name": "collection_items_game_id_games_id_fk", + "tableFrom": "collection_items", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "collection_items_id": { + "name": "collection_items_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "collections": { + "name": "collections", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + }, + "updated_at": { + "name": "updated_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + } + }, + "indexes": {}, + "foreignKeys": { + "collections_user_id_users_id_fk": { + "name": "collections_user_id_users_id_fk", + "tableFrom": "collections", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "collections_id": { + "name": "collections_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "designers": { + "name": "designers", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "external_id": { + "name": "external_id", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + }, + "updated_at": { + "name": "updated_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "designers_id": { + "name": "designers_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "designers_to_games": { + "name": "designers_to_games", + "columns": { + "designer_id": { + "name": "designer_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "expansions": { + "name": "expansions", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "base_game_id": { + "name": "base_game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + }, + "updated_at": { + "name": "updated_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + } + }, + "indexes": {}, + "foreignKeys": { + "expansions_base_game_id_games_id_fk": { + "name": "expansions_base_game_id_games_id_fk", + "tableFrom": "expansions", + "tableTo": "games", + "columnsFrom": [ + "base_game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "expansions_game_id_games_id_fk": { + "name": "expansions_game_id_games_id_fk", + "tableFrom": "expansions", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "expansions_id": { + "name": "expansions_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "games": { + "name": "games", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "year_published": { + "name": "year_published", + "type": "year", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "min_players": { + "name": "min_players", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "max_players": { + "name": "max_players", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "playtime": { + "name": "playtime", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "min_playtime": { + "name": "min_playtime", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "max_playtime": { + "name": "max_playtime", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "min_age": { + "name": "min_age", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "image_url": { + "name": "image_url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "thumb_url": { + "name": "thumb_url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "external_id": { + "name": "external_id", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "last_sync_at": { + "name": "last_sync_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + }, + "updated_at": { + "name": "updated_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "games_id": { + "name": "games_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "games_external_id_unique": { + "name": "games_external_id_unique", + "columns": [ + "external_id" + ] + } + } + }, + "mechanics": { + "name": "mechanics", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "external_id": { + "name": "external_id", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + }, + "updated_at": { + "name": "updated_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "mechanics_id": { + "name": "mechanics_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "mechanics_to_games": { + "name": "mechanics_to_games", + "columns": { + "mechanic_id": { + "name": "mechanic_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "publishers": { + "name": "publishers", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "external_id": { + "name": "external_id", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + }, + "updated_at": { + "name": "updated_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "publishers_id": { + "name": "publishers_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "publishers_to_games": { + "name": "publishers_to_games", + "columns": { + "publisher_id": { + "name": "publisher_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "roles": { + "name": "roles", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "roles_id": { + "name": "roles_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "roles_name_unique": { + "name": "roles_name_unique", + "columns": [ + "name" + ] + } + } + }, + "sessions": { + "name": "sessions", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "ip_country": { + "name": "ip_country", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "ip_address": { + "name": "ip_address", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "datetime", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "sessions_user_id_users_id_fk": { + "name": "sessions_user_id_users_id_fk", + "tableFrom": "sessions", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "sessions_id": { + "name": "sessions_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "user_roles": { + "name": "user_roles", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "role_id": { + "name": "role_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + }, + "updated_at": { + "name": "updated_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + } + }, + "indexes": {}, + "foreignKeys": { + "user_roles_user_id_users_id_fk": { + "name": "user_roles_user_id_users_id_fk", + "tableFrom": "user_roles", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_roles_role_id_roles_id_fk": { + "name": "user_roles_role_id_roles_id_fk", + "tableFrom": "user_roles", + "tableTo": "roles", + "columnsFrom": [ + "role_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "user_roles_id": { + "name": "user_roles_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "users": { + "name": "users", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "username": { + "name": "username", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "hashed_password": { + "name": "hashed_password", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "first_name": { + "name": "first_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "last_name": { + "name": "last_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "verified": { + "name": "verified", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": false + }, + "receive_email": { + "name": "receive_email", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": false + }, + "theme": { + "name": "theme", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'system'" + }, + "created_at": { + "name": "created_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + }, + "updated_at": { + "name": "updated_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "users_id": { + "name": "users_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "users_username_unique": { + "name": "users_username_unique", + "columns": [ + "username" + ] + }, + "users_email_unique": { + "name": "users_email_unique", + "columns": [ + "email" + ] + } + } + }, + "wishlist_items": { + "name": "wishlist_items", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "wishlist_id": { + "name": "wishlist_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + }, + "updated_at": { + "name": "updated_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + } + }, + "indexes": {}, + "foreignKeys": { + "wishlist_items_wishlist_id_wishlists_id_fk": { + "name": "wishlist_items_wishlist_id_wishlists_id_fk", + "tableFrom": "wishlist_items", + "tableTo": "wishlists", + "columnsFrom": [ + "wishlist_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "wishlist_items_game_id_games_id_fk": { + "name": "wishlist_items_game_id_games_id_fk", + "tableFrom": "wishlist_items", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "wishlist_items_id": { + "name": "wishlist_items_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "wishlists": { + "name": "wishlists", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + }, + "updated_at": { + "name": "updated_at", + "type": "datetime", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(now(6))" + } + }, + "indexes": {}, + "foreignKeys": { + "wishlists_user_id_users_id_fk": { + "name": "wishlists_user_id_users_id_fk", + "tableFrom": "wishlists", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "wishlists_id": { + "name": "wishlists_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + } + }, + "schemas": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json index 027688f..eb701c4 100644 --- a/drizzle/meta/_journal.json +++ b/drizzle/meta/_journal.json @@ -8,6 +8,13 @@ "when": 1707012854588, "tag": "0000_smooth_thunderbolt", "breakpoints": true + }, + { + "idx": 1, + "version": "5", + "when": 1707097761920, + "tag": "0001_dapper_spiral", + "breakpoints": true } ] } \ No newline at end of file diff --git a/src/schema.ts b/src/schema.ts index a566559..279c298 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -1,4 +1,4 @@ -import { sql } from 'drizzle-orm'; +import { relations, sql } from 'drizzle-orm'; import { mysqlTable, datetime, varchar, boolean, timestamp, year, int, text } from 'drizzle-orm/mysql-core'; import { nanoid } from 'nanoid'; @@ -52,7 +52,9 @@ export const users = mysqlTable("users", { updatedAt: datetime("updated_at").default(sql`(now(6))`) }); - +export const user_relations = relations(users, ({ many }) => ({ + user_roles: many(user_roles) +})); // model Session { // id String @id @unique @@ -118,7 +120,7 @@ export const roles = mysqlTable("roles", { // @@map("user_roles") // } -export const userRoles = mysqlTable("user_roles", { +export const user_roles = mysqlTable("user_roles", { id: varchar("id", { length: 255 }).primaryKey() @@ -137,6 +139,17 @@ export const userRoles = mysqlTable("user_roles", { updatedAt: datetime("updated_at").default(sql`(now(6))`) }); +export const user_role_relations = relations(user_roles, ({ one }) => ({ + role: one(roles, { + fields: [user_roles.roleId], + references: [roles.id] + }), + user: one(users, { + fields: [user_roles.userId], + references: [users.id] + }) +})); + // model Game { // id String @id @default(cuid()) // name String @@ -206,7 +219,15 @@ export const games = mysqlTable("games", { lastSyncAt: datetime("last_sync_at"), createdAt: datetime("created_at").default(sql`(now(6))`), updatedAt: datetime("updated_at").default(sql`(now(6))`) -}) +}); + +export const gameRelations = relations(games, ({ many }) => ({ + categories_to_games: many(categories_to_games), + mechanics_to_games: many(mechanics_to_games), + designers_to_games: many(designers_to_games), + publishers_to_games: many(publishers_to_games), + artists_to_games: many(artists_to_games), +})) // model Expansion { // id String @id @default(cuid()) @@ -241,6 +262,17 @@ export const expansions = mysqlTable("expansions", { updatedAt: datetime("updated_at").default(sql`(now(6))`) }) +export const expansion_relations = relations(expansions, ({ one }) => ({ + baseGame: one(games, { + fields: [expansions.baseGameId], + references: [games.id] + }), + game: one(games, { + fields: [expansions.gameId], + references: [games.id] + }) +})); + // model Collection { // id String @id @default(cuid()) // user_id String @unique @@ -263,7 +295,14 @@ export const collections = mysqlTable("collections", { .references(() => users.id, { onDelete: 'cascade' }), createdAt: datetime("created_at").default(sql`(now(6))`), updatedAt: datetime("updated_at").default(sql`(now(6))`) -}) +}); + +export const collection_relations = relations(collections, ({ one }) => ({ + user: one(users, { + fields: [collections.userId], + references: [users.id] + }), +})) // model CollectionItem { // id String @id @default(cuid()) @@ -279,7 +318,7 @@ export const collections = mysqlTable("collections", { // @@map("collection_items") // } -export const collectionItems = mysqlTable("collection_items", { +export const collection_items = mysqlTable("collection_items", { id: varchar("id", { length: 255 }).primaryKey() @@ -296,7 +335,18 @@ export const collectionItems = mysqlTable("collection_items", { .references(() => games.id, { onDelete: 'cascade' }), createdAt: datetime("created_at").default(sql`(now(6))`), updatedAt: datetime("updated_at").default(sql`(now(6))`) -}) +}); + +export const collection_item_relations = relations(collection_items, ({ one }) =>({ + collection: one(collections, { + fields: [collection_items.collectionId], + references: [collections.id] + }), + game: one(games, { + fields: [collection_items.gameId], + references: [games.id] + }) +})); // model Wishlist { // id String @id @default(cuid()) @@ -322,6 +372,13 @@ export const wishlists = mysqlTable("wishlists", { updatedAt: datetime("updated_at").default(sql`(now(6))`) }); +export const wishlists_relations = relations(wishlists, ({ one }) => ({ + user: one(users, { + fields: [wishlists.userId], + references: [users.id] + }), +})) + // model WishlistItem { // id String @id @default(cuid()) // wishlist_id String @@ -337,25 +394,37 @@ export const wishlists = mysqlTable("wishlists", { // @@map("wishlist_items") // } -export const wishlistItems = mysqlTable("wishlist_items", { - id: varchar("id", { - length: 255 - }).primaryKey() - .$defaultFn(() => nanoid()), - wishlistId: varchar("wishlist_id", { - length: 255 - }) - .notNull() - .references(() => wishlists.id, { onDelete: 'cascade' }), - gameId: varchar("game_id", { - length: 255 - }) - .notNull() - .references(() => games.id, { onDelete: 'cascade' }), - createdAt: datetime("created_at").default(sql`(now(6))`), - updatedAt: datetime("updated_at").default(sql`(now(6))`) +export const wishlist_items = mysqlTable('wishlist_items', { + id: varchar('id', { + length: 255 + }) + .primaryKey() + .$defaultFn(() => nanoid()), + wishlistId: varchar('wishlist_id', { + length: 255 + }) + .notNull() + .references(() => wishlists.id, { onDelete: 'cascade' }), + gameId: varchar('game_id', { + length: 255 + }) + .notNull() + .references(() => games.id, { onDelete: 'cascade' }), + createdAt: datetime('created_at').default(sql`(now(6))`), + updatedAt: datetime('updated_at').default(sql`(now(6))`) }); +export const wishlist_item_relations = relations(wishlist_items, ({ one }) => ({ + wishlist: one(wishlists, { + fields: [wishlist_items.wishlistId], + references: [wishlists.id] + }), + game: one(games, { + fields: [wishlist_items.gameId], + references: [games.id] + }) +})) + // model List { // id String @id @default(cuid()) // name String @@ -422,7 +491,11 @@ export const publishers = mysqlTable("publishers", { externalId: int("external_id"), createdAt: datetime("created_at").default(sql`(now(6))`), updatedAt: datetime("updated_at").default(sql`(now(6))`) -}) +}); + +export const publishers_relations = relations(publishers, ({ many }) => ({ + publishers_to_games: many(publishers_to_games) +})); // model Category { // id String @id @default(cuid()) @@ -451,7 +524,11 @@ export const categories = mysqlTable("categories", { externalId: int("external_id"), createdAt: datetime("created_at").default(sql`(now(6))`), updatedAt: datetime("updated_at").default(sql`(now(6))`) -}) +}); + +export const categories_relations = relations(categories, ({ many }) => ({ + categories_to_games: many(categories_to_games) +})); // model Mechanic { // id String @id @default(cuid()) @@ -480,7 +557,11 @@ export const mechanics = mysqlTable("mechanics", { externalId: int("external_id"), createdAt: datetime("created_at").default(sql`(now(6))`), updatedAt: datetime("updated_at").default(sql`(now(6))`) -}) +}); + +export const mechanic_relations = relations(mechanics, ({ many }) => ({ + mechanics_to_games: many(mechanics_to_games) +})) // model Designer { // id String @id @default(cuid()) @@ -509,7 +590,11 @@ export const designers = mysqlTable("designers", { externalId: int("external_id"), createdAt: datetime("created_at").default(sql`(now(6))`), updatedAt: datetime("updated_at").default(sql`(now(6))`) -}) +}); + +export const designers_relations = relations(designers, ({ many }) => ({ + designers_to_games: many(designers_to_games) +})); // model Artist { // id String @id @default(cuid()) @@ -538,4 +623,108 @@ export const artists = mysqlTable("artists", { externalId: int("external_id"), createdAt: datetime("created_at").default(sql`(now(6))`), updatedAt: datetime("updated_at").default(sql`(now(6))`) -}) +}); + +export const artists_relations = relations(artists, ({ many }) => ({ + artists_to_games: many(artists_to_games) +})); + +export const artists_to_games = mysqlTable('artists_to_games', { + artistId: varchar('artist_id', { + length: 255 + }), + gameId: varchar('game_id', { + length: 255 + }), +}); + +export const artists_to_games_relations = relations(artists_to_games, ({ one }) => ({ + artist: one(artists, { + fields: [artists_to_games.artistId], + references: [artists.id] + }), + game: one(games, { + fields: [artists_to_games.gameId], + references: [games.id] + }), +})); + +export const categories_to_games = mysqlTable("categories_to_games", { + categoryId: varchar("category_id", { + length: 255 + }), + gameId: varchar("game_id", { + length: 255 + }), +}); + +export const categories_to_games_relations = relations(categories_to_games, ({ one }) => ({ + category: one(categories, { + fields: [categories_to_games.categoryId], + references: [categories.id] + }), + game: one(games, { + fields: [categories_to_games.gameId], + references: [games.id] + }), +})) + +export const designers_to_games = mysqlTable("designers_to_games", { + designerId: varchar("designer_id", { + length: 255 + }), + gameId: varchar("game_id", { + length: 255 + }), +}); + +export const designers_to_games_relations = relations(designers_to_games, ({ one }) => ({ + designer: one(designers, { + fields: [designers_to_games.designerId], + references: [designers.id] + }), + game: one(games, { + fields: [designers_to_games.gameId], + references: [games.id] + }), +})) + +export const mechanics_to_games = mysqlTable("mechanics_to_games", { + mechanicId: varchar("mechanic_id", { + length: 255 + }), + gameId: varchar("game_id", { + length: 255 + }), +}); + +export const mechanics_to_games_relations = relations(mechanics_to_games, ({ one }) => ({ + mechanic: one(mechanics, { + fields: [mechanics_to_games.mechanicId], + references: [mechanics.id] + }), + game: one(games, { + fields: [mechanics_to_games.gameId], + references: [games.id] + }), +})); + +export const publishers_to_games = mysqlTable("publishers_to_games", { + publisherId: varchar("publisher_id", { + length: 255 + }), + gameId: varchar("game_id", { + length: 255 + }), +}); + +export const publishers_to_games_relations = relations(publishers_to_games, ({ one }) => ({ + publisher: one(publishers, { + fields: [publishers_to_games.publisherId], + references: [publishers.id] + }), + game: one(games, { + fields: [publishers_to_games.gameId], + references: [games.id] + }), +})); From 3663fc328e57b08eb9d20a4d73591e6c62f7bcf2 Mon Sep 17 00:00:00 2001 From: Bradley Shellnut Date: Mon, 5 Feb 2024 23:18:13 -0800 Subject: [PATCH 05/34] Fix connecting to localhost mysql version and not use planetscale adapters. --- drizzle.config.ts | 6 +- ...hunderbolt.sql => 0000_true_sugar_man.sql} | 29 +- drizzle/0001_dapper_spiral.sql | 24 -- drizzle/0001_motionless_old_lace.sql | 2 + drizzle/meta/0000_snapshot.json | 133 +++++++- drizzle/meta/0001_snapshot.json | 20 +- drizzle/meta/_journal.json | 10 +- package.json | 3 +- pnpm-lock.yaml | 14 + src/lib/drizzle.ts | 19 +- src/routes/api/game/random/+server.ts | 57 ++-- src/schema.ts | 285 +----------------- 12 files changed, 244 insertions(+), 358 deletions(-) rename drizzle/{0000_smooth_thunderbolt.sql => 0000_true_sugar_man.sql} (91%) delete mode 100644 drizzle/0001_dapper_spiral.sql create mode 100644 drizzle/0001_motionless_old_lace.sql diff --git a/drizzle.config.ts b/drizzle.config.ts index e06904c..3ffe7e3 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -6,6 +6,10 @@ export default defineConfig({ out: './drizzle', driver: 'mysql2', dbCredentials: { - uri: `${process.env.DATABASE_URL}` + host: process.env.DATABASE_HOST || 'localhost', + port: 3306, + user: process.env.DATABASE_USER, + password: process.env.DATABASE_PASSWORD, + database: process.env.DATABASE || 'nut-shells' } }); \ No newline at end of file diff --git a/drizzle/0000_smooth_thunderbolt.sql b/drizzle/0000_true_sugar_man.sql similarity index 91% rename from drizzle/0000_smooth_thunderbolt.sql rename to drizzle/0000_true_sugar_man.sql index d8fa1f7..02b1d66 100644 --- a/drizzle/0000_smooth_thunderbolt.sql +++ b/drizzle/0000_true_sugar_man.sql @@ -8,6 +8,11 @@ CREATE TABLE `artists` ( CONSTRAINT `artists_id` PRIMARY KEY(`id`) ); --> statement-breakpoint +CREATE TABLE `artists_to_games` ( + `artist_id` varchar(255), + `game_id` varchar(255) +); +--> statement-breakpoint CREATE TABLE `categories` ( `id` varchar(255) NOT NULL, `name` varchar(255), @@ -18,6 +23,11 @@ CREATE TABLE `categories` ( CONSTRAINT `categories_id` PRIMARY KEY(`id`) ); --> statement-breakpoint +CREATE TABLE `categories_to_games` ( + `category_id` varchar(255), + `game_id` varchar(255) +); +--> statement-breakpoint CREATE TABLE `collection_items` ( `id` varchar(255) NOT NULL, `collection_id` varchar(255) NOT NULL, @@ -45,6 +55,11 @@ CREATE TABLE `designers` ( CONSTRAINT `designers_id` PRIMARY KEY(`id`) ); --> statement-breakpoint +CREATE TABLE `designers_to_games` ( + `designer_id` varchar(255), + `game_id` varchar(255) +); +--> statement-breakpoint CREATE TABLE `expansions` ( `id` varchar(255) NOT NULL, `base_game_id` varchar(255) NOT NULL, @@ -87,6 +102,11 @@ CREATE TABLE `mechanics` ( CONSTRAINT `mechanics_id` PRIMARY KEY(`id`) ); --> statement-breakpoint +CREATE TABLE `mechanics_to_games` ( + `mechanic_id` varchar(255), + `game_id` varchar(255) +); +--> statement-breakpoint CREATE TABLE `publishers` ( `id` varchar(255) NOT NULL, `name` varchar(255), @@ -97,6 +117,11 @@ CREATE TABLE `publishers` ( CONSTRAINT `publishers_id` PRIMARY KEY(`id`) ); --> statement-breakpoint +CREATE TABLE `publishers_to_games` ( + `publisher_id` varchar(255), + `game_id` varchar(255) +); +--> statement-breakpoint CREATE TABLE `roles` ( `id` varchar(255) NOT NULL, `name` varchar(255), @@ -107,8 +132,6 @@ CREATE TABLE `roles` ( CREATE TABLE `sessions` ( `id` varchar(255) NOT NULL, `user_id` varchar(255) NOT NULL, - `ip_country` varchar(255), - `ip_address` varchar(255), `expires_at` datetime NOT NULL, CONSTRAINT `sessions_id` PRIMARY KEY(`id`) ); @@ -161,7 +184,7 @@ ALTER TABLE `collection_items` ADD CONSTRAINT `collection_items_game_id_games_id ALTER TABLE `collections` ADD CONSTRAINT `collections_user_id_users_id_fk` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE `expansions` ADD CONSTRAINT `expansions_base_game_id_games_id_fk` FOREIGN KEY (`base_game_id`) REFERENCES `games`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE `expansions` ADD CONSTRAINT `expansions_game_id_games_id_fk` FOREIGN KEY (`game_id`) REFERENCES `games`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint -ALTER TABLE `sessions` ADD CONSTRAINT `sessions_user_id_users_id_fk` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE `sessions` ADD CONSTRAINT `sessions_user_id_users_id_fk` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE no action ON UPDATE no action;--> statement-breakpoint ALTER TABLE `user_roles` ADD CONSTRAINT `user_roles_user_id_users_id_fk` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE `user_roles` ADD CONSTRAINT `user_roles_role_id_roles_id_fk` FOREIGN KEY (`role_id`) REFERENCES `roles`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE `wishlist_items` ADD CONSTRAINT `wishlist_items_wishlist_id_wishlists_id_fk` FOREIGN KEY (`wishlist_id`) REFERENCES `wishlists`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint diff --git a/drizzle/0001_dapper_spiral.sql b/drizzle/0001_dapper_spiral.sql deleted file mode 100644 index efd59eb..0000000 --- a/drizzle/0001_dapper_spiral.sql +++ /dev/null @@ -1,24 +0,0 @@ -CREATE TABLE `artists_to_games` ( - `artist_id` varchar(255), - `game_id` varchar(255) -); ---> statement-breakpoint -CREATE TABLE `categories_to_games` ( - `category_id` varchar(255), - `game_id` varchar(255) -); ---> statement-breakpoint -CREATE TABLE `designers_to_games` ( - `designer_id` varchar(255), - `game_id` varchar(255) -); ---> statement-breakpoint -CREATE TABLE `mechanics_to_games` ( - `mechanic_id` varchar(255), - `game_id` varchar(255) -); ---> statement-breakpoint -CREATE TABLE `publishers_to_games` ( - `publisher_id` varchar(255), - `game_id` varchar(255) -); diff --git a/drizzle/0001_motionless_old_lace.sql b/drizzle/0001_motionless_old_lace.sql new file mode 100644 index 0000000..a0f73ea --- /dev/null +++ b/drizzle/0001_motionless_old_lace.sql @@ -0,0 +1,2 @@ +ALTER TABLE `sessions` ADD `ip_country` varchar(255);--> statement-breakpoint +ALTER TABLE `sessions` ADD `ip_address` varchar(255); \ No newline at end of file diff --git a/drizzle/meta/0000_snapshot.json b/drizzle/meta/0000_snapshot.json index 40431d3..25c0fa1 100644 --- a/drizzle/meta/0000_snapshot.json +++ b/drizzle/meta/0000_snapshot.json @@ -1,7 +1,7 @@ { "version": "5", "dialect": "mysql", - "id": "4a97ddeb-b977-401f-ad10-a4ae738d1254", + "id": "d90c2144-2349-4a3f-b4f3-87b5ab209936", "prevId": "00000000-0000-0000-0000-000000000000", "tables": { "artists": { @@ -64,6 +64,29 @@ }, "uniqueConstraints": {} }, + "artists_to_games": { + "name": "artists_to_games", + "columns": { + "artist_id": { + "name": "artist_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, "categories": { "name": "categories", "columns": { @@ -124,6 +147,29 @@ }, "uniqueConstraints": {} }, + "categories_to_games": { + "name": "categories_to_games", + "columns": { + "category_id": { + "name": "category_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, "collection_items": { "name": "collection_items", "columns": { @@ -324,6 +370,29 @@ }, "uniqueConstraints": {} }, + "designers_to_games": { + "name": "designers_to_games", + "columns": { + "designer_id": { + "name": "designer_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, "expansions": { "name": "expansions", "columns": { @@ -615,6 +684,29 @@ }, "uniqueConstraints": {} }, + "mechanics_to_games": { + "name": "mechanics_to_games", + "columns": { + "mechanic_id": { + "name": "mechanic_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, "publishers": { "name": "publishers", "columns": { @@ -675,6 +767,29 @@ }, "uniqueConstraints": {} }, + "publishers_to_games": { + "name": "publishers_to_games", + "columns": { + "publisher_id": { + "name": "publisher_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, "roles": { "name": "roles", "columns": { @@ -729,20 +844,6 @@ "notNull": true, "autoincrement": false }, - "ip_country": { - "name": "ip_country", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "ip_address": { - "name": "ip_address", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, "expires_at": { "name": "expires_at", "type": "datetime", @@ -763,7 +864,7 @@ "columnsTo": [ "id" ], - "onDelete": "cascade", + "onDelete": "no action", "onUpdate": "no action" } }, diff --git a/drizzle/meta/0001_snapshot.json b/drizzle/meta/0001_snapshot.json index 08fc2ae..a2e47bf 100644 --- a/drizzle/meta/0001_snapshot.json +++ b/drizzle/meta/0001_snapshot.json @@ -1,8 +1,8 @@ { "version": "5", "dialect": "mysql", - "id": "ab7f5925-a7ee-4cc4-8def-045d0cb29d75", - "prevId": "4a97ddeb-b977-401f-ad10-a4ae738d1254", + "id": "ede125d1-2fb9-4212-9c56-eeabe6af2332", + "prevId": "d90c2144-2349-4a3f-b4f3-87b5ab209936", "tables": { "artists": { "name": "artists", @@ -844,6 +844,13 @@ "notNull": true, "autoincrement": false }, + "expires_at": { + "name": "expires_at", + "type": "datetime", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, "ip_country": { "name": "ip_country", "type": "varchar(255)", @@ -857,13 +864,6 @@ "primaryKey": false, "notNull": false, "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "datetime", - "primaryKey": false, - "notNull": true, - "autoincrement": false } }, "indexes": {}, @@ -878,7 +878,7 @@ "columnsTo": [ "id" ], - "onDelete": "cascade", + "onDelete": "no action", "onUpdate": "no action" } }, diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json index eb701c4..25f6af7 100644 --- a/drizzle/meta/_journal.json +++ b/drizzle/meta/_journal.json @@ -1,19 +1,19 @@ { "version": "5", - "dialect": "pg", + "dialect": "mysql", "entries": [ { "idx": 0, "version": "5", - "when": 1707012854588, - "tag": "0000_smooth_thunderbolt", + "when": 1707197486310, + "tag": "0000_true_sugar_man", "breakpoints": true }, { "idx": 1, "version": "5", - "when": 1707097761920, - "tag": "0001_dapper_spiral", + "when": 1707199636963, + "tag": "0001_motionless_old_lace", "breakpoints": true } ] diff --git a/package.json b/package.json index b5d132e..036f9cd 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "site:update": "pnpm update -i -L", "generate": "drizzle-kit generate:mysql", "migrate": "tsx ./src/migrate.ts", - "db:push": "drizzle-kit push:mysql" + "push": "drizzle-kit push:mysql" }, "prisma": { "seed": "node --loader ts-node/esm prisma/seed.ts" @@ -64,6 +64,7 @@ "tailwindcss": "^3.4.1", "ts-node": "^10.9.2", "tslib": "^2.6.1", + "tsx": "^4.7.0", "typescript": "^5.3.3", "vite": "^5.0.12", "vitest": "^1.2.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e759db2..9d91880 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -241,6 +241,9 @@ devDependencies: tslib: specifier: ^2.6.1 version: 2.6.2 + tsx: + specifier: ^4.7.0 + version: 4.7.0 typescript: specifier: ^5.3.3 version: 5.3.3 @@ -6821,6 +6824,17 @@ packages: /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + /tsx@4.7.0: + resolution: {integrity: sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==} + engines: {node: '>=18.0.0'} + hasBin: true + dependencies: + esbuild: 0.19.11 + get-tsconfig: 4.7.2 + optionalDependencies: + fsevents: 2.3.3 + dev: true + /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} diff --git a/src/lib/drizzle.ts b/src/lib/drizzle.ts index 15d2cd4..9416f87 100644 --- a/src/lib/drizzle.ts +++ b/src/lib/drizzle.ts @@ -1,13 +1,18 @@ -import { drizzle } from "drizzle-orm/planetscale-serverless"; -import { connect } from "@planetscale/database"; +import { drizzle } from 'drizzle-orm/mysql2'; +import mysql from 'mysql2/promise'; +import { DATABASE_USER, DATABASE_PASSWORD, DATABASE_HOST, DATABASE_DB } from '$env/static/private'; + +console.log('DATABASE_URL', process.env.DATABASE_URL); // create the connection -const connection = connect({ - host: process.env["DATABASE_HOST"], - username: process.env["DATABASE_USERNAME"], - password: process.env["DATABASE_PASSWORD"], +const connection = await mysql.createConnection({ + user: DATABASE_USER, + password: DATABASE_PASSWORD, + host: DATABASE_HOST, + port: 3306, + database: DATABASE_DB }); const db = drizzle(connection); -export default db; \ No newline at end of file +export default db; diff --git a/src/routes/api/game/random/+server.ts b/src/routes/api/game/random/+server.ts index f902ff0..cb4adb2 100644 --- a/src/routes/api/game/random/+server.ts +++ b/src/routes/api/game/random/+server.ts @@ -1,6 +1,8 @@ -import prisma from '$lib/prisma.js'; -import type { Game } from '@prisma/client'; +// import prisma from '$lib/prisma.js'; +import db from '$lib/drizzle.js'; import { error, json } from '@sveltejs/kit'; +import { asc, inArray, sql } from 'drizzle-orm'; +import { games, type Games } from '../../../../schema.js'; export const GET = async ({ url, locals }) => { const searchParams = Object.fromEntries(url.searchParams); @@ -10,22 +12,37 @@ export const GET = async ({ url, locals }) => { error(400, { message: 'Limit must be between 1 and 6' }); } - const totalGames = await prisma.game.count(); - const randomIndex = Math.floor(Math.random() * totalGames); - const ids: { id: string }[] = await prisma.$queryRaw` - SELECT id - FROM games - ORDER BY id - LIMIT ${limit} - OFFSET ${randomIndex} - `; - const randomGames: Game[] = await prisma.game.findMany({ - where: { - id: { - in: ids.map(id => id.id) - } - } - }); - - return json(randomGames); + // const totalGames = await prisma.game.count(); + try { + console.log('db', db); + const dbGames = await db.select({ + count: sql`cast(count(*) as int))`, + }).from(games); + console.log('count', dbGames[0].count); + const randomIndex = Math.floor(Math.random() * dbGames[0]?.count); + const ids = await db.select({ id: games.id }) + .from(games) + .orderBy(asc(games.id)) + .limit(limit) + .offset(randomIndex); + // const ids: { id: string }[] = await prisma.$queryRaw` + // SELECT id + // FROM games + // ORDER BY id + // LIMIT ${limit} + // OFFSET ${randomIndex} + // `; + const randomGames: Games[] = await db.select().from(games).where(inArray(games.id, ids)); + return json(randomGames); + } catch (e) { + console.error(e); + throw error(500, { message: 'Something went wrong' }); + } + // const randomGames: Game[] = await prisma.game.findMany({ + // where: { + // id: { + // in: ids.map(id => id.id) + // } + // } + // }); } \ No newline at end of file diff --git a/src/schema.ts b/src/schema.ts index 279c298..734ef76 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -1,28 +1,7 @@ -import { relations, sql } from 'drizzle-orm'; -import { mysqlTable, datetime, varchar, boolean, timestamp, year, int, text } from 'drizzle-orm/mysql-core'; +import { relations, sql, type InferSelectModel } from 'drizzle-orm'; +import { mysqlTable, datetime, varchar, boolean, year, int, text } from 'drizzle-orm/mysql-core'; import { nanoid } from 'nanoid'; -// model User { -// id String @id @default(cuid()) -// username String @unique -// hashed_password String? -// email String? @unique -// firstName String? -// lastName String? -// roles UserRole[] -// verified Boolean @default(false) -// receiveEmail Boolean @default(false) -// collection Collection? -// wishlist Wishlist? -// list List[] -// theme String @default("system") -// created_at DateTime @default(now()) @db.Timestamp(6) -// updated_at DateTime @updatedAt @db.Timestamp(6) -// sessions Session[] - -// @@map("users") -// } - export const users = mysqlTable("users", { id: varchar("id", { length: 255 @@ -56,45 +35,26 @@ export const user_relations = relations(users, ({ many }) => ({ user_roles: many(user_roles) })); -// model Session { -// id String @id @unique -// userId String -// ip_country String -// ip_address String -// expiresAt DateTime -// user User @relation(references: [id], fields: [userId], onDelete: Cascade) +export type Users = InferSelectModel; -// @@index([userId]) -// @@map("sessions") -// } - -export const sessions = mysqlTable("sessions", { - id: varchar("id", { +export const sessions = mysqlTable('sessions', { + id: varchar('id', { length: 255 - }).primaryKey() - .$defaultFn(() => nanoid()), - userId: varchar("user_id", { + }).primaryKey(), + userId: varchar('user_id', { length: 255 }) .notNull() - .references(() => users.id, { onDelete: 'cascade' }), - ipCountry: varchar("ip_country", { + .references(() => users.id), + expiresAt: datetime('expires_at').notNull(), + ipCountry: varchar('ip_country', { length: 255 }), - ipAddress: varchar("ip_address", { + ipAddress: varchar('ip_address', { length: 255 - }), - expiresAt: datetime("expires_at").notNull() + }) }); -// model Role { -// id String @id @default(cuid()) -// name String @unique -// userRoles UserRole[] - -// @@map("roles") -// } - export const roles = mysqlTable("roles", { id: varchar("id", { length: 255 @@ -105,21 +65,6 @@ export const roles = mysqlTable("roles", { }).unique() }); -// model UserRole { -// id String @id @default(cuid()) -// user User @relation(fields: [user_id], references: [id]) -// user_id String -// role Role @relation(fields: [role_id], references: [id]) -// role_id String -// created_at DateTime @default(now()) @db.Timestamp(6) -// updated_at DateTime @updatedAt @db.Timestamp(6) - -// @@unique([user_id, role_id]) -// @@index([user_id]) -// @@index([role_id]) -// @@map("user_roles") -// } - export const user_roles = mysqlTable("user_roles", { id: varchar("id", { length: 255 @@ -150,43 +95,6 @@ export const user_role_relations = relations(user_roles, ({ one }) => ({ }) })); -// model Game { -// id String @id @default(cuid()) -// name String -// slug String -// description String? @db.LongText -// year_published Int? @db.Year -// min_players Int? -// max_players Int? -// playtime Int? -// min_playtime Int? -// max_playtime Int? -// min_age Int? -// image_url String? -// thumb_url String? -// url String? -// rules_url String? -// categories Category[] -// mechanics Mechanic[] -// designers Designer[] -// publishers Publisher[] -// artists Artist[] -// names GameName[] -// expansions Expansion[] @relation("BaseToExpansion") -// expansion_of Expansion[] @relation("ExpansionToBase") -// collection_items CollectionItem[] -// wishlist_items WishlistItem[] -// list_items ListItem[] -// external_id Int @unique -// last_sync_at DateTime? @db.Timestamp(6) -// created_at DateTime @default(now()) @db.Timestamp(6) -// updated_at DateTime @updatedAt @db.Timestamp(6) - -// @@fulltext([name]) -// @@fulltext([slug]) -// @@map("games") -// } - export const games = mysqlTable("games", { id: varchar("id", { length: 255 @@ -221,6 +129,8 @@ export const games = mysqlTable("games", { updatedAt: datetime("updated_at").default(sql`(now(6))`) }); +export type Games = InferSelectModel; + export const gameRelations = relations(games, ({ many }) => ({ categories_to_games: many(categories_to_games), mechanics_to_games: many(mechanics_to_games), @@ -229,20 +139,6 @@ export const gameRelations = relations(games, ({ many }) => ({ artists_to_games: many(artists_to_games), })) -// model Expansion { -// id String @id @default(cuid()) -// base_game Game @relation(name: "BaseToExpansion", fields: [base_game_id], references: [id]) -// base_game_id String -// game Game @relation(name: "ExpansionToBase", fields: [game_id], references: [id]) -// game_id String -// created_at DateTime @default(now()) @db.Timestamp(6) -// updated_at DateTime @updatedAt @db.Timestamp(6) - -// @@index([base_game_id]) -// @@index([game_id]) -// @@map("expansions") -// } - export const expansions = mysqlTable("expansions", { id: varchar("id", { length: 255 @@ -273,16 +169,6 @@ export const expansion_relations = relations(expansions, ({ one }) => ({ }) })); -// model Collection { -// id String @id @default(cuid()) -// user_id String @unique -// user User @relation(references: [id], fields: [user_id]) -// items CollectionItem[] - -// @@index([user_id]) -// @@map("collections") -// } - export const collections = mysqlTable("collections", { id: varchar("id", { length: 255 @@ -304,20 +190,6 @@ export const collection_relations = relations(collections, ({ one }) => ({ }), })) -// model CollectionItem { -// id String @id @default(cuid()) -// collection_id String -// collection Collection @relation(references: [id], fields: [collection_id], onDelete: Cascade) -// game_id String @unique -// game Game @relation(references: [id], fields: [game_id]) -// times_played Int - -// @@index([game_id, collection_id]) -// @@index([game_id]) -// @@index([collection_id]) -// @@map("collection_items") -// } - export const collection_items = mysqlTable("collection_items", { id: varchar("id", { length: 255 @@ -348,16 +220,6 @@ export const collection_item_relations = relations(collection_items, ({ one }) = }) })); -// model Wishlist { -// id String @id @default(cuid()) -// user_id String @unique -// user User @relation(references: [id], fields: [user_id]) -// items WishlistItem[] - -// @@index([user_id]) -// @@map("wishlists") -// } - export const wishlists = mysqlTable("wishlists", { id: varchar("id", { length: 255 @@ -379,21 +241,6 @@ export const wishlists_relations = relations(wishlists, ({ one }) => ({ }), })) -// model WishlistItem { -// id String @id @default(cuid()) -// wishlist_id String -// wishlist Wishlist @relation(references: [id], fields: [wishlist_id], onDelete: Cascade) -// game_id String @unique -// game Game @relation(references: [id], fields: [game_id]) -// created_at DateTime @default(now()) @db.Timestamp(6) -// updated_at DateTime @updatedAt @db.Timestamp(6) - -// @@index([game_id, wishlist_id]) -// @@index([game_id]) -// @@index([wishlist_id]) -// @@map("wishlist_items") -// } - export const wishlist_items = mysqlTable('wishlist_items', { id: varchar('id', { length: 255 @@ -425,58 +272,6 @@ export const wishlist_item_relations = relations(wishlist_items, ({ one }) => ({ }) })) -// model List { -// id String @id @default(cuid()) -// name String -// user_id String @unique -// user User @relation(references: [id], fields: [user_id]) -// items ListItem[] - -// @@index([user_id]) -// @@map("lists") -// } - -// model ListItem { -// id String @id @default(cuid()) -// list_id String -// list List @relation(references: [id], fields: [list_id], onDelete: Cascade) -// game_id String @unique -// game Game @relation(references: [id], fields: [game_id]) -// created_at DateTime @default(now()) @db.Timestamp(6) -// updated_at DateTime @updatedAt @db.Timestamp(6) - -// @@index([game_id, list_id]) -// @@index([game_id]) -// @@index([list_id]) -// @@map("list_items") -// } - -// model GameName { -// id String @id @default(cuid()) -// name String -// slug String -// game_id String -// game Game @relation(references: [id], fields: [game_id]) -// created_at DateTime @default(now()) @db.Timestamp(6) -// updated_at DateTime @updatedAt @db.Timestamp(6) - -// @@index([game_id]) -// @@map("game_names") -// } - -// model Publisher { -// id String @id @default(cuid()) -// name String -// slug String -// external_id Int @unique -// games Game[] -// created_at DateTime @default(now()) @db.Timestamp(6) -// updated_at DateTime @updatedAt @db.Timestamp(6) - -// @@fulltext([name]) -// @@map("publishers") -// } - export const publishers = mysqlTable("publishers", { id: varchar("id", { length: 255 @@ -497,19 +292,6 @@ export const publishers_relations = relations(publishers, ({ many }) => ({ publishers_to_games: many(publishers_to_games) })); -// model Category { -// id String @id @default(cuid()) -// name String -// slug String -// games Game[] -// external_id Int @unique -// created_at DateTime @default(now()) @db.Timestamp(6) -// updated_at DateTime @updatedAt @db.Timestamp(6) - -// @@fulltext([name]) -// @@map("categories") -// } - export const categories = mysqlTable("categories", { id: varchar("id", { length: 255 @@ -530,19 +312,6 @@ export const categories_relations = relations(categories, ({ many }) => ({ categories_to_games: many(categories_to_games) })); -// model Mechanic { -// id String @id @default(cuid()) -// name String -// slug String -// games Game[] -// external_id Int @unique -// created_at DateTime @default(now()) @db.Timestamp(6) -// updated_at DateTime @updatedAt @db.Timestamp(6) - -// @@fulltext([name]) -// @@map("mechanics") -// } - export const mechanics = mysqlTable("mechanics", { id: varchar("id", { length: 255 @@ -563,19 +332,6 @@ export const mechanic_relations = relations(mechanics, ({ many }) => ({ mechanics_to_games: many(mechanics_to_games) })) -// model Designer { -// id String @id @default(cuid()) -// name String -// slug String -// external_id Int @unique -// games Game[] -// created_at DateTime @default(now()) @db.Timestamp(6) -// updated_at DateTime @updatedAt @db.Timestamp(6) - -// @@fulltext([name]) -// @@map("designers") -// } - export const designers = mysqlTable("designers", { id: varchar("id", { length: 255 @@ -596,19 +352,6 @@ export const designers_relations = relations(designers, ({ many }) => ({ designers_to_games: many(designers_to_games) })); -// model Artist { -// id String @id @default(cuid()) -// name String -// slug String @unique -// external_id Int @unique -// games Game[] -// created_at DateTime @default(now()) @db.Timestamp(6) -// updated_at DateTime @updatedAt @db.Timestamp(6) - -// @@fulltext([name]) -// @@map("artists") -// } - export const artists = mysqlTable("artists", { id: varchar("id", { length: 255 From 8e1d453c13ef71db8779301ce393ba16dc173ef9 Mon Sep 17 00:00:00 2001 From: Bradley Shellnut Date: Tue, 6 Feb 2024 17:08:03 -0800 Subject: [PATCH 06/34] Starting signup creation of user. MySQL cannot return after insert and requerying with username. --- src/lib/drizzle.ts | 2 - src/routes/(auth)/sign-up/+page.server.ts | 63 ++++++++++++----------- src/routes/api/game/random/+server.ts | 33 ++++-------- src/schema.ts | 12 ++--- 4 files changed, 49 insertions(+), 61 deletions(-) diff --git a/src/lib/drizzle.ts b/src/lib/drizzle.ts index 9416f87..bcea3e5 100644 --- a/src/lib/drizzle.ts +++ b/src/lib/drizzle.ts @@ -2,8 +2,6 @@ import { drizzle } from 'drizzle-orm/mysql2'; import mysql from 'mysql2/promise'; import { DATABASE_USER, DATABASE_PASSWORD, DATABASE_HOST, DATABASE_DB } from '$env/static/private'; -console.log('DATABASE_URL', process.env.DATABASE_URL); - // create the connection const connection = await mysql.createConnection({ user: DATABASE_USER, diff --git a/src/routes/(auth)/sign-up/+page.server.ts b/src/routes/(auth)/sign-up/+page.server.ts index 5fcf7d5..ef35291 100644 --- a/src/routes/(auth)/sign-up/+page.server.ts +++ b/src/routes/(auth)/sign-up/+page.server.ts @@ -1,4 +1,4 @@ -import {fail, error, type Actions, redirect} from '@sveltejs/kit'; +import { fail, error, type Actions, redirect } from '@sveltejs/kit'; import { superValidate } from 'sveltekit-superforms/server'; import type { PageServerLoad } from './$types'; import prisma from '$lib/prisma'; @@ -7,6 +7,9 @@ import { Argon2id } from 'oslo/password'; import { userSchema } from '$lib/config/zod-schemas'; import { add_user_to_role } from '$server/roles'; import type { Message } from '$lib/types.js'; +import db from '$lib/drizzle'; +import { users } from '../../../schema'; +import { eq } from 'drizzle-orm'; const signUpSchema = userSchema .pick({ @@ -59,38 +62,40 @@ export const actions: Actions = { const hashedPassword = await new Argon2id().hash(form.data.password); - const user = await prisma.user.create({ - data: { + await db.insert(users) + .values({ username: form.data.username, hashed_password: hashedPassword, email: form.data.email || '', - firstName: form.data.firstName || '', - lastName: form.data.lastName || '', + first_name: form.data.firstName || '', + last_name: form.data.lastName || '', verified: false, - receiveEmail: false, + receive_email: false, theme: 'system' - } - }); + }); + const user = await db.select() + .from(users) + .where(eq(users.username, form.data.username)); console.log('signup user', user); - add_user_to_role(user.id, 'user'); - await prisma.collection.create({ - data: { - user_id: user.id - } - }); - await prisma.wishlist.create({ - data: { - user_id: user.id - } - }); + add_user_to_role(user[0].id, 'user'); + // await prisma.collection.create({ + // data: { + // user_id: user.id + // } + // }); + // await prisma.wishlist.create({ + // data: { + // user_id: user.id + // } + // }); - console.log('User', user); + // console.log('User', user); - session = await lucia.createSession(user.id, { - ipCountry: event.locals.session?.ipCountry, - ipAddress: event.locals.session?.ipAddress - }); - sessionCookie = lucia.createSessionCookie(session.id); + // session = await lucia.createSession(user.id, { + // ipCountry: event.locals.session?.ipCountry, + // ipAddress: event.locals.session?.ipAddress + // }); + // sessionCookie = lucia.createSessionCookie(session.id); } catch (e: any) { if (e.message.toUpperCase() === `DUPLICATE_KEY_ID`) { // key already exists @@ -106,10 +111,10 @@ export const actions: Actions = { error(500, message); } - event.cookies.set(sessionCookie.name, sessionCookie.value, { - path: ".", - ...sessionCookie.attributes - }); + // event.cookies.set(sessionCookie.name, sessionCookie.value, { + // path: ".", + // ...sessionCookie.attributes + // }); redirect(302, '/'); // const message = { type: 'success', message: 'Signed Up!' } as const; diff --git a/src/routes/api/game/random/+server.ts b/src/routes/api/game/random/+server.ts index cb4adb2..b06057d 100644 --- a/src/routes/api/game/random/+server.ts +++ b/src/routes/api/game/random/+server.ts @@ -1,7 +1,7 @@ // import prisma from '$lib/prisma.js'; import db from '$lib/drizzle.js'; import { error, json } from '@sveltejs/kit'; -import { asc, inArray, sql } from 'drizzle-orm'; +import { asc, count, inArray, sql } from 'drizzle-orm'; import { games, type Games } from '../../../../schema.js'; export const GET = async ({ url, locals }) => { @@ -12,37 +12,22 @@ export const GET = async ({ url, locals }) => { error(400, { message: 'Limit must be between 1 and 6' }); } - // const totalGames = await prisma.game.count(); try { - console.log('db', db); - const dbGames = await db.select({ - count: sql`cast(count(*) as int))`, - }).from(games); - console.log('count', dbGames[0].count); - const randomIndex = Math.floor(Math.random() * dbGames[0]?.count); - const ids = await db.select({ id: games.id }) + const totalGames = await db + .select({ + value: count(games.id) + }) + .from(games); + const numberOfGames = totalGames[0].value || 0; + const randomIndex = Math.floor(Math.random() * numberOfGames); + const randomGames: Games[] = await db.select() .from(games) .orderBy(asc(games.id)) .limit(limit) .offset(randomIndex); - // const ids: { id: string }[] = await prisma.$queryRaw` - // SELECT id - // FROM games - // ORDER BY id - // LIMIT ${limit} - // OFFSET ${randomIndex} - // `; - const randomGames: Games[] = await db.select().from(games).where(inArray(games.id, ids)); return json(randomGames); } catch (e) { console.error(e); throw error(500, { message: 'Something went wrong' }); } - // const randomGames: Game[] = await prisma.game.findMany({ - // where: { - // id: { - // in: ids.map(id => id.id) - // } - // } - // }); } \ No newline at end of file diff --git a/src/schema.ts b/src/schema.ts index 734ef76..df08a12 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -10,25 +10,25 @@ export const users = mysqlTable("users", { username: varchar("username", { length: 255 }).unique(), - hashedPassword: varchar("hashed_password", { + hashed_password: varchar("hashed_password", { length: 255 }), email: varchar("email", { length: 255 }).unique(), - firstName: varchar("first_name", { + first_name: varchar("first_name", { length: 255 }), - lastName: varchar("last_name", { + last_name: varchar("last_name", { length: 255 }), verified: boolean("verified").default(false), - receiveEmail: boolean("receive_email").default(false), + receive_email: boolean("receive_email").default(false), theme: varchar("theme", { length: 255 }).default("system"), - createdAt: datetime("created_at").default(sql`(now(6))`), - updatedAt: datetime("updated_at").default(sql`(now(6))`) + created_at: datetime("created_at").default(sql`(now(6))`), + updated_at: datetime("updated_at").default(sql`(now(6))`) }); export const user_relations = relations(users, ({ many }) => ({ From 679f59c0fd390970e13aab2f8c84e9a4ace28051 Mon Sep 17 00:00:00 2001 From: Bradley Shellnut Date: Tue, 6 Feb 2024 23:31:32 -0800 Subject: [PATCH 07/34] Fixing env configs for migrate. --- src/migrate.ts | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/migrate.ts b/src/migrate.ts index 69d656b..bda2592 100644 --- a/src/migrate.ts +++ b/src/migrate.ts @@ -1,12 +1,17 @@ -import { drizzle } from "drizzle-orm/mysql2"; -import { migrate } from "drizzle-orm/mysql2/migrator"; -import { createConnection } from "mysql2"; +import 'dotenv/config'; +import { drizzle } from 'drizzle-orm/mysql2'; +import { migrate } from 'drizzle-orm/mysql2/migrator'; +import { createConnection } from 'mysql2'; const connection = createConnection({ - uri: process.env.DATABASE_URL -}) + host: process.env.DATABASE_HOST, + port: 3306, + user: process.env.DATABASE_USER, + password: process.env.DATABASE_PASSWORD, + database: process.env.DATABASE_DB +}); const db = drizzle(connection); -await migrate(db, { migrationsFolder: "drizzle" }); +await migrate(db, { migrationsFolder: 'drizzle' }); -await connection.end(); \ No newline at end of file +await connection.end(); From 049a9536c42aa45de83e4061c77b0fcfa82b4349 Mon Sep 17 00:00:00 2001 From: Bradley Shellnut Date: Wed, 7 Feb 2024 17:16:17 -0800 Subject: [PATCH 08/34] Update dependencies, fix most of signup, add seed file for Drizzle and command. --- package.json | 25 +- pnpm-lock.yaml | 1079 ++++++++++++--------- src/lib/drizzle.ts | 3 +- src/lib/utils/authUtils.ts | 3 + src/routes/(auth)/sign-up/+page.server.ts | 68 +- src/schema.ts | 158 +-- src/seed/insert.ts | 27 + src/server/roles.ts | 28 +- 8 files changed, 773 insertions(+), 618 deletions(-) create mode 100644 src/lib/utils/authUtils.ts create mode 100644 src/seed/insert.ts diff --git a/package.json b/package.json index 036f9cd..84a7076 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "site:update": "pnpm update -i -L", "generate": "drizzle-kit generate:mysql", "migrate": "tsx ./src/migrate.ts", + "seed": "tsx ./src/seed/insert.ts", "push": "drizzle-kit push:mysql" }, "prisma": { @@ -26,35 +27,35 @@ "devDependencies": { "@melt-ui/pp": "^0.3.0", "@melt-ui/svelte": "^0.70.0", - "@playwright/test": "^1.41.1", + "@playwright/test": "^1.41.2", "@resvg/resvg-js": "^2.6.0", "@sveltejs/adapter-auto": "^3.1.1", "@sveltejs/enhanced-img": "^0.1.8", "@sveltejs/kit": "^2.5.0", "@sveltejs/vite-plugin-svelte": "^3.0.2", "@types/cookie": "^0.5.4", - "@types/node": "^18.19.10", - "@typescript-eslint/eslint-plugin": "^6.20.0", - "@typescript-eslint/parser": "^6.20.0", + "@types/node": "^18.19.14", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", "autoprefixer": "^10.4.17", "dotenv": "^16.4.1", - "drizzle-kit": "^0.20.13", + "drizzle-kit": "^0.20.14", "eslint": "^8.56.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-svelte": "^2.35.1", "just-clone": "^6.2.0", "just-debounce-it": "^3.2.0", - "postcss": "^8.4.33", + "postcss": "^8.4.35", "postcss-import": "^15.1.0", "postcss-load-config": "^4.0.2", "postcss-preset-env": "^9.3.0", - "prettier": "^3.2.4", + "prettier": "^3.2.5", "prettier-plugin-svelte": "^3.1.2", "prisma": "^5.8.1", "sass": "^1.70.0", "satori": "^0.10.13", "satori-html": "^0.3.2", - "svelte": "^4.2.9", + "svelte": "^4.2.10", "svelte-check": "^3.6.3", "svelte-meta-tags": "^3.1.0", "svelte-preprocess": "^5.1.3", @@ -79,13 +80,13 @@ "@fontsource/fira-mono": "^4.5.10", "@iconify-icons/line-md": "^1.2.26", "@iconify-icons/mdi": "^1.2.47", - "@lucia-auth/adapter-drizzle": "^1.0.0", + "@lucia-auth/adapter-drizzle": "^1.0.1", "@lucia-auth/adapter-prisma": "4.0.0", "@lukeed/uuid": "^2.0.1", "@paralleldrive/cuid2": "^2.2.2", - "@planetscale/database": "^1.14.0", + "@planetscale/database": "^1.15.0", "@prisma/client": "^5.8.1", - "@sentry/sveltekit": "^7.88.0", + "@sentry/sveltekit": "^7.100.1", "@sveltejs/adapter-vercel": "^5.1.0", "@types/feather-icons": "^4.29.4", "@vercel/og": "^0.5.20", @@ -106,7 +107,7 @@ "mysql2": "^3.9.1", "nanoid": "^5.0.5", "open-props": "^1.6.18", - "oslo": "^1.0.3", + "oslo": "^1.1.0", "radix-svelte": "^0.9.0", "svelte-french-toast": "^1.2.0", "svelte-lazy-loader": "^1.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9d91880..be4740b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,8 +15,8 @@ dependencies: specifier: ^1.2.47 version: 1.2.48 '@lucia-auth/adapter-drizzle': - specifier: ^1.0.0 - version: 1.0.0(lucia@3.0.1) + specifier: ^1.0.1 + version: 1.0.1(lucia@3.0.1) '@lucia-auth/adapter-prisma': specifier: 4.0.0 version: 4.0.0(@prisma/client@5.8.1)(lucia@3.0.1) @@ -27,14 +27,14 @@ dependencies: specifier: ^2.2.2 version: 2.2.2 '@planetscale/database': - specifier: ^1.14.0 - version: 1.14.0 + specifier: ^1.15.0 + version: 1.15.0 '@prisma/client': specifier: ^5.8.1 version: 5.8.1(prisma@5.8.1) '@sentry/sveltekit': - specifier: ^7.88.0 - version: 7.88.0(@sveltejs/kit@2.5.0)(svelte@4.2.9) + specifier: ^7.100.1 + version: 7.100.1(@sveltejs/kit@2.5.0)(svelte@4.2.10) '@sveltejs/adapter-vercel': specifier: ^5.1.0 version: 5.1.0(@sveltejs/kit@2.5.0) @@ -46,7 +46,7 @@ dependencies: version: 0.5.20 bits-ui: specifier: ^0.15.1 - version: 0.15.1(svelte@4.2.9) + version: 0.15.1(svelte@4.2.10) boardgamegeekclient: specifier: ^1.9.1 version: 1.9.1 @@ -61,13 +61,13 @@ dependencies: version: 0.5.0 drizzle-orm: specifier: ^0.29.3 - version: 0.29.3(@planetscale/database@1.14.0)(mysql2@3.9.1) + version: 0.29.3(@planetscale/database@1.15.0)(mysql2@3.9.1) feather-icons: specifier: ^4.29.1 version: 4.29.1 formsnap: specifier: ^0.4.3 - version: 0.4.3(svelte@4.2.9)(sveltekit-superforms@1.13.4)(zod@3.22.4) + version: 0.4.3(svelte@4.2.10)(sveltekit-superforms@1.13.4)(zod@3.22.4) html-entities: specifier: ^2.4.0 version: 2.4.0 @@ -85,7 +85,7 @@ dependencies: version: 3.0.1 lucide-svelte: specifier: ^0.298.0 - version: 0.298.0(svelte@4.2.9) + version: 0.298.0(svelte@4.2.10) mysql2: specifier: ^3.9.1 version: 3.9.1 @@ -96,14 +96,14 @@ dependencies: specifier: ^1.6.18 version: 1.6.18 oslo: - specifier: ^1.0.3 - version: 1.0.3 + specifier: ^1.1.0 + version: 1.1.0 radix-svelte: specifier: ^0.9.0 - version: 0.9.0(svelte@4.2.9) + version: 0.9.0(svelte@4.2.10) svelte-french-toast: specifier: ^1.2.0 - version: 1.2.0(svelte@4.2.9) + version: 1.2.0(svelte@4.2.10) svelte-lazy-loader: specifier: ^1.0.0 version: 1.0.0 @@ -123,13 +123,13 @@ dependencies: devDependencies: '@melt-ui/pp': specifier: ^0.3.0 - version: 0.3.0(@melt-ui/svelte@0.70.0)(svelte@4.2.9) + version: 0.3.0(@melt-ui/svelte@0.70.0)(svelte@4.2.10) '@melt-ui/svelte': specifier: ^0.70.0 - version: 0.70.0(svelte@4.2.9) + version: 0.70.0(svelte@4.2.10) '@playwright/test': - specifier: ^1.41.1 - version: 1.41.1 + specifier: ^1.41.2 + version: 1.41.2 '@resvg/resvg-js': specifier: ^2.6.0 version: 2.6.0 @@ -138,34 +138,34 @@ devDependencies: version: 3.1.1(@sveltejs/kit@2.5.0) '@sveltejs/enhanced-img': specifier: ^0.1.8 - version: 0.1.8(svelte@4.2.9) + version: 0.1.8(svelte@4.2.10) '@sveltejs/kit': specifier: ^2.5.0 - version: 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.9)(vite@5.0.12) + version: 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.10)(vite@5.0.12) '@sveltejs/vite-plugin-svelte': specifier: ^3.0.2 - version: 3.0.2(svelte@4.2.9)(vite@5.0.12) + version: 3.0.2(svelte@4.2.10)(vite@5.0.12) '@types/cookie': specifier: ^0.5.4 version: 0.5.4 '@types/node': - specifier: ^18.19.10 - version: 18.19.10 + specifier: ^18.19.14 + version: 18.19.14 '@typescript-eslint/eslint-plugin': - specifier: ^6.20.0 - version: 6.20.0(@typescript-eslint/parser@6.20.0)(eslint@8.56.0)(typescript@5.3.3) + specifier: ^6.21.0 + version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.3.3) '@typescript-eslint/parser': - specifier: ^6.20.0 - version: 6.20.0(eslint@8.56.0)(typescript@5.3.3) + specifier: ^6.21.0 + version: 6.21.0(eslint@8.56.0)(typescript@5.3.3) autoprefixer: specifier: ^10.4.17 - version: 10.4.17(postcss@8.4.33) + version: 10.4.17(postcss@8.4.35) dotenv: specifier: ^16.4.1 version: 16.4.1 drizzle-kit: - specifier: ^0.20.13 - version: 0.20.13 + specifier: ^0.20.14 + version: 0.20.14 eslint: specifier: ^8.56.0 version: 8.56.0 @@ -174,7 +174,7 @@ devDependencies: version: 9.1.0(eslint@8.56.0) eslint-plugin-svelte: specifier: ^2.35.1 - version: 2.35.1(eslint@8.56.0)(svelte@4.2.9)(ts-node@10.9.2) + version: 2.35.1(eslint@8.56.0)(svelte@4.2.10)(ts-node@10.9.2) just-clone: specifier: ^6.2.0 version: 6.2.0 @@ -182,23 +182,23 @@ devDependencies: specifier: ^3.2.0 version: 3.2.0 postcss: - specifier: ^8.4.33 - version: 8.4.33 + specifier: ^8.4.35 + version: 8.4.35 postcss-import: specifier: ^15.1.0 - version: 15.1.0(postcss@8.4.33) + version: 15.1.0(postcss@8.4.35) postcss-load-config: specifier: ^4.0.2 - version: 4.0.2(postcss@8.4.33)(ts-node@10.9.2) + version: 4.0.2(postcss@8.4.35)(ts-node@10.9.2) postcss-preset-env: specifier: ^9.3.0 - version: 9.3.0(postcss@8.4.33) + version: 9.3.0(postcss@8.4.35) prettier: - specifier: ^3.2.4 - version: 3.2.4 + specifier: ^3.2.5 + version: 3.2.5 prettier-plugin-svelte: specifier: ^3.1.2 - version: 3.1.2(prettier@3.2.4)(svelte@4.2.9) + version: 3.1.2(prettier@3.2.5)(svelte@4.2.10) prisma: specifier: ^5.8.1 version: 5.8.1 @@ -212,32 +212,32 @@ devDependencies: specifier: ^0.3.2 version: 0.3.2 svelte: - specifier: ^4.2.9 - version: 4.2.9 + specifier: ^4.2.10 + version: 4.2.10 svelte-check: specifier: ^3.6.3 - version: 3.6.3(postcss-load-config@4.0.2)(postcss@8.4.33)(sass@1.70.0)(svelte@4.2.9) + version: 3.6.3(postcss-load-config@4.0.2)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.10) svelte-meta-tags: specifier: ^3.1.0 - version: 3.1.0(svelte@4.2.9)(typescript@5.3.3) + version: 3.1.0(svelte@4.2.10)(typescript@5.3.3) svelte-preprocess: specifier: ^5.1.3 - version: 5.1.3(postcss-load-config@4.0.2)(postcss@8.4.33)(sass@1.70.0)(svelte@4.2.9)(typescript@5.3.3) + version: 5.1.3(postcss-load-config@4.0.2)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.10)(typescript@5.3.3) svelte-sequential-preprocessor: specifier: ^2.0.1 version: 2.0.1 sveltekit-flash-message: specifier: ^2.4.1 - version: 2.4.1(@sveltejs/kit@2.5.0)(svelte@4.2.9) + version: 2.4.1(@sveltejs/kit@2.5.0)(svelte@4.2.10) sveltekit-superforms: specifier: ^1.13.4 - version: 1.13.4(@sveltejs/kit@2.5.0)(svelte@4.2.9)(zod@3.22.4) + version: 1.13.4(@sveltejs/kit@2.5.0)(svelte@4.2.10)(zod@3.22.4) tailwindcss: specifier: ^3.4.1 version: 3.4.1(ts-node@10.9.2) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@18.19.10)(typescript@5.3.3) + version: 10.9.2(@types/node@18.19.14)(typescript@5.3.3) tslib: specifier: ^2.6.1 version: 2.6.2 @@ -249,10 +249,10 @@ devDependencies: version: 5.3.3 vite: specifier: ^5.0.12 - version: 5.0.12(@types/node@18.19.10)(sass@1.70.0) + version: 5.0.12(@types/node@18.19.14)(sass@1.70.0) vitest: specifier: ^1.2.2 - version: 1.2.2(@types/node@18.19.10)(sass@1.70.0) + version: 1.2.2(@types/node@18.19.14)(sass@1.70.0) zod: specifier: ^3.22.4 version: 3.22.4 @@ -264,6 +264,20 @@ packages: engines: {node: '>=0.10.0'} dev: true + /@actions/core@1.10.1: + resolution: {integrity: sha512-3lBR9EDAY+iYIpTnTIXmWcNbX3T2kCkAEQGIQx4NVQ0575nk2k3GRZDTPQG+vVtS2izSLmINlxXf0uLtnrTP+g==} + dependencies: + '@actions/http-client': 2.2.0 + uuid: 8.3.2 + dev: false + + /@actions/http-client@2.2.0: + resolution: {integrity: sha512-q+epW0trjVUUHboliPb4UF9g2msf+w61b32tAkFEwL/IwP0DQWgbCMM0Hbe3e3WXSKz5VcUXbzJQgy8Hkra/Lg==} + dependencies: + tunnel: 0.0.6 + undici: 5.28.3 + dev: false + /@alloc/quick-lru@5.2.0: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} @@ -380,18 +394,18 @@ packages: '@csstools/css-tokenizer': 2.2.1 dev: true - /@csstools/postcss-cascade-layers@4.0.1(postcss@8.4.33): + /@csstools/postcss-cascade-layers@4.0.1(postcss@8.4.35): resolution: {integrity: sha512-UYFuFL9GgVnftg9v7tBvVEBRLaBeAD66euD+yYy5fYCUld9ZIWTJNCE30hm6STMEdt6FL5xzeVw1lAZ1tpvUEg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: '@csstools/selector-specificity': 3.0.0(postcss-selector-parser@6.0.13) - postcss: 8.4.33 + postcss: 8.4.35 postcss-selector-parser: 6.0.13 dev: true - /@csstools/postcss-color-function@3.0.7(postcss@8.4.33): + /@csstools/postcss-color-function@3.0.7(postcss@8.4.35): resolution: {integrity: sha512-/PIB20G1TPCXmQlaJLWIYzTZRZpj6csT4ijgnshIj/kcmniIRroAfDa0xSWnfuO1eNo0NptIaPU7jzUukWn55Q==} engines: {node: ^14 || ^16 || >=18} peerDependencies: @@ -400,11 +414,11 @@ packages: '@csstools/css-color-parser': 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) '@csstools/css-tokenizer': 2.2.1 - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.33) - postcss: 8.4.33 + '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.35) + postcss: 8.4.35 dev: true - /@csstools/postcss-color-mix-function@2.0.7(postcss@8.4.33): + /@csstools/postcss-color-mix-function@2.0.7(postcss@8.4.35): resolution: {integrity: sha512-57/g8aGo5eKFjEeJMiRKh8Qq43K2rCyk5ZZTvJ34TNl4zUtYU5DvLkIkOnhCtL8/a4z9oMA42aOnFPddRrScUQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: @@ -413,11 +427,11 @@ packages: '@csstools/css-color-parser': 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) '@csstools/css-tokenizer': 2.2.1 - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.33) - postcss: 8.4.33 + '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.35) + postcss: 8.4.35 dev: true - /@csstools/postcss-exponential-functions@1.0.1(postcss@8.4.33): + /@csstools/postcss-exponential-functions@1.0.1(postcss@8.4.35): resolution: {integrity: sha512-ZLK2iSK4DUxeypGce2PnQSdYugUqDTwxnhNiq1o6OyKMNYgYs4eKbvEhFG8JKr1sJWbeqBi5jRr0017l2EWVvg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: @@ -426,20 +440,20 @@ packages: '@csstools/css-calc': 1.1.4(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) '@csstools/css-tokenizer': 2.2.1 - postcss: 8.4.33 + postcss: 8.4.35 dev: true - /@csstools/postcss-font-format-keywords@3.0.0(postcss@8.4.33): + /@csstools/postcss-font-format-keywords@3.0.0(postcss@8.4.35): resolution: {integrity: sha512-ntkGj+1uDa/u6lpjPxnkPcjJn7ChO/Kcy08YxctOZI7vwtrdYvFhmE476dq8bj1yna306+jQ9gzXIG/SWfOaRg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-gamut-mapping@1.0.0(postcss@8.4.33): + /@csstools/postcss-gamut-mapping@1.0.0(postcss@8.4.35): resolution: {integrity: sha512-6UQyK8l9YaG5Ao5rBDcCnKHrLsHiQ1E0zeFQuqDJqEtinVzAPb/MwSw3TenZXL1Rnd7th3tb+4CBFHBXdW5tbQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: @@ -448,10 +462,10 @@ packages: '@csstools/css-color-parser': 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) '@csstools/css-tokenizer': 2.2.1 - postcss: 8.4.33 + postcss: 8.4.35 dev: true - /@csstools/postcss-gradients-interpolation-method@4.0.7(postcss@8.4.33): + /@csstools/postcss-gradients-interpolation-method@4.0.7(postcss@8.4.35): resolution: {integrity: sha512-GT1CzE/Tyr/ei4j5BwKESkHAgg+Gzys/0mAY7W+UiR+XrcYk5hDbOrE/YJIx1rflfO/7La1bDoZtA0YnLl4qNA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: @@ -460,11 +474,11 @@ packages: '@csstools/css-color-parser': 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) '@csstools/css-tokenizer': 2.2.1 - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.33) - postcss: 8.4.33 + '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.35) + postcss: 8.4.35 dev: true - /@csstools/postcss-hwb-function@3.0.6(postcss@8.4.33): + /@csstools/postcss-hwb-function@3.0.6(postcss@8.4.35): resolution: {integrity: sha512-uQgWt2Ho2yy2S6qthWY7mD5v57NKxi6dD1NB8nAybU5bJSsm+hLXRGm3/zbOH4xNrqO3Cl60DFSNlSrUME3Xjg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: @@ -473,88 +487,88 @@ packages: '@csstools/css-color-parser': 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) '@csstools/css-tokenizer': 2.2.1 - postcss: 8.4.33 + postcss: 8.4.35 dev: true - /@csstools/postcss-ic-unit@3.0.2(postcss@8.4.33): + /@csstools/postcss-ic-unit@3.0.2(postcss@8.4.35): resolution: {integrity: sha512-n28Er7W9qc48zNjJnvTKuVHY26/+6YlA9WzJRksIHiAWOMxSH5IksXkw7FpkIOd+jLi59BMrX/BWrZMgjkLBHg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.33) - postcss: 8.4.33 + '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.35) + postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-initial@1.0.0(postcss@8.4.33): + /@csstools/postcss-initial@1.0.0(postcss@8.4.35): resolution: {integrity: sha512-1l7iHHjIl5qmVeGItugr4ZOlCREDP71mNKqoEyxlosIoiu3Os1nPWMHpuCvDLCLiWI/ONTOg3nzJh7gwHOrqUA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 dev: true - /@csstools/postcss-is-pseudo-class@4.0.3(postcss@8.4.33): + /@csstools/postcss-is-pseudo-class@4.0.3(postcss@8.4.35): resolution: {integrity: sha512-/dt5M9Ty/x3Yiq0Nm/5PJJzwkVFchJgdjKVnryBPtoMCb9ohb/nDIJOwr/Wr3hK3FDs1EA1GE6PyRYsUmQPS8Q==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: '@csstools/selector-specificity': 3.0.0(postcss-selector-parser@6.0.13) - postcss: 8.4.33 + postcss: 8.4.35 postcss-selector-parser: 6.0.13 dev: true - /@csstools/postcss-logical-float-and-clear@2.0.0(postcss@8.4.33): + /@csstools/postcss-logical-float-and-clear@2.0.0(postcss@8.4.35): resolution: {integrity: sha512-Wki4vxsF6icRvRz8eF9bPpAvwaAt0RHwhVOyzfoFg52XiIMjb6jcbHkGxwpJXP4DVrnFEwpwmrz5aTRqOW82kg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 dev: true - /@csstools/postcss-logical-overflow@1.0.0(postcss@8.4.33): + /@csstools/postcss-logical-overflow@1.0.0(postcss@8.4.35): resolution: {integrity: sha512-cIrZ8f7bGGvr+W53nEuMspcwaeaI2YTmz6LZ4yiAO5z14/PQgOOv+Pn+qjvPOPoadeY2BmpaoTzZKvdAQuM17w==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 dev: true - /@csstools/postcss-logical-overscroll-behavior@1.0.0(postcss@8.4.33): + /@csstools/postcss-logical-overscroll-behavior@1.0.0(postcss@8.4.35): resolution: {integrity: sha512-e89S2LWjnxf0SB2wNUAbqDyFb/Fow/tlOe1XqOLbNx4rf3LrQokM9qldVx7sarnddml3ORE5LDUmlKpPOOeJTA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 dev: true - /@csstools/postcss-logical-resize@2.0.0(postcss@8.4.33): + /@csstools/postcss-logical-resize@2.0.0(postcss@8.4.35): resolution: {integrity: sha512-lCQ1aX8c5+WI4t5EoYf3alTzJNNocMqTb+u1J9CINdDhFh1fjovqK+0aHalUHsNstZmzFPNzIkU4Mb3eM9U8SA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-logical-viewport-units@2.0.3(postcss@8.4.33): + /@csstools/postcss-logical-viewport-units@2.0.3(postcss@8.4.35): resolution: {integrity: sha512-xeVxqND5rlQyqLGdH7rX34sIm/JbbQKxpKQP8oD1YQqUHHCLQR9NUS57WqJKajxKN6AcNAMWJhb5LUH5RfPcyA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: '@csstools/css-tokenizer': 2.2.1 - postcss: 8.4.33 + postcss: 8.4.35 dev: true - /@csstools/postcss-media-minmax@1.1.0(postcss@8.4.33): + /@csstools/postcss-media-minmax@1.1.0(postcss@8.4.35): resolution: {integrity: sha512-t5Li/DPC5QmW/6VFLfUvsw/4dNYYseWR0tOXDeJg/9EKUodBgNawz5tuk5vYKtNvoj+Q08odMuXcpS5YJj0AFA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: @@ -564,10 +578,10 @@ packages: '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) '@csstools/css-tokenizer': 2.2.1 '@csstools/media-query-list-parser': 2.1.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - postcss: 8.4.33 + postcss: 8.4.35 dev: true - /@csstools/postcss-media-queries-aspect-ratio-number-values@2.0.3(postcss@8.4.33): + /@csstools/postcss-media-queries-aspect-ratio-number-values@2.0.3(postcss@8.4.35): resolution: {integrity: sha512-IPL8AvnwMYW+cWtp+j8cW3MFN0RyXNT4hLOvs6Rf2N+NcbvXhSyKxZuE3W9Cv4KjaNoNoGx1d0UhT6tktq6tUw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: @@ -576,30 +590,30 @@ packages: '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) '@csstools/css-tokenizer': 2.2.1 '@csstools/media-query-list-parser': 2.1.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - postcss: 8.4.33 + postcss: 8.4.35 dev: true - /@csstools/postcss-nested-calc@3.0.0(postcss@8.4.33): + /@csstools/postcss-nested-calc@3.0.0(postcss@8.4.35): resolution: {integrity: sha512-HsB66aDWAouOwD/GcfDTS0a7wCuVWaTpXcjl5VKP0XvFxDiU+r0T8FG7xgb6ovZNZ+qzvGIwRM+CLHhDgXrYgQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-normalize-display-values@3.0.1(postcss@8.4.33): + /@csstools/postcss-normalize-display-values@3.0.1(postcss@8.4.35): resolution: {integrity: sha512-nUvRxI+ALJwkxZdPU4EDyuM380vP91sAGvI3jAOHs/sr3jfcCOzLkY6xKI1Mr526kZ3RivmMoYM/xq+XFyE/bw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-oklab-function@3.0.7(postcss@8.4.33): + /@csstools/postcss-oklab-function@3.0.7(postcss@8.4.35): resolution: {integrity: sha512-vBFTQD3CARB3u/XIGO44wWbcO7xG/4GsYqJlcPuUGRSK8mtxes6n4vvNFlIByyAZy2k4d4RY63nyvTbMpeNTaQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: @@ -608,21 +622,21 @@ packages: '@csstools/css-color-parser': 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) '@csstools/css-tokenizer': 2.2.1 - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.33) - postcss: 8.4.33 + '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.35) + postcss: 8.4.35 dev: true - /@csstools/postcss-progressive-custom-properties@3.0.2(postcss@8.4.33): + /@csstools/postcss-progressive-custom-properties@3.0.2(postcss@8.4.35): resolution: {integrity: sha512-YEvTozk1SxnV/PGL5DllBVDuLQ+jiQhyCSQiZJ6CwBMU5JQ9hFde3i1qqzZHuclZfptjrU0JjlX4ePsOhxNzHw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-relative-color-syntax@2.0.7(postcss@8.4.33): + /@csstools/postcss-relative-color-syntax@2.0.7(postcss@8.4.35): resolution: {integrity: sha512-2AiFbJSVF4EyymLxme4JzSrbXykHolx8DdZECHjYKMhoulhKLltx5ccYgtrK3BmXGd3v3nJrWFCc8JM8bjuiOg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: @@ -631,21 +645,21 @@ packages: '@csstools/css-color-parser': 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) '@csstools/css-tokenizer': 2.2.1 - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.33) - postcss: 8.4.33 + '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.35) + postcss: 8.4.35 dev: true - /@csstools/postcss-scope-pseudo-class@3.0.0(postcss@8.4.33): + /@csstools/postcss-scope-pseudo-class@3.0.0(postcss@8.4.35): resolution: {integrity: sha512-GFNVsD97OuEcfHmcT0/DAZWAvTM/FFBDQndIOLawNc1Wq8YqpZwBdHa063Lq+Irk7azygTT+Iinyg3Lt76p7rg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-selector-parser: 6.0.13 dev: true - /@csstools/postcss-stepped-value-functions@3.0.2(postcss@8.4.33): + /@csstools/postcss-stepped-value-functions@3.0.2(postcss@8.4.35): resolution: {integrity: sha512-I3wX44MZVv+tDuWfrd3BTvRB/YRIM2F5v1MBtTI89sxpFn47mNpTwpPYUOGPVCgKlRDfZSlxIUYhUQmqRQZZFQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: @@ -654,21 +668,21 @@ packages: '@csstools/css-calc': 1.1.4(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) '@csstools/css-tokenizer': 2.2.1 - postcss: 8.4.33 + postcss: 8.4.35 dev: true - /@csstools/postcss-text-decoration-shorthand@3.0.3(postcss@8.4.33): + /@csstools/postcss-text-decoration-shorthand@3.0.3(postcss@8.4.35): resolution: {integrity: sha512-d5J9m49HhqXRcw1S6vTZuviHi/iknUKGjBpChiNK1ARg9sSa3b8m5lsWz5Izs8ISORZdv2bZRwbw5Z2R6gQ9kQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: '@csstools/color-helpers': 3.0.2 - postcss: 8.4.33 + postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-trigonometric-functions@3.0.2(postcss@8.4.33): + /@csstools/postcss-trigonometric-functions@3.0.2(postcss@8.4.35): resolution: {integrity: sha512-AwzNhF4QOKaLOKvMljwwFkeYXwufhRO15G+kKohHkyoNOL75xWkN+W2Y9ik9tSeAyDv+cYNlYaF+o/a79WjVjg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: @@ -677,16 +691,16 @@ packages: '@csstools/css-calc': 1.1.4(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) '@csstools/css-tokenizer': 2.2.1 - postcss: 8.4.33 + postcss: 8.4.35 dev: true - /@csstools/postcss-unset-value@3.0.0(postcss@8.4.33): + /@csstools/postcss-unset-value@3.0.0(postcss@8.4.35): resolution: {integrity: sha512-P0JD1WHh3avVyKKRKjd0dZIjCEeaBer8t1BbwGMUDtSZaLhXlLNBqZ8KkqHzYWXOJgHleXAny2/sx8LYl6qhEA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 dev: true /@csstools/selector-specificity@3.0.0(postcss-selector-parser@6.0.13): @@ -1336,6 +1350,11 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /@fastify/busboy@2.1.0: + resolution: {integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==} + engines: {node: '>=14'} + dev: false + /@floating-ui/core@1.5.0: resolution: {integrity: sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==} dependencies: @@ -1651,8 +1670,8 @@ packages: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 - /@lucia-auth/adapter-drizzle@1.0.0(lucia@3.0.1): - resolution: {integrity: sha512-3NJbAgEcgFn1bJ+s/XVBdatnQZCtSjKJ880H25SVB9X+V2jhYfsSu/mcW3PSis5bLial188Pd4oNTTHonh+6vg==} + /@lucia-auth/adapter-drizzle@1.0.1(lucia@3.0.1): + resolution: {integrity: sha512-xHgYwVh3ZmccEGsmkYWCALp2GlhCnomrpO5sgABCkIWgHvsmMZuJ5BYfgfaKmed1PDok81Dk6xFbj1tMH/uD6A==} peerDependencies: lucia: 3.x dependencies: @@ -1699,20 +1718,20 @@ packages: - supports-color dev: false - /@melt-ui/pp@0.3.0(@melt-ui/svelte@0.70.0)(svelte@4.2.9): + /@melt-ui/pp@0.3.0(@melt-ui/svelte@0.70.0)(svelte@4.2.10): resolution: {integrity: sha512-b07Bdh8l2KcwKVCXOY+SoBw1dk9eWvQfMSi6SoacpRVyVmmfpi0kV4oGt3HYF0tUCB3sEmVicxse50ZzZxEzEA==} engines: {pnpm: '>=8.6.3'} peerDependencies: '@melt-ui/svelte': '>= 0.29.0' svelte: ^3.55.0 || ^4.0.0 || ^5.0.0-next.1 dependencies: - '@melt-ui/svelte': 0.70.0(svelte@4.2.9) + '@melt-ui/svelte': 0.70.0(svelte@4.2.10) estree-walker: 3.0.3 magic-string: 0.30.5 - svelte: 4.2.9 + svelte: 4.2.10 dev: true - /@melt-ui/svelte@0.68.0(svelte@4.2.9): + /@melt-ui/svelte@0.68.0(svelte@4.2.10): resolution: {integrity: sha512-/QvA98hnYEodZtHJ71+ocum/WWp30hVNt3F8uiZKnNYwZDaiQYjlyR9AaGKYcZLCe6R68op1mfCzc0kTzJilyA==} peerDependencies: svelte: '>=3 <5' @@ -1723,10 +1742,10 @@ packages: dequal: 2.0.3 focus-trap: 7.5.4 nanoid: 5.0.5 - svelte: 4.2.9 + svelte: 4.2.10 dev: false - /@melt-ui/svelte@0.70.0(svelte@4.2.9): + /@melt-ui/svelte@0.70.0(svelte@4.2.10): resolution: {integrity: sha512-ni14892MHJMAxSl2cz1pcgfnLR7fee1nNDJmx47hV19ewxSs8eQ8iguPrfx1ONtgjbp2YYVZhlpERi7szd30cA==} peerDependencies: svelte: '>=3 <5' @@ -1737,7 +1756,7 @@ packages: dequal: 2.0.3 focus-trap: 7.5.4 nanoid: 5.0.5 - svelte: 4.2.9 + svelte: 4.2.10 dev: true /@napi-rs/wasm-runtime@0.1.1: @@ -2373,17 +2392,17 @@ packages: '@noble/hashes': 1.3.2 dev: false - /@planetscale/database@1.14.0: - resolution: {integrity: sha512-7BB+iH6EH4YJuDeVeEbxpo60BFz3wIXJNXCmBGl40eC4HStRMGZ1COxKfiuPcINWwwrJhAhI9AEI97AOZYT7JQ==} + /@planetscale/database@1.15.0: + resolution: {integrity: sha512-X4GmGGKE3o6tj/FM+ElDdyVb9BI8Y2OSSeOtyW/gCmVS0XLs4tTppg0cVLL89CS+awEhIIYXFDwqT3a7pbYROg==} engines: {node: '>=16'} dev: false - /@playwright/test@1.41.1: - resolution: {integrity: sha512-9g8EWTjiQ9yFBXc6HjCWe41msLpxEX0KhmfmPl9RPLJdfzL4F0lg2BdJ91O9azFdl11y1pmpwdjBiSxvqc+btw==} + /@playwright/test@1.41.2: + resolution: {integrity: sha512-qQB9h7KbibJzrDpkXkYvsmiDJK14FULCCZgEcoe2AvFAS64oCirWTwzTlAYEbKaRxWs5TFesE1Na6izMv3HfGg==} engines: {node: '>=16'} hasBin: true dependencies: - playwright: 1.41.1 + playwright: 1.41.2 dev: true /@polka/url@1.0.0-next.24: @@ -2673,13 +2692,32 @@ packages: requiresBuild: true optional: true - /@sentry-internal/feedback@7.88.0: - resolution: {integrity: sha512-lbK6jgO1I0M96nZQ99mcLSZ55ebwPAP6LhEWhkmc+eAfy97VpiY+qsbmgsmOzCEPqMmEUCEcI0rEZ7fiye2v2Q==} + /@sentry-internal/feedback@7.100.1: + resolution: {integrity: sha512-yqcRVnjf+qS+tC4NxOKLJOaSJ+csHmh/dHUzvCTkf5rLsplwXYRnny2r0tqGTQ4tuXMxwgSMKPYwicg81P+xuw==} engines: {node: '>=12'} dependencies: - '@sentry/core': 7.88.0 - '@sentry/types': 7.88.0 - '@sentry/utils': 7.88.0 + '@sentry/core': 7.100.1 + '@sentry/types': 7.100.1 + '@sentry/utils': 7.100.1 + dev: false + + /@sentry-internal/replay-canvas@7.100.1: + resolution: {integrity: sha512-TnqxqJGhbFhhYRhTG2WLFer+lVieV7mNGeIxFBiw1L4kuj8KGl+C0sknssKyZSRVJFSahhHIosHJGRMkkD//7g==} + engines: {node: '>=12'} + dependencies: + '@sentry/core': 7.100.1 + '@sentry/replay': 7.100.1 + '@sentry/types': 7.100.1 + '@sentry/utils': 7.100.1 + dev: false + + /@sentry-internal/tracing@7.100.1: + resolution: {integrity: sha512-+u9RRf5eL3StiyiRyAHZmdkAR7GTSGx4Mt4Lmi5NEtCcWlTGZ1QgW2r8ZbhouVmTiJkjhQgYCyej3cojtazeJg==} + engines: {node: '>=8'} + dependencies: + '@sentry/core': 7.100.1 + '@sentry/types': 7.100.1 + '@sentry/utils': 7.100.1 dev: false /@sentry-internal/tracing@7.77.0: @@ -2691,25 +2729,17 @@ packages: '@sentry/utils': 7.77.0 dev: false - /@sentry-internal/tracing@7.88.0: - resolution: {integrity: sha512-xXQdcYhsS+ourzJHjXNjZC9zakuc97udmpgaXRjEP7FjPYclIx+YXwgFBdHM2kzAwZLFOsEce5dr46GVXUDfZw==} + /@sentry/browser@7.100.1: + resolution: {integrity: sha512-IxHQ08ixf0bmaWpe4yt1J4UUsOpg02fxax9z3tOQYXw5MSzz5pDXn8M8DFUVJB3wWuyXhHXTub9yD3VIP9fnoA==} engines: {node: '>=8'} dependencies: - '@sentry/core': 7.88.0 - '@sentry/types': 7.88.0 - '@sentry/utils': 7.88.0 - dev: false - - /@sentry/browser@7.88.0: - resolution: {integrity: sha512-il4x3PB99nuU/OJQw2RltgYYbo8vtnYoIgneOeEiw4m0ppK1nKkMkd3vDRipGL6E/0i7IUmQfYYy6U10J5Rx+g==} - engines: {node: '>=8'} - dependencies: - '@sentry-internal/feedback': 7.88.0 - '@sentry-internal/tracing': 7.88.0 - '@sentry/core': 7.88.0 - '@sentry/replay': 7.88.0 - '@sentry/types': 7.88.0 - '@sentry/utils': 7.88.0 + '@sentry-internal/feedback': 7.100.1 + '@sentry-internal/replay-canvas': 7.100.1 + '@sentry-internal/tracing': 7.100.1 + '@sentry/core': 7.100.1 + '@sentry/replay': 7.100.1 + '@sentry/types': 7.100.1 + '@sentry/utils': 7.100.1 dev: false /@sentry/bundler-plugin-core@0.6.1: @@ -2717,7 +2747,7 @@ packages: engines: {node: '>= 10'} dependencies: '@sentry/cli': 2.21.2 - '@sentry/node': 7.88.0 + '@sentry/node': 7.100.1 '@sentry/tracing': 7.77.0 find-up: 5.0.0 glob: 9.3.2 @@ -2745,6 +2775,14 @@ packages: - supports-color dev: false + /@sentry/core@7.100.1: + resolution: {integrity: sha512-f+ItUge/o9AjlveQq0ZUbQauKlPH1FIJbC1TRaYLJ4KNfOdrsh8yZ29RmWv0cFJ/e+FGTr603gWpRPObF5rM8Q==} + engines: {node: '>=8'} + dependencies: + '@sentry/types': 7.100.1 + '@sentry/utils': 7.100.1 + dev: false + /@sentry/core@7.77.0: resolution: {integrity: sha512-Tj8oTYFZ/ZD+xW8IGIsU6gcFXD/gfE+FUxUaeSosd9KHwBQNOLhZSsYo/tTVf/rnQI/dQnsd4onPZLiL+27aTg==} engines: {node: '>=8'} @@ -2753,75 +2791,65 @@ packages: '@sentry/utils': 7.77.0 dev: false - /@sentry/core@7.88.0: - resolution: {integrity: sha512-Jzbb7dcwiCO7kI0a1w+32UzWxbEn2OcZWzp55QMEeAh6nZ/5CXhXwpuHi0tW7doPj+cJdmxMTMu9LqMVfdGkzQ==} + /@sentry/integrations@7.100.1: + resolution: {integrity: sha512-RUyZHcsN3Plc8G4hJN3BCMdbwS8ljUY3E3iLjzucA4HroBsGk5AMc6n7Pp/QqFIRgxrPjKEgA52Wgy5Nq6dSvw==} engines: {node: '>=8'} dependencies: - '@sentry/types': 7.88.0 - '@sentry/utils': 7.88.0 - dev: false - - /@sentry/integrations@7.88.0: - resolution: {integrity: sha512-YBYPAtJeylMaaCmGntgiDpp1nk3IT6+FBXsmHxMdTKlrpt5ELj/jcc8gEgaRNeSBjx4Kv1OVzmZcYyWwEhkR4Q==} - engines: {node: '>=8'} - dependencies: - '@sentry/core': 7.88.0 - '@sentry/types': 7.88.0 - '@sentry/utils': 7.88.0 + '@sentry/core': 7.100.1 + '@sentry/types': 7.100.1 + '@sentry/utils': 7.100.1 localforage: 1.10.0 dev: false - /@sentry/node@7.88.0: - resolution: {integrity: sha512-X6Xyh7AEitnWqn1CHQrmsUqRn0GKj/6nPE5VC2DLQfHiFH1Fknrt+csFzDchQ/86awXYwuY4Le5ECEH//X/WzQ==} + /@sentry/node@7.100.1: + resolution: {integrity: sha512-jB6tBLr7BpgdE2SlYZu343vvpa5jMFnqyFlprr+jdDu/ayNF4idB0qFwQe8p4C6LI6M/MNDRLVOgPBiCjjZSpw==} engines: {node: '>=8'} dependencies: - '@sentry-internal/tracing': 7.88.0 - '@sentry/core': 7.88.0 - '@sentry/types': 7.88.0 - '@sentry/utils': 7.88.0 - https-proxy-agent: 5.0.1 - transitivePeerDependencies: - - supports-color + '@sentry-internal/tracing': 7.100.1 + '@sentry/core': 7.100.1 + '@sentry/types': 7.100.1 + '@sentry/utils': 7.100.1 dev: false - /@sentry/replay@7.88.0: - resolution: {integrity: sha512-em5dPKLPG7c/HGDbpIj3aHrWbA4iMwqjevqTzn+++KNO1YslkOosCaGsb1whU3AL1T9c3aIFIhZ4u3rNo+DxcA==} + /@sentry/replay@7.100.1: + resolution: {integrity: sha512-B1NFjzGEFaqejxBRdUyEzH8ChXc2kfiqlA/W/Lg0aoWIl2/7nuMk+l4ld9gW5F5bIAXDTVd5vYltb1lWEbpr7w==} engines: {node: '>=12'} dependencies: - '@sentry-internal/tracing': 7.88.0 - '@sentry/core': 7.88.0 - '@sentry/types': 7.88.0 - '@sentry/utils': 7.88.0 + '@sentry-internal/tracing': 7.100.1 + '@sentry/core': 7.100.1 + '@sentry/types': 7.100.1 + '@sentry/utils': 7.100.1 dev: false - /@sentry/svelte@7.88.0(svelte@4.2.9): - resolution: {integrity: sha512-H1nVPfb8GXIj9HAa3Hw11yrWs4yUpm88+eW4eT1ryZeoIThcT4mSvqkFLWMq9APmoOjtXMF+LTi+aCboJMqbEg==} + /@sentry/svelte@7.100.1(svelte@4.2.10): + resolution: {integrity: sha512-2oZJNFZYfXeDX05mvBBLtve1KRfCI0DgrxZYe9qbYQIe7snobNSydTK+wIHX/SJeVUz3Z+qyovPqFzjkJPTFnw==} engines: {node: '>=8'} peerDependencies: svelte: 3.x || 4.x dependencies: - '@sentry/browser': 7.88.0 - '@sentry/types': 7.88.0 - '@sentry/utils': 7.88.0 - magic-string: 0.30.5 - svelte: 4.2.9 + '@sentry/browser': 7.100.1 + '@sentry/core': 7.100.1 + '@sentry/types': 7.100.1 + '@sentry/utils': 7.100.1 + magic-string: 0.30.7 + svelte: 4.2.10 dev: false - /@sentry/sveltekit@7.88.0(@sveltejs/kit@2.5.0)(svelte@4.2.9): - resolution: {integrity: sha512-ZkpTPOBb9RHWAenqasGVSQl3XxuYEecrEJVUignF+Dz7hpO/vpprihnFIp4QVnb5Tzjw6ba05/HCgzIQqJMfnA==} + /@sentry/sveltekit@7.100.1(@sveltejs/kit@2.5.0)(svelte@4.2.10): + resolution: {integrity: sha512-t6JaivTmw5oIqOpKQ8PNbGjNP99AQY6vMPkhxzVuwPa3A3o2WtmzQoIXNxdrkux5XkoBI9CsT6TsM5TbaMDwjQ==} engines: {node: '>=16'} peerDependencies: - '@sveltejs/kit': 1.x + '@sveltejs/kit': 1.x || 2.x dependencies: - '@sentry-internal/tracing': 7.88.0 - '@sentry/core': 7.88.0 - '@sentry/integrations': 7.88.0 - '@sentry/node': 7.88.0 - '@sentry/svelte': 7.88.0(svelte@4.2.9) - '@sentry/types': 7.88.0 - '@sentry/utils': 7.88.0 + '@sentry-internal/tracing': 7.100.1 + '@sentry/core': 7.100.1 + '@sentry/integrations': 7.100.1 + '@sentry/node': 7.100.1 + '@sentry/svelte': 7.100.1(svelte@4.2.10) + '@sentry/types': 7.100.1 + '@sentry/utils': 7.100.1 '@sentry/vite-plugin': 0.6.1 - '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.9)(vite@5.0.12) + '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.10)(vite@5.0.12) magicast: 0.2.8 sorcery: 0.11.0 transitivePeerDependencies: @@ -2837,14 +2865,21 @@ packages: '@sentry-internal/tracing': 7.77.0 dev: false + /@sentry/types@7.100.1: + resolution: {integrity: sha512-fLM+LedHuKzOd8IhXBqaQuym+AA519MGjeczBa5kGakes/BbAsUMwsNfjsKQedp7Kh44RgYF99jwoRPK2oDrXw==} + engines: {node: '>=8'} + dev: false + /@sentry/types@7.77.0: resolution: {integrity: sha512-nfb00XRJVi0QpDHg+JkqrmEBHsqBnxJu191Ded+Cs1OJ5oPXEW6F59LVcBScGvMqe+WEk1a73eH8XezwfgrTsA==} engines: {node: '>=8'} dev: false - /@sentry/types@7.88.0: - resolution: {integrity: sha512-FvwvmX1pWAZKicPj4EpKyho8Wm+C4+r5LiepbbBF8oKwSPJdD2QV1fo/LWxsrzNxWOllFIVIXF5Ed3nPYQWpTw==} + /@sentry/utils@7.100.1: + resolution: {integrity: sha512-Ve6dXr1o6xiBe3VCoJgiutmBKrugryI65EZAbYto5XI+t+PjiLLf9wXtEMF24ZrwImo4Lv3E9Uqza+fWkEbw6A==} engines: {node: '>=8'} + dependencies: + '@sentry/types': 7.100.1 dev: false /@sentry/utils@7.77.0: @@ -2854,13 +2889,6 @@ packages: '@sentry/types': 7.77.0 dev: false - /@sentry/utils@7.88.0: - resolution: {integrity: sha512-ukminfRmdBXTzk49orwJf3Lu3hR60ZRHjE2a4IXwYhyDT6JJgJqgsq1hzGXx0AyFfyS4WhfZ6QUBy7fu3BScZQ==} - engines: {node: '>=8'} - dependencies: - '@sentry/types': 7.88.0 - dev: false - /@sentry/vite-plugin@0.6.1: resolution: {integrity: sha512-qkvKaSOcNhNWcdxRXLSs+8cF3ey0XIRmEzTl8U7sTTcZwuOMHsJB+HsYij6aTGaqsKfP8w1ozVt9szBAiL4//w==} engines: {node: '>= 10'} @@ -2888,7 +2916,7 @@ packages: peerDependencies: '@sveltejs/kit': ^2.0.0 dependencies: - '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.9)(vite@5.0.12) + '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.10)(vite@5.0.12) import-meta-resolve: 4.0.0 dev: true @@ -2897,7 +2925,7 @@ packages: peerDependencies: '@sveltejs/kit': ^2.4.0 dependencies: - '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.9)(vite@5.0.12) + '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.10)(vite@5.0.12) '@vercel/nft': 0.26.2 esbuild: 0.19.11 transitivePeerDependencies: @@ -2905,18 +2933,18 @@ packages: - supports-color dev: false - /@sveltejs/enhanced-img@0.1.8(svelte@4.2.9): + /@sveltejs/enhanced-img@0.1.8(svelte@4.2.10): resolution: {integrity: sha512-0cLVR9KiO0/t3VVm64OM7bPHTkdaT2aaz1rwoAhao+EBXR3vMvLoYXLHvz8o9/552PSV8G844RkH7qkGc3YAiQ==} dependencies: magic-string: 0.30.5 - svelte-parse-markup: 0.1.2(svelte@4.2.9) + svelte-parse-markup: 0.1.2(svelte@4.2.10) vite-imagetools: 6.2.9 transitivePeerDependencies: - rollup - svelte dev: true - /@sveltejs/kit@2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.9)(vite@5.0.12): + /@sveltejs/kit@2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.10)(vite@5.0.12): resolution: {integrity: sha512-1uyXvzC2Lu1FZa30T4y5jUAC21R309ZMRG0TPt+PPPbNUoDpy8zSmSNVWYaBWxYDqLGQ5oPNWvjvvF2IjJ1jmA==} engines: {node: '>=18.13'} hasBin: true @@ -2926,7 +2954,7 @@ packages: svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.3 dependencies: - '@sveltejs/vite-plugin-svelte': 3.0.2(svelte@4.2.9)(vite@5.0.12) + '@sveltejs/vite-plugin-svelte': 3.0.2(svelte@4.2.10)(vite@5.0.12) '@types/cookie': 0.6.0 cookie: 0.6.0 devalue: 4.3.2 @@ -2938,11 +2966,11 @@ packages: sade: 1.8.1 set-cookie-parser: 2.6.0 sirv: 2.0.4 - svelte: 4.2.9 + svelte: 4.2.10 tiny-glob: 0.2.9 - vite: 5.0.12(@types/node@18.19.10)(sass@1.70.0) + vite: 5.0.12(@types/node@18.19.14)(sass@1.70.0) - /@sveltejs/vite-plugin-svelte-inspector@2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.9)(vite@5.0.12): + /@sveltejs/vite-plugin-svelte-inspector@2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.10)(vite@5.0.12): resolution: {integrity: sha512-gjr9ZFg1BSlIpfZ4PRewigrvYmHWbDrq2uvvPB1AmTWKuM+dI1JXQSUu2pIrYLb/QncyiIGkFDFKTwJ0XqQZZg==} engines: {node: ^18.0.0 || >=20} peerDependencies: @@ -2950,28 +2978,28 @@ packages: svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.0 dependencies: - '@sveltejs/vite-plugin-svelte': 3.0.2(svelte@4.2.9)(vite@5.0.12) + '@sveltejs/vite-plugin-svelte': 3.0.2(svelte@4.2.10)(vite@5.0.12) debug: 4.3.4 - svelte: 4.2.9 - vite: 5.0.12(@types/node@18.19.10)(sass@1.70.0) + svelte: 4.2.10 + vite: 5.0.12(@types/node@18.19.14)(sass@1.70.0) transitivePeerDependencies: - supports-color - /@sveltejs/vite-plugin-svelte@3.0.2(svelte@4.2.9)(vite@5.0.12): + /@sveltejs/vite-plugin-svelte@3.0.2(svelte@4.2.10)(vite@5.0.12): resolution: {integrity: sha512-MpmF/cju2HqUls50WyTHQBZUV3ovV/Uk8k66AN2gwHogNAG8wnW8xtZDhzNBsFJJuvmq1qnzA5kE7YfMJNFv2Q==} engines: {node: ^18.0.0 || >=20} peerDependencies: svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.0 dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.9)(vite@5.0.12) + '@sveltejs/vite-plugin-svelte-inspector': 2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.10)(vite@5.0.12) debug: 4.3.4 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.5 - svelte: 4.2.9 - svelte-hmr: 0.15.3(svelte@4.2.9) - vite: 5.0.12(@types/node@18.19.10)(sass@1.70.0) + svelte: 4.2.10 + svelte-hmr: 0.15.3(svelte@4.2.10) + vite: 5.0.12(@types/node@18.19.14)(sass@1.70.0) vitefu: 0.2.5(vite@5.0.12) transitivePeerDependencies: - supports-color @@ -3019,8 +3047,8 @@ packages: resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} dev: true - /@types/node@18.19.10: - resolution: {integrity: sha512-IZD8kAM02AW1HRDTPOlz3npFava678pr8Ie9Vp8uRhBROXAv8MXT2pCnGZZAKYdromsNQLHQcfWQ6EOatVLtqA==} + /@types/node@18.19.14: + resolution: {integrity: sha512-EnQ4Us2rmOS64nHDWr0XqAD8DsO6f3XR6lf9UIIrZQpUzPVdN/oPuEzfDWNHSyXLvoGgjuEm/sPwFGSSs35Wtg==} dependencies: undici-types: 5.26.5 @@ -3032,8 +3060,8 @@ packages: resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} dev: true - /@typescript-eslint/eslint-plugin@6.20.0(@typescript-eslint/parser@6.20.0)(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-fTwGQUnjhoYHeSF6m5pWNkzmDDdsKELYrOBxhjMrofPqCkoC2k3B2wvGHFxa1CTIqkEn88nlW1HVMztjo2K8Hg==} + /@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha @@ -3044,11 +3072,11 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 6.20.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/scope-manager': 6.20.0 - '@typescript-eslint/type-utils': 6.20.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/utils': 6.20.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 6.20.0 + '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/type-utils': 6.21.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.3.4 eslint: 8.56.0 graphemer: 1.4.0 @@ -3061,8 +3089,8 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@6.20.0(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-bYerPDF/H5v6V76MdMYhjwmwgMA+jlPVqjSDq2cRqMi8bP5sR3Z+RLOiOMad3nsnmDVmn2gAFCyNgh/dIrfP/w==} + /@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -3071,10 +3099,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 6.20.0 - '@typescript-eslint/types': 6.20.0 - '@typescript-eslint/typescript-estree': 6.20.0(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 6.20.0 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.3.4 eslint: 8.56.0 typescript: 5.3.3 @@ -3082,16 +3110,16 @@ packages: - supports-color dev: true - /@typescript-eslint/scope-manager@6.20.0: - resolution: {integrity: sha512-p4rvHQRDTI1tGGMDFQm+GtxP1ZHyAh64WANVoyEcNMpaTFn3ox/3CcgtIlELnRfKzSs/DwYlDccJEtr3O6qBvA==} + /@typescript-eslint/scope-manager@6.21.0: + resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.20.0 - '@typescript-eslint/visitor-keys': 6.20.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 dev: true - /@typescript-eslint/type-utils@6.20.0(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-qnSobiJQb1F5JjN0YDRPHruQTrX7ICsmltXhkV536mp4idGAYrIyr47zF/JmkJtEcAVnIz4gUYJ7gOZa6SmN4g==} + /@typescript-eslint/type-utils@6.21.0(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -3100,8 +3128,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 6.20.0(typescript@5.3.3) - '@typescript-eslint/utils': 6.20.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.56.0)(typescript@5.3.3) debug: 4.3.4 eslint: 8.56.0 ts-api-utils: 1.0.3(typescript@5.3.3) @@ -3110,13 +3138,13 @@ packages: - supports-color dev: true - /@typescript-eslint/types@6.20.0: - resolution: {integrity: sha512-MM9mfZMAhiN4cOEcUOEx+0HmuaW3WBfukBZPCfwSqFnQy0grXYtngKCqpQN339X3RrwtzspWJrpbrupKYUSBXQ==} + /@typescript-eslint/types@6.21.0: + resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/typescript-estree@6.20.0(typescript@5.3.3): - resolution: {integrity: sha512-RnRya9q5m6YYSpBN7IzKu9FmLcYtErkDkc8/dKv81I9QiLLtVBHrjz+Ev/crAqgMNW2FCsoZF4g2QUylMnJz+g==} + /@typescript-eslint/typescript-estree@6.21.0(typescript@5.3.3): + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' @@ -3124,21 +3152,21 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 6.20.0 - '@typescript-eslint/visitor-keys': 6.20.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.3.3) + semver: 7.6.0 + ts-api-utils: 1.2.1(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@6.20.0(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-/EKuw+kRu2vAqCoDwDCBtDRU6CTKbUmwwI7SH7AashZ+W+7o8eiyy6V2cdOqN49KsTcASWsC5QeghYuRDTyOOg==} + /@typescript-eslint/utils@6.21.0(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -3146,9 +3174,9 @@ packages: '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.6 - '@typescript-eslint/scope-manager': 6.20.0 - '@typescript-eslint/types': 6.20.0 - '@typescript-eslint/typescript-estree': 6.20.0(typescript@5.3.3) + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3) eslint: 8.56.0 semver: 7.5.4 transitivePeerDependencies: @@ -3156,11 +3184,11 @@ packages: - typescript dev: true - /@typescript-eslint/visitor-keys@6.20.0: - resolution: {integrity: sha512-E8Cp98kRe4gKHjJD4NExXKz/zOJ1A2hhZc+IMVD6i7w4yjIvh6VyuRI0gRtxAsXtoC35uGMaQ9rjI2zJaXDEAw==} + /@typescript-eslint/visitor-keys@6.21.0: + resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.20.0 + '@typescript-eslint/types': 6.21.0 eslint-visitor-keys: 3.4.3 dev: true @@ -3340,6 +3368,12 @@ packages: /arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: false + /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true @@ -3379,7 +3413,18 @@ packages: resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} dev: false - /autoprefixer@10.4.17(postcss@8.4.33): + /auri@1.0.2: + resolution: {integrity: sha512-OC54Bv+hAPvYlo98ZwK3cTo2ijg0CBylaAO5dZ/xZQ7e897k0o4qtxkUPQHruJrFUnL5BebCXz+bUAeXQHp9dg==} + hasBin: true + dependencies: + '@actions/core': 1.10.1 + dotenv: 16.4.1 + front-matter: 4.0.2 + nanoid: 4.0.2 + oslo: 1.1.0 + dev: false + + /autoprefixer@10.4.17(postcss@8.4.35): resolution: {integrity: sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==} engines: {node: ^10 || ^12 || >=14} hasBin: true @@ -3391,7 +3436,7 @@ packages: fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: 8.4.33 + postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true @@ -3422,15 +3467,15 @@ packages: file-uri-to-path: 1.0.0 dev: false - /bits-ui@0.15.1(svelte@4.2.9): + /bits-ui@0.15.1(svelte@4.2.10): resolution: {integrity: sha512-1Np8bT6W6SC2tKESfm0CySW+7+xU5S0GuUZqIxC41atZE3WIRiRlzXEYHxW88w6UaLFzZ51ns4E7pchkdV5XCQ==} peerDependencies: svelte: ^4.0.0 dependencies: '@internationalized/date': 3.5.1 - '@melt-ui/svelte': 0.68.0(svelte@4.2.9) + '@melt-ui/svelte': 0.68.0(svelte@4.2.10) nanoid: 5.0.5 - svelte: 4.2.9 + svelte: 4.2.10 dev: false /boardgamegeekclient@1.9.1: @@ -3697,13 +3742,13 @@ packages: /css-background-parser@0.1.0: resolution: {integrity: sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA==} - /css-blank-pseudo@6.0.0(postcss@8.4.33): + /css-blank-pseudo@6.0.0(postcss@8.4.35): resolution: {integrity: sha512-VbfLlOWO7sBHBTn6pwDQzc07Z0SDydgDBfNfCE0nvrehdBNv9RKsuupIRa/qal0+fBZhAALyQDPMKz5lnvcchw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-selector-parser: 6.0.13 dev: true @@ -3714,25 +3759,25 @@ packages: resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} engines: {node: '>=4'} - /css-has-pseudo@6.0.0(postcss@8.4.33): + /css-has-pseudo@6.0.0(postcss@8.4.35): resolution: {integrity: sha512-X+r+JBuoO37FBOWVNhVJhxtSBUFHgHbrcc0CjFT28JEdOw1qaDwABv/uunyodUuSy2hMPe9j/HjssxSlvUmKjg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: '@csstools/selector-specificity': 3.0.0(postcss-selector-parser@6.0.13) - postcss: 8.4.33 + postcss: 8.4.35 postcss-selector-parser: 6.0.13 postcss-value-parser: 4.2.0 dev: true - /css-prefers-color-scheme@9.0.0(postcss@8.4.33): + /css-prefers-color-scheme@9.0.0(postcss@8.4.35): resolution: {integrity: sha512-03QGAk/FXIRseDdLb7XAiu6gidQ0Nd8945xuM7VFVPpc6goJsG9uIO8xQjTxwbPdPIIV4o4AJoOJyt8gwDl67g==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 dev: true /css-to-react-native@3.2.0: @@ -3872,7 +3917,6 @@ packages: /dotenv@16.4.1: resolution: {integrity: sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==} engines: {node: '>=12'} - dev: true /dreamopt@0.8.0: resolution: {integrity: sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==} @@ -3881,8 +3925,8 @@ packages: wordwrap: 1.0.0 dev: true - /drizzle-kit@0.20.13: - resolution: {integrity: sha512-j9oZSQXNWG+KBJm0Sg3S/zJpncHGKnpqNfFuM4NUxUMGTcihDHhP9SW6Jncqwb5vsP1Xm0a8JLm3PZUIspC/oA==} + /drizzle-kit@0.20.14: + resolution: {integrity: sha512-0fHv3YIEaUcSVPSGyaaBfOi9bmpajjhbJNdPsRMIUvYdLVxBu9eGjH8mRc3Qk7HVmEidFc/lhG1YyJhoXrn5yA==} hasBin: true dependencies: '@drizzle-team/studio': 0.0.39 @@ -3903,7 +3947,7 @@ packages: - supports-color dev: true - /drizzle-orm@0.29.3(@planetscale/database@1.14.0)(mysql2@3.9.1): + /drizzle-orm@0.29.3(@planetscale/database@1.15.0)(mysql2@3.9.1): resolution: {integrity: sha512-uSE027csliGSGYD0pqtM+SAQATMREb3eSM/U8s6r+Y0RFwTKwftnwwSkqx3oS65UBgqDOM0gMTl5UGNpt6lW0A==} peerDependencies: '@aws-sdk/client-rds-data': '>=3' @@ -3974,7 +4018,7 @@ packages: sqlite3: optional: true dependencies: - '@planetscale/database': 1.14.0 + '@planetscale/database': 1.15.0 mysql2: 3.9.1 dev: false @@ -4167,7 +4211,7 @@ packages: eslint: 8.56.0 dev: true - /eslint-plugin-svelte@2.35.1(eslint@8.56.0)(svelte@4.2.9)(ts-node@10.9.2): + /eslint-plugin-svelte@2.35.1(eslint@8.56.0)(svelte@4.2.10)(ts-node@10.9.2): resolution: {integrity: sha512-IF8TpLnROSGy98Z3NrsKXWDSCbNY2ReHDcrYTuXZMbfX7VmESISR78TWgO9zdg4Dht1X8coub5jKwHzP0ExRug==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: @@ -4184,13 +4228,13 @@ packages: eslint-compat-utils: 0.1.2(eslint@8.56.0) esutils: 2.0.3 known-css-properties: 0.29.0 - postcss: 8.4.33 - postcss-load-config: 3.1.4(postcss@8.4.33)(ts-node@10.9.2) - postcss-safe-parser: 6.0.0(postcss@8.4.33) + postcss: 8.4.35 + postcss-load-config: 3.1.4(postcss@8.4.35)(ts-node@10.9.2) + postcss-safe-parser: 6.0.0(postcss@8.4.35) postcss-selector-parser: 6.0.13 semver: 7.5.4 - svelte: 4.2.9 - svelte-eslint-parser: 0.33.1(svelte@4.2.9) + svelte: 4.2.10 + svelte-eslint-parser: 0.33.1(svelte@4.2.10) transitivePeerDependencies: - supports-color - ts-node @@ -4437,15 +4481,15 @@ packages: is-callable: 1.2.7 dev: false - /formsnap@0.4.3(svelte@4.2.9)(sveltekit-superforms@1.13.4)(zod@3.22.4): + /formsnap@0.4.3(svelte@4.2.10)(sveltekit-superforms@1.13.4)(zod@3.22.4): resolution: {integrity: sha512-PWVq78XVUHhAU1tcVGKeGamk6B4Opkk1uVNRW2YofiQpnA5Bry1c3TQjB9cVDw5u4oAwmDvIoAzVHlrAIgc+tw==} peerDependencies: svelte: ^4.0.0 sveltekit-superforms: ^1.7.1 zod: ^3.22.2 dependencies: - svelte: 4.2.9 - sveltekit-superforms: 1.13.4(@sveltejs/kit@2.5.0)(svelte@4.2.9)(zod@3.22.4) + svelte: 4.2.10 + sveltekit-superforms: 1.13.4(@sveltejs/kit@2.5.0)(svelte@4.2.10)(zod@3.22.4) zod: 3.22.4 dev: false @@ -4453,6 +4497,12 @@ packages: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} dev: true + /front-matter@4.0.2: + resolution: {integrity: sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==} + dependencies: + js-yaml: 3.14.1 + dev: false + /fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} @@ -4602,7 +4652,7 @@ packages: array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.3.2 - ignore: 5.3.0 + ignore: 5.3.1 merge2: 1.4.1 slash: 3.0.0 dev: true @@ -4713,6 +4763,11 @@ packages: engines: {node: '>= 4'} dev: true + /ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + dev: true + /imagetools-core@6.0.4: resolution: {integrity: sha512-N1qs5qn7u9nR3kboISkYuvJm8MohiphCfBa+wx1UOropVaFis9/mh6wuDPLHJNhl6/64C7q2Pch5NASVKAaSrg==} engines: {node: '>=12.0.0'} @@ -4874,6 +4929,14 @@ packages: resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} hasBin: true + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: false + /js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -5020,8 +5083,8 @@ packages: get-func-name: 2.0.2 dev: true - /lru-cache@10.0.1: - resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==} + /lru-cache@10.2.0: + resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} engines: {node: 14 || >=16.14} dev: false @@ -5053,12 +5116,12 @@ packages: oslo: 1.0.1 dev: false - /lucide-svelte@0.298.0(svelte@4.2.9): + /lucide-svelte@0.298.0(svelte@4.2.10): resolution: {integrity: sha512-7xYNSMY1z1QMjLe8GWToFtFh0lvTsrxdgEAXMite/Urn9tPD16Xk3597ibpgt9Ff7IBb/ArMc3y3ZKofZhs8fQ==} peerDependencies: svelte: '>=3 <5' dependencies: - svelte: 4.2.9 + svelte: 4.2.10 dev: false /magic-string@0.27.0: @@ -5074,6 +5137,13 @@ packages: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 + /magic-string@0.30.7: + resolution: {integrity: sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: false + /magicast@0.2.8: resolution: {integrity: sha512-zEnqeb3E6TfMKYXGyHv3utbuHNixr04o3/gVGviSzVQkbFiU46VZUd+Ea/1npKfvEsEWxBYuIksKzoztTDPg0A==} dependencies: @@ -5278,6 +5348,12 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + /nanoid@4.0.2: + resolution: {integrity: sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==} + engines: {node: ^14 || ^16 || >=18} + hasBin: true + dev: false + /nanoid@5.0.5: resolution: {integrity: sha512-/Veqm+QKsyMY3kqi4faWplnY1u+VuKO3dD2binyPIybP31DRO29bPF+1mszgLnrR2KqSLceFLBNw0zmvDzN1QQ==} engines: {node: ^18 || >=20} @@ -5415,11 +5491,12 @@ packages: '@node-rs/bcrypt': 1.9.2 dev: false - /oslo@1.0.3: - resolution: {integrity: sha512-k3XTmHGqr++d5UsekRDRVY18riITJWerX2aNRg5pqCR8XsFpbGG7g81bbjm/5Cr113QoTkn/W7Vrc25PB0LSPA==} + /oslo@1.1.0: + resolution: {integrity: sha512-uUvVt1boGt1aO0oMjzyzxIiDGAkfOdh6jPOzfJZBXsOsHuHfvTnrW7ealrBb27sgg5pHnTjmen6xPz4so+gQEQ==} dependencies: '@node-rs/argon2': 1.7.0 '@node-rs/bcrypt': 1.9.0 + auri: 1.0.2 dev: false /p-limit@3.1.0: @@ -5482,7 +5559,7 @@ packages: resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} engines: {node: '>=16 || 14 >=14.17'} dependencies: - lru-cache: 10.0.1 + lru-cache: 10.2.0 minipass: 7.0.4 dev: false @@ -5529,74 +5606,74 @@ packages: pathe: 1.1.1 dev: true - /playwright-core@1.41.1: - resolution: {integrity: sha512-/KPO5DzXSMlxSX77wy+HihKGOunh3hqndhqeo/nMxfigiKzogn8kfL0ZBDu0L1RKgan5XHCPmn6zXd2NUJgjhg==} + /playwright-core@1.41.2: + resolution: {integrity: sha512-VaTvwCA4Y8kxEe+kfm2+uUUw5Lubf38RxF7FpBxLPmGe5sdNkSg5e3ChEigaGrX7qdqT3pt2m/98LiyvU2x6CA==} engines: {node: '>=16'} hasBin: true dev: true - /playwright@1.41.1: - resolution: {integrity: sha512-gdZAWG97oUnbBdRL3GuBvX3nDDmUOuqzV/D24dytqlKt+eI5KbwusluZRGljx1YoJKZ2NRPaeWiFTeGZO7SosQ==} + /playwright@1.41.2: + resolution: {integrity: sha512-v0bOa6H2GJChDL8pAeLa/LZC4feoAMbSQm1/jF/ySsWWoaNItvrMP7GEkvEEFyCTUYKMxjQKaTSg5up7nR6/8A==} engines: {node: '>=16'} hasBin: true dependencies: - playwright-core: 1.41.1 + playwright-core: 1.41.2 optionalDependencies: fsevents: 2.3.2 dev: true - /postcss-attribute-case-insensitive@6.0.2(postcss@8.4.33): + /postcss-attribute-case-insensitive@6.0.2(postcss@8.4.35): resolution: {integrity: sha512-IRuCwwAAQbgaLhxQdQcIIK0dCVXg3XDUnzgKD8iwdiYdwU4rMWRWyl/W9/0nA4ihVpq5pyALiHB2veBJ0292pw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-selector-parser: 6.0.13 dev: true - /postcss-clamp@4.1.0(postcss@8.4.33): + /postcss-clamp@4.1.0(postcss@8.4.35): resolution: {integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==} engines: {node: '>=7.6.0'} peerDependencies: postcss: ^8.4.6 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true - /postcss-color-functional-notation@6.0.2(postcss@8.4.33): + /postcss-color-functional-notation@6.0.2(postcss@8.4.35): resolution: {integrity: sha512-FsjSmlSufuiFBsIqQ++VxFmvX7zKndZpBkHmfXr4wqhvzM92FTEkAh703iqWTl1U3faTgqioIqCbfqdWiFVwtw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.33) - postcss: 8.4.33 + '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.35) + postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true - /postcss-color-hex-alpha@9.0.2(postcss@8.4.33): + /postcss-color-hex-alpha@9.0.2(postcss@8.4.35): resolution: {integrity: sha512-SfPjgr//VQ/DOCf80STIAsdAs7sbIbxATvVmd+Ec7JvR8onz9pjawhq3BJM3Pie40EE3TyB0P6hft16D33Nlyg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true - /postcss-color-rebeccapurple@9.0.1(postcss@8.4.33): + /postcss-color-rebeccapurple@9.0.1(postcss@8.4.35): resolution: {integrity: sha512-ds4cq5BjRieizVb2PnvbJ0omg9VCo2/KzluvoFZbxuGpsGJ5BQSD93CHBooinEtangCM5YqUOerGDl4xGmOb6Q==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true - /postcss-custom-media@10.0.2(postcss@8.4.33): + /postcss-custom-media@10.0.2(postcss@8.4.35): resolution: {integrity: sha512-zcEFNRmDm2fZvTPdI1pIW3W//UruMcLosmMiCdpQnrCsTRzWlKQPYMa1ud9auL0BmrryKK1+JjIGn19K0UjO/w==} engines: {node: ^14 || ^16 || >=18} peerDependencies: @@ -5606,10 +5683,10 @@ packages: '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) '@csstools/css-tokenizer': 2.2.1 '@csstools/media-query-list-parser': 2.1.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - postcss: 8.4.33 + postcss: 8.4.35 dev: true - /postcss-custom-properties@13.3.2(postcss@8.4.33): + /postcss-custom-properties@13.3.2(postcss@8.4.35): resolution: {integrity: sha512-2Coszybpo8lpLY24vy2CYv9AasiZ39/bs8Imv0pWMq55Gl8NWzfc24OAo3zIX7rc6uUJAqESnVOMZ6V6lpMjJA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: @@ -5618,11 +5695,11 @@ packages: '@csstools/cascade-layer-name-parser': 1.0.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) '@csstools/css-tokenizer': 2.2.1 - postcss: 8.4.33 + postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true - /postcss-custom-selectors@7.1.6(postcss@8.4.33): + /postcss-custom-selectors@7.1.6(postcss@8.4.35): resolution: {integrity: sha512-svsjWRaxqL3vAzv71dV0/65P24/FB8TbPX+lWyyf9SZ7aZm4S4NhCn7N3Bg+Z5sZunG3FS8xQ80LrCU9hb37cw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: @@ -5631,99 +5708,99 @@ packages: '@csstools/cascade-layer-name-parser': 1.0.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) '@csstools/css-tokenizer': 2.2.1 - postcss: 8.4.33 + postcss: 8.4.35 postcss-selector-parser: 6.0.13 dev: true - /postcss-dir-pseudo-class@8.0.0(postcss@8.4.33): + /postcss-dir-pseudo-class@8.0.0(postcss@8.4.35): resolution: {integrity: sha512-Oy5BBi0dWPwij/IA+yDYj+/OBMQ9EPqAzTHeSNUYrUWdll/PRJmcbiUj0MNcsBi681I1gcSTLvMERPaXzdbvJg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-selector-parser: 6.0.13 dev: true - /postcss-double-position-gradients@5.0.2(postcss@8.4.33): + /postcss-double-position-gradients@5.0.2(postcss@8.4.35): resolution: {integrity: sha512-KTbvdOOy8z8zb0BTkEg4/1vqlRlApdvjw8/pFoehgQl0WVO+fezDGlvo0B8xRA+XccA7ohkQCULKNsiNOx70Cw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.33) - postcss: 8.4.33 + '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.35) + postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true - /postcss-focus-visible@9.0.0(postcss@8.4.33): + /postcss-focus-visible@9.0.0(postcss@8.4.35): resolution: {integrity: sha512-zA4TbVaIaT8npZBEROhZmlc+GBKE8AELPHXE7i4TmIUEQhw/P/mSJfY9t6tBzpQ1rABeGtEOHYrW4SboQeONMQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-selector-parser: 6.0.13 dev: true - /postcss-focus-within@8.0.0(postcss@8.4.33): + /postcss-focus-within@8.0.0(postcss@8.4.35): resolution: {integrity: sha512-E7+J9nuQzZaA37D/MUZMX1K817RZGDab8qw6pFwzAkDd/QtlWJ9/WTKmzewNiuxzeq6WWY7ATiRePVoDKp+DnA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-selector-parser: 6.0.13 dev: true - /postcss-font-variant@5.0.0(postcss@8.4.33): + /postcss-font-variant@5.0.0(postcss@8.4.35): resolution: {integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 dev: true - /postcss-gap-properties@5.0.0(postcss@8.4.33): + /postcss-gap-properties@5.0.0(postcss@8.4.35): resolution: {integrity: sha512-YjsEEL6890P7MCv6fch6Am1yq0EhQCJMXyT4LBohiu87+4/WqR7y5W3RIv53WdA901hhytgRvjlrAhibhW4qsA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 dev: true - /postcss-image-set-function@6.0.1(postcss@8.4.33): + /postcss-image-set-function@6.0.1(postcss@8.4.35): resolution: {integrity: sha512-VlZncC9hhZ5tg0JllY4g6Z28BeoPO8DIkelioEEkXL0AA0IORlqYpTi2L8TUnl4YQrlwvBgxVy+mdZJw5R/cIQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true - /postcss-import@15.1.0(postcss@8.4.33): + /postcss-import@15.1.0(postcss@8.4.35): resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} peerDependencies: postcss: ^8.0.0 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 - /postcss-js@4.0.1(postcss@8.4.33): + /postcss-js@4.0.1(postcss@8.4.35): resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} engines: {node: ^12 || ^14 || >= 16} peerDependencies: postcss: ^8.4.21 dependencies: camelcase-css: 2.0.1 - postcss: 8.4.33 + postcss: 8.4.35 - /postcss-lab-function@6.0.7(postcss@8.4.33): + /postcss-lab-function@6.0.7(postcss@8.4.35): resolution: {integrity: sha512-4d1lhDVPukHFqkMv4G5vVcK+tgY52vwb5uR1SWKOaO5389r2q8fMxBWuXSW+YtbCOEGP0/X9KERi9E9le2pJuw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: @@ -5732,11 +5809,11 @@ packages: '@csstools/css-color-parser': 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) '@csstools/css-tokenizer': 2.2.1 - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.33) - postcss: 8.4.33 + '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.35) + postcss: 8.4.35 dev: true - /postcss-load-config@3.1.4(postcss@8.4.33)(ts-node@10.9.2): + /postcss-load-config@3.1.4(postcss@8.4.35)(ts-node@10.9.2): resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} engines: {node: '>= 10'} peerDependencies: @@ -5749,12 +5826,12 @@ packages: optional: true dependencies: lilconfig: 2.1.0 - postcss: 8.4.33 - ts-node: 10.9.2(@types/node@18.19.10)(typescript@5.3.3) + postcss: 8.4.35 + ts-node: 10.9.2(@types/node@18.19.14)(typescript@5.3.3) yaml: 1.10.2 dev: true - /postcss-load-config@4.0.2(postcss@8.4.33)(ts-node@10.9.2): + /postcss-load-config@4.0.2(postcss@8.4.35)(ts-node@10.9.2): resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} engines: {node: '>= 14'} peerDependencies: @@ -5767,189 +5844,189 @@ packages: optional: true dependencies: lilconfig: 3.0.0 - postcss: 8.4.33 - ts-node: 10.9.2(@types/node@18.19.10)(typescript@5.3.3) + postcss: 8.4.35 + ts-node: 10.9.2(@types/node@18.19.14)(typescript@5.3.3) yaml: 2.3.4 - /postcss-logical@7.0.0(postcss@8.4.33): + /postcss-logical@7.0.0(postcss@8.4.35): resolution: {integrity: sha512-zYf3vHkoW82f5UZTEXChTJvH49Yl9X37axTZsJGxrCG2kOUwtaAoz9E7tqYg0lsIoJLybaL8fk/2mOi81zVIUw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true - /postcss-nested@6.0.1(postcss@8.4.33): + /postcss-nested@6.0.1(postcss@8.4.35): resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.2.14 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-selector-parser: 6.0.13 - /postcss-nesting@12.0.1(postcss@8.4.33): + /postcss-nesting@12.0.1(postcss@8.4.35): resolution: {integrity: sha512-6LCqCWP9pqwXw/njMvNK0hGY44Fxc4B2EsGbn6xDcxbNRzP8GYoxT7yabVVMLrX3quqOJ9hg2jYMsnkedOf8pA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: '@csstools/selector-specificity': 3.0.0(postcss-selector-parser@6.0.13) - postcss: 8.4.33 + postcss: 8.4.35 postcss-selector-parser: 6.0.13 dev: true - /postcss-opacity-percentage@2.0.0(postcss@8.4.33): + /postcss-opacity-percentage@2.0.0(postcss@8.4.35): resolution: {integrity: sha512-lyDrCOtntq5Y1JZpBFzIWm2wG9kbEdujpNt4NLannF+J9c8CgFIzPa80YQfdza+Y+yFfzbYj/rfoOsYsooUWTQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 dev: true - /postcss-overflow-shorthand@5.0.0(postcss@8.4.33): + /postcss-overflow-shorthand@5.0.0(postcss@8.4.35): resolution: {integrity: sha512-2rlxDyeSics/hC2FuMdPnWiP9WUPZ5x7FTuArXLFVpaSQ2woPSfZS4RD59HuEokbZhs/wPUQJ1E3MT6zVv94MQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true - /postcss-page-break@3.0.4(postcss@8.4.33): + /postcss-page-break@3.0.4(postcss@8.4.35): resolution: {integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==} peerDependencies: postcss: ^8 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 dev: true - /postcss-place@9.0.0(postcss@8.4.33): + /postcss-place@9.0.0(postcss@8.4.35): resolution: {integrity: sha512-qLEPD9VPH5opDVemwmRaujODF9nExn24VOC3ghgVLEvfYN7VZLwJHes0q/C9YR5hI2UC3VgBE8Wkdp1TxCXhtg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true - /postcss-preset-env@9.3.0(postcss@8.4.33): + /postcss-preset-env@9.3.0(postcss@8.4.35): resolution: {integrity: sha512-ycw6doPrqV6QxDCtgiyGDef61bEfiSc59HGM4gOw/wxQxmKnhuEery61oOC/5ViENz/ycpRsuhTexs1kUBTvVw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/postcss-cascade-layers': 4.0.1(postcss@8.4.33) - '@csstools/postcss-color-function': 3.0.7(postcss@8.4.33) - '@csstools/postcss-color-mix-function': 2.0.7(postcss@8.4.33) - '@csstools/postcss-exponential-functions': 1.0.1(postcss@8.4.33) - '@csstools/postcss-font-format-keywords': 3.0.0(postcss@8.4.33) - '@csstools/postcss-gamut-mapping': 1.0.0(postcss@8.4.33) - '@csstools/postcss-gradients-interpolation-method': 4.0.7(postcss@8.4.33) - '@csstools/postcss-hwb-function': 3.0.6(postcss@8.4.33) - '@csstools/postcss-ic-unit': 3.0.2(postcss@8.4.33) - '@csstools/postcss-initial': 1.0.0(postcss@8.4.33) - '@csstools/postcss-is-pseudo-class': 4.0.3(postcss@8.4.33) - '@csstools/postcss-logical-float-and-clear': 2.0.0(postcss@8.4.33) - '@csstools/postcss-logical-overflow': 1.0.0(postcss@8.4.33) - '@csstools/postcss-logical-overscroll-behavior': 1.0.0(postcss@8.4.33) - '@csstools/postcss-logical-resize': 2.0.0(postcss@8.4.33) - '@csstools/postcss-logical-viewport-units': 2.0.3(postcss@8.4.33) - '@csstools/postcss-media-minmax': 1.1.0(postcss@8.4.33) - '@csstools/postcss-media-queries-aspect-ratio-number-values': 2.0.3(postcss@8.4.33) - '@csstools/postcss-nested-calc': 3.0.0(postcss@8.4.33) - '@csstools/postcss-normalize-display-values': 3.0.1(postcss@8.4.33) - '@csstools/postcss-oklab-function': 3.0.7(postcss@8.4.33) - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.33) - '@csstools/postcss-relative-color-syntax': 2.0.7(postcss@8.4.33) - '@csstools/postcss-scope-pseudo-class': 3.0.0(postcss@8.4.33) - '@csstools/postcss-stepped-value-functions': 3.0.2(postcss@8.4.33) - '@csstools/postcss-text-decoration-shorthand': 3.0.3(postcss@8.4.33) - '@csstools/postcss-trigonometric-functions': 3.0.2(postcss@8.4.33) - '@csstools/postcss-unset-value': 3.0.0(postcss@8.4.33) - autoprefixer: 10.4.17(postcss@8.4.33) + '@csstools/postcss-cascade-layers': 4.0.1(postcss@8.4.35) + '@csstools/postcss-color-function': 3.0.7(postcss@8.4.35) + '@csstools/postcss-color-mix-function': 2.0.7(postcss@8.4.35) + '@csstools/postcss-exponential-functions': 1.0.1(postcss@8.4.35) + '@csstools/postcss-font-format-keywords': 3.0.0(postcss@8.4.35) + '@csstools/postcss-gamut-mapping': 1.0.0(postcss@8.4.35) + '@csstools/postcss-gradients-interpolation-method': 4.0.7(postcss@8.4.35) + '@csstools/postcss-hwb-function': 3.0.6(postcss@8.4.35) + '@csstools/postcss-ic-unit': 3.0.2(postcss@8.4.35) + '@csstools/postcss-initial': 1.0.0(postcss@8.4.35) + '@csstools/postcss-is-pseudo-class': 4.0.3(postcss@8.4.35) + '@csstools/postcss-logical-float-and-clear': 2.0.0(postcss@8.4.35) + '@csstools/postcss-logical-overflow': 1.0.0(postcss@8.4.35) + '@csstools/postcss-logical-overscroll-behavior': 1.0.0(postcss@8.4.35) + '@csstools/postcss-logical-resize': 2.0.0(postcss@8.4.35) + '@csstools/postcss-logical-viewport-units': 2.0.3(postcss@8.4.35) + '@csstools/postcss-media-minmax': 1.1.0(postcss@8.4.35) + '@csstools/postcss-media-queries-aspect-ratio-number-values': 2.0.3(postcss@8.4.35) + '@csstools/postcss-nested-calc': 3.0.0(postcss@8.4.35) + '@csstools/postcss-normalize-display-values': 3.0.1(postcss@8.4.35) + '@csstools/postcss-oklab-function': 3.0.7(postcss@8.4.35) + '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.35) + '@csstools/postcss-relative-color-syntax': 2.0.7(postcss@8.4.35) + '@csstools/postcss-scope-pseudo-class': 3.0.0(postcss@8.4.35) + '@csstools/postcss-stepped-value-functions': 3.0.2(postcss@8.4.35) + '@csstools/postcss-text-decoration-shorthand': 3.0.3(postcss@8.4.35) + '@csstools/postcss-trigonometric-functions': 3.0.2(postcss@8.4.35) + '@csstools/postcss-unset-value': 3.0.0(postcss@8.4.35) + autoprefixer: 10.4.17(postcss@8.4.35) browserslist: 4.22.1 - css-blank-pseudo: 6.0.0(postcss@8.4.33) - css-has-pseudo: 6.0.0(postcss@8.4.33) - css-prefers-color-scheme: 9.0.0(postcss@8.4.33) + css-blank-pseudo: 6.0.0(postcss@8.4.35) + css-has-pseudo: 6.0.0(postcss@8.4.35) + css-prefers-color-scheme: 9.0.0(postcss@8.4.35) cssdb: 7.9.0 - postcss: 8.4.33 - postcss-attribute-case-insensitive: 6.0.2(postcss@8.4.33) - postcss-clamp: 4.1.0(postcss@8.4.33) - postcss-color-functional-notation: 6.0.2(postcss@8.4.33) - postcss-color-hex-alpha: 9.0.2(postcss@8.4.33) - postcss-color-rebeccapurple: 9.0.1(postcss@8.4.33) - postcss-custom-media: 10.0.2(postcss@8.4.33) - postcss-custom-properties: 13.3.2(postcss@8.4.33) - postcss-custom-selectors: 7.1.6(postcss@8.4.33) - postcss-dir-pseudo-class: 8.0.0(postcss@8.4.33) - postcss-double-position-gradients: 5.0.2(postcss@8.4.33) - postcss-focus-visible: 9.0.0(postcss@8.4.33) - postcss-focus-within: 8.0.0(postcss@8.4.33) - postcss-font-variant: 5.0.0(postcss@8.4.33) - postcss-gap-properties: 5.0.0(postcss@8.4.33) - postcss-image-set-function: 6.0.1(postcss@8.4.33) - postcss-lab-function: 6.0.7(postcss@8.4.33) - postcss-logical: 7.0.0(postcss@8.4.33) - postcss-nesting: 12.0.1(postcss@8.4.33) - postcss-opacity-percentage: 2.0.0(postcss@8.4.33) - postcss-overflow-shorthand: 5.0.0(postcss@8.4.33) - postcss-page-break: 3.0.4(postcss@8.4.33) - postcss-place: 9.0.0(postcss@8.4.33) - postcss-pseudo-class-any-link: 9.0.0(postcss@8.4.33) - postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.33) - postcss-selector-not: 7.0.1(postcss@8.4.33) + postcss: 8.4.35 + postcss-attribute-case-insensitive: 6.0.2(postcss@8.4.35) + postcss-clamp: 4.1.0(postcss@8.4.35) + postcss-color-functional-notation: 6.0.2(postcss@8.4.35) + postcss-color-hex-alpha: 9.0.2(postcss@8.4.35) + postcss-color-rebeccapurple: 9.0.1(postcss@8.4.35) + postcss-custom-media: 10.0.2(postcss@8.4.35) + postcss-custom-properties: 13.3.2(postcss@8.4.35) + postcss-custom-selectors: 7.1.6(postcss@8.4.35) + postcss-dir-pseudo-class: 8.0.0(postcss@8.4.35) + postcss-double-position-gradients: 5.0.2(postcss@8.4.35) + postcss-focus-visible: 9.0.0(postcss@8.4.35) + postcss-focus-within: 8.0.0(postcss@8.4.35) + postcss-font-variant: 5.0.0(postcss@8.4.35) + postcss-gap-properties: 5.0.0(postcss@8.4.35) + postcss-image-set-function: 6.0.1(postcss@8.4.35) + postcss-lab-function: 6.0.7(postcss@8.4.35) + postcss-logical: 7.0.0(postcss@8.4.35) + postcss-nesting: 12.0.1(postcss@8.4.35) + postcss-opacity-percentage: 2.0.0(postcss@8.4.35) + postcss-overflow-shorthand: 5.0.0(postcss@8.4.35) + postcss-page-break: 3.0.4(postcss@8.4.35) + postcss-place: 9.0.0(postcss@8.4.35) + postcss-pseudo-class-any-link: 9.0.0(postcss@8.4.35) + postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.35) + postcss-selector-not: 7.0.1(postcss@8.4.35) postcss-value-parser: 4.2.0 dev: true - /postcss-pseudo-class-any-link@9.0.0(postcss@8.4.33): + /postcss-pseudo-class-any-link@9.0.0(postcss@8.4.35): resolution: {integrity: sha512-QNCYIL98VKFKY6HGDEJpF6+K/sg9bxcUYnOmNHJxZS5wsFDFaVoPeG68WAuhsqwbIBSo/b9fjEnTwY2mTSD+uA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-selector-parser: 6.0.13 dev: true - /postcss-replace-overflow-wrap@4.0.0(postcss@8.4.33): + /postcss-replace-overflow-wrap@4.0.0(postcss@8.4.35): resolution: {integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==} peerDependencies: postcss: ^8.0.3 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 dev: true - /postcss-safe-parser@6.0.0(postcss@8.4.33): + /postcss-safe-parser@6.0.0(postcss@8.4.35): resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.3.3 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 dev: true - /postcss-scss@4.0.9(postcss@8.4.33): + /postcss-scss@4.0.9(postcss@8.4.35): resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.4.29 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 dev: true - /postcss-selector-not@7.0.1(postcss@8.4.33): + /postcss-selector-not@7.0.1(postcss@8.4.35): resolution: {integrity: sha512-1zT5C27b/zeJhchN7fP0kBr16Cc61mu7Si9uWWLoA3Px/D9tIJPKchJCkUH3tPO5D0pCFmGeApAv8XpXBQJ8SQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-selector-parser: 6.0.13 dev: true @@ -5963,8 +6040,8 @@ packages: /postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - /postcss@8.4.33: - resolution: {integrity: sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==} + /postcss@8.4.35: + resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 @@ -5976,18 +6053,18 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /prettier-plugin-svelte@3.1.2(prettier@3.2.4)(svelte@4.2.9): + /prettier-plugin-svelte@3.1.2(prettier@3.2.5)(svelte@4.2.10): resolution: {integrity: sha512-7xfMZtwgAWHMT0iZc8jN4o65zgbAQ3+O32V6W7pXrqNvKnHnkoyQCGCbKeUyXKZLbYE0YhFRnamfxfkEGxm8qA==} peerDependencies: prettier: ^3.0.0 svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 dependencies: - prettier: 3.2.4 - svelte: 4.2.9 + prettier: 3.2.5 + svelte: 4.2.10 dev: true - /prettier@3.2.4: - resolution: {integrity: sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==} + /prettier@3.2.5: + resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} engines: {node: '>=14'} hasBin: true dev: true @@ -6026,7 +6103,7 @@ packages: /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - /radix-svelte@0.9.0(svelte@4.2.9): + /radix-svelte@0.9.0(svelte@4.2.10): resolution: {integrity: sha512-0PJMHiZVTjWGrjK7c2/FY+nq0fBGwPXNy6fFvkLZIs73hTIai/Exw+pi3TCvtd80gSjFb5utdHWI3qiuuN0B/Q==} engines: {node: '>= 16'} peerDependencies: @@ -6034,7 +6111,7 @@ packages: dependencies: '@floating-ui/core': 1.5.0 '@floating-ui/dom': 1.5.3 - svelte: 4.2.9 + svelte: 4.2.10 dev: false /react-is@18.2.0: @@ -6232,6 +6309,14 @@ packages: dependencies: lru-cache: 6.0.0 + /semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + /seq-queue@0.0.5: resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} dev: false @@ -6355,6 +6440,10 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: false + /sqlstring@2.3.3: resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} engines: {node: '>= 0.6'} @@ -6450,7 +6539,7 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - /svelte-check@3.6.3(postcss-load-config@4.0.2)(postcss@8.4.33)(sass@1.70.0)(svelte@4.2.9): + /svelte-check@3.6.3(postcss-load-config@4.0.2)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.10): resolution: {integrity: sha512-Q2nGnoysxUnB9KjnjpQLZwdjK62DHyW6nuH/gm2qteFnDk0lCehe/6z8TsIvYeKjC6luKaWxiNGyOcWiLLPSwA==} hasBin: true peerDependencies: @@ -6462,8 +6551,8 @@ packages: import-fresh: 3.3.0 picocolors: 1.0.0 sade: 1.8.1 - svelte: 4.2.9 - svelte-preprocess: 5.1.3(postcss-load-config@4.0.2)(postcss@8.4.33)(sass@1.70.0)(svelte@4.2.9)(typescript@5.3.3) + svelte: 4.2.10 + svelte-preprocess: 5.1.3(postcss-load-config@4.0.2)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.10)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: - '@babel/core' @@ -6477,7 +6566,7 @@ packages: - sugarss dev: true - /svelte-eslint-parser@0.33.1(svelte@4.2.9): + /svelte-eslint-parser@0.33.1(svelte@4.2.10): resolution: {integrity: sha512-vo7xPGTlKBGdLH8T5L64FipvTrqv3OQRx9d2z5X05KKZDlF4rQk8KViZO4flKERY+5BiVdOh7zZ7JGJWo5P0uA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -6489,52 +6578,52 @@ packages: eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - postcss: 8.4.33 - postcss-scss: 4.0.9(postcss@8.4.33) - svelte: 4.2.9 + postcss: 8.4.35 + postcss-scss: 4.0.9(postcss@8.4.35) + svelte: 4.2.10 dev: true - /svelte-french-toast@1.2.0(svelte@4.2.9): + /svelte-french-toast@1.2.0(svelte@4.2.10): resolution: {integrity: sha512-5PW+6RFX3xQPbR44CngYAP1Sd9oCq9P2FOox4FZffzJuZI2mHOB7q5gJBVnOiLF5y3moVGZ7u2bYt7+yPAgcEQ==} peerDependencies: svelte: ^3.57.0 || ^4.0.0 dependencies: - svelte: 4.2.9 - svelte-writable-derived: 3.1.0(svelte@4.2.9) + svelte: 4.2.10 + svelte-writable-derived: 3.1.0(svelte@4.2.10) dev: false - /svelte-hmr@0.15.3(svelte@4.2.9): + /svelte-hmr@0.15.3(svelte@4.2.10): resolution: {integrity: sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ==} engines: {node: ^12.20 || ^14.13.1 || >= 16} peerDependencies: svelte: ^3.19.0 || ^4.0.0 dependencies: - svelte: 4.2.9 + svelte: 4.2.10 /svelte-lazy-loader@1.0.0: resolution: {integrity: sha512-AZD6R60vksyojn21FgXLglmBiBB9K5Dkdu0hdGrLbCaRCYT68IsWkZfRUqKhMx1IfzqWcZQ8X9y/f+Ih0oNQkQ==} dev: false - /svelte-meta-tags@3.1.0(svelte@4.2.9)(typescript@5.3.3): + /svelte-meta-tags@3.1.0(svelte@4.2.10)(typescript@5.3.3): resolution: {integrity: sha512-wFBfpktSua1R5rdvQ/aFucvXmRqzDhRYrPpMQ/pL4+KL5QHIzomPf29a5WN3yDR0reSy1PXyQ2ah0+uCYCbi0g==} peerDependencies: svelte: ^3.55.0 || ^4.0.0 dependencies: schema-dts: 1.1.2(typescript@5.3.3) - svelte: 4.2.9 + svelte: 4.2.10 transitivePeerDependencies: - typescript dev: true - /svelte-parse-markup@0.1.2(svelte@4.2.9): + /svelte-parse-markup@0.1.2(svelte@4.2.10): resolution: {integrity: sha512-DycY7DJr7VqofiJ63ut1/NEG92HrWWL56VWITn/cJCu+LlZhMoBkBXT4opUitPEEwbq1nMQbv4vTKUfbOqIW1g==} peerDependencies: svelte: ^3.0.0 || ^4.0.0 dependencies: - svelte: 4.2.9 + svelte: 4.2.10 dev: true - /svelte-preprocess@5.1.3(postcss-load-config@4.0.2)(postcss@8.4.33)(sass@1.70.0)(svelte@4.2.9)(typescript@5.3.3): + /svelte-preprocess@5.1.3(postcss-load-config@4.0.2)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.10)(typescript@5.3.3): resolution: {integrity: sha512-xxAkmxGHT+J/GourS5mVJeOXZzne1FR5ljeOUAMXUkfEhkLEllRreXpbl3dIYJlcJRfL1LO1uIAPpBpBfiqGPw==} engines: {node: '>= 16.0.0', pnpm: ^8.0.0} requiresBuild: true @@ -6575,12 +6664,12 @@ packages: '@types/pug': 2.0.8 detect-indent: 6.1.0 magic-string: 0.30.5 - postcss: 8.4.33 - postcss-load-config: 4.0.2(postcss@8.4.33)(ts-node@10.9.2) + postcss: 8.4.35 + postcss-load-config: 4.0.2(postcss@8.4.35)(ts-node@10.9.2) sass: 1.70.0 sorcery: 0.11.0 strip-indent: 3.0.0 - svelte: 4.2.9 + svelte: 4.2.10 typescript: 5.3.3 dev: true @@ -6588,20 +6677,20 @@ packages: resolution: {integrity: sha512-N5JqlBni6BzElxmuFrOPxOJnjsxh1cFDACLEVKs8OHBcx8ZNRO1p5SxuQex1m3qbLzAC8G99EHeWcxGkjyKjLQ==} engines: {node: '>=16'} dependencies: - svelte: 4.2.9 + svelte: 4.2.10 tslib: 2.6.2 dev: true - /svelte-writable-derived@3.1.0(svelte@4.2.9): + /svelte-writable-derived@3.1.0(svelte@4.2.10): resolution: {integrity: sha512-cTvaVFNIJ036vSDIyPxJYivKC7ZLtcFOPm1Iq6qWBDo1fOHzfk6ZSbwaKrxhjgy52Rbl5IHzRcWgos6Zqn9/rg==} peerDependencies: svelte: ^3.2.1 || ^4.0.0-next.1 dependencies: - svelte: 4.2.9 + svelte: 4.2.10 dev: false - /svelte@4.2.9: - resolution: {integrity: sha512-hsoB/WZGEPFXeRRLPhPrbRz67PhP6sqYgvwcAs+gWdSQSvNDw+/lTeUJSWe5h2xC97Fz/8QxAOqItwBzNJPU8w==} + /svelte@4.2.10: + resolution: {integrity: sha512-Ep06yCaCdgG1Mafb/Rx8sJ1QS3RW2I2BxGp2Ui9LBHSZ2/tO/aGLc5WqPjgiAP6KAnLJGaIr/zzwQlOo1b8MxA==} engines: {node: '>=16'} dependencies: '@ampproject/remapping': 2.2.1 @@ -6619,27 +6708,27 @@ packages: magic-string: 0.30.5 periscopic: 3.1.0 - /sveltekit-flash-message@2.4.1(@sveltejs/kit@2.5.0)(svelte@4.2.9): + /sveltekit-flash-message@2.4.1(@sveltejs/kit@2.5.0)(svelte@4.2.10): resolution: {integrity: sha512-n01N62FkXL6tp3VK3u4eCHKz1RwZVgqEEj63pUG/Pj3caHWkjtTUHKX8GRb14kpt9bkML8t93D/B1l1UorskvA==} peerDependencies: '@sveltejs/kit': 1.x || 2.x svelte: 3.x || 4.x dependencies: - '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.9)(vite@5.0.12) - svelte: 4.2.9 + '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.10)(vite@5.0.12) + svelte: 4.2.10 dev: true - /sveltekit-superforms@1.13.4(@sveltejs/kit@2.5.0)(svelte@4.2.9)(zod@3.22.4): + /sveltekit-superforms@1.13.4(@sveltejs/kit@2.5.0)(svelte@4.2.10)(zod@3.22.4): resolution: {integrity: sha512-rM2+Ictaw7OAIorCLmvg82orci/mtO9ZouI4emtx8SyYngx9aED+eNZlHPLufgB6D7geL2a+hMSFtM3zmMQixQ==} peerDependencies: '@sveltejs/kit': 1.x || 2.x svelte: 3.x || 4.x zod: 3.x dependencies: - '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.9)(vite@5.0.12) + '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.10)(vite@5.0.12) devalue: 4.3.2 klona: 2.0.6 - svelte: 4.2.9 + svelte: 4.2.10 zod: 3.22.4 /tabbable@6.2.0: @@ -6692,11 +6781,11 @@ packages: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.0.0 - postcss: 8.4.33 - postcss-import: 15.1.0(postcss@8.4.33) - postcss-js: 4.0.1(postcss@8.4.33) - postcss-load-config: 4.0.2(postcss@8.4.33)(ts-node@10.9.2) - postcss-nested: 6.0.1(postcss@8.4.33) + postcss: 8.4.35 + postcss-import: 15.1.0(postcss@8.4.35) + postcss-js: 4.0.1(postcss@8.4.35) + postcss-load-config: 4.0.2(postcss@8.4.35)(ts-node@10.9.2) + postcss-nested: 6.0.1(postcss@8.4.35) postcss-selector-parser: 6.0.13 resolve: 1.22.8 sucrase: 3.34.0 @@ -6788,10 +6877,19 @@ packages: typescript: 5.3.3 dev: true + /ts-api-utils@1.2.1(typescript@5.3.3): + resolution: {integrity: sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.3.3 + dev: true + /ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - /ts-node@10.9.2(@types/node@18.19.10)(typescript@5.3.3): + /ts-node@10.9.2(@types/node@18.19.14)(typescript@5.3.3): resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: @@ -6810,7 +6908,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 18.19.10 + '@types/node': 18.19.14 acorn: 8.11.2 acorn-walk: 8.3.0 arg: 4.1.3 @@ -6835,6 +6933,11 @@ packages: fsevents: 2.3.3 dev: true + /tunnel@0.0.6: + resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} + engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} + dev: false + /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -6876,6 +6979,13 @@ packages: /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + /undici@5.28.3: + resolution: {integrity: sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==} + engines: {node: '>=14.0'} + dependencies: + '@fastify/busboy': 2.1.0 + dev: false + /unfetch@4.2.0: resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} dev: false @@ -6936,6 +7046,11 @@ packages: which-typed-array: 1.1.13 dev: false + /uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + dev: false + /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} @@ -6949,7 +7064,7 @@ packages: - rollup dev: true - /vite-node@1.2.2(@types/node@18.19.10)(sass@1.70.0): + /vite-node@1.2.2(@types/node@18.19.14)(sass@1.70.0): resolution: {integrity: sha512-1as4rDTgVWJO3n1uHmUYqq7nsFgINQ9u+mRcXpjeOMJUmviqNKjcZB7UfRZrlM7MjYXMKpuWp5oGkjaFLnjawg==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -6958,7 +7073,7 @@ packages: debug: 4.3.4 pathe: 1.1.1 picocolors: 1.0.0 - vite: 5.0.12(@types/node@18.19.10)(sass@1.70.0) + vite: 5.0.12(@types/node@18.19.14)(sass@1.70.0) transitivePeerDependencies: - '@types/node' - less @@ -6970,7 +7085,7 @@ packages: - terser dev: true - /vite@5.0.12(@types/node@18.19.10)(sass@1.70.0): + /vite@5.0.12(@types/node@18.19.14)(sass@1.70.0): resolution: {integrity: sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -6998,9 +7113,9 @@ packages: terser: optional: true dependencies: - '@types/node': 18.19.10 + '@types/node': 18.19.14 esbuild: 0.19.10 - postcss: 8.4.33 + postcss: 8.4.35 rollup: 4.9.1 sass: 1.70.0 optionalDependencies: @@ -7014,9 +7129,9 @@ packages: vite: optional: true dependencies: - vite: 5.0.12(@types/node@18.19.10)(sass@1.70.0) + vite: 5.0.12(@types/node@18.19.14)(sass@1.70.0) - /vitest@1.2.2(@types/node@18.19.10)(sass@1.70.0): + /vitest@1.2.2(@types/node@18.19.14)(sass@1.70.0): resolution: {integrity: sha512-d5Ouvrnms3GD9USIK36KG8OZ5bEvKEkITFtnGv56HFaSlbItJuYr7hv2Lkn903+AvRAgSixiamozUVfORUekjw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -7041,7 +7156,7 @@ packages: jsdom: optional: true dependencies: - '@types/node': 18.19.10 + '@types/node': 18.19.14 '@vitest/expect': 1.2.2 '@vitest/runner': 1.2.2 '@vitest/snapshot': 1.2.2 @@ -7060,8 +7175,8 @@ packages: strip-literal: 1.3.0 tinybench: 2.5.1 tinypool: 0.8.2 - vite: 5.0.12(@types/node@18.19.10)(sass@1.70.0) - vite-node: 1.2.2(@types/node@18.19.10)(sass@1.70.0) + vite: 5.0.12(@types/node@18.19.14)(sass@1.70.0) + vite-node: 1.2.2(@types/node@18.19.14)(sass@1.70.0) why-is-node-running: 2.2.2 transitivePeerDependencies: - less diff --git a/src/lib/drizzle.ts b/src/lib/drizzle.ts index bcea3e5..a4e824c 100644 --- a/src/lib/drizzle.ts +++ b/src/lib/drizzle.ts @@ -1,6 +1,7 @@ import { drizzle } from 'drizzle-orm/mysql2'; import mysql from 'mysql2/promise'; import { DATABASE_USER, DATABASE_PASSWORD, DATABASE_HOST, DATABASE_DB } from '$env/static/private'; +import * as schema from '../schema'; // create the connection const connection = await mysql.createConnection({ @@ -11,6 +12,6 @@ const connection = await mysql.createConnection({ database: DATABASE_DB }); -const db = drizzle(connection); +const db = drizzle(connection, { schema: schema, mode: 'default' }); export default db; diff --git a/src/lib/utils/authUtils.ts b/src/lib/utils/authUtils.ts new file mode 100644 index 0000000..6b132d3 --- /dev/null +++ b/src/lib/utils/authUtils.ts @@ -0,0 +1,3 @@ +export const normalizeEmail = (email: string): string => { + return decodeURIComponent(email).toLowerCase().trim(); +}; diff --git a/src/routes/(auth)/sign-up/+page.server.ts b/src/routes/(auth)/sign-up/+page.server.ts index ef35291..f34c5f5 100644 --- a/src/routes/(auth)/sign-up/+page.server.ts +++ b/src/routes/(auth)/sign-up/+page.server.ts @@ -8,8 +8,9 @@ import { userSchema } from '$lib/config/zod-schemas'; import { add_user_to_role } from '$server/roles'; import type { Message } from '$lib/types.js'; import db from '$lib/drizzle'; -import { users } from '../../../schema'; +import { collections, users, wishlists } from '../../../schema'; import { eq } from 'drizzle-orm'; +import { nanoid } from 'nanoid'; const signUpSchema = userSchema .pick({ @@ -58,6 +59,19 @@ export const actions: Actions = { let sessionCookie; // Adding user to the db try { + console.log('Check if user already exists'); + + const existing_user = await db.query + .users + .findFirst({ where: eq(users.username, form.data.username) }); + + if (existing_user) { + return fail(400, { + form, + message: 'You cannot create an account with that username' + }); + } + console.log('Creating user'); const hashedPassword = await new Argon2id().hash(form.data.password); @@ -77,25 +91,29 @@ export const actions: Actions = { .from(users) .where(eq(users.username, form.data.username)); console.log('signup user', user); + + if (!user || user.length === 0) { + return fail(400, { + form, + message: `Could not create your account. Please try again. If the problem persists, please contact support. Error ID: ${nanoid()}` + }); + } + add_user_to_role(user[0].id, 'user'); - // await prisma.collection.create({ - // data: { - // user_id: user.id - // } - // }); - // await prisma.wishlist.create({ - // data: { - // user_id: user.id - // } - // }); + await db.insert(collections) + .values({ + user_id: user[0].id + }); + await db.insert(wishlists) + .values({ + user_id: user[0].id + }); - // console.log('User', user); - - // session = await lucia.createSession(user.id, { - // ipCountry: event.locals.session?.ipCountry, - // ipAddress: event.locals.session?.ipAddress - // }); - // sessionCookie = lucia.createSessionCookie(session.id); + session = await lucia.createSession(user[0].id, { + ip_country: event.locals.session?.ipCountry, + ip_address: event.locals.session?.ipAddress + }); + sessionCookie = lucia.createSessionCookie(session.id); } catch (e: any) { if (e.message.toUpperCase() === `DUPLICATE_KEY_ID`) { // key already exists @@ -111,13 +129,13 @@ export const actions: Actions = { error(500, message); } - // event.cookies.set(sessionCookie.name, sessionCookie.value, { - // path: ".", - // ...sessionCookie.attributes - // }); + event.cookies.set(sessionCookie.name, sessionCookie.value, { + path: ".", + ...sessionCookie.attributes + }); - redirect(302, '/'); - // const message = { type: 'success', message: 'Signed Up!' } as const; - // throw flashRedirect(message, event); + // redirect(302, '/'); + const message = { type: 'success', message: 'Signed Up!' } as const; + throw flashRedirect(message, event); } }; diff --git a/src/schema.ts b/src/schema.ts index df08a12..8917df9 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -70,27 +70,27 @@ export const user_roles = mysqlTable("user_roles", { length: 255 }).primaryKey() .$defaultFn(() => nanoid()), - userId: varchar("user_id", { + user_id: varchar("user_id", { length: 255 }) .notNull() .references(() => users.id, { onDelete: 'cascade' }), - roleId: varchar("role_id", { + role_id: varchar("role_id", { length: 255 }) .notNull() .references(() => roles.id, { onDelete: 'cascade' }), - createdAt: datetime("created_at").default(sql`(now(6))`), - updatedAt: datetime("updated_at").default(sql`(now(6))`) + created_at: datetime("created_at").default(sql`(now(6))`), + updated_at: datetime("updated_at").default(sql`(now(6))`) }); export const user_role_relations = relations(user_roles, ({ one }) => ({ role: one(roles, { - fields: [user_roles.roleId], + fields: [user_roles.role_id], references: [roles.id] }), user: one(users, { - fields: [user_roles.userId], + fields: [user_roles.user_id], references: [users.id] }) })); @@ -107,26 +107,26 @@ export const games = mysqlTable("games", { length: 255 }), description: text("description"), - yearPublished: year("year_published"), - minPlayers: int("min_players"), - maxPlayers: int("max_players"), + year_published: year("year_published"), + min_players: int("min_players"), + max_players: int("max_players"), playtime: int("playtime"), - minPlaytime: int("min_playtime"), - maxPlaytime: int("max_playtime"), - minAge: int("min_age"), - imageUrl: varchar("image_url", { + min_playtime: int("min_playtime"), + max_playtime: int("max_playtime"), + min_age: int("min_age"), + image_url: varchar("image_url", { length: 255 }), - thumbUrl: varchar("thumb_url", { + thumb_url: varchar("thumb_url", { length: 255 }), url: varchar("url", { length: 255 }), - externalId: int("external_id").unique(), - lastSyncAt: datetime("last_sync_at"), - createdAt: datetime("created_at").default(sql`(now(6))`), - updatedAt: datetime("updated_at").default(sql`(now(6))`) + external_id: int("external_id").unique(), + last_sync_at: datetime("last_sync_at"), + created_at: datetime("created_at").default(sql`(now(6))`), + updated_at: datetime("updated_at").default(sql`(now(6))`) }); export type Games = InferSelectModel; @@ -144,27 +144,27 @@ export const expansions = mysqlTable("expansions", { length: 255 }).primaryKey() .$defaultFn(() => nanoid()), - baseGameId: varchar("base_game_id", { + base_game_id: varchar("base_game_id", { length: 255 }) .notNull() .references(() => games.id, { onDelete: 'cascade' }), - gameId: varchar("game_id", { + game_id: varchar("game_id", { length: 255 }) .notNull() .references(() => games.id, { onDelete: 'cascade' }), - createdAt: datetime("created_at").default(sql`(now(6))`), - updatedAt: datetime("updated_at").default(sql`(now(6))`) + created_at: datetime("created_at").default(sql`(now(6))`), + updated_at: datetime("updated_at").default(sql`(now(6))`) }) export const expansion_relations = relations(expansions, ({ one }) => ({ baseGame: one(games, { - fields: [expansions.baseGameId], + fields: [expansions.base_game_id], references: [games.id] }), game: one(games, { - fields: [expansions.gameId], + fields: [expansions.game_id], references: [games.id] }) })); @@ -174,18 +174,18 @@ export const collections = mysqlTable("collections", { length: 255 }).primaryKey() .$defaultFn(() => nanoid()), - userId: varchar("user_id", { + user_id: varchar("user_id", { length: 255 }) .notNull() .references(() => users.id, { onDelete: 'cascade' }), - createdAt: datetime("created_at").default(sql`(now(6))`), - updatedAt: datetime("updated_at").default(sql`(now(6))`) + created_at: datetime("created_at").default(sql`(now(6))`), + updated_at: datetime("updated_at").default(sql`(now(6))`) }); export const collection_relations = relations(collections, ({ one }) => ({ user: one(users, { - fields: [collections.userId], + fields: [collections.user_id], references: [users.id] }), })) @@ -195,27 +195,27 @@ export const collection_items = mysqlTable("collection_items", { length: 255 }).primaryKey() .$defaultFn(() => nanoid()), - collectionId: varchar("collection_id", { + collection_id: varchar("collection_id", { length: 255 }) .notNull() .references(() => collections.id, { onDelete: 'cascade' }), - gameId: varchar("game_id", { + game_id: varchar("game_id", { length: 255 }) .notNull() .references(() => games.id, { onDelete: 'cascade' }), - createdAt: datetime("created_at").default(sql`(now(6))`), - updatedAt: datetime("updated_at").default(sql`(now(6))`) + created_at: datetime("created_at").default(sql`(now(6))`), + updated_at: datetime("updated_at").default(sql`(now(6))`) }); export const collection_item_relations = relations(collection_items, ({ one }) =>({ collection: one(collections, { - fields: [collection_items.collectionId], + fields: [collection_items.collection_id], references: [collections.id] }), game: one(games, { - fields: [collection_items.gameId], + fields: [collection_items.game_id], references: [games.id] }) })); @@ -225,18 +225,18 @@ export const wishlists = mysqlTable("wishlists", { length: 255 }).primaryKey() .$defaultFn(() => nanoid()), - userId: varchar("user_id", { + user_id: varchar("user_id", { length: 255 }) .notNull() .references(() => users.id, { onDelete: 'cascade' }), - createdAt: datetime("created_at").default(sql`(now(6))`), - updatedAt: datetime("updated_at").default(sql`(now(6))`) + created_at: datetime("created_at").default(sql`(now(6))`), + updated_at: datetime("updated_at").default(sql`(now(6))`) }); export const wishlists_relations = relations(wishlists, ({ one }) => ({ user: one(users, { - fields: [wishlists.userId], + fields: [wishlists.user_id], references: [users.id] }), })) @@ -247,27 +247,27 @@ export const wishlist_items = mysqlTable('wishlist_items', { }) .primaryKey() .$defaultFn(() => nanoid()), - wishlistId: varchar('wishlist_id', { + wishlist_id: varchar('wishlist_id', { length: 255 }) .notNull() .references(() => wishlists.id, { onDelete: 'cascade' }), - gameId: varchar('game_id', { + game_id: varchar('game_id', { length: 255 }) .notNull() .references(() => games.id, { onDelete: 'cascade' }), - createdAt: datetime('created_at').default(sql`(now(6))`), - updatedAt: datetime('updated_at').default(sql`(now(6))`) + created_at: datetime('created_at').default(sql`(now(6))`), + updated_at: datetime('updated_at').default(sql`(now(6))`) }); export const wishlist_item_relations = relations(wishlist_items, ({ one }) => ({ wishlist: one(wishlists, { - fields: [wishlist_items.wishlistId], + fields: [wishlist_items.wishlist_id], references: [wishlists.id] }), game: one(games, { - fields: [wishlist_items.gameId], + fields: [wishlist_items.game_id], references: [games.id] }) })) @@ -283,9 +283,9 @@ export const publishers = mysqlTable("publishers", { slug: varchar("slug", { length: 255 }), - externalId: int("external_id"), - createdAt: datetime("created_at").default(sql`(now(6))`), - updatedAt: datetime("updated_at").default(sql`(now(6))`) + external_id: int("external_id"), + created_at: datetime("created_at").default(sql`(now(6))`), + updated_at: datetime("updated_at").default(sql`(now(6))`) }); export const publishers_relations = relations(publishers, ({ many }) => ({ @@ -303,9 +303,9 @@ export const categories = mysqlTable("categories", { slug: varchar("slug", { length: 255 }), - externalId: int("external_id"), - createdAt: datetime("created_at").default(sql`(now(6))`), - updatedAt: datetime("updated_at").default(sql`(now(6))`) + external_id: int("external_id"), + created_at: datetime("created_at").default(sql`(now(6))`), + updated_at: datetime("updated_at").default(sql`(now(6))`) }); export const categories_relations = relations(categories, ({ many }) => ({ @@ -323,9 +323,9 @@ export const mechanics = mysqlTable("mechanics", { slug: varchar("slug", { length: 255 }), - externalId: int("external_id"), - createdAt: datetime("created_at").default(sql`(now(6))`), - updatedAt: datetime("updated_at").default(sql`(now(6))`) + external_id: int("external_id"), + created_at: datetime("created_at").default(sql`(now(6))`), + updated_at: datetime("updated_at").default(sql`(now(6))`) }); export const mechanic_relations = relations(mechanics, ({ many }) => ({ @@ -343,9 +343,9 @@ export const designers = mysqlTable("designers", { slug: varchar("slug", { length: 255 }), - externalId: int("external_id"), - createdAt: datetime("created_at").default(sql`(now(6))`), - updatedAt: datetime("updated_at").default(sql`(now(6))`) + external_id: int("external_id"), + created_at: datetime("created_at").default(sql`(now(6))`), + updated_at: datetime("updated_at").default(sql`(now(6))`) }); export const designers_relations = relations(designers, ({ many }) => ({ @@ -363,9 +363,9 @@ export const artists = mysqlTable("artists", { slug: varchar("slug", { length: 255 }), - externalId: int("external_id"), - createdAt: datetime("created_at").default(sql`(now(6))`), - updatedAt: datetime("updated_at").default(sql`(now(6))`) + external_id: int("external_id"), + created_at: datetime("created_at").default(sql`(now(6))`), + updated_at: datetime("updated_at").default(sql`(now(6))`) }); export const artists_relations = relations(artists, ({ many }) => ({ @@ -373,101 +373,101 @@ export const artists_relations = relations(artists, ({ many }) => ({ })); export const artists_to_games = mysqlTable('artists_to_games', { - artistId: varchar('artist_id', { + artist_id: varchar('artist_id', { length: 255 }), - gameId: varchar('game_id', { + game_id: varchar('game_id', { length: 255 }), }); export const artists_to_games_relations = relations(artists_to_games, ({ one }) => ({ artist: one(artists, { - fields: [artists_to_games.artistId], + fields: [artists_to_games.artist_id], references: [artists.id] }), game: one(games, { - fields: [artists_to_games.gameId], + fields: [artists_to_games.game_id], references: [games.id] }), })); export const categories_to_games = mysqlTable("categories_to_games", { - categoryId: varchar("category_id", { + category_id: varchar("category_id", { length: 255 }), - gameId: varchar("game_id", { + game_id: varchar("game_id", { length: 255 }), }); export const categories_to_games_relations = relations(categories_to_games, ({ one }) => ({ category: one(categories, { - fields: [categories_to_games.categoryId], + fields: [categories_to_games.category_id], references: [categories.id] }), game: one(games, { - fields: [categories_to_games.gameId], + fields: [categories_to_games.game_id], references: [games.id] }), })) export const designers_to_games = mysqlTable("designers_to_games", { - designerId: varchar("designer_id", { + designer_id: varchar("designer_id", { length: 255 }), - gameId: varchar("game_id", { + game_id: varchar("game_id", { length: 255 }), }); export const designers_to_games_relations = relations(designers_to_games, ({ one }) => ({ designer: one(designers, { - fields: [designers_to_games.designerId], + fields: [designers_to_games.designer_id], references: [designers.id] }), game: one(games, { - fields: [designers_to_games.gameId], + fields: [designers_to_games.game_id], references: [games.id] }), })) export const mechanics_to_games = mysqlTable("mechanics_to_games", { - mechanicId: varchar("mechanic_id", { + mechanic_id: varchar("mechanic_id", { length: 255 }), - gameId: varchar("game_id", { + game_id: varchar("game_id", { length: 255 }), }); export const mechanics_to_games_relations = relations(mechanics_to_games, ({ one }) => ({ mechanic: one(mechanics, { - fields: [mechanics_to_games.mechanicId], + fields: [mechanics_to_games.mechanic_id], references: [mechanics.id] }), game: one(games, { - fields: [mechanics_to_games.gameId], + fields: [mechanics_to_games.game_id], references: [games.id] }), })); export const publishers_to_games = mysqlTable("publishers_to_games", { - publisherId: varchar("publisher_id", { + publisher_id: varchar("publisher_id", { length: 255 }), - gameId: varchar("game_id", { + game_id: varchar("game_id", { length: 255 }), }); export const publishers_to_games_relations = relations(publishers_to_games, ({ one }) => ({ publisher: one(publishers, { - fields: [publishers_to_games.publisherId], + fields: [publishers_to_games.publisher_id], references: [publishers.id] }), game: one(games, { - fields: [publishers_to_games.gameId], + fields: [publishers_to_games.game_id], references: [games.id] }), })); diff --git a/src/seed/insert.ts b/src/seed/insert.ts new file mode 100644 index 0000000..4d13cf3 --- /dev/null +++ b/src/seed/insert.ts @@ -0,0 +1,27 @@ +import 'dotenv/config'; +import { drizzle } from 'drizzle-orm/mysql2'; +import { createConnection } from 'mysql2'; +import * as schema from '../schema'; + +const connection = createConnection({ + host: process.env.DATABASE_HOST, + port: 3306, + user: process.env.DATABASE_USER, + password: process.env.DATABASE_PASSWORD, + database: process.env.DATABASE_DB +}); +const db = drizzle(connection, { schema: schema, mode: 'default' }); + +const existingRoles = await db.query.roles.findMany(); +if (existingRoles.length === 0) { + await db.insert(schema.roles).values([{ + name: 'admin' + }, { + name: 'user' + }]); + console.log('Roles created.'); +} else { + console.log('Roles already exist. No action taken.'); +} + +await connection.end(); diff --git a/src/server/roles.ts b/src/server/roles.ts index 7434854..b1c7aa5 100644 --- a/src/server/roles.ts +++ b/src/server/roles.ts @@ -1,31 +1,21 @@ -import prisma from "$lib/prisma"; +import db from "$lib/drizzle"; +import { eq } from "drizzle-orm"; +import { roles, user_roles } from "../schema"; export async function add_user_to_role(user_id: string, role_name: string) { // Find the role by its name - const role = await prisma.role.findUnique({ - where: { - name: role_name - } + const role = await db.query.roles.findFirst({ + where: eq(roles.name, role_name) }); - if (!role) { + if (!role || !role.id) { throw new Error(`Role with name ${role_name} not found`); } // Create a UserRole entry linking the user and the role - const userRole = await prisma.userRole.create({ - data: { - user: { - connect: { - id: user_id - } - }, - role: { - connect: { - id: role.id - } - } - } + const userRole = await db.insert(user_roles).values({ + user_id, + role_id: role.id }); return userRole; From e91b308f97b564cf87f5aaa98c49ebdf4a40ef01 Mon Sep 17 00:00:00 2001 From: Bradley Shellnut Date: Wed, 7 Feb 2024 17:53:02 -0800 Subject: [PATCH 09/34] Update dependencies and fix username taken. --- package.json | 20 +-- pnpm-lock.yaml | 209 ++++++++++++---------- src/routes/(auth)/sign-up/+page.server.ts | 105 ++++++----- 3 files changed, 172 insertions(+), 162 deletions(-) diff --git a/package.json b/package.json index 84a7076..ca65c64 100644 --- a/package.json +++ b/package.json @@ -26,15 +26,15 @@ }, "devDependencies": { "@melt-ui/pp": "^0.3.0", - "@melt-ui/svelte": "^0.70.0", + "@melt-ui/svelte": "^0.73.0", "@playwright/test": "^1.41.2", "@resvg/resvg-js": "^2.6.0", "@sveltejs/adapter-auto": "^3.1.1", "@sveltejs/enhanced-img": "^0.1.8", "@sveltejs/kit": "^2.5.0", "@sveltejs/vite-plugin-svelte": "^3.0.2", - "@types/cookie": "^0.5.4", - "@types/node": "^18.19.14", + "@types/cookie": "^0.6.0", + "@types/node": "^20.11.16", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", "autoprefixer": "^10.4.17", @@ -46,8 +46,8 @@ "just-clone": "^6.2.0", "just-debounce-it": "^3.2.0", "postcss": "^8.4.35", - "postcss-import": "^15.1.0", - "postcss-load-config": "^4.0.2", + "postcss-import": "^16.0.0", + "postcss-load-config": "^5.0.2", "postcss-preset-env": "^9.3.0", "prettier": "^3.2.5", "prettier-plugin-svelte": "^3.1.2", @@ -77,7 +77,7 @@ "pnpm": ">=8" }, "dependencies": { - "@fontsource/fira-mono": "^4.5.10", + "@fontsource/fira-mono": "^5.0.8", "@iconify-icons/line-md": "^1.2.26", "@iconify-icons/mdi": "^1.2.47", "@lucia-auth/adapter-drizzle": "^1.0.1", @@ -90,20 +90,20 @@ "@sveltejs/adapter-vercel": "^5.1.0", "@types/feather-icons": "^4.29.4", "@vercel/og": "^0.5.20", - "bits-ui": "^0.15.1", + "bits-ui": "^0.17.0", "boardgamegeekclient": "^1.9.1", "class-variance-authority": "^0.7.0", "clsx": "^2.1.0", - "cookie": "^0.5.0", + "cookie": "^0.6.0", "drizzle-orm": "^0.29.3", "feather-icons": "^4.29.1", "formsnap": "^0.4.3", "html-entities": "^2.4.0", - "iconify-icon": "^1.0.8", + "iconify-icon": "^2.0.0", "just-kebab-case": "^4.2.0", "loader": "^2.1.1", "lucia": "3.0.1", - "lucide-svelte": "^0.298.0", + "lucide-svelte": "^0.323.0", "mysql2": "^3.9.1", "nanoid": "^5.0.5", "open-props": "^1.6.18", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index be4740b..67df3d2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,8 +6,8 @@ settings: dependencies: '@fontsource/fira-mono': - specifier: ^4.5.10 - version: 4.5.10 + specifier: ^5.0.8 + version: 5.0.8 '@iconify-icons/line-md': specifier: ^1.2.26 version: 1.2.30 @@ -45,8 +45,8 @@ dependencies: specifier: ^0.5.20 version: 0.5.20 bits-ui: - specifier: ^0.15.1 - version: 0.15.1(svelte@4.2.10) + specifier: ^0.17.0 + version: 0.17.0(svelte@4.2.10) boardgamegeekclient: specifier: ^1.9.1 version: 1.9.1 @@ -57,8 +57,8 @@ dependencies: specifier: ^2.1.0 version: 2.1.0 cookie: - specifier: ^0.5.0 - version: 0.5.0 + specifier: ^0.6.0 + version: 0.6.0 drizzle-orm: specifier: ^0.29.3 version: 0.29.3(@planetscale/database@1.15.0)(mysql2@3.9.1) @@ -72,8 +72,8 @@ dependencies: specifier: ^2.4.0 version: 2.4.0 iconify-icon: - specifier: ^1.0.8 - version: 1.0.8 + specifier: ^2.0.0 + version: 2.0.0 just-kebab-case: specifier: ^4.2.0 version: 4.2.0 @@ -84,8 +84,8 @@ dependencies: specifier: 3.0.1 version: 3.0.1 lucide-svelte: - specifier: ^0.298.0 - version: 0.298.0(svelte@4.2.10) + specifier: ^0.323.0 + version: 0.323.0(svelte@4.2.10) mysql2: specifier: ^3.9.1 version: 3.9.1 @@ -123,10 +123,10 @@ dependencies: devDependencies: '@melt-ui/pp': specifier: ^0.3.0 - version: 0.3.0(@melt-ui/svelte@0.70.0)(svelte@4.2.10) + version: 0.3.0(@melt-ui/svelte@0.73.0)(svelte@4.2.10) '@melt-ui/svelte': - specifier: ^0.70.0 - version: 0.70.0(svelte@4.2.10) + specifier: ^0.73.0 + version: 0.73.0(svelte@4.2.10) '@playwright/test': specifier: ^1.41.2 version: 1.41.2 @@ -146,11 +146,11 @@ devDependencies: specifier: ^3.0.2 version: 3.0.2(svelte@4.2.10)(vite@5.0.12) '@types/cookie': - specifier: ^0.5.4 - version: 0.5.4 + specifier: ^0.6.0 + version: 0.6.0 '@types/node': - specifier: ^18.19.14 - version: 18.19.14 + specifier: ^20.11.16 + version: 20.11.16 '@typescript-eslint/eslint-plugin': specifier: ^6.21.0 version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.3.3) @@ -185,11 +185,11 @@ devDependencies: specifier: ^8.4.35 version: 8.4.35 postcss-import: - specifier: ^15.1.0 - version: 15.1.0(postcss@8.4.35) + specifier: ^16.0.0 + version: 16.0.0(postcss@8.4.35) postcss-load-config: - specifier: ^4.0.2 - version: 4.0.2(postcss@8.4.35)(ts-node@10.9.2) + specifier: ^5.0.2 + version: 5.0.2(postcss@8.4.35) postcss-preset-env: specifier: ^9.3.0 version: 9.3.0(postcss@8.4.35) @@ -216,13 +216,13 @@ devDependencies: version: 4.2.10 svelte-check: specifier: ^3.6.3 - version: 3.6.3(postcss-load-config@4.0.2)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.10) + version: 3.6.3(postcss-load-config@5.0.2)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.10) svelte-meta-tags: specifier: ^3.1.0 version: 3.1.0(svelte@4.2.10)(typescript@5.3.3) svelte-preprocess: specifier: ^5.1.3 - version: 5.1.3(postcss-load-config@4.0.2)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.10)(typescript@5.3.3) + version: 5.1.3(postcss-load-config@5.0.2)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.10)(typescript@5.3.3) svelte-sequential-preprocessor: specifier: ^2.0.1 version: 2.0.1 @@ -237,7 +237,7 @@ devDependencies: version: 3.4.1(ts-node@10.9.2) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@18.19.14)(typescript@5.3.3) + version: 10.9.2(@types/node@20.11.16)(typescript@5.3.3) tslib: specifier: ^2.6.1 version: 2.6.2 @@ -249,10 +249,10 @@ devDependencies: version: 5.3.3 vite: specifier: ^5.0.12 - version: 5.0.12(@types/node@18.19.14)(sass@1.70.0) + version: 5.0.12(@types/node@20.11.16)(sass@1.70.0) vitest: specifier: ^1.2.2 - version: 1.2.2(@types/node@18.19.14)(sass@1.70.0) + version: 1.2.2(@types/node@20.11.16)(sass@1.70.0) zod: specifier: ^3.22.4 version: 3.22.4 @@ -1365,35 +1365,35 @@ packages: resolution: {integrity: sha512-Ii3MrfY/GAIN3OhXNzpCKaLxHQfJF9qvwq/kEJYdqDxeIHa01K8sldugal6TmeeXl+WMvhv9cnVzUTaFFJF09A==} dependencies: '@floating-ui/utils': 0.1.6 + dev: false - /@floating-ui/core@1.5.3: - resolution: {integrity: sha512-O0WKDOo0yhJuugCx6trZQj5jVJ9yR0ystG2JaNAemYUWce+pmM6WUEFIibnWyEJKdrDxhm75NoSRME35FNaM/Q==} + /@floating-ui/core@1.6.0: + resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} dependencies: '@floating-ui/utils': 0.2.1 - dev: false /@floating-ui/dom@1.5.3: resolution: {integrity: sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==} dependencies: '@floating-ui/core': 1.5.2 '@floating-ui/utils': 0.1.6 - - /@floating-ui/dom@1.5.4: - resolution: {integrity: sha512-jByEsHIY+eEdCjnTVu+E3ephzTOzkQ8hgUfGwos+bg7NlH33Zc5uO+QHz1mrQUOgIKKDD1RtS201P9NvAfq3XQ==} - dependencies: - '@floating-ui/core': 1.5.3 - '@floating-ui/utils': 0.2.1 dev: false + /@floating-ui/dom@1.6.1: + resolution: {integrity: sha512-iA8qE43/H5iGozC3W0YSnVSW42Vh522yyM1gj+BqRwVsTNOyr231PsXDaV04yT39PsO0QL2QpbI/M0ZaLUQgRQ==} + dependencies: + '@floating-ui/core': 1.6.0 + '@floating-ui/utils': 0.2.1 + /@floating-ui/utils@0.1.6: resolution: {integrity: sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==} + dev: false /@floating-ui/utils@0.2.1: resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} - dev: false - /@fontsource/fira-mono@4.5.10: - resolution: {integrity: sha512-bxUnRP8xptGRo8YXeY073DSpfK74XpSb0ZyRNpHV9WvLnJ7TwPOjZll8hTMin7zLC6iOp59pDZ8EQDj1gzgAQQ==} + /@fontsource/fira-mono@5.0.8: + resolution: {integrity: sha512-8OJiUK2lzJjvDlkmamEfhtpL1cyFApg1Pk4kE5Pw5UTf1ETF3Yy/pprgwV5I+LQPDjuFvinsinT9xSUZ2b/zuQ==} dev: false /@humanwhocodes/config-array@0.11.13: @@ -1620,17 +1620,10 @@ packages: dev: true optional: true - /@internationalized/date@3.5.0: - resolution: {integrity: sha512-nw0Q+oRkizBWMioseI8+2TeUPEyopJVz5YxoYVzR0W1v+2YytiYah7s/ot35F149q/xAg4F1gT/6eTd+tsUpFQ==} - dependencies: - '@swc/helpers': 0.5.3 - dev: true - /@internationalized/date@3.5.1: resolution: {integrity: sha512-LUQIfwU9e+Fmutc/DpRTGXSdgYZLBegi4wygCWDSVmUdLTaMHsQyASDiJtREwanwKuQLq0hY76fCJ9J/9I2xOQ==} dependencies: - '@swc/helpers': 0.5.3 - dev: false + '@swc/helpers': 0.5.6 /@jest/schemas@29.6.3: resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} @@ -1718,26 +1711,26 @@ packages: - supports-color dev: false - /@melt-ui/pp@0.3.0(@melt-ui/svelte@0.70.0)(svelte@4.2.10): + /@melt-ui/pp@0.3.0(@melt-ui/svelte@0.73.0)(svelte@4.2.10): resolution: {integrity: sha512-b07Bdh8l2KcwKVCXOY+SoBw1dk9eWvQfMSi6SoacpRVyVmmfpi0kV4oGt3HYF0tUCB3sEmVicxse50ZzZxEzEA==} engines: {pnpm: '>=8.6.3'} peerDependencies: '@melt-ui/svelte': '>= 0.29.0' svelte: ^3.55.0 || ^4.0.0 || ^5.0.0-next.1 dependencies: - '@melt-ui/svelte': 0.70.0(svelte@4.2.10) + '@melt-ui/svelte': 0.73.0(svelte@4.2.10) estree-walker: 3.0.3 magic-string: 0.30.5 svelte: 4.2.10 dev: true - /@melt-ui/svelte@0.68.0(svelte@4.2.10): - resolution: {integrity: sha512-/QvA98hnYEodZtHJ71+ocum/WWp30hVNt3F8uiZKnNYwZDaiQYjlyR9AaGKYcZLCe6R68op1mfCzc0kTzJilyA==} + /@melt-ui/svelte@0.71.2(svelte@4.2.10): + resolution: {integrity: sha512-GDUErhAphEoEOLpcBjQ84BgzRR6M3344fQE4QYFffwT7aedWak7CvNsECgeig1Y5xvfDmeEaFnGlOQXIBucJYw==} peerDependencies: svelte: '>=3 <5' dependencies: - '@floating-ui/core': 1.5.3 - '@floating-ui/dom': 1.5.4 + '@floating-ui/core': 1.6.0 + '@floating-ui/dom': 1.6.1 '@internationalized/date': 3.5.1 dequal: 2.0.3 focus-trap: 7.5.4 @@ -1745,14 +1738,14 @@ packages: svelte: 4.2.10 dev: false - /@melt-ui/svelte@0.70.0(svelte@4.2.10): - resolution: {integrity: sha512-ni14892MHJMAxSl2cz1pcgfnLR7fee1nNDJmx47hV19ewxSs8eQ8iguPrfx1ONtgjbp2YYVZhlpERi7szd30cA==} + /@melt-ui/svelte@0.73.0(svelte@4.2.10): + resolution: {integrity: sha512-KD9Z+5DDhnZmDUZv1GQ0+LGeXjxl1zwrB8JAwmGeMN6EigTvXMsTPtrFRUYC+TtEjVq82eTlJzuf4C/a88MkjA==} peerDependencies: svelte: '>=3 <5' dependencies: - '@floating-ui/core': 1.5.2 - '@floating-ui/dom': 1.5.3 - '@internationalized/date': 3.5.0 + '@floating-ui/core': 1.6.0 + '@floating-ui/dom': 1.6.1 + '@internationalized/date': 3.5.1 dequal: 2.0.3 focus-trap: 7.5.4 nanoid: 5.0.5 @@ -2968,7 +2961,7 @@ packages: sirv: 2.0.4 svelte: 4.2.10 tiny-glob: 0.2.9 - vite: 5.0.12(@types/node@18.19.14)(sass@1.70.0) + vite: 5.0.12(@types/node@20.11.16)(sass@1.70.0) /@sveltejs/vite-plugin-svelte-inspector@2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.10)(vite@5.0.12): resolution: {integrity: sha512-gjr9ZFg1BSlIpfZ4PRewigrvYmHWbDrq2uvvPB1AmTWKuM+dI1JXQSUu2pIrYLb/QncyiIGkFDFKTwJ0XqQZZg==} @@ -2981,7 +2974,7 @@ packages: '@sveltejs/vite-plugin-svelte': 3.0.2(svelte@4.2.10)(vite@5.0.12) debug: 4.3.4 svelte: 4.2.10 - vite: 5.0.12(@types/node@18.19.14)(sass@1.70.0) + vite: 5.0.12(@types/node@20.11.16)(sass@1.70.0) transitivePeerDependencies: - supports-color @@ -2999,13 +2992,13 @@ packages: magic-string: 0.30.5 svelte: 4.2.10 svelte-hmr: 0.15.3(svelte@4.2.10) - vite: 5.0.12(@types/node@18.19.14)(sass@1.70.0) + vite: 5.0.12(@types/node@20.11.16)(sass@1.70.0) vitefu: 0.2.5(vite@5.0.12) transitivePeerDependencies: - supports-color - /@swc/helpers@0.5.3: - resolution: {integrity: sha512-FaruWX6KdudYloq1AHD/4nU+UsMTdNE8CKyrseXWEcgjDAbvkwJg2QGPAnfIJLIWsjZOSPLOAykK6fuYp4vp4A==} + /@swc/helpers@0.5.6: + resolution: {integrity: sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==} dependencies: tslib: 2.6.2 @@ -3029,10 +3022,6 @@ packages: dev: false optional: true - /@types/cookie@0.5.4: - resolution: {integrity: sha512-7z/eR6O859gyWIAjuvBWFzNURmf2oPBmJlfVWkwehU5nzIyjwBsTh7WMmEEV4JFnHuQ3ex4oyTvfKzcyJVDBNA==} - dev: true - /@types/cookie@0.6.0: resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} @@ -3047,8 +3036,8 @@ packages: resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} dev: true - /@types/node@18.19.14: - resolution: {integrity: sha512-EnQ4Us2rmOS64nHDWr0XqAD8DsO6f3XR6lf9UIIrZQpUzPVdN/oPuEzfDWNHSyXLvoGgjuEm/sPwFGSSs35Wtg==} + /@types/node@20.11.16: + resolution: {integrity: sha512-gKb0enTmRCzXSSUJDq6/sPcqrfCv2mkkG6Jt/clpn5eiCbKTY+SgZUxo+p8ZKMof5dCp9vHQUAB7wOUTod22wQ==} dependencies: undici-types: 5.26.5 @@ -3467,13 +3456,13 @@ packages: file-uri-to-path: 1.0.0 dev: false - /bits-ui@0.15.1(svelte@4.2.10): - resolution: {integrity: sha512-1Np8bT6W6SC2tKESfm0CySW+7+xU5S0GuUZqIxC41atZE3WIRiRlzXEYHxW88w6UaLFzZ51ns4E7pchkdV5XCQ==} + /bits-ui@0.17.0(svelte@4.2.10): + resolution: {integrity: sha512-K73jjco1qPmvGXMQtTkZG6K36UmNrPR21u+C1jzoRWmF3NnUfDP4hPJnAci0LosUycfvOxtaHB1M4awvLvQXyQ==} peerDependencies: svelte: ^4.0.0 dependencies: '@internationalized/date': 3.5.1 - '@melt-ui/svelte': 0.68.0(svelte@4.2.10) + '@melt-ui/svelte': 0.71.2(svelte@4.2.10) nanoid: 5.0.5 svelte: 4.2.10 dev: false @@ -3706,11 +3695,6 @@ packages: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} dev: false - /cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} - engines: {node: '>= 0.6'} - dev: false - /cookie@0.6.0: resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} @@ -4745,8 +4729,8 @@ packages: engines: {node: '>=16.17.0'} dev: true - /iconify-icon@1.0.8: - resolution: {integrity: sha512-jvbUKHXf8EnGGArmhlP2IG8VqQLFFyTvTqb9LVL2TKTh7/eCCD1o2HHE9thpbJJb6B8hzhcFb6rOKhvo7reNKA==} + /iconify-icon@2.0.0: + resolution: {integrity: sha512-38ArOkxmyD9oDbJBkxaFpE6eZ0K3F9Sk+3x4mWGfjMJaxi3EKrix9Du4iWhgBFT3imKC4FJJE34ur2Rc7Xm+Uw==} dependencies: '@iconify/types': 2.0.0 dev: false @@ -5116,10 +5100,10 @@ packages: oslo: 1.0.1 dev: false - /lucide-svelte@0.298.0(svelte@4.2.10): - resolution: {integrity: sha512-7xYNSMY1z1QMjLe8GWToFtFh0lvTsrxdgEAXMite/Urn9tPD16Xk3597ibpgt9Ff7IBb/ArMc3y3ZKofZhs8fQ==} + /lucide-svelte@0.323.0(svelte@4.2.10): + resolution: {integrity: sha512-3GEFk1vCwB8BtHTHZTocFJfX6AtTLQw9a74JSuihAGx+MzhxqeWk8W1TkM4WUlvE0x9UdONM2rJGRyx9IyjkJg==} peerDependencies: - svelte: '>=3 <5' + svelte: ^3 || ^4 || ^5.0.0-next.42 dependencies: svelte: 4.2.10 dev: false @@ -5791,6 +5775,18 @@ packages: read-cache: 1.0.0 resolve: 1.22.8 + /postcss-import@16.0.0(postcss@8.4.35): + resolution: {integrity: sha512-e77lhVvrD1I2y7dYmBv0k9ULTdArgEYZt97T4w6sFIU5uxIHvDFQlKgUUyY7v7Barj0Yf/zm5A4OquZN7jKm5Q==} + engines: {node: '>=18.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.35 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + dev: true + /postcss-js@4.0.1(postcss@8.4.35): resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} engines: {node: ^12 || ^14 || >= 16} @@ -5827,7 +5823,7 @@ packages: dependencies: lilconfig: 2.1.0 postcss: 8.4.35 - ts-node: 10.9.2(@types/node@18.19.14)(typescript@5.3.3) + ts-node: 10.9.2(@types/node@20.11.16)(typescript@5.3.3) yaml: 1.10.2 dev: true @@ -5845,9 +5841,26 @@ packages: dependencies: lilconfig: 3.0.0 postcss: 8.4.35 - ts-node: 10.9.2(@types/node@18.19.14)(typescript@5.3.3) + ts-node: 10.9.2(@types/node@20.11.16)(typescript@5.3.3) yaml: 2.3.4 + /postcss-load-config@5.0.2(postcss@8.4.35): + resolution: {integrity: sha512-Q8QR3FYbqOKa0bnC1UQ2bFq9/ulHX5Bi34muzitMr8aDtUelO5xKeJEYC/5smE0jNE9zdB/NBnOwXKexELbRlw==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + dependencies: + lilconfig: 3.0.0 + postcss: 8.4.35 + yaml: 2.3.4 + dev: true + /postcss-logical@7.0.0(postcss@8.4.35): resolution: {integrity: sha512-zYf3vHkoW82f5UZTEXChTJvH49Yl9X37axTZsJGxrCG2kOUwtaAoz9E7tqYg0lsIoJLybaL8fk/2mOi81zVIUw==} engines: {node: ^14 || ^16 || >=18} @@ -6539,7 +6552,7 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - /svelte-check@3.6.3(postcss-load-config@4.0.2)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.10): + /svelte-check@3.6.3(postcss-load-config@5.0.2)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.10): resolution: {integrity: sha512-Q2nGnoysxUnB9KjnjpQLZwdjK62DHyW6nuH/gm2qteFnDk0lCehe/6z8TsIvYeKjC6luKaWxiNGyOcWiLLPSwA==} hasBin: true peerDependencies: @@ -6552,7 +6565,7 @@ packages: picocolors: 1.0.0 sade: 1.8.1 svelte: 4.2.10 - svelte-preprocess: 5.1.3(postcss-load-config@4.0.2)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.10)(typescript@5.3.3) + svelte-preprocess: 5.1.3(postcss-load-config@5.0.2)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.10)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: - '@babel/core' @@ -6623,7 +6636,7 @@ packages: svelte: 4.2.10 dev: true - /svelte-preprocess@5.1.3(postcss-load-config@4.0.2)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.10)(typescript@5.3.3): + /svelte-preprocess@5.1.3(postcss-load-config@5.0.2)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.10)(typescript@5.3.3): resolution: {integrity: sha512-xxAkmxGHT+J/GourS5mVJeOXZzne1FR5ljeOUAMXUkfEhkLEllRreXpbl3dIYJlcJRfL1LO1uIAPpBpBfiqGPw==} engines: {node: '>= 16.0.0', pnpm: ^8.0.0} requiresBuild: true @@ -6665,7 +6678,7 @@ packages: detect-indent: 6.1.0 magic-string: 0.30.5 postcss: 8.4.35 - postcss-load-config: 4.0.2(postcss@8.4.35)(ts-node@10.9.2) + postcss-load-config: 5.0.2(postcss@8.4.35) sass: 1.70.0 sorcery: 0.11.0 strip-indent: 3.0.0 @@ -6889,7 +6902,7 @@ packages: /ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - /ts-node@10.9.2(@types/node@18.19.14)(typescript@5.3.3): + /ts-node@10.9.2(@types/node@20.11.16)(typescript@5.3.3): resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: @@ -6908,7 +6921,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 18.19.14 + '@types/node': 20.11.16 acorn: 8.11.2 acorn-walk: 8.3.0 arg: 4.1.3 @@ -7064,7 +7077,7 @@ packages: - rollup dev: true - /vite-node@1.2.2(@types/node@18.19.14)(sass@1.70.0): + /vite-node@1.2.2(@types/node@20.11.16)(sass@1.70.0): resolution: {integrity: sha512-1as4rDTgVWJO3n1uHmUYqq7nsFgINQ9u+mRcXpjeOMJUmviqNKjcZB7UfRZrlM7MjYXMKpuWp5oGkjaFLnjawg==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -7073,7 +7086,7 @@ packages: debug: 4.3.4 pathe: 1.1.1 picocolors: 1.0.0 - vite: 5.0.12(@types/node@18.19.14)(sass@1.70.0) + vite: 5.0.12(@types/node@20.11.16)(sass@1.70.0) transitivePeerDependencies: - '@types/node' - less @@ -7085,7 +7098,7 @@ packages: - terser dev: true - /vite@5.0.12(@types/node@18.19.14)(sass@1.70.0): + /vite@5.0.12(@types/node@20.11.16)(sass@1.70.0): resolution: {integrity: sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -7113,7 +7126,7 @@ packages: terser: optional: true dependencies: - '@types/node': 18.19.14 + '@types/node': 20.11.16 esbuild: 0.19.10 postcss: 8.4.35 rollup: 4.9.1 @@ -7129,9 +7142,9 @@ packages: vite: optional: true dependencies: - vite: 5.0.12(@types/node@18.19.14)(sass@1.70.0) + vite: 5.0.12(@types/node@20.11.16)(sass@1.70.0) - /vitest@1.2.2(@types/node@18.19.14)(sass@1.70.0): + /vitest@1.2.2(@types/node@20.11.16)(sass@1.70.0): resolution: {integrity: sha512-d5Ouvrnms3GD9USIK36KG8OZ5bEvKEkITFtnGv56HFaSlbItJuYr7hv2Lkn903+AvRAgSixiamozUVfORUekjw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -7156,7 +7169,7 @@ packages: jsdom: optional: true dependencies: - '@types/node': 18.19.14 + '@types/node': 20.11.16 '@vitest/expect': 1.2.2 '@vitest/runner': 1.2.2 '@vitest/snapshot': 1.2.2 @@ -7175,8 +7188,8 @@ packages: strip-literal: 1.3.0 tinybench: 2.5.1 tinypool: 0.8.2 - vite: 5.0.12(@types/node@18.19.14)(sass@1.70.0) - vite-node: 1.2.2(@types/node@18.19.14)(sass@1.70.0) + vite: 5.0.12(@types/node@20.11.16)(sass@1.70.0) + vite-node: 1.2.2(@types/node@20.11.16)(sass@1.70.0) why-is-node-running: 2.2.2 transitivePeerDependencies: - less diff --git a/src/routes/(auth)/sign-up/+page.server.ts b/src/routes/(auth)/sign-up/+page.server.ts index f34c5f5..b0c0da2 100644 --- a/src/routes/(auth)/sign-up/+page.server.ts +++ b/src/routes/(auth)/sign-up/+page.server.ts @@ -1,5 +1,5 @@ import { fail, error, type Actions, redirect } from '@sveltejs/kit'; -import { superValidate } from 'sveltekit-superforms/server'; +import { setError, superValidate } from 'sveltekit-superforms/server'; import type { PageServerLoad } from './$types'; import prisma from '$lib/prisma'; import { lucia } from '$lib/server/auth'; @@ -58,57 +58,54 @@ export const actions: Actions = { let session; let sessionCookie; // Adding user to the db + console.log('Check if user already exists'); + + const existing_user = await db.query + .users + .findFirst({ where: eq(users.username, form.data.username) }); + + if (existing_user) { + return setError(form, 'username', 'You cannot create an account with that username'); + } + + console.log('Creating user'); + + const hashedPassword = await new Argon2id().hash(form.data.password); + + await db.insert(users) + .values({ + username: form.data.username, + hashed_password: hashedPassword, + email: form.data.email || '', + first_name: form.data.firstName || '', + last_name: form.data.lastName || '', + verified: false, + receive_email: false, + theme: 'system' + }); + const user = await db.select() + .from(users) + .where(eq(users.username, form.data.username)); + console.log('signup user', user); + + if (!user || user.length === 0) { + return fail(400, { + form, + message: `Could not create your account. Please try again. If the problem persists, please contact support. Error ID: ${nanoid()}` + }); + } + + add_user_to_role(user[0].id, 'user'); + await db.insert(collections) + .values({ + user_id: user[0].id + }); + await db.insert(wishlists) + .values({ + user_id: user[0].id + }); + try { - console.log('Check if user already exists'); - - const existing_user = await db.query - .users - .findFirst({ where: eq(users.username, form.data.username) }); - - if (existing_user) { - return fail(400, { - form, - message: 'You cannot create an account with that username' - }); - } - - console.log('Creating user'); - - const hashedPassword = await new Argon2id().hash(form.data.password); - - await db.insert(users) - .values({ - username: form.data.username, - hashed_password: hashedPassword, - email: form.data.email || '', - first_name: form.data.firstName || '', - last_name: form.data.lastName || '', - verified: false, - receive_email: false, - theme: 'system' - }); - const user = await db.select() - .from(users) - .where(eq(users.username, form.data.username)); - console.log('signup user', user); - - if (!user || user.length === 0) { - return fail(400, { - form, - message: `Could not create your account. Please try again. If the problem persists, please contact support. Error ID: ${nanoid()}` - }); - } - - add_user_to_role(user[0].id, 'user'); - await db.insert(collections) - .values({ - user_id: user[0].id - }); - await db.insert(wishlists) - .values({ - user_id: user[0].id - }); - session = await lucia.createSession(user[0].id, { ip_country: event.locals.session?.ipCountry, ip_address: event.locals.session?.ipAddress @@ -134,8 +131,8 @@ export const actions: Actions = { ...sessionCookie.attributes }); - // redirect(302, '/'); - const message = { type: 'success', message: 'Signed Up!' } as const; - throw flashRedirect(message, event); + redirect(302, '/'); + // const message = { type: 'success', message: 'Signed Up!' } as const; + // throw flashRedirect(message, event); } }; From 9a34d0efec264bf9f0d5bd004e19f59f8c43d8c5 Mon Sep 17 00:00:00 2001 From: Bradley Shellnut Date: Wed, 7 Feb 2024 19:37:54 -0800 Subject: [PATCH 10/34] Fixing signup creation of lists. --- src/routes/(auth)/login/+page.server.ts | 39 +++++++---------------- src/routes/(auth)/sign-up/+page.server.ts | 1 - 2 files changed, 12 insertions(+), 28 deletions(-) diff --git a/src/routes/(auth)/login/+page.server.ts b/src/routes/(auth)/login/+page.server.ts index 4d7da02..623fca6 100644 --- a/src/routes/(auth)/login/+page.server.ts +++ b/src/routes/(auth)/login/+page.server.ts @@ -1,11 +1,13 @@ import { fail, type Actions } from '@sveltejs/kit'; import { setError, superValidate } from 'sveltekit-superforms/server'; import { redirect } from 'sveltekit-flash-message/server'; -import prisma from '$lib/prisma'; import { lucia } from '$lib/server/auth'; import { Argon2id } from 'oslo/password'; import { userSchema } from '$lib/config/zod-schemas'; import type { PageServerLoad } from './$types'; +import db from '$lib/drizzle'; +import { eq, sql } from 'drizzle-orm'; +import { collections, users, wishlists } from '../../../schema'; const signInSchema = userSchema.pick({ username: true, @@ -43,10 +45,8 @@ export const actions: Actions = { try { const password = form.data.password; - const user = await prisma.user.findUnique({ - where: { - username: form.data.username - } + const user = await db.query.users.findFirst({ + where: eq(users.username, form.data.username) }); console.log('user', JSON.stringify(user, null, 2)); @@ -71,28 +71,13 @@ export const actions: Actions = { }); sessionCookie = lucia.createSessionCookie(session.id); - await prisma.collection.upsert({ - where: { - user_id: user.id - }, - create: { - user_id: user.id - }, - update: { - user_id: user.id - } - }); - await prisma.wishlist.upsert({ - where: { - user_id: user.id - }, - create: { - user_id: user.id - }, - update: { - user_id: user.id - } - }); + await db.insert(collections).values({ + user_id: user.id + }).onDuplicateKeyUpdate({ set: { user_id: sql`user_id` } }); + + await db.insert(wishlists).values({ + user_id: user.id + }).onDuplicateKeyUpdate({ set: { user_id: sql`user_id` } }); } catch (e) { // TODO: need to return error message to the client console.error(e); diff --git a/src/routes/(auth)/sign-up/+page.server.ts b/src/routes/(auth)/sign-up/+page.server.ts index b0c0da2..2ecf020 100644 --- a/src/routes/(auth)/sign-up/+page.server.ts +++ b/src/routes/(auth)/sign-up/+page.server.ts @@ -45,7 +45,6 @@ export const load: PageServerLoad = async (event) => { export const actions: Actions = { default: async (event) => { - const { cookies } = event; const form = await superValidate(event, signUpSchema); if (!form.valid) { form.data.password = ''; From baafd75839466e99465d3076ade692a798ed6008 Mon Sep 17 00:00:00 2001 From: Bradley Shellnut Date: Thu, 8 Feb 2024 18:56:09 -0800 Subject: [PATCH 11/34] Moving drizzle from MySQL to Postgres because more features exist there I like and am used to. --- drizzle.config.ts | 6 +- drizzle/0000_oval_wolverine.sql | 233 +++++++++ drizzle/0000_true_sugar_man.sql | 192 ------- drizzle/0001_giant_tomorrow_man.sql | 51 ++ drizzle/0001_motionless_old_lace.sql | 2 - drizzle/meta/0000_snapshot.json | 542 +++++++------------- drizzle/meta/0001_snapshot.json | 588 ++++++++-------------- drizzle/meta/_journal.json | 10 +- package.json | 9 +- pnpm-lock.yaml | 187 ++++++- prisma/schema.prisma | 1 - src/lib/drizzle.ts | 8 +- src/lib/server/auth.ts | 4 +- src/lib/utils/dbUtils.ts | 60 +-- src/lib/zodValidation.ts | 1 - src/migrate.ts | 8 +- src/routes/(app)/search/+page.server.ts | 5 +- src/routes/(auth)/login/+page.server.ts | 4 +- src/routes/(auth)/sign-up/+page.server.ts | 14 +- src/routes/api/game/search/+server.ts | 85 ++-- src/schema.ts | 227 ++++++--- src/seed/insert.ts | 32 +- 22 files changed, 1135 insertions(+), 1134 deletions(-) create mode 100644 drizzle/0000_oval_wolverine.sql delete mode 100644 drizzle/0000_true_sugar_man.sql create mode 100644 drizzle/0001_giant_tomorrow_man.sql delete mode 100644 drizzle/0001_motionless_old_lace.sql diff --git a/drizzle.config.ts b/drizzle.config.ts index 3ffe7e3..3af6c25 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -4,12 +4,12 @@ import { defineConfig } from 'drizzle-kit'; export default defineConfig({ schema: './src/schema.ts', out: './drizzle', - driver: 'mysql2', + driver: 'pg', dbCredentials: { host: process.env.DATABASE_HOST || 'localhost', - port: 3306, + port: process.env.DATABASE_PORT || 5432, user: process.env.DATABASE_USER, password: process.env.DATABASE_PASSWORD, - database: process.env.DATABASE || 'nut-shells' + database: process.env.DATABASE || 'boredgame' } }); \ No newline at end of file diff --git a/drizzle/0000_oval_wolverine.sql b/drizzle/0000_oval_wolverine.sql new file mode 100644 index 0000000..1b053cc --- /dev/null +++ b/drizzle/0000_oval_wolverine.sql @@ -0,0 +1,233 @@ +CREATE TABLE IF NOT EXISTS "artists" ( + "id" varchar(255) PRIMARY KEY NOT NULL, + "name" varchar(255), + "slug" varchar(255), + "external_id" integer, + "created_at" timestamp with time zone DEFAULT (now(6)), + "updated_at" timestamp with time zone DEFAULT (now(6)) +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "artists_to_games" ( + "artist_id" varchar(255), + "game_id" varchar(255) +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "categories" ( + "id" varchar(255) PRIMARY KEY NOT NULL, + "name" varchar(255), + "slug" varchar(255), + "external_id" integer, + "created_at" timestamp with time zone DEFAULT (now(6)), + "updated_at" timestamp with time zone DEFAULT (now(6)) +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "categories_to_games" ( + "category_id" varchar(255), + "game_id" varchar(255) +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "collection_items" ( + "id" varchar(255) PRIMARY KEY NOT NULL, + "collection_id" varchar(255) NOT NULL, + "game_id" varchar(255) NOT NULL, + "created_at" timestamp with time zone DEFAULT (now(6)), + "updated_at" timestamp with time zone DEFAULT (now(6)) +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "collections" ( + "id" varchar(255) PRIMARY KEY NOT NULL, + "user_id" varchar(255) NOT NULL, + "created_at" timestamp with time zone DEFAULT (now(6)), + "updated_at" timestamp with time zone DEFAULT (now(6)) +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "designers" ( + "id" varchar(255) PRIMARY KEY NOT NULL, + "name" varchar(255), + "slug" varchar(255), + "external_id" integer, + "created_at" timestamp with time zone DEFAULT (now(6)), + "updated_at" timestamp with time zone DEFAULT (now(6)) +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "designers_to_games" ( + "designer_id" varchar(255), + "game_id" varchar(255) +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "expansions" ( + "id" varchar(255) PRIMARY KEY NOT NULL, + "base_game_id" varchar(255) NOT NULL, + "game_id" varchar(255) NOT NULL, + "created_at" timestamp with time zone DEFAULT (now(6)), + "updated_at" timestamp with time zone DEFAULT (now(6)) +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "games" ( + "id" varchar(255) PRIMARY KEY NOT NULL, + "name" varchar(255), + "slug" varchar(255), + "description" text, + "year_published" integer, + "min_players" integer, + "max_players" integer, + "playtime" integer, + "min_playtime" integer, + "max_playtime" integer, + "min_age" integer, + "image_url" varchar(255), + "thumb_url" varchar(255), + "url" varchar(255), + "external_id" integer, + "last_sync_at" timestamp with time zone, + "created_at" timestamp with time zone DEFAULT (now(6)), + "updated_at" timestamp with time zone DEFAULT (now(6)), + CONSTRAINT "games_external_id_unique" UNIQUE("external_id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "mechanics" ( + "id" varchar(255) PRIMARY KEY NOT NULL, + "name" varchar(255), + "slug" varchar(255), + "external_id" integer, + "created_at" timestamp with time zone DEFAULT (now(6)), + "updated_at" timestamp with time zone DEFAULT (now(6)) +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "mechanics_to_games" ( + "mechanic_id" varchar(255), + "game_id" varchar(255) +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "publishers" ( + "id" varchar(255) PRIMARY KEY NOT NULL, + "name" varchar(255), + "slug" varchar(255), + "external_id" integer, + "created_at" timestamp with time zone DEFAULT (now(6)), + "updated_at" timestamp with time zone DEFAULT (now(6)) +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "publishers_to_games" ( + "publisher_id" varchar(255), + "game_id" varchar(255) +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "roles" ( + "id" varchar(255) PRIMARY KEY NOT NULL, + "name" varchar(255), + CONSTRAINT "roles_name_unique" UNIQUE("name") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "sessions" ( + "id" varchar(255) PRIMARY KEY NOT NULL, + "user_id" varchar(255) NOT NULL, + "expires_at" timestamp with time zone NOT NULL, + "ip_country" varchar(255), + "ip_address" varchar(255) +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "user_roles" ( + "id" varchar(255) PRIMARY KEY NOT NULL, + "user_id" varchar(255) NOT NULL, + "role_id" varchar(255) NOT NULL, + "created_at" timestamp with time zone DEFAULT (now(6)), + "updated_at" timestamp with time zone DEFAULT (now(6)) +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "users" ( + "id" varchar(255) PRIMARY KEY NOT NULL, + "username" varchar(255), + "hashed_password" varchar(255), + "email" varchar(255), + "first_name" varchar(255), + "last_name" varchar(255), + "verified" boolean DEFAULT false, + "receive_email" boolean DEFAULT false, + "theme" varchar(255) DEFAULT 'system', + "created_at" timestamp DEFAULT (now(6)), + "updated_at" timestamp DEFAULT (now(6)), + CONSTRAINT "users_username_unique" UNIQUE("username"), + CONSTRAINT "users_email_unique" UNIQUE("email") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "wishlist_items" ( + "id" varchar(255) PRIMARY KEY NOT NULL, + "wishlist_id" varchar(255) NOT NULL, + "game_id" varchar(255) NOT NULL, + "created_at" timestamp with time zone DEFAULT (now(6)), + "updated_at" timestamp with time zone DEFAULT (now(6)) +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "wishlists" ( + "id" varchar(255) PRIMARY KEY NOT NULL, + "user_id" varchar(255) NOT NULL, + "created_at" timestamp with time zone DEFAULT (now(6)), + "updated_at" timestamp with time zone DEFAULT (now(6)) +); +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "collection_items" ADD CONSTRAINT "collection_items_collection_id_collections_id_fk" FOREIGN KEY ("collection_id") REFERENCES "collections"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "collection_items" ADD CONSTRAINT "collection_items_game_id_games_id_fk" FOREIGN KEY ("game_id") REFERENCES "games"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "collections" ADD CONSTRAINT "collections_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "expansions" ADD CONSTRAINT "expansions_base_game_id_games_id_fk" FOREIGN KEY ("base_game_id") REFERENCES "games"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "expansions" ADD CONSTRAINT "expansions_game_id_games_id_fk" FOREIGN KEY ("game_id") REFERENCES "games"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "sessions" ADD CONSTRAINT "sessions_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "user_roles" ADD CONSTRAINT "user_roles_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "user_roles" ADD CONSTRAINT "user_roles_role_id_roles_id_fk" FOREIGN KEY ("role_id") REFERENCES "roles"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "wishlist_items" ADD CONSTRAINT "wishlist_items_wishlist_id_wishlists_id_fk" FOREIGN KEY ("wishlist_id") REFERENCES "wishlists"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "wishlist_items" ADD CONSTRAINT "wishlist_items_game_id_games_id_fk" FOREIGN KEY ("game_id") REFERENCES "games"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "wishlists" ADD CONSTRAINT "wishlists_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; diff --git a/drizzle/0000_true_sugar_man.sql b/drizzle/0000_true_sugar_man.sql deleted file mode 100644 index 02b1d66..0000000 --- a/drizzle/0000_true_sugar_man.sql +++ /dev/null @@ -1,192 +0,0 @@ -CREATE TABLE `artists` ( - `id` varchar(255) NOT NULL, - `name` varchar(255), - `slug` varchar(255), - `external_id` int, - `created_at` datetime DEFAULT (now(6)), - `updated_at` datetime DEFAULT (now(6)), - CONSTRAINT `artists_id` PRIMARY KEY(`id`) -); ---> statement-breakpoint -CREATE TABLE `artists_to_games` ( - `artist_id` varchar(255), - `game_id` varchar(255) -); ---> statement-breakpoint -CREATE TABLE `categories` ( - `id` varchar(255) NOT NULL, - `name` varchar(255), - `slug` varchar(255), - `external_id` int, - `created_at` datetime DEFAULT (now(6)), - `updated_at` datetime DEFAULT (now(6)), - CONSTRAINT `categories_id` PRIMARY KEY(`id`) -); ---> statement-breakpoint -CREATE TABLE `categories_to_games` ( - `category_id` varchar(255), - `game_id` varchar(255) -); ---> statement-breakpoint -CREATE TABLE `collection_items` ( - `id` varchar(255) NOT NULL, - `collection_id` varchar(255) NOT NULL, - `game_id` varchar(255) NOT NULL, - `created_at` datetime DEFAULT (now(6)), - `updated_at` datetime DEFAULT (now(6)), - CONSTRAINT `collection_items_id` PRIMARY KEY(`id`) -); ---> statement-breakpoint -CREATE TABLE `collections` ( - `id` varchar(255) NOT NULL, - `user_id` varchar(255) NOT NULL, - `created_at` datetime DEFAULT (now(6)), - `updated_at` datetime DEFAULT (now(6)), - CONSTRAINT `collections_id` PRIMARY KEY(`id`) -); ---> statement-breakpoint -CREATE TABLE `designers` ( - `id` varchar(255) NOT NULL, - `name` varchar(255), - `slug` varchar(255), - `external_id` int, - `created_at` datetime DEFAULT (now(6)), - `updated_at` datetime DEFAULT (now(6)), - CONSTRAINT `designers_id` PRIMARY KEY(`id`) -); ---> statement-breakpoint -CREATE TABLE `designers_to_games` ( - `designer_id` varchar(255), - `game_id` varchar(255) -); ---> statement-breakpoint -CREATE TABLE `expansions` ( - `id` varchar(255) NOT NULL, - `base_game_id` varchar(255) NOT NULL, - `game_id` varchar(255) NOT NULL, - `created_at` datetime DEFAULT (now(6)), - `updated_at` datetime DEFAULT (now(6)), - CONSTRAINT `expansions_id` PRIMARY KEY(`id`) -); ---> statement-breakpoint -CREATE TABLE `games` ( - `id` varchar(255) NOT NULL, - `name` varchar(255), - `slug` varchar(255), - `description` text, - `year_published` year, - `min_players` int, - `max_players` int, - `playtime` int, - `min_playtime` int, - `max_playtime` int, - `min_age` int, - `image_url` varchar(255), - `thumb_url` varchar(255), - `url` varchar(255), - `external_id` int, - `last_sync_at` datetime, - `created_at` datetime DEFAULT (now(6)), - `updated_at` datetime DEFAULT (now(6)), - CONSTRAINT `games_id` PRIMARY KEY(`id`), - CONSTRAINT `games_external_id_unique` UNIQUE(`external_id`) -); ---> statement-breakpoint -CREATE TABLE `mechanics` ( - `id` varchar(255) NOT NULL, - `name` varchar(255), - `slug` varchar(255), - `external_id` int, - `created_at` datetime DEFAULT (now(6)), - `updated_at` datetime DEFAULT (now(6)), - CONSTRAINT `mechanics_id` PRIMARY KEY(`id`) -); ---> statement-breakpoint -CREATE TABLE `mechanics_to_games` ( - `mechanic_id` varchar(255), - `game_id` varchar(255) -); ---> statement-breakpoint -CREATE TABLE `publishers` ( - `id` varchar(255) NOT NULL, - `name` varchar(255), - `slug` varchar(255), - `external_id` int, - `created_at` datetime DEFAULT (now(6)), - `updated_at` datetime DEFAULT (now(6)), - CONSTRAINT `publishers_id` PRIMARY KEY(`id`) -); ---> statement-breakpoint -CREATE TABLE `publishers_to_games` ( - `publisher_id` varchar(255), - `game_id` varchar(255) -); ---> statement-breakpoint -CREATE TABLE `roles` ( - `id` varchar(255) NOT NULL, - `name` varchar(255), - CONSTRAINT `roles_id` PRIMARY KEY(`id`), - CONSTRAINT `roles_name_unique` UNIQUE(`name`) -); ---> statement-breakpoint -CREATE TABLE `sessions` ( - `id` varchar(255) NOT NULL, - `user_id` varchar(255) NOT NULL, - `expires_at` datetime NOT NULL, - CONSTRAINT `sessions_id` PRIMARY KEY(`id`) -); ---> statement-breakpoint -CREATE TABLE `user_roles` ( - `id` varchar(255) NOT NULL, - `user_id` varchar(255) NOT NULL, - `role_id` varchar(255) NOT NULL, - `created_at` datetime DEFAULT (now(6)), - `updated_at` datetime DEFAULT (now(6)), - CONSTRAINT `user_roles_id` PRIMARY KEY(`id`) -); ---> statement-breakpoint -CREATE TABLE `users` ( - `id` varchar(255) NOT NULL, - `username` varchar(255), - `hashed_password` varchar(255), - `email` varchar(255), - `first_name` varchar(255), - `last_name` varchar(255), - `verified` boolean DEFAULT false, - `receive_email` boolean DEFAULT false, - `theme` varchar(255) DEFAULT 'system', - `created_at` datetime DEFAULT (now(6)), - `updated_at` datetime DEFAULT (now(6)), - CONSTRAINT `users_id` PRIMARY KEY(`id`), - CONSTRAINT `users_username_unique` UNIQUE(`username`), - CONSTRAINT `users_email_unique` UNIQUE(`email`) -); ---> statement-breakpoint -CREATE TABLE `wishlist_items` ( - `id` varchar(255) NOT NULL, - `wishlist_id` varchar(255) NOT NULL, - `game_id` varchar(255) NOT NULL, - `created_at` datetime DEFAULT (now(6)), - `updated_at` datetime DEFAULT (now(6)), - CONSTRAINT `wishlist_items_id` PRIMARY KEY(`id`) -); ---> statement-breakpoint -CREATE TABLE `wishlists` ( - `id` varchar(255) NOT NULL, - `user_id` varchar(255) NOT NULL, - `created_at` datetime DEFAULT (now(6)), - `updated_at` datetime DEFAULT (now(6)), - CONSTRAINT `wishlists_id` PRIMARY KEY(`id`) -); ---> statement-breakpoint -ALTER TABLE `collection_items` ADD CONSTRAINT `collection_items_collection_id_collections_id_fk` FOREIGN KEY (`collection_id`) REFERENCES `collections`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint -ALTER TABLE `collection_items` ADD CONSTRAINT `collection_items_game_id_games_id_fk` FOREIGN KEY (`game_id`) REFERENCES `games`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint -ALTER TABLE `collections` ADD CONSTRAINT `collections_user_id_users_id_fk` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint -ALTER TABLE `expansions` ADD CONSTRAINT `expansions_base_game_id_games_id_fk` FOREIGN KEY (`base_game_id`) REFERENCES `games`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint -ALTER TABLE `expansions` ADD CONSTRAINT `expansions_game_id_games_id_fk` FOREIGN KEY (`game_id`) REFERENCES `games`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint -ALTER TABLE `sessions` ADD CONSTRAINT `sessions_user_id_users_id_fk` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE no action ON UPDATE no action;--> statement-breakpoint -ALTER TABLE `user_roles` ADD CONSTRAINT `user_roles_user_id_users_id_fk` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint -ALTER TABLE `user_roles` ADD CONSTRAINT `user_roles_role_id_roles_id_fk` FOREIGN KEY (`role_id`) REFERENCES `roles`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint -ALTER TABLE `wishlist_items` ADD CONSTRAINT `wishlist_items_wishlist_id_wishlists_id_fk` FOREIGN KEY (`wishlist_id`) REFERENCES `wishlists`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint -ALTER TABLE `wishlist_items` ADD CONSTRAINT `wishlist_items_game_id_games_id_fk` FOREIGN KEY (`game_id`) REFERENCES `games`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint -ALTER TABLE `wishlists` ADD CONSTRAINT `wishlists_user_id_users_id_fk` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE cascade ON UPDATE no action; \ No newline at end of file diff --git a/drizzle/0001_giant_tomorrow_man.sql b/drizzle/0001_giant_tomorrow_man.sql new file mode 100644 index 0000000..f893c21 --- /dev/null +++ b/drizzle/0001_giant_tomorrow_man.sql @@ -0,0 +1,51 @@ +ALTER TABLE "artists" ALTER COLUMN "created_at" SET DATA TYPE timestamp (6) with time zone;--> statement-breakpoint +ALTER TABLE "artists" ALTER COLUMN "created_at" SET DEFAULT (now());--> statement-breakpoint +ALTER TABLE "artists" ALTER COLUMN "updated_at" SET DATA TYPE timestamp (6) with time zone;--> statement-breakpoint +ALTER TABLE "artists" ALTER COLUMN "updated_at" SET DEFAULT (now());--> statement-breakpoint +ALTER TABLE "categories" ALTER COLUMN "created_at" SET DATA TYPE timestamp (6) with time zone;--> statement-breakpoint +ALTER TABLE "categories" ALTER COLUMN "created_at" SET DEFAULT (now());--> statement-breakpoint +ALTER TABLE "categories" ALTER COLUMN "updated_at" SET DATA TYPE timestamp (6) with time zone;--> statement-breakpoint +ALTER TABLE "categories" ALTER COLUMN "updated_at" SET DEFAULT (now());--> statement-breakpoint +ALTER TABLE "collection_items" ALTER COLUMN "created_at" SET DATA TYPE timestamp (6) with time zone;--> statement-breakpoint +ALTER TABLE "collection_items" ALTER COLUMN "created_at" SET DEFAULT (now());--> statement-breakpoint +ALTER TABLE "collection_items" ALTER COLUMN "updated_at" SET DATA TYPE timestamp (6) with time zone;--> statement-breakpoint +ALTER TABLE "collection_items" ALTER COLUMN "updated_at" SET DEFAULT (now());--> statement-breakpoint +ALTER TABLE "collections" ALTER COLUMN "created_at" SET DATA TYPE timestamp (6) with time zone;--> statement-breakpoint +ALTER TABLE "collections" ALTER COLUMN "created_at" SET DEFAULT (now());--> statement-breakpoint +ALTER TABLE "collections" ALTER COLUMN "updated_at" SET DATA TYPE timestamp (6) with time zone;--> statement-breakpoint +ALTER TABLE "collections" ALTER COLUMN "updated_at" SET DEFAULT (now());--> statement-breakpoint +ALTER TABLE "designers" ALTER COLUMN "created_at" SET DATA TYPE timestamp (6) with time zone;--> statement-breakpoint +ALTER TABLE "designers" ALTER COLUMN "created_at" SET DEFAULT (now());--> statement-breakpoint +ALTER TABLE "designers" ALTER COLUMN "updated_at" SET DATA TYPE timestamp (6) with time zone;--> statement-breakpoint +ALTER TABLE "designers" ALTER COLUMN "updated_at" SET DEFAULT (now());--> statement-breakpoint +ALTER TABLE "expansions" ALTER COLUMN "created_at" SET DATA TYPE timestamp (6) with time zone;--> statement-breakpoint +ALTER TABLE "expansions" ALTER COLUMN "created_at" SET DEFAULT (now());--> statement-breakpoint +ALTER TABLE "expansions" ALTER COLUMN "updated_at" SET DATA TYPE timestamp (6) with time zone;--> statement-breakpoint +ALTER TABLE "expansions" ALTER COLUMN "updated_at" SET DEFAULT (now());--> statement-breakpoint +ALTER TABLE "games" ALTER COLUMN "last_sync_at" SET DATA TYPE timestamp (6) with time zone;--> statement-breakpoint +ALTER TABLE "games" ALTER COLUMN "created_at" SET DATA TYPE timestamp (6) with time zone;--> statement-breakpoint +ALTER TABLE "games" ALTER COLUMN "created_at" SET DEFAULT (now());--> statement-breakpoint +ALTER TABLE "games" ALTER COLUMN "updated_at" SET DATA TYPE timestamp (6) with time zone;--> statement-breakpoint +ALTER TABLE "games" ALTER COLUMN "updated_at" SET DEFAULT (now());--> statement-breakpoint +ALTER TABLE "mechanics" ALTER COLUMN "created_at" SET DATA TYPE timestamp (6) with time zone;--> statement-breakpoint +ALTER TABLE "mechanics" ALTER COLUMN "created_at" SET DEFAULT (now());--> statement-breakpoint +ALTER TABLE "mechanics" ALTER COLUMN "updated_at" SET DATA TYPE timestamp (6) with time zone;--> statement-breakpoint +ALTER TABLE "mechanics" ALTER COLUMN "updated_at" SET DEFAULT (now());--> statement-breakpoint +ALTER TABLE "publishers" ALTER COLUMN "created_at" SET DATA TYPE timestamp (6) with time zone;--> statement-breakpoint +ALTER TABLE "publishers" ALTER COLUMN "created_at" SET DEFAULT (now());--> statement-breakpoint +ALTER TABLE "publishers" ALTER COLUMN "updated_at" SET DATA TYPE timestamp (6) with time zone;--> statement-breakpoint +ALTER TABLE "publishers" ALTER COLUMN "updated_at" SET DEFAULT (now());--> statement-breakpoint +ALTER TABLE "user_roles" ALTER COLUMN "created_at" SET DATA TYPE timestamp (6) with time zone;--> statement-breakpoint +ALTER TABLE "user_roles" ALTER COLUMN "created_at" SET DEFAULT (now());--> statement-breakpoint +ALTER TABLE "user_roles" ALTER COLUMN "updated_at" SET DATA TYPE timestamp (6) with time zone;--> statement-breakpoint +ALTER TABLE "user_roles" ALTER COLUMN "updated_at" SET DEFAULT (now());--> statement-breakpoint +ALTER TABLE "users" ALTER COLUMN "created_at" SET DEFAULT (now());--> statement-breakpoint +ALTER TABLE "users" ALTER COLUMN "updated_at" SET DEFAULT (now());--> statement-breakpoint +ALTER TABLE "wishlist_items" ALTER COLUMN "created_at" SET DATA TYPE timestamp (6) with time zone;--> statement-breakpoint +ALTER TABLE "wishlist_items" ALTER COLUMN "created_at" SET DEFAULT (now());--> statement-breakpoint +ALTER TABLE "wishlist_items" ALTER COLUMN "updated_at" SET DATA TYPE timestamp (6) with time zone;--> statement-breakpoint +ALTER TABLE "wishlist_items" ALTER COLUMN "updated_at" SET DEFAULT (now());--> statement-breakpoint +ALTER TABLE "wishlists" ALTER COLUMN "created_at" SET DATA TYPE timestamp (6) with time zone;--> statement-breakpoint +ALTER TABLE "wishlists" ALTER COLUMN "created_at" SET DEFAULT (now());--> statement-breakpoint +ALTER TABLE "wishlists" ALTER COLUMN "updated_at" SET DATA TYPE timestamp (6) with time zone;--> statement-breakpoint +ALTER TABLE "wishlists" ALTER COLUMN "updated_at" SET DEFAULT (now()); \ No newline at end of file diff --git a/drizzle/0001_motionless_old_lace.sql b/drizzle/0001_motionless_old_lace.sql deleted file mode 100644 index a0f73ea..0000000 --- a/drizzle/0001_motionless_old_lace.sql +++ /dev/null @@ -1,2 +0,0 @@ -ALTER TABLE `sessions` ADD `ip_country` varchar(255);--> statement-breakpoint -ALTER TABLE `sessions` ADD `ip_address` varchar(255); \ No newline at end of file diff --git a/drizzle/meta/0000_snapshot.json b/drizzle/meta/0000_snapshot.json index 25c0fa1..0a3baf1 100644 --- a/drizzle/meta/0000_snapshot.json +++ b/drizzle/meta/0000_snapshot.json @@ -1,85 +1,72 @@ { - "version": "5", - "dialect": "mysql", - "id": "d90c2144-2349-4a3f-b4f3-87b5ab209936", + "id": "620f89bd-01b9-4591-94e6-23a7bc63cdc3", "prevId": "00000000-0000-0000-0000-000000000000", + "version": "5", + "dialect": "pg", "tables": { "artists": { "name": "artists", + "schema": "", "columns": { "id": { "name": "id", "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "primaryKey": true, + "notNull": true }, "name": { "name": "name", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "slug": { "name": "slug", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "external_id": { "name": "external_id", - "type": "int", + "type": "integer", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "created_at": { "name": "created_at", - "type": "datetime", + "type": "timestamp with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, "default": "(now(6))" }, "updated_at": { "name": "updated_at", - "type": "datetime", + "type": "timestamp with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, "default": "(now(6))" } }, "indexes": {}, "foreignKeys": {}, - "compositePrimaryKeys": { - "artists_id": { - "name": "artists_id", - "columns": [ - "id" - ] - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": {} }, "artists_to_games": { "name": "artists_to_games", + "schema": "", "columns": { "artist_id": { "name": "artist_id", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "game_id": { "name": "game_id", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, @@ -89,80 +76,67 @@ }, "categories": { "name": "categories", + "schema": "", "columns": { "id": { "name": "id", "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "primaryKey": true, + "notNull": true }, "name": { "name": "name", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "slug": { "name": "slug", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "external_id": { "name": "external_id", - "type": "int", + "type": "integer", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "created_at": { "name": "created_at", - "type": "datetime", + "type": "timestamp with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, "default": "(now(6))" }, "updated_at": { "name": "updated_at", - "type": "datetime", + "type": "timestamp with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, "default": "(now(6))" } }, "indexes": {}, "foreignKeys": {}, - "compositePrimaryKeys": { - "categories_id": { - "name": "categories_id", - "columns": [ - "id" - ] - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": {} }, "categories_to_games": { "name": "categories_to_games", + "schema": "", "columns": { "category_id": { "name": "category_id", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "game_id": { "name": "game_id", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, @@ -172,42 +146,38 @@ }, "collection_items": { "name": "collection_items", + "schema": "", "columns": { "id": { "name": "id", "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "primaryKey": true, + "notNull": true }, "collection_id": { "name": "collection_id", "type": "varchar(255)", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "game_id": { "name": "game_id", "type": "varchar(255)", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "created_at": { "name": "created_at", - "type": "datetime", + "type": "timestamp with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, "default": "(now(6))" }, "updated_at": { "name": "updated_at", - "type": "datetime", + "type": "timestamp with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, "default": "(now(6))" } }, @@ -240,47 +210,37 @@ "onUpdate": "no action" } }, - "compositePrimaryKeys": { - "collection_items_id": { - "name": "collection_items_id", - "columns": [ - "id" - ] - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": {} }, "collections": { "name": "collections", + "schema": "", "columns": { "id": { "name": "id", "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "primaryKey": true, + "notNull": true }, "user_id": { "name": "user_id", "type": "varchar(255)", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "created_at": { "name": "created_at", - "type": "datetime", + "type": "timestamp with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, "default": "(now(6))" }, "updated_at": { "name": "updated_at", - "type": "datetime", + "type": "timestamp with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, "default": "(now(6))" } }, @@ -300,92 +260,72 @@ "onUpdate": "no action" } }, - "compositePrimaryKeys": { - "collections_id": { - "name": "collections_id", - "columns": [ - "id" - ] - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": {} }, "designers": { "name": "designers", + "schema": "", "columns": { "id": { "name": "id", "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "primaryKey": true, + "notNull": true }, "name": { "name": "name", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "slug": { "name": "slug", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "external_id": { "name": "external_id", - "type": "int", + "type": "integer", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "created_at": { "name": "created_at", - "type": "datetime", + "type": "timestamp with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, "default": "(now(6))" }, "updated_at": { "name": "updated_at", - "type": "datetime", + "type": "timestamp with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, "default": "(now(6))" } }, "indexes": {}, "foreignKeys": {}, - "compositePrimaryKeys": { - "designers_id": { - "name": "designers_id", - "columns": [ - "id" - ] - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": {} }, "designers_to_games": { "name": "designers_to_games", + "schema": "", "columns": { "designer_id": { "name": "designer_id", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "game_id": { "name": "game_id", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, @@ -395,42 +335,38 @@ }, "expansions": { "name": "expansions", + "schema": "", "columns": { "id": { "name": "id", "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "primaryKey": true, + "notNull": true }, "base_game_id": { "name": "base_game_id", "type": "varchar(255)", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "game_id": { "name": "game_id", "type": "varchar(255)", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "created_at": { "name": "created_at", - "type": "datetime", + "type": "timestamp with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, "default": "(now(6))" }, "updated_at": { "name": "updated_at", - "type": "datetime", + "type": "timestamp with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, "default": "(now(6))" } }, @@ -463,161 +399,131 @@ "onUpdate": "no action" } }, - "compositePrimaryKeys": { - "expansions_id": { - "name": "expansions_id", - "columns": [ - "id" - ] - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": {} }, "games": { "name": "games", + "schema": "", "columns": { "id": { "name": "id", "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "primaryKey": true, + "notNull": true }, "name": { "name": "name", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "slug": { "name": "slug", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "description": { "name": "description", "type": "text", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "year_published": { "name": "year_published", - "type": "year", + "type": "integer", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "min_players": { "name": "min_players", - "type": "int", + "type": "integer", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "max_players": { "name": "max_players", - "type": "int", + "type": "integer", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "playtime": { "name": "playtime", - "type": "int", + "type": "integer", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "min_playtime": { "name": "min_playtime", - "type": "int", + "type": "integer", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "max_playtime": { "name": "max_playtime", - "type": "int", + "type": "integer", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "min_age": { "name": "min_age", - "type": "int", + "type": "integer", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "image_url": { "name": "image_url", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "thumb_url": { "name": "thumb_url", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "url": { "name": "url", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "external_id": { "name": "external_id", - "type": "int", + "type": "integer", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "last_sync_at": { "name": "last_sync_at", - "type": "datetime", + "type": "timestamp with time zone", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "created_at": { "name": "created_at", - "type": "datetime", + "type": "timestamp with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, "default": "(now(6))" }, "updated_at": { "name": "updated_at", - "type": "datetime", + "type": "timestamp with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, "default": "(now(6))" } }, "indexes": {}, "foreignKeys": {}, - "compositePrimaryKeys": { - "games_id": { - "name": "games_id", - "columns": [ - "id" - ] - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": { "games_external_id_unique": { "name": "games_external_id_unique", + "nullsNotDistinct": false, "columns": [ "external_id" ] @@ -626,80 +532,67 @@ }, "mechanics": { "name": "mechanics", + "schema": "", "columns": { "id": { "name": "id", "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "primaryKey": true, + "notNull": true }, "name": { "name": "name", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "slug": { "name": "slug", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "external_id": { "name": "external_id", - "type": "int", + "type": "integer", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "created_at": { "name": "created_at", - "type": "datetime", + "type": "timestamp with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, "default": "(now(6))" }, "updated_at": { "name": "updated_at", - "type": "datetime", + "type": "timestamp with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, "default": "(now(6))" } }, "indexes": {}, "foreignKeys": {}, - "compositePrimaryKeys": { - "mechanics_id": { - "name": "mechanics_id", - "columns": [ - "id" - ] - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": {} }, "mechanics_to_games": { "name": "mechanics_to_games", + "schema": "", "columns": { "mechanic_id": { "name": "mechanic_id", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "game_id": { "name": "game_id", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, @@ -709,80 +602,67 @@ }, "publishers": { "name": "publishers", + "schema": "", "columns": { "id": { "name": "id", "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "primaryKey": true, + "notNull": true }, "name": { "name": "name", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "slug": { "name": "slug", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "external_id": { "name": "external_id", - "type": "int", + "type": "integer", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "created_at": { "name": "created_at", - "type": "datetime", + "type": "timestamp with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, "default": "(now(6))" }, "updated_at": { "name": "updated_at", - "type": "datetime", + "type": "timestamp with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, "default": "(now(6))" } }, "indexes": {}, "foreignKeys": {}, - "compositePrimaryKeys": { - "publishers_id": { - "name": "publishers_id", - "columns": [ - "id" - ] - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": {} }, "publishers_to_games": { "name": "publishers_to_games", + "schema": "", "columns": { "publisher_id": { "name": "publisher_id", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "game_id": { "name": "game_id", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, @@ -792,35 +672,28 @@ }, "roles": { "name": "roles", + "schema": "", "columns": { "id": { "name": "id", "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "primaryKey": true, + "notNull": true }, "name": { "name": "name", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, "foreignKeys": {}, - "compositePrimaryKeys": { - "roles_id": { - "name": "roles_id", - "columns": [ - "id" - ] - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": { "roles_name_unique": { "name": "roles_name_unique", + "nullsNotDistinct": false, "columns": [ "name" ] @@ -829,27 +702,37 @@ }, "sessions": { "name": "sessions", + "schema": "", "columns": { "id": { "name": "id", "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "primaryKey": true, + "notNull": true }, "user_id": { "name": "user_id", "type": "varchar(255)", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "expires_at": { "name": "expires_at", - "type": "datetime", + "type": "timestamp with time zone", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true + }, + "ip_country": { + "name": "ip_country", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "ip_address": { + "name": "ip_address", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false } }, "indexes": {}, @@ -868,54 +751,43 @@ "onUpdate": "no action" } }, - "compositePrimaryKeys": { - "sessions_id": { - "name": "sessions_id", - "columns": [ - "id" - ] - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": {} }, "user_roles": { "name": "user_roles", + "schema": "", "columns": { "id": { "name": "id", "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "primaryKey": true, + "notNull": true }, "user_id": { "name": "user_id", "type": "varchar(255)", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "role_id": { "name": "role_id", "type": "varchar(255)", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "created_at": { "name": "created_at", - "type": "datetime", + "type": "timestamp with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, "default": "(now(6))" }, "updated_at": { "name": "updated_at", - "type": "datetime", + "type": "timestamp with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, "default": "(now(6))" } }, @@ -948,67 +820,54 @@ "onUpdate": "no action" } }, - "compositePrimaryKeys": { - "user_roles_id": { - "name": "user_roles_id", - "columns": [ - "id" - ] - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": {} }, "users": { "name": "users", + "schema": "", "columns": { "id": { "name": "id", "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "primaryKey": true, + "notNull": true }, "username": { "name": "username", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "hashed_password": { "name": "hashed_password", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "email": { "name": "email", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "first_name": { "name": "first_name", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "last_name": { "name": "last_name", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "verified": { "name": "verified", "type": "boolean", "primaryKey": false, "notNull": false, - "autoincrement": false, "default": false }, "receive_email": { @@ -1016,7 +875,6 @@ "type": "boolean", "primaryKey": false, "notNull": false, - "autoincrement": false, "default": false }, "theme": { @@ -1024,45 +882,37 @@ "type": "varchar(255)", "primaryKey": false, "notNull": false, - "autoincrement": false, "default": "'system'" }, "created_at": { "name": "created_at", - "type": "datetime", + "type": "timestamp", "primaryKey": false, "notNull": false, - "autoincrement": false, "default": "(now(6))" }, "updated_at": { "name": "updated_at", - "type": "datetime", + "type": "timestamp", "primaryKey": false, "notNull": false, - "autoincrement": false, "default": "(now(6))" } }, "indexes": {}, "foreignKeys": {}, - "compositePrimaryKeys": { - "users_id": { - "name": "users_id", - "columns": [ - "id" - ] - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": { "users_username_unique": { "name": "users_username_unique", + "nullsNotDistinct": false, "columns": [ "username" ] }, "users_email_unique": { "name": "users_email_unique", + "nullsNotDistinct": false, "columns": [ "email" ] @@ -1071,42 +921,38 @@ }, "wishlist_items": { "name": "wishlist_items", + "schema": "", "columns": { "id": { "name": "id", "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "primaryKey": true, + "notNull": true }, "wishlist_id": { "name": "wishlist_id", "type": "varchar(255)", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "game_id": { "name": "game_id", "type": "varchar(255)", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "created_at": { "name": "created_at", - "type": "datetime", + "type": "timestamp with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, "default": "(now(6))" }, "updated_at": { "name": "updated_at", - "type": "datetime", + "type": "timestamp with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, "default": "(now(6))" } }, @@ -1139,47 +985,37 @@ "onUpdate": "no action" } }, - "compositePrimaryKeys": { - "wishlist_items_id": { - "name": "wishlist_items_id", - "columns": [ - "id" - ] - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": {} }, "wishlists": { "name": "wishlists", + "schema": "", "columns": { "id": { "name": "id", "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "primaryKey": true, + "notNull": true }, "user_id": { "name": "user_id", "type": "varchar(255)", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "created_at": { "name": "created_at", - "type": "datetime", + "type": "timestamp with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, "default": "(now(6))" }, "updated_at": { "name": "updated_at", - "type": "datetime", + "type": "timestamp with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, "default": "(now(6))" } }, @@ -1199,21 +1035,15 @@ "onUpdate": "no action" } }, - "compositePrimaryKeys": { - "wishlists_id": { - "name": "wishlists_id", - "columns": [ - "id" - ] - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": {} } }, + "enums": {}, "schemas": {}, "_meta": { + "columns": {}, "schemas": {}, - "tables": {}, - "columns": {} + "tables": {} } } \ No newline at end of file diff --git a/drizzle/meta/0001_snapshot.json b/drizzle/meta/0001_snapshot.json index a2e47bf..7f90628 100644 --- a/drizzle/meta/0001_snapshot.json +++ b/drizzle/meta/0001_snapshot.json @@ -1,85 +1,72 @@ { + "id": "99b2283f-80a5-44c6-be3b-b1fcd2a5818d", + "prevId": "620f89bd-01b9-4591-94e6-23a7bc63cdc3", "version": "5", - "dialect": "mysql", - "id": "ede125d1-2fb9-4212-9c56-eeabe6af2332", - "prevId": "d90c2144-2349-4a3f-b4f3-87b5ab209936", + "dialect": "pg", "tables": { "artists": { "name": "artists", + "schema": "", "columns": { "id": { "name": "id", "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "primaryKey": true, + "notNull": true }, "name": { "name": "name", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "slug": { "name": "slug", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "external_id": { "name": "external_id", - "type": "int", + "type": "integer", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "created_at": { "name": "created_at", - "type": "datetime", + "type": "timestamp (6) with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, - "default": "(now(6))" + "default": "(now())" }, "updated_at": { "name": "updated_at", - "type": "datetime", + "type": "timestamp (6) with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, - "default": "(now(6))" + "default": "(now())" } }, "indexes": {}, "foreignKeys": {}, - "compositePrimaryKeys": { - "artists_id": { - "name": "artists_id", - "columns": [ - "id" - ] - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": {} }, "artists_to_games": { "name": "artists_to_games", + "schema": "", "columns": { "artist_id": { "name": "artist_id", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "game_id": { "name": "game_id", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, @@ -89,80 +76,67 @@ }, "categories": { "name": "categories", + "schema": "", "columns": { "id": { "name": "id", "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "primaryKey": true, + "notNull": true }, "name": { "name": "name", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "slug": { "name": "slug", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "external_id": { "name": "external_id", - "type": "int", + "type": "integer", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "created_at": { "name": "created_at", - "type": "datetime", + "type": "timestamp (6) with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, - "default": "(now(6))" + "default": "(now())" }, "updated_at": { "name": "updated_at", - "type": "datetime", + "type": "timestamp (6) with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, - "default": "(now(6))" + "default": "(now())" } }, "indexes": {}, "foreignKeys": {}, - "compositePrimaryKeys": { - "categories_id": { - "name": "categories_id", - "columns": [ - "id" - ] - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": {} }, "categories_to_games": { "name": "categories_to_games", + "schema": "", "columns": { "category_id": { "name": "category_id", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "game_id": { "name": "game_id", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, @@ -172,43 +146,39 @@ }, "collection_items": { "name": "collection_items", + "schema": "", "columns": { "id": { "name": "id", "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "primaryKey": true, + "notNull": true }, "collection_id": { "name": "collection_id", "type": "varchar(255)", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "game_id": { "name": "game_id", "type": "varchar(255)", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "created_at": { "name": "created_at", - "type": "datetime", + "type": "timestamp (6) with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, - "default": "(now(6))" + "default": "(now())" }, "updated_at": { "name": "updated_at", - "type": "datetime", + "type": "timestamp (6) with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, - "default": "(now(6))" + "default": "(now())" } }, "indexes": {}, @@ -240,48 +210,38 @@ "onUpdate": "no action" } }, - "compositePrimaryKeys": { - "collection_items_id": { - "name": "collection_items_id", - "columns": [ - "id" - ] - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": {} }, "collections": { "name": "collections", + "schema": "", "columns": { "id": { "name": "id", "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "primaryKey": true, + "notNull": true }, "user_id": { "name": "user_id", "type": "varchar(255)", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "created_at": { "name": "created_at", - "type": "datetime", + "type": "timestamp (6) with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, - "default": "(now(6))" + "default": "(now())" }, "updated_at": { "name": "updated_at", - "type": "datetime", + "type": "timestamp (6) with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, - "default": "(now(6))" + "default": "(now())" } }, "indexes": {}, @@ -300,92 +260,72 @@ "onUpdate": "no action" } }, - "compositePrimaryKeys": { - "collections_id": { - "name": "collections_id", - "columns": [ - "id" - ] - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": {} }, "designers": { "name": "designers", + "schema": "", "columns": { "id": { "name": "id", "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "primaryKey": true, + "notNull": true }, "name": { "name": "name", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "slug": { "name": "slug", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "external_id": { "name": "external_id", - "type": "int", + "type": "integer", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "created_at": { "name": "created_at", - "type": "datetime", + "type": "timestamp (6) with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, - "default": "(now(6))" + "default": "(now())" }, "updated_at": { "name": "updated_at", - "type": "datetime", + "type": "timestamp (6) with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, - "default": "(now(6))" + "default": "(now())" } }, "indexes": {}, "foreignKeys": {}, - "compositePrimaryKeys": { - "designers_id": { - "name": "designers_id", - "columns": [ - "id" - ] - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": {} }, "designers_to_games": { "name": "designers_to_games", + "schema": "", "columns": { "designer_id": { "name": "designer_id", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "game_id": { "name": "game_id", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, @@ -395,43 +335,39 @@ }, "expansions": { "name": "expansions", + "schema": "", "columns": { "id": { "name": "id", "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "primaryKey": true, + "notNull": true }, "base_game_id": { "name": "base_game_id", "type": "varchar(255)", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "game_id": { "name": "game_id", "type": "varchar(255)", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "created_at": { "name": "created_at", - "type": "datetime", + "type": "timestamp (6) with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, - "default": "(now(6))" + "default": "(now())" }, "updated_at": { "name": "updated_at", - "type": "datetime", + "type": "timestamp (6) with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, - "default": "(now(6))" + "default": "(now())" } }, "indexes": {}, @@ -463,161 +399,131 @@ "onUpdate": "no action" } }, - "compositePrimaryKeys": { - "expansions_id": { - "name": "expansions_id", - "columns": [ - "id" - ] - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": {} }, "games": { "name": "games", + "schema": "", "columns": { "id": { "name": "id", "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "primaryKey": true, + "notNull": true }, "name": { "name": "name", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "slug": { "name": "slug", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "description": { "name": "description", "type": "text", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "year_published": { "name": "year_published", - "type": "year", + "type": "integer", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "min_players": { "name": "min_players", - "type": "int", + "type": "integer", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "max_players": { "name": "max_players", - "type": "int", + "type": "integer", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "playtime": { "name": "playtime", - "type": "int", + "type": "integer", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "min_playtime": { "name": "min_playtime", - "type": "int", + "type": "integer", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "max_playtime": { "name": "max_playtime", - "type": "int", + "type": "integer", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "min_age": { "name": "min_age", - "type": "int", + "type": "integer", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "image_url": { "name": "image_url", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "thumb_url": { "name": "thumb_url", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "url": { "name": "url", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "external_id": { "name": "external_id", - "type": "int", + "type": "integer", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "last_sync_at": { "name": "last_sync_at", - "type": "datetime", + "type": "timestamp (6) with time zone", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "created_at": { "name": "created_at", - "type": "datetime", + "type": "timestamp (6) with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, - "default": "(now(6))" + "default": "(now())" }, "updated_at": { "name": "updated_at", - "type": "datetime", + "type": "timestamp (6) with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, - "default": "(now(6))" + "default": "(now())" } }, "indexes": {}, "foreignKeys": {}, - "compositePrimaryKeys": { - "games_id": { - "name": "games_id", - "columns": [ - "id" - ] - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": { "games_external_id_unique": { "name": "games_external_id_unique", + "nullsNotDistinct": false, "columns": [ "external_id" ] @@ -626,80 +532,67 @@ }, "mechanics": { "name": "mechanics", + "schema": "", "columns": { "id": { "name": "id", "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "primaryKey": true, + "notNull": true }, "name": { "name": "name", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "slug": { "name": "slug", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "external_id": { "name": "external_id", - "type": "int", + "type": "integer", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "created_at": { "name": "created_at", - "type": "datetime", + "type": "timestamp (6) with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, - "default": "(now(6))" + "default": "(now())" }, "updated_at": { "name": "updated_at", - "type": "datetime", + "type": "timestamp (6) with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, - "default": "(now(6))" + "default": "(now())" } }, "indexes": {}, "foreignKeys": {}, - "compositePrimaryKeys": { - "mechanics_id": { - "name": "mechanics_id", - "columns": [ - "id" - ] - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": {} }, "mechanics_to_games": { "name": "mechanics_to_games", + "schema": "", "columns": { "mechanic_id": { "name": "mechanic_id", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "game_id": { "name": "game_id", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, @@ -709,80 +602,67 @@ }, "publishers": { "name": "publishers", + "schema": "", "columns": { "id": { "name": "id", "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "primaryKey": true, + "notNull": true }, "name": { "name": "name", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "slug": { "name": "slug", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "external_id": { "name": "external_id", - "type": "int", + "type": "integer", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "created_at": { "name": "created_at", - "type": "datetime", + "type": "timestamp (6) with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, - "default": "(now(6))" + "default": "(now())" }, "updated_at": { "name": "updated_at", - "type": "datetime", + "type": "timestamp (6) with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, - "default": "(now(6))" + "default": "(now())" } }, "indexes": {}, "foreignKeys": {}, - "compositePrimaryKeys": { - "publishers_id": { - "name": "publishers_id", - "columns": [ - "id" - ] - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": {} }, "publishers_to_games": { "name": "publishers_to_games", + "schema": "", "columns": { "publisher_id": { "name": "publisher_id", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "game_id": { "name": "game_id", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, @@ -792,35 +672,28 @@ }, "roles": { "name": "roles", + "schema": "", "columns": { "id": { "name": "id", "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "primaryKey": true, + "notNull": true }, "name": { "name": "name", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, "foreignKeys": {}, - "compositePrimaryKeys": { - "roles_id": { - "name": "roles_id", - "columns": [ - "id" - ] - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": { "roles_name_unique": { "name": "roles_name_unique", + "nullsNotDistinct": false, "columns": [ "name" ] @@ -829,41 +702,37 @@ }, "sessions": { "name": "sessions", + "schema": "", "columns": { "id": { "name": "id", "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "primaryKey": true, + "notNull": true }, "user_id": { "name": "user_id", "type": "varchar(255)", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "expires_at": { "name": "expires_at", - "type": "datetime", + "type": "timestamp with time zone", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "ip_country": { "name": "ip_country", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "ip_address": { "name": "ip_address", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, @@ -882,55 +751,44 @@ "onUpdate": "no action" } }, - "compositePrimaryKeys": { - "sessions_id": { - "name": "sessions_id", - "columns": [ - "id" - ] - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": {} }, "user_roles": { "name": "user_roles", + "schema": "", "columns": { "id": { "name": "id", "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "primaryKey": true, + "notNull": true }, "user_id": { "name": "user_id", "type": "varchar(255)", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "role_id": { "name": "role_id", "type": "varchar(255)", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "created_at": { "name": "created_at", - "type": "datetime", + "type": "timestamp (6) with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, - "default": "(now(6))" + "default": "(now())" }, "updated_at": { "name": "updated_at", - "type": "datetime", + "type": "timestamp (6) with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, - "default": "(now(6))" + "default": "(now())" } }, "indexes": {}, @@ -962,67 +820,54 @@ "onUpdate": "no action" } }, - "compositePrimaryKeys": { - "user_roles_id": { - "name": "user_roles_id", - "columns": [ - "id" - ] - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": {} }, "users": { "name": "users", + "schema": "", "columns": { "id": { "name": "id", "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "primaryKey": true, + "notNull": true }, "username": { "name": "username", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "hashed_password": { "name": "hashed_password", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "email": { "name": "email", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "first_name": { "name": "first_name", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "last_name": { "name": "last_name", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "verified": { "name": "verified", "type": "boolean", "primaryKey": false, "notNull": false, - "autoincrement": false, "default": false }, "receive_email": { @@ -1030,7 +875,6 @@ "type": "boolean", "primaryKey": false, "notNull": false, - "autoincrement": false, "default": false }, "theme": { @@ -1038,45 +882,37 @@ "type": "varchar(255)", "primaryKey": false, "notNull": false, - "autoincrement": false, "default": "'system'" }, "created_at": { "name": "created_at", - "type": "datetime", + "type": "timestamp", "primaryKey": false, "notNull": false, - "autoincrement": false, - "default": "(now(6))" + "default": "(now())" }, "updated_at": { "name": "updated_at", - "type": "datetime", + "type": "timestamp", "primaryKey": false, "notNull": false, - "autoincrement": false, - "default": "(now(6))" + "default": "(now())" } }, "indexes": {}, "foreignKeys": {}, - "compositePrimaryKeys": { - "users_id": { - "name": "users_id", - "columns": [ - "id" - ] - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": { "users_username_unique": { "name": "users_username_unique", + "nullsNotDistinct": false, "columns": [ "username" ] }, "users_email_unique": { "name": "users_email_unique", + "nullsNotDistinct": false, "columns": [ "email" ] @@ -1085,43 +921,39 @@ }, "wishlist_items": { "name": "wishlist_items", + "schema": "", "columns": { "id": { "name": "id", "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "primaryKey": true, + "notNull": true }, "wishlist_id": { "name": "wishlist_id", "type": "varchar(255)", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "game_id": { "name": "game_id", "type": "varchar(255)", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "created_at": { "name": "created_at", - "type": "datetime", + "type": "timestamp (6) with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, - "default": "(now(6))" + "default": "(now())" }, "updated_at": { "name": "updated_at", - "type": "datetime", + "type": "timestamp (6) with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, - "default": "(now(6))" + "default": "(now())" } }, "indexes": {}, @@ -1153,48 +985,38 @@ "onUpdate": "no action" } }, - "compositePrimaryKeys": { - "wishlist_items_id": { - "name": "wishlist_items_id", - "columns": [ - "id" - ] - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": {} }, "wishlists": { "name": "wishlists", + "schema": "", "columns": { "id": { "name": "id", "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "primaryKey": true, + "notNull": true }, "user_id": { "name": "user_id", "type": "varchar(255)", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "created_at": { "name": "created_at", - "type": "datetime", + "type": "timestamp (6) with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, - "default": "(now(6))" + "default": "(now())" }, "updated_at": { "name": "updated_at", - "type": "datetime", + "type": "timestamp (6) with time zone", "primaryKey": false, "notNull": false, - "autoincrement": false, - "default": "(now(6))" + "default": "(now())" } }, "indexes": {}, @@ -1213,21 +1035,15 @@ "onUpdate": "no action" } }, - "compositePrimaryKeys": { - "wishlists_id": { - "name": "wishlists_id", - "columns": [ - "id" - ] - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": {} } }, + "enums": {}, "schemas": {}, "_meta": { + "columns": {}, "schemas": {}, - "tables": {}, - "columns": {} + "tables": {} } } \ No newline at end of file diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json index 25f6af7..8851f62 100644 --- a/drizzle/meta/_journal.json +++ b/drizzle/meta/_journal.json @@ -1,19 +1,19 @@ { "version": "5", - "dialect": "mysql", + "dialect": "pg", "entries": [ { "idx": 0, "version": "5", - "when": 1707197486310, - "tag": "0000_true_sugar_man", + "when": 1707437865821, + "tag": "0000_oval_wolverine", "breakpoints": true }, { "idx": 1, "version": "5", - "when": 1707199636963, - "tag": "0001_motionless_old_lace", + "when": 1707438055782, + "tag": "0001_giant_tomorrow_man", "breakpoints": true } ] diff --git a/package.json b/package.json index ca65c64..9279550 100644 --- a/package.json +++ b/package.json @@ -16,10 +16,10 @@ "lint": "prettier --plugin-search-dir . --check . && eslint .", "format": "prettier --plugin-search-dir . --write .", "site:update": "pnpm update -i -L", - "generate": "drizzle-kit generate:mysql", + "generate": "drizzle-kit generate:pg", "migrate": "tsx ./src/migrate.ts", "seed": "tsx ./src/seed/insert.ts", - "push": "drizzle-kit push:mysql" + "push": "drizzle-kit push:pg" }, "prisma": { "seed": "node --loader ts-node/esm prisma/seed.ts" @@ -56,7 +56,7 @@ "satori": "^0.10.13", "satori-html": "^0.3.2", "svelte": "^4.2.10", - "svelte-check": "^3.6.3", + "svelte-check": "^3.6.4", "svelte-meta-tags": "^3.1.0", "svelte-preprocess": "^5.1.3", "svelte-sequential-preprocessor": "^2.0.1", @@ -83,6 +83,7 @@ "@lucia-auth/adapter-drizzle": "^1.0.1", "@lucia-auth/adapter-prisma": "4.0.0", "@lukeed/uuid": "^2.0.1", + "@neondatabase/serverless": "^0.8.1", "@paralleldrive/cuid2": "^2.2.2", "@planetscale/database": "^1.15.0", "@prisma/client": "^5.8.1", @@ -108,6 +109,8 @@ "nanoid": "^5.0.5", "open-props": "^1.6.18", "oslo": "^1.1.0", + "pg": "^8.11.3", + "postgres": "^3.4.3", "radix-svelte": "^0.9.0", "svelte-french-toast": "^1.2.0", "svelte-lazy-loader": "^1.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 67df3d2..379cd4a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,6 +23,9 @@ dependencies: '@lukeed/uuid': specifier: ^2.0.1 version: 2.0.1 + '@neondatabase/serverless': + specifier: ^0.8.1 + version: 0.8.1 '@paralleldrive/cuid2': specifier: ^2.2.2 version: 2.2.2 @@ -61,7 +64,7 @@ dependencies: version: 0.6.0 drizzle-orm: specifier: ^0.29.3 - version: 0.29.3(@planetscale/database@1.15.0)(mysql2@3.9.1) + version: 0.29.3(@neondatabase/serverless@0.8.1)(@planetscale/database@1.15.0)(mysql2@3.9.1)(pg@8.11.3)(postgres@3.4.3) feather-icons: specifier: ^4.29.1 version: 4.29.1 @@ -98,6 +101,12 @@ dependencies: oslo: specifier: ^1.1.0 version: 1.1.0 + pg: + specifier: ^8.11.3 + version: 8.11.3 + postgres: + specifier: ^3.4.3 + version: 3.4.3 radix-svelte: specifier: ^0.9.0 version: 0.9.0(svelte@4.2.10) @@ -215,8 +224,8 @@ devDependencies: specifier: ^4.2.10 version: 4.2.10 svelte-check: - specifier: ^3.6.3 - version: 3.6.3(postcss-load-config@5.0.2)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.10) + specifier: ^3.6.4 + version: 3.6.4(postcss-load-config@5.0.2)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.10) svelte-meta-tags: specifier: ^3.1.0 version: 3.1.0(svelte@4.2.10)(typescript@5.3.3) @@ -1657,6 +1666,13 @@ packages: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 + /@jridgewell/trace-mapping@0.3.22: + resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: @@ -1762,6 +1778,12 @@ packages: dev: false optional: true + /@neondatabase/serverless@0.8.1: + resolution: {integrity: sha512-nxZfTLbGqvDrw0W9WnQxzoPn4KC6SLjkvK4grdf6eWVMQSc24X+8udz9inZWOGu8f0O3wJAq586fCZ32r22lwg==} + dependencies: + '@types/pg': 8.6.6 + dev: false + /@noble/hashes@1.3.2: resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} engines: {node: '>= 16'} @@ -3041,6 +3063,14 @@ packages: dependencies: undici-types: 5.26.5 + /@types/pg@8.6.6: + resolution: {integrity: sha512-O2xNmXebtwVekJDD+02udOncjVcMZQuTEQEMpKJ0ZRf5E7/9JJX3izhKUcUifBkyKpljyUM6BTgy2trmviKlpw==} + dependencies: + '@types/node': 20.11.16 + pg-protocol: 1.6.0 + pg-types: 2.2.0 + dev: false + /@types/pug@2.0.8: resolution: {integrity: sha512-QzhsZ1dMGyJbn/D9V80zp4GIA4J4rfAjCCxc3MP+new0E8dyVdSkR735Lx+n3LIaHNFcjHL5+TbziccuT+fdoQ==} dev: true @@ -3524,6 +3554,11 @@ packages: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true + /buffer-writer@2.0.0: + resolution: {integrity: sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==} + engines: {node: '>=4'} + dev: false + /cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -3604,6 +3639,21 @@ packages: optionalDependencies: fsevents: 2.3.3 + /chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + /chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} @@ -3931,7 +3981,7 @@ packages: - supports-color dev: true - /drizzle-orm@0.29.3(@planetscale/database@1.15.0)(mysql2@3.9.1): + /drizzle-orm@0.29.3(@neondatabase/serverless@0.8.1)(@planetscale/database@1.15.0)(mysql2@3.9.1)(pg@8.11.3)(postgres@3.4.3): resolution: {integrity: sha512-uSE027csliGSGYD0pqtM+SAQATMREb3eSM/U8s6r+Y0RFwTKwftnwwSkqx3oS65UBgqDOM0gMTl5UGNpt6lW0A==} peerDependencies: '@aws-sdk/client-rds-data': '>=3' @@ -4002,8 +4052,11 @@ packages: sqlite3: optional: true dependencies: + '@neondatabase/serverless': 0.8.1 '@planetscale/database': 1.15.0 mysql2: 3.9.1 + pg: 8.11.3 + postgres: 3.4.3 dev: false /electron-to-chromium@1.4.576: @@ -4366,17 +4419,6 @@ packages: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true - /fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: true - /fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -5502,6 +5544,10 @@ packages: dependencies: p-limit: 3.1.0 + /packet-reader@1.0.0: + resolution: {integrity: sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==} + dev: false + /pako@0.2.9: resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} @@ -5567,6 +5613,70 @@ packages: estree-walker: 3.0.3 is-reference: 3.0.2 + /pg-cloudflare@1.1.1: + resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} + requiresBuild: true + dev: false + optional: true + + /pg-connection-string@2.6.2: + resolution: {integrity: sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==} + dev: false + + /pg-int8@1.0.1: + resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} + engines: {node: '>=4.0.0'} + dev: false + + /pg-pool@3.6.1(pg@8.11.3): + resolution: {integrity: sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==} + peerDependencies: + pg: '>=8.0' + dependencies: + pg: 8.11.3 + dev: false + + /pg-protocol@1.6.0: + resolution: {integrity: sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==} + dev: false + + /pg-types@2.2.0: + resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} + engines: {node: '>=4'} + dependencies: + pg-int8: 1.0.1 + postgres-array: 2.0.0 + postgres-bytea: 1.0.0 + postgres-date: 1.0.7 + postgres-interval: 1.2.0 + dev: false + + /pg@8.11.3: + resolution: {integrity: sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==} + engines: {node: '>= 8.0.0'} + peerDependencies: + pg-native: '>=3.0.1' + peerDependenciesMeta: + pg-native: + optional: true + dependencies: + buffer-writer: 2.0.0 + packet-reader: 1.0.0 + pg-connection-string: 2.6.2 + pg-pool: 3.6.1(pg@8.11.3) + pg-protocol: 1.6.0 + pg-types: 2.2.0 + pgpass: 1.0.5 + optionalDependencies: + pg-cloudflare: 1.1.1 + dev: false + + /pgpass@1.0.5: + resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} + dependencies: + split2: 4.2.0 + dev: false + /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} @@ -6061,6 +6171,33 @@ packages: picocolors: 1.0.0 source-map-js: 1.0.2 + /postgres-array@2.0.0: + resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} + engines: {node: '>=4'} + dev: false + + /postgres-bytea@1.0.0: + resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} + engines: {node: '>=0.10.0'} + dev: false + + /postgres-date@1.0.7: + resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} + engines: {node: '>=0.10.0'} + dev: false + + /postgres-interval@1.2.0: + resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} + engines: {node: '>=0.10.0'} + dependencies: + xtend: 4.0.2 + dev: false + + /postgres@3.4.3: + resolution: {integrity: sha512-iHJn4+M9vbTdHSdDzNkC0crHq+1CUdFhx+YqCE+SqWxPjm+Zu63jq7yZborOBF64c8pc58O5uMudyL1FQcHacA==} + engines: {node: '>=12'} + dev: false + /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -6453,6 +6590,11 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + /split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + dev: false + /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: false @@ -6552,15 +6694,15 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - /svelte-check@3.6.3(postcss-load-config@5.0.2)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.10): - resolution: {integrity: sha512-Q2nGnoysxUnB9KjnjpQLZwdjK62DHyW6nuH/gm2qteFnDk0lCehe/6z8TsIvYeKjC6luKaWxiNGyOcWiLLPSwA==} + /svelte-check@3.6.4(postcss-load-config@5.0.2)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.10): + resolution: {integrity: sha512-mY/dqucqm46p72M8yZmn81WPZx9mN6uuw8UVfR3ZKQeLxQg5HDGO3HHm5AZuWZPYNMLJ+TRMn+TeN53HfQ/vsw==} hasBin: true peerDependencies: svelte: ^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0 dependencies: - '@jridgewell/trace-mapping': 0.3.20 - chokidar: 3.5.3 - fast-glob: 3.3.1 + '@jridgewell/trace-mapping': 0.3.22 + chokidar: 3.6.0 + fast-glob: 3.3.2 import-fresh: 3.3.0 picocolors: 1.0.0 sade: 1.8.1 @@ -7261,6 +7403,11 @@ packages: /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + /xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + dev: false + /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} diff --git a/prisma/schema.prisma b/prisma/schema.prisma index fa630c5..36df848 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -158,7 +158,6 @@ model Game { image_url String? thumb_url String? url String? - rules_url String? categories Category[] mechanics Mechanic[] designers Designer[] diff --git a/src/lib/drizzle.ts b/src/lib/drizzle.ts index a4e824c..cbda8b5 100644 --- a/src/lib/drizzle.ts +++ b/src/lib/drizzle.ts @@ -1,10 +1,10 @@ -import { drizzle } from 'drizzle-orm/mysql2'; -import mysql from 'mysql2/promise'; +import { drizzle } from "drizzle-orm/node-postgres"; +import pg from 'pg'; import { DATABASE_USER, DATABASE_PASSWORD, DATABASE_HOST, DATABASE_DB } from '$env/static/private'; import * as schema from '../schema'; // create the connection -const connection = await mysql.createConnection({ +const pool = new pg.Pool({ user: DATABASE_USER, password: DATABASE_PASSWORD, host: DATABASE_HOST, @@ -12,6 +12,6 @@ const connection = await mysql.createConnection({ database: DATABASE_DB }); -const db = drizzle(connection, { schema: schema, mode: 'default' }); +const db = drizzle(pool, { schema: schema }); export default db; diff --git a/src/lib/server/auth.ts b/src/lib/server/auth.ts index 3f35e08..7113754 100644 --- a/src/lib/server/auth.ts +++ b/src/lib/server/auth.ts @@ -1,11 +1,11 @@ // lib/server/lucia.ts import { Lucia, TimeSpan } from 'lucia'; -import { DrizzleMySQLAdapter } from "@lucia-auth/adapter-drizzle"; +import { DrizzlePostgreSQLAdapter } from "@lucia-auth/adapter-drizzle"; import { dev } from '$app/environment'; import db from '$lib/drizzle'; import { sessions, users } from '../../schema'; -const adapter = new DrizzleMySQLAdapter(db, sessions, users); +const adapter = new DrizzlePostgreSQLAdapter(db, sessions, users); export const lucia = new Lucia(adapter, { getSessionAttributes: (attributes) => { diff --git a/src/lib/utils/dbUtils.ts b/src/lib/utils/dbUtils.ts index 0564935..baf9fb6 100644 --- a/src/lib/utils/dbUtils.ts +++ b/src/lib/utils/dbUtils.ts @@ -3,6 +3,9 @@ import kebabCase from 'just-kebab-case'; import type { BggLinkDto } from 'boardgamegeekclient/dist/esm/dto/concrete/subdto'; import prisma from '$lib/prisma'; import { mapAPIGameToBoredGame } from './gameMapper'; +import db from '$lib/drizzle'; +import { games } from '../../schema'; +import { eq, sql } from 'drizzle-orm'; export async function createArtist(locals: App.Locals, externalArtist: BggLinkDto) { try { @@ -331,41 +334,23 @@ export async function createExpansion( export async function createOrUpdateGameMinimal(locals: App.Locals, game: Game) { console.log('Creating or updating minimal game data', JSON.stringify(game, null, 2)); const externalUrl = `https://boardgamegeek.com/boardgame/${game.external_id}`; - return await prisma.game.upsert({ - where: { - external_id: game.external_id - }, - create: { - name: game.name, - slug: kebabCase(game.name), - description: game.description, - external_id: game.external_id, - url: externalUrl, - thumb_url: game.thumb_url, - image_url: game.image_url, - min_age: game.min_age || 0, - min_players: game.min_players || 0, - max_players: game.max_players || 0, - min_playtime: game.min_playtime || 0, - max_playtime: game.max_playtime || 0, - year_published: game.year_published || 0 - }, - update: { - name: game.name, - slug: kebabCase(game.name), - description: game.description, - external_id: game.external_id, - url: externalUrl, - thumb_url: game.thumb_url, - image_url: game.image_url, - min_age: game.min_age || 0, - min_players: game.min_players || 0, - max_players: game.max_players || 0, - min_playtime: game.min_playtime || 0, - max_playtime: game.max_playtime || 0, - year_published: game.year_published || 0 - } - }); + await db.insert(games).values({ + external_id: game.external_id, + name: game.name, + slug: kebabCase(game.name), + description: game.description, + url: externalUrl, + thumb_url: game.thumb_url, + image_url: game.image_url, + min_age: game.min_age || 0, + min_players: game.min_players || 0, + max_players: game.max_players || 0, + min_playtime: game.min_playtime || 0, + max_playtime: game.max_playtime || 0, + year_published: game.year_published || 0, + }).onDuplicateKeyUpdate({ set: { external_id: sql`external_id` } }); + + return db.query.games.findFirst({ where: eq(games.external_id, game.external_id) }); } export async function createOrUpdateGame(locals: App.Locals, game: Game) { @@ -379,7 +364,10 @@ export async function createOrUpdateGame(locals: App.Locals, game: Game) { const externalUrl = `https://boardgamegeek.com/boardgame/${game.external_id}`; console.log('categoryIds', categoryIds); console.log('mechanicIds', mechanicIds); - return await prisma.game.upsert({ + await db.transaction(async (transaction) => { + const + }); + await db.insert(games).values({ include: { mechanics: true, publishers: true, diff --git a/src/lib/zodValidation.ts b/src/lib/zodValidation.ts index a7087f3..8fbac7d 100644 --- a/src/lib/zodValidation.ts +++ b/src/lib/zodValidation.ts @@ -222,7 +222,6 @@ const gameSchema = z.object({ image_url: z.string().optional(), thumb_url: z.string().optional(), url: z.string().optional(), - rules_url: z.string().optional(), weight_amount: z.number().optional(), weight_units: z.enum(['Medium', 'Heavy']).optional(), categories: z.array(category_schema).optional(), diff --git a/src/migrate.ts b/src/migrate.ts index bda2592..79365f3 100644 --- a/src/migrate.ts +++ b/src/migrate.ts @@ -1,9 +1,9 @@ import 'dotenv/config'; -import { drizzle } from 'drizzle-orm/mysql2'; -import { migrate } from 'drizzle-orm/mysql2/migrator'; -import { createConnection } from 'mysql2'; +import { drizzle } from 'drizzle-orm/postgres-js'; +import { migrate } from 'drizzle-orm/postgres-js/migrator'; +import postgres from 'postgres'; -const connection = createConnection({ +const connection = postgres({ host: process.env.DATABASE_HOST, port: 3306, user: process.env.DATABASE_USER, diff --git a/src/routes/(app)/search/+page.server.ts b/src/routes/(app)/search/+page.server.ts index 75a4b80..326b4ff 100644 --- a/src/routes/(app)/search/+page.server.ts +++ b/src/routes/(app)/search/+page.server.ts @@ -82,7 +82,7 @@ async function searchForGames( if (externalGameResponse.ok) { const externalGame = await externalGameResponse.json(); console.log('externalGame', externalGame); - let boredGame = mapAPIGameToBoredGame(externalGame); + const boredGame = mapAPIGameToBoredGame(externalGame); games.push(createOrUpdateGameMinimal(locals, boredGame)); } } @@ -127,7 +127,8 @@ export const load: PageServerLoad = async ({ locals, fetch, url }) => { const queryParams: SearchQuery = { limit: form.data?.limit, skip: form.data?.skip, - q: form.data?.q + q: form.data?.q, + exact: form.data?.exact }; try { diff --git a/src/routes/(auth)/login/+page.server.ts b/src/routes/(auth)/login/+page.server.ts index 623fca6..0c63cc2 100644 --- a/src/routes/(auth)/login/+page.server.ts +++ b/src/routes/(auth)/login/+page.server.ts @@ -1,13 +1,13 @@ import { fail, type Actions } from '@sveltejs/kit'; +import { eq, sql } from 'drizzle-orm'; import { setError, superValidate } from 'sveltekit-superforms/server'; import { redirect } from 'sveltekit-flash-message/server'; import { lucia } from '$lib/server/auth'; import { Argon2id } from 'oslo/password'; import { userSchema } from '$lib/config/zod-schemas'; -import type { PageServerLoad } from './$types'; import db from '$lib/drizzle'; -import { eq, sql } from 'drizzle-orm'; import { collections, users, wishlists } from '../../../schema'; +import type { PageServerLoad } from './$types'; const signInSchema = userSchema.pick({ username: true, diff --git a/src/routes/(auth)/sign-up/+page.server.ts b/src/routes/(auth)/sign-up/+page.server.ts index 2ecf020..0b51f11 100644 --- a/src/routes/(auth)/sign-up/+page.server.ts +++ b/src/routes/(auth)/sign-up/+page.server.ts @@ -1,16 +1,15 @@ import { fail, error, type Actions, redirect } from '@sveltejs/kit'; +import { Argon2id } from 'oslo/password'; +import { eq } from 'drizzle-orm'; +import { nanoid } from 'nanoid'; import { setError, superValidate } from 'sveltekit-superforms/server'; import type { PageServerLoad } from './$types'; -import prisma from '$lib/prisma'; import { lucia } from '$lib/server/auth'; -import { Argon2id } from 'oslo/password'; import { userSchema } from '$lib/config/zod-schemas'; import { add_user_to_role } from '$server/roles'; import type { Message } from '$lib/types.js'; import db from '$lib/drizzle'; import { collections, users, wishlists } from '../../../schema'; -import { eq } from 'drizzle-orm'; -import { nanoid } from 'nanoid'; const signUpSchema = userSchema .pick({ @@ -71,7 +70,7 @@ export const actions: Actions = { const hashedPassword = await new Argon2id().hash(form.data.password); - await db.insert(users) + const user = await db.insert(users) .values({ username: form.data.username, hashed_password: hashedPassword, @@ -81,10 +80,7 @@ export const actions: Actions = { verified: false, receive_email: false, theme: 'system' - }); - const user = await db.select() - .from(users) - .where(eq(users.username, form.data.username)); + }).returning(); console.log('signup user', user); if (!user || user.length === 0) { diff --git a/src/routes/api/game/search/+server.ts b/src/routes/api/game/search/+server.ts index cc05099..c2c728d 100644 --- a/src/routes/api/game/search/+server.ts +++ b/src/routes/api/game/search/+server.ts @@ -1,6 +1,7 @@ import { error, json } from '@sveltejs/kit'; -import { Prisma } from '@prisma/client'; -import prisma from '$lib/prisma'; +import db from '$lib/drizzle.js'; +import { eq, sql } from 'drizzle-orm'; +import { games } from '../../../../schema.js'; // Search a user's collection export const GET = async ({ url, locals }) => { @@ -8,53 +9,61 @@ export const GET = async ({ url, locals }) => { const q = searchParams?.q?.trim() || ''; const limit = parseInt(searchParams?.limit) || 10; const skip = parseInt(searchParams?.skip) || 0; - const order: Prisma.SortOrder = searchParams?.order || 'desc'; + const order = searchParams?.order || 'desc'; const exact = searchParams?.exact === 'true'; - console.log(`q: ${q}, limit: ${limit}, skip: ${skip}, order: ${order}`); - // const sort : Prisma.GameOrderByRelevanceFieldEnum = searchParams?.sort || 'name'; - // console.log('url', url); - const exactGameSelect: Prisma.GameSelect = { - id: true, - name: true, - slug: true, - thumb_url: true - }; + let orderBy = searchParams?.orderBy || 'slug'; + if (orderBy === 'name') { + orderBy = 'slug'; + } + console.log(`q: ${q}, limit: ${limit}, skip: ${skip}, order: ${order}, exact: ${exact}`); + console.log(exact); if (exact) { + console.log('Exact Search API'); const game = - await prisma.game.findFirst({ - where: { - name: { - equals: q - } - }, - select: exactGameSelect + await db.query.games.findFirst({ + where: eq(games.name, q), + columns: { + id: true, + name: true, + slug: true, + thumb_url: true + } }); if (!game) { error(404, { message: 'No games found' }); } - const games = [game]; - console.log('Games found in Exact Search API', JSON.stringify(games, null, 2)); - return json(games); + const foundGames = [game]; + console.log('Games found in Exact Search API', JSON.stringify(foundGames, null, 2)); + return json(foundGames); } else { - const games = - (await prisma.game.findMany({ - orderBy: { - _relevance: { - fields: ['name'], - search: q, - sort: order - } - }, - select: exactGameSelect, - take: limit, - skip - })) || []; - if (games.length === 0) { + const foundGames = await db.select({ + id: games.id, + name: games.name, + slug: games.slug, + thumb_url: games.thumb_url + }) + .from(games) + .where(sql`match(${games.name}, ${games.slug}) against(${q} in natural language mode)`) + .offset(skip).limit(limit).orderBy(sql`${orderBy} ${order}`) || []; + // const games = + // (await prisma.game.findMany({ + // orderBy: { + // _relevance: { + // fields: ['name'], + // search: q, + // sort: order + // } + // }, + // select: exactGameSelect, + // take: limit, + // skip + // })) || []; + if (foundGames.length === 0) { error(404, { message: 'No games found' }); } - console.log('Games found in Search API', JSON.stringify(games, null, 2)); - return json(games); + console.log('Games found in Search API', JSON.stringify(foundGames, null, 2)); + return json(foundGames); } }; diff --git a/src/schema.ts b/src/schema.ts index 8917df9..5eb49f8 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -1,8 +1,8 @@ import { relations, sql, type InferSelectModel } from 'drizzle-orm'; -import { mysqlTable, datetime, varchar, boolean, year, int, text } from 'drizzle-orm/mysql-core'; +import { pgTable, timestamp, varchar, boolean, integer, text } from 'drizzle-orm/pg-core'; import { nanoid } from 'nanoid'; -export const users = mysqlTable("users", { +export const users = pgTable("users", { id: varchar("id", { length: 255 }).primaryKey() @@ -27,8 +27,8 @@ export const users = mysqlTable("users", { theme: varchar("theme", { length: 255 }).default("system"), - created_at: datetime("created_at").default(sql`(now(6))`), - updated_at: datetime("updated_at").default(sql`(now(6))`) + created_at: timestamp("created_at").default(sql`(now())`), + updated_at: timestamp("updated_at").default(sql`(now())`) }); export const user_relations = relations(users, ({ many }) => ({ @@ -37,7 +37,7 @@ export const user_relations = relations(users, ({ many }) => ({ export type Users = InferSelectModel; -export const sessions = mysqlTable('sessions', { +export const sessions = pgTable('sessions', { id: varchar('id', { length: 255 }).primaryKey(), @@ -46,7 +46,10 @@ export const sessions = mysqlTable('sessions', { }) .notNull() .references(() => users.id), - expiresAt: datetime('expires_at').notNull(), + expiresAt: timestamp('expires_at', { + withTimezone: true, + mode: "date" + }).notNull(), ipCountry: varchar('ip_country', { length: 255 }), @@ -55,7 +58,7 @@ export const sessions = mysqlTable('sessions', { }) }); -export const roles = mysqlTable("roles", { +export const roles = pgTable("roles", { id: varchar("id", { length: 255 }).primaryKey() @@ -65,7 +68,7 @@ export const roles = mysqlTable("roles", { }).unique() }); -export const user_roles = mysqlTable("user_roles", { +export const user_roles = pgTable("user_roles", { id: varchar("id", { length: 255 }).primaryKey() @@ -80,8 +83,16 @@ export const user_roles = mysqlTable("user_roles", { }) .notNull() .references(() => roles.id, { onDelete: 'cascade' }), - created_at: datetime("created_at").default(sql`(now(6))`), - updated_at: datetime("updated_at").default(sql`(now(6))`) + created_at: timestamp("created_at", { + withTimezone: true, + mode: "date", + precision: 6 + }).default(sql`(now())`), + updated_at: timestamp("updated_at", { + withTimezone: true, + mode: "date", + precision: 6 + }).default(sql`(now())`) }); export const user_role_relations = relations(user_roles, ({ one }) => ({ @@ -95,7 +106,7 @@ export const user_role_relations = relations(user_roles, ({ one }) => ({ }) })); -export const games = mysqlTable("games", { +export const games = pgTable("games", { id: varchar("id", { length: 255 }).primaryKey() @@ -107,13 +118,13 @@ export const games = mysqlTable("games", { length: 255 }), description: text("description"), - year_published: year("year_published"), - min_players: int("min_players"), - max_players: int("max_players"), - playtime: int("playtime"), - min_playtime: int("min_playtime"), - max_playtime: int("max_playtime"), - min_age: int("min_age"), + year_published: integer("year_published"), + min_players: integer("min_players"), + max_players: integer("max_players"), + playtime: integer("playtime"), + min_playtime: integer("min_playtime"), + max_playtime: integer("max_playtime"), + min_age: integer("min_age"), image_url: varchar("image_url", { length: 255 }), @@ -123,10 +134,22 @@ export const games = mysqlTable("games", { url: varchar("url", { length: 255 }), - external_id: int("external_id").unique(), - last_sync_at: datetime("last_sync_at"), - created_at: datetime("created_at").default(sql`(now(6))`), - updated_at: datetime("updated_at").default(sql`(now(6))`) + external_id: integer("external_id").unique(), + last_sync_at: timestamp("last_sync_at", { + withTimezone: true, + mode: "date", +precision: 6 + }), + created_at: timestamp("created_at", { + withTimezone: true, + mode: "date", +precision: 6 + }).default(sql`(now())`), + updated_at: timestamp("updated_at", { + withTimezone: true, + mode: "date", +precision: 6 + }).default(sql`(now())`) }); export type Games = InferSelectModel; @@ -139,7 +162,7 @@ export const gameRelations = relations(games, ({ many }) => ({ artists_to_games: many(artists_to_games), })) -export const expansions = mysqlTable("expansions", { +export const expansions = pgTable("expansions", { id: varchar("id", { length: 255 }).primaryKey() @@ -154,8 +177,16 @@ export const expansions = mysqlTable("expansions", { }) .notNull() .references(() => games.id, { onDelete: 'cascade' }), - created_at: datetime("created_at").default(sql`(now(6))`), - updated_at: datetime("updated_at").default(sql`(now(6))`) + created_at: timestamp("created_at", { + withTimezone: true, + mode: "date", +precision: 6 + }).default(sql`(now())`), + updated_at: timestamp("updated_at", { + withTimezone: true, + mode: "date", +precision: 6 + }).default(sql`(now())`) }) export const expansion_relations = relations(expansions, ({ one }) => ({ @@ -169,7 +200,7 @@ export const expansion_relations = relations(expansions, ({ one }) => ({ }) })); -export const collections = mysqlTable("collections", { +export const collections = pgTable("collections", { id: varchar("id", { length: 255 }).primaryKey() @@ -179,8 +210,16 @@ export const collections = mysqlTable("collections", { }) .notNull() .references(() => users.id, { onDelete: 'cascade' }), - created_at: datetime("created_at").default(sql`(now(6))`), - updated_at: datetime("updated_at").default(sql`(now(6))`) + created_at: timestamp("created_at", { + withTimezone: true, + mode: "date", +precision: 6 + }).default(sql`(now())`), + updated_at: timestamp("updated_at", { + withTimezone: true, + mode: "date", +precision: 6 + }).default(sql`(now())`) }); export const collection_relations = relations(collections, ({ one }) => ({ @@ -190,7 +229,7 @@ export const collection_relations = relations(collections, ({ one }) => ({ }), })) -export const collection_items = mysqlTable("collection_items", { +export const collection_items = pgTable("collection_items", { id: varchar("id", { length: 255 }).primaryKey() @@ -205,8 +244,16 @@ export const collection_items = mysqlTable("collection_items", { }) .notNull() .references(() => games.id, { onDelete: 'cascade' }), - created_at: datetime("created_at").default(sql`(now(6))`), - updated_at: datetime("updated_at").default(sql`(now(6))`) + created_at: timestamp("created_at", { + withTimezone: true, + mode: "date", +precision: 6 + }).default(sql`(now())`), + updated_at: timestamp("updated_at", { + withTimezone: true, + mode: "date", +precision: 6 + }).default(sql`(now())`) }); export const collection_item_relations = relations(collection_items, ({ one }) =>({ @@ -220,7 +267,7 @@ export const collection_item_relations = relations(collection_items, ({ one }) = }) })); -export const wishlists = mysqlTable("wishlists", { +export const wishlists = pgTable("wishlists", { id: varchar("id", { length: 255 }).primaryKey() @@ -230,8 +277,16 @@ export const wishlists = mysqlTable("wishlists", { }) .notNull() .references(() => users.id, { onDelete: 'cascade' }), - created_at: datetime("created_at").default(sql`(now(6))`), - updated_at: datetime("updated_at").default(sql`(now(6))`) + created_at: timestamp("created_at", { + withTimezone: true, + mode: "date", +precision: 6 + }).default(sql`(now())`), + updated_at: timestamp("updated_at", { + withTimezone: true, + mode: "date", +precision: 6 + }).default(sql`(now())`) }); export const wishlists_relations = relations(wishlists, ({ one }) => ({ @@ -241,7 +296,7 @@ export const wishlists_relations = relations(wishlists, ({ one }) => ({ }), })) -export const wishlist_items = mysqlTable('wishlist_items', { +export const wishlist_items = pgTable('wishlist_items', { id: varchar('id', { length: 255 }) @@ -257,8 +312,16 @@ export const wishlist_items = mysqlTable('wishlist_items', { }) .notNull() .references(() => games.id, { onDelete: 'cascade' }), - created_at: datetime('created_at').default(sql`(now(6))`), - updated_at: datetime('updated_at').default(sql`(now(6))`) + created_at: timestamp('created_at', { + withTimezone: true, + mode: "date", +precision: 6 + }).default(sql`(now())`), + updated_at: timestamp('updated_at', { + withTimezone: true, + mode: "date", +precision: 6 + }).default(sql`(now())`) }); export const wishlist_item_relations = relations(wishlist_items, ({ one }) => ({ @@ -272,7 +335,7 @@ export const wishlist_item_relations = relations(wishlist_items, ({ one }) => ({ }) })) -export const publishers = mysqlTable("publishers", { +export const publishers = pgTable("publishers", { id: varchar("id", { length: 255 }).primaryKey() @@ -283,16 +346,24 @@ export const publishers = mysqlTable("publishers", { slug: varchar("slug", { length: 255 }), - external_id: int("external_id"), - created_at: datetime("created_at").default(sql`(now(6))`), - updated_at: datetime("updated_at").default(sql`(now(6))`) + external_id: integer("external_id"), + created_at: timestamp("created_at", { + withTimezone: true, + mode: "date", +precision: 6 + }).default(sql`(now())`), + updated_at: timestamp("updated_at", { + withTimezone: true, + mode: "date", +precision: 6 + }).default(sql`(now())`) }); export const publishers_relations = relations(publishers, ({ many }) => ({ publishers_to_games: many(publishers_to_games) })); -export const categories = mysqlTable("categories", { +export const categories = pgTable("categories", { id: varchar("id", { length: 255 }).primaryKey() @@ -303,16 +374,24 @@ export const categories = mysqlTable("categories", { slug: varchar("slug", { length: 255 }), - external_id: int("external_id"), - created_at: datetime("created_at").default(sql`(now(6))`), - updated_at: datetime("updated_at").default(sql`(now(6))`) + external_id: integer("external_id"), + created_at: timestamp("created_at", { + withTimezone: true, + mode: "date", +precision: 6 + }).default(sql`(now())`), + updated_at: timestamp("updated_at", { + withTimezone: true, + mode: "date", +precision: 6 + }).default(sql`(now())`) }); export const categories_relations = relations(categories, ({ many }) => ({ categories_to_games: many(categories_to_games) })); -export const mechanics = mysqlTable("mechanics", { +export const mechanics = pgTable("mechanics", { id: varchar("id", { length: 255 }).primaryKey() @@ -323,16 +402,24 @@ export const mechanics = mysqlTable("mechanics", { slug: varchar("slug", { length: 255 }), - external_id: int("external_id"), - created_at: datetime("created_at").default(sql`(now(6))`), - updated_at: datetime("updated_at").default(sql`(now(6))`) + external_id: integer("external_id"), + created_at: timestamp("created_at", { + withTimezone: true, + mode: "date", +precision: 6 + }).default(sql`(now())`), + updated_at: timestamp("updated_at", { + withTimezone: true, + mode: "date", +precision: 6 + }).default(sql`(now())`) }); export const mechanic_relations = relations(mechanics, ({ many }) => ({ mechanics_to_games: many(mechanics_to_games) })) -export const designers = mysqlTable("designers", { +export const designers = pgTable("designers", { id: varchar("id", { length: 255 }).primaryKey() @@ -343,16 +430,24 @@ export const designers = mysqlTable("designers", { slug: varchar("slug", { length: 255 }), - external_id: int("external_id"), - created_at: datetime("created_at").default(sql`(now(6))`), - updated_at: datetime("updated_at").default(sql`(now(6))`) + external_id: integer("external_id"), + created_at: timestamp("created_at", { + withTimezone: true, + mode: "date", +precision: 6 + }).default(sql`(now())`), + updated_at: timestamp("updated_at", { + withTimezone: true, + mode: "date", +precision: 6 + }).default(sql`(now())`) }); export const designers_relations = relations(designers, ({ many }) => ({ designers_to_games: many(designers_to_games) })); -export const artists = mysqlTable("artists", { +export const artists = pgTable("artists", { id: varchar("id", { length: 255 }).primaryKey() @@ -363,16 +458,24 @@ export const artists = mysqlTable("artists", { slug: varchar("slug", { length: 255 }), - external_id: int("external_id"), - created_at: datetime("created_at").default(sql`(now(6))`), - updated_at: datetime("updated_at").default(sql`(now(6))`) + external_id: integer("external_id"), + created_at: timestamp("created_at", { + withTimezone: true, + mode: "date", +precision: 6 + }).default(sql`(now())`), + updated_at: timestamp("updated_at", { + withTimezone: true, + mode: "date", +precision: 6 + }).default(sql`(now())`) }); export const artists_relations = relations(artists, ({ many }) => ({ artists_to_games: many(artists_to_games) })); -export const artists_to_games = mysqlTable('artists_to_games', { +export const artists_to_games = pgTable('artists_to_games', { artist_id: varchar('artist_id', { length: 255 }), @@ -392,7 +495,7 @@ export const artists_to_games_relations = relations(artists_to_games, ({ one }) }), })); -export const categories_to_games = mysqlTable("categories_to_games", { +export const categories_to_games = pgTable("categories_to_games", { category_id: varchar("category_id", { length: 255 }), @@ -412,7 +515,7 @@ export const categories_to_games_relations = relations(categories_to_games, ({ o }), })) -export const designers_to_games = mysqlTable("designers_to_games", { +export const designers_to_games = pgTable("designers_to_games", { designer_id: varchar("designer_id", { length: 255 }), @@ -432,7 +535,7 @@ export const designers_to_games_relations = relations(designers_to_games, ({ one }), })) -export const mechanics_to_games = mysqlTable("mechanics_to_games", { +export const mechanics_to_games = pgTable("mechanics_to_games", { mechanic_id: varchar("mechanic_id", { length: 255 }), @@ -452,7 +555,7 @@ export const mechanics_to_games_relations = relations(mechanics_to_games, ({ one }), })); -export const publishers_to_games = mysqlTable("publishers_to_games", { +export const publishers_to_games = pgTable("publishers_to_games", { publisher_id: varchar("publisher_id", { length: 255 }), diff --git a/src/seed/insert.ts b/src/seed/insert.ts index 4d13cf3..1a1fd00 100644 --- a/src/seed/insert.ts +++ b/src/seed/insert.ts @@ -1,19 +1,23 @@ import 'dotenv/config'; -import { drizzle } from 'drizzle-orm/mysql2'; -import { createConnection } from 'mysql2'; +import { drizzle } from "drizzle-orm/node-postgres"; +import { sql } from 'drizzle-orm'; +import pg from 'pg'; import * as schema from '../schema'; -const connection = createConnection({ - host: process.env.DATABASE_HOST, - port: 3306, +// create the connection +const pool = new pg.Pool({ user: process.env.DATABASE_USER, password: process.env.DATABASE_PASSWORD, + host: process.env.DATABASE_HOST, + port: process.env.DATABASE_PORT, database: process.env.DATABASE_DB }); -const db = drizzle(connection, { schema: schema, mode: 'default' }); + +const db = drizzle(pool, { schema: schema }); const existingRoles = await db.query.roles.findMany(); if (existingRoles.length === 0) { + console.log('Creating roles ...'); await db.insert(schema.roles).values([{ name: 'admin' }, { @@ -24,4 +28,20 @@ if (existingRoles.length === 0) { console.log('Roles already exist. No action taken.'); } +const indexes = await db.execute(sql`select * from pg_catalog.pg_indexes where tablename = 'games'`); + +console.log('Indexes', indexes); + +const nameSlugIndexExists = indexes[0].flatMap((i) => i.Key_name).indexOf('full_text_name_slug_index') > -1; + +console.log('nameSlugIndexExists', nameSlugIndexExists); + +if (!nameSlugIndexExists) { + console.log('Full Text Index does not exist. Creating...'); + // Create index + await db.execute(sql`alter table games ADD FULLTEXT INDEX full_text_name_slug_index (name, slug)`); +} else { + console.log('Full Text Index already exists. No action taken.'); +} + await connection.end(); From eac53a993ba1db46feeb481f8280fac8ee52be0c Mon Sep 17 00:00:00 2001 From: Bradley Shellnut Date: Fri, 9 Feb 2024 17:01:54 -0800 Subject: [PATCH 12/34] Update dependencies, custom tsVector type for drizzle, and adding vector column on game for name and slug, and adding index on the search vector column. --- drizzle/0002_sour_silverclaw.sql | 27 + drizzle/0003_thick_tinkerer.sql | 1 + drizzle/meta/0002_snapshot.json | 1055 +++++++++++++++++++++++ drizzle/meta/0003_snapshot.json | 1063 ++++++++++++++++++++++++ drizzle/meta/_journal.json | 14 + package.json | 12 +- pnpm-lock.yaml | 510 ++++++------ src/lib/components/button/index.svelte | 15 - src/migrate.ts | 2 +- src/schema.ts | 841 ++++++++++--------- src/tsVector.ts | 26 + 11 files changed, 2879 insertions(+), 687 deletions(-) create mode 100644 drizzle/0002_sour_silverclaw.sql create mode 100644 drizzle/0003_thick_tinkerer.sql create mode 100644 drizzle/meta/0002_snapshot.json create mode 100644 drizzle/meta/0003_snapshot.json create mode 100644 src/tsVector.ts diff --git a/drizzle/0002_sour_silverclaw.sql b/drizzle/0002_sour_silverclaw.sql new file mode 100644 index 0000000..cd443f3 --- /dev/null +++ b/drizzle/0002_sour_silverclaw.sql @@ -0,0 +1,27 @@ +ALTER TABLE "artists" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint +ALTER TABLE "artists" ALTER COLUMN "updated_at" SET DEFAULT now();--> statement-breakpoint +ALTER TABLE "categories" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint +ALTER TABLE "categories" ALTER COLUMN "updated_at" SET DEFAULT now();--> statement-breakpoint +ALTER TABLE "collection_items" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint +ALTER TABLE "collection_items" ALTER COLUMN "updated_at" SET DEFAULT now();--> statement-breakpoint +ALTER TABLE "collections" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint +ALTER TABLE "collections" ALTER COLUMN "updated_at" SET DEFAULT now();--> statement-breakpoint +ALTER TABLE "designers" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint +ALTER TABLE "designers" ALTER COLUMN "updated_at" SET DEFAULT now();--> statement-breakpoint +ALTER TABLE "expansions" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint +ALTER TABLE "expansions" ALTER COLUMN "updated_at" SET DEFAULT now();--> statement-breakpoint +ALTER TABLE "games" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint +ALTER TABLE "games" ALTER COLUMN "updated_at" SET DEFAULT now();--> statement-breakpoint +ALTER TABLE "mechanics" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint +ALTER TABLE "mechanics" ALTER COLUMN "updated_at" SET DEFAULT now();--> statement-breakpoint +ALTER TABLE "publishers" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint +ALTER TABLE "publishers" ALTER COLUMN "updated_at" SET DEFAULT now();--> statement-breakpoint +ALTER TABLE "user_roles" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint +ALTER TABLE "user_roles" ALTER COLUMN "updated_at" SET DEFAULT now();--> statement-breakpoint +ALTER TABLE "users" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint +ALTER TABLE "users" ALTER COLUMN "updated_at" SET DEFAULT now();--> statement-breakpoint +ALTER TABLE "wishlist_items" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint +ALTER TABLE "wishlist_items" ALTER COLUMN "updated_at" SET DEFAULT now();--> statement-breakpoint +ALTER TABLE "wishlists" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint +ALTER TABLE "wishlists" ALTER COLUMN "updated_at" SET DEFAULT now();--> statement-breakpoint +ALTER TABLE "games" ADD COLUMN "text_searchable_index" "tsvector"; \ No newline at end of file diff --git a/drizzle/0003_thick_tinkerer.sql b/drizzle/0003_thick_tinkerer.sql new file mode 100644 index 0000000..9aa98ab --- /dev/null +++ b/drizzle/0003_thick_tinkerer.sql @@ -0,0 +1 @@ +CREATE INDEX IF NOT EXISTS "text_searchable_idx" ON "games" ("text_searchable_index"); \ No newline at end of file diff --git a/drizzle/meta/0002_snapshot.json b/drizzle/meta/0002_snapshot.json new file mode 100644 index 0000000..696c724 --- /dev/null +++ b/drizzle/meta/0002_snapshot.json @@ -0,0 +1,1055 @@ +{ + "id": "efbcf295-4499-4d80-9026-a0d8627b0e35", + "prevId": "99b2283f-80a5-44c6-be3b-b1fcd2a5818d", + "version": "5", + "dialect": "pg", + "tables": { + "artists": { + "name": "artists", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "artists_to_games": { + "name": "artists_to_games", + "schema": "", + "columns": { + "artist_id": { + "name": "artist_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "categories": { + "name": "categories", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "categories_to_games": { + "name": "categories_to_games", + "schema": "", + "columns": { + "category_id": { + "name": "category_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "collection_items": { + "name": "collection_items", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "collection_id": { + "name": "collection_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "collection_items_collection_id_collections_id_fk": { + "name": "collection_items_collection_id_collections_id_fk", + "tableFrom": "collection_items", + "tableTo": "collections", + "columnsFrom": [ + "collection_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "collection_items_game_id_games_id_fk": { + "name": "collection_items_game_id_games_id_fk", + "tableFrom": "collection_items", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "collections": { + "name": "collections", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "collections_user_id_users_id_fk": { + "name": "collections_user_id_users_id_fk", + "tableFrom": "collections", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "designers": { + "name": "designers", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "designers_to_games": { + "name": "designers_to_games", + "schema": "", + "columns": { + "designer_id": { + "name": "designer_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "expansions": { + "name": "expansions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "base_game_id": { + "name": "base_game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "expansions_base_game_id_games_id_fk": { + "name": "expansions_base_game_id_games_id_fk", + "tableFrom": "expansions", + "tableTo": "games", + "columnsFrom": [ + "base_game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "expansions_game_id_games_id_fk": { + "name": "expansions_game_id_games_id_fk", + "tableFrom": "expansions", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "games": { + "name": "games", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "year_published": { + "name": "year_published", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_players": { + "name": "min_players", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "max_players": { + "name": "max_players", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "playtime": { + "name": "playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_playtime": { + "name": "min_playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "max_playtime": { + "name": "max_playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_age": { + "name": "min_age", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "image_url": { + "name": "image_url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "thumb_url": { + "name": "thumb_url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "url": { + "name": "url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "text_searchable_index": { + "name": "text_searchable_index", + "type": "tsvector", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "last_sync_at": { + "name": "last_sync_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "games_external_id_unique": { + "name": "games_external_id_unique", + "nullsNotDistinct": false, + "columns": [ + "external_id" + ] + } + } + }, + "mechanics": { + "name": "mechanics", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "mechanics_to_games": { + "name": "mechanics_to_games", + "schema": "", + "columns": { + "mechanic_id": { + "name": "mechanic_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "publishers": { + "name": "publishers", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "publishers_to_games": { + "name": "publishers_to_games", + "schema": "", + "columns": { + "publisher_id": { + "name": "publisher_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "roles": { + "name": "roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "roles_name_unique": { + "name": "roles_name_unique", + "nullsNotDistinct": false, + "columns": [ + "name" + ] + } + } + }, + "sessions": { + "name": "sessions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "ip_country": { + "name": "ip_country", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "ip_address": { + "name": "ip_address", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "sessions_user_id_users_id_fk": { + "name": "sessions_user_id_users_id_fk", + "tableFrom": "sessions", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "user_roles": { + "name": "user_roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "role_id": { + "name": "role_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "user_roles_user_id_users_id_fk": { + "name": "user_roles_user_id_users_id_fk", + "tableFrom": "user_roles", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_roles_role_id_roles_id_fk": { + "name": "user_roles_role_id_roles_id_fk", + "tableFrom": "user_roles", + "tableTo": "roles", + "columnsFrom": [ + "role_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "username": { + "name": "username", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "hashed_password": { + "name": "hashed_password", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "first_name": { + "name": "first_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "last_name": { + "name": "last_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "verified": { + "name": "verified", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "receive_email": { + "name": "receive_email", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "theme": { + "name": "theme", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "default": "'system'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_username_unique": { + "name": "users_username_unique", + "nullsNotDistinct": false, + "columns": [ + "username" + ] + }, + "users_email_unique": { + "name": "users_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + } + }, + "wishlist_items": { + "name": "wishlist_items", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "wishlist_id": { + "name": "wishlist_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "wishlist_items_wishlist_id_wishlists_id_fk": { + "name": "wishlist_items_wishlist_id_wishlists_id_fk", + "tableFrom": "wishlist_items", + "tableTo": "wishlists", + "columnsFrom": [ + "wishlist_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "wishlist_items_game_id_games_id_fk": { + "name": "wishlist_items_game_id_games_id_fk", + "tableFrom": "wishlist_items", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "wishlists": { + "name": "wishlists", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "wishlists_user_id_users_id_fk": { + "name": "wishlists_user_id_users_id_fk", + "tableFrom": "wishlists", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + } + }, + "enums": {}, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/0003_snapshot.json b/drizzle/meta/0003_snapshot.json new file mode 100644 index 0000000..1d4401d --- /dev/null +++ b/drizzle/meta/0003_snapshot.json @@ -0,0 +1,1063 @@ +{ + "id": "425a2ccd-b74a-4e51-8c80-1a6387cc6c5d", + "prevId": "efbcf295-4499-4d80-9026-a0d8627b0e35", + "version": "5", + "dialect": "pg", + "tables": { + "artists": { + "name": "artists", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "artists_to_games": { + "name": "artists_to_games", + "schema": "", + "columns": { + "artist_id": { + "name": "artist_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "categories": { + "name": "categories", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "categories_to_games": { + "name": "categories_to_games", + "schema": "", + "columns": { + "category_id": { + "name": "category_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "collection_items": { + "name": "collection_items", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "collection_id": { + "name": "collection_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "collection_items_collection_id_collections_id_fk": { + "name": "collection_items_collection_id_collections_id_fk", + "tableFrom": "collection_items", + "tableTo": "collections", + "columnsFrom": [ + "collection_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "collection_items_game_id_games_id_fk": { + "name": "collection_items_game_id_games_id_fk", + "tableFrom": "collection_items", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "collections": { + "name": "collections", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "collections_user_id_users_id_fk": { + "name": "collections_user_id_users_id_fk", + "tableFrom": "collections", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "designers": { + "name": "designers", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "designers_to_games": { + "name": "designers_to_games", + "schema": "", + "columns": { + "designer_id": { + "name": "designer_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "expansions": { + "name": "expansions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "base_game_id": { + "name": "base_game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "expansions_base_game_id_games_id_fk": { + "name": "expansions_base_game_id_games_id_fk", + "tableFrom": "expansions", + "tableTo": "games", + "columnsFrom": [ + "base_game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "expansions_game_id_games_id_fk": { + "name": "expansions_game_id_games_id_fk", + "tableFrom": "expansions", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "games": { + "name": "games", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "year_published": { + "name": "year_published", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_players": { + "name": "min_players", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "max_players": { + "name": "max_players", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "playtime": { + "name": "playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_playtime": { + "name": "min_playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "max_playtime": { + "name": "max_playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_age": { + "name": "min_age", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "image_url": { + "name": "image_url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "thumb_url": { + "name": "thumb_url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "url": { + "name": "url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "text_searchable_index": { + "name": "text_searchable_index", + "type": "tsvector", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "last_sync_at": { + "name": "last_sync_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": { + "text_searchable_idx": { + "name": "text_searchable_idx", + "columns": [ + "text_searchable_index" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "games_external_id_unique": { + "name": "games_external_id_unique", + "nullsNotDistinct": false, + "columns": [ + "external_id" + ] + } + } + }, + "mechanics": { + "name": "mechanics", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "mechanics_to_games": { + "name": "mechanics_to_games", + "schema": "", + "columns": { + "mechanic_id": { + "name": "mechanic_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "publishers": { + "name": "publishers", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "publishers_to_games": { + "name": "publishers_to_games", + "schema": "", + "columns": { + "publisher_id": { + "name": "publisher_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "roles": { + "name": "roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "roles_name_unique": { + "name": "roles_name_unique", + "nullsNotDistinct": false, + "columns": [ + "name" + ] + } + } + }, + "sessions": { + "name": "sessions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "ip_country": { + "name": "ip_country", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "ip_address": { + "name": "ip_address", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "sessions_user_id_users_id_fk": { + "name": "sessions_user_id_users_id_fk", + "tableFrom": "sessions", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "user_roles": { + "name": "user_roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "role_id": { + "name": "role_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "user_roles_user_id_users_id_fk": { + "name": "user_roles_user_id_users_id_fk", + "tableFrom": "user_roles", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_roles_role_id_roles_id_fk": { + "name": "user_roles_role_id_roles_id_fk", + "tableFrom": "user_roles", + "tableTo": "roles", + "columnsFrom": [ + "role_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "username": { + "name": "username", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "hashed_password": { + "name": "hashed_password", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "first_name": { + "name": "first_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "last_name": { + "name": "last_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "verified": { + "name": "verified", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "receive_email": { + "name": "receive_email", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "theme": { + "name": "theme", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "default": "'system'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_username_unique": { + "name": "users_username_unique", + "nullsNotDistinct": false, + "columns": [ + "username" + ] + }, + "users_email_unique": { + "name": "users_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + } + }, + "wishlist_items": { + "name": "wishlist_items", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "wishlist_id": { + "name": "wishlist_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "wishlist_items_wishlist_id_wishlists_id_fk": { + "name": "wishlist_items_wishlist_id_wishlists_id_fk", + "tableFrom": "wishlist_items", + "tableTo": "wishlists", + "columnsFrom": [ + "wishlist_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "wishlist_items_game_id_games_id_fk": { + "name": "wishlist_items_game_id_games_id_fk", + "tableFrom": "wishlist_items", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "wishlists": { + "name": "wishlists", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "wishlists_user_id_users_id_fk": { + "name": "wishlists_user_id_users_id_fk", + "tableFrom": "wishlists", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + } + }, + "enums": {}, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json index 8851f62..24e784f 100644 --- a/drizzle/meta/_journal.json +++ b/drizzle/meta/_journal.json @@ -15,6 +15,20 @@ "when": 1707438055782, "tag": "0001_giant_tomorrow_man", "breakpoints": true + }, + { + "idx": 2, + "version": "5", + "when": 1707524139123, + "tag": "0002_sour_silverclaw", + "breakpoints": true + }, + { + "idx": 3, + "version": "5", + "when": 1707526808124, + "tag": "0003_thick_tinkerer", + "breakpoints": true } ] } \ No newline at end of file diff --git a/package.json b/package.json index 9279550..354256d 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "@sveltejs/kit": "^2.5.0", "@sveltejs/vite-plugin-svelte": "^3.0.2", "@types/cookie": "^0.6.0", - "@types/node": "^20.11.16", + "@types/node": "^20.11.17", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", "autoprefixer": "^10.4.17", @@ -47,11 +47,11 @@ "just-debounce-it": "^3.2.0", "postcss": "^8.4.35", "postcss-import": "^16.0.0", - "postcss-load-config": "^5.0.2", + "postcss-load-config": "^5.0.3", "postcss-preset-env": "^9.3.0", "prettier": "^3.2.5", "prettier-plugin-svelte": "^3.1.2", - "prisma": "^5.8.1", + "prisma": "^5.9.1", "sass": "^1.70.0", "satori": "^0.10.13", "satori-html": "^0.3.2", @@ -67,7 +67,7 @@ "tslib": "^2.6.1", "tsx": "^4.7.0", "typescript": "^5.3.3", - "vite": "^5.0.12", + "vite": "^5.1.1", "vitest": "^1.2.2", "zod": "^3.22.4" }, @@ -85,8 +85,8 @@ "@lukeed/uuid": "^2.0.1", "@neondatabase/serverless": "^0.8.1", "@paralleldrive/cuid2": "^2.2.2", - "@planetscale/database": "^1.15.0", - "@prisma/client": "^5.8.1", + "@planetscale/database": "^1.16.0", + "@prisma/client": "^5.9.1", "@sentry/sveltekit": "^7.100.1", "@sveltejs/adapter-vercel": "^5.1.0", "@types/feather-icons": "^4.29.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 379cd4a..5c2c3a8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,7 +19,7 @@ dependencies: version: 1.0.1(lucia@3.0.1) '@lucia-auth/adapter-prisma': specifier: 4.0.0 - version: 4.0.0(@prisma/client@5.8.1)(lucia@3.0.1) + version: 4.0.0(@prisma/client@5.9.1)(lucia@3.0.1) '@lukeed/uuid': specifier: ^2.0.1 version: 2.0.1 @@ -30,11 +30,11 @@ dependencies: specifier: ^2.2.2 version: 2.2.2 '@planetscale/database': - specifier: ^1.15.0 - version: 1.15.0 + specifier: ^1.16.0 + version: 1.16.0 '@prisma/client': - specifier: ^5.8.1 - version: 5.8.1(prisma@5.8.1) + specifier: ^5.9.1 + version: 5.9.1(prisma@5.9.1) '@sentry/sveltekit': specifier: ^7.100.1 version: 7.100.1(@sveltejs/kit@2.5.0)(svelte@4.2.10) @@ -64,7 +64,7 @@ dependencies: version: 0.6.0 drizzle-orm: specifier: ^0.29.3 - version: 0.29.3(@neondatabase/serverless@0.8.1)(@planetscale/database@1.15.0)(mysql2@3.9.1)(pg@8.11.3)(postgres@3.4.3) + version: 0.29.3(@neondatabase/serverless@0.8.1)(@planetscale/database@1.16.0)(mysql2@3.9.1)(pg@8.11.3)(postgres@3.4.3) feather-icons: specifier: ^4.29.1 version: 4.29.1 @@ -150,16 +150,16 @@ devDependencies: version: 0.1.8(svelte@4.2.10) '@sveltejs/kit': specifier: ^2.5.0 - version: 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.10)(vite@5.0.12) + version: 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.10)(vite@5.1.1) '@sveltejs/vite-plugin-svelte': specifier: ^3.0.2 - version: 3.0.2(svelte@4.2.10)(vite@5.0.12) + version: 3.0.2(svelte@4.2.10)(vite@5.1.1) '@types/cookie': specifier: ^0.6.0 version: 0.6.0 '@types/node': - specifier: ^20.11.16 - version: 20.11.16 + specifier: ^20.11.17 + version: 20.11.17 '@typescript-eslint/eslint-plugin': specifier: ^6.21.0 version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.3.3) @@ -197,8 +197,8 @@ devDependencies: specifier: ^16.0.0 version: 16.0.0(postcss@8.4.35) postcss-load-config: - specifier: ^5.0.2 - version: 5.0.2(postcss@8.4.35) + specifier: ^5.0.3 + version: 5.0.3(postcss@8.4.35) postcss-preset-env: specifier: ^9.3.0 version: 9.3.0(postcss@8.4.35) @@ -209,8 +209,8 @@ devDependencies: specifier: ^3.1.2 version: 3.1.2(prettier@3.2.5)(svelte@4.2.10) prisma: - specifier: ^5.8.1 - version: 5.8.1 + specifier: ^5.9.1 + version: 5.9.1 sass: specifier: ^1.70.0 version: 1.70.0 @@ -225,13 +225,13 @@ devDependencies: version: 4.2.10 svelte-check: specifier: ^3.6.4 - version: 3.6.4(postcss-load-config@5.0.2)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.10) + version: 3.6.4(postcss-load-config@5.0.3)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.10) svelte-meta-tags: specifier: ^3.1.0 version: 3.1.0(svelte@4.2.10)(typescript@5.3.3) svelte-preprocess: specifier: ^5.1.3 - version: 5.1.3(postcss-load-config@5.0.2)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.10)(typescript@5.3.3) + version: 5.1.3(postcss-load-config@5.0.3)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.10)(typescript@5.3.3) svelte-sequential-preprocessor: specifier: ^2.0.1 version: 2.0.1 @@ -246,7 +246,7 @@ devDependencies: version: 3.4.1(ts-node@10.9.2) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.11.16)(typescript@5.3.3) + version: 10.9.2(@types/node@20.11.17)(typescript@5.3.3) tslib: specifier: ^2.6.1 version: 2.6.2 @@ -257,11 +257,11 @@ devDependencies: specifier: ^5.3.3 version: 5.3.3 vite: - specifier: ^5.0.12 - version: 5.0.12(@types/node@20.11.16)(sass@1.70.0) + specifier: ^5.1.1 + version: 5.1.1(@types/node@20.11.17)(sass@1.70.0) vitest: specifier: ^1.2.2 - version: 1.2.2(@types/node@20.11.16)(sass@1.70.0) + version: 1.2.2(@types/node@20.11.17)(sass@1.70.0) zod: specifier: ^3.22.4 version: 3.22.4 @@ -756,16 +756,16 @@ packages: get-tsconfig: 4.7.2 dev: true - /@esbuild/aix-ppc64@0.19.10: - resolution: {integrity: sha512-Q+mk96KJ+FZ30h9fsJl+67IjNJm3x2eX+GBWGmocAKgzp27cowCOOqSdscX80s0SpdFXZnIv/+1xD1EctFx96Q==} + /@esbuild/aix-ppc64@0.19.11: + resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] requiresBuild: true optional: true - /@esbuild/aix-ppc64@0.19.11: - resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==} + /@esbuild/aix-ppc64@0.19.12: + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] @@ -781,16 +781,16 @@ packages: dev: true optional: true - /@esbuild/android-arm64@0.19.10: - resolution: {integrity: sha512-1X4CClKhDgC3by7k8aOWZeBXQX8dHT5QAMCAQDArCLaYfkppoARvh0fit3X2Qs+MXDngKcHv6XXyQCpY0hkK1Q==} + /@esbuild/android-arm64@0.19.11: + resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==} engines: {node: '>=12'} cpu: [arm64] os: [android] requiresBuild: true optional: true - /@esbuild/android-arm64@0.19.11: - resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==} + /@esbuild/android-arm64@0.19.12: + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -806,16 +806,16 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.19.10: - resolution: {integrity: sha512-7W0bK7qfkw1fc2viBfrtAEkDKHatYfHzr/jKAHNr9BvkYDXPcC6bodtm8AyLJNNuqClLNaeTLuwURt4PRT9d7w==} + /@esbuild/android-arm@0.19.11: + resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==} engines: {node: '>=12'} cpu: [arm] os: [android] requiresBuild: true optional: true - /@esbuild/android-arm@0.19.11: - resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==} + /@esbuild/android-arm@0.19.12: + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -831,16 +831,16 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.19.10: - resolution: {integrity: sha512-O/nO/g+/7NlitUxETkUv/IvADKuZXyH4BHf/g/7laqKC4i/7whLpB0gvpPc2zpF0q9Q6FXS3TS75QHac9MvVWw==} + /@esbuild/android-x64@0.19.11: + resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==} engines: {node: '>=12'} cpu: [x64] os: [android] requiresBuild: true optional: true - /@esbuild/android-x64@0.19.11: - resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==} + /@esbuild/android-x64@0.19.12: + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -856,16 +856,16 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.19.10: - resolution: {integrity: sha512-YSRRs2zOpwypck+6GL3wGXx2gNP7DXzetmo5pHXLrY/VIMsS59yKfjPizQ4lLt5vEI80M41gjm2BxrGZ5U+VMA==} + /@esbuild/darwin-arm64@0.19.11: + resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] requiresBuild: true optional: true - /@esbuild/darwin-arm64@0.19.11: - resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==} + /@esbuild/darwin-arm64@0.19.12: + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -881,16 +881,16 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.19.10: - resolution: {integrity: sha512-alfGtT+IEICKtNE54hbvPg13xGBe4GkVxyGWtzr+yHO7HIiRJppPDhOKq3zstTcVf8msXb/t4eavW3jCDpMSmA==} + /@esbuild/darwin-x64@0.19.11: + resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==} engines: {node: '>=12'} cpu: [x64] os: [darwin] requiresBuild: true optional: true - /@esbuild/darwin-x64@0.19.11: - resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==} + /@esbuild/darwin-x64@0.19.12: + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -906,16 +906,16 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.19.10: - resolution: {integrity: sha512-dMtk1wc7FSH8CCkE854GyGuNKCewlh+7heYP/sclpOG6Cectzk14qdUIY5CrKDbkA/OczXq9WesqnPl09mj5dg==} + /@esbuild/freebsd-arm64@0.19.11: + resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] requiresBuild: true optional: true - /@esbuild/freebsd-arm64@0.19.11: - resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==} + /@esbuild/freebsd-arm64@0.19.12: + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -931,16 +931,16 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.19.10: - resolution: {integrity: sha512-G5UPPspryHu1T3uX8WiOEUa6q6OlQh6gNl4CO4Iw5PS+Kg5bVggVFehzXBJY6X6RSOMS8iXDv2330VzaObm4Ag==} + /@esbuild/freebsd-x64@0.19.11: + resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] requiresBuild: true optional: true - /@esbuild/freebsd-x64@0.19.11: - resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==} + /@esbuild/freebsd-x64@0.19.12: + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -956,16 +956,16 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.19.10: - resolution: {integrity: sha512-QxaouHWZ+2KWEj7cGJmvTIHVALfhpGxo3WLmlYfJ+dA5fJB6lDEIg+oe/0//FuyVHuS3l79/wyBxbHr0NgtxJQ==} + /@esbuild/linux-arm64@0.19.11: + resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==} engines: {node: '>=12'} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@esbuild/linux-arm64@0.19.11: - resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==} + /@esbuild/linux-arm64@0.19.12: + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -981,16 +981,16 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.19.10: - resolution: {integrity: sha512-j6gUW5aAaPgD416Hk9FHxn27On28H4eVI9rJ4az7oCGTFW48+LcgNDBN+9f8rKZz7EEowo889CPKyeaD0iw9Kg==} + /@esbuild/linux-arm@0.19.11: + resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==} engines: {node: '>=12'} cpu: [arm] os: [linux] requiresBuild: true optional: true - /@esbuild/linux-arm@0.19.11: - resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==} + /@esbuild/linux-arm@0.19.12: + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -1006,16 +1006,16 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.19.10: - resolution: {integrity: sha512-4ub1YwXxYjj9h1UIZs2hYbnTZBtenPw5NfXCRgEkGb0b6OJ2gpkMvDqRDYIDRjRdWSe/TBiZltm3Y3Q8SN1xNg==} + /@esbuild/linux-ia32@0.19.11: + resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==} engines: {node: '>=12'} cpu: [ia32] os: [linux] requiresBuild: true optional: true - /@esbuild/linux-ia32@0.19.11: - resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==} + /@esbuild/linux-ia32@0.19.12: + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -1031,16 +1031,16 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.19.10: - resolution: {integrity: sha512-lo3I9k+mbEKoxtoIbM0yC/MZ1i2wM0cIeOejlVdZ3D86LAcFXFRdeuZmh91QJvUTW51bOK5W2BznGNIl4+mDaA==} + /@esbuild/linux-loong64@0.19.11: + resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] requiresBuild: true optional: true - /@esbuild/linux-loong64@0.19.11: - resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==} + /@esbuild/linux-loong64@0.19.12: + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -1056,16 +1056,16 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.19.10: - resolution: {integrity: sha512-J4gH3zhHNbdZN0Bcr1QUGVNkHTdpijgx5VMxeetSk6ntdt+vR1DqGmHxQYHRmNb77tP6GVvD+K0NyO4xjd7y4A==} + /@esbuild/linux-mips64el@0.19.11: + resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] requiresBuild: true optional: true - /@esbuild/linux-mips64el@0.19.11: - resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==} + /@esbuild/linux-mips64el@0.19.12: + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -1081,16 +1081,16 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.19.10: - resolution: {integrity: sha512-tgT/7u+QhV6ge8wFMzaklOY7KqiyitgT1AUHMApau32ZlvTB/+efeCtMk4eXS+uEymYK249JsoiklZN64xt6oQ==} + /@esbuild/linux-ppc64@0.19.11: + resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] requiresBuild: true optional: true - /@esbuild/linux-ppc64@0.19.11: - resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==} + /@esbuild/linux-ppc64@0.19.12: + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -1106,16 +1106,16 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.19.10: - resolution: {integrity: sha512-0f/spw0PfBMZBNqtKe5FLzBDGo0SKZKvMl5PHYQr3+eiSscfJ96XEknCe+JoOayybWUFQbcJTrk946i3j9uYZA==} + /@esbuild/linux-riscv64@0.19.11: + resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] requiresBuild: true optional: true - /@esbuild/linux-riscv64@0.19.11: - resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==} + /@esbuild/linux-riscv64@0.19.12: + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -1131,16 +1131,16 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.19.10: - resolution: {integrity: sha512-pZFe0OeskMHzHa9U38g+z8Yx5FNCLFtUnJtQMpwhS+r4S566aK2ci3t4NCP4tjt6d5j5uo4h7tExZMjeKoehAA==} + /@esbuild/linux-s390x@0.19.11: + resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==} engines: {node: '>=12'} cpu: [s390x] os: [linux] requiresBuild: true optional: true - /@esbuild/linux-s390x@0.19.11: - resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==} + /@esbuild/linux-s390x@0.19.12: + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -1156,16 +1156,16 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.19.10: - resolution: {integrity: sha512-SpYNEqg/6pZYoc+1zLCjVOYvxfZVZj6w0KROZ3Fje/QrM3nfvT2llI+wmKSrWuX6wmZeTapbarvuNNK/qepSgA==} + /@esbuild/linux-x64@0.19.11: + resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==} engines: {node: '>=12'} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@esbuild/linux-x64@0.19.11: - resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==} + /@esbuild/linux-x64@0.19.12: + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -1181,16 +1181,16 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.19.10: - resolution: {integrity: sha512-ACbZ0vXy9zksNArWlk2c38NdKg25+L9pr/mVaj9SUq6lHZu/35nx2xnQVRGLrC1KKQqJKRIB0q8GspiHI3J80Q==} + /@esbuild/netbsd-x64@0.19.11: + resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] requiresBuild: true optional: true - /@esbuild/netbsd-x64@0.19.11: - resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==} + /@esbuild/netbsd-x64@0.19.12: + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -1206,16 +1206,16 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.19.10: - resolution: {integrity: sha512-PxcgvjdSjtgPMiPQrM3pwSaG4kGphP+bLSb+cihuP0LYdZv1epbAIecHVl5sD3npkfYBZ0ZnOjR878I7MdJDFg==} + /@esbuild/openbsd-x64@0.19.11: + resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] requiresBuild: true optional: true - /@esbuild/openbsd-x64@0.19.11: - resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==} + /@esbuild/openbsd-x64@0.19.12: + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -1231,16 +1231,16 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.19.10: - resolution: {integrity: sha512-ZkIOtrRL8SEJjr+VHjmW0znkPs+oJXhlJbNwfI37rvgeMtk3sxOQevXPXjmAPZPigVTncvFqLMd+uV0IBSEzqA==} + /@esbuild/sunos-x64@0.19.11: + resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==} engines: {node: '>=12'} cpu: [x64] os: [sunos] requiresBuild: true optional: true - /@esbuild/sunos-x64@0.19.11: - resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==} + /@esbuild/sunos-x64@0.19.12: + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -1256,16 +1256,16 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.19.10: - resolution: {integrity: sha512-+Sa4oTDbpBfGpl3Hn3XiUe4f8TU2JF7aX8cOfqFYMMjXp6ma6NJDztl5FDG8Ezx0OjwGikIHw+iA54YLDNNVfw==} + /@esbuild/win32-arm64@0.19.11: + resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==} engines: {node: '>=12'} cpu: [arm64] os: [win32] requiresBuild: true optional: true - /@esbuild/win32-arm64@0.19.11: - resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==} + /@esbuild/win32-arm64@0.19.12: + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -1281,16 +1281,16 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.19.10: - resolution: {integrity: sha512-EOGVLK1oWMBXgfttJdPHDTiivYSjX6jDNaATeNOaCOFEVcfMjtbx7WVQwPSE1eIfCp/CaSF2nSrDtzc4I9f8TQ==} + /@esbuild/win32-ia32@0.19.11: + resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==} engines: {node: '>=12'} cpu: [ia32] os: [win32] requiresBuild: true optional: true - /@esbuild/win32-ia32@0.19.11: - resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==} + /@esbuild/win32-ia32@0.19.12: + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -1306,16 +1306,16 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.19.10: - resolution: {integrity: sha512-whqLG6Sc70AbU73fFYvuYzaE4MNMBIlR1Y/IrUeOXFrWHxBEjjbZaQ3IXIQS8wJdAzue2GwYZCjOrgrU1oUHoA==} + /@esbuild/win32-x64@0.19.11: + resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==} engines: {node: '>=12'} cpu: [x64] os: [win32] requiresBuild: true optional: true - /@esbuild/win32-x64@0.19.11: - resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==} + /@esbuild/win32-x64@0.19.12: + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -1687,13 +1687,13 @@ packages: lucia: 3.0.1 dev: false - /@lucia-auth/adapter-prisma@4.0.0(@prisma/client@5.8.1)(lucia@3.0.1): + /@lucia-auth/adapter-prisma@4.0.0(@prisma/client@5.9.1)(lucia@3.0.1): resolution: {integrity: sha512-TJg4/U1K1slS4A/OzDYCgmHTrIArntIynue14zGIEaMDu+OD+tGyq9WwQWqOabpx2Gm9xtDsoK+tTokAY3Up7A==} peerDependencies: '@prisma/client': ^4.2.0 || ^5.0.0 lucia: 3.x dependencies: - '@prisma/client': 5.8.1(prisma@5.8.1) + '@prisma/client': 5.9.1(prisma@5.9.1) lucia: 3.0.1 dev: false @@ -2407,8 +2407,8 @@ packages: '@noble/hashes': 1.3.2 dev: false - /@planetscale/database@1.15.0: - resolution: {integrity: sha512-X4GmGGKE3o6tj/FM+ElDdyVb9BI8Y2OSSeOtyW/gCmVS0XLs4tTppg0cVLL89CS+awEhIIYXFDwqT3a7pbYROg==} + /@planetscale/database@1.16.0: + resolution: {integrity: sha512-HNUrTqrd8aTRZYMDcsoZ62s36sIWkMMmKZBOehoCWR2WrfNPKq+Q1yQef5okl3pSVlldFnu2h/dbHjOsDTHXug==} engines: {node: '>=16'} dev: false @@ -2423,8 +2423,8 @@ packages: /@polka/url@1.0.0-next.24: resolution: {integrity: sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==} - /@prisma/client@5.8.1(prisma@5.8.1): - resolution: {integrity: sha512-xQtMPfbIwLlbm0VVIVQY2yqQVOxPwRQhvIp7Z3m2900g1bu/zRHKhYZJQWELqmjl6d8YwBy0K2NvMqh47v1ubw==} + /@prisma/client@5.9.1(prisma@5.9.1): + resolution: {integrity: sha512-caSOnG4kxcSkhqC/2ShV7rEoWwd3XrftokxJqOCMVvia4NYV/TPtJlS9C2os3Igxw/Qyxumj9GBQzcStzECvtQ==} engines: {node: '>=16.13'} requiresBuild: true peerDependencies: @@ -2433,35 +2433,35 @@ packages: prisma: optional: true dependencies: - prisma: 5.8.1 + prisma: 5.9.1 dev: false - /@prisma/debug@5.8.1: - resolution: {integrity: sha512-tjuw7eA0Us3T42jx9AmAgL58rzwzpFGYc3R7Y4Ip75EBYrKMBA1YihuWMcBC92ILmjlQ/u3p8VxcIE0hr+fZfg==} + /@prisma/debug@5.9.1: + resolution: {integrity: sha512-yAHFSFCg8KVoL0oRUno3m60GAjsUKYUDkQ+9BA2X2JfVR3kRVSJFc/GpQ2fSORi4pSHZR9orfM4UC9OVXIFFTA==} - /@prisma/engines-version@5.8.1-1.78caf6feeaed953168c64e15a249c3e9a033ebe2: - resolution: {integrity: sha512-f5C3JM3l9yhGr3cr4FMqWloFaSCpNpMi58Om22rjD2DOz3owci2mFdFXMgnAGazFPKrCbbEhcxdsRfspEYRoFQ==} + /@prisma/engines-version@5.9.0-32.23fdc5965b1e05fc54e5f26ed3de66776b93de64: + resolution: {integrity: sha512-HFl7275yF0FWbdcNvcSRbbu9JCBSLMcurYwvWc8WGDnpu7APxQo2ONtZrUggU3WxLxUJ2uBX+0GOFIcJeVeOOQ==} - /@prisma/engines@5.8.1: - resolution: {integrity: sha512-TJgYLRrZr56uhqcXO4GmP5be+zjCIHtLDK20Cnfg+o9d905hsN065QOL+3Z0zQAy6YD31Ol4u2kzSfRmbJv/uA==} + /@prisma/engines@5.9.1: + resolution: {integrity: sha512-gkdXmjxQ5jktxWNdDA5aZZ6R8rH74JkoKq6LD5mACSvxd2vbqWeWIOV0Py5wFC8vofOYShbt6XUeCIUmrOzOnQ==} requiresBuild: true dependencies: - '@prisma/debug': 5.8.1 - '@prisma/engines-version': 5.8.1-1.78caf6feeaed953168c64e15a249c3e9a033ebe2 - '@prisma/fetch-engine': 5.8.1 - '@prisma/get-platform': 5.8.1 + '@prisma/debug': 5.9.1 + '@prisma/engines-version': 5.9.0-32.23fdc5965b1e05fc54e5f26ed3de66776b93de64 + '@prisma/fetch-engine': 5.9.1 + '@prisma/get-platform': 5.9.1 - /@prisma/fetch-engine@5.8.1: - resolution: {integrity: sha512-+bgjjoSFa6uYEbAPlklfoVSStOEfcpheOjoBoNsNNSQdSzcwE2nM4Q0prun0+P8/0sCHo18JZ9xqa8gObvgOUw==} + /@prisma/fetch-engine@5.9.1: + resolution: {integrity: sha512-l0goQOMcNVOJs1kAcwqpKq3ylvkD9F04Ioe1oJoCqmz05mw22bNAKKGWuDd3zTUoUZr97va0c/UfLNru+PDmNA==} dependencies: - '@prisma/debug': 5.8.1 - '@prisma/engines-version': 5.8.1-1.78caf6feeaed953168c64e15a249c3e9a033ebe2 - '@prisma/get-platform': 5.8.1 + '@prisma/debug': 5.9.1 + '@prisma/engines-version': 5.9.0-32.23fdc5965b1e05fc54e5f26ed3de66776b93de64 + '@prisma/get-platform': 5.9.1 - /@prisma/get-platform@5.8.1: - resolution: {integrity: sha512-wnA+6HTFcY+tkykMokix9GiAkaauPC5W/gg0O5JB0J8tCTNWrqpnQ7AsaGRfkYUbeOIioh6woDjQrGTTRf1Zag==} + /@prisma/get-platform@5.9.1: + resolution: {integrity: sha512-6OQsNxTyhvG+T2Ksr8FPFpuPeL4r9u0JF0OZHUBI/Uy9SS43sPyAIutt4ZEAyqWQt104ERh70EZedkHZKsnNbg==} dependencies: - '@prisma/debug': 5.8.1 + '@prisma/debug': 5.9.1 /@resvg/resvg-js-android-arm-eabi@2.6.0: resolution: {integrity: sha512-lJnZ/2P5aMocrFMW7HWhVne5gH82I8xH6zsfH75MYr4+/JOaVcGCTEQ06XFohGMdYRP3v05SSPLPvTM/RHjxfA==} @@ -2616,92 +2616,92 @@ packages: picomatch: 2.3.1 dev: true - /@rollup/rollup-android-arm-eabi@4.9.1: - resolution: {integrity: sha512-6vMdBZqtq1dVQ4CWdhFwhKZL6E4L1dV6jUjuBvsavvNJSppzi6dLBbuV+3+IyUREaj9ZFvQefnQm28v4OCXlig==} + /@rollup/rollup-android-arm-eabi@4.9.6: + resolution: {integrity: sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==} cpu: [arm] os: [android] requiresBuild: true optional: true - /@rollup/rollup-android-arm64@4.9.1: - resolution: {integrity: sha512-Jto9Fl3YQ9OLsTDWtLFPtaIMSL2kwGyGoVCmPC8Gxvym9TCZm4Sie+cVeblPO66YZsYH8MhBKDMGZ2NDxuk/XQ==} + /@rollup/rollup-android-arm64@4.9.6: + resolution: {integrity: sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==} cpu: [arm64] os: [android] requiresBuild: true optional: true - /@rollup/rollup-darwin-arm64@4.9.1: - resolution: {integrity: sha512-LtYcLNM+bhsaKAIGwVkh5IOWhaZhjTfNOkGzGqdHvhiCUVuJDalvDxEdSnhFzAn+g23wgsycmZk1vbnaibZwwA==} + /@rollup/rollup-darwin-arm64@4.9.6: + resolution: {integrity: sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==} cpu: [arm64] os: [darwin] requiresBuild: true optional: true - /@rollup/rollup-darwin-x64@4.9.1: - resolution: {integrity: sha512-KyP/byeXu9V+etKO6Lw3E4tW4QdcnzDG/ake031mg42lob5tN+5qfr+lkcT/SGZaH2PdW4Z1NX9GHEkZ8xV7og==} + /@rollup/rollup-darwin-x64@4.9.6: + resolution: {integrity: sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==} cpu: [x64] os: [darwin] requiresBuild: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.9.1: - resolution: {integrity: sha512-Yqz/Doumf3QTKplwGNrCHe/B2p9xqDghBZSlAY0/hU6ikuDVQuOUIpDP/YcmoT+447tsZTmirmjgG3znvSCR0Q==} + /@rollup/rollup-linux-arm-gnueabihf@4.9.6: + resolution: {integrity: sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==} cpu: [arm] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.9.1: - resolution: {integrity: sha512-u3XkZVvxcvlAOlQJ3UsD1rFvLWqu4Ef/Ggl40WAVCuogf4S1nJPHh5RTgqYFpCOvuGJ7H5yGHabjFKEZGExk5Q==} + /@rollup/rollup-linux-arm64-gnu@4.9.6: + resolution: {integrity: sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-arm64-musl@4.9.1: - resolution: {integrity: sha512-0XSYN/rfWShW+i+qjZ0phc6vZ7UWI8XWNz4E/l+6edFt+FxoEghrJHjX1EY/kcUGCnZzYYRCl31SNdfOi450Aw==} + /@rollup/rollup-linux-arm64-musl@4.9.6: + resolution: {integrity: sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-riscv64-gnu@4.9.1: - resolution: {integrity: sha512-LmYIO65oZVfFt9t6cpYkbC4d5lKHLYv5B4CSHRpnANq0VZUQXGcCPXHzbCXCz4RQnx7jvlYB1ISVNCE/omz5cw==} + /@rollup/rollup-linux-riscv64-gnu@4.9.6: + resolution: {integrity: sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==} cpu: [riscv64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-x64-gnu@4.9.1: - resolution: {integrity: sha512-kr8rEPQ6ns/Lmr/hiw8sEVj9aa07gh1/tQF2Y5HrNCCEPiCBGnBUt9tVusrcBBiJfIt1yNaXN6r1CCmpbFEDpg==} + /@rollup/rollup-linux-x64-gnu@4.9.6: + resolution: {integrity: sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-x64-musl@4.9.1: - resolution: {integrity: sha512-t4QSR7gN+OEZLG0MiCgPqMWZGwmeHhsM4AkegJ0Kiy6TnJ9vZ8dEIwHw1LcZKhbHxTY32hp9eVCMdR3/I8MGRw==} + /@rollup/rollup-linux-x64-musl@4.9.6: + resolution: {integrity: sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.9.1: - resolution: {integrity: sha512-7XI4ZCBN34cb+BH557FJPmh0kmNz2c25SCQeT9OiFWEgf8+dL6ZwJ8f9RnUIit+j01u07Yvrsuu1rZGxJCc51g==} + /@rollup/rollup-win32-arm64-msvc@4.9.6: + resolution: {integrity: sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==} cpu: [arm64] os: [win32] requiresBuild: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.9.1: - resolution: {integrity: sha512-yE5c2j1lSWOH5jp+Q0qNL3Mdhr8WuqCNVjc6BxbVfS5cAS6zRmdiw7ktb8GNpDCEUJphILY6KACoFoRtKoqNQg==} + /@rollup/rollup-win32-ia32-msvc@4.9.6: + resolution: {integrity: sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==} cpu: [ia32] os: [win32] requiresBuild: true optional: true - /@rollup/rollup-win32-x64-msvc@4.9.1: - resolution: {integrity: sha512-PyJsSsafjmIhVgaI1Zdj7m8BB8mMckFah/xbpplObyHfiXzKcI5UOUXRyOdHW7nz4DpMCuzLnF7v5IWHenCwYA==} + /@rollup/rollup-win32-x64-msvc@4.9.6: + resolution: {integrity: sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==} cpu: [x64] os: [win32] requiresBuild: true @@ -2864,7 +2864,7 @@ packages: '@sentry/types': 7.100.1 '@sentry/utils': 7.100.1 '@sentry/vite-plugin': 0.6.1 - '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.10)(vite@5.0.12) + '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.10)(vite@5.1.1) magicast: 0.2.8 sorcery: 0.11.0 transitivePeerDependencies: @@ -2931,7 +2931,7 @@ packages: peerDependencies: '@sveltejs/kit': ^2.0.0 dependencies: - '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.10)(vite@5.0.12) + '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.10)(vite@5.1.1) import-meta-resolve: 4.0.0 dev: true @@ -2940,7 +2940,7 @@ packages: peerDependencies: '@sveltejs/kit': ^2.4.0 dependencies: - '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.10)(vite@5.0.12) + '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.10)(vite@5.1.1) '@vercel/nft': 0.26.2 esbuild: 0.19.11 transitivePeerDependencies: @@ -2959,7 +2959,7 @@ packages: - svelte dev: true - /@sveltejs/kit@2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.10)(vite@5.0.12): + /@sveltejs/kit@2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.10)(vite@5.1.1): resolution: {integrity: sha512-1uyXvzC2Lu1FZa30T4y5jUAC21R309ZMRG0TPt+PPPbNUoDpy8zSmSNVWYaBWxYDqLGQ5oPNWvjvvF2IjJ1jmA==} engines: {node: '>=18.13'} hasBin: true @@ -2969,7 +2969,7 @@ packages: svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.3 dependencies: - '@sveltejs/vite-plugin-svelte': 3.0.2(svelte@4.2.10)(vite@5.0.12) + '@sveltejs/vite-plugin-svelte': 3.0.2(svelte@4.2.10)(vite@5.1.1) '@types/cookie': 0.6.0 cookie: 0.6.0 devalue: 4.3.2 @@ -2983,9 +2983,9 @@ packages: sirv: 2.0.4 svelte: 4.2.10 tiny-glob: 0.2.9 - vite: 5.0.12(@types/node@20.11.16)(sass@1.70.0) + vite: 5.1.1(@types/node@20.11.17)(sass@1.70.0) - /@sveltejs/vite-plugin-svelte-inspector@2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.10)(vite@5.0.12): + /@sveltejs/vite-plugin-svelte-inspector@2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.10)(vite@5.1.1): resolution: {integrity: sha512-gjr9ZFg1BSlIpfZ4PRewigrvYmHWbDrq2uvvPB1AmTWKuM+dI1JXQSUu2pIrYLb/QncyiIGkFDFKTwJ0XqQZZg==} engines: {node: ^18.0.0 || >=20} peerDependencies: @@ -2993,29 +2993,29 @@ packages: svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.0 dependencies: - '@sveltejs/vite-plugin-svelte': 3.0.2(svelte@4.2.10)(vite@5.0.12) + '@sveltejs/vite-plugin-svelte': 3.0.2(svelte@4.2.10)(vite@5.1.1) debug: 4.3.4 svelte: 4.2.10 - vite: 5.0.12(@types/node@20.11.16)(sass@1.70.0) + vite: 5.1.1(@types/node@20.11.17)(sass@1.70.0) transitivePeerDependencies: - supports-color - /@sveltejs/vite-plugin-svelte@3.0.2(svelte@4.2.10)(vite@5.0.12): + /@sveltejs/vite-plugin-svelte@3.0.2(svelte@4.2.10)(vite@5.1.1): resolution: {integrity: sha512-MpmF/cju2HqUls50WyTHQBZUV3ovV/Uk8k66AN2gwHogNAG8wnW8xtZDhzNBsFJJuvmq1qnzA5kE7YfMJNFv2Q==} engines: {node: ^18.0.0 || >=20} peerDependencies: svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.0 dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.10)(vite@5.0.12) + '@sveltejs/vite-plugin-svelte-inspector': 2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.10)(vite@5.1.1) debug: 4.3.4 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.5 svelte: 4.2.10 svelte-hmr: 0.15.3(svelte@4.2.10) - vite: 5.0.12(@types/node@20.11.16)(sass@1.70.0) - vitefu: 0.2.5(vite@5.0.12) + vite: 5.1.1(@types/node@20.11.17)(sass@1.70.0) + vitefu: 0.2.5(vite@5.1.1) transitivePeerDependencies: - supports-color @@ -3058,15 +3058,15 @@ packages: resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} dev: true - /@types/node@20.11.16: - resolution: {integrity: sha512-gKb0enTmRCzXSSUJDq6/sPcqrfCv2mkkG6Jt/clpn5eiCbKTY+SgZUxo+p8ZKMof5dCp9vHQUAB7wOUTod22wQ==} + /@types/node@20.11.17: + resolution: {integrity: sha512-QmgQZGWu1Yw9TDyAP9ZzpFJKynYNeOvwMJmaxABfieQoVoiVOS6MN1WSpqpRcbeA5+RW82kraAVxCCJg+780Qw==} dependencies: undici-types: 5.26.5 /@types/pg@8.6.6: resolution: {integrity: sha512-O2xNmXebtwVekJDD+02udOncjVcMZQuTEQEMpKJ0ZRf5E7/9JJX3izhKUcUifBkyKpljyUM6BTgy2trmviKlpw==} dependencies: - '@types/node': 20.11.16 + '@types/node': 20.11.17 pg-protocol: 1.6.0 pg-types: 2.2.0 dev: false @@ -3981,7 +3981,7 @@ packages: - supports-color dev: true - /drizzle-orm@0.29.3(@neondatabase/serverless@0.8.1)(@planetscale/database@1.15.0)(mysql2@3.9.1)(pg@8.11.3)(postgres@3.4.3): + /drizzle-orm@0.29.3(@neondatabase/serverless@0.8.1)(@planetscale/database@1.16.0)(mysql2@3.9.1)(pg@8.11.3)(postgres@3.4.3): resolution: {integrity: sha512-uSE027csliGSGYD0pqtM+SAQATMREb3eSM/U8s6r+Y0RFwTKwftnwwSkqx3oS65UBgqDOM0gMTl5UGNpt6lW0A==} peerDependencies: '@aws-sdk/client-rds-data': '>=3' @@ -4053,7 +4053,7 @@ packages: optional: true dependencies: '@neondatabase/serverless': 0.8.1 - '@planetscale/database': 1.15.0 + '@planetscale/database': 1.16.0 mysql2: 3.9.1 pg: 8.11.3 postgres: 3.4.3 @@ -4157,36 +4157,6 @@ packages: '@esbuild/win32-x64': 0.18.20 dev: true - /esbuild@0.19.10: - resolution: {integrity: sha512-S1Y27QGt/snkNYrRcswgRFqZjaTG5a5xM3EQo97uNBnH505pdzSNe/HLBq1v0RO7iK/ngdbhJB6mDAp0OK+iUA==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/aix-ppc64': 0.19.10 - '@esbuild/android-arm': 0.19.10 - '@esbuild/android-arm64': 0.19.10 - '@esbuild/android-x64': 0.19.10 - '@esbuild/darwin-arm64': 0.19.10 - '@esbuild/darwin-x64': 0.19.10 - '@esbuild/freebsd-arm64': 0.19.10 - '@esbuild/freebsd-x64': 0.19.10 - '@esbuild/linux-arm': 0.19.10 - '@esbuild/linux-arm64': 0.19.10 - '@esbuild/linux-ia32': 0.19.10 - '@esbuild/linux-loong64': 0.19.10 - '@esbuild/linux-mips64el': 0.19.10 - '@esbuild/linux-ppc64': 0.19.10 - '@esbuild/linux-riscv64': 0.19.10 - '@esbuild/linux-s390x': 0.19.10 - '@esbuild/linux-x64': 0.19.10 - '@esbuild/netbsd-x64': 0.19.10 - '@esbuild/openbsd-x64': 0.19.10 - '@esbuild/sunos-x64': 0.19.10 - '@esbuild/win32-arm64': 0.19.10 - '@esbuild/win32-ia32': 0.19.10 - '@esbuild/win32-x64': 0.19.10 - /esbuild@0.19.11: resolution: {integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==} engines: {node: '>=12'} @@ -4217,6 +4187,36 @@ packages: '@esbuild/win32-ia32': 0.19.11 '@esbuild/win32-x64': 0.19.11 + /esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -5933,7 +5933,7 @@ packages: dependencies: lilconfig: 2.1.0 postcss: 8.4.35 - ts-node: 10.9.2(@types/node@20.11.16)(typescript@5.3.3) + ts-node: 10.9.2(@types/node@20.11.17)(typescript@5.3.3) yaml: 1.10.2 dev: true @@ -5951,11 +5951,11 @@ packages: dependencies: lilconfig: 3.0.0 postcss: 8.4.35 - ts-node: 10.9.2(@types/node@20.11.16)(typescript@5.3.3) + ts-node: 10.9.2(@types/node@20.11.17)(typescript@5.3.3) yaml: 2.3.4 - /postcss-load-config@5.0.2(postcss@8.4.35): - resolution: {integrity: sha512-Q8QR3FYbqOKa0bnC1UQ2bFq9/ulHX5Bi34muzitMr8aDtUelO5xKeJEYC/5smE0jNE9zdB/NBnOwXKexELbRlw==} + /postcss-load-config@5.0.3(postcss@8.4.35): + resolution: {integrity: sha512-90pBBI5apUVruIEdCxZic93Wm+i9fTrp7TXbgdUCH+/L+2WnfpITSpq5dFU/IPvbv7aNiMlQISpUkAm3fEcvgQ==} engines: {node: '>= 18'} peerDependencies: jiti: '>=1.21.0' @@ -6228,13 +6228,13 @@ packages: react-is: 18.2.0 dev: true - /prisma@5.8.1: - resolution: {integrity: sha512-N6CpjzECnUHZ5beeYpDzkt2rYpEdAeqXX2dweu6BoQaeYkNZrC/WJHM+5MO/uidFHTak8QhkPKBWck1o/4MD4A==} + /prisma@5.9.1: + resolution: {integrity: sha512-Hy/8KJZz0ELtkw4FnG9MS9rNWlXcJhf98Z2QMqi0QiVMoS8PzsBkpla0/Y5hTlob8F3HeECYphBjqmBxrluUrQ==} engines: {node: '>=16.13'} hasBin: true requiresBuild: true dependencies: - '@prisma/engines': 5.8.1 + '@prisma/engines': 5.9.1 /progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} @@ -6345,24 +6345,26 @@ packages: dependencies: glob: 7.2.3 - /rollup@4.9.1: - resolution: {integrity: sha512-pgPO9DWzLoW/vIhlSoDByCzcpX92bKEorbgXuZrqxByte3JFk2xSW2JEeAcyLc9Ru9pqcNNW+Ob7ntsk2oT/Xw==} + /rollup@4.9.6: + resolution: {integrity: sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + dependencies: + '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.9.1 - '@rollup/rollup-android-arm64': 4.9.1 - '@rollup/rollup-darwin-arm64': 4.9.1 - '@rollup/rollup-darwin-x64': 4.9.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.9.1 - '@rollup/rollup-linux-arm64-gnu': 4.9.1 - '@rollup/rollup-linux-arm64-musl': 4.9.1 - '@rollup/rollup-linux-riscv64-gnu': 4.9.1 - '@rollup/rollup-linux-x64-gnu': 4.9.1 - '@rollup/rollup-linux-x64-musl': 4.9.1 - '@rollup/rollup-win32-arm64-msvc': 4.9.1 - '@rollup/rollup-win32-ia32-msvc': 4.9.1 - '@rollup/rollup-win32-x64-msvc': 4.9.1 + '@rollup/rollup-android-arm-eabi': 4.9.6 + '@rollup/rollup-android-arm64': 4.9.6 + '@rollup/rollup-darwin-arm64': 4.9.6 + '@rollup/rollup-darwin-x64': 4.9.6 + '@rollup/rollup-linux-arm-gnueabihf': 4.9.6 + '@rollup/rollup-linux-arm64-gnu': 4.9.6 + '@rollup/rollup-linux-arm64-musl': 4.9.6 + '@rollup/rollup-linux-riscv64-gnu': 4.9.6 + '@rollup/rollup-linux-x64-gnu': 4.9.6 + '@rollup/rollup-linux-x64-musl': 4.9.6 + '@rollup/rollup-win32-arm64-msvc': 4.9.6 + '@rollup/rollup-win32-ia32-msvc': 4.9.6 + '@rollup/rollup-win32-x64-msvc': 4.9.6 fsevents: 2.3.3 /run-parallel@1.2.0: @@ -6694,7 +6696,7 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - /svelte-check@3.6.4(postcss-load-config@5.0.2)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.10): + /svelte-check@3.6.4(postcss-load-config@5.0.3)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.10): resolution: {integrity: sha512-mY/dqucqm46p72M8yZmn81WPZx9mN6uuw8UVfR3ZKQeLxQg5HDGO3HHm5AZuWZPYNMLJ+TRMn+TeN53HfQ/vsw==} hasBin: true peerDependencies: @@ -6707,7 +6709,7 @@ packages: picocolors: 1.0.0 sade: 1.8.1 svelte: 4.2.10 - svelte-preprocess: 5.1.3(postcss-load-config@5.0.2)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.10)(typescript@5.3.3) + svelte-preprocess: 5.1.3(postcss-load-config@5.0.3)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.10)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: - '@babel/core' @@ -6778,7 +6780,7 @@ packages: svelte: 4.2.10 dev: true - /svelte-preprocess@5.1.3(postcss-load-config@5.0.2)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.10)(typescript@5.3.3): + /svelte-preprocess@5.1.3(postcss-load-config@5.0.3)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.10)(typescript@5.3.3): resolution: {integrity: sha512-xxAkmxGHT+J/GourS5mVJeOXZzne1FR5ljeOUAMXUkfEhkLEllRreXpbl3dIYJlcJRfL1LO1uIAPpBpBfiqGPw==} engines: {node: '>= 16.0.0', pnpm: ^8.0.0} requiresBuild: true @@ -6820,7 +6822,7 @@ packages: detect-indent: 6.1.0 magic-string: 0.30.5 postcss: 8.4.35 - postcss-load-config: 5.0.2(postcss@8.4.35) + postcss-load-config: 5.0.3(postcss@8.4.35) sass: 1.70.0 sorcery: 0.11.0 strip-indent: 3.0.0 @@ -6869,7 +6871,7 @@ packages: '@sveltejs/kit': 1.x || 2.x svelte: 3.x || 4.x dependencies: - '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.10)(vite@5.0.12) + '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.10)(vite@5.1.1) svelte: 4.2.10 dev: true @@ -6880,7 +6882,7 @@ packages: svelte: 3.x || 4.x zod: 3.x dependencies: - '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.10)(vite@5.0.12) + '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.10)(vite@5.1.1) devalue: 4.3.2 klona: 2.0.6 svelte: 4.2.10 @@ -7044,7 +7046,7 @@ packages: /ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - /ts-node@10.9.2(@types/node@20.11.16)(typescript@5.3.3): + /ts-node@10.9.2(@types/node@20.11.17)(typescript@5.3.3): resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: @@ -7063,7 +7065,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.11.16 + '@types/node': 20.11.17 acorn: 8.11.2 acorn-walk: 8.3.0 arg: 4.1.3 @@ -7219,7 +7221,7 @@ packages: - rollup dev: true - /vite-node@1.2.2(@types/node@20.11.16)(sass@1.70.0): + /vite-node@1.2.2(@types/node@20.11.17)(sass@1.70.0): resolution: {integrity: sha512-1as4rDTgVWJO3n1uHmUYqq7nsFgINQ9u+mRcXpjeOMJUmviqNKjcZB7UfRZrlM7MjYXMKpuWp5oGkjaFLnjawg==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -7228,7 +7230,7 @@ packages: debug: 4.3.4 pathe: 1.1.1 picocolors: 1.0.0 - vite: 5.0.12(@types/node@20.11.16)(sass@1.70.0) + vite: 5.1.1(@types/node@20.11.17)(sass@1.70.0) transitivePeerDependencies: - '@types/node' - less @@ -7240,8 +7242,8 @@ packages: - terser dev: true - /vite@5.0.12(@types/node@20.11.16)(sass@1.70.0): - resolution: {integrity: sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==} + /vite@5.1.1(@types/node@20.11.17)(sass@1.70.0): + resolution: {integrity: sha512-wclpAgY3F1tR7t9LL5CcHC41YPkQIpKUGeIuT8MdNwNZr6OqOTLs7JX5vIHAtzqLWXts0T+GDrh9pN2arneKqg==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -7268,15 +7270,15 @@ packages: terser: optional: true dependencies: - '@types/node': 20.11.16 - esbuild: 0.19.10 + '@types/node': 20.11.17 + esbuild: 0.19.12 postcss: 8.4.35 - rollup: 4.9.1 + rollup: 4.9.6 sass: 1.70.0 optionalDependencies: fsevents: 2.3.3 - /vitefu@0.2.5(vite@5.0.12): + /vitefu@0.2.5(vite@5.1.1): resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} peerDependencies: vite: ^3.0.0 || ^4.0.0 || ^5.0.0 @@ -7284,9 +7286,9 @@ packages: vite: optional: true dependencies: - vite: 5.0.12(@types/node@20.11.16)(sass@1.70.0) + vite: 5.1.1(@types/node@20.11.17)(sass@1.70.0) - /vitest@1.2.2(@types/node@20.11.16)(sass@1.70.0): + /vitest@1.2.2(@types/node@20.11.17)(sass@1.70.0): resolution: {integrity: sha512-d5Ouvrnms3GD9USIK36KG8OZ5bEvKEkITFtnGv56HFaSlbItJuYr7hv2Lkn903+AvRAgSixiamozUVfORUekjw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -7311,7 +7313,7 @@ packages: jsdom: optional: true dependencies: - '@types/node': 20.11.16 + '@types/node': 20.11.17 '@vitest/expect': 1.2.2 '@vitest/runner': 1.2.2 '@vitest/snapshot': 1.2.2 @@ -7330,8 +7332,8 @@ packages: strip-literal: 1.3.0 tinybench: 2.5.1 tinypool: 0.8.2 - vite: 5.0.12(@types/node@20.11.16)(sass@1.70.0) - vite-node: 1.2.2(@types/node@20.11.16)(sass@1.70.0) + vite: 5.1.1(@types/node@20.11.17)(sass@1.70.0) + vite-node: 1.2.2(@types/node@20.11.17)(sass@1.70.0) why-is-node-running: 2.2.2 transitivePeerDependencies: - less diff --git a/src/lib/components/button/index.svelte b/src/lib/components/button/index.svelte index b67a43f..80e0419 100644 --- a/src/lib/components/button/index.svelte +++ b/src/lib/components/button/index.svelte @@ -1,6 +1,5 @@ @@ -27,18 +26,4 @@ min-width: 23.5rem; } } - - .danger { - background-color: var(--warning); - } - - .danger:hover { - background-color: var(--warning-hover); - } - - .btn-icon { - display: grid; - grid-template-columns: repeat(2, auto); - gap: 1rem; - } diff --git a/src/migrate.ts b/src/migrate.ts index 79365f3..d5befa0 100644 --- a/src/migrate.ts +++ b/src/migrate.ts @@ -1,7 +1,7 @@ import 'dotenv/config'; +import postgres from 'postgres'; import { drizzle } from 'drizzle-orm/postgres-js'; import { migrate } from 'drizzle-orm/postgres-js/migrator'; -import postgres from 'postgres'; const connection = postgres({ host: process.env.DATABASE_HOST, diff --git a/src/schema.ts b/src/schema.ts index 5eb49f8..f2a3504 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -1,38 +1,40 @@ import { relations, sql, type InferSelectModel } from 'drizzle-orm'; -import { pgTable, timestamp, varchar, boolean, integer, text } from 'drizzle-orm/pg-core'; +import { pgTable, timestamp, varchar, boolean, integer, text, index } from 'drizzle-orm/pg-core'; import { nanoid } from 'nanoid'; +import { tsvector } from './tsVector'; -export const users = pgTable("users", { - id: varchar("id", { +export const users = pgTable('users', { + id: varchar('id', { length: 255 - }).primaryKey() + }) + .primaryKey() .$defaultFn(() => nanoid()), - username: varchar("username", { + username: varchar('username', { length: 255 }).unique(), - hashed_password: varchar("hashed_password", { + hashed_password: varchar('hashed_password', { length: 255 }), - email: varchar("email", { + email: varchar('email', { length: 255 }).unique(), - first_name: varchar("first_name", { + first_name: varchar('first_name', { length: 255 }), - last_name: varchar("last_name", { + last_name: varchar('last_name', { length: 255 }), - verified: boolean("verified").default(false), - receive_email: boolean("receive_email").default(false), - theme: varchar("theme", { + verified: boolean('verified').default(false), + receive_email: boolean('receive_email').default(false), + theme: varchar('theme', { length: 255 - }).default("system"), - created_at: timestamp("created_at").default(sql`(now())`), - updated_at: timestamp("updated_at").default(sql`(now())`) + }).default('system'), + created_at: timestamp('created_at').default(sql`now()`), + updated_at: timestamp('updated_at').default(sql`now()`) }); export const user_relations = relations(users, ({ many }) => ({ - user_roles: many(user_roles) + user_roles: many(user_roles) })); export type Users = InferSelectModel; @@ -48,7 +50,7 @@ export const sessions = pgTable('sessions', { .references(() => users.id), expiresAt: timestamp('expires_at', { withTimezone: true, - mode: "date" + mode: 'date' }).notNull(), ipCountry: varchar('ip_country', { length: 255 @@ -58,243 +60,255 @@ export const sessions = pgTable('sessions', { }) }); -export const roles = pgTable("roles", { - id: varchar("id", { - length: 255 - }).primaryKey() - .$defaultFn(() => nanoid()), - name: varchar("name", { - length: 255 - }).unique() +export const roles = pgTable('roles', { + id: varchar('id', { + length: 255 + }) + .primaryKey() + .$defaultFn(() => nanoid()), + name: varchar('name', { + length: 255 + }).unique() }); -export const user_roles = pgTable("user_roles", { - id: varchar("id", { - length: 255 - }).primaryKey() - .$defaultFn(() => nanoid()), - user_id: varchar("user_id", { - length: 255 - }) - .notNull() - .references(() => users.id, { onDelete: 'cascade' }), - role_id: varchar("role_id", { - length: 255 - }) - .notNull() - .references(() => roles.id, { onDelete: 'cascade' }), - created_at: timestamp("created_at", { +export const user_roles = pgTable('user_roles', { + id: varchar('id', { + length: 255 + }) + .primaryKey() + .$defaultFn(() => nanoid()), + user_id: varchar('user_id', { + length: 255 + }) + .notNull() + .references(() => users.id, { onDelete: 'cascade' }), + role_id: varchar('role_id', { + length: 255 + }) + .notNull() + .references(() => roles.id, { onDelete: 'cascade' }), + created_at: timestamp('created_at', { withTimezone: true, - mode: "date", - precision: 6 - }).default(sql`(now())`), - updated_at: timestamp("updated_at", { + mode: 'date', + precision: 6 + }).default(sql`now()`), + updated_at: timestamp('updated_at', { withTimezone: true, - mode: "date", - precision: 6 - }).default(sql`(now())`) + mode: 'date', + precision: 6 + }).default(sql`now()`) }); export const user_role_relations = relations(user_roles, ({ one }) => ({ role: one(roles, { fields: [user_roles.role_id], references: [roles.id] - }), - user: one(users, { - fields: [user_roles.user_id], - references: [users.id] - }) + }), + user: one(users, { + fields: [user_roles.user_id], + references: [users.id] + }) })); -export const games = pgTable("games", { - id: varchar("id", { - length: 255 - }).primaryKey() - .$defaultFn(() => nanoid()), - name: varchar("name", { - length: 255 - }), - slug: varchar("slug", { - length: 255 - }), - description: text("description"), - year_published: integer("year_published"), - min_players: integer("min_players"), - max_players: integer("max_players"), - playtime: integer("playtime"), - min_playtime: integer("min_playtime"), - max_playtime: integer("max_playtime"), - min_age: integer("min_age"), - image_url: varchar("image_url", { - length: 255 - }), - thumb_url: varchar("thumb_url", { - length: 255 - }), - url: varchar("url", { - length: 255 - }), - external_id: integer("external_id").unique(), - last_sync_at: timestamp("last_sync_at", { - withTimezone: true, - mode: "date", -precision: 6 +export const games = pgTable('games', { + id: varchar('id', { + length: 255 + }) + .primaryKey() + .$defaultFn(() => nanoid()), + name: varchar('name', { + length: 255 }), - created_at: timestamp("created_at", { + slug: varchar('slug', { + length: 255 + }), + description: text('description'), + year_published: integer('year_published'), + min_players: integer('min_players'), + max_players: integer('max_players'), + playtime: integer('playtime'), + min_playtime: integer('min_playtime'), + max_playtime: integer('max_playtime'), + min_age: integer('min_age'), + image_url: varchar('image_url', { + length: 255 + }), + thumb_url: varchar('thumb_url', { + length: 255 + }), + url: varchar('url', { + length: 255 + }), + text_searchable_index: tsvector('text_searchable_index'), + external_id: integer('external_id').unique(), + last_sync_at: timestamp('last_sync_at', { withTimezone: true, - mode: "date", -precision: 6 - }).default(sql`(now())`), - updated_at: timestamp("updated_at", { + mode: 'date', + precision: 6 + }), + created_at: timestamp('created_at', { withTimezone: true, - mode: "date", -precision: 6 - }).default(sql`(now())`) + mode: 'date', + precision: 6 + }).default(sql`now()`), + updated_at: timestamp('updated_at', { + withTimezone: true, + mode: 'date', + precision: 6 + }).default(sql`now()`) +}, (table) => { + return { + text_searchable_idx: index("text_searchable_idx").on(table.text_searchable_index).using(sql`'gin'`) + } }); export type Games = InferSelectModel; export const gameRelations = relations(games, ({ many }) => ({ - categories_to_games: many(categories_to_games), - mechanics_to_games: many(mechanics_to_games), - designers_to_games: many(designers_to_games), - publishers_to_games: many(publishers_to_games), - artists_to_games: many(artists_to_games), -})) - -export const expansions = pgTable("expansions", { - id: varchar("id", { - length: 255 - }).primaryKey() - .$defaultFn(() => nanoid()), - base_game_id: varchar("base_game_id", { - length: 255 - }) - .notNull() - .references(() => games.id, { onDelete: 'cascade' }), - game_id: varchar("game_id", { - length: 255 - }) - .notNull() - .references(() => games.id, { onDelete: 'cascade' }), - created_at: timestamp("created_at", { - withTimezone: true, - mode: "date", -precision: 6 - }).default(sql`(now())`), - updated_at: timestamp("updated_at", { - withTimezone: true, - mode: "date", -precision: 6 - }).default(sql`(now())`) -}) - -export const expansion_relations = relations(expansions, ({ one }) => ({ - baseGame: one(games, { - fields: [expansions.base_game_id], - references: [games.id] - }), - game: one(games, { - fields: [expansions.game_id], - references: [games.id] - }) + categories_to_games: many(categories_to_games), + mechanics_to_games: many(mechanics_to_games), + designers_to_games: many(designers_to_games), + publishers_to_games: many(publishers_to_games), + artists_to_games: many(artists_to_games) })); -export const collections = pgTable("collections", { - id: varchar("id", { - length: 255 - }).primaryKey() - .$defaultFn(() => nanoid()), - user_id: varchar("user_id", { - length: 255 - }) - .notNull() - .references(() => users.id, { onDelete: 'cascade' }), - created_at: timestamp("created_at", { +export const expansions = pgTable('expansions', { + id: varchar('id', { + length: 255 + }) + .primaryKey() + .$defaultFn(() => nanoid()), + base_game_id: varchar('base_game_id', { + length: 255 + }) + .notNull() + .references(() => games.id, { onDelete: 'cascade' }), + game_id: varchar('game_id', { + length: 255 + }) + .notNull() + .references(() => games.id, { onDelete: 'cascade' }), + created_at: timestamp('created_at', { withTimezone: true, - mode: "date", -precision: 6 - }).default(sql`(now())`), - updated_at: timestamp("updated_at", { + mode: 'date', + precision: 6 + }).default(sql`now()`), + updated_at: timestamp('updated_at', { withTimezone: true, - mode: "date", -precision: 6 - }).default(sql`(now())`) + mode: 'date', + precision: 6 + }).default(sql`now()`) +}); + +export const expansion_relations = relations(expansions, ({ one }) => ({ + baseGame: one(games, { + fields: [expansions.base_game_id], + references: [games.id] + }), + game: one(games, { + fields: [expansions.game_id], + references: [games.id] + }) +})); + +export const collections = pgTable('collections', { + id: varchar('id', { + length: 255 + }) + .primaryKey() + .$defaultFn(() => nanoid()), + user_id: varchar('user_id', { + length: 255 + }) + .notNull() + .references(() => users.id, { onDelete: 'cascade' }), + created_at: timestamp('created_at', { + withTimezone: true, + mode: 'date', + precision: 6 + }).default(sql`now()`), + updated_at: timestamp('updated_at', { + withTimezone: true, + mode: 'date', + precision: 6 + }).default(sql`now()`) }); export const collection_relations = relations(collections, ({ one }) => ({ - user: one(users, { - fields: [collections.user_id], - references: [users.id] - }), -})) - -export const collection_items = pgTable("collection_items", { - id: varchar("id", { - length: 255 - }).primaryKey() - .$defaultFn(() => nanoid()), - collection_id: varchar("collection_id", { - length: 255 - }) - .notNull() - .references(() => collections.id, { onDelete: 'cascade' }), - game_id: varchar("game_id", { - length: 255 - }) - .notNull() - .references(() => games.id, { onDelete: 'cascade' }), - created_at: timestamp("created_at", { - withTimezone: true, - mode: "date", -precision: 6 - }).default(sql`(now())`), - updated_at: timestamp("updated_at", { - withTimezone: true, - mode: "date", -precision: 6 - }).default(sql`(now())`) -}); - -export const collection_item_relations = relations(collection_items, ({ one }) =>({ - collection: one(collections, { - fields: [collection_items.collection_id], - references: [collections.id] - }), - game: one(games, { - fields: [collection_items.game_id], - references: [games.id] - }) + user: one(users, { + fields: [collections.user_id], + references: [users.id] + }) })); -export const wishlists = pgTable("wishlists", { - id: varchar("id", { - length: 255 - }).primaryKey() - .$defaultFn(() => nanoid()), - user_id: varchar("user_id", { - length: 255 - }) - .notNull() - .references(() => users.id, { onDelete: 'cascade' }), - created_at: timestamp("created_at", { +export const collection_items = pgTable('collection_items', { + id: varchar('id', { + length: 255 + }) + .primaryKey() + .$defaultFn(() => nanoid()), + collection_id: varchar('collection_id', { + length: 255 + }) + .notNull() + .references(() => collections.id, { onDelete: 'cascade' }), + game_id: varchar('game_id', { + length: 255 + }) + .notNull() + .references(() => games.id, { onDelete: 'cascade' }), + created_at: timestamp('created_at', { withTimezone: true, - mode: "date", -precision: 6 - }).default(sql`(now())`), - updated_at: timestamp("updated_at", { + mode: 'date', + precision: 6 + }).default(sql`now()`), + updated_at: timestamp('updated_at', { withTimezone: true, - mode: "date", -precision: 6 - }).default(sql`(now())`) + mode: 'date', + precision: 6 + }).default(sql`now()`) +}); + +export const collection_item_relations = relations(collection_items, ({ one }) => ({ + collection: one(collections, { + fields: [collection_items.collection_id], + references: [collections.id] + }), + game: one(games, { + fields: [collection_items.game_id], + references: [games.id] + }) +})); + +export const wishlists = pgTable('wishlists', { + id: varchar('id', { + length: 255 + }) + .primaryKey() + .$defaultFn(() => nanoid()), + user_id: varchar('user_id', { + length: 255 + }) + .notNull() + .references(() => users.id, { onDelete: 'cascade' }), + created_at: timestamp('created_at', { + withTimezone: true, + mode: 'date', + precision: 6 + }).default(sql`now()`), + updated_at: timestamp('updated_at', { + withTimezone: true, + mode: 'date', + precision: 6 + }).default(sql`now()`) }); export const wishlists_relations = relations(wishlists, ({ one }) => ({ - user: one(users, { - fields: [wishlists.user_id], - references: [users.id] - }), -})) + user: one(users, { + fields: [wishlists.user_id], + references: [users.id] + }) +})); export const wishlist_items = pgTable('wishlist_items', { id: varchar('id', { @@ -314,161 +328,166 @@ export const wishlist_items = pgTable('wishlist_items', { .references(() => games.id, { onDelete: 'cascade' }), created_at: timestamp('created_at', { withTimezone: true, - mode: "date", -precision: 6 - }).default(sql`(now())`), + mode: 'date', + precision: 6 + }).default(sql`now()`), updated_at: timestamp('updated_at', { withTimezone: true, - mode: "date", -precision: 6 - }).default(sql`(now())`) + mode: 'date', + precision: 6 + }).default(sql`now()`) }); export const wishlist_item_relations = relations(wishlist_items, ({ one }) => ({ - wishlist: one(wishlists, { - fields: [wishlist_items.wishlist_id], - references: [wishlists.id] - }), - game: one(games, { - fields: [wishlist_items.game_id], - references: [games.id] - }) -})) + wishlist: one(wishlists, { + fields: [wishlist_items.wishlist_id], + references: [wishlists.id] + }), + game: one(games, { + fields: [wishlist_items.game_id], + references: [games.id] + }) +})); -export const publishers = pgTable("publishers", { - id: varchar("id", { - length: 255 - }).primaryKey() - .$defaultFn(() => nanoid()), - name: varchar("name", { - length: 255 - }), - slug: varchar("slug", { - length: 255 - }), - external_id: integer("external_id"), - created_at: timestamp("created_at", { +export const publishers = pgTable('publishers', { + id: varchar('id', { + length: 255 + }) + .primaryKey() + .$defaultFn(() => nanoid()), + name: varchar('name', { + length: 255 + }), + slug: varchar('slug', { + length: 255 + }), + external_id: integer('external_id'), + created_at: timestamp('created_at', { withTimezone: true, - mode: "date", -precision: 6 - }).default(sql`(now())`), - updated_at: timestamp("updated_at", { + mode: 'date', + precision: 6 + }).default(sql`now()`), + updated_at: timestamp('updated_at', { withTimezone: true, - mode: "date", -precision: 6 - }).default(sql`(now())`) + mode: 'date', + precision: 6 + }).default(sql`now()`) }); export const publishers_relations = relations(publishers, ({ many }) => ({ - publishers_to_games: many(publishers_to_games) + publishers_to_games: many(publishers_to_games) })); -export const categories = pgTable("categories", { - id: varchar("id", { - length: 255 - }).primaryKey() - .$defaultFn(() => nanoid()), - name: varchar("name", { - length: 255 - }), - slug: varchar("slug", { - length: 255 - }), - external_id: integer("external_id"), - created_at: timestamp("created_at", { +export const categories = pgTable('categories', { + id: varchar('id', { + length: 255 + }) + .primaryKey() + .$defaultFn(() => nanoid()), + name: varchar('name', { + length: 255 + }), + slug: varchar('slug', { + length: 255 + }), + external_id: integer('external_id'), + created_at: timestamp('created_at', { withTimezone: true, - mode: "date", -precision: 6 - }).default(sql`(now())`), - updated_at: timestamp("updated_at", { + mode: 'date', + precision: 6 + }).default(sql`now()`), + updated_at: timestamp('updated_at', { withTimezone: true, - mode: "date", -precision: 6 - }).default(sql`(now())`) + mode: 'date', + precision: 6 + }).default(sql`now()`) }); export const categories_relations = relations(categories, ({ many }) => ({ - categories_to_games: many(categories_to_games) + categories_to_games: many(categories_to_games) })); -export const mechanics = pgTable("mechanics", { - id: varchar("id", { - length: 255 - }).primaryKey() - .$defaultFn(() => nanoid()), - name: varchar("name", { - length: 255 - }), - slug: varchar("slug", { - length: 255 - }), - external_id: integer("external_id"), - created_at: timestamp("created_at", { +export const mechanics = pgTable('mechanics', { + id: varchar('id', { + length: 255 + }) + .primaryKey() + .$defaultFn(() => nanoid()), + name: varchar('name', { + length: 255 + }), + slug: varchar('slug', { + length: 255 + }), + external_id: integer('external_id'), + created_at: timestamp('created_at', { withTimezone: true, - mode: "date", -precision: 6 - }).default(sql`(now())`), - updated_at: timestamp("updated_at", { + mode: 'date', + precision: 6 + }).default(sql`now()`), + updated_at: timestamp('updated_at', { withTimezone: true, - mode: "date", -precision: 6 - }).default(sql`(now())`) + mode: 'date', + precision: 6 + }).default(sql`now()`) }); export const mechanic_relations = relations(mechanics, ({ many }) => ({ - mechanics_to_games: many(mechanics_to_games) -})) + mechanics_to_games: many(mechanics_to_games) +})); -export const designers = pgTable("designers", { - id: varchar("id", { - length: 255 - }).primaryKey() - .$defaultFn(() => nanoid()), - name: varchar("name", { - length: 255 - }), - slug: varchar("slug", { - length: 255 - }), - external_id: integer("external_id"), - created_at: timestamp("created_at", { +export const designers = pgTable('designers', { + id: varchar('id', { + length: 255 + }) + .primaryKey() + .$defaultFn(() => nanoid()), + name: varchar('name', { + length: 255 + }), + slug: varchar('slug', { + length: 255 + }), + external_id: integer('external_id'), + created_at: timestamp('created_at', { withTimezone: true, - mode: "date", -precision: 6 - }).default(sql`(now())`), - updated_at: timestamp("updated_at", { + mode: 'date', + precision: 6 + }).default(sql`now()`), + updated_at: timestamp('updated_at', { withTimezone: true, - mode: "date", -precision: 6 - }).default(sql`(now())`) + mode: 'date', + precision: 6 + }).default(sql`now()`) }); export const designers_relations = relations(designers, ({ many }) => ({ - designers_to_games: many(designers_to_games) + designers_to_games: many(designers_to_games) })); -export const artists = pgTable("artists", { - id: varchar("id", { - length: 255 - }).primaryKey() - .$defaultFn(() => nanoid()), - name: varchar("name", { - length: 255 - }), - slug: varchar("slug", { - length: 255 - }), - external_id: integer("external_id"), - created_at: timestamp("created_at", { +export const artists = pgTable('artists', { + id: varchar('id', { + length: 255 + }) + .primaryKey() + .$defaultFn(() => nanoid()), + name: varchar('name', { + length: 255 + }), + slug: varchar('slug', { + length: 255 + }), + external_id: integer('external_id'), + created_at: timestamp('created_at', { withTimezone: true, - mode: "date", -precision: 6 - }).default(sql`(now())`), - updated_at: timestamp("updated_at", { + mode: 'date', + precision: 6 + }).default(sql`now()`), + updated_at: timestamp('updated_at', { withTimezone: true, - mode: "date", -precision: 6 - }).default(sql`(now())`) + mode: 'date', + precision: 6 + }).default(sql`now()`) }); export const artists_relations = relations(artists, ({ many }) => ({ @@ -481,96 +500,96 @@ export const artists_to_games = pgTable('artists_to_games', { }), game_id: varchar('game_id', { length: 255 - }), + }) }); export const artists_to_games_relations = relations(artists_to_games, ({ one }) => ({ - artist: one(artists, { - fields: [artists_to_games.artist_id], - references: [artists.id] - }), - game: one(games, { - fields: [artists_to_games.game_id], - references: [games.id] - }), + artist: one(artists, { + fields: [artists_to_games.artist_id], + references: [artists.id] + }), + game: one(games, { + fields: [artists_to_games.game_id], + references: [games.id] + }) })); -export const categories_to_games = pgTable("categories_to_games", { - category_id: varchar("category_id", { - length: 255 - }), - game_id: varchar("game_id", { - length: 255 - }), +export const categories_to_games = pgTable('categories_to_games', { + category_id: varchar('category_id', { + length: 255 + }), + game_id: varchar('game_id', { + length: 255 + }) }); export const categories_to_games_relations = relations(categories_to_games, ({ one }) => ({ - category: one(categories, { - fields: [categories_to_games.category_id], - references: [categories.id] - }), - game: one(games, { - fields: [categories_to_games.game_id], - references: [games.id] - }), -})) + category: one(categories, { + fields: [categories_to_games.category_id], + references: [categories.id] + }), + game: one(games, { + fields: [categories_to_games.game_id], + references: [games.id] + }) +})); -export const designers_to_games = pgTable("designers_to_games", { - designer_id: varchar("designer_id", { - length: 255 - }), - game_id: varchar("game_id", { - length: 255 - }), +export const designers_to_games = pgTable('designers_to_games', { + designer_id: varchar('designer_id', { + length: 255 + }), + game_id: varchar('game_id', { + length: 255 + }) }); export const designers_to_games_relations = relations(designers_to_games, ({ one }) => ({ - designer: one(designers, { - fields: [designers_to_games.designer_id], - references: [designers.id] - }), - game: one(games, { - fields: [designers_to_games.game_id], - references: [games.id] - }), -})) + designer: one(designers, { + fields: [designers_to_games.designer_id], + references: [designers.id] + }), + game: one(games, { + fields: [designers_to_games.game_id], + references: [games.id] + }) +})); -export const mechanics_to_games = pgTable("mechanics_to_games", { - mechanic_id: varchar("mechanic_id", { - length: 255 - }), - game_id: varchar("game_id", { - length: 255 - }), +export const mechanics_to_games = pgTable('mechanics_to_games', { + mechanic_id: varchar('mechanic_id', { + length: 255 + }), + game_id: varchar('game_id', { + length: 255 + }) }); export const mechanics_to_games_relations = relations(mechanics_to_games, ({ one }) => ({ - mechanic: one(mechanics, { - fields: [mechanics_to_games.mechanic_id], - references: [mechanics.id] - }), - game: one(games, { - fields: [mechanics_to_games.game_id], - references: [games.id] - }), + mechanic: one(mechanics, { + fields: [mechanics_to_games.mechanic_id], + references: [mechanics.id] + }), + game: one(games, { + fields: [mechanics_to_games.game_id], + references: [games.id] + }) })); -export const publishers_to_games = pgTable("publishers_to_games", { - publisher_id: varchar("publisher_id", { - length: 255 - }), - game_id: varchar("game_id", { - length: 255 - }), +export const publishers_to_games = pgTable('publishers_to_games', { + publisher_id: varchar('publisher_id', { + length: 255 + }), + game_id: varchar('game_id', { + length: 255 + }) }); export const publishers_to_games_relations = relations(publishers_to_games, ({ one }) => ({ - publisher: one(publishers, { - fields: [publishers_to_games.publisher_id], - references: [publishers.id] - }), - game: one(games, { - fields: [publishers_to_games.game_id], - references: [games.id] - }), + publisher: one(publishers, { + fields: [publishers_to_games.publisher_id], + references: [publishers.id] + }), + game: one(games, { + fields: [publishers_to_games.game_id], + references: [games.id] + }) })); diff --git a/src/tsVector.ts b/src/tsVector.ts new file mode 100644 index 0000000..cf14715 --- /dev/null +++ b/src/tsVector.ts @@ -0,0 +1,26 @@ +import { customType } from 'drizzle-orm/pg-core'; + +function genExpWithWeights(input: string[]) { + const columnExpressions = input.map((column, index) => { + const weight = String.fromCharCode(index + 65); + return `setweight(to_tsvector('english', coalesce(${column}, '')), '${weight}')`; + }); + + return `tsvector GENERATED ALWAYS AS (${columnExpressions.join(' || ')}) STORED`; +} + +export const tsvector = customType<{ + data: string; + config: { sources: string[]; weighted: boolean }; +}>({ + dataType(config) { + if (config) { + const sources = config.sources.join(" || ' ' || "); + return config.weighted + ? genExpWithWeights(config.sources) + : `tsvector generated always as (to_tsvector('english', ${sources})) stored`; + } else { + return `tsvector`; + } + } +}); From b7d7f298bc150ddcae6ae14a09d862027f976041 Mon Sep 17 00:00:00 2001 From: Bradley Shellnut Date: Fri, 9 Feb 2024 17:49:39 -0800 Subject: [PATCH 13/34] Starting transactions for games. --- src/lib/utils/dbUtils.ts | 183 +++++++++++++++++++++++---------------- 1 file changed, 109 insertions(+), 74 deletions(-) diff --git a/src/lib/utils/dbUtils.ts b/src/lib/utils/dbUtils.ts index baf9fb6..629f592 100644 --- a/src/lib/utils/dbUtils.ts +++ b/src/lib/utils/dbUtils.ts @@ -365,80 +365,115 @@ export async function createOrUpdateGame(locals: App.Locals, game: Game) { console.log('categoryIds', categoryIds); console.log('mechanicIds', mechanicIds); await db.transaction(async (transaction) => { - const + const dbGame = await transaction.insert(games).values({ + name: game.name, + slug: kebabCase(game.name), + description: game.description, + external_id: game.external_id, + url: externalUrl, + thumb_url: game.thumb_url, + image_url: game.image_url, + min_age: game.min_age || 0, + min_players: game.min_players || 0, + max_players: game.max_players || 0, + min_playtime: game.min_playtime || 0, + max_playtime: game.max_playtime || 0, + year_published: game.year_published || 0, + last_sync_at: new Date(), + }).onConflictDoUpdate({ + target: games.id, set: { + name: game.name, + slug: kebabCase(game.name), + description: game.description, + external_id: game.external_id, + url: externalUrl, + thumb_url: game.thumb_url, + image_url: game.image_url, + min_age: game.min_age || 0, + min_players: game.min_players || 0, + max_players: game.max_players || 0, + min_playtime: game.min_playtime || 0, + max_playtime: game.max_playtime || 0, + year_published: game.year_published || 0, + last_sync_at: new Date(), + } + }).returning(); + + // TODO: Connect to everything else + // await transaction.insert() }); - await db.insert(games).values({ - include: { - mechanics: true, - publishers: true, - designers: true, - artists: true, - expansions: true - }, - where: { - external_id: game.external_id - }, - create: { - name: game.name, - slug: kebabCase(game.name), - description: game.description, - external_id: game.external_id, - url: externalUrl, - thumb_url: game.thumb_url, - image_url: game.image_url, - min_age: game.min_age || 0, - min_players: game.min_players || 0, - max_players: game.max_players || 0, - min_playtime: game.min_playtime || 0, - max_playtime: game.max_playtime || 0, - year_published: game.year_published || 0, - last_sync_at: new Date(), - categories: { - connect: categoryIds - }, - mechanics: { - connect: mechanicIds - }, - publishers: { - connect: publisherIds - }, - designers: { - connect: designerIds - }, - artists: { - connect: artistIds - } - }, - update: { - name: game.name, - slug: kebabCase(game.name), - description: game.description, - external_id: game.external_id, - url: externalUrl, - thumb_url: game.thumb_url, - image_url: game.image_url, - min_age: game.min_age || 0, - min_players: game.min_players || 0, - max_players: game.max_players || 0, - min_playtime: game.min_playtime || 0, - max_playtime: game.max_playtime || 0, - year_published: game.year_published || 0, - last_sync_at: new Date(), - categories: { - connect: categoryIds - }, - mechanics: { - connect: mechanicIds - }, - publishers: { - connect: publisherIds - }, - designers: { - connect: designerIds - }, - artists: { - connect: artistIds - } - } + // await db.insert(games).values({ + // include: { + // mechanics: true, + // publishers: true, + // designers: true, + // artists: true, + // expansions: true + // }, + // where: { + // external_id: game.external_id + // }, + // create: { + // name: game.name, + // slug: kebabCase(game.name), + // description: game.description, + // external_id: game.external_id, + // url: externalUrl, + // thumb_url: game.thumb_url, + // image_url: game.image_url, + // min_age: game.min_age || 0, + // min_players: game.min_players || 0, + // max_players: game.max_players || 0, + // min_playtime: game.min_playtime || 0, + // max_playtime: game.max_playtime || 0, + // year_published: game.year_published || 0, + // last_sync_at: new Date(), + // categories: { + // connect: categoryIds + // }, + // mechanics: { + // connect: mechanicIds + // }, + // publishers: { + // connect: publisherIds + // }, + // designers: { + // connect: designerIds + // }, + // artists: { + // connect: artistIds + // } + // }, + // update: { + // name: game.name, + // slug: kebabCase(game.name), + // description: game.description, + // external_id: game.external_id, + // url: externalUrl, + // thumb_url: game.thumb_url, + // image_url: game.image_url, + // min_age: game.min_age || 0, + // min_players: game.min_players || 0, + // max_players: game.max_players || 0, + // min_playtime: game.min_playtime || 0, + // max_playtime: game.max_playtime || 0, + // year_published: game.year_published || 0, + // last_sync_at: new Date(), + // categories: { + // connect: categoryIds + // }, + // mechanics: { + // connect: mechanicIds + // }, + // publishers: { + // connect: publisherIds + // }, + // designers: { + // connect: designerIds + // }, + // artists: { + // connect: artistIds + // } + // } }); } From ec5f1ed93b93c3a71166452e380447ca5c947f4c Mon Sep 17 00:00:00 2001 From: Bradley Shellnut Date: Wed, 14 Feb 2024 09:42:29 -0800 Subject: [PATCH 14/34] Creating external ids table and join tables. --- drizzle/0004_fancy_umar.sql | 30 + drizzle/0005_uneven_lifeguard.sql | 16 + drizzle/0006_light_corsair.sql | 2 + drizzle/meta/0004_snapshot.json | 1138 +++++++++++++++++++++++++++++ drizzle/meta/0005_snapshot.json | 1138 +++++++++++++++++++++++++++++ drizzle/meta/0006_snapshot.json | 1138 +++++++++++++++++++++++++++++ drizzle/meta/_journal.json | 21 + package.json | 12 +- pnpm-lock.yaml | 62 +- src/schema.ts | 37 +- 10 files changed, 3558 insertions(+), 36 deletions(-) create mode 100644 drizzle/0004_fancy_umar.sql create mode 100644 drizzle/0005_uneven_lifeguard.sql create mode 100644 drizzle/0006_light_corsair.sql create mode 100644 drizzle/meta/0004_snapshot.json create mode 100644 drizzle/meta/0005_snapshot.json create mode 100644 drizzle/meta/0006_snapshot.json diff --git a/drizzle/0004_fancy_umar.sql b/drizzle/0004_fancy_umar.sql new file mode 100644 index 0000000..0881bb3 --- /dev/null +++ b/drizzle/0004_fancy_umar.sql @@ -0,0 +1,30 @@ +DO $$ BEGIN + CREATE TYPE "external_id_type" AS ENUM('game', 'category', 'mechanic', 'publisher', 'designer', 'artist'); +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "external_ids" ( + "id" varchar(255) PRIMARY KEY NOT NULL, + "type" varchar(255), + "external_id" varchar(255) +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "game_external_ids" ( + "game_id" varchar(255) NOT NULL, + "external_id" varchar(255) NOT NULL +); +--> statement-breakpoint +ALTER TABLE "games" DROP CONSTRAINT "games_external_id_unique";--> statement-breakpoint +ALTER TABLE "games" DROP COLUMN IF EXISTS "external_id";--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "game_external_ids" ADD CONSTRAINT "game_external_ids_game_id_games_id_fk" FOREIGN KEY ("game_id") REFERENCES "games"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "game_external_ids" ADD CONSTRAINT "game_external_ids_external_id_external_ids_id_fk" FOREIGN KEY ("external_id") REFERENCES "external_ids"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; diff --git a/drizzle/0005_uneven_lifeguard.sql b/drizzle/0005_uneven_lifeguard.sql new file mode 100644 index 0000000..10c6129 --- /dev/null +++ b/drizzle/0005_uneven_lifeguard.sql @@ -0,0 +1,16 @@ +ALTER TABLE "game_external_ids" RENAME TO "games_to_external_ids";--> statement-breakpoint +ALTER TABLE "games_to_external_ids" DROP CONSTRAINT "game_external_ids_game_id_games_id_fk"; +--> statement-breakpoint +ALTER TABLE "games_to_external_ids" DROP CONSTRAINT "game_external_ids_external_id_external_ids_id_fk"; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "games_to_external_ids" ADD CONSTRAINT "games_to_external_ids_game_id_games_id_fk" FOREIGN KEY ("game_id") REFERENCES "games"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "games_to_external_ids" ADD CONSTRAINT "games_to_external_ids_external_id_external_ids_id_fk" FOREIGN KEY ("external_id") REFERENCES "external_ids"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; diff --git a/drizzle/0006_light_corsair.sql b/drizzle/0006_light_corsair.sql new file mode 100644 index 0000000..ee9f17e --- /dev/null +++ b/drizzle/0006_light_corsair.sql @@ -0,0 +1,2 @@ +ALTER TABLE "external_ids" ALTER COLUMN "type" SET NOT NULL;--> statement-breakpoint +ALTER TABLE "external_ids" ALTER COLUMN "external_id" SET NOT NULL; \ No newline at end of file diff --git a/drizzle/meta/0004_snapshot.json b/drizzle/meta/0004_snapshot.json new file mode 100644 index 0000000..bc86d53 --- /dev/null +++ b/drizzle/meta/0004_snapshot.json @@ -0,0 +1,1138 @@ +{ + "id": "40c111ed-60fd-4ca8-88df-7617bff20155", + "prevId": "425a2ccd-b74a-4e51-8c80-1a6387cc6c5d", + "version": "5", + "dialect": "pg", + "tables": { + "artists": { + "name": "artists", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "artists_to_games": { + "name": "artists_to_games", + "schema": "", + "columns": { + "artist_id": { + "name": "artist_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "categories": { + "name": "categories", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "categories_to_games": { + "name": "categories_to_games", + "schema": "", + "columns": { + "category_id": { + "name": "category_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "collection_items": { + "name": "collection_items", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "collection_id": { + "name": "collection_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "collection_items_collection_id_collections_id_fk": { + "name": "collection_items_collection_id_collections_id_fk", + "tableFrom": "collection_items", + "tableTo": "collections", + "columnsFrom": [ + "collection_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "collection_items_game_id_games_id_fk": { + "name": "collection_items_game_id_games_id_fk", + "tableFrom": "collection_items", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "collections": { + "name": "collections", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "collections_user_id_users_id_fk": { + "name": "collections_user_id_users_id_fk", + "tableFrom": "collections", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "designers": { + "name": "designers", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "designers_to_games": { + "name": "designers_to_games", + "schema": "", + "columns": { + "designer_id": { + "name": "designer_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "expansions": { + "name": "expansions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "base_game_id": { + "name": "base_game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "expansions_base_game_id_games_id_fk": { + "name": "expansions_base_game_id_games_id_fk", + "tableFrom": "expansions", + "tableTo": "games", + "columnsFrom": [ + "base_game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "expansions_game_id_games_id_fk": { + "name": "expansions_game_id_games_id_fk", + "tableFrom": "expansions", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "external_ids": { + "name": "external_ids", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "game_external_ids": { + "name": "game_external_ids", + "schema": "", + "columns": { + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "game_external_ids_game_id_games_id_fk": { + "name": "game_external_ids_game_id_games_id_fk", + "tableFrom": "game_external_ids", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "game_external_ids_external_id_external_ids_id_fk": { + "name": "game_external_ids_external_id_external_ids_id_fk", + "tableFrom": "game_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "games": { + "name": "games", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "year_published": { + "name": "year_published", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_players": { + "name": "min_players", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "max_players": { + "name": "max_players", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "playtime": { + "name": "playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_playtime": { + "name": "min_playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "max_playtime": { + "name": "max_playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_age": { + "name": "min_age", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "image_url": { + "name": "image_url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "thumb_url": { + "name": "thumb_url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "url": { + "name": "url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "text_searchable_index": { + "name": "text_searchable_index", + "type": "tsvector", + "primaryKey": false, + "notNull": false + }, + "last_sync_at": { + "name": "last_sync_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": { + "text_searchable_idx": { + "name": "text_searchable_idx", + "columns": [ + "text_searchable_index" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "mechanics": { + "name": "mechanics", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "mechanics_to_games": { + "name": "mechanics_to_games", + "schema": "", + "columns": { + "mechanic_id": { + "name": "mechanic_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "publishers": { + "name": "publishers", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "publishers_to_games": { + "name": "publishers_to_games", + "schema": "", + "columns": { + "publisher_id": { + "name": "publisher_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "roles": { + "name": "roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "roles_name_unique": { + "name": "roles_name_unique", + "nullsNotDistinct": false, + "columns": [ + "name" + ] + } + } + }, + "sessions": { + "name": "sessions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "ip_country": { + "name": "ip_country", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "ip_address": { + "name": "ip_address", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "sessions_user_id_users_id_fk": { + "name": "sessions_user_id_users_id_fk", + "tableFrom": "sessions", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "user_roles": { + "name": "user_roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "role_id": { + "name": "role_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "user_roles_user_id_users_id_fk": { + "name": "user_roles_user_id_users_id_fk", + "tableFrom": "user_roles", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_roles_role_id_roles_id_fk": { + "name": "user_roles_role_id_roles_id_fk", + "tableFrom": "user_roles", + "tableTo": "roles", + "columnsFrom": [ + "role_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "username": { + "name": "username", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "hashed_password": { + "name": "hashed_password", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "first_name": { + "name": "first_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "last_name": { + "name": "last_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "verified": { + "name": "verified", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "receive_email": { + "name": "receive_email", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "theme": { + "name": "theme", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "default": "'system'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_username_unique": { + "name": "users_username_unique", + "nullsNotDistinct": false, + "columns": [ + "username" + ] + }, + "users_email_unique": { + "name": "users_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + } + }, + "wishlist_items": { + "name": "wishlist_items", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "wishlist_id": { + "name": "wishlist_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "wishlist_items_wishlist_id_wishlists_id_fk": { + "name": "wishlist_items_wishlist_id_wishlists_id_fk", + "tableFrom": "wishlist_items", + "tableTo": "wishlists", + "columnsFrom": [ + "wishlist_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "wishlist_items_game_id_games_id_fk": { + "name": "wishlist_items_game_id_games_id_fk", + "tableFrom": "wishlist_items", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "wishlists": { + "name": "wishlists", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "wishlists_user_id_users_id_fk": { + "name": "wishlists_user_id_users_id_fk", + "tableFrom": "wishlists", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + } + }, + "enums": { + "external_id_type": { + "name": "external_id_type", + "values": { + "game": "game", + "category": "category", + "mechanic": "mechanic", + "publisher": "publisher", + "designer": "designer", + "artist": "artist" + } + } + }, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/0005_snapshot.json b/drizzle/meta/0005_snapshot.json new file mode 100644 index 0000000..af293b8 --- /dev/null +++ b/drizzle/meta/0005_snapshot.json @@ -0,0 +1,1138 @@ +{ + "id": "a7cae337-1c11-4c7f-b15f-45ceb42c7256", + "prevId": "40c111ed-60fd-4ca8-88df-7617bff20155", + "version": "5", + "dialect": "pg", + "tables": { + "artists": { + "name": "artists", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "artists_to_games": { + "name": "artists_to_games", + "schema": "", + "columns": { + "artist_id": { + "name": "artist_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "categories": { + "name": "categories", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "categories_to_games": { + "name": "categories_to_games", + "schema": "", + "columns": { + "category_id": { + "name": "category_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "collection_items": { + "name": "collection_items", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "collection_id": { + "name": "collection_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "collection_items_collection_id_collections_id_fk": { + "name": "collection_items_collection_id_collections_id_fk", + "tableFrom": "collection_items", + "tableTo": "collections", + "columnsFrom": [ + "collection_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "collection_items_game_id_games_id_fk": { + "name": "collection_items_game_id_games_id_fk", + "tableFrom": "collection_items", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "collections": { + "name": "collections", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "collections_user_id_users_id_fk": { + "name": "collections_user_id_users_id_fk", + "tableFrom": "collections", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "designers": { + "name": "designers", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "designers_to_games": { + "name": "designers_to_games", + "schema": "", + "columns": { + "designer_id": { + "name": "designer_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "expansions": { + "name": "expansions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "base_game_id": { + "name": "base_game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "expansions_base_game_id_games_id_fk": { + "name": "expansions_base_game_id_games_id_fk", + "tableFrom": "expansions", + "tableTo": "games", + "columnsFrom": [ + "base_game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "expansions_game_id_games_id_fk": { + "name": "expansions_game_id_games_id_fk", + "tableFrom": "expansions", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "external_ids": { + "name": "external_ids", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "games": { + "name": "games", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "year_published": { + "name": "year_published", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_players": { + "name": "min_players", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "max_players": { + "name": "max_players", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "playtime": { + "name": "playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_playtime": { + "name": "min_playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "max_playtime": { + "name": "max_playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_age": { + "name": "min_age", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "image_url": { + "name": "image_url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "thumb_url": { + "name": "thumb_url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "url": { + "name": "url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "text_searchable_index": { + "name": "text_searchable_index", + "type": "tsvector", + "primaryKey": false, + "notNull": false + }, + "last_sync_at": { + "name": "last_sync_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": { + "text_searchable_idx": { + "name": "text_searchable_idx", + "columns": [ + "text_searchable_index" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "games_to_external_ids": { + "name": "games_to_external_ids", + "schema": "", + "columns": { + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "games_to_external_ids_game_id_games_id_fk": { + "name": "games_to_external_ids_game_id_games_id_fk", + "tableFrom": "games_to_external_ids", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "games_to_external_ids_external_id_external_ids_id_fk": { + "name": "games_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "games_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "mechanics": { + "name": "mechanics", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "mechanics_to_games": { + "name": "mechanics_to_games", + "schema": "", + "columns": { + "mechanic_id": { + "name": "mechanic_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "publishers": { + "name": "publishers", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "publishers_to_games": { + "name": "publishers_to_games", + "schema": "", + "columns": { + "publisher_id": { + "name": "publisher_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "roles": { + "name": "roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "roles_name_unique": { + "name": "roles_name_unique", + "nullsNotDistinct": false, + "columns": [ + "name" + ] + } + } + }, + "sessions": { + "name": "sessions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "ip_country": { + "name": "ip_country", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "ip_address": { + "name": "ip_address", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "sessions_user_id_users_id_fk": { + "name": "sessions_user_id_users_id_fk", + "tableFrom": "sessions", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "user_roles": { + "name": "user_roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "role_id": { + "name": "role_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "user_roles_user_id_users_id_fk": { + "name": "user_roles_user_id_users_id_fk", + "tableFrom": "user_roles", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_roles_role_id_roles_id_fk": { + "name": "user_roles_role_id_roles_id_fk", + "tableFrom": "user_roles", + "tableTo": "roles", + "columnsFrom": [ + "role_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "username": { + "name": "username", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "hashed_password": { + "name": "hashed_password", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "first_name": { + "name": "first_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "last_name": { + "name": "last_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "verified": { + "name": "verified", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "receive_email": { + "name": "receive_email", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "theme": { + "name": "theme", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "default": "'system'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_username_unique": { + "name": "users_username_unique", + "nullsNotDistinct": false, + "columns": [ + "username" + ] + }, + "users_email_unique": { + "name": "users_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + } + }, + "wishlist_items": { + "name": "wishlist_items", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "wishlist_id": { + "name": "wishlist_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "wishlist_items_wishlist_id_wishlists_id_fk": { + "name": "wishlist_items_wishlist_id_wishlists_id_fk", + "tableFrom": "wishlist_items", + "tableTo": "wishlists", + "columnsFrom": [ + "wishlist_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "wishlist_items_game_id_games_id_fk": { + "name": "wishlist_items_game_id_games_id_fk", + "tableFrom": "wishlist_items", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "wishlists": { + "name": "wishlists", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "wishlists_user_id_users_id_fk": { + "name": "wishlists_user_id_users_id_fk", + "tableFrom": "wishlists", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + } + }, + "enums": { + "external_id_type": { + "name": "external_id_type", + "values": { + "game": "game", + "category": "category", + "mechanic": "mechanic", + "publisher": "publisher", + "designer": "designer", + "artist": "artist" + } + } + }, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/0006_snapshot.json b/drizzle/meta/0006_snapshot.json new file mode 100644 index 0000000..bd720da --- /dev/null +++ b/drizzle/meta/0006_snapshot.json @@ -0,0 +1,1138 @@ +{ + "id": "713ce980-a770-4f82-8414-a7bd9923262e", + "prevId": "a7cae337-1c11-4c7f-b15f-45ceb42c7256", + "version": "5", + "dialect": "pg", + "tables": { + "artists": { + "name": "artists", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "artists_to_games": { + "name": "artists_to_games", + "schema": "", + "columns": { + "artist_id": { + "name": "artist_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "categories": { + "name": "categories", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "categories_to_games": { + "name": "categories_to_games", + "schema": "", + "columns": { + "category_id": { + "name": "category_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "collection_items": { + "name": "collection_items", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "collection_id": { + "name": "collection_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "collection_items_collection_id_collections_id_fk": { + "name": "collection_items_collection_id_collections_id_fk", + "tableFrom": "collection_items", + "tableTo": "collections", + "columnsFrom": [ + "collection_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "collection_items_game_id_games_id_fk": { + "name": "collection_items_game_id_games_id_fk", + "tableFrom": "collection_items", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "collections": { + "name": "collections", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "collections_user_id_users_id_fk": { + "name": "collections_user_id_users_id_fk", + "tableFrom": "collections", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "designers": { + "name": "designers", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "designers_to_games": { + "name": "designers_to_games", + "schema": "", + "columns": { + "designer_id": { + "name": "designer_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "expansions": { + "name": "expansions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "base_game_id": { + "name": "base_game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "expansions_base_game_id_games_id_fk": { + "name": "expansions_base_game_id_games_id_fk", + "tableFrom": "expansions", + "tableTo": "games", + "columnsFrom": [ + "base_game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "expansions_game_id_games_id_fk": { + "name": "expansions_game_id_games_id_fk", + "tableFrom": "expansions", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "external_ids": { + "name": "external_ids", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "games": { + "name": "games", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "year_published": { + "name": "year_published", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_players": { + "name": "min_players", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "max_players": { + "name": "max_players", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "playtime": { + "name": "playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_playtime": { + "name": "min_playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "max_playtime": { + "name": "max_playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_age": { + "name": "min_age", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "image_url": { + "name": "image_url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "thumb_url": { + "name": "thumb_url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "url": { + "name": "url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "text_searchable_index": { + "name": "text_searchable_index", + "type": "tsvector", + "primaryKey": false, + "notNull": false + }, + "last_sync_at": { + "name": "last_sync_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": { + "text_searchable_idx": { + "name": "text_searchable_idx", + "columns": [ + "text_searchable_index" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "games_to_external_ids": { + "name": "games_to_external_ids", + "schema": "", + "columns": { + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "games_to_external_ids_game_id_games_id_fk": { + "name": "games_to_external_ids_game_id_games_id_fk", + "tableFrom": "games_to_external_ids", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "games_to_external_ids_external_id_external_ids_id_fk": { + "name": "games_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "games_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "mechanics": { + "name": "mechanics", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "mechanics_to_games": { + "name": "mechanics_to_games", + "schema": "", + "columns": { + "mechanic_id": { + "name": "mechanic_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "publishers": { + "name": "publishers", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "publishers_to_games": { + "name": "publishers_to_games", + "schema": "", + "columns": { + "publisher_id": { + "name": "publisher_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "roles": { + "name": "roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "roles_name_unique": { + "name": "roles_name_unique", + "nullsNotDistinct": false, + "columns": [ + "name" + ] + } + } + }, + "sessions": { + "name": "sessions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "ip_country": { + "name": "ip_country", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "ip_address": { + "name": "ip_address", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "sessions_user_id_users_id_fk": { + "name": "sessions_user_id_users_id_fk", + "tableFrom": "sessions", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "user_roles": { + "name": "user_roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "role_id": { + "name": "role_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "user_roles_user_id_users_id_fk": { + "name": "user_roles_user_id_users_id_fk", + "tableFrom": "user_roles", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_roles_role_id_roles_id_fk": { + "name": "user_roles_role_id_roles_id_fk", + "tableFrom": "user_roles", + "tableTo": "roles", + "columnsFrom": [ + "role_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "username": { + "name": "username", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "hashed_password": { + "name": "hashed_password", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "first_name": { + "name": "first_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "last_name": { + "name": "last_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "verified": { + "name": "verified", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "receive_email": { + "name": "receive_email", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "theme": { + "name": "theme", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "default": "'system'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_username_unique": { + "name": "users_username_unique", + "nullsNotDistinct": false, + "columns": [ + "username" + ] + }, + "users_email_unique": { + "name": "users_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + } + }, + "wishlist_items": { + "name": "wishlist_items", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "wishlist_id": { + "name": "wishlist_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "wishlist_items_wishlist_id_wishlists_id_fk": { + "name": "wishlist_items_wishlist_id_wishlists_id_fk", + "tableFrom": "wishlist_items", + "tableTo": "wishlists", + "columnsFrom": [ + "wishlist_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "wishlist_items_game_id_games_id_fk": { + "name": "wishlist_items_game_id_games_id_fk", + "tableFrom": "wishlist_items", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "wishlists": { + "name": "wishlists", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "wishlists_user_id_users_id_fk": { + "name": "wishlists_user_id_users_id_fk", + "tableFrom": "wishlists", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + } + }, + "enums": { + "external_id_type": { + "name": "external_id_type", + "values": { + "game": "game", + "category": "category", + "mechanic": "mechanic", + "publisher": "publisher", + "designer": "designer", + "artist": "artist" + } + } + }, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json index 24e784f..6ce5715 100644 --- a/drizzle/meta/_journal.json +++ b/drizzle/meta/_journal.json @@ -29,6 +29,27 @@ "when": 1707526808124, "tag": "0003_thick_tinkerer", "breakpoints": true + }, + { + "idx": 4, + "version": "5", + "when": 1707932397672, + "tag": "0004_fancy_umar", + "breakpoints": true + }, + { + "idx": 5, + "version": "5", + "when": 1707932466413, + "tag": "0005_uneven_lifeguard", + "breakpoints": true + }, + { + "idx": 6, + "version": "5", + "when": 1707932522909, + "tag": "0006_light_corsair", + "breakpoints": true } ] } \ No newline at end of file diff --git a/package.json b/package.json index 354256d..6d168d8 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", "autoprefixer": "^10.4.17", - "dotenv": "^16.4.1", + "dotenv": "^16.4.4", "drizzle-kit": "^0.20.14", "eslint": "^8.56.0", "eslint-config-prettier": "^9.1.0", @@ -50,7 +50,7 @@ "postcss-load-config": "^5.0.3", "postcss-preset-env": "^9.3.0", "prettier": "^3.2.5", - "prettier-plugin-svelte": "^3.1.2", + "prettier-plugin-svelte": "^3.2.0", "prisma": "^5.9.1", "sass": "^1.70.0", "satori": "^0.10.13", @@ -65,7 +65,7 @@ "tailwindcss": "^3.4.1", "ts-node": "^10.9.2", "tslib": "^2.6.1", - "tsx": "^4.7.0", + "tsx": "^4.7.1", "typescript": "^5.3.3", "vite": "^5.1.1", "vitest": "^1.2.2", @@ -91,14 +91,14 @@ "@sveltejs/adapter-vercel": "^5.1.0", "@types/feather-icons": "^4.29.4", "@vercel/og": "^0.5.20", - "bits-ui": "^0.17.0", + "bits-ui": "^0.18.1", "boardgamegeekclient": "^1.9.1", "class-variance-authority": "^0.7.0", "clsx": "^2.1.0", "cookie": "^0.6.0", "drizzle-orm": "^0.29.3", "feather-icons": "^4.29.1", - "formsnap": "^0.4.3", + "formsnap": "^0.4.4", "html-entities": "^2.4.0", "iconify-icon": "^2.0.0", "just-kebab-case": "^4.2.0", @@ -108,7 +108,7 @@ "mysql2": "^3.9.1", "nanoid": "^5.0.5", "open-props": "^1.6.18", - "oslo": "^1.1.0", + "oslo": "^1.1.1", "pg": "^8.11.3", "postgres": "^3.4.3", "radix-svelte": "^0.9.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5c2c3a8..2885867 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -48,8 +48,8 @@ dependencies: specifier: ^0.5.20 version: 0.5.20 bits-ui: - specifier: ^0.17.0 - version: 0.17.0(svelte@4.2.10) + specifier: ^0.18.1 + version: 0.18.1(svelte@4.2.10) boardgamegeekclient: specifier: ^1.9.1 version: 1.9.1 @@ -69,8 +69,8 @@ dependencies: specifier: ^4.29.1 version: 4.29.1 formsnap: - specifier: ^0.4.3 - version: 0.4.3(svelte@4.2.10)(sveltekit-superforms@1.13.4)(zod@3.22.4) + specifier: ^0.4.4 + version: 0.4.4(svelte@4.2.10)(sveltekit-superforms@1.13.4)(zod@3.22.4) html-entities: specifier: ^2.4.0 version: 2.4.0 @@ -99,8 +99,8 @@ dependencies: specifier: ^1.6.18 version: 1.6.18 oslo: - specifier: ^1.1.0 - version: 1.1.0 + specifier: ^1.1.1 + version: 1.1.1 pg: specifier: ^8.11.3 version: 8.11.3 @@ -170,8 +170,8 @@ devDependencies: specifier: ^10.4.17 version: 10.4.17(postcss@8.4.35) dotenv: - specifier: ^16.4.1 - version: 16.4.1 + specifier: ^16.4.4 + version: 16.4.4 drizzle-kit: specifier: ^0.20.14 version: 0.20.14 @@ -206,8 +206,8 @@ devDependencies: specifier: ^3.2.5 version: 3.2.5 prettier-plugin-svelte: - specifier: ^3.1.2 - version: 3.1.2(prettier@3.2.5)(svelte@4.2.10) + specifier: ^3.2.0 + version: 3.2.0(prettier@3.2.5)(svelte@4.2.10) prisma: specifier: ^5.9.1 version: 5.9.1 @@ -251,8 +251,8 @@ devDependencies: specifier: ^2.6.1 version: 2.6.2 tsx: - specifier: ^4.7.0 - version: 4.7.0 + specifier: ^4.7.1 + version: 4.7.1 typescript: specifier: ^5.3.3 version: 5.3.3 @@ -1393,6 +1393,14 @@ packages: dependencies: '@floating-ui/core': 1.6.0 '@floating-ui/utils': 0.2.1 + dev: true + + /@floating-ui/dom@1.6.3: + resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==} + dependencies: + '@floating-ui/core': 1.6.0 + '@floating-ui/utils': 0.2.1 + dev: false /@floating-ui/utils@0.1.6: resolution: {integrity: sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==} @@ -1746,7 +1754,7 @@ packages: svelte: '>=3 <5' dependencies: '@floating-ui/core': 1.6.0 - '@floating-ui/dom': 1.6.1 + '@floating-ui/dom': 1.6.3 '@internationalized/date': 3.5.1 dequal: 2.0.3 focus-trap: 7.5.4 @@ -3437,10 +3445,10 @@ packages: hasBin: true dependencies: '@actions/core': 1.10.1 - dotenv: 16.4.1 + dotenv: 16.4.4 front-matter: 4.0.2 nanoid: 4.0.2 - oslo: 1.1.0 + oslo: 1.1.1 dev: false /autoprefixer@10.4.17(postcss@8.4.35): @@ -3486,8 +3494,8 @@ packages: file-uri-to-path: 1.0.0 dev: false - /bits-ui@0.17.0(svelte@4.2.10): - resolution: {integrity: sha512-K73jjco1qPmvGXMQtTkZG6K36UmNrPR21u+C1jzoRWmF3NnUfDP4hPJnAci0LosUycfvOxtaHB1M4awvLvQXyQ==} + /bits-ui@0.18.1(svelte@4.2.10): + resolution: {integrity: sha512-6junivBQ3EIHeF9j8wDa5pgzegtOwaI61ny4X8F7h2SIJi4RJWwZknkT7O5qPLeGoIYNeYV7N6EOBrr1w9/Mxg==} peerDependencies: svelte: ^4.0.0 dependencies: @@ -3948,8 +3956,8 @@ packages: esutils: 2.0.3 dev: true - /dotenv@16.4.1: - resolution: {integrity: sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==} + /dotenv@16.4.4: + resolution: {integrity: sha512-XvPXc8XAQThSjAbY6cQ/9PcBXmFoWuw1sQ3b8HqUCR6ziGXjkTi//kB9SWa2UwqlgdAIuRqAa/9hVljzPehbYg==} engines: {node: '>=12'} /dreamopt@0.8.0: @@ -4507,8 +4515,8 @@ packages: is-callable: 1.2.7 dev: false - /formsnap@0.4.3(svelte@4.2.10)(sveltekit-superforms@1.13.4)(zod@3.22.4): - resolution: {integrity: sha512-PWVq78XVUHhAU1tcVGKeGamk6B4Opkk1uVNRW2YofiQpnA5Bry1c3TQjB9cVDw5u4oAwmDvIoAzVHlrAIgc+tw==} + /formsnap@0.4.4(svelte@4.2.10)(sveltekit-superforms@1.13.4)(zod@3.22.4): + resolution: {integrity: sha512-O+Cf4GneR4CLP48J0c5AJY6eowc+1N3DYZz9uIJ3Mk57AjdL5l8DQEA+HmRfse4UEPepizEPl+M4vFg8cON2BQ==} peerDependencies: svelte: ^4.0.0 sveltekit-superforms: ^1.7.1 @@ -5517,8 +5525,8 @@ packages: '@node-rs/bcrypt': 1.9.2 dev: false - /oslo@1.1.0: - resolution: {integrity: sha512-uUvVt1boGt1aO0oMjzyzxIiDGAkfOdh6jPOzfJZBXsOsHuHfvTnrW7ealrBb27sgg5pHnTjmen6xPz4so+gQEQ==} + /oslo@1.1.1: + resolution: {integrity: sha512-BuJp5GfBW3jkUDLb8VftXD9FRTfjnodMyVshSy6p4UP8PhQI8auTxAQlef9NdFe6JC4mEgZb/mhMJpfNVudDTA==} dependencies: '@node-rs/argon2': 1.7.0 '@node-rs/bcrypt': 1.9.0 @@ -6203,8 +6211,8 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /prettier-plugin-svelte@3.1.2(prettier@3.2.5)(svelte@4.2.10): - resolution: {integrity: sha512-7xfMZtwgAWHMT0iZc8jN4o65zgbAQ3+O32V6W7pXrqNvKnHnkoyQCGCbKeUyXKZLbYE0YhFRnamfxfkEGxm8qA==} + /prettier-plugin-svelte@3.2.0(prettier@3.2.5)(svelte@4.2.10): + resolution: {integrity: sha512-3474Zxxw8z4k64aqZmwTfcGdh/ULM2zNQslORdXEkNjKqqsSxBmiASazoxdCrmaqsbKD2Y0rxKhBEn1u0Y+j9g==} peerDependencies: prettier: ^3.0.0 svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 @@ -7079,8 +7087,8 @@ packages: /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - /tsx@4.7.0: - resolution: {integrity: sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==} + /tsx@4.7.1: + resolution: {integrity: sha512-8d6VuibXHtlN5E3zFkgY8u4DX7Y3Z27zvvPKVmLon/D4AjuKzarkUBTLDBgj9iTQ0hg5xM7c/mYiRVM+HETf0g==} engines: {node: '>=18.0.0'} hasBin: true dependencies: diff --git a/src/schema.ts b/src/schema.ts index f2a3504..41cbfa3 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -1,5 +1,5 @@ import { relations, sql, type InferSelectModel } from 'drizzle-orm'; -import { pgTable, timestamp, varchar, boolean, integer, text, index } from 'drizzle-orm/pg-core'; +import { pgTable, timestamp, varchar, boolean, integer, text, index, pgEnum } from 'drizzle-orm/pg-core'; import { nanoid } from 'nanoid'; import { tsvector } from './tsVector'; @@ -140,7 +140,6 @@ export const games = pgTable('games', { length: 255 }), text_searchable_index: tsvector('text_searchable_index'), - external_id: integer('external_id').unique(), last_sync_at: timestamp('last_sync_at', { withTimezone: true, mode: 'date', @@ -169,9 +168,41 @@ export const gameRelations = relations(games, ({ many }) => ({ mechanics_to_games: many(mechanics_to_games), designers_to_games: many(designers_to_games), publishers_to_games: many(publishers_to_games), - artists_to_games: many(artists_to_games) + artists_to_games: many(artists_to_games), + gameExternalIds: many(gameExternalIds), })); +export const externalIdType = pgEnum('external_id_type', [ + 'game', 'category', 'mechanic', 'publisher', 'designer', 'artist' +]); + +export const externalIds = pgTable('external_ids', { + id: varchar('id', { + length: 255 + }) + .primaryKey() + .$defaultFn(() => nanoid()), + type: varchar('type', { + length: 255 + }).notNull(), + externalId: varchar('external_id', { + length: 255 + }).notNull() +}); + +export const gamesToExternalIds = pgTable('games_to_external_ids', { + gameId: varchar('game_id', { + length: 255 + }) + .notNull() + .references(() => games.id, { onDelete: 'cascade' }), + externalId: varchar('external_id', { + length: 255 + }) + .notNull() + .references(() => externalIds.id, { onDelete: 'cascade' }), +}); + export const expansions = pgTable('expansions', { id: varchar('id', { length: 255 From 2b3d037861fc194801873895db91d067ec7aa0bc Mon Sep 17 00:00:00 2001 From: Bradley Shellnut Date: Wed, 14 Feb 2024 17:48:47 -0800 Subject: [PATCH 15/34] Creating new landing page, starting a different flow of managing your games, updating the schema for external ids, and adding different logo. --- drizzle/0007_same_valeria_richards.sql | 71 ++ drizzle/meta/0007_snapshot.json | 1194 ++++++++++++++++++++++++ drizzle/meta/_journal.json | 7 + package.json | 3 +- pnpm-lock.yaml | 57 +- src/lib/assets/bored-game.svg | 1 + src/lib/components/Footer.svelte | 13 +- src/lib/components/Header.svelte | 10 +- src/lib/components/logo.svelte | 18 +- src/lib/drizzle.ts | 8 +- src/lib/styles/app.pcss | 2 + src/migrate.ts | 12 +- src/routes/(app)/+page.server.ts | 11 +- src/routes/(app)/+page.svelte | 67 +- src/routes/(app)/waitlist/+page.svelte | 1 + src/routes/api/game/random/+server.ts | 5 +- src/schema.ts | 472 +++++----- src/seed.ts | 29 + src/seed/insert.ts | 47 - 19 files changed, 1634 insertions(+), 394 deletions(-) create mode 100644 drizzle/0007_same_valeria_richards.sql create mode 100644 drizzle/meta/0007_snapshot.json create mode 100644 src/lib/assets/bored-game.svg create mode 100644 src/routes/(app)/waitlist/+page.svelte create mode 100644 src/seed.ts delete mode 100644 src/seed/insert.ts diff --git a/drizzle/0007_same_valeria_richards.sql b/drizzle/0007_same_valeria_richards.sql new file mode 100644 index 0000000..2805de8 --- /dev/null +++ b/drizzle/0007_same_valeria_richards.sql @@ -0,0 +1,71 @@ +CREATE TABLE IF NOT EXISTS "categories_to_external_ids" ( + "category_id" varchar(255) NOT NULL, + "external_id" varchar(255) NOT NULL +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "expansions_to_external_ids" ( + "expansion_id" varchar(255) NOT NULL, + "external_id" varchar(255) NOT NULL +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "mechanics_to_external_ids" ( + "mechanic_id" varchar(255) NOT NULL, + "external_id" varchar(255) NOT NULL +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "publishers_to_external_ids" ( + "publisher_id" varchar(255) NOT NULL, + "external_id" varchar(255) NOT NULL +); +--> statement-breakpoint +DROP TABLE "artists";--> statement-breakpoint +DROP TABLE "artists_to_games";--> statement-breakpoint +DROP TABLE "designers";--> statement-breakpoint +DROP TABLE "designers_to_games";--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "categories_to_external_ids" ADD CONSTRAINT "categories_to_external_ids_category_id_categories_id_fk" FOREIGN KEY ("category_id") REFERENCES "categories"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "categories_to_external_ids" ADD CONSTRAINT "categories_to_external_ids_external_id_external_ids_id_fk" FOREIGN KEY ("external_id") REFERENCES "external_ids"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "expansions_to_external_ids" ADD CONSTRAINT "expansions_to_external_ids_expansion_id_expansions_id_fk" FOREIGN KEY ("expansion_id") REFERENCES "expansions"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "expansions_to_external_ids" ADD CONSTRAINT "expansions_to_external_ids_external_id_external_ids_id_fk" FOREIGN KEY ("external_id") REFERENCES "external_ids"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "mechanics_to_external_ids" ADD CONSTRAINT "mechanics_to_external_ids_mechanic_id_mechanics_id_fk" FOREIGN KEY ("mechanic_id") REFERENCES "mechanics"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "mechanics_to_external_ids" ADD CONSTRAINT "mechanics_to_external_ids_external_id_external_ids_id_fk" FOREIGN KEY ("external_id") REFERENCES "external_ids"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "publishers_to_external_ids" ADD CONSTRAINT "publishers_to_external_ids_publisher_id_publishers_id_fk" FOREIGN KEY ("publisher_id") REFERENCES "publishers"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "publishers_to_external_ids" ADD CONSTRAINT "publishers_to_external_ids_external_id_external_ids_id_fk" FOREIGN KEY ("external_id") REFERENCES "external_ids"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; diff --git a/drizzle/meta/0007_snapshot.json b/drizzle/meta/0007_snapshot.json new file mode 100644 index 0000000..f4c3326 --- /dev/null +++ b/drizzle/meta/0007_snapshot.json @@ -0,0 +1,1194 @@ +{ + "id": "8dc4605d-a330-4ccb-950d-d5f1471d9ab8", + "prevId": "713ce980-a770-4f82-8414-a7bd9923262e", + "version": "5", + "dialect": "pg", + "tables": { + "categories": { + "name": "categories", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "categories_to_external_ids": { + "name": "categories_to_external_ids", + "schema": "", + "columns": { + "category_id": { + "name": "category_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "categories_to_external_ids_category_id_categories_id_fk": { + "name": "categories_to_external_ids_category_id_categories_id_fk", + "tableFrom": "categories_to_external_ids", + "tableTo": "categories", + "columnsFrom": [ + "category_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "categories_to_external_ids_external_id_external_ids_id_fk": { + "name": "categories_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "categories_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "categories_to_games": { + "name": "categories_to_games", + "schema": "", + "columns": { + "category_id": { + "name": "category_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "collection_items": { + "name": "collection_items", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "collection_id": { + "name": "collection_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "collection_items_collection_id_collections_id_fk": { + "name": "collection_items_collection_id_collections_id_fk", + "tableFrom": "collection_items", + "tableTo": "collections", + "columnsFrom": [ + "collection_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "collection_items_game_id_games_id_fk": { + "name": "collection_items_game_id_games_id_fk", + "tableFrom": "collection_items", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "collections": { + "name": "collections", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "collections_user_id_users_id_fk": { + "name": "collections_user_id_users_id_fk", + "tableFrom": "collections", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "expansions": { + "name": "expansions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "base_game_id": { + "name": "base_game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "expansions_base_game_id_games_id_fk": { + "name": "expansions_base_game_id_games_id_fk", + "tableFrom": "expansions", + "tableTo": "games", + "columnsFrom": [ + "base_game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "expansions_game_id_games_id_fk": { + "name": "expansions_game_id_games_id_fk", + "tableFrom": "expansions", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "expansions_to_external_ids": { + "name": "expansions_to_external_ids", + "schema": "", + "columns": { + "expansion_id": { + "name": "expansion_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "expansions_to_external_ids_expansion_id_expansions_id_fk": { + "name": "expansions_to_external_ids_expansion_id_expansions_id_fk", + "tableFrom": "expansions_to_external_ids", + "tableTo": "expansions", + "columnsFrom": [ + "expansion_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "expansions_to_external_ids_external_id_external_ids_id_fk": { + "name": "expansions_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "expansions_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "external_ids": { + "name": "external_ids", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "games": { + "name": "games", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "year_published": { + "name": "year_published", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_players": { + "name": "min_players", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "max_players": { + "name": "max_players", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "playtime": { + "name": "playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_playtime": { + "name": "min_playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "max_playtime": { + "name": "max_playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_age": { + "name": "min_age", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "image_url": { + "name": "image_url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "thumb_url": { + "name": "thumb_url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "url": { + "name": "url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "text_searchable_index": { + "name": "text_searchable_index", + "type": "tsvector", + "primaryKey": false, + "notNull": false + }, + "last_sync_at": { + "name": "last_sync_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": { + "text_searchable_idx": { + "name": "text_searchable_idx", + "columns": [ + "text_searchable_index" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "games_to_external_ids": { + "name": "games_to_external_ids", + "schema": "", + "columns": { + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "games_to_external_ids_game_id_games_id_fk": { + "name": "games_to_external_ids_game_id_games_id_fk", + "tableFrom": "games_to_external_ids", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "games_to_external_ids_external_id_external_ids_id_fk": { + "name": "games_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "games_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "mechanics": { + "name": "mechanics", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "mechanics_to_external_ids": { + "name": "mechanics_to_external_ids", + "schema": "", + "columns": { + "mechanic_id": { + "name": "mechanic_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "mechanics_to_external_ids_mechanic_id_mechanics_id_fk": { + "name": "mechanics_to_external_ids_mechanic_id_mechanics_id_fk", + "tableFrom": "mechanics_to_external_ids", + "tableTo": "mechanics", + "columnsFrom": [ + "mechanic_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mechanics_to_external_ids_external_id_external_ids_id_fk": { + "name": "mechanics_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "mechanics_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "mechanics_to_games": { + "name": "mechanics_to_games", + "schema": "", + "columns": { + "mechanic_id": { + "name": "mechanic_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "publishers": { + "name": "publishers", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "publishers_to_external_ids": { + "name": "publishers_to_external_ids", + "schema": "", + "columns": { + "publisher_id": { + "name": "publisher_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "publishers_to_external_ids_publisher_id_publishers_id_fk": { + "name": "publishers_to_external_ids_publisher_id_publishers_id_fk", + "tableFrom": "publishers_to_external_ids", + "tableTo": "publishers", + "columnsFrom": [ + "publisher_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "publishers_to_external_ids_external_id_external_ids_id_fk": { + "name": "publishers_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "publishers_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "publishers_to_games": { + "name": "publishers_to_games", + "schema": "", + "columns": { + "publisher_id": { + "name": "publisher_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "roles": { + "name": "roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "roles_name_unique": { + "name": "roles_name_unique", + "nullsNotDistinct": false, + "columns": [ + "name" + ] + } + } + }, + "sessions": { + "name": "sessions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "ip_country": { + "name": "ip_country", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "ip_address": { + "name": "ip_address", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "sessions_user_id_users_id_fk": { + "name": "sessions_user_id_users_id_fk", + "tableFrom": "sessions", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "user_roles": { + "name": "user_roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "role_id": { + "name": "role_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "user_roles_user_id_users_id_fk": { + "name": "user_roles_user_id_users_id_fk", + "tableFrom": "user_roles", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_roles_role_id_roles_id_fk": { + "name": "user_roles_role_id_roles_id_fk", + "tableFrom": "user_roles", + "tableTo": "roles", + "columnsFrom": [ + "role_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "username": { + "name": "username", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "hashed_password": { + "name": "hashed_password", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "first_name": { + "name": "first_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "last_name": { + "name": "last_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "verified": { + "name": "verified", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "receive_email": { + "name": "receive_email", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "theme": { + "name": "theme", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "default": "'system'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_username_unique": { + "name": "users_username_unique", + "nullsNotDistinct": false, + "columns": [ + "username" + ] + }, + "users_email_unique": { + "name": "users_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + } + }, + "wishlist_items": { + "name": "wishlist_items", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "wishlist_id": { + "name": "wishlist_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "wishlist_items_wishlist_id_wishlists_id_fk": { + "name": "wishlist_items_wishlist_id_wishlists_id_fk", + "tableFrom": "wishlist_items", + "tableTo": "wishlists", + "columnsFrom": [ + "wishlist_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "wishlist_items_game_id_games_id_fk": { + "name": "wishlist_items_game_id_games_id_fk", + "tableFrom": "wishlist_items", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "wishlists": { + "name": "wishlists", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "wishlists_user_id_users_id_fk": { + "name": "wishlists_user_id_users_id_fk", + "tableFrom": "wishlists", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + } + }, + "enums": { + "external_id_type": { + "name": "external_id_type", + "values": { + "game": "game", + "category": "category", + "mechanic": "mechanic", + "publisher": "publisher", + "designer": "designer", + "artist": "artist" + } + } + }, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json index 6ce5715..4ea7e65 100644 --- a/drizzle/meta/_journal.json +++ b/drizzle/meta/_journal.json @@ -50,6 +50,13 @@ "when": 1707932522909, "tag": "0006_light_corsair", "breakpoints": true + }, + { + "idx": 7, + "version": "5", + "when": 1707951501716, + "tag": "0007_same_valeria_richards", + "breakpoints": true } ] } \ No newline at end of file diff --git a/package.json b/package.json index 6d168d8..3864974 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "site:update": "pnpm update -i -L", "generate": "drizzle-kit generate:pg", "migrate": "tsx ./src/migrate.ts", - "seed": "tsx ./src/seed/insert.ts", + "seed": "tsx ./src/seed.ts", "push": "drizzle-kit push:pg" }, "prisma": { @@ -35,6 +35,7 @@ "@sveltejs/vite-plugin-svelte": "^3.0.2", "@types/cookie": "^0.6.0", "@types/node": "^20.11.17", + "@types/pg": "^8.11.0", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", "autoprefixer": "^10.4.17", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2885867..bc16dbb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -64,7 +64,7 @@ dependencies: version: 0.6.0 drizzle-orm: specifier: ^0.29.3 - version: 0.29.3(@neondatabase/serverless@0.8.1)(@planetscale/database@1.16.0)(mysql2@3.9.1)(pg@8.11.3)(postgres@3.4.3) + version: 0.29.3(@neondatabase/serverless@0.8.1)(@planetscale/database@1.16.0)(@types/pg@8.11.0)(mysql2@3.9.1)(pg@8.11.3)(postgres@3.4.3) feather-icons: specifier: ^4.29.1 version: 4.29.1 @@ -160,6 +160,9 @@ devDependencies: '@types/node': specifier: ^20.11.17 version: 20.11.17 + '@types/pg': + specifier: ^8.11.0 + version: 8.11.0 '@typescript-eslint/eslint-plugin': specifier: ^6.21.0 version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.3.3) @@ -3071,6 +3074,13 @@ packages: dependencies: undici-types: 5.26.5 + /@types/pg@8.11.0: + resolution: {integrity: sha512-sDAlRiBNthGjNFfvt0k6mtotoVYVQ63pA8R4EMWka7crawSR60waVYR0HAgmPRs/e2YaeJTD/43OoZ3PFw80pw==} + dependencies: + '@types/node': 20.11.17 + pg-protocol: 1.6.0 + pg-types: 4.0.2 + /@types/pg@8.6.6: resolution: {integrity: sha512-O2xNmXebtwVekJDD+02udOncjVcMZQuTEQEMpKJ0ZRf5E7/9JJX3izhKUcUifBkyKpljyUM6BTgy2trmviKlpw==} dependencies: @@ -3989,7 +3999,7 @@ packages: - supports-color dev: true - /drizzle-orm@0.29.3(@neondatabase/serverless@0.8.1)(@planetscale/database@1.16.0)(mysql2@3.9.1)(pg@8.11.3)(postgres@3.4.3): + /drizzle-orm@0.29.3(@neondatabase/serverless@0.8.1)(@planetscale/database@1.16.0)(@types/pg@8.11.0)(mysql2@3.9.1)(pg@8.11.3)(postgres@3.4.3): resolution: {integrity: sha512-uSE027csliGSGYD0pqtM+SAQATMREb3eSM/U8s6r+Y0RFwTKwftnwwSkqx3oS65UBgqDOM0gMTl5UGNpt6lW0A==} peerDependencies: '@aws-sdk/client-rds-data': '>=3' @@ -4062,6 +4072,7 @@ packages: dependencies: '@neondatabase/serverless': 0.8.1 '@planetscale/database': 1.16.0 + '@types/pg': 8.11.0 mysql2: 3.9.1 pg: 8.11.3 postgres: 3.4.3 @@ -5490,6 +5501,9 @@ packages: object-keys: 1.1.1 dev: false + /obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: @@ -5634,7 +5648,10 @@ packages: /pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} engines: {node: '>=4.0.0'} - dev: false + + /pg-numeric@1.0.2: + resolution: {integrity: sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==} + engines: {node: '>=4'} /pg-pool@3.6.1(pg@8.11.3): resolution: {integrity: sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==} @@ -5646,7 +5663,6 @@ packages: /pg-protocol@1.6.0: resolution: {integrity: sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==} - dev: false /pg-types@2.2.0: resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} @@ -5659,6 +5675,18 @@ packages: postgres-interval: 1.2.0 dev: false + /pg-types@4.0.2: + resolution: {integrity: sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng==} + engines: {node: '>=10'} + dependencies: + pg-int8: 1.0.1 + pg-numeric: 1.0.2 + postgres-array: 3.0.2 + postgres-bytea: 3.0.0 + postgres-date: 2.1.0 + postgres-interval: 3.0.0 + postgres-range: 1.1.4 + /pg@8.11.3: resolution: {integrity: sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==} engines: {node: '>= 8.0.0'} @@ -6184,16 +6212,30 @@ packages: engines: {node: '>=4'} dev: false + /postgres-array@3.0.2: + resolution: {integrity: sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==} + engines: {node: '>=12'} + /postgres-bytea@1.0.0: resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} engines: {node: '>=0.10.0'} dev: false + /postgres-bytea@3.0.0: + resolution: {integrity: sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==} + engines: {node: '>= 6'} + dependencies: + obuf: 1.1.2 + /postgres-date@1.0.7: resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} engines: {node: '>=0.10.0'} dev: false + /postgres-date@2.1.0: + resolution: {integrity: sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==} + engines: {node: '>=12'} + /postgres-interval@1.2.0: resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} engines: {node: '>=0.10.0'} @@ -6201,6 +6243,13 @@ packages: xtend: 4.0.2 dev: false + /postgres-interval@3.0.0: + resolution: {integrity: sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==} + engines: {node: '>=12'} + + /postgres-range@1.1.4: + resolution: {integrity: sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==} + /postgres@3.4.3: resolution: {integrity: sha512-iHJn4+M9vbTdHSdDzNkC0crHq+1CUdFhx+YqCE+SqWxPjm+Zu63jq7yZborOBF64c8pc58O5uMudyL1FQcHacA==} engines: {node: '>=12'} diff --git a/src/lib/assets/bored-game.svg b/src/lib/assets/bored-game.svg new file mode 100644 index 0000000..159ae83 --- /dev/null +++ b/src/lib/assets/bored-game.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/lib/components/Footer.svelte b/src/lib/components/Footer.svelte index 04728ef..2e779a4 100644 --- a/src/lib/components/Footer.svelte +++ b/src/lib/components/Footer.svelte @@ -1,12 +1,9 @@ + + diff --git a/src/routes/(app)/waitlist/+page.svelte b/src/routes/(app)/waitlist/+page.svelte new file mode 100644 index 0000000..b3bd926 --- /dev/null +++ b/src/routes/(app)/waitlist/+page.svelte @@ -0,0 +1 @@ +

Waitlist

\ No newline at end of file diff --git a/src/routes/api/game/random/+server.ts b/src/routes/api/game/random/+server.ts index b06057d..da55a39 100644 --- a/src/routes/api/game/random/+server.ts +++ b/src/routes/api/game/random/+server.ts @@ -1,10 +1,9 @@ -// import prisma from '$lib/prisma.js'; import db from '$lib/drizzle.js'; import { error, json } from '@sveltejs/kit'; -import { asc, count, inArray, sql } from 'drizzle-orm'; +import { asc, count } from 'drizzle-orm'; import { games, type Games } from '../../../../schema.js'; -export const GET = async ({ url, locals }) => { +export const GET = async ({ url }) => { const searchParams = Object.fromEntries(url.searchParams); const limit = parseInt(searchParams?.limit) || 1; diff --git a/src/schema.ts b/src/schema.ts index 41cbfa3..1bf0bf1 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -3,6 +3,8 @@ import { pgTable, timestamp, varchar, boolean, integer, text, index, pgEnum } fr import { nanoid } from 'nanoid'; import { tsvector } from './tsVector'; +// User Related Schemas + export const users = pgTable('users', { id: varchar('id', { length: 255 @@ -71,6 +73,12 @@ export const roles = pgTable('roles', { }).unique() }); +export type Roles = InferSelectModel; + +export const role_relations = relations(roles, ({ many }) => ({ + user_roles: many(user_roles) +})) + export const user_roles = pgTable('user_roles', { id: varchar('id', { length: 255 @@ -110,138 +118,6 @@ export const user_role_relations = relations(user_roles, ({ one }) => ({ }) })); -export const games = pgTable('games', { - id: varchar('id', { - length: 255 - }) - .primaryKey() - .$defaultFn(() => nanoid()), - name: varchar('name', { - length: 255 - }), - slug: varchar('slug', { - length: 255 - }), - description: text('description'), - year_published: integer('year_published'), - min_players: integer('min_players'), - max_players: integer('max_players'), - playtime: integer('playtime'), - min_playtime: integer('min_playtime'), - max_playtime: integer('max_playtime'), - min_age: integer('min_age'), - image_url: varchar('image_url', { - length: 255 - }), - thumb_url: varchar('thumb_url', { - length: 255 - }), - url: varchar('url', { - length: 255 - }), - text_searchable_index: tsvector('text_searchable_index'), - last_sync_at: timestamp('last_sync_at', { - withTimezone: true, - mode: 'date', - precision: 6 - }), - created_at: timestamp('created_at', { - withTimezone: true, - mode: 'date', - precision: 6 - }).default(sql`now()`), - updated_at: timestamp('updated_at', { - withTimezone: true, - mode: 'date', - precision: 6 - }).default(sql`now()`) -}, (table) => { - return { - text_searchable_idx: index("text_searchable_idx").on(table.text_searchable_index).using(sql`'gin'`) - } -}); - -export type Games = InferSelectModel; - -export const gameRelations = relations(games, ({ many }) => ({ - categories_to_games: many(categories_to_games), - mechanics_to_games: many(mechanics_to_games), - designers_to_games: many(designers_to_games), - publishers_to_games: many(publishers_to_games), - artists_to_games: many(artists_to_games), - gameExternalIds: many(gameExternalIds), -})); - -export const externalIdType = pgEnum('external_id_type', [ - 'game', 'category', 'mechanic', 'publisher', 'designer', 'artist' -]); - -export const externalIds = pgTable('external_ids', { - id: varchar('id', { - length: 255 - }) - .primaryKey() - .$defaultFn(() => nanoid()), - type: varchar('type', { - length: 255 - }).notNull(), - externalId: varchar('external_id', { - length: 255 - }).notNull() -}); - -export const gamesToExternalIds = pgTable('games_to_external_ids', { - gameId: varchar('game_id', { - length: 255 - }) - .notNull() - .references(() => games.id, { onDelete: 'cascade' }), - externalId: varchar('external_id', { - length: 255 - }) - .notNull() - .references(() => externalIds.id, { onDelete: 'cascade' }), -}); - -export const expansions = pgTable('expansions', { - id: varchar('id', { - length: 255 - }) - .primaryKey() - .$defaultFn(() => nanoid()), - base_game_id: varchar('base_game_id', { - length: 255 - }) - .notNull() - .references(() => games.id, { onDelete: 'cascade' }), - game_id: varchar('game_id', { - length: 255 - }) - .notNull() - .references(() => games.id, { onDelete: 'cascade' }), - created_at: timestamp('created_at', { - withTimezone: true, - mode: 'date', - precision: 6 - }).default(sql`now()`), - updated_at: timestamp('updated_at', { - withTimezone: true, - mode: 'date', - precision: 6 - }).default(sql`now()`) -}); - -export const expansion_relations = relations(expansions, ({ one }) => ({ - baseGame: one(games, { - fields: [expansions.base_game_id], - references: [games.id] - }), - game: one(games, { - fields: [expansions.game_id], - references: [games.id] - }) -})); - export const collections = pgTable('collections', { id: varchar('id', { length: 255 @@ -380,6 +256,152 @@ export const wishlist_item_relations = relations(wishlist_items, ({ one }) => ({ }) })); +// Game and related table schemas + +export const externalIdType = pgEnum('external_id_type', [ + 'game', 'category', 'mechanic', 'publisher', 'designer', 'artist' +]); + +export const externalIds = pgTable('external_ids', { + id: varchar('id', { + length: 255 + }) + .primaryKey() + .$defaultFn(() => nanoid()), + type: varchar('type', { + length: 255 + }).notNull(), + externalId: varchar('external_id', { + length: 255 + }).notNull() +}); + +export const games = pgTable('games', { + id: varchar('id', { + length: 255 + }) + .primaryKey() + .$defaultFn(() => nanoid()), + name: varchar('name', { + length: 255 + }), + slug: varchar('slug', { + length: 255 + }), + description: text('description'), + year_published: integer('year_published'), + min_players: integer('min_players'), + max_players: integer('max_players'), + playtime: integer('playtime'), + min_playtime: integer('min_playtime'), + max_playtime: integer('max_playtime'), + min_age: integer('min_age'), + image_url: varchar('image_url', { + length: 255 + }), + thumb_url: varchar('thumb_url', { + length: 255 + }), + url: varchar('url', { + length: 255 + }), + text_searchable_index: tsvector('text_searchable_index'), + last_sync_at: timestamp('last_sync_at', { + withTimezone: true, + mode: 'date', + precision: 6 + }), + created_at: timestamp('created_at', { + withTimezone: true, + mode: 'date', + precision: 6 + }).default(sql`now()`), + updated_at: timestamp('updated_at', { + withTimezone: true, + mode: 'date', + precision: 6 + }).default(sql`now()`) +}, (table) => { + return { + text_searchable_idx: index("text_searchable_idx").on(table.text_searchable_index).using(sql`'gin'`) + } +}); + +export type Games = InferSelectModel; + +export const gamesToExternalIds = pgTable('games_to_external_ids', { + gameId: varchar('game_id', { + length: 255 + }) + .notNull() + .references(() => games.id, { onDelete: 'cascade' }), + externalId: varchar('external_id', { + length: 255 + }) + .notNull() + .references(() => externalIds.id, { onDelete: 'cascade' }), +}); + +export const gameRelations = relations(games, ({ many }) => ({ + categories_to_games: many(categories_to_games), + mechanics_to_games: many(mechanics_to_games), + publishers_to_games: many(publishers_to_games), + gamesToExternalIds: many(gamesToExternalIds), +})); + +export const expansions = pgTable('expansions', { + id: varchar('id', { + length: 255 + }) + .primaryKey() + .$defaultFn(() => nanoid()), + base_game_id: varchar('base_game_id', { + length: 255 + }) + .notNull() + .references(() => games.id, { onDelete: 'cascade' }), + game_id: varchar('game_id', { + length: 255 + }) + .notNull() + .references(() => games.id, { onDelete: 'cascade' }), + created_at: timestamp('created_at', { + withTimezone: true, + mode: 'date', + precision: 6 + }).default(sql`now()`), + updated_at: timestamp('updated_at', { + withTimezone: true, + mode: 'date', + precision: 6 + }).default(sql`now()`) +}); + +export const expansionsToExternalIds = pgTable('expansions_to_external_ids', { + expansionId: varchar('expansion_id', { + length: 255 + }) + .notNull() + .references(() => expansions.id, { onDelete: 'cascade' }), + externalId: varchar('external_id', { + length: 255 + }) + .notNull() + .references(() => externalIds.id, { onDelete: 'cascade' }), +}); + +export const expansion_relations = relations(expansions, ({ one, many }) => ({ + baseGame: one(games, { + fields: [expansions.base_game_id], + references: [games.id] + }), + game: one(games, { + fields: [expansions.game_id], + references: [games.id] + }), + expansionsToExternalIds: many(expansionsToExternalIds) +})); + export const publishers = pgTable('publishers', { id: varchar('id', { length: 255 @@ -405,8 +427,22 @@ export const publishers = pgTable('publishers', { }).default(sql`now()`) }); +export const publishersToExternalIds = pgTable('publishers_to_external_ids', { + publisherId: varchar('publisher_id', { + length: 255 + }) + .notNull() + .references(() => publishers.id, { onDelete: 'cascade' }), + externalId: varchar('external_id', { + length: 255 + }) + .notNull() + .references(() => externalIds.id, { onDelete: 'cascade' }), +}); + export const publishers_relations = relations(publishers, ({ many }) => ({ - publishers_to_games: many(publishers_to_games) + publishers_to_games: many(publishers_to_games), + publishersToExternalIds: many(publishersToExternalIds) })); export const categories = pgTable('categories', { @@ -434,8 +470,42 @@ export const categories = pgTable('categories', { }).default(sql`now()`) }); +export const categoriesToExternalIds = pgTable('categories_to_external_ids', { + categoryId: varchar('category_id', { + length: 255 + }) + .notNull() + .references(() => categories.id, { onDelete: 'cascade' }), + externalId: varchar('external_id', { + length: 255 + }) + .notNull() + .references(() => externalIds.id, { onDelete: 'cascade' }), +}) + +export const categories_to_games = pgTable('categories_to_games', { + category_id: varchar('category_id', { + length: 255 + }), + game_id: varchar('game_id', { + length: 255 + }) +}); + +export const categories_to_games_relations = relations(categories_to_games, ({ one }) => ({ + category: one(categories, { + fields: [categories_to_games.category_id], + references: [categories.id] + }), + game: one(games, { + fields: [categories_to_games.game_id], + references: [games.id] + }) +})); + export const categories_relations = relations(categories, ({ many }) => ({ - categories_to_games: many(categories_to_games) + categories_to_games: many(categories_to_games), + categoriesToExternalIds: many(categoriesToExternalIds) })); export const mechanics = pgTable('mechanics', { @@ -463,126 +533,22 @@ export const mechanics = pgTable('mechanics', { }).default(sql`now()`) }); +export const mechanicsToExternalIds = pgTable('mechanics_to_external_ids', { + mechanicId: varchar('mechanic_id', { + length: 255 + }) + .notNull() + .references(() => mechanics.id, { onDelete: 'cascade' }), + externalId: varchar('external_id', { + length: 255 + }) + .notNull() + .references(() => externalIds.id, { onDelete: 'cascade' }), +}) + export const mechanic_relations = relations(mechanics, ({ many }) => ({ - mechanics_to_games: many(mechanics_to_games) -})); - -export const designers = pgTable('designers', { - id: varchar('id', { - length: 255 - }) - .primaryKey() - .$defaultFn(() => nanoid()), - name: varchar('name', { - length: 255 - }), - slug: varchar('slug', { - length: 255 - }), - external_id: integer('external_id'), - created_at: timestamp('created_at', { - withTimezone: true, - mode: 'date', - precision: 6 - }).default(sql`now()`), - updated_at: timestamp('updated_at', { - withTimezone: true, - mode: 'date', - precision: 6 - }).default(sql`now()`) -}); - -export const designers_relations = relations(designers, ({ many }) => ({ - designers_to_games: many(designers_to_games) -})); - -export const artists = pgTable('artists', { - id: varchar('id', { - length: 255 - }) - .primaryKey() - .$defaultFn(() => nanoid()), - name: varchar('name', { - length: 255 - }), - slug: varchar('slug', { - length: 255 - }), - external_id: integer('external_id'), - created_at: timestamp('created_at', { - withTimezone: true, - mode: 'date', - precision: 6 - }).default(sql`now()`), - updated_at: timestamp('updated_at', { - withTimezone: true, - mode: 'date', - precision: 6 - }).default(sql`now()`) -}); - -export const artists_relations = relations(artists, ({ many }) => ({ - artists_to_games: many(artists_to_games) -})); - -export const artists_to_games = pgTable('artists_to_games', { - artist_id: varchar('artist_id', { - length: 255 - }), - game_id: varchar('game_id', { - length: 255 - }) -}); - -export const artists_to_games_relations = relations(artists_to_games, ({ one }) => ({ - artist: one(artists, { - fields: [artists_to_games.artist_id], - references: [artists.id] - }), - game: one(games, { - fields: [artists_to_games.game_id], - references: [games.id] - }) -})); - -export const categories_to_games = pgTable('categories_to_games', { - category_id: varchar('category_id', { - length: 255 - }), - game_id: varchar('game_id', { - length: 255 - }) -}); - -export const categories_to_games_relations = relations(categories_to_games, ({ one }) => ({ - category: one(categories, { - fields: [categories_to_games.category_id], - references: [categories.id] - }), - game: one(games, { - fields: [categories_to_games.game_id], - references: [games.id] - }) -})); - -export const designers_to_games = pgTable('designers_to_games', { - designer_id: varchar('designer_id', { - length: 255 - }), - game_id: varchar('game_id', { - length: 255 - }) -}); - -export const designers_to_games_relations = relations(designers_to_games, ({ one }) => ({ - designer: one(designers, { - fields: [designers_to_games.designer_id], - references: [designers.id] - }), - game: one(games, { - fields: [designers_to_games.game_id], - references: [games.id] - }) + mechanics_to_games: many(mechanics_to_games), + mechanicsToExternalIds: many(mechanicsToExternalIds) })); export const mechanics_to_games = pgTable('mechanics_to_games', { diff --git a/src/seed.ts b/src/seed.ts new file mode 100644 index 0000000..d035833 --- /dev/null +++ b/src/seed.ts @@ -0,0 +1,29 @@ +import 'dotenv/config'; +import { drizzle } from "drizzle-orm/node-postgres"; +import pg from 'pg'; +import * as schema from './schema'; + +// create the connection +const pool = new pg.Pool({ + user: process.env.DATABASE_USER, + password: process.env.DATABASE_PASSWORD, + host: process.env.DATABASE_HOST, + port: new Number(process.env.DATABASE_PORT).valueOf(), + database: process.env.DATABASE_DB +}); + +const db = drizzle(pool, { schema: schema }); + +const existingRoles = await db.query.roles.findMany(); +console.log('Existing roles', existingRoles); +if (existingRoles.length === 0) { + console.log('Creating roles ...'); + await db.insert(schema.roles).values([{ + name: 'admin' + }, { + name: 'user' + }]); + console.log('Roles created.'); +} else { + console.log('Roles already exist. No action taken.'); +} diff --git a/src/seed/insert.ts b/src/seed/insert.ts deleted file mode 100644 index 1a1fd00..0000000 --- a/src/seed/insert.ts +++ /dev/null @@ -1,47 +0,0 @@ -import 'dotenv/config'; -import { drizzle } from "drizzle-orm/node-postgres"; -import { sql } from 'drizzle-orm'; -import pg from 'pg'; -import * as schema from '../schema'; - -// create the connection -const pool = new pg.Pool({ - user: process.env.DATABASE_USER, - password: process.env.DATABASE_PASSWORD, - host: process.env.DATABASE_HOST, - port: process.env.DATABASE_PORT, - database: process.env.DATABASE_DB -}); - -const db = drizzle(pool, { schema: schema }); - -const existingRoles = await db.query.roles.findMany(); -if (existingRoles.length === 0) { - console.log('Creating roles ...'); - await db.insert(schema.roles).values([{ - name: 'admin' - }, { - name: 'user' - }]); - console.log('Roles created.'); -} else { - console.log('Roles already exist. No action taken.'); -} - -const indexes = await db.execute(sql`select * from pg_catalog.pg_indexes where tablename = 'games'`); - -console.log('Indexes', indexes); - -const nameSlugIndexExists = indexes[0].flatMap((i) => i.Key_name).indexOf('full_text_name_slug_index') > -1; - -console.log('nameSlugIndexExists', nameSlugIndexExists); - -if (!nameSlugIndexExists) { - console.log('Full Text Index does not exist. Creating...'); - // Create index - await db.execute(sql`alter table games ADD FULLTEXT INDEX full_text_name_slug_index (name, slug)`); -} else { - console.log('Full Text Index already exists. No action taken.'); -} - -await connection.end(); From 0c4f93e39ce4d67a2fa41e8b1f72d1161fde86ab Mon Sep 17 00:00:00 2001 From: Bradley Shellnut Date: Thu, 15 Feb 2024 17:18:37 -0800 Subject: [PATCH 16/34] Update dependencies, fix logo on landing and auth. --- package.json | 10 +- pnpm-lock.yaml | 246 ++++++++++++------------- src/lib/components/Header.svelte | 21 ++- src/lib/renderImage.ts | 2 +- src/routes/(auth)/+layout.server.ts | 5 + src/routes/(auth)/+layout.svelte | 29 ++- src/routes/(auth)/sign-up/+page.svelte | 8 +- 7 files changed, 160 insertions(+), 161 deletions(-) diff --git a/package.json b/package.json index 3864974..3f8c3eb 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "@sveltejs/kit": "^2.5.0", "@sveltejs/vite-plugin-svelte": "^3.0.2", "@types/cookie": "^0.6.0", - "@types/node": "^20.11.17", + "@types/node": "^20.11.19", "@types/pg": "^8.11.0", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", @@ -47,16 +47,16 @@ "just-clone": "^6.2.0", "just-debounce-it": "^3.2.0", "postcss": "^8.4.35", - "postcss-import": "^16.0.0", + "postcss-import": "^16.0.1", "postcss-load-config": "^5.0.3", "postcss-preset-env": "^9.3.0", "prettier": "^3.2.5", - "prettier-plugin-svelte": "^3.2.0", + "prettier-plugin-svelte": "^3.2.1", "prisma": "^5.9.1", "sass": "^1.70.0", "satori": "^0.10.13", "satori-html": "^0.3.2", - "svelte": "^4.2.10", + "svelte": "^4.2.11", "svelte-check": "^3.6.4", "svelte-meta-tags": "^3.1.0", "svelte-preprocess": "^5.1.3", @@ -68,7 +68,7 @@ "tslib": "^2.6.1", "tsx": "^4.7.1", "typescript": "^5.3.3", - "vite": "^5.1.1", + "vite": "^5.1.3", "vitest": "^1.2.2", "zod": "^3.22.4" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bc16dbb..43ed1d0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -37,7 +37,7 @@ dependencies: version: 5.9.1(prisma@5.9.1) '@sentry/sveltekit': specifier: ^7.100.1 - version: 7.100.1(@sveltejs/kit@2.5.0)(svelte@4.2.10) + version: 7.100.1(@sveltejs/kit@2.5.0)(svelte@4.2.11) '@sveltejs/adapter-vercel': specifier: ^5.1.0 version: 5.1.0(@sveltejs/kit@2.5.0) @@ -49,7 +49,7 @@ dependencies: version: 0.5.20 bits-ui: specifier: ^0.18.1 - version: 0.18.1(svelte@4.2.10) + version: 0.18.1(svelte@4.2.11) boardgamegeekclient: specifier: ^1.9.1 version: 1.9.1 @@ -70,7 +70,7 @@ dependencies: version: 4.29.1 formsnap: specifier: ^0.4.4 - version: 0.4.4(svelte@4.2.10)(sveltekit-superforms@1.13.4)(zod@3.22.4) + version: 0.4.4(svelte@4.2.11)(sveltekit-superforms@1.13.4)(zod@3.22.4) html-entities: specifier: ^2.4.0 version: 2.4.0 @@ -88,7 +88,7 @@ dependencies: version: 3.0.1 lucide-svelte: specifier: ^0.323.0 - version: 0.323.0(svelte@4.2.10) + version: 0.323.0(svelte@4.2.11) mysql2: specifier: ^3.9.1 version: 3.9.1 @@ -109,10 +109,10 @@ dependencies: version: 3.4.3 radix-svelte: specifier: ^0.9.0 - version: 0.9.0(svelte@4.2.10) + version: 0.9.0(svelte@4.2.11) svelte-french-toast: specifier: ^1.2.0 - version: 1.2.0(svelte@4.2.10) + version: 1.2.0(svelte@4.2.11) svelte-lazy-loader: specifier: ^1.0.0 version: 1.0.0 @@ -132,10 +132,10 @@ dependencies: devDependencies: '@melt-ui/pp': specifier: ^0.3.0 - version: 0.3.0(@melt-ui/svelte@0.73.0)(svelte@4.2.10) + version: 0.3.0(@melt-ui/svelte@0.73.0)(svelte@4.2.11) '@melt-ui/svelte': specifier: ^0.73.0 - version: 0.73.0(svelte@4.2.10) + version: 0.73.0(svelte@4.2.11) '@playwright/test': specifier: ^1.41.2 version: 1.41.2 @@ -147,19 +147,19 @@ devDependencies: version: 3.1.1(@sveltejs/kit@2.5.0) '@sveltejs/enhanced-img': specifier: ^0.1.8 - version: 0.1.8(svelte@4.2.10) + version: 0.1.8(svelte@4.2.11) '@sveltejs/kit': specifier: ^2.5.0 - version: 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.10)(vite@5.1.1) + version: 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.11)(vite@5.1.3) '@sveltejs/vite-plugin-svelte': specifier: ^3.0.2 - version: 3.0.2(svelte@4.2.10)(vite@5.1.1) + version: 3.0.2(svelte@4.2.11)(vite@5.1.3) '@types/cookie': specifier: ^0.6.0 version: 0.6.0 '@types/node': - specifier: ^20.11.17 - version: 20.11.17 + specifier: ^20.11.19 + version: 20.11.19 '@types/pg': specifier: ^8.11.0 version: 8.11.0 @@ -186,7 +186,7 @@ devDependencies: version: 9.1.0(eslint@8.56.0) eslint-plugin-svelte: specifier: ^2.35.1 - version: 2.35.1(eslint@8.56.0)(svelte@4.2.10)(ts-node@10.9.2) + version: 2.35.1(eslint@8.56.0)(svelte@4.2.11)(ts-node@10.9.2) just-clone: specifier: ^6.2.0 version: 6.2.0 @@ -197,8 +197,8 @@ devDependencies: specifier: ^8.4.35 version: 8.4.35 postcss-import: - specifier: ^16.0.0 - version: 16.0.0(postcss@8.4.35) + specifier: ^16.0.1 + version: 16.0.1(postcss@8.4.35) postcss-load-config: specifier: ^5.0.3 version: 5.0.3(postcss@8.4.35) @@ -209,8 +209,8 @@ devDependencies: specifier: ^3.2.5 version: 3.2.5 prettier-plugin-svelte: - specifier: ^3.2.0 - version: 3.2.0(prettier@3.2.5)(svelte@4.2.10) + specifier: ^3.2.1 + version: 3.2.1(prettier@3.2.5)(svelte@4.2.11) prisma: specifier: ^5.9.1 version: 5.9.1 @@ -224,32 +224,32 @@ devDependencies: specifier: ^0.3.2 version: 0.3.2 svelte: - specifier: ^4.2.10 - version: 4.2.10 + specifier: ^4.2.11 + version: 4.2.11 svelte-check: specifier: ^3.6.4 - version: 3.6.4(postcss-load-config@5.0.3)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.10) + version: 3.6.4(postcss-load-config@5.0.3)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.11) svelte-meta-tags: specifier: ^3.1.0 - version: 3.1.0(svelte@4.2.10)(typescript@5.3.3) + version: 3.1.0(svelte@4.2.11)(typescript@5.3.3) svelte-preprocess: specifier: ^5.1.3 - version: 5.1.3(postcss-load-config@5.0.3)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.10)(typescript@5.3.3) + version: 5.1.3(postcss-load-config@5.0.3)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.11)(typescript@5.3.3) svelte-sequential-preprocessor: specifier: ^2.0.1 version: 2.0.1 sveltekit-flash-message: specifier: ^2.4.1 - version: 2.4.1(@sveltejs/kit@2.5.0)(svelte@4.2.10) + version: 2.4.1(@sveltejs/kit@2.5.0)(svelte@4.2.11) sveltekit-superforms: specifier: ^1.13.4 - version: 1.13.4(@sveltejs/kit@2.5.0)(svelte@4.2.10)(zod@3.22.4) + version: 1.13.4(@sveltejs/kit@2.5.0)(svelte@4.2.11)(zod@3.22.4) tailwindcss: specifier: ^3.4.1 version: 3.4.1(ts-node@10.9.2) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.11.17)(typescript@5.3.3) + version: 10.9.2(@types/node@20.11.19)(typescript@5.3.3) tslib: specifier: ^2.6.1 version: 2.6.2 @@ -260,11 +260,11 @@ devDependencies: specifier: ^5.3.3 version: 5.3.3 vite: - specifier: ^5.1.1 - version: 5.1.1(@types/node@20.11.17)(sass@1.70.0) + specifier: ^5.1.3 + version: 5.1.3(@types/node@20.11.19)(sass@1.70.0) vitest: specifier: ^1.2.2 - version: 1.2.2(@types/node@20.11.17)(sass@1.70.0) + version: 1.2.2(@types/node@20.11.19)(sass@1.70.0) zod: specifier: ^3.22.4 version: 3.22.4 @@ -1738,20 +1738,20 @@ packages: - supports-color dev: false - /@melt-ui/pp@0.3.0(@melt-ui/svelte@0.73.0)(svelte@4.2.10): + /@melt-ui/pp@0.3.0(@melt-ui/svelte@0.73.0)(svelte@4.2.11): resolution: {integrity: sha512-b07Bdh8l2KcwKVCXOY+SoBw1dk9eWvQfMSi6SoacpRVyVmmfpi0kV4oGt3HYF0tUCB3sEmVicxse50ZzZxEzEA==} engines: {pnpm: '>=8.6.3'} peerDependencies: '@melt-ui/svelte': '>= 0.29.0' svelte: ^3.55.0 || ^4.0.0 || ^5.0.0-next.1 dependencies: - '@melt-ui/svelte': 0.73.0(svelte@4.2.10) + '@melt-ui/svelte': 0.73.0(svelte@4.2.11) estree-walker: 3.0.3 magic-string: 0.30.5 - svelte: 4.2.10 + svelte: 4.2.11 dev: true - /@melt-ui/svelte@0.71.2(svelte@4.2.10): + /@melt-ui/svelte@0.71.2(svelte@4.2.11): resolution: {integrity: sha512-GDUErhAphEoEOLpcBjQ84BgzRR6M3344fQE4QYFffwT7aedWak7CvNsECgeig1Y5xvfDmeEaFnGlOQXIBucJYw==} peerDependencies: svelte: '>=3 <5' @@ -1762,10 +1762,10 @@ packages: dequal: 2.0.3 focus-trap: 7.5.4 nanoid: 5.0.5 - svelte: 4.2.10 + svelte: 4.2.11 dev: false - /@melt-ui/svelte@0.73.0(svelte@4.2.10): + /@melt-ui/svelte@0.73.0(svelte@4.2.11): resolution: {integrity: sha512-KD9Z+5DDhnZmDUZv1GQ0+LGeXjxl1zwrB8JAwmGeMN6EigTvXMsTPtrFRUYC+TtEjVq82eTlJzuf4C/a88MkjA==} peerDependencies: svelte: '>=3 <5' @@ -1776,7 +1776,7 @@ packages: dequal: 2.0.3 focus-trap: 7.5.4 nanoid: 5.0.5 - svelte: 4.2.10 + svelte: 4.2.11 dev: true /@napi-rs/wasm-runtime@0.1.1: @@ -2847,7 +2847,7 @@ packages: '@sentry/utils': 7.100.1 dev: false - /@sentry/svelte@7.100.1(svelte@4.2.10): + /@sentry/svelte@7.100.1(svelte@4.2.11): resolution: {integrity: sha512-2oZJNFZYfXeDX05mvBBLtve1KRfCI0DgrxZYe9qbYQIe7snobNSydTK+wIHX/SJeVUz3Z+qyovPqFzjkJPTFnw==} engines: {node: '>=8'} peerDependencies: @@ -2858,10 +2858,10 @@ packages: '@sentry/types': 7.100.1 '@sentry/utils': 7.100.1 magic-string: 0.30.7 - svelte: 4.2.10 + svelte: 4.2.11 dev: false - /@sentry/sveltekit@7.100.1(@sveltejs/kit@2.5.0)(svelte@4.2.10): + /@sentry/sveltekit@7.100.1(@sveltejs/kit@2.5.0)(svelte@4.2.11): resolution: {integrity: sha512-t6JaivTmw5oIqOpKQ8PNbGjNP99AQY6vMPkhxzVuwPa3A3o2WtmzQoIXNxdrkux5XkoBI9CsT6TsM5TbaMDwjQ==} engines: {node: '>=16'} peerDependencies: @@ -2871,11 +2871,11 @@ packages: '@sentry/core': 7.100.1 '@sentry/integrations': 7.100.1 '@sentry/node': 7.100.1 - '@sentry/svelte': 7.100.1(svelte@4.2.10) + '@sentry/svelte': 7.100.1(svelte@4.2.11) '@sentry/types': 7.100.1 '@sentry/utils': 7.100.1 '@sentry/vite-plugin': 0.6.1 - '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.10)(vite@5.1.1) + '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.11)(vite@5.1.3) magicast: 0.2.8 sorcery: 0.11.0 transitivePeerDependencies: @@ -2942,7 +2942,7 @@ packages: peerDependencies: '@sveltejs/kit': ^2.0.0 dependencies: - '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.10)(vite@5.1.1) + '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.11)(vite@5.1.3) import-meta-resolve: 4.0.0 dev: true @@ -2951,7 +2951,7 @@ packages: peerDependencies: '@sveltejs/kit': ^2.4.0 dependencies: - '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.10)(vite@5.1.1) + '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.11)(vite@5.1.3) '@vercel/nft': 0.26.2 esbuild: 0.19.11 transitivePeerDependencies: @@ -2959,18 +2959,18 @@ packages: - supports-color dev: false - /@sveltejs/enhanced-img@0.1.8(svelte@4.2.10): + /@sveltejs/enhanced-img@0.1.8(svelte@4.2.11): resolution: {integrity: sha512-0cLVR9KiO0/t3VVm64OM7bPHTkdaT2aaz1rwoAhao+EBXR3vMvLoYXLHvz8o9/552PSV8G844RkH7qkGc3YAiQ==} dependencies: magic-string: 0.30.5 - svelte-parse-markup: 0.1.2(svelte@4.2.10) + svelte-parse-markup: 0.1.2(svelte@4.2.11) vite-imagetools: 6.2.9 transitivePeerDependencies: - rollup - svelte dev: true - /@sveltejs/kit@2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.10)(vite@5.1.1): + /@sveltejs/kit@2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.11)(vite@5.1.3): resolution: {integrity: sha512-1uyXvzC2Lu1FZa30T4y5jUAC21R309ZMRG0TPt+PPPbNUoDpy8zSmSNVWYaBWxYDqLGQ5oPNWvjvvF2IjJ1jmA==} engines: {node: '>=18.13'} hasBin: true @@ -2980,7 +2980,7 @@ packages: svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.3 dependencies: - '@sveltejs/vite-plugin-svelte': 3.0.2(svelte@4.2.10)(vite@5.1.1) + '@sveltejs/vite-plugin-svelte': 3.0.2(svelte@4.2.11)(vite@5.1.3) '@types/cookie': 0.6.0 cookie: 0.6.0 devalue: 4.3.2 @@ -2992,11 +2992,11 @@ packages: sade: 1.8.1 set-cookie-parser: 2.6.0 sirv: 2.0.4 - svelte: 4.2.10 + svelte: 4.2.11 tiny-glob: 0.2.9 - vite: 5.1.1(@types/node@20.11.17)(sass@1.70.0) + vite: 5.1.3(@types/node@20.11.19)(sass@1.70.0) - /@sveltejs/vite-plugin-svelte-inspector@2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.10)(vite@5.1.1): + /@sveltejs/vite-plugin-svelte-inspector@2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.11)(vite@5.1.3): resolution: {integrity: sha512-gjr9ZFg1BSlIpfZ4PRewigrvYmHWbDrq2uvvPB1AmTWKuM+dI1JXQSUu2pIrYLb/QncyiIGkFDFKTwJ0XqQZZg==} engines: {node: ^18.0.0 || >=20} peerDependencies: @@ -3004,29 +3004,29 @@ packages: svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.0 dependencies: - '@sveltejs/vite-plugin-svelte': 3.0.2(svelte@4.2.10)(vite@5.1.1) + '@sveltejs/vite-plugin-svelte': 3.0.2(svelte@4.2.11)(vite@5.1.3) debug: 4.3.4 - svelte: 4.2.10 - vite: 5.1.1(@types/node@20.11.17)(sass@1.70.0) + svelte: 4.2.11 + vite: 5.1.3(@types/node@20.11.19)(sass@1.70.0) transitivePeerDependencies: - supports-color - /@sveltejs/vite-plugin-svelte@3.0.2(svelte@4.2.10)(vite@5.1.1): + /@sveltejs/vite-plugin-svelte@3.0.2(svelte@4.2.11)(vite@5.1.3): resolution: {integrity: sha512-MpmF/cju2HqUls50WyTHQBZUV3ovV/Uk8k66AN2gwHogNAG8wnW8xtZDhzNBsFJJuvmq1qnzA5kE7YfMJNFv2Q==} engines: {node: ^18.0.0 || >=20} peerDependencies: svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.0 dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.10)(vite@5.1.1) + '@sveltejs/vite-plugin-svelte-inspector': 2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.11)(vite@5.1.3) debug: 4.3.4 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.5 - svelte: 4.2.10 - svelte-hmr: 0.15.3(svelte@4.2.10) - vite: 5.1.1(@types/node@20.11.17)(sass@1.70.0) - vitefu: 0.2.5(vite@5.1.1) + svelte: 4.2.11 + svelte-hmr: 0.15.3(svelte@4.2.11) + vite: 5.1.3(@types/node@20.11.19)(sass@1.70.0) + vitefu: 0.2.5(vite@5.1.3) transitivePeerDependencies: - supports-color @@ -3069,22 +3069,22 @@ packages: resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} dev: true - /@types/node@20.11.17: - resolution: {integrity: sha512-QmgQZGWu1Yw9TDyAP9ZzpFJKynYNeOvwMJmaxABfieQoVoiVOS6MN1WSpqpRcbeA5+RW82kraAVxCCJg+780Qw==} + /@types/node@20.11.19: + resolution: {integrity: sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ==} dependencies: undici-types: 5.26.5 /@types/pg@8.11.0: resolution: {integrity: sha512-sDAlRiBNthGjNFfvt0k6mtotoVYVQ63pA8R4EMWka7crawSR60waVYR0HAgmPRs/e2YaeJTD/43OoZ3PFw80pw==} dependencies: - '@types/node': 20.11.17 + '@types/node': 20.11.19 pg-protocol: 1.6.0 pg-types: 4.0.2 /@types/pg@8.6.6: resolution: {integrity: sha512-O2xNmXebtwVekJDD+02udOncjVcMZQuTEQEMpKJ0ZRf5E7/9JJX3izhKUcUifBkyKpljyUM6BTgy2trmviKlpw==} dependencies: - '@types/node': 20.11.17 + '@types/node': 20.11.19 pg-protocol: 1.6.0 pg-types: 2.2.0 dev: false @@ -3504,15 +3504,15 @@ packages: file-uri-to-path: 1.0.0 dev: false - /bits-ui@0.18.1(svelte@4.2.10): + /bits-ui@0.18.1(svelte@4.2.11): resolution: {integrity: sha512-6junivBQ3EIHeF9j8wDa5pgzegtOwaI61ny4X8F7h2SIJi4RJWwZknkT7O5qPLeGoIYNeYV7N6EOBrr1w9/Mxg==} peerDependencies: svelte: ^4.0.0 dependencies: '@internationalized/date': 3.5.1 - '@melt-ui/svelte': 0.71.2(svelte@4.2.10) + '@melt-ui/svelte': 0.71.2(svelte@4.2.11) nanoid: 5.0.5 - svelte: 4.2.10 + svelte: 4.2.11 dev: false /boardgamegeekclient@1.9.1: @@ -4267,7 +4267,7 @@ packages: eslint: 8.56.0 dev: true - /eslint-plugin-svelte@2.35.1(eslint@8.56.0)(svelte@4.2.10)(ts-node@10.9.2): + /eslint-plugin-svelte@2.35.1(eslint@8.56.0)(svelte@4.2.11)(ts-node@10.9.2): resolution: {integrity: sha512-IF8TpLnROSGy98Z3NrsKXWDSCbNY2ReHDcrYTuXZMbfX7VmESISR78TWgO9zdg4Dht1X8coub5jKwHzP0ExRug==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: @@ -4289,8 +4289,8 @@ packages: postcss-safe-parser: 6.0.0(postcss@8.4.35) postcss-selector-parser: 6.0.13 semver: 7.5.4 - svelte: 4.2.10 - svelte-eslint-parser: 0.33.1(svelte@4.2.10) + svelte: 4.2.11 + svelte-eslint-parser: 0.33.1(svelte@4.2.11) transitivePeerDependencies: - supports-color - ts-node @@ -4526,15 +4526,15 @@ packages: is-callable: 1.2.7 dev: false - /formsnap@0.4.4(svelte@4.2.10)(sveltekit-superforms@1.13.4)(zod@3.22.4): + /formsnap@0.4.4(svelte@4.2.11)(sveltekit-superforms@1.13.4)(zod@3.22.4): resolution: {integrity: sha512-O+Cf4GneR4CLP48J0c5AJY6eowc+1N3DYZz9uIJ3Mk57AjdL5l8DQEA+HmRfse4UEPepizEPl+M4vFg8cON2BQ==} peerDependencies: svelte: ^4.0.0 sveltekit-superforms: ^1.7.1 zod: ^3.22.2 dependencies: - svelte: 4.2.10 - sveltekit-superforms: 1.13.4(@sveltejs/kit@2.5.0)(svelte@4.2.10)(zod@3.22.4) + svelte: 4.2.11 + sveltekit-superforms: 1.13.4(@sveltejs/kit@2.5.0)(svelte@4.2.11)(zod@3.22.4) zod: 3.22.4 dev: false @@ -5161,12 +5161,12 @@ packages: oslo: 1.0.1 dev: false - /lucide-svelte@0.323.0(svelte@4.2.10): + /lucide-svelte@0.323.0(svelte@4.2.11): resolution: {integrity: sha512-3GEFk1vCwB8BtHTHZTocFJfX6AtTLQw9a74JSuihAGx+MzhxqeWk8W1TkM4WUlvE0x9UdONM2rJGRyx9IyjkJg==} peerDependencies: svelte: ^3 || ^4 || ^5.0.0-next.42 dependencies: - svelte: 4.2.10 + svelte: 4.2.11 dev: false /magic-string@0.27.0: @@ -5921,8 +5921,8 @@ packages: read-cache: 1.0.0 resolve: 1.22.8 - /postcss-import@16.0.0(postcss@8.4.35): - resolution: {integrity: sha512-e77lhVvrD1I2y7dYmBv0k9ULTdArgEYZt97T4w6sFIU5uxIHvDFQlKgUUyY7v7Barj0Yf/zm5A4OquZN7jKm5Q==} + /postcss-import@16.0.1(postcss@8.4.35): + resolution: {integrity: sha512-i2Pci0310NaLHr/5JUFSw1j/8hf1CzwMY13g6ZDxgOavmRHQi2ba3PmUHoihO+sjaum+KmCNzskNsw7JDrg03g==} engines: {node: '>=18.0.0'} peerDependencies: postcss: ^8.0.0 @@ -5969,7 +5969,7 @@ packages: dependencies: lilconfig: 2.1.0 postcss: 8.4.35 - ts-node: 10.9.2(@types/node@20.11.17)(typescript@5.3.3) + ts-node: 10.9.2(@types/node@20.11.19)(typescript@5.3.3) yaml: 1.10.2 dev: true @@ -5987,7 +5987,7 @@ packages: dependencies: lilconfig: 3.0.0 postcss: 8.4.35 - ts-node: 10.9.2(@types/node@20.11.17)(typescript@5.3.3) + ts-node: 10.9.2(@types/node@20.11.19)(typescript@5.3.3) yaml: 2.3.4 /postcss-load-config@5.0.3(postcss@8.4.35): @@ -6260,14 +6260,14 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /prettier-plugin-svelte@3.2.0(prettier@3.2.5)(svelte@4.2.10): - resolution: {integrity: sha512-3474Zxxw8z4k64aqZmwTfcGdh/ULM2zNQslORdXEkNjKqqsSxBmiASazoxdCrmaqsbKD2Y0rxKhBEn1u0Y+j9g==} + /prettier-plugin-svelte@3.2.1(prettier@3.2.5)(svelte@4.2.11): + resolution: {integrity: sha512-ENAPbIxASf2R79IZwgkG5sBdeNA9kLRlXVvKKmTXh79zWTy0KKoT86XO2pHrTitUPINd+iXWy12MRmgzKGVckA==} peerDependencies: prettier: ^3.0.0 svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 dependencies: prettier: 3.2.5 - svelte: 4.2.10 + svelte: 4.2.11 dev: true /prettier@3.2.5: @@ -6310,7 +6310,7 @@ packages: /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - /radix-svelte@0.9.0(svelte@4.2.10): + /radix-svelte@0.9.0(svelte@4.2.11): resolution: {integrity: sha512-0PJMHiZVTjWGrjK7c2/FY+nq0fBGwPXNy6fFvkLZIs73hTIai/Exw+pi3TCvtd80gSjFb5utdHWI3qiuuN0B/Q==} engines: {node: '>= 16'} peerDependencies: @@ -6318,7 +6318,7 @@ packages: dependencies: '@floating-ui/core': 1.5.0 '@floating-ui/dom': 1.5.3 - svelte: 4.2.10 + svelte: 4.2.11 dev: false /react-is@18.2.0: @@ -6753,7 +6753,7 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - /svelte-check@3.6.4(postcss-load-config@5.0.3)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.10): + /svelte-check@3.6.4(postcss-load-config@5.0.3)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.11): resolution: {integrity: sha512-mY/dqucqm46p72M8yZmn81WPZx9mN6uuw8UVfR3ZKQeLxQg5HDGO3HHm5AZuWZPYNMLJ+TRMn+TeN53HfQ/vsw==} hasBin: true peerDependencies: @@ -6765,8 +6765,8 @@ packages: import-fresh: 3.3.0 picocolors: 1.0.0 sade: 1.8.1 - svelte: 4.2.10 - svelte-preprocess: 5.1.3(postcss-load-config@5.0.3)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.10)(typescript@5.3.3) + svelte: 4.2.11 + svelte-preprocess: 5.1.3(postcss-load-config@5.0.3)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.11)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: - '@babel/core' @@ -6780,7 +6780,7 @@ packages: - sugarss dev: true - /svelte-eslint-parser@0.33.1(svelte@4.2.10): + /svelte-eslint-parser@0.33.1(svelte@4.2.11): resolution: {integrity: sha512-vo7xPGTlKBGdLH8T5L64FipvTrqv3OQRx9d2z5X05KKZDlF4rQk8KViZO4flKERY+5BiVdOh7zZ7JGJWo5P0uA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -6794,50 +6794,50 @@ packages: espree: 9.6.1 postcss: 8.4.35 postcss-scss: 4.0.9(postcss@8.4.35) - svelte: 4.2.10 + svelte: 4.2.11 dev: true - /svelte-french-toast@1.2.0(svelte@4.2.10): + /svelte-french-toast@1.2.0(svelte@4.2.11): resolution: {integrity: sha512-5PW+6RFX3xQPbR44CngYAP1Sd9oCq9P2FOox4FZffzJuZI2mHOB7q5gJBVnOiLF5y3moVGZ7u2bYt7+yPAgcEQ==} peerDependencies: svelte: ^3.57.0 || ^4.0.0 dependencies: - svelte: 4.2.10 - svelte-writable-derived: 3.1.0(svelte@4.2.10) + svelte: 4.2.11 + svelte-writable-derived: 3.1.0(svelte@4.2.11) dev: false - /svelte-hmr@0.15.3(svelte@4.2.10): + /svelte-hmr@0.15.3(svelte@4.2.11): resolution: {integrity: sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ==} engines: {node: ^12.20 || ^14.13.1 || >= 16} peerDependencies: svelte: ^3.19.0 || ^4.0.0 dependencies: - svelte: 4.2.10 + svelte: 4.2.11 /svelte-lazy-loader@1.0.0: resolution: {integrity: sha512-AZD6R60vksyojn21FgXLglmBiBB9K5Dkdu0hdGrLbCaRCYT68IsWkZfRUqKhMx1IfzqWcZQ8X9y/f+Ih0oNQkQ==} dev: false - /svelte-meta-tags@3.1.0(svelte@4.2.10)(typescript@5.3.3): + /svelte-meta-tags@3.1.0(svelte@4.2.11)(typescript@5.3.3): resolution: {integrity: sha512-wFBfpktSua1R5rdvQ/aFucvXmRqzDhRYrPpMQ/pL4+KL5QHIzomPf29a5WN3yDR0reSy1PXyQ2ah0+uCYCbi0g==} peerDependencies: svelte: ^3.55.0 || ^4.0.0 dependencies: schema-dts: 1.1.2(typescript@5.3.3) - svelte: 4.2.10 + svelte: 4.2.11 transitivePeerDependencies: - typescript dev: true - /svelte-parse-markup@0.1.2(svelte@4.2.10): + /svelte-parse-markup@0.1.2(svelte@4.2.11): resolution: {integrity: sha512-DycY7DJr7VqofiJ63ut1/NEG92HrWWL56VWITn/cJCu+LlZhMoBkBXT4opUitPEEwbq1nMQbv4vTKUfbOqIW1g==} peerDependencies: svelte: ^3.0.0 || ^4.0.0 dependencies: - svelte: 4.2.10 + svelte: 4.2.11 dev: true - /svelte-preprocess@5.1.3(postcss-load-config@5.0.3)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.10)(typescript@5.3.3): + /svelte-preprocess@5.1.3(postcss-load-config@5.0.3)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.11)(typescript@5.3.3): resolution: {integrity: sha512-xxAkmxGHT+J/GourS5mVJeOXZzne1FR5ljeOUAMXUkfEhkLEllRreXpbl3dIYJlcJRfL1LO1uIAPpBpBfiqGPw==} engines: {node: '>= 16.0.0', pnpm: ^8.0.0} requiresBuild: true @@ -6883,7 +6883,7 @@ packages: sass: 1.70.0 sorcery: 0.11.0 strip-indent: 3.0.0 - svelte: 4.2.10 + svelte: 4.2.11 typescript: 5.3.3 dev: true @@ -6891,20 +6891,20 @@ packages: resolution: {integrity: sha512-N5JqlBni6BzElxmuFrOPxOJnjsxh1cFDACLEVKs8OHBcx8ZNRO1p5SxuQex1m3qbLzAC8G99EHeWcxGkjyKjLQ==} engines: {node: '>=16'} dependencies: - svelte: 4.2.10 + svelte: 4.2.11 tslib: 2.6.2 dev: true - /svelte-writable-derived@3.1.0(svelte@4.2.10): + /svelte-writable-derived@3.1.0(svelte@4.2.11): resolution: {integrity: sha512-cTvaVFNIJ036vSDIyPxJYivKC7ZLtcFOPm1Iq6qWBDo1fOHzfk6ZSbwaKrxhjgy52Rbl5IHzRcWgos6Zqn9/rg==} peerDependencies: svelte: ^3.2.1 || ^4.0.0-next.1 dependencies: - svelte: 4.2.10 + svelte: 4.2.11 dev: false - /svelte@4.2.10: - resolution: {integrity: sha512-Ep06yCaCdgG1Mafb/Rx8sJ1QS3RW2I2BxGp2Ui9LBHSZ2/tO/aGLc5WqPjgiAP6KAnLJGaIr/zzwQlOo1b8MxA==} + /svelte@4.2.11: + resolution: {integrity: sha512-YIQk3J4X89wOLhjsqIW8tqY3JHPuBdtdOIkASP2PZeAMcSW9RsIjQzMesCrxOF3gdWYC0mKknlKF7OqmLM+Zqg==} engines: {node: '>=16'} dependencies: '@ampproject/remapping': 2.2.1 @@ -6922,27 +6922,27 @@ packages: magic-string: 0.30.5 periscopic: 3.1.0 - /sveltekit-flash-message@2.4.1(@sveltejs/kit@2.5.0)(svelte@4.2.10): + /sveltekit-flash-message@2.4.1(@sveltejs/kit@2.5.0)(svelte@4.2.11): resolution: {integrity: sha512-n01N62FkXL6tp3VK3u4eCHKz1RwZVgqEEj63pUG/Pj3caHWkjtTUHKX8GRb14kpt9bkML8t93D/B1l1UorskvA==} peerDependencies: '@sveltejs/kit': 1.x || 2.x svelte: 3.x || 4.x dependencies: - '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.10)(vite@5.1.1) - svelte: 4.2.10 + '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.11)(vite@5.1.3) + svelte: 4.2.11 dev: true - /sveltekit-superforms@1.13.4(@sveltejs/kit@2.5.0)(svelte@4.2.10)(zod@3.22.4): + /sveltekit-superforms@1.13.4(@sveltejs/kit@2.5.0)(svelte@4.2.11)(zod@3.22.4): resolution: {integrity: sha512-rM2+Ictaw7OAIorCLmvg82orci/mtO9ZouI4emtx8SyYngx9aED+eNZlHPLufgB6D7geL2a+hMSFtM3zmMQixQ==} peerDependencies: '@sveltejs/kit': 1.x || 2.x svelte: 3.x || 4.x zod: 3.x dependencies: - '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.10)(vite@5.1.1) + '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.11)(vite@5.1.3) devalue: 4.3.2 klona: 2.0.6 - svelte: 4.2.10 + svelte: 4.2.11 zod: 3.22.4 /tabbable@6.2.0: @@ -7103,7 +7103,7 @@ packages: /ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - /ts-node@10.9.2(@types/node@20.11.17)(typescript@5.3.3): + /ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3): resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: @@ -7122,7 +7122,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.11.17 + '@types/node': 20.11.19 acorn: 8.11.2 acorn-walk: 8.3.0 arg: 4.1.3 @@ -7278,7 +7278,7 @@ packages: - rollup dev: true - /vite-node@1.2.2(@types/node@20.11.17)(sass@1.70.0): + /vite-node@1.2.2(@types/node@20.11.19)(sass@1.70.0): resolution: {integrity: sha512-1as4rDTgVWJO3n1uHmUYqq7nsFgINQ9u+mRcXpjeOMJUmviqNKjcZB7UfRZrlM7MjYXMKpuWp5oGkjaFLnjawg==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -7287,7 +7287,7 @@ packages: debug: 4.3.4 pathe: 1.1.1 picocolors: 1.0.0 - vite: 5.1.1(@types/node@20.11.17)(sass@1.70.0) + vite: 5.1.3(@types/node@20.11.19)(sass@1.70.0) transitivePeerDependencies: - '@types/node' - less @@ -7299,8 +7299,8 @@ packages: - terser dev: true - /vite@5.1.1(@types/node@20.11.17)(sass@1.70.0): - resolution: {integrity: sha512-wclpAgY3F1tR7t9LL5CcHC41YPkQIpKUGeIuT8MdNwNZr6OqOTLs7JX5vIHAtzqLWXts0T+GDrh9pN2arneKqg==} + /vite@5.1.3(@types/node@20.11.19)(sass@1.70.0): + resolution: {integrity: sha512-UfmUD36DKkqhi/F75RrxvPpry+9+tTkrXfMNZD+SboZqBCMsxKtO52XeGzzuh7ioz+Eo/SYDBbdb0Z7vgcDJew==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -7327,7 +7327,7 @@ packages: terser: optional: true dependencies: - '@types/node': 20.11.17 + '@types/node': 20.11.19 esbuild: 0.19.12 postcss: 8.4.35 rollup: 4.9.6 @@ -7335,7 +7335,7 @@ packages: optionalDependencies: fsevents: 2.3.3 - /vitefu@0.2.5(vite@5.1.1): + /vitefu@0.2.5(vite@5.1.3): resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} peerDependencies: vite: ^3.0.0 || ^4.0.0 || ^5.0.0 @@ -7343,9 +7343,9 @@ packages: vite: optional: true dependencies: - vite: 5.1.1(@types/node@20.11.17)(sass@1.70.0) + vite: 5.1.3(@types/node@20.11.19)(sass@1.70.0) - /vitest@1.2.2(@types/node@20.11.17)(sass@1.70.0): + /vitest@1.2.2(@types/node@20.11.19)(sass@1.70.0): resolution: {integrity: sha512-d5Ouvrnms3GD9USIK36KG8OZ5bEvKEkITFtnGv56HFaSlbItJuYr7hv2Lkn903+AvRAgSixiamozUVfORUekjw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -7370,7 +7370,7 @@ packages: jsdom: optional: true dependencies: - '@types/node': 20.11.17 + '@types/node': 20.11.19 '@vitest/expect': 1.2.2 '@vitest/runner': 1.2.2 '@vitest/snapshot': 1.2.2 @@ -7389,8 +7389,8 @@ packages: strip-literal: 1.3.0 tinybench: 2.5.1 tinypool: 0.8.2 - vite: 5.1.1(@types/node@20.11.17)(sass@1.70.0) - vite-node: 1.2.2(@types/node@20.11.17)(sass@1.70.0) + vite: 5.1.3(@types/node@20.11.19)(sass@1.70.0) + vite-node: 1.2.2(@types/node@20.11.19)(sass@1.70.0) why-is-node-running: 2.2.2 transitivePeerDependencies: - less diff --git a/src/lib/components/Header.svelte b/src/lib/components/Header.svelte index 57229d6..fb6809c 100644 --- a/src/lib/components/Header.svelte +++ b/src/lib/components/Header.svelte @@ -14,10 +14,11 @@
- @@ -113,23 +114,23 @@ } .corner { - width: 3em; - height: 3em; margin-left: 1rem; } .corner a { display: flex; - align-items: center; - justify-content: center; + place-items: center; + gap: 0.5rem; width: 100%; height: 100%; + font-size: 1.125rem; + line-height: 1.75rem; + font-weight: 500; } - .logo { - width: 2.5rem; - height: 2.5rem; - overflow: hidden; + .logo-image { + width: 2rem; + height: 2rem; } nav { diff --git a/src/lib/renderImage.ts b/src/lib/renderImage.ts index 602e047..eaa0f09 100644 --- a/src/lib/renderImage.ts +++ b/src/lib/renderImage.ts @@ -5,7 +5,7 @@ import { dev } from '$app/environment'; import { read } from '$app/server'; // we use a Vite plugin to turn this import into the result of fs.readFileSync during build -import firaSansSemiBold from '$lib/fonts/FiraSans-SemiBold.ttf'; +import firaSansSemiBold from '$lib/fonts/FiraSans-Bold.ttf'; const fontData = read(firaSansSemiBold).arrayBuffer(); diff --git a/src/routes/(auth)/+layout.server.ts b/src/routes/(auth)/+layout.server.ts index a3be9cd..84402fc 100644 --- a/src/routes/(auth)/+layout.server.ts +++ b/src/routes/(auth)/+layout.server.ts @@ -1,6 +1,11 @@ +import { redirect } from '@sveltejs/kit'; import type { LayoutServerLoad } from './$types'; export const load: LayoutServerLoad = async ({ url, locals }) => { + if (locals.user) { + redirect(302, '/'); + } + return { url: url.pathname, user: locals.user diff --git a/src/routes/(auth)/+layout.svelte b/src/routes/(auth)/+layout.svelte index 9087ada..fbaa302 100644 --- a/src/routes/(auth)/+layout.svelte +++ b/src/routes/(auth)/+layout.svelte @@ -50,8 +50,6 @@ \ No newline at end of file diff --git a/src/routes/(auth)/sign-up/+page.svelte b/src/routes/(auth)/sign-up/+page.svelte index 430289a..2f19cc0 100644 --- a/src/routes/(auth)/sign-up/+page.svelte +++ b/src/routes/(auth)/sign-up/+page.svelte @@ -3,7 +3,6 @@ import { quintIn } from 'svelte/easing'; import { superForm } from 'sveltekit-superforms/client'; import * as flashModule from 'sveltekit-flash-message/client'; - import toast from 'svelte-french-toast'; import { ChevronsUpDown } from "lucide-svelte"; import { Button } from '$components/ui/button'; import { Label } from '$components/ui/label'; @@ -12,7 +11,6 @@ import * as Collapsible from '$lib/components/ui/collapsible'; import * as Alert from '$lib/components/ui/alert'; import { boredState } from '$lib/stores/boredState.js'; - import { onMount } from 'svelte'; export let data; @@ -31,11 +29,7 @@ delayMs: 0, }); - let collapsibleOpen = true; - - onMount(() => { - collapsibleOpen = false; - }); + let collapsibleOpen = false; From 858a356ddff0e3db74935debe03ede44a1a2121b Mon Sep 17 00:00:00 2001 From: Bradley Shellnut Date: Fri, 16 Feb 2024 16:38:02 -0800 Subject: [PATCH 17/34] Updating external id schema types and password validation. --- drizzle/0008_complete_manta.sql | 7 + drizzle/0009_equal_christian_walker.sql | 7 + drizzle/meta/0008_snapshot.json | 1194 +++++++++++++++++ drizzle/meta/0009_snapshot.json | 1194 +++++++++++++++++ drizzle/meta/_journal.json | 14 + package.json | 11 +- pnpm-lock.yaml | 179 +-- src/lib/components/Header.svelte | 12 +- src/lib/components/logo.svelte | 3 +- src/lib/config/zod-schemas.ts | 124 +- src/lib/drizzle.ts | 14 +- .../password/change/+page.server.ts | 25 +- .../(protected)/password/change/+page.svelte | 5 +- src/routes/(app)/+page.svelte | 28 +- src/schema.ts | 146 +- 15 files changed, 2736 insertions(+), 227 deletions(-) create mode 100644 drizzle/0008_complete_manta.sql create mode 100644 drizzle/0009_equal_christian_walker.sql create mode 100644 drizzle/meta/0008_snapshot.json create mode 100644 drizzle/meta/0009_snapshot.json diff --git a/drizzle/0008_complete_manta.sql b/drizzle/0008_complete_manta.sql new file mode 100644 index 0000000..d7ef37c --- /dev/null +++ b/drizzle/0008_complete_manta.sql @@ -0,0 +1,7 @@ +DO $$ BEGIN + CREATE TYPE "type" AS ENUM('game', 'category', 'mechanic', 'publisher', 'designer', 'artist'); +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +ALTER TABLE "external_ids" ALTER COLUMN "type" SET DATA TYPE type; \ No newline at end of file diff --git a/drizzle/0009_equal_christian_walker.sql b/drizzle/0009_equal_christian_walker.sql new file mode 100644 index 0000000..ef25bd1 --- /dev/null +++ b/drizzle/0009_equal_christian_walker.sql @@ -0,0 +1,7 @@ +DO $$ BEGIN + CREATE TYPE "external_id_type" AS ENUM('game', 'category', 'mechanic', 'publisher', 'designer', 'artist'); +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +ALTER TABLE "external_ids" ALTER COLUMN "type" SET DATA TYPE external_id_type; \ No newline at end of file diff --git a/drizzle/meta/0008_snapshot.json b/drizzle/meta/0008_snapshot.json new file mode 100644 index 0000000..1592db1 --- /dev/null +++ b/drizzle/meta/0008_snapshot.json @@ -0,0 +1,1194 @@ +{ + "id": "59566a68-510c-4b15-9ce5-7ee99b685378", + "prevId": "8dc4605d-a330-4ccb-950d-d5f1471d9ab8", + "version": "5", + "dialect": "pg", + "tables": { + "categories": { + "name": "categories", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "categories_to_external_ids": { + "name": "categories_to_external_ids", + "schema": "", + "columns": { + "category_id": { + "name": "category_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "categories_to_external_ids_category_id_categories_id_fk": { + "name": "categories_to_external_ids_category_id_categories_id_fk", + "tableFrom": "categories_to_external_ids", + "tableTo": "categories", + "columnsFrom": [ + "category_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "categories_to_external_ids_external_id_external_ids_id_fk": { + "name": "categories_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "categories_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "categories_to_games": { + "name": "categories_to_games", + "schema": "", + "columns": { + "category_id": { + "name": "category_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "collection_items": { + "name": "collection_items", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "collection_id": { + "name": "collection_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "collection_items_collection_id_collections_id_fk": { + "name": "collection_items_collection_id_collections_id_fk", + "tableFrom": "collection_items", + "tableTo": "collections", + "columnsFrom": [ + "collection_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "collection_items_game_id_games_id_fk": { + "name": "collection_items_game_id_games_id_fk", + "tableFrom": "collection_items", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "collections": { + "name": "collections", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "collections_user_id_users_id_fk": { + "name": "collections_user_id_users_id_fk", + "tableFrom": "collections", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "expansions": { + "name": "expansions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "base_game_id": { + "name": "base_game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "expansions_base_game_id_games_id_fk": { + "name": "expansions_base_game_id_games_id_fk", + "tableFrom": "expansions", + "tableTo": "games", + "columnsFrom": [ + "base_game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "expansions_game_id_games_id_fk": { + "name": "expansions_game_id_games_id_fk", + "tableFrom": "expansions", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "expansions_to_external_ids": { + "name": "expansions_to_external_ids", + "schema": "", + "columns": { + "expansion_id": { + "name": "expansion_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "expansions_to_external_ids_expansion_id_expansions_id_fk": { + "name": "expansions_to_external_ids_expansion_id_expansions_id_fk", + "tableFrom": "expansions_to_external_ids", + "tableTo": "expansions", + "columnsFrom": [ + "expansion_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "expansions_to_external_ids_external_id_external_ids_id_fk": { + "name": "expansions_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "expansions_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "external_ids": { + "name": "external_ids", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "type", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "games": { + "name": "games", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "year_published": { + "name": "year_published", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_players": { + "name": "min_players", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "max_players": { + "name": "max_players", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "playtime": { + "name": "playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_playtime": { + "name": "min_playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "max_playtime": { + "name": "max_playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_age": { + "name": "min_age", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "image_url": { + "name": "image_url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "thumb_url": { + "name": "thumb_url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "url": { + "name": "url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "text_searchable_index": { + "name": "text_searchable_index", + "type": "tsvector", + "primaryKey": false, + "notNull": false + }, + "last_sync_at": { + "name": "last_sync_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": { + "text_searchable_idx": { + "name": "text_searchable_idx", + "columns": [ + "text_searchable_index" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "games_to_external_ids": { + "name": "games_to_external_ids", + "schema": "", + "columns": { + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "games_to_external_ids_game_id_games_id_fk": { + "name": "games_to_external_ids_game_id_games_id_fk", + "tableFrom": "games_to_external_ids", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "games_to_external_ids_external_id_external_ids_id_fk": { + "name": "games_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "games_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "mechanics": { + "name": "mechanics", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "mechanics_to_external_ids": { + "name": "mechanics_to_external_ids", + "schema": "", + "columns": { + "mechanic_id": { + "name": "mechanic_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "mechanics_to_external_ids_mechanic_id_mechanics_id_fk": { + "name": "mechanics_to_external_ids_mechanic_id_mechanics_id_fk", + "tableFrom": "mechanics_to_external_ids", + "tableTo": "mechanics", + "columnsFrom": [ + "mechanic_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mechanics_to_external_ids_external_id_external_ids_id_fk": { + "name": "mechanics_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "mechanics_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "mechanics_to_games": { + "name": "mechanics_to_games", + "schema": "", + "columns": { + "mechanic_id": { + "name": "mechanic_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "publishers": { + "name": "publishers", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "publishers_to_external_ids": { + "name": "publishers_to_external_ids", + "schema": "", + "columns": { + "publisher_id": { + "name": "publisher_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "publishers_to_external_ids_publisher_id_publishers_id_fk": { + "name": "publishers_to_external_ids_publisher_id_publishers_id_fk", + "tableFrom": "publishers_to_external_ids", + "tableTo": "publishers", + "columnsFrom": [ + "publisher_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "publishers_to_external_ids_external_id_external_ids_id_fk": { + "name": "publishers_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "publishers_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "publishers_to_games": { + "name": "publishers_to_games", + "schema": "", + "columns": { + "publisher_id": { + "name": "publisher_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "roles": { + "name": "roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "roles_name_unique": { + "name": "roles_name_unique", + "nullsNotDistinct": false, + "columns": [ + "name" + ] + } + } + }, + "sessions": { + "name": "sessions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "ip_country": { + "name": "ip_country", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "ip_address": { + "name": "ip_address", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "sessions_user_id_users_id_fk": { + "name": "sessions_user_id_users_id_fk", + "tableFrom": "sessions", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "user_roles": { + "name": "user_roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "role_id": { + "name": "role_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "user_roles_user_id_users_id_fk": { + "name": "user_roles_user_id_users_id_fk", + "tableFrom": "user_roles", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_roles_role_id_roles_id_fk": { + "name": "user_roles_role_id_roles_id_fk", + "tableFrom": "user_roles", + "tableTo": "roles", + "columnsFrom": [ + "role_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "username": { + "name": "username", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "hashed_password": { + "name": "hashed_password", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "first_name": { + "name": "first_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "last_name": { + "name": "last_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "verified": { + "name": "verified", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "receive_email": { + "name": "receive_email", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "theme": { + "name": "theme", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "default": "'system'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_username_unique": { + "name": "users_username_unique", + "nullsNotDistinct": false, + "columns": [ + "username" + ] + }, + "users_email_unique": { + "name": "users_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + } + }, + "wishlist_items": { + "name": "wishlist_items", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "wishlist_id": { + "name": "wishlist_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "wishlist_items_wishlist_id_wishlists_id_fk": { + "name": "wishlist_items_wishlist_id_wishlists_id_fk", + "tableFrom": "wishlist_items", + "tableTo": "wishlists", + "columnsFrom": [ + "wishlist_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "wishlist_items_game_id_games_id_fk": { + "name": "wishlist_items_game_id_games_id_fk", + "tableFrom": "wishlist_items", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "wishlists": { + "name": "wishlists", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "wishlists_user_id_users_id_fk": { + "name": "wishlists_user_id_users_id_fk", + "tableFrom": "wishlists", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + } + }, + "enums": { + "type": { + "name": "type", + "values": { + "game": "game", + "category": "category", + "mechanic": "mechanic", + "publisher": "publisher", + "designer": "designer", + "artist": "artist" + } + } + }, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/0009_snapshot.json b/drizzle/meta/0009_snapshot.json new file mode 100644 index 0000000..8b7a36b --- /dev/null +++ b/drizzle/meta/0009_snapshot.json @@ -0,0 +1,1194 @@ +{ + "id": "5d25f562-1d4b-4274-84ea-6d15dcf7fd74", + "prevId": "59566a68-510c-4b15-9ce5-7ee99b685378", + "version": "5", + "dialect": "pg", + "tables": { + "categories": { + "name": "categories", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "categories_to_external_ids": { + "name": "categories_to_external_ids", + "schema": "", + "columns": { + "category_id": { + "name": "category_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "categories_to_external_ids_category_id_categories_id_fk": { + "name": "categories_to_external_ids_category_id_categories_id_fk", + "tableFrom": "categories_to_external_ids", + "tableTo": "categories", + "columnsFrom": [ + "category_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "categories_to_external_ids_external_id_external_ids_id_fk": { + "name": "categories_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "categories_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "categories_to_games": { + "name": "categories_to_games", + "schema": "", + "columns": { + "category_id": { + "name": "category_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "collection_items": { + "name": "collection_items", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "collection_id": { + "name": "collection_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "collection_items_collection_id_collections_id_fk": { + "name": "collection_items_collection_id_collections_id_fk", + "tableFrom": "collection_items", + "tableTo": "collections", + "columnsFrom": [ + "collection_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "collection_items_game_id_games_id_fk": { + "name": "collection_items_game_id_games_id_fk", + "tableFrom": "collection_items", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "collections": { + "name": "collections", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "collections_user_id_users_id_fk": { + "name": "collections_user_id_users_id_fk", + "tableFrom": "collections", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "expansions": { + "name": "expansions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "base_game_id": { + "name": "base_game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "expansions_base_game_id_games_id_fk": { + "name": "expansions_base_game_id_games_id_fk", + "tableFrom": "expansions", + "tableTo": "games", + "columnsFrom": [ + "base_game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "expansions_game_id_games_id_fk": { + "name": "expansions_game_id_games_id_fk", + "tableFrom": "expansions", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "expansions_to_external_ids": { + "name": "expansions_to_external_ids", + "schema": "", + "columns": { + "expansion_id": { + "name": "expansion_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "expansions_to_external_ids_expansion_id_expansions_id_fk": { + "name": "expansions_to_external_ids_expansion_id_expansions_id_fk", + "tableFrom": "expansions_to_external_ids", + "tableTo": "expansions", + "columnsFrom": [ + "expansion_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "expansions_to_external_ids_external_id_external_ids_id_fk": { + "name": "expansions_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "expansions_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "external_ids": { + "name": "external_ids", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "external_id_type", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "games": { + "name": "games", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "year_published": { + "name": "year_published", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_players": { + "name": "min_players", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "max_players": { + "name": "max_players", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "playtime": { + "name": "playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_playtime": { + "name": "min_playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "max_playtime": { + "name": "max_playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_age": { + "name": "min_age", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "image_url": { + "name": "image_url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "thumb_url": { + "name": "thumb_url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "url": { + "name": "url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "text_searchable_index": { + "name": "text_searchable_index", + "type": "tsvector", + "primaryKey": false, + "notNull": false + }, + "last_sync_at": { + "name": "last_sync_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": { + "text_searchable_idx": { + "name": "text_searchable_idx", + "columns": [ + "text_searchable_index" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "games_to_external_ids": { + "name": "games_to_external_ids", + "schema": "", + "columns": { + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "games_to_external_ids_game_id_games_id_fk": { + "name": "games_to_external_ids_game_id_games_id_fk", + "tableFrom": "games_to_external_ids", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "games_to_external_ids_external_id_external_ids_id_fk": { + "name": "games_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "games_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "mechanics": { + "name": "mechanics", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "mechanics_to_external_ids": { + "name": "mechanics_to_external_ids", + "schema": "", + "columns": { + "mechanic_id": { + "name": "mechanic_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "mechanics_to_external_ids_mechanic_id_mechanics_id_fk": { + "name": "mechanics_to_external_ids_mechanic_id_mechanics_id_fk", + "tableFrom": "mechanics_to_external_ids", + "tableTo": "mechanics", + "columnsFrom": [ + "mechanic_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mechanics_to_external_ids_external_id_external_ids_id_fk": { + "name": "mechanics_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "mechanics_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "mechanics_to_games": { + "name": "mechanics_to_games", + "schema": "", + "columns": { + "mechanic_id": { + "name": "mechanic_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "publishers": { + "name": "publishers", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "publishers_to_external_ids": { + "name": "publishers_to_external_ids", + "schema": "", + "columns": { + "publisher_id": { + "name": "publisher_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "publishers_to_external_ids_publisher_id_publishers_id_fk": { + "name": "publishers_to_external_ids_publisher_id_publishers_id_fk", + "tableFrom": "publishers_to_external_ids", + "tableTo": "publishers", + "columnsFrom": [ + "publisher_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "publishers_to_external_ids_external_id_external_ids_id_fk": { + "name": "publishers_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "publishers_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "publishers_to_games": { + "name": "publishers_to_games", + "schema": "", + "columns": { + "publisher_id": { + "name": "publisher_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "roles": { + "name": "roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "roles_name_unique": { + "name": "roles_name_unique", + "nullsNotDistinct": false, + "columns": [ + "name" + ] + } + } + }, + "sessions": { + "name": "sessions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "ip_country": { + "name": "ip_country", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "ip_address": { + "name": "ip_address", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "sessions_user_id_users_id_fk": { + "name": "sessions_user_id_users_id_fk", + "tableFrom": "sessions", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "user_roles": { + "name": "user_roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "role_id": { + "name": "role_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "user_roles_user_id_users_id_fk": { + "name": "user_roles_user_id_users_id_fk", + "tableFrom": "user_roles", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_roles_role_id_roles_id_fk": { + "name": "user_roles_role_id_roles_id_fk", + "tableFrom": "user_roles", + "tableTo": "roles", + "columnsFrom": [ + "role_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "username": { + "name": "username", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "hashed_password": { + "name": "hashed_password", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "first_name": { + "name": "first_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "last_name": { + "name": "last_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "verified": { + "name": "verified", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "receive_email": { + "name": "receive_email", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "theme": { + "name": "theme", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "default": "'system'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_username_unique": { + "name": "users_username_unique", + "nullsNotDistinct": false, + "columns": [ + "username" + ] + }, + "users_email_unique": { + "name": "users_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + } + }, + "wishlist_items": { + "name": "wishlist_items", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "wishlist_id": { + "name": "wishlist_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "wishlist_items_wishlist_id_wishlists_id_fk": { + "name": "wishlist_items_wishlist_id_wishlists_id_fk", + "tableFrom": "wishlist_items", + "tableTo": "wishlists", + "columnsFrom": [ + "wishlist_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "wishlist_items_game_id_games_id_fk": { + "name": "wishlist_items_game_id_games_id_fk", + "tableFrom": "wishlist_items", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "wishlists": { + "name": "wishlists", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "wishlists_user_id_users_id_fk": { + "name": "wishlists_user_id_users_id_fk", + "tableFrom": "wishlists", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + } + }, + "enums": { + "external_id_type": { + "name": "external_id_type", + "values": { + "game": "game", + "category": "category", + "mechanic": "mechanic", + "publisher": "publisher", + "designer": "designer", + "artist": "artist" + } + } + }, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json index 4ea7e65..0705bc5 100644 --- a/drizzle/meta/_journal.json +++ b/drizzle/meta/_journal.json @@ -57,6 +57,20 @@ "when": 1707951501716, "tag": "0007_same_valeria_richards", "breakpoints": true + }, + { + "idx": 8, + "version": "5", + "when": 1708105454143, + "tag": "0008_complete_manta", + "breakpoints": true + }, + { + "idx": 9, + "version": "5", + "when": 1708105890146, + "tag": "0009_equal_christian_walker", + "breakpoints": true } ] } \ No newline at end of file diff --git a/package.json b/package.json index 3f8c3eb..cc732ec 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ }, "devDependencies": { "@melt-ui/pp": "^0.3.0", - "@melt-ui/svelte": "^0.73.0", + "@melt-ui/svelte": "^0.74.0", "@playwright/test": "^1.41.2", "@resvg/resvg-js": "^2.6.0", "@sveltejs/adapter-auto": "^3.1.1", @@ -53,7 +53,7 @@ "prettier": "^3.2.5", "prettier-plugin-svelte": "^3.2.1", "prisma": "^5.9.1", - "sass": "^1.70.0", + "sass": "^1.71.0", "satori": "^0.10.13", "satori-html": "^0.3.2", "svelte": "^4.2.11", @@ -61,7 +61,8 @@ "svelte-meta-tags": "^3.1.0", "svelte-preprocess": "^5.1.3", "svelte-sequential-preprocessor": "^2.0.1", - "sveltekit-flash-message": "^2.4.1", + "sveltekit-flash-message": "^2.4.2", + "sveltekit-rate-limiter": "^0.4.3", "sveltekit-superforms": "^1.13.4", "tailwindcss": "^3.4.1", "ts-node": "^10.9.2", @@ -69,7 +70,7 @@ "tsx": "^4.7.1", "typescript": "^5.3.3", "vite": "^5.1.3", - "vitest": "^1.2.2", + "vitest": "^1.3.0", "zod": "^3.22.4" }, "type": "module", @@ -81,7 +82,7 @@ "@fontsource/fira-mono": "^5.0.8", "@iconify-icons/line-md": "^1.2.26", "@iconify-icons/mdi": "^1.2.47", - "@lucia-auth/adapter-drizzle": "^1.0.1", + "@lucia-auth/adapter-drizzle": "^1.0.2", "@lucia-auth/adapter-prisma": "4.0.0", "@lukeed/uuid": "^2.0.1", "@neondatabase/serverless": "^0.8.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 43ed1d0..9b82459 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,8 +15,8 @@ dependencies: specifier: ^1.2.47 version: 1.2.48 '@lucia-auth/adapter-drizzle': - specifier: ^1.0.1 - version: 1.0.1(lucia@3.0.1) + specifier: ^1.0.2 + version: 1.0.2(lucia@3.0.1) '@lucia-auth/adapter-prisma': specifier: 4.0.0 version: 4.0.0(@prisma/client@5.9.1)(lucia@3.0.1) @@ -132,10 +132,10 @@ dependencies: devDependencies: '@melt-ui/pp': specifier: ^0.3.0 - version: 0.3.0(@melt-ui/svelte@0.73.0)(svelte@4.2.11) + version: 0.3.0(@melt-ui/svelte@0.74.0)(svelte@4.2.11) '@melt-ui/svelte': - specifier: ^0.73.0 - version: 0.73.0(svelte@4.2.11) + specifier: ^0.74.0 + version: 0.74.0(svelte@4.2.11) '@playwright/test': specifier: ^1.41.2 version: 1.41.2 @@ -215,8 +215,8 @@ devDependencies: specifier: ^5.9.1 version: 5.9.1 sass: - specifier: ^1.70.0 - version: 1.70.0 + specifier: ^1.71.0 + version: 1.71.0 satori: specifier: ^0.10.13 version: 0.10.13 @@ -228,19 +228,22 @@ devDependencies: version: 4.2.11 svelte-check: specifier: ^3.6.4 - version: 3.6.4(postcss-load-config@5.0.3)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.11) + version: 3.6.4(postcss-load-config@5.0.3)(postcss@8.4.35)(sass@1.71.0)(svelte@4.2.11) svelte-meta-tags: specifier: ^3.1.0 version: 3.1.0(svelte@4.2.11)(typescript@5.3.3) svelte-preprocess: specifier: ^5.1.3 - version: 5.1.3(postcss-load-config@5.0.3)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.11)(typescript@5.3.3) + version: 5.1.3(postcss-load-config@5.0.3)(postcss@8.4.35)(sass@1.71.0)(svelte@4.2.11)(typescript@5.3.3) svelte-sequential-preprocessor: specifier: ^2.0.1 version: 2.0.1 sveltekit-flash-message: - specifier: ^2.4.1 - version: 2.4.1(@sveltejs/kit@2.5.0)(svelte@4.2.11) + specifier: ^2.4.2 + version: 2.4.2(@sveltejs/kit@2.5.0)(svelte@4.2.11) + sveltekit-rate-limiter: + specifier: ^0.4.3 + version: 0.4.3(@sveltejs/kit@2.5.0) sveltekit-superforms: specifier: ^1.13.4 version: 1.13.4(@sveltejs/kit@2.5.0)(svelte@4.2.11)(zod@3.22.4) @@ -261,10 +264,10 @@ devDependencies: version: 5.3.3 vite: specifier: ^5.1.3 - version: 5.1.3(@types/node@20.11.19)(sass@1.70.0) + version: 5.1.3(@types/node@20.11.19)(sass@1.71.0) vitest: - specifier: ^1.2.2 - version: 1.2.2(@types/node@20.11.19)(sass@1.70.0) + specifier: ^1.3.0 + version: 1.3.0(@types/node@20.11.19)(sass@1.71.0) zod: specifier: ^3.22.4 version: 3.22.4 @@ -1391,19 +1394,11 @@ packages: '@floating-ui/utils': 0.1.6 dev: false - /@floating-ui/dom@1.6.1: - resolution: {integrity: sha512-iA8qE43/H5iGozC3W0YSnVSW42Vh522yyM1gj+BqRwVsTNOyr231PsXDaV04yT39PsO0QL2QpbI/M0ZaLUQgRQ==} - dependencies: - '@floating-ui/core': 1.6.0 - '@floating-ui/utils': 0.2.1 - dev: true - /@floating-ui/dom@1.6.3: resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==} dependencies: '@floating-ui/core': 1.6.0 '@floating-ui/utils': 0.2.1 - dev: false /@floating-ui/utils@0.1.6: resolution: {integrity: sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==} @@ -1644,6 +1639,18 @@ packages: resolution: {integrity: sha512-LUQIfwU9e+Fmutc/DpRTGXSdgYZLBegi4wygCWDSVmUdLTaMHsQyASDiJtREwanwKuQLq0hY76fCJ9J/9I2xOQ==} dependencies: '@swc/helpers': 0.5.6 + dev: false + + /@internationalized/date@3.5.2: + resolution: {integrity: sha512-vo1yOMUt2hzp63IutEaTUxROdvQg1qlMRsbCvbay2AK2Gai7wIgCyK5weEX3nHkiLgo4qCXHijFNC/ILhlRpOQ==} + dependencies: + '@swc/helpers': 0.5.6 + dev: true + + /@isaacs/ttlcache@1.4.1: + resolution: {integrity: sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==} + engines: {node: '>=12'} + dev: true /@jest/schemas@29.6.3: resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} @@ -1690,8 +1697,8 @@ packages: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 - /@lucia-auth/adapter-drizzle@1.0.1(lucia@3.0.1): - resolution: {integrity: sha512-xHgYwVh3ZmccEGsmkYWCALp2GlhCnomrpO5sgABCkIWgHvsmMZuJ5BYfgfaKmed1PDok81Dk6xFbj1tMH/uD6A==} + /@lucia-auth/adapter-drizzle@1.0.2(lucia@3.0.1): + resolution: {integrity: sha512-GT2Mp0NaUZ5O4OAvzoNcX9bGotoxBfADo6mTzIEKKJ+uar3HgtQVn/m5Ogj3I2iMv0YBHWgMmlnkUHXN5xFNow==} peerDependencies: lucia: 3.x dependencies: @@ -1738,14 +1745,14 @@ packages: - supports-color dev: false - /@melt-ui/pp@0.3.0(@melt-ui/svelte@0.73.0)(svelte@4.2.11): + /@melt-ui/pp@0.3.0(@melt-ui/svelte@0.74.0)(svelte@4.2.11): resolution: {integrity: sha512-b07Bdh8l2KcwKVCXOY+SoBw1dk9eWvQfMSi6SoacpRVyVmmfpi0kV4oGt3HYF0tUCB3sEmVicxse50ZzZxEzEA==} engines: {pnpm: '>=8.6.3'} peerDependencies: '@melt-ui/svelte': '>= 0.29.0' svelte: ^3.55.0 || ^4.0.0 || ^5.0.0-next.1 dependencies: - '@melt-ui/svelte': 0.73.0(svelte@4.2.11) + '@melt-ui/svelte': 0.74.0(svelte@4.2.11) estree-walker: 3.0.3 magic-string: 0.30.5 svelte: 4.2.11 @@ -1765,14 +1772,14 @@ packages: svelte: 4.2.11 dev: false - /@melt-ui/svelte@0.73.0(svelte@4.2.11): - resolution: {integrity: sha512-KD9Z+5DDhnZmDUZv1GQ0+LGeXjxl1zwrB8JAwmGeMN6EigTvXMsTPtrFRUYC+TtEjVq82eTlJzuf4C/a88MkjA==} + /@melt-ui/svelte@0.74.0(svelte@4.2.11): + resolution: {integrity: sha512-4rFhTkO34OK5lflvcj13/in1YQ+exsD2A7YSNIYw2iyNeBYFxOgM0n4qH5Y4Tf7vcekkkQ+SEqgiD3XNmVBHzw==} peerDependencies: svelte: '>=3 <5' dependencies: '@floating-ui/core': 1.6.0 - '@floating-ui/dom': 1.6.1 - '@internationalized/date': 3.5.1 + '@floating-ui/dom': 1.6.3 + '@internationalized/date': 3.5.2 dequal: 2.0.3 focus-trap: 7.5.4 nanoid: 5.0.5 @@ -2994,7 +3001,7 @@ packages: sirv: 2.0.4 svelte: 4.2.11 tiny-glob: 0.2.9 - vite: 5.1.3(@types/node@20.11.19)(sass@1.70.0) + vite: 5.1.3(@types/node@20.11.19)(sass@1.71.0) /@sveltejs/vite-plugin-svelte-inspector@2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.11)(vite@5.1.3): resolution: {integrity: sha512-gjr9ZFg1BSlIpfZ4PRewigrvYmHWbDrq2uvvPB1AmTWKuM+dI1JXQSUu2pIrYLb/QncyiIGkFDFKTwJ0XqQZZg==} @@ -3007,7 +3014,7 @@ packages: '@sveltejs/vite-plugin-svelte': 3.0.2(svelte@4.2.11)(vite@5.1.3) debug: 4.3.4 svelte: 4.2.11 - vite: 5.1.3(@types/node@20.11.19)(sass@1.70.0) + vite: 5.1.3(@types/node@20.11.19)(sass@1.71.0) transitivePeerDependencies: - supports-color @@ -3025,7 +3032,7 @@ packages: magic-string: 0.30.5 svelte: 4.2.11 svelte-hmr: 0.15.3(svelte@4.2.11) - vite: 5.1.3(@types/node@20.11.19)(sass@1.70.0) + vite: 5.1.3(@types/node@20.11.19)(sass@1.71.0) vitefu: 0.2.5(vite@5.1.3) transitivePeerDependencies: - supports-color @@ -3264,38 +3271,38 @@ packages: yoga-wasm-web: 0.3.3 dev: false - /@vitest/expect@1.2.2: - resolution: {integrity: sha512-3jpcdPAD7LwHUUiT2pZTj2U82I2Tcgg2oVPvKxhn6mDI2On6tfvPQTjAI4628GUGDZrCm4Zna9iQHm5cEexOAg==} + /@vitest/expect@1.3.0: + resolution: {integrity: sha512-7bWt0vBTZj08B+Ikv70AnLRicohYwFgzNjFqo9SxxqHHxSlUJGSXmCRORhOnRMisiUryKMdvsi1n27Bc6jL9DQ==} dependencies: - '@vitest/spy': 1.2.2 - '@vitest/utils': 1.2.2 + '@vitest/spy': 1.3.0 + '@vitest/utils': 1.3.0 chai: 4.3.10 dev: true - /@vitest/runner@1.2.2: - resolution: {integrity: sha512-JctG7QZ4LSDXr5CsUweFgcpEvrcxOV1Gft7uHrvkQ+fsAVylmWQvnaAr/HDp3LAH1fztGMQZugIheTWjaGzYIg==} + /@vitest/runner@1.3.0: + resolution: {integrity: sha512-1Jb15Vo/Oy7mwZ5bXi7zbgszsdIBNjc4IqP8Jpr/8RdBC4nF1CTzIAn2dxYvpF1nGSseeL39lfLQ2uvs5u1Y9A==} dependencies: - '@vitest/utils': 1.2.2 + '@vitest/utils': 1.3.0 p-limit: 5.0.0 pathe: 1.1.1 dev: true - /@vitest/snapshot@1.2.2: - resolution: {integrity: sha512-SmGY4saEw1+bwE1th6S/cZmPxz/Q4JWsl7LvbQIky2tKE35US4gd0Mjzqfr84/4OD0tikGWaWdMja/nWL5NIPA==} + /@vitest/snapshot@1.3.0: + resolution: {integrity: sha512-swmktcviVVPYx9U4SEQXLV6AEY51Y6bZ14jA2yo6TgMxQ3h+ZYiO0YhAHGJNp0ohCFbPAis1R9kK0cvN6lDPQA==} dependencies: magic-string: 0.30.5 pathe: 1.1.1 pretty-format: 29.7.0 dev: true - /@vitest/spy@1.2.2: - resolution: {integrity: sha512-k9Gcahssw8d7X3pSLq3e3XEu/0L78mUkCjivUqCQeXJm9clfXR/Td8+AP+VC1O6fKPIDLcHDTAmBOINVuv6+7g==} + /@vitest/spy@1.3.0: + resolution: {integrity: sha512-AkCU0ThZunMvblDpPKgjIi025UxR8V7MZ/g/EwmAGpjIujLVV2X6rGYGmxE2D4FJbAy0/ijdROHMWa2M/6JVMw==} dependencies: - tinyspy: 2.2.0 + tinyspy: 2.2.1 dev: true - /@vitest/utils@1.2.2: - resolution: {integrity: sha512-WKITBHLsBHlpjnDQahr+XK6RE7MiAsgrIkr0pGhQ9ygoxBfUeG0lUG5iLlzqjmKSlBv3+j5EGsriBzh+C3Tq9g==} + /@vitest/utils@1.3.0: + resolution: {integrity: sha512-/LibEY/fkaXQufi4GDlQZhikQsPO2entBKtfuyIpr1jV4DpaeasqkeHjhdOhU24vSHshcSuEyVlWdzvv2XmYCw==} dependencies: diff-sequences: 29.6.3 estree-walker: 3.0.3 @@ -4974,6 +4981,10 @@ packages: resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} hasBin: true + /js-tokens@8.0.3: + resolution: {integrity: sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==} + dev: true + /js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -6451,8 +6462,8 @@ packages: mkdirp: 0.5.6 rimraf: 2.7.1 - /sass@1.70.0: - resolution: {integrity: sha512-uUxNQ3zAHeAx5nRFskBnrWzDUJrrvpCPD5FNAoRvTi0WwremlheES3tg+56PaVtCs5QDRX5CBLxxKMDJMEa1WQ==} + /sass@1.71.0: + resolution: {integrity: sha512-HKKIKf49Vkxlrav3F/w6qRuPcmImGVbIXJ2I3Kg0VMA+3Bav+8yE9G5XmP5lMj6nl4OlqbPftGAscNaNu28b8w==} engines: {node: '>=14.0.0'} hasBin: true dependencies: @@ -6712,10 +6723,10 @@ packages: engines: {node: '>=8'} dev: true - /strip-literal@1.3.0: - resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} + /strip-literal@2.0.0: + resolution: {integrity: sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==} dependencies: - acorn: 8.11.2 + js-tokens: 8.0.3 dev: true /strnum@1.0.5: @@ -6753,7 +6764,7 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - /svelte-check@3.6.4(postcss-load-config@5.0.3)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.11): + /svelte-check@3.6.4(postcss-load-config@5.0.3)(postcss@8.4.35)(sass@1.71.0)(svelte@4.2.11): resolution: {integrity: sha512-mY/dqucqm46p72M8yZmn81WPZx9mN6uuw8UVfR3ZKQeLxQg5HDGO3HHm5AZuWZPYNMLJ+TRMn+TeN53HfQ/vsw==} hasBin: true peerDependencies: @@ -6766,7 +6777,7 @@ packages: picocolors: 1.0.0 sade: 1.8.1 svelte: 4.2.11 - svelte-preprocess: 5.1.3(postcss-load-config@5.0.3)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.11)(typescript@5.3.3) + svelte-preprocess: 5.1.3(postcss-load-config@5.0.3)(postcss@8.4.35)(sass@1.71.0)(svelte@4.2.11)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: - '@babel/core' @@ -6837,7 +6848,7 @@ packages: svelte: 4.2.11 dev: true - /svelte-preprocess@5.1.3(postcss-load-config@5.0.3)(postcss@8.4.35)(sass@1.70.0)(svelte@4.2.11)(typescript@5.3.3): + /svelte-preprocess@5.1.3(postcss-load-config@5.0.3)(postcss@8.4.35)(sass@1.71.0)(svelte@4.2.11)(typescript@5.3.3): resolution: {integrity: sha512-xxAkmxGHT+J/GourS5mVJeOXZzne1FR5ljeOUAMXUkfEhkLEllRreXpbl3dIYJlcJRfL1LO1uIAPpBpBfiqGPw==} engines: {node: '>= 16.0.0', pnpm: ^8.0.0} requiresBuild: true @@ -6880,7 +6891,7 @@ packages: magic-string: 0.30.5 postcss: 8.4.35 postcss-load-config: 5.0.3(postcss@8.4.35) - sass: 1.70.0 + sass: 1.71.0 sorcery: 0.11.0 strip-indent: 3.0.0 svelte: 4.2.11 @@ -6922,16 +6933,25 @@ packages: magic-string: 0.30.5 periscopic: 3.1.0 - /sveltekit-flash-message@2.4.1(@sveltejs/kit@2.5.0)(svelte@4.2.11): - resolution: {integrity: sha512-n01N62FkXL6tp3VK3u4eCHKz1RwZVgqEEj63pUG/Pj3caHWkjtTUHKX8GRb14kpt9bkML8t93D/B1l1UorskvA==} + /sveltekit-flash-message@2.4.2(@sveltejs/kit@2.5.0)(svelte@4.2.11): + resolution: {integrity: sha512-iXZSOp8La7kHQuOsXOcjIp7x24J/Ycs2uPoHwtjsbObVCbjgxZrtvjd0XUfA0mYZBp97BtAQ5SW5owRDJCWq6A==} peerDependencies: '@sveltejs/kit': 1.x || 2.x - svelte: 3.x || 4.x + svelte: 3.x || 4.x || >=5.0.0-next.51 dependencies: '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.11)(vite@5.1.3) svelte: 4.2.11 dev: true + /sveltekit-rate-limiter@0.4.3(@sveltejs/kit@2.5.0): + resolution: {integrity: sha512-BKkD2tvgyz5j4Fn1vt0y7FLF0zZ01f9thjWPGDb6fyX3tBXyMrtZ8ISK8M7zjz9Cik/2KrkvFtmldhXF6/hjqw==} + peerDependencies: + '@sveltejs/kit': 1.x || 2.x + dependencies: + '@isaacs/ttlcache': 1.4.1 + '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.11)(vite@5.1.3) + dev: true + /sveltekit-superforms@1.13.4(@sveltejs/kit@2.5.0)(svelte@4.2.11)(zod@3.22.4): resolution: {integrity: sha512-rM2+Ictaw7OAIorCLmvg82orci/mtO9ZouI4emtx8SyYngx9aED+eNZlHPLufgB6D7geL2a+hMSFtM3zmMQixQ==} peerDependencies: @@ -7058,8 +7078,8 @@ packages: engines: {node: '>=14.0.0'} dev: true - /tinyspy@2.2.0: - resolution: {integrity: sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==} + /tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} engines: {node: '>=14.0.0'} dev: true @@ -7278,8 +7298,8 @@ packages: - rollup dev: true - /vite-node@1.2.2(@types/node@20.11.19)(sass@1.70.0): - resolution: {integrity: sha512-1as4rDTgVWJO3n1uHmUYqq7nsFgINQ9u+mRcXpjeOMJUmviqNKjcZB7UfRZrlM7MjYXMKpuWp5oGkjaFLnjawg==} + /vite-node@1.3.0(@types/node@20.11.19)(sass@1.71.0): + resolution: {integrity: sha512-D/oiDVBw75XMnjAXne/4feCkCEwcbr2SU1bjAhCcfI5Bq3VoOHji8/wCPAfUkDIeohJ5nSZ39fNxM3dNZ6OBOA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true dependencies: @@ -7287,7 +7307,7 @@ packages: debug: 4.3.4 pathe: 1.1.1 picocolors: 1.0.0 - vite: 5.1.3(@types/node@20.11.19)(sass@1.70.0) + vite: 5.1.3(@types/node@20.11.19)(sass@1.71.0) transitivePeerDependencies: - '@types/node' - less @@ -7299,7 +7319,7 @@ packages: - terser dev: true - /vite@5.1.3(@types/node@20.11.19)(sass@1.70.0): + /vite@5.1.3(@types/node@20.11.19)(sass@1.71.0): resolution: {integrity: sha512-UfmUD36DKkqhi/F75RrxvPpry+9+tTkrXfMNZD+SboZqBCMsxKtO52XeGzzuh7ioz+Eo/SYDBbdb0Z7vgcDJew==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -7331,7 +7351,7 @@ packages: esbuild: 0.19.12 postcss: 8.4.35 rollup: 4.9.6 - sass: 1.70.0 + sass: 1.71.0 optionalDependencies: fsevents: 2.3.3 @@ -7343,17 +7363,17 @@ packages: vite: optional: true dependencies: - vite: 5.1.3(@types/node@20.11.19)(sass@1.70.0) + vite: 5.1.3(@types/node@20.11.19)(sass@1.71.0) - /vitest@1.2.2(@types/node@20.11.19)(sass@1.70.0): - resolution: {integrity: sha512-d5Ouvrnms3GD9USIK36KG8OZ5bEvKEkITFtnGv56HFaSlbItJuYr7hv2Lkn903+AvRAgSixiamozUVfORUekjw==} + /vitest@1.3.0(@types/node@20.11.19)(sass@1.71.0): + resolution: {integrity: sha512-V9qb276J1jjSx9xb75T2VoYXdO1UKi+qfflY7V7w93jzX7oA/+RtYE6TcifxksxsZvygSSMwu2Uw6di7yqDMwg==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': ^1.0.0 - '@vitest/ui': ^1.0.0 + '@vitest/browser': 1.3.0 + '@vitest/ui': 1.3.0 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -7371,13 +7391,12 @@ packages: optional: true dependencies: '@types/node': 20.11.19 - '@vitest/expect': 1.2.2 - '@vitest/runner': 1.2.2 - '@vitest/snapshot': 1.2.2 - '@vitest/spy': 1.2.2 - '@vitest/utils': 1.2.2 + '@vitest/expect': 1.3.0 + '@vitest/runner': 1.3.0 + '@vitest/snapshot': 1.3.0 + '@vitest/spy': 1.3.0 + '@vitest/utils': 1.3.0 acorn-walk: 8.3.2 - cac: 6.7.14 chai: 4.3.10 debug: 4.3.4 execa: 8.0.1 @@ -7386,11 +7405,11 @@ packages: pathe: 1.1.1 picocolors: 1.0.0 std-env: 3.7.0 - strip-literal: 1.3.0 + strip-literal: 2.0.0 tinybench: 2.5.1 tinypool: 0.8.2 - vite: 5.1.3(@types/node@20.11.19)(sass@1.70.0) - vite-node: 1.2.2(@types/node@20.11.19)(sass@1.70.0) + vite: 5.1.3(@types/node@20.11.19)(sass@1.71.0) + vite-node: 1.3.0(@types/node@20.11.19)(sass@1.71.0) why-is-node-running: 2.2.2 transitivePeerDependencies: - less diff --git a/src/lib/components/Header.svelte b/src/lib/components/Header.svelte index fb6809c..9384909 100644 --- a/src/lib/components/Header.svelte +++ b/src/lib/components/Header.svelte @@ -1,20 +1,20 @@
-
@@ -155,8 +155,4 @@ text-decoration: underline; color: var(--accent-color); } - - .separator { - @apply m-[5px] h-[1px] bg-black; - } diff --git a/src/lib/components/logo.svelte b/src/lib/components/logo.svelte index 4ae7701..81ed441 100644 --- a/src/lib/components/logo.svelte +++ b/src/lib/components/logo.svelte @@ -1,4 +1,5 @@ - + diff --git a/src/lib/config/zod-schemas.ts b/src/lib/config/zod-schemas.ts index 3988d4f..436cf2e 100644 --- a/src/lib/config/zod-schemas.ts +++ b/src/lib/config/zod-schemas.ts @@ -55,18 +55,7 @@ export const signUpSchema = userSchema terms: true }) .superRefine(({ confirm_password, password }, ctx) => { - if (confirm_password !== password) { - // ctx.addIssue({ - // code: 'custom', - // message: 'Password and Confirm Password must match', - // path: ['password'] - // }); - ctx.addIssue({ - code: 'custom', - message: ' Password and Confirm Password must match', - path: ['confirm_password'] - }); - } + refinePasswords(confirm_password, password, ctx); }); export const signInSchema = userSchema.pick({ @@ -77,18 +66,7 @@ export const signInSchema = userSchema.pick({ export const updateUserPasswordSchema = userSchema .pick({ password: true, confirm_password: true }) .superRefine(({ confirm_password, password }, ctx) => { - if (confirm_password !== password) { - ctx.addIssue({ - code: 'custom', - message: 'Password and Confirm Password must match', - path: ['password'] - }); - ctx.addIssue({ - code: 'custom', - message: 'Password and Confirm Password must match', - path: ['confirm_password'] - }); - } + refinePasswords(confirm_password, password, ctx); }); export const changeUserPasswordSchema = z @@ -96,25 +74,91 @@ export const changeUserPasswordSchema = z current_password: z.string({ required_error: 'Current Password is required' }), password: z .string({ required_error: 'Password is required' }) - .trim() - .min(8, { message: 'Password must be at least 8 characters' }) - .max(128, { message: 'Password must be less than 128 characters' }), + .trim(), confirm_password: z .string({ required_error: 'Confirm Password is required' }) .trim() - .min(8, { message: 'Confirm Password must be at least 8 characters' }) }) .superRefine(({ confirm_password, password }, ctx) => { - if (confirm_password !== password) { - ctx.addIssue({ - code: 'custom', - message: 'Password and Confirm Password must match', - path: ['password'] - }); - ctx.addIssue({ - code: 'custom', - message: 'Password and Confirm Password must match', - path: ['confirm_password'] - }); - } + refinePasswords(confirm_password, password, ctx); }); + +const refinePasswords = async function(confirm_password: string, password: string, ctx: z.RefinementCtx) { + comparePasswords(confirm_password, password, ctx); + checkPasswordStrength(password, ctx); +} + +const comparePasswords = async function(confirm_password: string, password: string, ctx: z.RefinementCtx) { + if (confirm_password !== password) { + ctx.addIssue({ + code: 'custom', + message: 'Password and Confirm Password must match', + path: ['confirm_password'] + }); + } +} + +const checkPasswordStrength = async function (password: string, ctx: z.RefinementCtx) { + const minimumLength = password.length < 8; + const maximumLength = password.length > 128; + const containsUppercase = (ch: string) => /[A-Z]/.test(ch); + const containsLowercase = (ch: string) => /[a-z]/.test(ch); + const containsSpecialChar = (ch: string) => + /[`!@#$%^&*()_\-+=\[\]{};':"\\|,.<>\/?~ ]/.test(ch); + let countOfUpperCase = 0, + countOfLowerCase = 0, + countOfNumbers = 0, + countOfSpecialChar = 0; + for (let i = 0; i < password.length; i++) { + const char = password.charAt(i); + if (!isNaN(+char)) countOfNumbers++; + else if (containsUppercase(char)) countOfUpperCase++; + else if (containsLowercase(char)) countOfLowerCase++; + else if (containsSpecialChar(char)) countOfSpecialChar++; + } + + let errors = { + upperCase: { pass: true, message: "At least one upper case." }, + lowerCase: { pass: true, message: "At least one lower case." }, + specialCharacter: { pass: true, message: "At least one special character." }, + totalNumber: { pass: true, message: "At least one number." }, + minimumLength: { pass: true, message: "At least 8 characters." }, + maximumLength: { pass: true, message: "At most 128 characters." }, + }; + + if (countOfLowerCase < 1) { + errors = { ...errors, lowerCase: { ...errors.lowerCase, pass: false } }; + } + if (countOfNumbers < 1) { + errors = { + ...errors, + totalNumber: { ...errors.totalNumber, pass: false }, + }; + } + if (countOfUpperCase < 1) { + errors = { ...errors, upperCase: { ...errors.upperCase, pass: false } }; + } + if (countOfSpecialChar < 1) { + errors = { ...errors, specialCharacter: { ...errors.specialCharacter, pass: false } }; + } + if (minimumLength) { + errors = { ...errors, minimumLength: { ...errors.minimumLength, pass: false } }; + } + if (maximumLength) { + errors = { ...errors, maximumLength: { ...errors.maximumLength, pass: false } }; + } + + + if ( + countOfLowerCase < 1 || + countOfUpperCase < 1 || + countOfSpecialChar < 1 || + countOfNumbers < 1 + ) { + ctx.addIssue({ + code: "custom", + message: JSON.stringify(errors), + path: ["password"] + }); + } +} \ No newline at end of file diff --git a/src/lib/drizzle.ts b/src/lib/drizzle.ts index 23b2b71..ae61e1a 100644 --- a/src/lib/drizzle.ts +++ b/src/lib/drizzle.ts @@ -1,6 +1,12 @@ -import { drizzle } from "drizzle-orm/node-postgres"; +import { drizzle } from 'drizzle-orm/node-postgres'; import pg from 'pg'; -import { DATABASE_USER, DATABASE_PASSWORD, DATABASE_HOST, DATABASE_DB, DATABASE_PORT } from '$env/static/private'; +import { + DATABASE_USER, + DATABASE_PASSWORD, + DATABASE_HOST, + DATABASE_DB, + DATABASE_PORT +} from '$env/static/private'; import * as schema from '../schema'; // create the connection @@ -8,8 +14,8 @@ const pool = new pg.Pool({ user: DATABASE_USER, password: DATABASE_PASSWORD, host: DATABASE_HOST, - port: new Number(DATABASE_PORT).valueOf(), - database: DATABASE_DB, + port: Number(DATABASE_PORT).valueOf(), + database: DATABASE_DB }); const db = drizzle(pool, { schema }); diff --git a/src/routes/(app)/(protected)/password/change/+page.server.ts b/src/routes/(app)/(protected)/password/change/+page.server.ts index 756c098..32df638 100644 --- a/src/routes/(app)/(protected)/password/change/+page.server.ts +++ b/src/routes/(app)/(protected)/password/change/+page.server.ts @@ -1,10 +1,12 @@ import { fail, redirect, type Actions } from "@sveltejs/kit"; -import { message, setError, superValidate } from 'sveltekit-superforms/server'; +import { setError, superValidate } from 'sveltekit-superforms/server'; import { Argon2id } from "oslo/password"; import { changeUserPasswordSchema } from '$lib/config/zod-schemas.js'; import { lucia } from '$lib/server/auth.js'; import type { PageServerLoad } from "./$types"; -import prisma from "$lib/prisma"; +import db from "$lib/drizzle"; +import { eq } from "drizzle-orm"; +import { users } from "../../../../../schema"; export const load: PageServerLoad = async (event) => { const form = await superValidate(event, changeUserPasswordSchema); @@ -41,10 +43,8 @@ export const actions: Actions = { const user = event.locals.user; - const dbUser = await prisma.user.findUnique({ - where: { - id: user.id - } + const dbUser = await db.query.users.findFirst({ + where: eq(users.id, user.id) }); if (!dbUser || !dbUser.hashed_password) { @@ -70,16 +70,11 @@ export const actions: Actions = { } const hashedPassword = await new Argon2id().hash(form.data.password); await lucia.invalidateUserSessions(user.id); - await prisma.user.update({ - where: { - id: user.id - }, - data: { - hashed_password: hashedPassword - } - }); + await db.update(users) + .set({ hashed_password: hashedPassword }) + .where(eq(users.id, user.id)); const session = await lucia.createSession(user.id, { - country: event.locals.session.ip, + country: event.locals.session?.ip, }); const sessionCookie = lucia.createSessionCookie(session.id); return new Response(null, { diff --git a/src/routes/(app)/(protected)/password/change/+page.svelte b/src/routes/(app)/(protected)/password/change/+page.svelte index f7eac31..74fd144 100644 --- a/src/routes/(app)/(protected)/password/change/+page.svelte +++ b/src/routes/(app)/(protected)/password/change/+page.svelte @@ -1,11 +1,10 @@ {$errors.current_password} {/if}
-
+
{#if $errors.password} diff --git a/src/routes/(app)/+page.svelte b/src/routes/(app)/+page.svelte index 9267873..ab93e00 100644 --- a/src/routes/(app)/+page.svelte +++ b/src/routes/(app)/+page.svelte @@ -3,23 +3,37 @@
- \ No newline at end of file diff --git a/src/routes/(app)/(protected)/profile/+page.server.ts b/src/routes/(app)/(protected)/profile/+page.server.ts index 36598b5..d0eba72 100644 --- a/src/routes/(app)/(protected)/profile/+page.server.ts +++ b/src/routes/(app)/(protected)/profile/+page.server.ts @@ -1,9 +1,11 @@ import { fail, type Actions } from '@sveltejs/kit'; +import { eq } from 'drizzle-orm'; import { message, setError, superValidate } from 'sveltekit-superforms/server'; import { redirect } from 'sveltekit-flash-message/server'; import { userSchema } from '$lib/config/zod-schemas'; import type { PageServerLoad } from './$types'; -import prisma from '$lib/prisma'; +import { users } from '../../../../schema'; +import db from '$lib/drizzle'; const profileSchema = userSchema.pick({ firstName: true, @@ -51,17 +53,24 @@ export const actions: Actions = { const user = event.locals.user; - await prisma.user.update({ - where: { - id: user.id - }, - data: { - firstName: form.data.firstName, - lastName: form.data.lastName, + const newUsername = form.data.username; + const existingUser = await db.query.users.findFirst({ + where: eq(users.username, newUsername) + }); + + if (existingUser && existingUser.id !== user.id) { + return setError(form, 'username', 'That username is already taken'); + } + + await db + .update(users) + .set({ + first_name: form.data.firstName, + last_name: form.data.lastName, email: form.data.email, username: form.data.username - } - }); + }) + .where(eq(users.id, user.id)); if (user.email !== form.data.email) { // Send email to confirm new email? diff --git a/src/routes/(app)/(protected)/profile/+page.svelte b/src/routes/(app)/(protected)/profile/+page.svelte index e8ae518..0ef0b12 100644 --- a/src/routes/(app)/(protected)/profile/+page.svelte +++ b/src/routes/(app)/(protected)/profile/+page.svelte @@ -89,6 +89,6 @@ \ No newline at end of file diff --git a/src/routes/(app)/(protected)/wishlist/+page.server.ts b/src/routes/(app)/(protected)/wishlist/+page.server.ts index bdc695d..18e2e29 100644 --- a/src/routes/(app)/(protected)/wishlist/+page.server.ts +++ b/src/routes/(app)/(protected)/wishlist/+page.server.ts @@ -1,7 +1,9 @@ import { error, redirect, type Actions } from '@sveltejs/kit'; import { superValidate } from 'sveltekit-superforms/server'; -import prisma from '$lib/prisma'; import { modifyListGameSchema } from '$lib/config/zod-schemas.js'; +import db from '$lib/drizzle.js'; +import { and, eq } from 'drizzle-orm'; +import { games, wishlist_items, wishlists } from '../../../../schema.js'; export async function load({ params, locals }) { if (!locals.user) { @@ -11,33 +13,31 @@ export async function load({ params, locals }) { console.log('Wishlist load User id', locals.user.id); try { - const wishlist = await prisma.wishlist.findUnique({ - where: { - user_id: locals.user.id - }, - include: { - items: { - include: { - game: { - select: { - id: true, - name: true, - thumb_url: true - } - } - } - } - } + const wishlist = await db.query.wishlists.findFirst({ + where: eq(wishlists.user_id, locals.user.id) }); if (!wishlist) { redirect(302, '/404'); } + const items = await db.query.wishlist_items.findMany({ + where: eq(wishlist_items.wishlist_id, wishlist.id), + with: { + game: { + columns: { + id: true, + name: true, + thumb_url: true + } + } + } + }); + console.log('wishlist', wishlist); return { - items: wishlist?.items + items }; } catch (e) { console.error(e); @@ -56,10 +56,8 @@ export const actions: Actions = { redirect(302, '/login'); } - const game = await prisma.game.findUnique({ - where: { - id: form.data.id - } + const game = await db.query.games.findFirst({ + where: eq(games.id, form.data.id) }); if (!game) { @@ -73,10 +71,8 @@ export const actions: Actions = { } if (game) { - const wishlist = await prisma.wishlist.findUnique({ - where: { - user_id: locals.user.id - } + const wishlist = await db.query.wishlists.findFirst({ + where: eq(wishlists.user_id, locals.user.id) }); if (!wishlist) { @@ -84,11 +80,9 @@ export const actions: Actions = { return error(404, 'Wishlist not found'); } - await prisma.wishlistItem.create({ - data: { + await db.insert(wishlist_items).values({ game_id: game.id, wishlist_id: wishlist.id - } }); } @@ -124,10 +118,8 @@ export const actions: Actions = { redirect(302, '/login'); } - const game = await prisma.game.findUnique({ - where: { - id: form.data.id - } + const game = await db.query.games.findFirst({ + where: eq(games.id, form.data.id) }); if (!game) { @@ -141,10 +133,8 @@ export const actions: Actions = { } if (game) { - const wishlist = await prisma.wishlist.findUnique({ - where: { - user_id: locals.user.id - } + const wishlist = await db.query.wishlists.findFirst({ + where: eq(wishlists.user_id, locals.user.id) }); if (!wishlist) { @@ -152,12 +142,10 @@ export const actions: Actions = { return error(404, 'Wishlist not found'); } - await prisma.wishlistItem.delete({ - where: { - wishlist_id: wishlist.id, - game_id: game.id - } - }); + await db.delete(wishlist_items).where(and( + eq(wishlist_items.wishlist_id, wishlist.id), + eq(wishlist_items.game_id, game.id) + )); } return { diff --git a/src/routes/(auth)/login/+page.server.ts b/src/routes/(auth)/login/+page.server.ts index 0c63cc2..a973a9a 100644 --- a/src/routes/(auth)/login/+page.server.ts +++ b/src/routes/(auth)/login/+page.server.ts @@ -70,14 +70,6 @@ export const actions: Actions = { ip_address: locals.ip }); sessionCookie = lucia.createSessionCookie(session.id); - - await db.insert(collections).values({ - user_id: user.id - }).onDuplicateKeyUpdate({ set: { user_id: sql`user_id` } }); - - await db.insert(wishlists).values({ - user_id: user.id - }).onDuplicateKeyUpdate({ set: { user_id: sql`user_id` } }); } catch (e) { // TODO: need to return error message to the client console.error(e); diff --git a/src/schema.ts b/src/schema.ts index 7736657..15b9013 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -173,6 +173,7 @@ export const collection_items = pgTable('collection_items', { }) .notNull() .references(() => games.id, { onDelete: 'cascade' }), + times_played: integer('times_played').default(0), created_at: timestamp('created_at', { withTimezone: true, mode: 'date', @@ -223,7 +224,7 @@ export const wishlists_relations = relations(wishlists, ({ one }) => ({ user: one(users, { fields: [wishlists.user_id], references: [users.id] - }) + }), })); export const wishlist_items = pgTable('wishlist_items', { From b7d7113262dc59a85c29f9ba56f6dfb5c80880b2 Mon Sep 17 00:00:00 2001 From: Bradley Shellnut Date: Mon, 19 Feb 2024 00:22:05 -0800 Subject: [PATCH 20/34] Updating schema to have more foreign key constraints in line with prisma migration and primary key on join tables. --- drizzle.config.ts | 8 +- drizzle/0011_gigantic_mister_sinister.sql | 97 ++ drizzle/0012_dizzy_lethal_legion.sql | 2 + drizzle/meta/0011_snapshot.json | 1346 +++++++++++++++++ drizzle/meta/0012_snapshot.json | 1346 +++++++++++++++++ drizzle/meta/_journal.json | 14 + src/lib/utils/dbUtils.ts | 102 +- .../(protected)/collection/+page.server.ts | 9 +- src/routes/(auth)/login/+page.server.ts | 13 + src/routes/(auth)/sign-up/+page.server.ts | 4 +- src/schema.ts | 155 +- 11 files changed, 2966 insertions(+), 130 deletions(-) create mode 100644 drizzle/0011_gigantic_mister_sinister.sql create mode 100644 drizzle/0012_dizzy_lethal_legion.sql create mode 100644 drizzle/meta/0011_snapshot.json create mode 100644 drizzle/meta/0012_snapshot.json diff --git a/drizzle.config.ts b/drizzle.config.ts index 3af6c25..45e37e5 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -7,9 +7,13 @@ export default defineConfig({ driver: 'pg', dbCredentials: { host: process.env.DATABASE_HOST || 'localhost', - port: process.env.DATABASE_PORT || 5432, + port: Number(process.env.DATABASE_PORT) || 5432, user: process.env.DATABASE_USER, password: process.env.DATABASE_PASSWORD, database: process.env.DATABASE || 'boredgame' - } + }, + // Print all statements + verbose: true, + // Always as for confirmation + strict: true }); \ No newline at end of file diff --git a/drizzle/0011_gigantic_mister_sinister.sql b/drizzle/0011_gigantic_mister_sinister.sql new file mode 100644 index 0000000..36c84c5 --- /dev/null +++ b/drizzle/0011_gigantic_mister_sinister.sql @@ -0,0 +1,97 @@ +ALTER TABLE "categories_to_external_ids" DROP CONSTRAINT "categories_to_external_ids_category_id_categories_id_fk"; +--> statement-breakpoint +ALTER TABLE "expansions" DROP CONSTRAINT "expansions_base_game_id_games_id_fk"; +--> statement-breakpoint +ALTER TABLE "expansions_to_external_ids" DROP CONSTRAINT "expansions_to_external_ids_expansion_id_expansions_id_fk"; +--> statement-breakpoint +ALTER TABLE "games_to_external_ids" DROP CONSTRAINT "games_to_external_ids_game_id_games_id_fk"; +--> statement-breakpoint +ALTER TABLE "mechanics_to_external_ids" DROP CONSTRAINT "mechanics_to_external_ids_mechanic_id_mechanics_id_fk"; +--> statement-breakpoint +ALTER TABLE "publishers_to_external_ids" DROP CONSTRAINT "publishers_to_external_ids_publisher_id_publishers_id_fk"; +--> statement-breakpoint +ALTER TABLE "categories_to_games" ALTER COLUMN "category_id" SET NOT NULL;--> statement-breakpoint +ALTER TABLE "categories_to_games" ALTER COLUMN "game_id" SET NOT NULL;--> statement-breakpoint +ALTER TABLE "mechanics_to_games" ALTER COLUMN "mechanic_id" SET NOT NULL;--> statement-breakpoint +ALTER TABLE "mechanics_to_games" ALTER COLUMN "game_id" SET NOT NULL;--> statement-breakpoint +ALTER TABLE "publishers_to_games" ALTER COLUMN "publisher_id" SET NOT NULL;--> statement-breakpoint +ALTER TABLE "publishers_to_games" ALTER COLUMN "game_id" SET NOT NULL;--> statement-breakpoint +ALTER TABLE "categories_to_external_ids" ADD CONSTRAINT "categories_to_external_ids_category_id_external_id_pk" PRIMARY KEY("category_id","external_id");--> statement-breakpoint +ALTER TABLE "categories_to_games" ADD CONSTRAINT "categories_to_games_category_id_game_id_pk" PRIMARY KEY("category_id","game_id");--> statement-breakpoint +ALTER TABLE "expansions_to_external_ids" ADD CONSTRAINT "expansions_to_external_ids_expansion_id_external_id_pk" PRIMARY KEY("expansion_id","external_id");--> statement-breakpoint +ALTER TABLE "games_to_external_ids" ADD CONSTRAINT "games_to_external_ids_game_id_external_id_pk" PRIMARY KEY("game_id","external_id");--> statement-breakpoint +ALTER TABLE "mechanics_to_external_ids" ADD CONSTRAINT "mechanics_to_external_ids_mechanic_id_external_id_pk" PRIMARY KEY("mechanic_id","external_id");--> statement-breakpoint +ALTER TABLE "mechanics_to_games" ADD CONSTRAINT "mechanics_to_games_mechanic_id_game_id_pk" PRIMARY KEY("mechanic_id","game_id");--> statement-breakpoint +ALTER TABLE "publishers_to_external_ids" ADD CONSTRAINT "publishers_to_external_ids_publisher_id_external_id_pk" PRIMARY KEY("publisher_id","external_id");--> statement-breakpoint +ALTER TABLE "publishers_to_games" ADD CONSTRAINT "publishers_to_games_publisher_id_game_id_pk" PRIMARY KEY("publisher_id","game_id");--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "categories_to_external_ids" ADD CONSTRAINT "categories_to_external_ids_category_id_categories_id_fk" FOREIGN KEY ("category_id") REFERENCES "categories"("id") ON DELETE restrict ON UPDATE cascade; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "categories_to_games" ADD CONSTRAINT "categories_to_games_category_id_categories_id_fk" FOREIGN KEY ("category_id") REFERENCES "categories"("id") ON DELETE restrict ON UPDATE cascade; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "categories_to_games" ADD CONSTRAINT "categories_to_games_game_id_games_id_fk" FOREIGN KEY ("game_id") REFERENCES "games"("id") ON DELETE restrict ON UPDATE cascade; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "expansions" ADD CONSTRAINT "expansions_base_game_id_games_id_fk" FOREIGN KEY ("base_game_id") REFERENCES "games"("id") ON DELETE restrict ON UPDATE cascade; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "expansions_to_external_ids" ADD CONSTRAINT "expansions_to_external_ids_expansion_id_expansions_id_fk" FOREIGN KEY ("expansion_id") REFERENCES "expansions"("id") ON DELETE restrict ON UPDATE cascade; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "games_to_external_ids" ADD CONSTRAINT "games_to_external_ids_game_id_games_id_fk" FOREIGN KEY ("game_id") REFERENCES "games"("id") ON DELETE restrict ON UPDATE cascade; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "mechanics_to_external_ids" ADD CONSTRAINT "mechanics_to_external_ids_mechanic_id_mechanics_id_fk" FOREIGN KEY ("mechanic_id") REFERENCES "mechanics"("id") ON DELETE restrict ON UPDATE cascade; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "mechanics_to_games" ADD CONSTRAINT "mechanics_to_games_mechanic_id_mechanics_id_fk" FOREIGN KEY ("mechanic_id") REFERENCES "mechanics"("id") ON DELETE restrict ON UPDATE cascade; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "mechanics_to_games" ADD CONSTRAINT "mechanics_to_games_game_id_games_id_fk" FOREIGN KEY ("game_id") REFERENCES "games"("id") ON DELETE restrict ON UPDATE cascade; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "publishers_to_external_ids" ADD CONSTRAINT "publishers_to_external_ids_publisher_id_publishers_id_fk" FOREIGN KEY ("publisher_id") REFERENCES "publishers"("id") ON DELETE restrict ON UPDATE cascade; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "publishers_to_games" ADD CONSTRAINT "publishers_to_games_publisher_id_publishers_id_fk" FOREIGN KEY ("publisher_id") REFERENCES "publishers"("id") ON DELETE restrict ON UPDATE cascade; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "publishers_to_games" ADD CONSTRAINT "publishers_to_games_game_id_games_id_fk" FOREIGN KEY ("game_id") REFERENCES "games"("id") ON DELETE restrict ON UPDATE cascade; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; diff --git a/drizzle/0012_dizzy_lethal_legion.sql b/drizzle/0012_dizzy_lethal_legion.sql new file mode 100644 index 0000000..4764795 --- /dev/null +++ b/drizzle/0012_dizzy_lethal_legion.sql @@ -0,0 +1,2 @@ +ALTER TABLE "users" ALTER COLUMN "created_at" SET DATA TYPE timestamp (6) with time zone;--> statement-breakpoint +ALTER TABLE "users" ALTER COLUMN "updated_at" SET DATA TYPE timestamp (6) with time zone; \ No newline at end of file diff --git a/drizzle/meta/0011_snapshot.json b/drizzle/meta/0011_snapshot.json new file mode 100644 index 0000000..d87bab7 --- /dev/null +++ b/drizzle/meta/0011_snapshot.json @@ -0,0 +1,1346 @@ +{ + "id": "e0ba3399-0ff3-4e9e-921f-3d6617354bc8", + "prevId": "cc27c22a-1208-4b61-b2b1-07f09147fde3", + "version": "5", + "dialect": "pg", + "tables": { + "categories": { + "name": "categories", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "categories_to_external_ids": { + "name": "categories_to_external_ids", + "schema": "", + "columns": { + "category_id": { + "name": "category_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "categories_to_external_ids_category_id_categories_id_fk": { + "name": "categories_to_external_ids_category_id_categories_id_fk", + "tableFrom": "categories_to_external_ids", + "tableTo": "categories", + "columnsFrom": [ + "category_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "categories_to_external_ids_external_id_external_ids_id_fk": { + "name": "categories_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "categories_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "categories_to_external_ids_category_id_external_id_pk": { + "name": "categories_to_external_ids_category_id_external_id_pk", + "columns": [ + "category_id", + "external_id" + ] + } + }, + "uniqueConstraints": {} + }, + "categories_to_games": { + "name": "categories_to_games", + "schema": "", + "columns": { + "category_id": { + "name": "category_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "categories_to_games_category_id_categories_id_fk": { + "name": "categories_to_games_category_id_categories_id_fk", + "tableFrom": "categories_to_games", + "tableTo": "categories", + "columnsFrom": [ + "category_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "categories_to_games_game_id_games_id_fk": { + "name": "categories_to_games_game_id_games_id_fk", + "tableFrom": "categories_to_games", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "categories_to_games_category_id_game_id_pk": { + "name": "categories_to_games_category_id_game_id_pk", + "columns": [ + "category_id", + "game_id" + ] + } + }, + "uniqueConstraints": {} + }, + "collection_items": { + "name": "collection_items", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "collection_id": { + "name": "collection_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "times_played": { + "name": "times_played", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "collection_items_collection_id_collections_id_fk": { + "name": "collection_items_collection_id_collections_id_fk", + "tableFrom": "collection_items", + "tableTo": "collections", + "columnsFrom": [ + "collection_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "collection_items_game_id_games_id_fk": { + "name": "collection_items_game_id_games_id_fk", + "tableFrom": "collection_items", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "collections": { + "name": "collections", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "collections_user_id_users_id_fk": { + "name": "collections_user_id_users_id_fk", + "tableFrom": "collections", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "expansions": { + "name": "expansions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "base_game_id": { + "name": "base_game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "expansions_base_game_id_games_id_fk": { + "name": "expansions_base_game_id_games_id_fk", + "tableFrom": "expansions", + "tableTo": "games", + "columnsFrom": [ + "base_game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "expansions_game_id_games_id_fk": { + "name": "expansions_game_id_games_id_fk", + "tableFrom": "expansions", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "expansions_to_external_ids": { + "name": "expansions_to_external_ids", + "schema": "", + "columns": { + "expansion_id": { + "name": "expansion_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "expansions_to_external_ids_expansion_id_expansions_id_fk": { + "name": "expansions_to_external_ids_expansion_id_expansions_id_fk", + "tableFrom": "expansions_to_external_ids", + "tableTo": "expansions", + "columnsFrom": [ + "expansion_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "expansions_to_external_ids_external_id_external_ids_id_fk": { + "name": "expansions_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "expansions_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "expansions_to_external_ids_expansion_id_external_id_pk": { + "name": "expansions_to_external_ids_expansion_id_external_id_pk", + "columns": [ + "expansion_id", + "external_id" + ] + } + }, + "uniqueConstraints": {} + }, + "external_ids": { + "name": "external_ids", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "external_id_type", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "games": { + "name": "games", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "year_published": { + "name": "year_published", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_players": { + "name": "min_players", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "max_players": { + "name": "max_players", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "playtime": { + "name": "playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_playtime": { + "name": "min_playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "max_playtime": { + "name": "max_playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_age": { + "name": "min_age", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "image_url": { + "name": "image_url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "thumb_url": { + "name": "thumb_url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "url": { + "name": "url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "text_searchable_index": { + "name": "text_searchable_index", + "type": "tsvector", + "primaryKey": false, + "notNull": false + }, + "last_sync_at": { + "name": "last_sync_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": { + "text_searchable_idx": { + "name": "text_searchable_idx", + "columns": [ + "text_searchable_index" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "games_to_external_ids": { + "name": "games_to_external_ids", + "schema": "", + "columns": { + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "games_to_external_ids_game_id_games_id_fk": { + "name": "games_to_external_ids_game_id_games_id_fk", + "tableFrom": "games_to_external_ids", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "games_to_external_ids_external_id_external_ids_id_fk": { + "name": "games_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "games_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "games_to_external_ids_game_id_external_id_pk": { + "name": "games_to_external_ids_game_id_external_id_pk", + "columns": [ + "game_id", + "external_id" + ] + } + }, + "uniqueConstraints": {} + }, + "mechanics": { + "name": "mechanics", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "mechanics_to_external_ids": { + "name": "mechanics_to_external_ids", + "schema": "", + "columns": { + "mechanic_id": { + "name": "mechanic_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "mechanics_to_external_ids_mechanic_id_mechanics_id_fk": { + "name": "mechanics_to_external_ids_mechanic_id_mechanics_id_fk", + "tableFrom": "mechanics_to_external_ids", + "tableTo": "mechanics", + "columnsFrom": [ + "mechanic_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "mechanics_to_external_ids_external_id_external_ids_id_fk": { + "name": "mechanics_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "mechanics_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "mechanics_to_external_ids_mechanic_id_external_id_pk": { + "name": "mechanics_to_external_ids_mechanic_id_external_id_pk", + "columns": [ + "mechanic_id", + "external_id" + ] + } + }, + "uniqueConstraints": {} + }, + "mechanics_to_games": { + "name": "mechanics_to_games", + "schema": "", + "columns": { + "mechanic_id": { + "name": "mechanic_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "mechanics_to_games_mechanic_id_mechanics_id_fk": { + "name": "mechanics_to_games_mechanic_id_mechanics_id_fk", + "tableFrom": "mechanics_to_games", + "tableTo": "mechanics", + "columnsFrom": [ + "mechanic_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "mechanics_to_games_game_id_games_id_fk": { + "name": "mechanics_to_games_game_id_games_id_fk", + "tableFrom": "mechanics_to_games", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "mechanics_to_games_mechanic_id_game_id_pk": { + "name": "mechanics_to_games_mechanic_id_game_id_pk", + "columns": [ + "mechanic_id", + "game_id" + ] + } + }, + "uniqueConstraints": {} + }, + "publishers": { + "name": "publishers", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "publishers_to_external_ids": { + "name": "publishers_to_external_ids", + "schema": "", + "columns": { + "publisher_id": { + "name": "publisher_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "publishers_to_external_ids_publisher_id_publishers_id_fk": { + "name": "publishers_to_external_ids_publisher_id_publishers_id_fk", + "tableFrom": "publishers_to_external_ids", + "tableTo": "publishers", + "columnsFrom": [ + "publisher_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "publishers_to_external_ids_external_id_external_ids_id_fk": { + "name": "publishers_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "publishers_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "publishers_to_external_ids_publisher_id_external_id_pk": { + "name": "publishers_to_external_ids_publisher_id_external_id_pk", + "columns": [ + "publisher_id", + "external_id" + ] + } + }, + "uniqueConstraints": {} + }, + "publishers_to_games": { + "name": "publishers_to_games", + "schema": "", + "columns": { + "publisher_id": { + "name": "publisher_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "publishers_to_games_publisher_id_publishers_id_fk": { + "name": "publishers_to_games_publisher_id_publishers_id_fk", + "tableFrom": "publishers_to_games", + "tableTo": "publishers", + "columnsFrom": [ + "publisher_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "publishers_to_games_game_id_games_id_fk": { + "name": "publishers_to_games_game_id_games_id_fk", + "tableFrom": "publishers_to_games", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "publishers_to_games_publisher_id_game_id_pk": { + "name": "publishers_to_games_publisher_id_game_id_pk", + "columns": [ + "publisher_id", + "game_id" + ] + } + }, + "uniqueConstraints": {} + }, + "roles": { + "name": "roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "roles_name_unique": { + "name": "roles_name_unique", + "nullsNotDistinct": false, + "columns": [ + "name" + ] + } + } + }, + "sessions": { + "name": "sessions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "ip_country": { + "name": "ip_country", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "ip_address": { + "name": "ip_address", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "sessions_user_id_users_id_fk": { + "name": "sessions_user_id_users_id_fk", + "tableFrom": "sessions", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "user_roles": { + "name": "user_roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "role_id": { + "name": "role_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "user_roles_user_id_users_id_fk": { + "name": "user_roles_user_id_users_id_fk", + "tableFrom": "user_roles", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_roles_role_id_roles_id_fk": { + "name": "user_roles_role_id_roles_id_fk", + "tableFrom": "user_roles", + "tableTo": "roles", + "columnsFrom": [ + "role_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "username": { + "name": "username", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "hashed_password": { + "name": "hashed_password", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "first_name": { + "name": "first_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "last_name": { + "name": "last_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "verified": { + "name": "verified", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "receive_email": { + "name": "receive_email", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "theme": { + "name": "theme", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "default": "'system'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_username_unique": { + "name": "users_username_unique", + "nullsNotDistinct": false, + "columns": [ + "username" + ] + }, + "users_email_unique": { + "name": "users_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + } + }, + "wishlist_items": { + "name": "wishlist_items", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "wishlist_id": { + "name": "wishlist_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "wishlist_items_wishlist_id_wishlists_id_fk": { + "name": "wishlist_items_wishlist_id_wishlists_id_fk", + "tableFrom": "wishlist_items", + "tableTo": "wishlists", + "columnsFrom": [ + "wishlist_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "wishlist_items_game_id_games_id_fk": { + "name": "wishlist_items_game_id_games_id_fk", + "tableFrom": "wishlist_items", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "wishlists": { + "name": "wishlists", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "wishlists_user_id_users_id_fk": { + "name": "wishlists_user_id_users_id_fk", + "tableFrom": "wishlists", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + } + }, + "enums": { + "external_id_type": { + "name": "external_id_type", + "values": { + "game": "game", + "category": "category", + "mechanic": "mechanic", + "publisher": "publisher", + "designer": "designer", + "artist": "artist" + } + } + }, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/0012_snapshot.json b/drizzle/meta/0012_snapshot.json new file mode 100644 index 0000000..93d28fa --- /dev/null +++ b/drizzle/meta/0012_snapshot.json @@ -0,0 +1,1346 @@ +{ + "id": "58f18282-0b26-4fee-a68d-08867b5729df", + "prevId": "e0ba3399-0ff3-4e9e-921f-3d6617354bc8", + "version": "5", + "dialect": "pg", + "tables": { + "categories": { + "name": "categories", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "categories_to_external_ids": { + "name": "categories_to_external_ids", + "schema": "", + "columns": { + "category_id": { + "name": "category_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "categories_to_external_ids_category_id_categories_id_fk": { + "name": "categories_to_external_ids_category_id_categories_id_fk", + "tableFrom": "categories_to_external_ids", + "tableTo": "categories", + "columnsFrom": [ + "category_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "categories_to_external_ids_external_id_external_ids_id_fk": { + "name": "categories_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "categories_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "categories_to_external_ids_category_id_external_id_pk": { + "name": "categories_to_external_ids_category_id_external_id_pk", + "columns": [ + "category_id", + "external_id" + ] + } + }, + "uniqueConstraints": {} + }, + "categories_to_games": { + "name": "categories_to_games", + "schema": "", + "columns": { + "category_id": { + "name": "category_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "categories_to_games_category_id_categories_id_fk": { + "name": "categories_to_games_category_id_categories_id_fk", + "tableFrom": "categories_to_games", + "tableTo": "categories", + "columnsFrom": [ + "category_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "categories_to_games_game_id_games_id_fk": { + "name": "categories_to_games_game_id_games_id_fk", + "tableFrom": "categories_to_games", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "categories_to_games_category_id_game_id_pk": { + "name": "categories_to_games_category_id_game_id_pk", + "columns": [ + "category_id", + "game_id" + ] + } + }, + "uniqueConstraints": {} + }, + "collection_items": { + "name": "collection_items", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "collection_id": { + "name": "collection_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "times_played": { + "name": "times_played", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "collection_items_collection_id_collections_id_fk": { + "name": "collection_items_collection_id_collections_id_fk", + "tableFrom": "collection_items", + "tableTo": "collections", + "columnsFrom": [ + "collection_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "collection_items_game_id_games_id_fk": { + "name": "collection_items_game_id_games_id_fk", + "tableFrom": "collection_items", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "collections": { + "name": "collections", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "collections_user_id_users_id_fk": { + "name": "collections_user_id_users_id_fk", + "tableFrom": "collections", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "expansions": { + "name": "expansions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "base_game_id": { + "name": "base_game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "expansions_base_game_id_games_id_fk": { + "name": "expansions_base_game_id_games_id_fk", + "tableFrom": "expansions", + "tableTo": "games", + "columnsFrom": [ + "base_game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "expansions_game_id_games_id_fk": { + "name": "expansions_game_id_games_id_fk", + "tableFrom": "expansions", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "expansions_to_external_ids": { + "name": "expansions_to_external_ids", + "schema": "", + "columns": { + "expansion_id": { + "name": "expansion_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "expansions_to_external_ids_expansion_id_expansions_id_fk": { + "name": "expansions_to_external_ids_expansion_id_expansions_id_fk", + "tableFrom": "expansions_to_external_ids", + "tableTo": "expansions", + "columnsFrom": [ + "expansion_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "expansions_to_external_ids_external_id_external_ids_id_fk": { + "name": "expansions_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "expansions_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "expansions_to_external_ids_expansion_id_external_id_pk": { + "name": "expansions_to_external_ids_expansion_id_external_id_pk", + "columns": [ + "expansion_id", + "external_id" + ] + } + }, + "uniqueConstraints": {} + }, + "external_ids": { + "name": "external_ids", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "external_id_type", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "games": { + "name": "games", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "year_published": { + "name": "year_published", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_players": { + "name": "min_players", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "max_players": { + "name": "max_players", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "playtime": { + "name": "playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_playtime": { + "name": "min_playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "max_playtime": { + "name": "max_playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_age": { + "name": "min_age", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "image_url": { + "name": "image_url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "thumb_url": { + "name": "thumb_url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "url": { + "name": "url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "text_searchable_index": { + "name": "text_searchable_index", + "type": "tsvector", + "primaryKey": false, + "notNull": false + }, + "last_sync_at": { + "name": "last_sync_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": { + "text_searchable_idx": { + "name": "text_searchable_idx", + "columns": [ + "text_searchable_index" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "games_to_external_ids": { + "name": "games_to_external_ids", + "schema": "", + "columns": { + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "games_to_external_ids_game_id_games_id_fk": { + "name": "games_to_external_ids_game_id_games_id_fk", + "tableFrom": "games_to_external_ids", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "games_to_external_ids_external_id_external_ids_id_fk": { + "name": "games_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "games_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "games_to_external_ids_game_id_external_id_pk": { + "name": "games_to_external_ids_game_id_external_id_pk", + "columns": [ + "game_id", + "external_id" + ] + } + }, + "uniqueConstraints": {} + }, + "mechanics": { + "name": "mechanics", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "mechanics_to_external_ids": { + "name": "mechanics_to_external_ids", + "schema": "", + "columns": { + "mechanic_id": { + "name": "mechanic_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "mechanics_to_external_ids_mechanic_id_mechanics_id_fk": { + "name": "mechanics_to_external_ids_mechanic_id_mechanics_id_fk", + "tableFrom": "mechanics_to_external_ids", + "tableTo": "mechanics", + "columnsFrom": [ + "mechanic_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "mechanics_to_external_ids_external_id_external_ids_id_fk": { + "name": "mechanics_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "mechanics_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "mechanics_to_external_ids_mechanic_id_external_id_pk": { + "name": "mechanics_to_external_ids_mechanic_id_external_id_pk", + "columns": [ + "mechanic_id", + "external_id" + ] + } + }, + "uniqueConstraints": {} + }, + "mechanics_to_games": { + "name": "mechanics_to_games", + "schema": "", + "columns": { + "mechanic_id": { + "name": "mechanic_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "mechanics_to_games_mechanic_id_mechanics_id_fk": { + "name": "mechanics_to_games_mechanic_id_mechanics_id_fk", + "tableFrom": "mechanics_to_games", + "tableTo": "mechanics", + "columnsFrom": [ + "mechanic_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "mechanics_to_games_game_id_games_id_fk": { + "name": "mechanics_to_games_game_id_games_id_fk", + "tableFrom": "mechanics_to_games", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "mechanics_to_games_mechanic_id_game_id_pk": { + "name": "mechanics_to_games_mechanic_id_game_id_pk", + "columns": [ + "mechanic_id", + "game_id" + ] + } + }, + "uniqueConstraints": {} + }, + "publishers": { + "name": "publishers", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "publishers_to_external_ids": { + "name": "publishers_to_external_ids", + "schema": "", + "columns": { + "publisher_id": { + "name": "publisher_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "publishers_to_external_ids_publisher_id_publishers_id_fk": { + "name": "publishers_to_external_ids_publisher_id_publishers_id_fk", + "tableFrom": "publishers_to_external_ids", + "tableTo": "publishers", + "columnsFrom": [ + "publisher_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "publishers_to_external_ids_external_id_external_ids_id_fk": { + "name": "publishers_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "publishers_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "publishers_to_external_ids_publisher_id_external_id_pk": { + "name": "publishers_to_external_ids_publisher_id_external_id_pk", + "columns": [ + "publisher_id", + "external_id" + ] + } + }, + "uniqueConstraints": {} + }, + "publishers_to_games": { + "name": "publishers_to_games", + "schema": "", + "columns": { + "publisher_id": { + "name": "publisher_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "publishers_to_games_publisher_id_publishers_id_fk": { + "name": "publishers_to_games_publisher_id_publishers_id_fk", + "tableFrom": "publishers_to_games", + "tableTo": "publishers", + "columnsFrom": [ + "publisher_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "publishers_to_games_game_id_games_id_fk": { + "name": "publishers_to_games_game_id_games_id_fk", + "tableFrom": "publishers_to_games", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "publishers_to_games_publisher_id_game_id_pk": { + "name": "publishers_to_games_publisher_id_game_id_pk", + "columns": [ + "publisher_id", + "game_id" + ] + } + }, + "uniqueConstraints": {} + }, + "roles": { + "name": "roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "roles_name_unique": { + "name": "roles_name_unique", + "nullsNotDistinct": false, + "columns": [ + "name" + ] + } + } + }, + "sessions": { + "name": "sessions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "ip_country": { + "name": "ip_country", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "ip_address": { + "name": "ip_address", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "sessions_user_id_users_id_fk": { + "name": "sessions_user_id_users_id_fk", + "tableFrom": "sessions", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "user_roles": { + "name": "user_roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "role_id": { + "name": "role_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "user_roles_user_id_users_id_fk": { + "name": "user_roles_user_id_users_id_fk", + "tableFrom": "user_roles", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_roles_role_id_roles_id_fk": { + "name": "user_roles_role_id_roles_id_fk", + "tableFrom": "user_roles", + "tableTo": "roles", + "columnsFrom": [ + "role_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "username": { + "name": "username", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "hashed_password": { + "name": "hashed_password", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "first_name": { + "name": "first_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "last_name": { + "name": "last_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "verified": { + "name": "verified", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "receive_email": { + "name": "receive_email", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "theme": { + "name": "theme", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "default": "'system'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_username_unique": { + "name": "users_username_unique", + "nullsNotDistinct": false, + "columns": [ + "username" + ] + }, + "users_email_unique": { + "name": "users_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + } + }, + "wishlist_items": { + "name": "wishlist_items", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "wishlist_id": { + "name": "wishlist_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "wishlist_items_wishlist_id_wishlists_id_fk": { + "name": "wishlist_items_wishlist_id_wishlists_id_fk", + "tableFrom": "wishlist_items", + "tableTo": "wishlists", + "columnsFrom": [ + "wishlist_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "wishlist_items_game_id_games_id_fk": { + "name": "wishlist_items_game_id_games_id_fk", + "tableFrom": "wishlist_items", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "wishlists": { + "name": "wishlists", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "wishlists_user_id_users_id_fk": { + "name": "wishlists_user_id_users_id_fk", + "tableFrom": "wishlists", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + } + }, + "enums": { + "external_id_type": { + "name": "external_id_type", + "values": { + "game": "game", + "category": "category", + "mechanic": "mechanic", + "publisher": "publisher", + "designer": "designer", + "artist": "artist" + } + } + }, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json index 3ea473e..d2134c5 100644 --- a/drizzle/meta/_journal.json +++ b/drizzle/meta/_journal.json @@ -78,6 +78,20 @@ "when": 1708243232524, "tag": "0010_flat_mister_sinister", "breakpoints": true + }, + { + "idx": 11, + "version": "5", + "when": 1708330668971, + "tag": "0011_gigantic_mister_sinister", + "breakpoints": true + }, + { + "idx": 12, + "version": "5", + "when": 1708330799655, + "tag": "0012_dizzy_lethal_legion", + "breakpoints": true } ] } \ No newline at end of file diff --git a/src/lib/utils/dbUtils.ts b/src/lib/utils/dbUtils.ts index 629f592..6619824 100644 --- a/src/lib/utils/dbUtils.ts +++ b/src/lib/utils/dbUtils.ts @@ -1,103 +1,39 @@ import type { Game } from '@prisma/client'; import kebabCase from 'just-kebab-case'; import type { BggLinkDto } from 'boardgamegeekclient/dist/esm/dto/concrete/subdto'; -import prisma from '$lib/prisma'; import { mapAPIGameToBoredGame } from './gameMapper'; import db from '$lib/drizzle'; -import { games } from '../../schema'; +import { externalIds, games, publishersToExternalIds, type Publishers, publishers } from '../../schema'; import { eq, sql } from 'drizzle-orm'; +import { error } from '@sveltejs/kit'; -export async function createArtist(locals: App.Locals, externalArtist: BggLinkDto) { - try { - let dbArtist = await prisma.artist.findFirst({ - where: { - external_id: externalArtist.id - }, - select: { - id: true, - name: true, - slug: true, - external_id: true - } - }); - if (dbArtist) { - console.log('Artist already exists', dbArtist.name); - return dbArtist; - } - console.log('Creating artist', JSON.stringify(externalArtist, null, 2)); - let artist = await prisma.artist.create({ - data: { - name: externalArtist.value, - external_id: externalArtist.id, - slug: kebabCase(externalArtist.value) - }, - select: { - id: true, - name: true, - slug: true, - external_id: true - } - }); - - console.log('Created artist', JSON.stringify(artist, null, 2)); - return artist; - } catch (e) { - console.error(e); - throw new Error('Something went wrong creating Artist'); +export async function createPublisher(locals: App.Locals, publisher: Publishers, externalId: string) { + if (!publisher || !externalId || externalId === '') { + error(400, 'Invalid Request'); } -} -export async function createDesigner(locals: App.Locals, externalDesigner: BggLinkDto) { try { - let dbDesigner = await prisma.designer.findFirst({ - where: { - external_id: externalDesigner.id - }, - select: { - id: true, - name: true, - slug: true, - external_id: true - } + let dbExternalId = await db.query.externalIds.findFirst({ + where: eq(externalIds.id, externalId), }); - if (dbDesigner) { - console.log('Designer already exists', dbDesigner.name); - return dbDesigner; + + if (dbExternalId) { + const dbPublisher = await db.select().from(publishers).leftJoin(publishersToExternalIds, eq(publishersToExternalIds.externalId, externalId)); } - console.log('Creating designer', JSON.stringify(externalDesigner, null, 2)); - let designer = await prisma.designer.create({ - data: { - name: externalDesigner.value, - external_id: externalDesigner.id, - slug: kebabCase(externalDesigner.value) - }, - select: { + let dbPublisher = await db.query.publishers.findFirst({ + where: eq(publishers.external_id, externalPublisher.id), + columns: { id: true, name: true, slug: true, external_id: true - } - }); - - console.log('Created designer', JSON.stringify(designer, null, 2)); - return designer; - } catch (e) { - console.error(e); - throw new Error('Something went wrong creating Designer'); - } -} - -export async function createPublisher(locals: App.Locals, externalPublisher: BggLinkDto) { - try { - let dbPublisher = await prisma.publisher.findFirst({ - where: { - external_id: externalPublisher.id }, - select: { - id: true, - name: true, - slug: true, - external_id: true + with: { + publishersToExternalIds: { + columns: { + externalId: true + } + } } }); if (dbPublisher) { diff --git a/src/routes/(app)/(protected)/collection/+page.server.ts b/src/routes/(app)/(protected)/collection/+page.server.ts index 73c4be2..da7449a 100644 --- a/src/routes/(app)/(protected)/collection/+page.server.ts +++ b/src/routes/(app)/(protected)/collection/+page.server.ts @@ -98,7 +98,6 @@ export const load: PageServerLoad = async ({ fetch, url, locals }) => { export const actions: Actions = { // Add game to a wishlist add: async (event) => { - const { params, locals, request } = event; const form = await superValidate(event, modifyListGameSchema); if (!event.locals.user) { @@ -145,14 +144,14 @@ export const actions: Actions = { } }, // Create new wishlist - create: async ({ params, locals, request }) => { + create: async ({ locals }) => { if (!locals.user) { throw fail(401); } return error(405, 'Method not allowed'); }, // Delete a wishlist - delete: async ({ params, locals, request }) => { + delete: async ({ locals }) => { if (!locals.user) { throw fail(401); } @@ -160,14 +159,14 @@ export const actions: Actions = { }, // Remove game from a wishlist remove: async (event) => { - const { params, locals, request } = event; + const { locals } = event; const form = await superValidate(event, modifyListGameSchema); if (!locals.user) { throw fail(401); } - let game = await db.query.games.findFirst({ + const game = await db.query.games.findFirst({ where: eq(games.id, form.data.id) }); diff --git a/src/routes/(auth)/login/+page.server.ts b/src/routes/(auth)/login/+page.server.ts index a973a9a..81f9155 100644 --- a/src/routes/(auth)/login/+page.server.ts +++ b/src/routes/(auth)/login/+page.server.ts @@ -63,6 +63,19 @@ export const actions: Actions = { return setError(form, '', 'Your username or password is incorrect.'); } + await db + .insert(collections) + .values({ + user_id: user.id + }) + .onConflictDoNothing(); + await db + .insert(wishlists) + .values({ + user_id: user.id + }) + .onConflictDoNothing(); + console.log('ip', locals.ip); console.log('country', locals.country); session = await lucia.createSession(user.id, { diff --git a/src/routes/(auth)/sign-up/+page.server.ts b/src/routes/(auth)/sign-up/+page.server.ts index 74f4992..19027fe 100644 --- a/src/routes/(auth)/sign-up/+page.server.ts +++ b/src/routes/(auth)/sign-up/+page.server.ts @@ -82,8 +82,8 @@ export const actions: Actions = { try { session = await lucia.createSession(user[0].id, { - ip_country: event.locals.session?.ipCountry, - ip_address: event.locals.session?.ipAddress + ip_country: event.locals.ip, + ip_address: event.locals.country }); sessionCookie = lucia.createSessionCookie(session.id); } catch (e: any) { diff --git a/src/schema.ts b/src/schema.ts index 15b9013..2f3845f 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -7,7 +7,8 @@ import { integer, text, index, - pgEnum + pgEnum, + primaryKey } from 'drizzle-orm/pg-core'; import { nanoid } from 'nanoid'; import { tsvector } from './tsVector'; @@ -40,8 +41,16 @@ export const users = pgTable('users', { theme: varchar('theme', { length: 255 }).default('system'), - created_at: timestamp('created_at').default(sql`now()`), - updated_at: timestamp('updated_at').default(sql`now()`) + created_at: timestamp('created_at', { + withTimezone: true, + mode: 'date', + precision: 6 + }).default(sql`now()`), + updated_at: timestamp('updated_at', { + withTimezone: true, + mode: 'date', + precision: 6 + }).default(sql`now()`) }); export const user_relations = relations(users, ({ many }) => ({ @@ -348,18 +357,28 @@ export const games = pgTable( export type Games = InferSelectModel; -export const gamesToExternalIds = pgTable('games_to_external_ids', { - gameId: varchar('game_id', { - length: 255 - }) - .notNull() - .references(() => games.id, { onDelete: 'cascade' }), - externalId: varchar('external_id', { - length: 255 - }) - .notNull() - .references(() => externalIds.id, { onDelete: 'cascade' }) -}); +export const gamesToExternalIds = pgTable( + 'games_to_external_ids', + { + gameId: varchar('game_id', { + length: 255 + }) + .notNull() + .references(() => games.id, { onDelete: 'restrict', onUpdate: 'cascade' }), + externalId: varchar('external_id', { + length: 255 + }) + .notNull() + .references(() => externalIds.id, { onDelete: 'restrict', onUpdate: 'cascade' }) + }, + (table) => { + return { + gamesToExternalIdsPkey: primaryKey({ + columns: [table.gameId, table.externalId] + }) + }; + } +); export const gameRelations = relations(games, ({ many }) => ({ categories_to_games: many(categories_to_games), @@ -378,12 +397,12 @@ export const expansions = pgTable('expansions', { length: 255 }) .notNull() - .references(() => games.id, { onDelete: 'cascade' }), + .references(() => games.id, { onDelete: 'restrict', onUpdate: 'cascade' }), game_id: varchar('game_id', { length: 255 }) .notNull() - .references(() => games.id, { onDelete: 'cascade' }), + .references(() => games.id, { onDelete: 'restrict', onUpdate: 'cascade' }), created_at: timestamp('created_at', { withTimezone: true, mode: 'date', @@ -396,18 +415,28 @@ export const expansions = pgTable('expansions', { }).default(sql`now()`) }); -export const expansionsToExternalIds = pgTable('expansions_to_external_ids', { - expansionId: varchar('expansion_id', { - length: 255 - }) - .notNull() - .references(() => expansions.id, { onDelete: 'cascade' }), - externalId: varchar('external_id', { - length: 255 - }) - .notNull() - .references(() => externalIds.id, { onDelete: 'cascade' }) -}); +export const expansionsToExternalIds = pgTable( + 'expansions_to_external_ids', + { + expansionId: varchar('expansion_id', { + length: 255 + }) + .notNull() + .references(() => expansions.id, { onDelete: 'restrict', onUpdate: 'cascade' }), + externalId: varchar('external_id', { + length: 255 + }) + .notNull() + .references(() => externalIds.id, { onDelete: 'restrict', onUpdate: 'cascade' }) + }, + (table) => { + return { + expansionsToExternalIdsPkey: primaryKey({ + columns: [table.expansionId, table.externalId] + }) + }; + } +); export const expansion_relations = relations(expansions, ({ one, many }) => ({ baseGame: one(games, { @@ -446,17 +475,25 @@ export const publishers = pgTable('publishers', { }).default(sql`now()`) }); +export type Publishers = InferSelectModel; + export const publishersToExternalIds = pgTable('publishers_to_external_ids', { publisherId: varchar('publisher_id', { length: 255 }) .notNull() - .references(() => publishers.id, { onDelete: 'cascade' }), + .references(() => publishers.id, { onDelete: 'restrict', onUpdate: 'cascade' }), externalId: varchar('external_id', { length: 255 }) .notNull() - .references(() => externalIds.id, { onDelete: 'cascade' }) + .references(() => externalIds.id, { onDelete: 'restrict', onUpdate: 'cascade' }) +}, (table) => { + return { + publishersToExternalIdsPkey: primaryKey({ + columns: [table.publisherId, table.externalId] + }) + } }); export const publishers_relations = relations(publishers, ({ many }) => ({ @@ -494,21 +531,37 @@ export const categoriesToExternalIds = pgTable('categories_to_external_ids', { length: 255 }) .notNull() - .references(() => categories.id, { onDelete: 'cascade' }), + .references(() => categories.id, { onDelete: 'restrict', onUpdate: 'cascade' }), externalId: varchar('external_id', { length: 255 }) .notNull() - .references(() => externalIds.id, { onDelete: 'cascade' }) + .references(() => externalIds.id, { onDelete: 'restrict', onUpdate: 'cascade' }) +}, (table) => { + return { + categoriesToExternalIdsPkey: primaryKey({ + columns: [table.categoryId, table.externalId] + }) + } }); export const categories_to_games = pgTable('categories_to_games', { category_id: varchar('category_id', { length: 255 - }), + }) + .notNull() + .references(() => categories.id, { onDelete: 'restrict', onUpdate: 'cascade' }), game_id: varchar('game_id', { length: 255 }) + .notNull() + .references(() => games.id, { onDelete: 'restrict', onUpdate: 'cascade' }) +}, (table) => { + return { + categoriesToGamesPkey: primaryKey({ + columns: [table.category_id, table.game_id] + }) + } }); export const categories_to_games_relations = relations(categories_to_games, ({ one }) => ({ @@ -557,12 +610,18 @@ export const mechanicsToExternalIds = pgTable('mechanics_to_external_ids', { length: 255 }) .notNull() - .references(() => mechanics.id, { onDelete: 'cascade' }), + .references(() => mechanics.id, { onDelete: 'restrict', onUpdate: 'cascade' }), externalId: varchar('external_id', { length: 255 }) .notNull() - .references(() => externalIds.id, { onDelete: 'cascade' }) + .references(() => externalIds.id, { onDelete: 'restrict', onUpdate: 'cascade' }) +}, (table) => { + return { + mechanicsToExternalIdsPkey: primaryKey({ + columns: [table.mechanicId, table.externalId] + }) + } }); export const mechanic_relations = relations(mechanics, ({ many }) => ({ @@ -573,10 +632,20 @@ export const mechanic_relations = relations(mechanics, ({ many }) => ({ export const mechanics_to_games = pgTable('mechanics_to_games', { mechanic_id: varchar('mechanic_id', { length: 255 - }), + }) + .notNull() + .references(() => mechanics.id, { onDelete: 'restrict', onUpdate: 'cascade' }), game_id: varchar('game_id', { length: 255 }) + .notNull() + .references(() => games.id, { onDelete: 'restrict', onUpdate: 'cascade' }) +}, (table) => { + return { + mechanicsToGamesPkey: primaryKey({ + columns: [table.mechanic_id, table.game_id] + }) + } }); export const mechanics_to_games_relations = relations(mechanics_to_games, ({ one }) => ({ @@ -593,10 +662,20 @@ export const mechanics_to_games_relations = relations(mechanics_to_games, ({ one export const publishers_to_games = pgTable('publishers_to_games', { publisher_id: varchar('publisher_id', { length: 255 - }), + }) + .notNull() + .references(() => publishers.id, { onDelete: 'restrict', onUpdate: 'cascade' }), game_id: varchar('game_id', { length: 255 }) + .notNull() + .references(() => games.id, { onDelete: 'restrict', onUpdate: 'cascade' }) +}, (table) => { + return { + publishersToGamesPkey: primaryKey({ + columns: [table.publisher_id, table.game_id] + }) + } }); export const publishers_to_games_relations = relations(publishers_to_games, ({ one }) => ({ From c472f43b9e43d48d18092b4db80f4630a228310b Mon Sep 17 00:00:00 2001 From: Bradley Shellnut Date: Tue, 20 Feb 2024 17:47:37 -0800 Subject: [PATCH 21/34] Removing external id from some schemas, creating APIs for different schemas, and creating DB utils for the schemas. --- drizzle/0013_clever_monster_badoon.sql | 3 + drizzle/0014_organic_morlocks.sql | 1 + drizzle/meta/0013_snapshot.json | 1328 ++++++++++++++++++++ drizzle/meta/0014_snapshot.json | 1271 +++++++++++++++++++ drizzle/meta/_journal.json | 14 + package.json | 8 +- pnpm-lock.yaml | 926 +++++++------- src/lib/utils/db/categoryUtils.ts | 77 ++ src/lib/utils/db/expansionUtils.ts | 178 +++ src/lib/utils/db/gameUtils.ts | 422 +++++++ src/lib/utils/db/mechanicUtils.ts | 77 ++ src/lib/utils/db/publisherUtils.ts | 125 ++ src/lib/utils/dbUtils.ts | 415 ------ src/routes/(app)/game/[id]/+page.server.ts | 14 +- src/routes/(app)/search/+page.server.ts | 2 +- src/routes/api/publisher/+server.ts | 21 + src/routes/api/publisher/[id]/+server.ts | 19 + src/schema.ts | 45 +- 18 files changed, 4053 insertions(+), 893 deletions(-) create mode 100644 drizzle/0013_clever_monster_badoon.sql create mode 100644 drizzle/0014_organic_morlocks.sql create mode 100644 drizzle/meta/0013_snapshot.json create mode 100644 drizzle/meta/0014_snapshot.json create mode 100644 src/lib/utils/db/categoryUtils.ts create mode 100644 src/lib/utils/db/expansionUtils.ts create mode 100644 src/lib/utils/db/gameUtils.ts create mode 100644 src/lib/utils/db/mechanicUtils.ts create mode 100644 src/lib/utils/db/publisherUtils.ts delete mode 100644 src/lib/utils/dbUtils.ts create mode 100644 src/routes/api/publisher/+server.ts create mode 100644 src/routes/api/publisher/[id]/+server.ts diff --git a/drizzle/0013_clever_monster_badoon.sql b/drizzle/0013_clever_monster_badoon.sql new file mode 100644 index 0000000..334a5e4 --- /dev/null +++ b/drizzle/0013_clever_monster_badoon.sql @@ -0,0 +1,3 @@ +ALTER TABLE "categories" DROP COLUMN IF EXISTS "external_id";--> statement-breakpoint +ALTER TABLE "mechanics" DROP COLUMN IF EXISTS "external_id";--> statement-breakpoint +ALTER TABLE "publishers" DROP COLUMN IF EXISTS "external_id"; \ No newline at end of file diff --git a/drizzle/0014_organic_morlocks.sql b/drizzle/0014_organic_morlocks.sql new file mode 100644 index 0000000..c0b6604 --- /dev/null +++ b/drizzle/0014_organic_morlocks.sql @@ -0,0 +1 @@ +DROP TABLE "expansions_to_external_ids"; \ No newline at end of file diff --git a/drizzle/meta/0013_snapshot.json b/drizzle/meta/0013_snapshot.json new file mode 100644 index 0000000..6f8cea3 --- /dev/null +++ b/drizzle/meta/0013_snapshot.json @@ -0,0 +1,1328 @@ +{ + "id": "453ae1fd-7b1f-4256-8323-cdb2da05902a", + "prevId": "58f18282-0b26-4fee-a68d-08867b5729df", + "version": "5", + "dialect": "pg", + "tables": { + "categories": { + "name": "categories", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "categories_to_external_ids": { + "name": "categories_to_external_ids", + "schema": "", + "columns": { + "category_id": { + "name": "category_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "categories_to_external_ids_category_id_categories_id_fk": { + "name": "categories_to_external_ids_category_id_categories_id_fk", + "tableFrom": "categories_to_external_ids", + "tableTo": "categories", + "columnsFrom": [ + "category_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "categories_to_external_ids_external_id_external_ids_id_fk": { + "name": "categories_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "categories_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "categories_to_external_ids_category_id_external_id_pk": { + "name": "categories_to_external_ids_category_id_external_id_pk", + "columns": [ + "category_id", + "external_id" + ] + } + }, + "uniqueConstraints": {} + }, + "categories_to_games": { + "name": "categories_to_games", + "schema": "", + "columns": { + "category_id": { + "name": "category_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "categories_to_games_category_id_categories_id_fk": { + "name": "categories_to_games_category_id_categories_id_fk", + "tableFrom": "categories_to_games", + "tableTo": "categories", + "columnsFrom": [ + "category_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "categories_to_games_game_id_games_id_fk": { + "name": "categories_to_games_game_id_games_id_fk", + "tableFrom": "categories_to_games", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "categories_to_games_category_id_game_id_pk": { + "name": "categories_to_games_category_id_game_id_pk", + "columns": [ + "category_id", + "game_id" + ] + } + }, + "uniqueConstraints": {} + }, + "collection_items": { + "name": "collection_items", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "collection_id": { + "name": "collection_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "times_played": { + "name": "times_played", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "collection_items_collection_id_collections_id_fk": { + "name": "collection_items_collection_id_collections_id_fk", + "tableFrom": "collection_items", + "tableTo": "collections", + "columnsFrom": [ + "collection_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "collection_items_game_id_games_id_fk": { + "name": "collection_items_game_id_games_id_fk", + "tableFrom": "collection_items", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "collections": { + "name": "collections", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "collections_user_id_users_id_fk": { + "name": "collections_user_id_users_id_fk", + "tableFrom": "collections", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "expansions": { + "name": "expansions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "base_game_id": { + "name": "base_game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "expansions_base_game_id_games_id_fk": { + "name": "expansions_base_game_id_games_id_fk", + "tableFrom": "expansions", + "tableTo": "games", + "columnsFrom": [ + "base_game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "expansions_game_id_games_id_fk": { + "name": "expansions_game_id_games_id_fk", + "tableFrom": "expansions", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "expansions_to_external_ids": { + "name": "expansions_to_external_ids", + "schema": "", + "columns": { + "expansion_id": { + "name": "expansion_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "expansions_to_external_ids_expansion_id_expansions_id_fk": { + "name": "expansions_to_external_ids_expansion_id_expansions_id_fk", + "tableFrom": "expansions_to_external_ids", + "tableTo": "expansions", + "columnsFrom": [ + "expansion_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "expansions_to_external_ids_external_id_external_ids_id_fk": { + "name": "expansions_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "expansions_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "expansions_to_external_ids_expansion_id_external_id_pk": { + "name": "expansions_to_external_ids_expansion_id_external_id_pk", + "columns": [ + "expansion_id", + "external_id" + ] + } + }, + "uniqueConstraints": {} + }, + "external_ids": { + "name": "external_ids", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "external_id_type", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "games": { + "name": "games", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "year_published": { + "name": "year_published", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_players": { + "name": "min_players", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "max_players": { + "name": "max_players", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "playtime": { + "name": "playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_playtime": { + "name": "min_playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "max_playtime": { + "name": "max_playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_age": { + "name": "min_age", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "image_url": { + "name": "image_url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "thumb_url": { + "name": "thumb_url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "url": { + "name": "url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "text_searchable_index": { + "name": "text_searchable_index", + "type": "tsvector", + "primaryKey": false, + "notNull": false + }, + "last_sync_at": { + "name": "last_sync_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": { + "text_searchable_idx": { + "name": "text_searchable_idx", + "columns": [ + "text_searchable_index" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "games_to_external_ids": { + "name": "games_to_external_ids", + "schema": "", + "columns": { + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "games_to_external_ids_game_id_games_id_fk": { + "name": "games_to_external_ids_game_id_games_id_fk", + "tableFrom": "games_to_external_ids", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "games_to_external_ids_external_id_external_ids_id_fk": { + "name": "games_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "games_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "games_to_external_ids_game_id_external_id_pk": { + "name": "games_to_external_ids_game_id_external_id_pk", + "columns": [ + "game_id", + "external_id" + ] + } + }, + "uniqueConstraints": {} + }, + "mechanics": { + "name": "mechanics", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "mechanics_to_external_ids": { + "name": "mechanics_to_external_ids", + "schema": "", + "columns": { + "mechanic_id": { + "name": "mechanic_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "mechanics_to_external_ids_mechanic_id_mechanics_id_fk": { + "name": "mechanics_to_external_ids_mechanic_id_mechanics_id_fk", + "tableFrom": "mechanics_to_external_ids", + "tableTo": "mechanics", + "columnsFrom": [ + "mechanic_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "mechanics_to_external_ids_external_id_external_ids_id_fk": { + "name": "mechanics_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "mechanics_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "mechanics_to_external_ids_mechanic_id_external_id_pk": { + "name": "mechanics_to_external_ids_mechanic_id_external_id_pk", + "columns": [ + "mechanic_id", + "external_id" + ] + } + }, + "uniqueConstraints": {} + }, + "mechanics_to_games": { + "name": "mechanics_to_games", + "schema": "", + "columns": { + "mechanic_id": { + "name": "mechanic_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "mechanics_to_games_mechanic_id_mechanics_id_fk": { + "name": "mechanics_to_games_mechanic_id_mechanics_id_fk", + "tableFrom": "mechanics_to_games", + "tableTo": "mechanics", + "columnsFrom": [ + "mechanic_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "mechanics_to_games_game_id_games_id_fk": { + "name": "mechanics_to_games_game_id_games_id_fk", + "tableFrom": "mechanics_to_games", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "mechanics_to_games_mechanic_id_game_id_pk": { + "name": "mechanics_to_games_mechanic_id_game_id_pk", + "columns": [ + "mechanic_id", + "game_id" + ] + } + }, + "uniqueConstraints": {} + }, + "publishers": { + "name": "publishers", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "publishers_to_external_ids": { + "name": "publishers_to_external_ids", + "schema": "", + "columns": { + "publisher_id": { + "name": "publisher_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "publishers_to_external_ids_publisher_id_publishers_id_fk": { + "name": "publishers_to_external_ids_publisher_id_publishers_id_fk", + "tableFrom": "publishers_to_external_ids", + "tableTo": "publishers", + "columnsFrom": [ + "publisher_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "publishers_to_external_ids_external_id_external_ids_id_fk": { + "name": "publishers_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "publishers_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "publishers_to_external_ids_publisher_id_external_id_pk": { + "name": "publishers_to_external_ids_publisher_id_external_id_pk", + "columns": [ + "publisher_id", + "external_id" + ] + } + }, + "uniqueConstraints": {} + }, + "publishers_to_games": { + "name": "publishers_to_games", + "schema": "", + "columns": { + "publisher_id": { + "name": "publisher_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "publishers_to_games_publisher_id_publishers_id_fk": { + "name": "publishers_to_games_publisher_id_publishers_id_fk", + "tableFrom": "publishers_to_games", + "tableTo": "publishers", + "columnsFrom": [ + "publisher_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "publishers_to_games_game_id_games_id_fk": { + "name": "publishers_to_games_game_id_games_id_fk", + "tableFrom": "publishers_to_games", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "publishers_to_games_publisher_id_game_id_pk": { + "name": "publishers_to_games_publisher_id_game_id_pk", + "columns": [ + "publisher_id", + "game_id" + ] + } + }, + "uniqueConstraints": {} + }, + "roles": { + "name": "roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "roles_name_unique": { + "name": "roles_name_unique", + "nullsNotDistinct": false, + "columns": [ + "name" + ] + } + } + }, + "sessions": { + "name": "sessions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "ip_country": { + "name": "ip_country", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "ip_address": { + "name": "ip_address", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "sessions_user_id_users_id_fk": { + "name": "sessions_user_id_users_id_fk", + "tableFrom": "sessions", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "user_roles": { + "name": "user_roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "role_id": { + "name": "role_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "user_roles_user_id_users_id_fk": { + "name": "user_roles_user_id_users_id_fk", + "tableFrom": "user_roles", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_roles_role_id_roles_id_fk": { + "name": "user_roles_role_id_roles_id_fk", + "tableFrom": "user_roles", + "tableTo": "roles", + "columnsFrom": [ + "role_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "username": { + "name": "username", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "hashed_password": { + "name": "hashed_password", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "first_name": { + "name": "first_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "last_name": { + "name": "last_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "verified": { + "name": "verified", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "receive_email": { + "name": "receive_email", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "theme": { + "name": "theme", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "default": "'system'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_username_unique": { + "name": "users_username_unique", + "nullsNotDistinct": false, + "columns": [ + "username" + ] + }, + "users_email_unique": { + "name": "users_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + } + }, + "wishlist_items": { + "name": "wishlist_items", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "wishlist_id": { + "name": "wishlist_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "wishlist_items_wishlist_id_wishlists_id_fk": { + "name": "wishlist_items_wishlist_id_wishlists_id_fk", + "tableFrom": "wishlist_items", + "tableTo": "wishlists", + "columnsFrom": [ + "wishlist_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "wishlist_items_game_id_games_id_fk": { + "name": "wishlist_items_game_id_games_id_fk", + "tableFrom": "wishlist_items", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "wishlists": { + "name": "wishlists", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "wishlists_user_id_users_id_fk": { + "name": "wishlists_user_id_users_id_fk", + "tableFrom": "wishlists", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + } + }, + "enums": { + "external_id_type": { + "name": "external_id_type", + "values": { + "game": "game", + "category": "category", + "mechanic": "mechanic", + "publisher": "publisher", + "designer": "designer", + "artist": "artist" + } + } + }, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/0014_snapshot.json b/drizzle/meta/0014_snapshot.json new file mode 100644 index 0000000..8d11ec3 --- /dev/null +++ b/drizzle/meta/0014_snapshot.json @@ -0,0 +1,1271 @@ +{ + "id": "2743a62f-6523-44af-8c31-b69fe40c749f", + "prevId": "453ae1fd-7b1f-4256-8323-cdb2da05902a", + "version": "5", + "dialect": "pg", + "tables": { + "categories": { + "name": "categories", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "categories_to_external_ids": { + "name": "categories_to_external_ids", + "schema": "", + "columns": { + "category_id": { + "name": "category_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "categories_to_external_ids_category_id_categories_id_fk": { + "name": "categories_to_external_ids_category_id_categories_id_fk", + "tableFrom": "categories_to_external_ids", + "tableTo": "categories", + "columnsFrom": [ + "category_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "categories_to_external_ids_external_id_external_ids_id_fk": { + "name": "categories_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "categories_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "categories_to_external_ids_category_id_external_id_pk": { + "name": "categories_to_external_ids_category_id_external_id_pk", + "columns": [ + "category_id", + "external_id" + ] + } + }, + "uniqueConstraints": {} + }, + "categories_to_games": { + "name": "categories_to_games", + "schema": "", + "columns": { + "category_id": { + "name": "category_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "categories_to_games_category_id_categories_id_fk": { + "name": "categories_to_games_category_id_categories_id_fk", + "tableFrom": "categories_to_games", + "tableTo": "categories", + "columnsFrom": [ + "category_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "categories_to_games_game_id_games_id_fk": { + "name": "categories_to_games_game_id_games_id_fk", + "tableFrom": "categories_to_games", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "categories_to_games_category_id_game_id_pk": { + "name": "categories_to_games_category_id_game_id_pk", + "columns": [ + "category_id", + "game_id" + ] + } + }, + "uniqueConstraints": {} + }, + "collection_items": { + "name": "collection_items", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "collection_id": { + "name": "collection_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "times_played": { + "name": "times_played", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "collection_items_collection_id_collections_id_fk": { + "name": "collection_items_collection_id_collections_id_fk", + "tableFrom": "collection_items", + "tableTo": "collections", + "columnsFrom": [ + "collection_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "collection_items_game_id_games_id_fk": { + "name": "collection_items_game_id_games_id_fk", + "tableFrom": "collection_items", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "collections": { + "name": "collections", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "collections_user_id_users_id_fk": { + "name": "collections_user_id_users_id_fk", + "tableFrom": "collections", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "expansions": { + "name": "expansions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "base_game_id": { + "name": "base_game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "expansions_base_game_id_games_id_fk": { + "name": "expansions_base_game_id_games_id_fk", + "tableFrom": "expansions", + "tableTo": "games", + "columnsFrom": [ + "base_game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "expansions_game_id_games_id_fk": { + "name": "expansions_game_id_games_id_fk", + "tableFrom": "expansions", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "external_ids": { + "name": "external_ids", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "external_id_type", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "games": { + "name": "games", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "year_published": { + "name": "year_published", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_players": { + "name": "min_players", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "max_players": { + "name": "max_players", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "playtime": { + "name": "playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_playtime": { + "name": "min_playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "max_playtime": { + "name": "max_playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_age": { + "name": "min_age", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "image_url": { + "name": "image_url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "thumb_url": { + "name": "thumb_url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "url": { + "name": "url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "text_searchable_index": { + "name": "text_searchable_index", + "type": "tsvector", + "primaryKey": false, + "notNull": false + }, + "last_sync_at": { + "name": "last_sync_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": { + "text_searchable_idx": { + "name": "text_searchable_idx", + "columns": [ + "text_searchable_index" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "games_to_external_ids": { + "name": "games_to_external_ids", + "schema": "", + "columns": { + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "games_to_external_ids_game_id_games_id_fk": { + "name": "games_to_external_ids_game_id_games_id_fk", + "tableFrom": "games_to_external_ids", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "games_to_external_ids_external_id_external_ids_id_fk": { + "name": "games_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "games_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "games_to_external_ids_game_id_external_id_pk": { + "name": "games_to_external_ids_game_id_external_id_pk", + "columns": [ + "game_id", + "external_id" + ] + } + }, + "uniqueConstraints": {} + }, + "mechanics": { + "name": "mechanics", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "mechanics_to_external_ids": { + "name": "mechanics_to_external_ids", + "schema": "", + "columns": { + "mechanic_id": { + "name": "mechanic_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "mechanics_to_external_ids_mechanic_id_mechanics_id_fk": { + "name": "mechanics_to_external_ids_mechanic_id_mechanics_id_fk", + "tableFrom": "mechanics_to_external_ids", + "tableTo": "mechanics", + "columnsFrom": [ + "mechanic_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "mechanics_to_external_ids_external_id_external_ids_id_fk": { + "name": "mechanics_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "mechanics_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "mechanics_to_external_ids_mechanic_id_external_id_pk": { + "name": "mechanics_to_external_ids_mechanic_id_external_id_pk", + "columns": [ + "mechanic_id", + "external_id" + ] + } + }, + "uniqueConstraints": {} + }, + "mechanics_to_games": { + "name": "mechanics_to_games", + "schema": "", + "columns": { + "mechanic_id": { + "name": "mechanic_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "mechanics_to_games_mechanic_id_mechanics_id_fk": { + "name": "mechanics_to_games_mechanic_id_mechanics_id_fk", + "tableFrom": "mechanics_to_games", + "tableTo": "mechanics", + "columnsFrom": [ + "mechanic_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "mechanics_to_games_game_id_games_id_fk": { + "name": "mechanics_to_games_game_id_games_id_fk", + "tableFrom": "mechanics_to_games", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "mechanics_to_games_mechanic_id_game_id_pk": { + "name": "mechanics_to_games_mechanic_id_game_id_pk", + "columns": [ + "mechanic_id", + "game_id" + ] + } + }, + "uniqueConstraints": {} + }, + "publishers": { + "name": "publishers", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "publishers_to_external_ids": { + "name": "publishers_to_external_ids", + "schema": "", + "columns": { + "publisher_id": { + "name": "publisher_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "publishers_to_external_ids_publisher_id_publishers_id_fk": { + "name": "publishers_to_external_ids_publisher_id_publishers_id_fk", + "tableFrom": "publishers_to_external_ids", + "tableTo": "publishers", + "columnsFrom": [ + "publisher_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "publishers_to_external_ids_external_id_external_ids_id_fk": { + "name": "publishers_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "publishers_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "publishers_to_external_ids_publisher_id_external_id_pk": { + "name": "publishers_to_external_ids_publisher_id_external_id_pk", + "columns": [ + "publisher_id", + "external_id" + ] + } + }, + "uniqueConstraints": {} + }, + "publishers_to_games": { + "name": "publishers_to_games", + "schema": "", + "columns": { + "publisher_id": { + "name": "publisher_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "publishers_to_games_publisher_id_publishers_id_fk": { + "name": "publishers_to_games_publisher_id_publishers_id_fk", + "tableFrom": "publishers_to_games", + "tableTo": "publishers", + "columnsFrom": [ + "publisher_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "publishers_to_games_game_id_games_id_fk": { + "name": "publishers_to_games_game_id_games_id_fk", + "tableFrom": "publishers_to_games", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "publishers_to_games_publisher_id_game_id_pk": { + "name": "publishers_to_games_publisher_id_game_id_pk", + "columns": [ + "publisher_id", + "game_id" + ] + } + }, + "uniqueConstraints": {} + }, + "roles": { + "name": "roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "roles_name_unique": { + "name": "roles_name_unique", + "nullsNotDistinct": false, + "columns": [ + "name" + ] + } + } + }, + "sessions": { + "name": "sessions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "ip_country": { + "name": "ip_country", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "ip_address": { + "name": "ip_address", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "sessions_user_id_users_id_fk": { + "name": "sessions_user_id_users_id_fk", + "tableFrom": "sessions", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "user_roles": { + "name": "user_roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "role_id": { + "name": "role_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "user_roles_user_id_users_id_fk": { + "name": "user_roles_user_id_users_id_fk", + "tableFrom": "user_roles", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_roles_role_id_roles_id_fk": { + "name": "user_roles_role_id_roles_id_fk", + "tableFrom": "user_roles", + "tableTo": "roles", + "columnsFrom": [ + "role_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "username": { + "name": "username", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "hashed_password": { + "name": "hashed_password", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "first_name": { + "name": "first_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "last_name": { + "name": "last_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "verified": { + "name": "verified", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "receive_email": { + "name": "receive_email", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "theme": { + "name": "theme", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "default": "'system'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_username_unique": { + "name": "users_username_unique", + "nullsNotDistinct": false, + "columns": [ + "username" + ] + }, + "users_email_unique": { + "name": "users_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + } + }, + "wishlist_items": { + "name": "wishlist_items", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "wishlist_id": { + "name": "wishlist_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "wishlist_items_wishlist_id_wishlists_id_fk": { + "name": "wishlist_items_wishlist_id_wishlists_id_fk", + "tableFrom": "wishlist_items", + "tableTo": "wishlists", + "columnsFrom": [ + "wishlist_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "wishlist_items_game_id_games_id_fk": { + "name": "wishlist_items_game_id_games_id_fk", + "tableFrom": "wishlist_items", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "wishlists": { + "name": "wishlists", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "wishlists_user_id_users_id_fk": { + "name": "wishlists_user_id_users_id_fk", + "tableFrom": "wishlists", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + } + }, + "enums": { + "external_id_type": { + "name": "external_id_type", + "values": { + "game": "game", + "category": "category", + "mechanic": "mechanic", + "publisher": "publisher", + "designer": "designer", + "artist": "artist" + } + } + }, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json index d2134c5..0af48a6 100644 --- a/drizzle/meta/_journal.json +++ b/drizzle/meta/_journal.json @@ -92,6 +92,20 @@ "when": 1708330799655, "tag": "0012_dizzy_lethal_legion", "breakpoints": true + }, + { + "idx": 13, + "version": "5", + "when": 1708453431550, + "tag": "0013_clever_monster_badoon", + "breakpoints": true + }, + { + "idx": 14, + "version": "5", + "when": 1708479971410, + "tag": "0014_organic_morlocks", + "breakpoints": true } ] } \ No newline at end of file diff --git a/package.json b/package.json index f163b38..0109c03 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", "autoprefixer": "^10.4.17", - "dotenv": "^16.4.4", + "dotenv": "^16.4.5", "drizzle-kit": "^0.20.14", "eslint": "^8.56.0", "eslint-config-prettier": "^9.1.0", @@ -49,7 +49,7 @@ "postcss": "^8.4.35", "postcss-import": "^16.0.1", "postcss-load-config": "^5.0.3", - "postcss-preset-env": "^9.3.0", + "postcss-preset-env": "^9.4.0", "prettier": "^3.2.5", "prettier-plugin-svelte": "^3.2.1", "prisma": "^5.9.1", @@ -106,9 +106,9 @@ "just-kebab-case": "^4.2.0", "loader": "^2.1.1", "lucia": "3.0.1", - "lucide-svelte": "^0.323.0", + "lucide-svelte": "^0.335.0", "mysql2": "^3.9.1", - "nanoid": "^5.0.5", + "nanoid": "^5.0.6", "open-props": "^1.6.18", "oslo": "^1.1.2", "pg": "^8.11.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index efce8c2..40e1868 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -87,14 +87,14 @@ dependencies: specifier: 3.0.1 version: 3.0.1 lucide-svelte: - specifier: ^0.323.0 - version: 0.323.0(svelte@4.2.11) + specifier: ^0.335.0 + version: 0.335.0(svelte@4.2.11) mysql2: specifier: ^3.9.1 version: 3.9.1 nanoid: - specifier: ^5.0.5 - version: 5.0.5 + specifier: ^5.0.6 + version: 5.0.6 open-props: specifier: ^1.6.18 version: 1.6.18 @@ -173,8 +173,8 @@ devDependencies: specifier: ^10.4.17 version: 10.4.17(postcss@8.4.35) dotenv: - specifier: ^16.4.4 - version: 16.4.4 + specifier: ^16.4.5 + version: 16.4.5 drizzle-kit: specifier: ^0.20.14 version: 0.20.14 @@ -203,8 +203,8 @@ devDependencies: specifier: ^5.0.3 version: 5.0.3(postcss@8.4.35) postcss-preset-env: - specifier: ^9.3.0 - version: 9.3.0(postcss@8.4.35) + specifier: ^9.4.0 + version: 9.4.0(postcss@8.4.35) prettier: specifier: ^3.2.5 version: 3.2.5 @@ -344,122 +344,247 @@ packages: dependencies: '@jridgewell/trace-mapping': 0.3.9 - /@csstools/cascade-layer-name-parser@1.0.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1): - resolution: {integrity: sha512-v/5ODKNBMfBl0us/WQjlfsvSlYxfZLhNMVIsuCPib2ulTwGKYbKJbwqw671+qH9Y4wvWVnu7LBChvml/wBKjFg==} + /@csstools/cascade-layer-name-parser@1.0.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3): + resolution: {integrity: sha512-xHxXavWvXB5nAA9IvZtjEzkONM3hPXpxqYK4cEw60LcqPiFjq7ZlEFxOyYFPrG4UdANKtnucNtRVDy7frjq6AA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: - '@csstools/css-parser-algorithms': ^2.3.2 - '@csstools/css-tokenizer': ^2.2.1 + '@csstools/css-parser-algorithms': ^2.6.0 + '@csstools/css-tokenizer': ^2.2.3 dependencies: - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 dev: true - /@csstools/color-helpers@3.0.2: - resolution: {integrity: sha512-NMVs/l7Y9eIKL5XjbCHEgGcG8LOUT2qVcRjX6EzkCdlvftHVKr2tHIPzHavfrULRZ5Q2gxrJ9f44dAlj6fX97Q==} + /@csstools/color-helpers@4.0.0: + resolution: {integrity: sha512-wjyXB22/h2OvxAr3jldPB7R7kjTUEzopvjitS8jWtyd8fN6xJ8vy1HnHu0ZNfEkqpBJgQ76Q+sBDshWcMvTa/w==} engines: {node: ^14 || ^16 || >=18} dev: true - /@csstools/css-calc@1.1.4(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1): - resolution: {integrity: sha512-ZV1TSmToiNcQL1P3hfzlzZzA02mmVkVmXGaUDUqpYUG84PmLhVSZpKX+KfxAuOcK7de04UXSQPBrAvaya6iiGg==} + /@csstools/css-calc@1.1.7(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3): + resolution: {integrity: sha512-+7bUzB5I4cI97tKmBJA8ilTl/YRo6VAOdlrnd/4x2NyK60nvYurGKa5TZpE1zcgIrTC97iJRE0/V65feyFytuw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: - '@csstools/css-parser-algorithms': ^2.3.2 - '@csstools/css-tokenizer': ^2.2.1 + '@csstools/css-parser-algorithms': ^2.6.0 + '@csstools/css-tokenizer': ^2.2.3 dependencies: - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 dev: true - /@csstools/css-color-parser@1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1): - resolution: {integrity: sha512-SlGd8E6ron24JYQPQAIzu5tvmWi1H4sDKTdA7UDnwF45oJv7AVESbOlOO1YjfBhrQFuvLWUgKiOY9DwGoAxwTA==} + /@csstools/css-color-parser@1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3): + resolution: {integrity: sha512-5GEkuuUxD5dael3xoWjyf7gAPAi4pwm8X8JW/nUMhxntGY4Wo4Lp7vKlex4V5ZgTfAoov14rZFsZyOantdTatg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: - '@csstools/css-parser-algorithms': ^2.3.2 - '@csstools/css-tokenizer': ^2.2.1 + '@csstools/css-parser-algorithms': ^2.6.0 + '@csstools/css-tokenizer': ^2.2.3 dependencies: - '@csstools/color-helpers': 3.0.2 - '@csstools/css-calc': 1.1.4(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 + '@csstools/color-helpers': 4.0.0 + '@csstools/css-calc': 1.1.7(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 dev: true - /@csstools/css-parser-algorithms@2.3.2(@csstools/css-tokenizer@2.2.1): - resolution: {integrity: sha512-sLYGdAdEY2x7TSw9FtmdaTrh2wFtRJO5VMbBrA8tEqEod7GEggFmxTSK9XqExib3yMuYNcvcTdCZIP6ukdjAIA==} + /@csstools/css-parser-algorithms@2.6.0(@csstools/css-tokenizer@2.2.3): + resolution: {integrity: sha512-YfEHq0eRH98ffb5/EsrrDspVWAuph6gDggAE74ZtjecsmyyWpW768hOyiONa8zwWGbIWYfa2Xp4tRTrpQQ00CQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: - '@csstools/css-tokenizer': ^2.2.1 + '@csstools/css-tokenizer': ^2.2.3 dependencies: - '@csstools/css-tokenizer': 2.2.1 + '@csstools/css-tokenizer': 2.2.3 dev: true - /@csstools/css-tokenizer@2.2.1: - resolution: {integrity: sha512-Zmsf2f/CaEPWEVgw29odOj+WEVoiJy9s9NOv5GgNY9mZ1CZ7394By6wONrONrTsnNDv6F9hR02nvFihrGVGHBg==} + /@csstools/css-tokenizer@2.2.3: + resolution: {integrity: sha512-pp//EvZ9dUmGuGtG1p+n17gTHEOqu9jO+FiCUjNN3BDmyhdA2Jq9QsVeR7K8/2QCK17HSsioPlTW9ZkzoWb3Lg==} engines: {node: ^14 || ^16 || >=18} dev: true - /@csstools/media-query-list-parser@2.1.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1): - resolution: {integrity: sha512-IxVBdYzR8pYe89JiyXQuYk4aVVoCPhMJkz6ElRwlVysjwURTsTk/bmY/z4FfeRE+CRBMlykPwXEVUg8lThv7AQ==} + /@csstools/media-query-list-parser@2.1.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3): + resolution: {integrity: sha512-DiD3vG5ciNzeuTEoh74S+JMjQDs50R3zlxHnBnfd04YYfA/kh2KiBCGhzqLxlJcNq+7yNQ3stuZZYLX6wK/U2g==} engines: {node: ^14 || ^16 || >=18} peerDependencies: - '@csstools/css-parser-algorithms': ^2.3.2 - '@csstools/css-tokenizer': ^2.2.1 + '@csstools/css-parser-algorithms': ^2.6.0 + '@csstools/css-tokenizer': ^2.2.3 dependencies: - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 dev: true - /@csstools/postcss-cascade-layers@4.0.1(postcss@8.4.35): - resolution: {integrity: sha512-UYFuFL9GgVnftg9v7tBvVEBRLaBeAD66euD+yYy5fYCUld9ZIWTJNCE30hm6STMEdt6FL5xzeVw1lAZ1tpvUEg==} + /@csstools/postcss-cascade-layers@4.0.3(postcss@8.4.35): + resolution: {integrity: sha512-RbkQoOH23yGhWVetgBTwFgIOHEyU2tKMN7blTz/YAKKabR6tr9pP7mYS23Q9snFY2hr8WSaV8Le64KdM9BtUSA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/selector-specificity': 3.0.0(postcss-selector-parser@6.0.13) + '@csstools/selector-specificity': 3.0.2(postcss-selector-parser@6.0.15) postcss: 8.4.35 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.15 dev: true - /@csstools/postcss-color-function@3.0.7(postcss@8.4.35): - resolution: {integrity: sha512-/PIB20G1TPCXmQlaJLWIYzTZRZpj6csT4ijgnshIj/kcmniIRroAfDa0xSWnfuO1eNo0NptIaPU7jzUukWn55Q==} + /@csstools/postcss-color-function@3.0.10(postcss@8.4.35): + resolution: {integrity: sha512-jxiXmSl4ZYX8KewFjL5ef6of9uW73VkaHeDb2tqb5q4ZDPYxjusNX1KJ8UXY8+7ydqS5QBo42tVMrSMGy+rDmw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-color-parser': 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.35) + '@csstools/css-color-parser': 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 + '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) + '@csstools/utilities': 1.0.0(postcss@8.4.35) postcss: 8.4.35 dev: true - /@csstools/postcss-color-mix-function@2.0.7(postcss@8.4.35): - resolution: {integrity: sha512-57/g8aGo5eKFjEeJMiRKh8Qq43K2rCyk5ZZTvJ34TNl4zUtYU5DvLkIkOnhCtL8/a4z9oMA42aOnFPddRrScUQ==} + /@csstools/postcss-color-mix-function@2.0.10(postcss@8.4.35): + resolution: {integrity: sha512-zeD856+FDCUjB077pPS+Z9OnTQnqpiJrao3TW+sasCb/gJ3vZCX7sRSRFsRUo0/MntTtJu9hkKv9eMkFmfjydA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-color-parser': 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.35) + '@csstools/css-color-parser': 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 + '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) + '@csstools/utilities': 1.0.0(postcss@8.4.35) postcss: 8.4.35 dev: true - /@csstools/postcss-exponential-functions@1.0.1(postcss@8.4.35): - resolution: {integrity: sha512-ZLK2iSK4DUxeypGce2PnQSdYugUqDTwxnhNiq1o6OyKMNYgYs4eKbvEhFG8JKr1sJWbeqBi5jRr0017l2EWVvg==} + /@csstools/postcss-exponential-functions@1.0.4(postcss@8.4.35): + resolution: {integrity: sha512-frMf0CFVnZoGEKAHlxLy3s4g/tpjyFn5+A+h895UJNm9Uc+ewGT7+EeK7Kh9IHH4pD4FkaGW1vOQtER00PLurQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-calc': 1.1.4(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 + '@csstools/css-calc': 1.1.7(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 postcss: 8.4.35 dev: true - /@csstools/postcss-font-format-keywords@3.0.0(postcss@8.4.35): - resolution: {integrity: sha512-ntkGj+1uDa/u6lpjPxnkPcjJn7ChO/Kcy08YxctOZI7vwtrdYvFhmE476dq8bj1yna306+jQ9gzXIG/SWfOaRg==} + /@csstools/postcss-font-format-keywords@3.0.2(postcss@8.4.35): + resolution: {integrity: sha512-E0xz2sjm4AMCkXLCFvI/lyl4XO6aN1NCSMMVEOngFDJ+k2rDwfr6NDjWljk1li42jiLNChVX+YFnmfGCigZKXw==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + '@csstools/utilities': 1.0.0(postcss@8.4.35) + postcss: 8.4.35 + postcss-value-parser: 4.2.0 + dev: true + + /@csstools/postcss-gamut-mapping@1.0.3(postcss@8.4.35): + resolution: {integrity: sha512-P0+ude1KyCy9LXOe2pHJmpcXK4q/OQbr2Sn2wQSssMw0rALGmny2MfHiCqEu8n6mf2cN6lWDZdzY8enBk8WHXQ==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + '@csstools/css-color-parser': 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 + postcss: 8.4.35 + dev: true + + /@csstools/postcss-gradients-interpolation-method@4.0.10(postcss@8.4.35): + resolution: {integrity: sha512-PwKOxVuX8lo52bPtPeKjaIp6oH2EzhcBxCndRcvGZKsqZYQ35k9A5G4yihZ+wp7PoxPqDNiXuhQsvQG2lqMpOA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + '@csstools/css-color-parser': 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 + '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) + '@csstools/utilities': 1.0.0(postcss@8.4.35) + postcss: 8.4.35 + dev: true + + /@csstools/postcss-hwb-function@3.0.9(postcss@8.4.35): + resolution: {integrity: sha512-S3/Z+mGHWIKAex7DLsHFDiku5lBEK34avT2My6sGPNCXB38TZjrKI0rd7JdN9oulem5sn+CU7oONyIftui24oQ==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + '@csstools/css-color-parser': 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 + '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) + '@csstools/utilities': 1.0.0(postcss@8.4.35) + postcss: 8.4.35 + dev: true + + /@csstools/postcss-ic-unit@3.0.4(postcss@8.4.35): + resolution: {integrity: sha512-OB6ojl33/TQHhjVx1NI+n3EnYbdUM6Q/mSUv3WFATdcz7IrH/CmBaZt7P1R6j1Xdp58thIa6jm4Je7saGs+2AA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) + '@csstools/utilities': 1.0.0(postcss@8.4.35) + postcss: 8.4.35 + postcss-value-parser: 4.2.0 + dev: true + + /@csstools/postcss-initial@1.0.1(postcss@8.4.35): + resolution: {integrity: sha512-wtb+IbUIrIf8CrN6MLQuFR7nlU5C7PwuebfeEXfjthUha1+XZj2RVi+5k/lukToA24sZkYAiSJfHM8uG/UZIdg==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.35 + dev: true + + /@csstools/postcss-is-pseudo-class@4.0.5(postcss@8.4.35): + resolution: {integrity: sha512-qG3MI7IN3KY9UwdaE9E7G7sFydscVW7nAj5OGwaBP9tQPEEVdxXTGI+l1ZW5EUpZFSj+u3q/22fH5+8HI72+Bg==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + '@csstools/selector-specificity': 3.0.2(postcss-selector-parser@6.0.15) + postcss: 8.4.35 + postcss-selector-parser: 6.0.15 + dev: true + + /@csstools/postcss-light-dark-function@1.0.0(postcss@8.4.35): + resolution: {integrity: sha512-KHo633V16DGo6tmpr1ARAwO73CPBNmDI3PfSQYe7ZBMiv60WEizbcEroK75fHjxKYJ4tj9uCCzp5sYG4cEUqqw==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 + '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) + '@csstools/utilities': 1.0.0(postcss@8.4.35) + postcss: 8.4.35 + dev: true + + /@csstools/postcss-logical-float-and-clear@2.0.1(postcss@8.4.35): + resolution: {integrity: sha512-SsrWUNaXKr+e/Uo4R/uIsqJYt3DaggIh/jyZdhy/q8fECoJSKsSMr7nObSLdvoULB69Zb6Bs+sefEIoMG/YfOA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.35 + dev: true + + /@csstools/postcss-logical-overflow@1.0.1(postcss@8.4.35): + resolution: {integrity: sha512-Kl4lAbMg0iyztEzDhZuQw8Sj9r2uqFDcU1IPl+AAt2nue8K/f1i7ElvKtXkjhIAmKiy5h2EY8Gt/Cqg0pYFDCw==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.35 + dev: true + + /@csstools/postcss-logical-overscroll-behavior@1.0.1(postcss@8.4.35): + resolution: {integrity: sha512-+kHamNxAnX8ojPCtV8WPcUP3XcqMFBSDuBuvT6MHgq7oX4IQxLIXKx64t7g9LiuJzE7vd06Q9qUYR6bh4YnGpQ==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.35 + dev: true + + /@csstools/postcss-logical-resize@2.0.1(postcss@8.4.35): + resolution: {integrity: sha512-W5Gtwz7oIuFcKa5SmBjQ2uxr8ZoL7M2bkoIf0T1WeNqljMkBrfw1DDA8/J83k57NQ1kcweJEjkJ04pUkmyee3A==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 @@ -468,103 +593,55 @@ packages: postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-gamut-mapping@1.0.0(postcss@8.4.35): - resolution: {integrity: sha512-6UQyK8l9YaG5Ao5rBDcCnKHrLsHiQ1E0zeFQuqDJqEtinVzAPb/MwSw3TenZXL1Rnd7th3tb+4CBFHBXdW5tbQ==} + /@csstools/postcss-logical-viewport-units@2.0.6(postcss@8.4.35): + resolution: {integrity: sha512-6hV0ngZh8J7HqNY3kyt+z5ABN/XE18qvrU7ne4YSkKfltrWDnQgGiW/Q+h7bdQz8/W5juAefcdCCAJUIBE7erg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-color-parser': 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 + '@csstools/css-tokenizer': 2.2.3 + '@csstools/utilities': 1.0.0(postcss@8.4.35) postcss: 8.4.35 dev: true - /@csstools/postcss-gradients-interpolation-method@4.0.7(postcss@8.4.35): - resolution: {integrity: sha512-GT1CzE/Tyr/ei4j5BwKESkHAgg+Gzys/0mAY7W+UiR+XrcYk5hDbOrE/YJIx1rflfO/7La1bDoZtA0YnLl4qNA==} + /@csstools/postcss-media-minmax@1.1.3(postcss@8.4.35): + resolution: {integrity: sha512-W9AFRQSLvT+Dxtp20AewzGTUxzkJ21XSKzqRALwQdAv0uJGXkR76qgdhkoX0L/tcV4gXtgDfVtGYL/x2Nz/M5Q==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-color-parser': 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.35) + '@csstools/css-calc': 1.1.7(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 + '@csstools/media-query-list-parser': 2.1.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) postcss: 8.4.35 dev: true - /@csstools/postcss-hwb-function@3.0.6(postcss@8.4.35): - resolution: {integrity: sha512-uQgWt2Ho2yy2S6qthWY7mD5v57NKxi6dD1NB8nAybU5bJSsm+hLXRGm3/zbOH4xNrqO3Cl60DFSNlSrUME3Xjg==} + /@csstools/postcss-media-queries-aspect-ratio-number-values@2.0.6(postcss@8.4.35): + resolution: {integrity: sha512-awc2qenSDvx6r+w6G9xxENp+LsbvHC8mMMV23KYmk4pR3YL8JxeKPDSiDhmqd93FQ9nNNDc/CaCQEcvP+GV4rw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-color-parser': 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 + '@csstools/media-query-list-parser': 2.1.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) postcss: 8.4.35 dev: true - /@csstools/postcss-ic-unit@3.0.2(postcss@8.4.35): - resolution: {integrity: sha512-n28Er7W9qc48zNjJnvTKuVHY26/+6YlA9WzJRksIHiAWOMxSH5IksXkw7FpkIOd+jLi59BMrX/BWrZMgjkLBHg==} + /@csstools/postcss-nested-calc@3.0.2(postcss@8.4.35): + resolution: {integrity: sha512-ySUmPyawiHSmBW/VI44+IObcKH0v88LqFe0d09Sb3w4B1qjkaROc6d5IA3ll9kjD46IIX/dbO5bwFN/swyoyZA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.35) + '@csstools/utilities': 1.0.0(postcss@8.4.35) postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-initial@1.0.0(postcss@8.4.35): - resolution: {integrity: sha512-1l7iHHjIl5qmVeGItugr4ZOlCREDP71mNKqoEyxlosIoiu3Os1nPWMHpuCvDLCLiWI/ONTOg3nzJh7gwHOrqUA==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.4 - dependencies: - postcss: 8.4.35 - dev: true - - /@csstools/postcss-is-pseudo-class@4.0.3(postcss@8.4.35): - resolution: {integrity: sha512-/dt5M9Ty/x3Yiq0Nm/5PJJzwkVFchJgdjKVnryBPtoMCb9ohb/nDIJOwr/Wr3hK3FDs1EA1GE6PyRYsUmQPS8Q==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.4 - dependencies: - '@csstools/selector-specificity': 3.0.0(postcss-selector-parser@6.0.13) - postcss: 8.4.35 - postcss-selector-parser: 6.0.13 - dev: true - - /@csstools/postcss-logical-float-and-clear@2.0.0(postcss@8.4.35): - resolution: {integrity: sha512-Wki4vxsF6icRvRz8eF9bPpAvwaAt0RHwhVOyzfoFg52XiIMjb6jcbHkGxwpJXP4DVrnFEwpwmrz5aTRqOW82kg==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.4 - dependencies: - postcss: 8.4.35 - dev: true - - /@csstools/postcss-logical-overflow@1.0.0(postcss@8.4.35): - resolution: {integrity: sha512-cIrZ8f7bGGvr+W53nEuMspcwaeaI2YTmz6LZ4yiAO5z14/PQgOOv+Pn+qjvPOPoadeY2BmpaoTzZKvdAQuM17w==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.4 - dependencies: - postcss: 8.4.35 - dev: true - - /@csstools/postcss-logical-overscroll-behavior@1.0.0(postcss@8.4.35): - resolution: {integrity: sha512-e89S2LWjnxf0SB2wNUAbqDyFb/Fow/tlOe1XqOLbNx4rf3LrQokM9qldVx7sarnddml3ORE5LDUmlKpPOOeJTA==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.4 - dependencies: - postcss: 8.4.35 - dev: true - - /@csstools/postcss-logical-resize@2.0.0(postcss@8.4.35): - resolution: {integrity: sha512-lCQ1aX8c5+WI4t5EoYf3alTzJNNocMqTb+u1J9CINdDhFh1fjovqK+0aHalUHsNstZmzFPNzIkU4Mb3eM9U8SA==} + /@csstools/postcss-normalize-display-values@3.0.2(postcss@8.4.35): + resolution: {integrity: sha512-fCapyyT/dUdyPtrelQSIV+d5HqtTgnNP/BEG9IuhgXHt93Wc4CfC1bQ55GzKAjWrZbgakMQ7MLfCXEf3rlZJOw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 @@ -573,43 +650,22 @@ packages: postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-logical-viewport-units@2.0.3(postcss@8.4.35): - resolution: {integrity: sha512-xeVxqND5rlQyqLGdH7rX34sIm/JbbQKxpKQP8oD1YQqUHHCLQR9NUS57WqJKajxKN6AcNAMWJhb5LUH5RfPcyA==} + /@csstools/postcss-oklab-function@3.0.10(postcss@8.4.35): + resolution: {integrity: sha512-s9trs1c+gUMtaTtwrrIpdVQkUbRuwi6bQ9rBHaqwt4kd3kEnEYfP85uLY1inFx6Rt8OM2XVg3PSYbfnFSAO51A==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-tokenizer': 2.2.1 + '@csstools/css-color-parser': 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 + '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) + '@csstools/utilities': 1.0.0(postcss@8.4.35) postcss: 8.4.35 dev: true - /@csstools/postcss-media-minmax@1.1.0(postcss@8.4.35): - resolution: {integrity: sha512-t5Li/DPC5QmW/6VFLfUvsw/4dNYYseWR0tOXDeJg/9EKUodBgNawz5tuk5vYKtNvoj+Q08odMuXcpS5YJj0AFA==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.4 - dependencies: - '@csstools/css-calc': 1.1.4(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 - '@csstools/media-query-list-parser': 2.1.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - postcss: 8.4.35 - dev: true - - /@csstools/postcss-media-queries-aspect-ratio-number-values@2.0.3(postcss@8.4.35): - resolution: {integrity: sha512-IPL8AvnwMYW+cWtp+j8cW3MFN0RyXNT4hLOvs6Rf2N+NcbvXhSyKxZuE3W9Cv4KjaNoNoGx1d0UhT6tktq6tUw==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.4 - dependencies: - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 - '@csstools/media-query-list-parser': 2.1.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - postcss: 8.4.35 - dev: true - - /@csstools/postcss-nested-calc@3.0.0(postcss@8.4.35): - resolution: {integrity: sha512-HsB66aDWAouOwD/GcfDTS0a7wCuVWaTpXcjl5VKP0XvFxDiU+r0T8FG7xgb6ovZNZ+qzvGIwRM+CLHhDgXrYgQ==} + /@csstools/postcss-progressive-custom-properties@3.1.0(postcss@8.4.35): + resolution: {integrity: sha512-Mfb1T1BHa6pktLI+poMEHI7Q+VYvAsdwJZPFsSkIB2ZUsawCiPxXLw06BKSVPITxFlaY/FEUzfpyOTfX9YCE2w==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 @@ -618,99 +674,67 @@ packages: postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-normalize-display-values@3.0.1(postcss@8.4.35): - resolution: {integrity: sha512-nUvRxI+ALJwkxZdPU4EDyuM380vP91sAGvI3jAOHs/sr3jfcCOzLkY6xKI1Mr526kZ3RivmMoYM/xq+XFyE/bw==} + /@csstools/postcss-relative-color-syntax@2.0.10(postcss@8.4.35): + resolution: {integrity: sha512-IkTIk9Eq2VegSN4lgsljGY8boyfX3l3Pw58e+R9oyPe/Ye7r3NwuiQ3w0nkXoQ+RC+d240V6n7eZme2mEPqQvg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: + '@csstools/css-color-parser': 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 + '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) + '@csstools/utilities': 1.0.0(postcss@8.4.35) + postcss: 8.4.35 + dev: true + + /@csstools/postcss-scope-pseudo-class@3.0.1(postcss@8.4.35): + resolution: {integrity: sha512-3ZFonK2gfgqg29gUJ2w7xVw2wFJ1eNWVDONjbzGkm73gJHVCYK5fnCqlLr+N+KbEfv2XbWAO0AaOJCFB6Fer6A==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.35 + postcss-selector-parser: 6.0.15 + dev: true + + /@csstools/postcss-stepped-value-functions@3.0.5(postcss@8.4.35): + resolution: {integrity: sha512-B8K8RaTrYVZLxbNzVUvFO3SlCDJDaUTAO7KRth05fa7f01ufPvb6ztdBuxSoRwOtmNp8iROxPJHOemWo2kBBtA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + '@csstools/css-calc': 1.1.7(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 + postcss: 8.4.35 + dev: true + + /@csstools/postcss-text-decoration-shorthand@3.0.4(postcss@8.4.35): + resolution: {integrity: sha512-yUZmbnUemgQmja7SpOZeU45+P49wNEgQguRdyTktFkZsHf7Gof+ZIYfvF6Cm+LsU1PwSupy4yUeEKKjX5+k6cQ==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + '@csstools/color-helpers': 4.0.0 postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-oklab-function@3.0.7(postcss@8.4.35): - resolution: {integrity: sha512-vBFTQD3CARB3u/XIGO44wWbcO7xG/4GsYqJlcPuUGRSK8mtxes6n4vvNFlIByyAZy2k4d4RY63nyvTbMpeNTaQ==} + /@csstools/postcss-trigonometric-functions@3.0.5(postcss@8.4.35): + resolution: {integrity: sha512-RhBfQ0TsBudyPuoo8pXKdfQuUiQxMU/Sc5GyV57bWk93JbUHXq6b4CdPx+B/tHUeFKvocVJn/e2jbu96rh0d3Q==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-color-parser': 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.35) + '@csstools/css-calc': 1.1.7(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 postcss: 8.4.35 dev: true - /@csstools/postcss-progressive-custom-properties@3.0.2(postcss@8.4.35): - resolution: {integrity: sha512-YEvTozk1SxnV/PGL5DllBVDuLQ+jiQhyCSQiZJ6CwBMU5JQ9hFde3i1qqzZHuclZfptjrU0JjlX4ePsOhxNzHw==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.4 - dependencies: - postcss: 8.4.35 - postcss-value-parser: 4.2.0 - dev: true - - /@csstools/postcss-relative-color-syntax@2.0.7(postcss@8.4.35): - resolution: {integrity: sha512-2AiFbJSVF4EyymLxme4JzSrbXykHolx8DdZECHjYKMhoulhKLltx5ccYgtrK3BmXGd3v3nJrWFCc8JM8bjuiOg==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.4 - dependencies: - '@csstools/css-color-parser': 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.35) - postcss: 8.4.35 - dev: true - - /@csstools/postcss-scope-pseudo-class@3.0.0(postcss@8.4.35): - resolution: {integrity: sha512-GFNVsD97OuEcfHmcT0/DAZWAvTM/FFBDQndIOLawNc1Wq8YqpZwBdHa063Lq+Irk7azygTT+Iinyg3Lt76p7rg==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.4 - dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.13 - dev: true - - /@csstools/postcss-stepped-value-functions@3.0.2(postcss@8.4.35): - resolution: {integrity: sha512-I3wX44MZVv+tDuWfrd3BTvRB/YRIM2F5v1MBtTI89sxpFn47mNpTwpPYUOGPVCgKlRDfZSlxIUYhUQmqRQZZFQ==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.4 - dependencies: - '@csstools/css-calc': 1.1.4(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 - postcss: 8.4.35 - dev: true - - /@csstools/postcss-text-decoration-shorthand@3.0.3(postcss@8.4.35): - resolution: {integrity: sha512-d5J9m49HhqXRcw1S6vTZuviHi/iknUKGjBpChiNK1ARg9sSa3b8m5lsWz5Izs8ISORZdv2bZRwbw5Z2R6gQ9kQ==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.4 - dependencies: - '@csstools/color-helpers': 3.0.2 - postcss: 8.4.35 - postcss-value-parser: 4.2.0 - dev: true - - /@csstools/postcss-trigonometric-functions@3.0.2(postcss@8.4.35): - resolution: {integrity: sha512-AwzNhF4QOKaLOKvMljwwFkeYXwufhRO15G+kKohHkyoNOL75xWkN+W2Y9ik9tSeAyDv+cYNlYaF+o/a79WjVjg==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.4 - dependencies: - '@csstools/css-calc': 1.1.4(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 - postcss: 8.4.35 - dev: true - - /@csstools/postcss-unset-value@3.0.0(postcss@8.4.35): - resolution: {integrity: sha512-P0JD1WHh3avVyKKRKjd0dZIjCEeaBer8t1BbwGMUDtSZaLhXlLNBqZ8KkqHzYWXOJgHleXAny2/sx8LYl6qhEA==} + /@csstools/postcss-unset-value@3.0.1(postcss@8.4.35): + resolution: {integrity: sha512-dbDnZ2ja2U8mbPP0Hvmt2RMEGBiF1H7oY6HYSpjteXJGihYwgxgTr6KRbbJ/V6c+4wd51M+9980qG4gKVn5ttg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 @@ -718,13 +742,22 @@ packages: postcss: 8.4.35 dev: true - /@csstools/selector-specificity@3.0.0(postcss-selector-parser@6.0.13): - resolution: {integrity: sha512-hBI9tfBtuPIi885ZsZ32IMEU/5nlZH/KOVYJCOh7gyMxaVLGmLedYqFN6Ui1LXkI8JlC8IsuC0rF0btcRZKd5g==} + /@csstools/selector-specificity@3.0.2(postcss-selector-parser@6.0.15): + resolution: {integrity: sha512-RpHaZ1h9LE7aALeQXmXrJkRG84ZxIsctEN2biEUmFyKpzFM3zZ35eUMcIzZFsw/2olQE6v69+esEqU2f1MKycg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss-selector-parser: ^6.0.13 dependencies: - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.15 + dev: true + + /@csstools/utilities@1.0.0(postcss@8.4.35): + resolution: {integrity: sha512-tAgvZQe/t2mlvpNosA4+CkMiZ2azISW5WPAcdSalZlEjQvUfghHxfQcrCiK/7/CrfAWVxyM88kGFYO82heIGDg==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.35 dev: true /@drizzle-team/studio@0.0.39: @@ -1768,7 +1801,7 @@ packages: '@internationalized/date': 3.5.1 dequal: 2.0.3 focus-trap: 7.5.4 - nanoid: 5.0.5 + nanoid: 5.0.6 svelte: 4.2.11 dev: false @@ -1782,7 +1815,7 @@ packages: '@internationalized/date': 3.5.2 dequal: 2.0.3 focus-trap: 7.5.4 - nanoid: 5.0.5 + nanoid: 5.0.6 svelte: 4.2.11 dev: true @@ -3462,7 +3495,7 @@ packages: hasBin: true dependencies: '@actions/core': 1.10.1 - dotenv: 16.4.4 + dotenv: 16.4.5 front-matter: 4.0.2 nanoid: 4.0.2 oslo: 1.1.2 @@ -3518,7 +3551,7 @@ packages: dependencies: '@internationalized/date': 3.5.1 '@melt-ui/svelte': 0.71.2(svelte@4.2.11) - nanoid: 5.0.5 + nanoid: 5.0.6 svelte: 4.2.11 dev: false @@ -3550,17 +3583,6 @@ packages: dependencies: fill-range: 7.0.1 - /browserslist@4.22.1: - resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001579 - electron-to-chromium: 1.4.576 - node-releases: 2.0.13 - update-browserslist-db: 1.0.13(browserslist@4.22.1) - dev: true - /browserslist@4.22.2: resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -3572,6 +3594,17 @@ packages: update-browserslist-db: 1.0.13(browserslist@4.22.2) dev: true + /browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001588 + electron-to-chromium: 1.4.677 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.23.0) + dev: true + /buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} @@ -3618,6 +3651,10 @@ packages: resolution: {integrity: sha512-u5AUVkixruKHJjw/pj9wISlcMpgFWzSrczLZbrqBSxukQixmg0SJ5sZTpvaFvxU0HoQKd4yoyAogyrAz9pzJnA==} dev: true + /caniuse-lite@1.0.30001588: + resolution: {integrity: sha512-+hVY9jE44uKLkH0SrUTqxjxqNTOWHsbnQDIKjwkZ3lNTzUUVdBLBGXtj/q5Mp5u98r3droaZAewQuEDzjQdZlQ==} + dev: true + /chai@4.3.10: resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==} engines: {node: '>=4'} @@ -3801,14 +3838,14 @@ packages: /css-background-parser@0.1.0: resolution: {integrity: sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA==} - /css-blank-pseudo@6.0.0(postcss@8.4.35): - resolution: {integrity: sha512-VbfLlOWO7sBHBTn6pwDQzc07Z0SDydgDBfNfCE0nvrehdBNv9RKsuupIRa/qal0+fBZhAALyQDPMKz5lnvcchw==} + /css-blank-pseudo@6.0.1(postcss@8.4.35): + resolution: {integrity: sha512-goSnEITByxTzU4Oh5oJZrEWudxTqk7L6IXj1UW69pO6Hv0UdX+Vsrt02FFu5DweRh2bLu6WpX/+zsQCu5O1gKw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: postcss: 8.4.35 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.15 dev: true /css-box-shadow@1.0.0-3: @@ -3818,20 +3855,20 @@ packages: resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} engines: {node: '>=4'} - /css-has-pseudo@6.0.0(postcss@8.4.35): - resolution: {integrity: sha512-X+r+JBuoO37FBOWVNhVJhxtSBUFHgHbrcc0CjFT28JEdOw1qaDwABv/uunyodUuSy2hMPe9j/HjssxSlvUmKjg==} + /css-has-pseudo@6.0.2(postcss@8.4.35): + resolution: {integrity: sha512-Z2Qm5yyOvJRTy6THdUlnGIX6PW/1wOc4FHWlfkcBkfkpZ3oz6lPdG+h+J7t1HZHT4uSSVR8XatXiMpqMUADXow==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/selector-specificity': 3.0.0(postcss-selector-parser@6.0.13) + '@csstools/selector-specificity': 3.0.2(postcss-selector-parser@6.0.15) postcss: 8.4.35 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.15 postcss-value-parser: 4.2.0 dev: true - /css-prefers-color-scheme@9.0.0(postcss@8.4.35): - resolution: {integrity: sha512-03QGAk/FXIRseDdLb7XAiu6gidQ0Nd8945xuM7VFVPpc6goJsG9uIO8xQjTxwbPdPIIV4o4AJoOJyt8gwDl67g==} + /css-prefers-color-scheme@9.0.1(postcss@8.4.35): + resolution: {integrity: sha512-iFit06ochwCKPRiWagbTa1OAWCvWWVdEnIFd8BaRrgO8YrrNh4RAWUQTFcYX5tdFZgFl1DJ3iiULchZyEbnF4g==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 @@ -3853,8 +3890,8 @@ packages: mdn-data: 2.0.30 source-map-js: 1.0.2 - /cssdb@7.9.0: - resolution: {integrity: sha512-WPMT9seTQq6fPAa1yN4zjgZZeoTriSN2LqW9C+otjar12DQIWA4LuSfFrvFJiKp4oD0xIk1vumDLw8K9ur4NBw==} + /cssdb@7.11.0: + resolution: {integrity: sha512-YUVAJhjDcTZzVD5XE49l3PQtGE29vvhzaL1bM3BtkvSmIRJeYENdfn1dn5jauBI7BBF+IyyiBS+oSVx3Hz/Gaw==} dev: true /cssesc@3.0.0: @@ -3973,8 +4010,8 @@ packages: esutils: 2.0.3 dev: true - /dotenv@16.4.4: - resolution: {integrity: sha512-XvPXc8XAQThSjAbY6cQ/9PcBXmFoWuw1sQ3b8HqUCR6ziGXjkTi//kB9SWa2UwqlgdAIuRqAa/9hVljzPehbYg==} + /dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} /dreamopt@0.8.0: @@ -4085,14 +4122,14 @@ packages: postgres: 3.4.3 dev: false - /electron-to-chromium@1.4.576: - resolution: {integrity: sha512-yXsZyXJfAqzWk1WKryr0Wl0MN2D47xodPvEEwlVePBnhU5E7raevLQR+E6b9JAD3GfL/7MbAL9ZtWQQPcLx7wA==} - dev: true - /electron-to-chromium@1.4.638: resolution: {integrity: sha512-gpmbAG2LbfPKcDaL5m9IKutKjUx4ZRkvGNkgL/8nKqxkXsBVYykVULboWlqCrHsh3razucgDJDuKoWJmGPdItA==} dev: true + /electron-to-chromium@1.4.677: + resolution: {integrity: sha512-erDa3CaDzwJOpyvfKhOiJjBVNnMM0qxHq47RheVVwsSQrgBA9ZSGV9kdaOfZDPXcHzhG7lBxhj6A7KvfLJBd6Q==} + dev: true + /emoji-regex@10.3.0: resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} @@ -5172,8 +5209,8 @@ packages: oslo: 1.0.1 dev: false - /lucide-svelte@0.323.0(svelte@4.2.11): - resolution: {integrity: sha512-3GEFk1vCwB8BtHTHZTocFJfX6AtTLQw9a74JSuihAGx+MzhxqeWk8W1TkM4WUlvE0x9UdONM2rJGRyx9IyjkJg==} + /lucide-svelte@0.335.0(svelte@4.2.11): + resolution: {integrity: sha512-paZUqH0Ei2LH9wC8UjEb5tVIiTWYa8J1tu0yHPrD0pSmtD98+MbPKUMQotFOh7t+2NS72PFQ0OJBrtzJcIwTpg==} peerDependencies: svelte: ^3 || ^4 || ^5.0.0-next.42 dependencies: @@ -5410,8 +5447,8 @@ packages: hasBin: true dev: false - /nanoid@5.0.5: - resolution: {integrity: sha512-/Veqm+QKsyMY3kqi4faWplnY1u+VuKO3dD2binyPIybP31DRO29bPF+1mszgLnrR2KqSLceFLBNw0zmvDzN1QQ==} + /nanoid@5.0.6: + resolution: {integrity: sha512-rRq0eMHoGZxlvaFOUdK1Ev83Bd1IgzzR+WJ3IbDJ7QOSdAxYjlurSPqFs9s4lJg29RT6nPwizFtJhQS6V5xgiA==} engines: {node: ^18 || >=20} hasBin: true @@ -5440,10 +5477,6 @@ packages: hasBin: true dev: false - /node-releases@2.0.13: - resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} - dev: true - /node-releases@2.0.14: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} dev: true @@ -5763,14 +5796,14 @@ packages: fsevents: 2.3.2 dev: true - /postcss-attribute-case-insensitive@6.0.2(postcss@8.4.35): - resolution: {integrity: sha512-IRuCwwAAQbgaLhxQdQcIIK0dCVXg3XDUnzgKD8iwdiYdwU4rMWRWyl/W9/0nA4ihVpq5pyALiHB2veBJ0292pw==} + /postcss-attribute-case-insensitive@6.0.3(postcss@8.4.35): + resolution: {integrity: sha512-KHkmCILThWBRtg+Jn1owTnHPnFit4OkqS+eKiGEOPIGke54DCeYGJ6r0Fx/HjfE9M9kznApCLcU0DvnPchazMQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: postcss: 8.4.35 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.15 dev: true /postcss-clamp@4.1.0(postcss@8.4.35): @@ -5783,115 +5816,122 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-color-functional-notation@6.0.2(postcss@8.4.35): - resolution: {integrity: sha512-FsjSmlSufuiFBsIqQ++VxFmvX7zKndZpBkHmfXr4wqhvzM92FTEkAh703iqWTl1U3faTgqioIqCbfqdWiFVwtw==} + /postcss-color-functional-notation@6.0.5(postcss@8.4.35): + resolution: {integrity: sha512-aTFsIy89ftjyclwUHRwvz1IxucLzVrzmmcXmtbPWT9GdyYeaJEKeAwbaZzOZn7AQlXg4xfwgkYhKsofC4aLIwg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.35) + '@csstools/css-color-parser': 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 + '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) + '@csstools/utilities': 1.0.0(postcss@8.4.35) + postcss: 8.4.35 + dev: true + + /postcss-color-hex-alpha@9.0.4(postcss@8.4.35): + resolution: {integrity: sha512-XQZm4q4fNFqVCYMGPiBjcqDhuG7Ey2xrl99AnDJMyr5eDASsAGalndVgHZF8i97VFNy1GQeZc4q2ydagGmhelQ==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + '@csstools/utilities': 1.0.0(postcss@8.4.35) postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true - /postcss-color-hex-alpha@9.0.2(postcss@8.4.35): - resolution: {integrity: sha512-SfPjgr//VQ/DOCf80STIAsdAs7sbIbxATvVmd+Ec7JvR8onz9pjawhq3BJM3Pie40EE3TyB0P6hft16D33Nlyg==} + /postcss-color-rebeccapurple@9.0.3(postcss@8.4.35): + resolution: {integrity: sha512-ruBqzEFDYHrcVq3FnW3XHgwRqVMrtEPLBtD7K2YmsLKVc2jbkxzzNEctJKsPCpDZ+LeMHLKRDoSShVefGc+CkQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: + '@csstools/utilities': 1.0.0(postcss@8.4.35) postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true - /postcss-color-rebeccapurple@9.0.1(postcss@8.4.35): - resolution: {integrity: sha512-ds4cq5BjRieizVb2PnvbJ0omg9VCo2/KzluvoFZbxuGpsGJ5BQSD93CHBooinEtangCM5YqUOerGDl4xGmOb6Q==} + /postcss-custom-media@10.0.3(postcss@8.4.35): + resolution: {integrity: sha512-wfJ9nKpLn/Qy7LASKu0Rj9Iq2uMzlRt27P4FAE1889IKRMdYUgy8SqvdXfAOs7LJLQX9Fjm0mZ+TSFphD/mKwA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: + '@csstools/cascade-layer-name-parser': 1.0.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 + '@csstools/media-query-list-parser': 2.1.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + postcss: 8.4.35 + dev: true + + /postcss-custom-properties@13.3.5(postcss@8.4.35): + resolution: {integrity: sha512-xHg8DTCMfN2nrqs2CQTF+0m5jgnzKL5zrW5Y05KF6xBRO0uDPxiplBm/xcr1o49SLbyJXkMuaRJKhRzkrquKnQ==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + '@csstools/cascade-layer-name-parser': 1.0.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 + '@csstools/utilities': 1.0.0(postcss@8.4.35) postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true - /postcss-custom-media@10.0.2(postcss@8.4.35): - resolution: {integrity: sha512-zcEFNRmDm2fZvTPdI1pIW3W//UruMcLosmMiCdpQnrCsTRzWlKQPYMa1ud9auL0BmrryKK1+JjIGn19K0UjO/w==} + /postcss-custom-selectors@7.1.7(postcss@8.4.35): + resolution: {integrity: sha512-N19MpExaR+hYTXU59VO02xE42zLoAUYSVcupwkKlWWLteOb+sWCWHw5FhV7u7gVLTzaGULy7nZP3DNTHgOZAPA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/cascade-layer-name-parser': 1.0.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 - '@csstools/media-query-list-parser': 2.1.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) + '@csstools/cascade-layer-name-parser': 1.0.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 postcss: 8.4.35 + postcss-selector-parser: 6.0.15 dev: true - /postcss-custom-properties@13.3.2(postcss@8.4.35): - resolution: {integrity: sha512-2Coszybpo8lpLY24vy2CYv9AasiZ39/bs8Imv0pWMq55Gl8NWzfc24OAo3zIX7rc6uUJAqESnVOMZ6V6lpMjJA==} + /postcss-dir-pseudo-class@8.0.1(postcss@8.4.35): + resolution: {integrity: sha512-uULohfWBBVoFiZXgsQA24JV6FdKIidQ+ZqxOouhWwdE+qJlALbkS5ScB43ZTjPK+xUZZhlaO/NjfCt5h4IKUfw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/cascade-layer-name-parser': 1.0.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 + postcss: 8.4.35 + postcss-selector-parser: 6.0.15 + dev: true + + /postcss-double-position-gradients@5.0.4(postcss@8.4.35): + resolution: {integrity: sha512-xOH2QhazCPeYR+ziYaDcGlpo7Bpw8PVoggOFfU/xPkmBRUQH8MR2eWoPY1CZM93CB0WKs2mxq3ORo83QGIooLw==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) + '@csstools/utilities': 1.0.0(postcss@8.4.35) postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true - /postcss-custom-selectors@7.1.6(postcss@8.4.35): - resolution: {integrity: sha512-svsjWRaxqL3vAzv71dV0/65P24/FB8TbPX+lWyyf9SZ7aZm4S4NhCn7N3Bg+Z5sZunG3FS8xQ80LrCU9hb37cw==} + /postcss-focus-visible@9.0.1(postcss@8.4.35): + resolution: {integrity: sha512-N2VQ5uPz3Z9ZcqI5tmeholn4d+1H14fKXszpjogZIrFbhaq0zNAtq8sAnw6VLiqGbL8YBzsnu7K9bBkTqaRimQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/cascade-layer-name-parser': 1.0.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 postcss: 8.4.35 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.15 dev: true - /postcss-dir-pseudo-class@8.0.0(postcss@8.4.35): - resolution: {integrity: sha512-Oy5BBi0dWPwij/IA+yDYj+/OBMQ9EPqAzTHeSNUYrUWdll/PRJmcbiUj0MNcsBi681I1gcSTLvMERPaXzdbvJg==} + /postcss-focus-within@8.0.1(postcss@8.4.35): + resolution: {integrity: sha512-NFU3xcY/xwNaapVb+1uJ4n23XImoC86JNwkY/uduytSl2s9Ekc2EpzmRR63+ExitnW3Mab3Fba/wRPCT5oDILA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: postcss: 8.4.35 - postcss-selector-parser: 6.0.13 - dev: true - - /postcss-double-position-gradients@5.0.2(postcss@8.4.35): - resolution: {integrity: sha512-KTbvdOOy8z8zb0BTkEg4/1vqlRlApdvjw8/pFoehgQl0WVO+fezDGlvo0B8xRA+XccA7ohkQCULKNsiNOx70Cw==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.4 - dependencies: - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.35) - postcss: 8.4.35 - postcss-value-parser: 4.2.0 - dev: true - - /postcss-focus-visible@9.0.0(postcss@8.4.35): - resolution: {integrity: sha512-zA4TbVaIaT8npZBEROhZmlc+GBKE8AELPHXE7i4TmIUEQhw/P/mSJfY9t6tBzpQ1rABeGtEOHYrW4SboQeONMQ==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.4 - dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.13 - dev: true - - /postcss-focus-within@8.0.0(postcss@8.4.35): - resolution: {integrity: sha512-E7+J9nuQzZaA37D/MUZMX1K817RZGDab8qw6pFwzAkDd/QtlWJ9/WTKmzewNiuxzeq6WWY7ATiRePVoDKp+DnA==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.4 - dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.15 dev: true /postcss-font-variant@5.0.0(postcss@8.4.35): @@ -5902,8 +5942,8 @@ packages: postcss: 8.4.35 dev: true - /postcss-gap-properties@5.0.0(postcss@8.4.35): - resolution: {integrity: sha512-YjsEEL6890P7MCv6fch6Am1yq0EhQCJMXyT4LBohiu87+4/WqR7y5W3RIv53WdA901hhytgRvjlrAhibhW4qsA==} + /postcss-gap-properties@5.0.1(postcss@8.4.35): + resolution: {integrity: sha512-k2z9Cnngc24c0KF4MtMuDdToROYqGMMUQGcE6V0odwjHyOHtaDBlLeRBV70y9/vF7KIbShrTRZ70JjsI1BZyWw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 @@ -5911,12 +5951,13 @@ packages: postcss: 8.4.35 dev: true - /postcss-image-set-function@6.0.1(postcss@8.4.35): - resolution: {integrity: sha512-VlZncC9hhZ5tg0JllY4g6Z28BeoPO8DIkelioEEkXL0AA0IORlqYpTi2L8TUnl4YQrlwvBgxVy+mdZJw5R/cIQ==} + /postcss-image-set-function@6.0.3(postcss@8.4.35): + resolution: {integrity: sha512-i2bXrBYzfbRzFnm+pVuxVePSTCRiNmlfssGI4H0tJQvDue+yywXwUxe68VyzXs7cGtMaH6MCLY6IbCShrSroCw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: + '@csstools/utilities': 1.0.0(postcss@8.4.35) postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true @@ -5953,16 +5994,17 @@ packages: camelcase-css: 2.0.1 postcss: 8.4.35 - /postcss-lab-function@6.0.7(postcss@8.4.35): - resolution: {integrity: sha512-4d1lhDVPukHFqkMv4G5vVcK+tgY52vwb5uR1SWKOaO5389r2q8fMxBWuXSW+YtbCOEGP0/X9KERi9E9le2pJuw==} + /postcss-lab-function@6.0.10(postcss@8.4.35): + resolution: {integrity: sha512-Csvw/CwwuwTojK2O3Ad0SvYKrfnAKy+uvT+1Fjk6igR+n8gHuJHIwdj1A2s46EZZojg3RkibdMBuv1vMvR6Sng==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-color-parser': 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.35) + '@csstools/css-color-parser': 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 + '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) + '@csstools/utilities': 1.0.0(postcss@8.4.35) postcss: 8.4.35 dev: true @@ -6018,8 +6060,8 @@ packages: yaml: 2.3.4 dev: true - /postcss-logical@7.0.0(postcss@8.4.35): - resolution: {integrity: sha512-zYf3vHkoW82f5UZTEXChTJvH49Yl9X37axTZsJGxrCG2kOUwtaAoz9E7tqYg0lsIoJLybaL8fk/2mOi81zVIUw==} + /postcss-logical@7.0.1(postcss@8.4.35): + resolution: {integrity: sha512-8GwUQZE0ri0K0HJHkDv87XOLC8DE0msc+HoWLeKdtjDZEwpZ5xuK3QdV6FhmHSQW40LPkg43QzvATRAI3LsRkg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 @@ -6037,15 +6079,15 @@ packages: postcss: 8.4.35 postcss-selector-parser: 6.0.13 - /postcss-nesting@12.0.1(postcss@8.4.35): - resolution: {integrity: sha512-6LCqCWP9pqwXw/njMvNK0hGY44Fxc4B2EsGbn6xDcxbNRzP8GYoxT7yabVVMLrX3quqOJ9hg2jYMsnkedOf8pA==} + /postcss-nesting@12.0.3(postcss@8.4.35): + resolution: {integrity: sha512-yrtMRPFNkfZMv9ikBvZ/Eh3RxhpMBKQ3KzD7LCY8+jYVlgju/Mdcxi4JY8bW2Y7ISXw8GTLuF/o+kFtp+yaVfQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/selector-specificity': 3.0.0(postcss-selector-parser@6.0.13) + '@csstools/selector-specificity': 3.0.2(postcss-selector-parser@6.0.15) postcss: 8.4.35 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.15 dev: true /postcss-opacity-percentage@2.0.0(postcss@8.4.35): @@ -6057,8 +6099,8 @@ packages: postcss: 8.4.35 dev: true - /postcss-overflow-shorthand@5.0.0(postcss@8.4.35): - resolution: {integrity: sha512-2rlxDyeSics/hC2FuMdPnWiP9WUPZ5x7FTuArXLFVpaSQ2woPSfZS4RD59HuEokbZhs/wPUQJ1E3MT6zVv94MQ==} + /postcss-overflow-shorthand@5.0.1(postcss@8.4.35): + resolution: {integrity: sha512-XzjBYKLd1t6vHsaokMV9URBt2EwC9a7nDhpQpjoPk2HRTSQfokPfyAS/Q7AOrzUu6q+vp/GnrDBGuj/FCaRqrQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 @@ -6075,8 +6117,8 @@ packages: postcss: 8.4.35 dev: true - /postcss-place@9.0.0(postcss@8.4.35): - resolution: {integrity: sha512-qLEPD9VPH5opDVemwmRaujODF9nExn24VOC3ghgVLEvfYN7VZLwJHes0q/C9YR5hI2UC3VgBE8Wkdp1TxCXhtg==} + /postcss-place@9.0.1(postcss@8.4.35): + resolution: {integrity: sha512-JfL+paQOgRQRMoYFc2f73pGuG/Aw3tt4vYMR6UA3cWVMxivviPTnMFnFTczUJOA4K2Zga6xgQVE+PcLs64WC8Q==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 @@ -6085,83 +6127,83 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-preset-env@9.3.0(postcss@8.4.35): - resolution: {integrity: sha512-ycw6doPrqV6QxDCtgiyGDef61bEfiSc59HGM4gOw/wxQxmKnhuEery61oOC/5ViENz/ycpRsuhTexs1kUBTvVw==} + /postcss-preset-env@9.4.0(postcss@8.4.35): + resolution: {integrity: sha512-5X2UA4Dn4xo7sJFCxlzW/dAGo71Oxh/K5DVls33hd2e3j06OKnW5FJQTw2hB0wTnGv0f6WcMaVBGFqcEfAgwlw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/postcss-cascade-layers': 4.0.1(postcss@8.4.35) - '@csstools/postcss-color-function': 3.0.7(postcss@8.4.35) - '@csstools/postcss-color-mix-function': 2.0.7(postcss@8.4.35) - '@csstools/postcss-exponential-functions': 1.0.1(postcss@8.4.35) - '@csstools/postcss-font-format-keywords': 3.0.0(postcss@8.4.35) - '@csstools/postcss-gamut-mapping': 1.0.0(postcss@8.4.35) - '@csstools/postcss-gradients-interpolation-method': 4.0.7(postcss@8.4.35) - '@csstools/postcss-hwb-function': 3.0.6(postcss@8.4.35) - '@csstools/postcss-ic-unit': 3.0.2(postcss@8.4.35) - '@csstools/postcss-initial': 1.0.0(postcss@8.4.35) - '@csstools/postcss-is-pseudo-class': 4.0.3(postcss@8.4.35) - '@csstools/postcss-logical-float-and-clear': 2.0.0(postcss@8.4.35) - '@csstools/postcss-logical-overflow': 1.0.0(postcss@8.4.35) - '@csstools/postcss-logical-overscroll-behavior': 1.0.0(postcss@8.4.35) - '@csstools/postcss-logical-resize': 2.0.0(postcss@8.4.35) - '@csstools/postcss-logical-viewport-units': 2.0.3(postcss@8.4.35) - '@csstools/postcss-media-minmax': 1.1.0(postcss@8.4.35) - '@csstools/postcss-media-queries-aspect-ratio-number-values': 2.0.3(postcss@8.4.35) - '@csstools/postcss-nested-calc': 3.0.0(postcss@8.4.35) - '@csstools/postcss-normalize-display-values': 3.0.1(postcss@8.4.35) - '@csstools/postcss-oklab-function': 3.0.7(postcss@8.4.35) - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.35) - '@csstools/postcss-relative-color-syntax': 2.0.7(postcss@8.4.35) - '@csstools/postcss-scope-pseudo-class': 3.0.0(postcss@8.4.35) - '@csstools/postcss-stepped-value-functions': 3.0.2(postcss@8.4.35) - '@csstools/postcss-text-decoration-shorthand': 3.0.3(postcss@8.4.35) - '@csstools/postcss-trigonometric-functions': 3.0.2(postcss@8.4.35) - '@csstools/postcss-unset-value': 3.0.0(postcss@8.4.35) + '@csstools/postcss-cascade-layers': 4.0.3(postcss@8.4.35) + '@csstools/postcss-color-function': 3.0.10(postcss@8.4.35) + '@csstools/postcss-color-mix-function': 2.0.10(postcss@8.4.35) + '@csstools/postcss-exponential-functions': 1.0.4(postcss@8.4.35) + '@csstools/postcss-font-format-keywords': 3.0.2(postcss@8.4.35) + '@csstools/postcss-gamut-mapping': 1.0.3(postcss@8.4.35) + '@csstools/postcss-gradients-interpolation-method': 4.0.10(postcss@8.4.35) + '@csstools/postcss-hwb-function': 3.0.9(postcss@8.4.35) + '@csstools/postcss-ic-unit': 3.0.4(postcss@8.4.35) + '@csstools/postcss-initial': 1.0.1(postcss@8.4.35) + '@csstools/postcss-is-pseudo-class': 4.0.5(postcss@8.4.35) + '@csstools/postcss-light-dark-function': 1.0.0(postcss@8.4.35) + '@csstools/postcss-logical-float-and-clear': 2.0.1(postcss@8.4.35) + '@csstools/postcss-logical-overflow': 1.0.1(postcss@8.4.35) + '@csstools/postcss-logical-overscroll-behavior': 1.0.1(postcss@8.4.35) + '@csstools/postcss-logical-resize': 2.0.1(postcss@8.4.35) + '@csstools/postcss-logical-viewport-units': 2.0.6(postcss@8.4.35) + '@csstools/postcss-media-minmax': 1.1.3(postcss@8.4.35) + '@csstools/postcss-media-queries-aspect-ratio-number-values': 2.0.6(postcss@8.4.35) + '@csstools/postcss-nested-calc': 3.0.2(postcss@8.4.35) + '@csstools/postcss-normalize-display-values': 3.0.2(postcss@8.4.35) + '@csstools/postcss-oklab-function': 3.0.10(postcss@8.4.35) + '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) + '@csstools/postcss-relative-color-syntax': 2.0.10(postcss@8.4.35) + '@csstools/postcss-scope-pseudo-class': 3.0.1(postcss@8.4.35) + '@csstools/postcss-stepped-value-functions': 3.0.5(postcss@8.4.35) + '@csstools/postcss-text-decoration-shorthand': 3.0.4(postcss@8.4.35) + '@csstools/postcss-trigonometric-functions': 3.0.5(postcss@8.4.35) + '@csstools/postcss-unset-value': 3.0.1(postcss@8.4.35) autoprefixer: 10.4.17(postcss@8.4.35) - browserslist: 4.22.1 - css-blank-pseudo: 6.0.0(postcss@8.4.35) - css-has-pseudo: 6.0.0(postcss@8.4.35) - css-prefers-color-scheme: 9.0.0(postcss@8.4.35) - cssdb: 7.9.0 + browserslist: 4.23.0 + css-blank-pseudo: 6.0.1(postcss@8.4.35) + css-has-pseudo: 6.0.2(postcss@8.4.35) + css-prefers-color-scheme: 9.0.1(postcss@8.4.35) + cssdb: 7.11.0 postcss: 8.4.35 - postcss-attribute-case-insensitive: 6.0.2(postcss@8.4.35) + postcss-attribute-case-insensitive: 6.0.3(postcss@8.4.35) postcss-clamp: 4.1.0(postcss@8.4.35) - postcss-color-functional-notation: 6.0.2(postcss@8.4.35) - postcss-color-hex-alpha: 9.0.2(postcss@8.4.35) - postcss-color-rebeccapurple: 9.0.1(postcss@8.4.35) - postcss-custom-media: 10.0.2(postcss@8.4.35) - postcss-custom-properties: 13.3.2(postcss@8.4.35) - postcss-custom-selectors: 7.1.6(postcss@8.4.35) - postcss-dir-pseudo-class: 8.0.0(postcss@8.4.35) - postcss-double-position-gradients: 5.0.2(postcss@8.4.35) - postcss-focus-visible: 9.0.0(postcss@8.4.35) - postcss-focus-within: 8.0.0(postcss@8.4.35) + postcss-color-functional-notation: 6.0.5(postcss@8.4.35) + postcss-color-hex-alpha: 9.0.4(postcss@8.4.35) + postcss-color-rebeccapurple: 9.0.3(postcss@8.4.35) + postcss-custom-media: 10.0.3(postcss@8.4.35) + postcss-custom-properties: 13.3.5(postcss@8.4.35) + postcss-custom-selectors: 7.1.7(postcss@8.4.35) + postcss-dir-pseudo-class: 8.0.1(postcss@8.4.35) + postcss-double-position-gradients: 5.0.4(postcss@8.4.35) + postcss-focus-visible: 9.0.1(postcss@8.4.35) + postcss-focus-within: 8.0.1(postcss@8.4.35) postcss-font-variant: 5.0.0(postcss@8.4.35) - postcss-gap-properties: 5.0.0(postcss@8.4.35) - postcss-image-set-function: 6.0.1(postcss@8.4.35) - postcss-lab-function: 6.0.7(postcss@8.4.35) - postcss-logical: 7.0.0(postcss@8.4.35) - postcss-nesting: 12.0.1(postcss@8.4.35) + postcss-gap-properties: 5.0.1(postcss@8.4.35) + postcss-image-set-function: 6.0.3(postcss@8.4.35) + postcss-lab-function: 6.0.10(postcss@8.4.35) + postcss-logical: 7.0.1(postcss@8.4.35) + postcss-nesting: 12.0.3(postcss@8.4.35) postcss-opacity-percentage: 2.0.0(postcss@8.4.35) - postcss-overflow-shorthand: 5.0.0(postcss@8.4.35) + postcss-overflow-shorthand: 5.0.1(postcss@8.4.35) postcss-page-break: 3.0.4(postcss@8.4.35) - postcss-place: 9.0.0(postcss@8.4.35) - postcss-pseudo-class-any-link: 9.0.0(postcss@8.4.35) + postcss-place: 9.0.1(postcss@8.4.35) + postcss-pseudo-class-any-link: 9.0.1(postcss@8.4.35) postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.35) - postcss-selector-not: 7.0.1(postcss@8.4.35) - postcss-value-parser: 4.2.0 + postcss-selector-not: 7.0.2(postcss@8.4.35) dev: true - /postcss-pseudo-class-any-link@9.0.0(postcss@8.4.35): - resolution: {integrity: sha512-QNCYIL98VKFKY6HGDEJpF6+K/sg9bxcUYnOmNHJxZS5wsFDFaVoPeG68WAuhsqwbIBSo/b9fjEnTwY2mTSD+uA==} + /postcss-pseudo-class-any-link@9.0.1(postcss@8.4.35): + resolution: {integrity: sha512-cKYGGZ9yzUZi+dZd7XT2M8iSDfo+T2Ctbpiizf89uBTBfIpZpjvTavzIJXpCReMVXSKROqzpxClNu6fz4DHM0Q==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: postcss: 8.4.35 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.15 dev: true /postcss-replace-overflow-wrap@4.0.0(postcss@8.4.35): @@ -6190,14 +6232,14 @@ packages: postcss: 8.4.35 dev: true - /postcss-selector-not@7.0.1(postcss@8.4.35): - resolution: {integrity: sha512-1zT5C27b/zeJhchN7fP0kBr16Cc61mu7Si9uWWLoA3Px/D9tIJPKchJCkUH3tPO5D0pCFmGeApAv8XpXBQJ8SQ==} + /postcss-selector-not@7.0.2(postcss@8.4.35): + resolution: {integrity: sha512-/SSxf/90Obye49VZIfc0ls4H0P6i6V1iHv0pzZH8SdgvZOPFkF37ef1r5cyWcMflJSFJ5bfuoluTnFnBBFiuSA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: postcss: 8.4.35 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.15 dev: true /postcss-selector-parser@6.0.13: @@ -6207,6 +6249,14 @@ packages: cssesc: 3.0.0 util-deprecate: 1.0.2 + /postcss-selector-parser@6.0.15: + resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + /postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} @@ -7239,17 +7289,6 @@ packages: webpack-virtual-modules: 0.5.0 dev: false - /update-browserslist-db@1.0.13(browserslist@4.22.1): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.22.1 - escalade: 3.1.1 - picocolors: 1.0.0 - dev: true - /update-browserslist-db@1.0.13(browserslist@4.22.2): resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true @@ -7261,6 +7300,17 @@ packages: picocolors: 1.0.0 dev: true + /update-browserslist-db@1.0.13(browserslist@4.23.0): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.23.0 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: diff --git a/src/lib/utils/db/categoryUtils.ts b/src/lib/utils/db/categoryUtils.ts new file mode 100644 index 0000000..07d4cb2 --- /dev/null +++ b/src/lib/utils/db/categoryUtils.ts @@ -0,0 +1,77 @@ +import kebabCase from 'just-kebab-case'; +import db from '$lib/drizzle'; +import { externalIds, type Mechanics, type Categories, categories, categoriesToExternalIds } from '../../../schema'; +import { eq } from 'drizzle-orm'; +import { error } from '@sveltejs/kit'; +import { PUBLIC_SITE_URL } from '$env/static/public'; + +export async function createCategory(locals: App.Locals, category: Categories, externalId: string) { + if (!category || !externalId || externalId === '') { + error(400, 'Invalid Request'); + } + + try { + const dbExternalId = await db.query.externalIds.findFirst({ + where: eq(externalIds.externalId, externalId) + }); + + if (dbExternalId) { + const foundCategory = await db + .select({ + id: categories.id, + name: categories.name, + slug: categories.slug + }) + .from(categories) + .leftJoin(categoriesToExternalIds, eq(categoriesToExternalIds.externalId, externalId)); + console.log('Mechanic already exists', foundCategory); + if (foundCategory.length > 0) { + console.log('Mechanic name', foundCategory[0].name); + return new Response('Mechanic already exists', { + headers: { + 'Content-Type': 'application/json', + Location: `${PUBLIC_SITE_URL}/api/mechanic/${foundCategory[0].id}` + }, + status: 409 + }); + } + } + + let dbCategory: Mechanics[] = []; + console.log('Creating category', JSON.stringify(category, null, 2)); + await db.transaction(async (transaction) => { + dbCategory = await transaction + .insert(categories) + .values({ + name: category.name, + slug: kebabCase(category.name || category.slug || '') + }) + .returning(); + const dbExternalIds = await transaction + .insert(externalIds) + .values({ + externalId, + type: 'category' + }) + .returning({ id: externalIds.id }); + await transaction.insert(categoriesToExternalIds).values({ + categoryId: dbCategory[0].id, + externalId: dbExternalIds[0].id + }); + }); + + if (dbCategory.length === 0) { + return new Response('Could not create category', { + status: 500 + }); + } + + console.log('Created category', JSON.stringify(dbCategory[0], null, 2)); + return new Response(JSON.stringify(dbCategory[0]), { + status: 201, + }); + } catch (e) { + console.error(e); + throw new Error('Something went wrong creating Category'); + } +} diff --git a/src/lib/utils/db/expansionUtils.ts b/src/lib/utils/db/expansionUtils.ts new file mode 100644 index 0000000..4330435 --- /dev/null +++ b/src/lib/utils/db/expansionUtils.ts @@ -0,0 +1,178 @@ +import { error } from '@sveltejs/kit'; +import { and, eq } from 'drizzle-orm'; +import db from '$lib/drizzle'; +import { type Expansions, expansions } from '../../../schema'; +import { PUBLIC_SITE_URL } from '$env/static/public'; + +export async function createExpansion(locals: App.Locals, expansion: Expansions) { + if (!expansion || expansion?.base_game_id === '' || expansion?.game_id === '') { + error(400, 'Invalid Request'); + } + + try { + const foundExpansion = await db.query.expansions + .findFirst({ + where: and(eq(expansions.base_game_id, expansion.base_game_id), eq(expansions.game_id, expansion.game_id)), + columns: { + id: true, + game_id: true, + base_game_id: true + } + }); + console.log('Expansion already exists', foundExpansion); + if (foundExpansion) { + console.log('Expansion Game ID', foundExpansion.game_id); + return new Response('Expansion already exists', { + headers: { + 'Content-Type': 'application/json', + Location: `${PUBLIC_SITE_URL}/api/game/${foundExpansion.game_id}` + }, + status: 409 + }); + } + + console.log('Creating expansion', JSON.stringify(expansion, null, 2)); + const dbExpansion = await db + .insert(expansions) + .values({ + base_game_id: expansion.base_game_id, + game_id: expansion.game_id, + }) + .returning(); + + if (dbExpansion.length === 0) { + return new Response('Could not create expansion', { + status: 500 + }); + } + + console.log('Created expansion', JSON.stringify(dbExpansion[0], null, 2)); + return new Response(JSON.stringify(dbExpansion[0]), { + status: 201, + }); + } catch (e) { + console.error(e); + throw new Error('Something went wrong creating Expansion'); + } +} + +// export async function createExpansion( +// locals: App.Locals, +// game: Game, +// externalExpansion: BggLinkDto, +// gameIsExpansion: boolean, +// eventFetch: Function +// ) { +// try { +// let dbExpansionGame = await prisma.game.findUnique({ +// where: { +// external_id: externalExpansion.id +// } +// }); + +// if (!dbExpansionGame) { +// const externalGameResponse = await eventFetch( +// `/api/external/game/${externalExpansion.id}?simplified=true` +// ); +// if (externalGameResponse.ok) { +// const externalGame = await externalGameResponse.json(); +// console.log('externalGame', externalGame); +// const boredGame = mapAPIGameToBoredGame(externalGame); +// dbExpansionGame = await createOrUpdateGameMinimal(locals, boredGame); +// } else { +// throw new Error( +// `${gameIsExpansion ? 'Base game' : 'Expansion game'} not found and failed to create.` +// ); +// } +// } + +// let dbExpansion; +// let baseGameId; +// let gameId; +// if (gameIsExpansion) { +// console.log( +// 'External expansion is expansion. Looking for base game', +// JSON.stringify(game, null, 2) +// ); +// dbExpansion = await prisma.expansion.findFirst({ +// where: { +// game_id: dbExpansionGame.id +// }, +// select: { +// id: true, +// base_game_id: true, +// game_id: true +// } +// }); +// baseGameId = game.id; +// gameId = dbExpansionGame.id; +// } else { +// console.log( +// 'External Expansion is base game. Looking for expansion', +// JSON.stringify(game, null, 2) +// ); +// dbExpansion = await prisma.expansion.findFirst({ +// where: { +// base_game_id: dbExpansionGame.id +// }, +// select: { +// id: true, +// base_game_id: true, +// game_id: true +// } +// }); +// baseGameId = dbExpansionGame.id; +// gameId = game.id; +// } + +// if (dbExpansion) { +// console.log('Expansion already exists', JSON.stringify(dbExpansion, null, 2)); +// return dbExpansion; +// } + +// console.log(`Creating expansion. baseGameId: ${baseGameId}, gameId: ${gameId}`); +// const expansion = await prisma.expansion.create({ +// data: { +// base_game_id: baseGameId, +// game_id: gameId +// } +// }); + +// console.log('Created expansion', JSON.stringify(expansion, null, 2)); + +// if (gameIsExpansion) { +// console.log('Connecting current game to expansion'); +// await prisma.game.update({ +// where: { +// id: gameId +// }, +// data: { +// expansions: { +// connect: { +// id: expansion.id +// } +// } +// } +// }); +// } else { +// console.log('Connecting current game to base game'); +// await prisma.game.update({ +// where: { +// id: baseGameId +// }, +// data: { +// expansions: { +// connect: { +// id: expansion.id +// } +// } +// } +// }); +// } + +// return expansion; +// } catch (e) { +// console.error(e); +// throw new Error('Something went wrong creating Expansion'); +// } +// } \ No newline at end of file diff --git a/src/lib/utils/db/gameUtils.ts b/src/lib/utils/db/gameUtils.ts new file mode 100644 index 0000000..7ae301a --- /dev/null +++ b/src/lib/utils/db/gameUtils.ts @@ -0,0 +1,422 @@ +import kebabCase from 'just-kebab-case'; +import db from '$lib/drizzle'; +import { externalIds, gamesToExternalIds, type Games, games } from '../../../schema'; +import { eq } from 'drizzle-orm'; +import { error } from '@sveltejs/kit'; +import { PUBLIC_SITE_URL } from '$env/static/public'; + +export async function createGame(locals: App.Locals, game: Games, externalId: string) { + if (!game || !externalId || externalId === '') { + error(400, 'Invalid Request'); + } + + try { + const dbExternalId = await db.query.externalIds.findFirst({ + where: eq(externalIds.externalId, externalId) + }); + + if (dbExternalId) { + const foundGame = await db + .select({ + id: games.id, + name: games.name, + slug: games.slug + }) + .from(games) + .leftJoin(gamesToExternalIds, eq(gamesToExternalIds.externalId, externalId)); + console.log('Game already exists', foundGame); + if (foundGame.length > 0) { + console.log('Game name', foundGame[0].name); + return new Response('Game already exists', { + headers: { + 'Content-Type': 'application/json', + Location: `${PUBLIC_SITE_URL}/api/game/${foundGame[0].id}` + }, + status: 409 + }); + } + } + + let dbGames: Games[] = []; + console.log('Creating game', JSON.stringify(game, null, 2)); + await db.transaction(async (transaction) => { + dbGames = await transaction + .insert(games) + .values({ + name: game.name, + slug: kebabCase(game.name || game.slug || ''), + description: game.description, + year_published: game.year_published, + url: game.url, + image_url: game.image_url, + thumb_url: game.thumb_url, + min_age: game.min_age, + min_players: game.min_players, + max_players: game.max_players, + min_playtime: game.min_playtime, + max_playtime: game.max_playtime + }) + .returning(); + const dbExternalIds = await transaction + .insert(externalIds) + .values({ + externalId, + type: 'game' + }) + .returning({ id: externalIds.id }); + await transaction.insert(gamesToExternalIds).values({ + gameId: dbGames[0].id, + externalId: dbExternalIds[0].id + }); + }); + + if (dbGames.length === 0) { + return new Response('Could not create game', { + status: 500 + }); + } + + console.log('Created game', JSON.stringify(dbGames[0], null, 2)); + return new Response(JSON.stringify(dbGames[0]), { + status: 201, + }); + } catch (e) { + console.error(e); + throw new Error('Something went wrong creating Game'); + } +} + +export async function createOrUpdateGameMinimal(locals: App.Locals, game: Games, externalId: string) { + if (!game || !externalId || externalId === '') { + error(400, 'Invalid Request'); + } + + console.log('Creating or updating minimal game data', JSON.stringify(game, null, 2)); + const externalUrl = `https://boardgamegeek.com/boardgame/${externalId}`; + try { + let dbGames: Games[] = []; + console.log('Creating game', JSON.stringify(game, null, 2)); + await db.transaction(async (transaction) => { + dbGames = await transaction + .insert(games) + .values({ + name: game.name, + slug: kebabCase(game.name || game.slug || ''), + description: game.description, + year_published: game.year_published, + url: externalUrl, + image_url: game.image_url, + thumb_url: game.thumb_url, + min_age: game.min_age, + min_players: game.min_players, + max_players: game.max_players, + min_playtime: game.min_playtime, + max_playtime: game.max_playtime + }) + .onConflictDoUpdate({ + target: games.id, + set: { + name: game.name, + slug: kebabCase(game.name || game.slug || ''), + description: game.description, + year_published: game.year_published, + url: externalUrl, + image_url: game.image_url, + thumb_url: game.thumb_url, + min_age: game.min_age, + min_players: game.min_players, + max_players: game.max_players, + min_playtime: game.min_playtime, + max_playtime: game.max_playtime + } + }) + .returning(); + const dbExternalIds = await transaction + .insert(externalIds) + .values({ + externalId, + type: 'game' + }) + .onConflictDoNothing() + .returning({ id: externalIds.id }); + await transaction.insert(gamesToExternalIds).values({ + gameId: dbGames[0].id, + externalId: dbExternalIds[0].id + }).onConflictDoNothing(); + }); + + if (dbGames.length === 0) { + return new Response('Could not create game', { + status: 500 + }); + } + + console.log('Created game', JSON.stringify(dbGames[0], null, 2)); + return new Response(JSON.stringify(dbGames[0]), { + status: 201, + }); + } catch (e) { + console.error(e); + throw new Error('Something went wrong creating Game'); + } +} + +export async function createOrUpdateGame(locals: App.Locals, game: Games, externalId: string) { + if (!game || !externalId || externalId === '') { + error(400, 'Invalid Request'); + } + + try { + const externalUrl = `https://boardgamegeek.com/boardgame/${externalId}`; + const dbExternalId = await db.query.externalIds.findFirst({ + where: eq(externalIds.externalId, externalId) + }); + + if (dbExternalId) { + const foundGame = await db + .select({ + id: games.id, + name: games.name, + slug: games.slug + }) + .from(games) + .leftJoin(gamesToExternalIds, eq(gamesToExternalIds.externalId, externalId)); + console.log('Game already exists', foundGame); + if (foundGame.length > 0) { + console.log('Game name', foundGame[0].name); + return new Response('Game already exists', { + headers: { + 'Content-Type': 'application/json', + Location: `${PUBLIC_SITE_URL}/api/game/${foundGame[0].id}` + }, + status: 409 + }); + } + } + + let dbGames: Games[] = []; + console.log('Creating game', JSON.stringify(game, null, 2)); + await db.transaction(async (transaction) => { + dbGames = await transaction + .insert(games) + .values({ + name: game.name, + slug: kebabCase(game.name || game.slug || ''), + description: game.description, + year_published: game.year_published, + url: game.url, + image_url: game.image_url, + thumb_url: game.thumb_url, + min_age: game.min_age, + min_players: game.min_players, + max_players: game.max_players, + min_playtime: game.min_playtime, + max_playtime: game.max_playtime + }) + .onConflictDoUpdate({ + target: games.id, + set: { + name: game.name, + slug: kebabCase(game.name || game.slug || ''), + description: game.description, + year_published: game.year_published, + url: externalUrl, + image_url: game.image_url, + thumb_url: game.thumb_url, + min_age: game.min_age, + min_players: game.min_players, + max_players: game.max_players, + min_playtime: game.min_playtime, + max_playtime: game.max_playtime + } + }) + .returning(); + const dbExternalIds = await transaction + .insert(externalIds) + .values({ + externalId, + type: 'game' + }) + .onConflictDoNothing() + .returning({ id: externalIds.id }); + await transaction.insert(gamesToExternalIds).values({ + gameId: dbGames[0].id, + externalId: dbExternalIds[0].id + }).onConflictDoNothing(); + }); + + if (dbGames.length === 0) { + return new Response('Could not create game', { + status: 500 + }); + } + + console.log('Created game', JSON.stringify(dbGames[0], null, 2)); + return new Response(JSON.stringify(dbGames[0]), { + status: 201, + }); + } catch (e) { + console.error(e); + throw new Error('Something went wrong creating Game'); + } +} + +export async function updateGame(locals: App.Locals, game: Games, id: string) { + if (!game || !id || id === '') { + error(400, 'Invalid Request'); + } + + try { + const dbGame = await db + .update(games) + .set({ + name: game.name, + slug: kebabCase(game.name || game.slug || ''), + description: game.description, + year_published: game.year_published, + url: game.url, + image_url: game.image_url, + thumb_url: game.thumb_url, + min_age: game.min_age, + min_players: game.min_players, + max_players: game.max_players, + min_playtime: game.min_playtime, + max_playtime: game.max_playtime + }) + .where(eq(games.id, id)) + .returning(); + return new Response(JSON.stringify(dbGame[0]), { + headers: { + 'Content-Type': 'application/json' + } + }); + } catch (e) { + console.error(e); + return new Response('Could not get publishers', { + status: 500 + }); + } +} + +// console.log('Creating or updating game', JSON.stringify(game, null, 2)); + // const categoryIds = game.categories; + // const mechanicIds = game.mechanics; + // const publisherIds = game.publishers; + // const designerIds = game.designers; + // const artistIds = game.artists; + // // const expansionIds = game.expansions; + // const externalUrl = `https://boardgamegeek.com/boardgame/${game.external_id}`; + // console.log('categoryIds', categoryIds); + // console.log('mechanicIds', mechanicIds); + // await db.transaction(async (transaction) => { + // const dbGame = await db.transaction(async (transaction) => { + // transaction.insert(games).values({ + // name: game.name, + // slug: kebabCase(game.name || ''), + // description: game.description, + // external_id: game.external_id, + // url: externalUrl, + // thumb_url: game.thumb_url, + // image_url: game.image_url, + // min_age: game.min_age || 0, + // min_players: game.min_players || 0, + // max_players: game.max_players || 0, + // min_playtime: game.min_playtime || 0, + // max_playtime: game.max_playtime || 0, + // year_published: game.year_published || 0, + // last_sync_at: new Date(), + // }).onConflictDoUpdate({ + // target: games.id, set: { + // name: game.name, + // slug: kebabCase(game.name), + // description: game.description, + // external_id: game.external_id, + // url: externalUrl, + // thumb_url: game.thumb_url, + // image_url: game.image_url, + // min_age: game.min_age || 0, + // min_players: game.min_players || 0, + // max_players: game.max_players || 0, + // min_playtime: game.min_playtime || 0, + // max_playtime: game.max_playtime || 0, + // year_published: game.year_published || 0, + // last_sync_at: new Date(), + // } + // }).returning(); + // }); + // // TODO: Connect to everything else + // }); + // await db.insert(games).values({ + // include: { + // mechanics: true, + // publishers: true, + // designers: true, + // artists: true, + // expansions: true + // }, + // where: { + // external_id: game.external_id + // }, + // create: { + // name: game.name, + // slug: kebabCase(game.name), + // description: game.description, + // external_id: game.external_id, + // url: externalUrl, + // thumb_url: game.thumb_url, + // image_url: game.image_url, + // min_age: game.min_age || 0, + // min_players: game.min_players || 0, + // max_players: game.max_players || 0, + // min_playtime: game.min_playtime || 0, + // max_playtime: game.max_playtime || 0, + // year_published: game.year_published || 0, + // last_sync_at: new Date(), + // categories: { + // connect: categoryIds + // }, + // mechanics: { + // connect: mechanicIds + // }, + // publishers: { + // connect: publisherIds + // }, + // designers: { + // connect: designerIds + // }, + // artists: { + // connect: artistIds + // } + // }, + // update: { + // name: game.name, + // slug: kebabCase(game.name), + // description: game.description, + // external_id: game.external_id, + // url: externalUrl, + // thumb_url: game.thumb_url, + // image_url: game.image_url, + // min_age: game.min_age || 0, + // min_players: game.min_players || 0, + // max_players: game.max_players || 0, + // min_playtime: game.min_playtime || 0, + // max_playtime: game.max_playtime || 0, + // year_published: game.year_published || 0, + // last_sync_at: new Date(), + // categories: { + // connect: categoryIds + // }, + // mechanics: { + // connect: mechanicIds + // }, + // publishers: { + // connect: publisherIds + // }, + // designers: { + // connect: designerIds + // }, + // artists: { + // connect: artistIds + // } + // } + // }); \ No newline at end of file diff --git a/src/lib/utils/db/mechanicUtils.ts b/src/lib/utils/db/mechanicUtils.ts new file mode 100644 index 0000000..5030065 --- /dev/null +++ b/src/lib/utils/db/mechanicUtils.ts @@ -0,0 +1,77 @@ +import kebabCase from 'just-kebab-case'; +import db from '$lib/drizzle'; +import { externalIds, mechanics, mechanicsToExternalIds, type Mechanics } from '../../../schema'; +import { eq } from 'drizzle-orm'; +import { error } from '@sveltejs/kit'; +import { PUBLIC_SITE_URL } from '$env/static/public'; + +export async function createMechanic(locals: App.Locals, mechanic: Mechanics, externalId: string) { + if (!mechanic || !externalId || externalId === '') { + error(400, 'Invalid Request'); + } + + try { + const dbExternalId = await db.query.externalIds.findFirst({ + where: eq(externalIds.externalId, externalId) + }); + + if (dbExternalId) { + const foundMechanic = await db + .select({ + id: mechanics.id, + name: mechanics.name, + slug: mechanics.slug + }) + .from(mechanics) + .leftJoin(mechanicsToExternalIds, eq(mechanicsToExternalIds.externalId, externalId)); + console.log('Mechanic already exists', foundMechanic); + if (foundMechanic.length > 0) { + console.log('Mechanic name', foundMechanic[0].name); + return new Response('Mechanic already exists', { + headers: { + 'Content-Type': 'application/json', + Location: `${PUBLIC_SITE_URL}/api/mechanic/${foundMechanic[0].id}` + }, + status: 409 + }); + } + } + + let dbMechanics: Mechanics[] = []; + console.log('Creating mechanic', JSON.stringify(mechanic, null, 2)); + await db.transaction(async (transaction) => { + dbMechanics = await transaction + .insert(mechanics) + .values({ + name: mechanic.name, + slug: kebabCase(mechanic.name || mechanic.slug || '') + }) + .returning(); + const dbExternalIds = await transaction + .insert(externalIds) + .values({ + externalId, + type: 'mechanic' + }) + .returning({ id: externalIds.id }); + await transaction.insert(mechanicsToExternalIds).values({ + mechanicId: dbMechanics[0].id, + externalId: dbExternalIds[0].id + }); + }); + + if (dbMechanics.length === 0) { + return new Response('Could not create mechanic', { + status: 500 + }); + } + + console.log('Created mechanic', JSON.stringify(dbMechanics[0], null, 2)); + return new Response(JSON.stringify(dbMechanics[0]), { + status: 201, + }); + } catch (e) { + console.error(e); + throw new Error('Something went wrong creating Mechanic'); + } +} diff --git a/src/lib/utils/db/publisherUtils.ts b/src/lib/utils/db/publisherUtils.ts new file mode 100644 index 0000000..40aeea0 --- /dev/null +++ b/src/lib/utils/db/publisherUtils.ts @@ -0,0 +1,125 @@ +import { error } from '@sveltejs/kit'; +import { eq } from 'drizzle-orm'; +import kebabCase from 'just-kebab-case'; +import db from '$lib/drizzle'; +import { + externalIds, + publishersToExternalIds, + type Publishers, + publishers, +} from '../../../schema'; +import { PUBLIC_SITE_URL } from '$env/static/public'; + +export async function getPublisher(locals: App.Locals, id: string) { + const publisher = await db.select().from(publishers).where(eq(publishers.id, id)); + if (publisher.length === 0) { + error(404, 'not found'); + } + return new Response(JSON.stringify(publisher[0]), { + headers: { + 'Content-Type': 'application/json' + } + }); +} + +export async function updatePublisher(locals: App.Locals, publisher: Publishers, id: string) { + if (!publisher || publisher.name === '' || !id || id === '') { + error(400, 'Invalid Request'); + } + + try { + const dbPublisher = await db + .update(publishers) + .set({ + name: publisher.name, + slug: kebabCase(publisher.name || '') + }) + .where(eq(publishers.id, id)) + .returning(); + return new Response(JSON.stringify(dbPublisher[0]), { + headers: { + 'Content-Type': 'application/json' + } + }); + } catch (e) { + console.error(e); + return new Response('Could not get publishers', { + status: 500 + }); + } +} + +export async function createPublisher( + locals: App.Locals, + publisher: Publishers, + externalId: string +) { + if (!publisher || !externalId || externalId === '') { + error(400, 'Invalid Request'); + } + + try { + const dbExternalId = await db.query.externalIds.findFirst({ + where: eq(externalIds.externalId, externalId) + }); + + if (dbExternalId) { + const foundPublisher = await db + .select({ + id: publishers.id, + name: publishers.name, + slug: publishers.slug + }) + .from(publishers) + .leftJoin(publishersToExternalIds, eq(publishersToExternalIds.externalId, externalId)); + console.log('Publisher already exists', foundPublisher); + if (foundPublisher.length > 0) { + console.log('Publisher name', foundPublisher[0].name); + return new Response('Publisher already exists', { + headers: { + 'Content-Type': 'application/json', + Location: `${PUBLIC_SITE_URL}/api/publisher/${foundPublisher[0].id}` + }, + status: 409 + }); + } + } + + let dbPublishers: Publishers[] = []; + console.log('Creating publisher', JSON.stringify(publisher, null, 2)); + await db.transaction(async (transaction) => { + dbPublishers = await transaction + .insert(publishers) + .values({ + name: publisher.name, + slug: kebabCase(publisher.name || publisher.slug || '') + }) + .returning(); + const dbExternalIds = await transaction + .insert(externalIds) + .values({ + externalId, + type: 'publisher' + }) + .returning({ id: externalIds.id }); + await transaction.insert(publishersToExternalIds).values({ + publisherId: dbPublishers[0].id, + externalId: dbExternalIds[0].id + }); + }); + + if (dbPublishers.length === 0) { + return new Response('Could not create publisher', { + status: 500 + }); + } + + console.log('Created publisher', JSON.stringify(dbPublishers[0], null, 2)); + return new Response(JSON.stringify(dbPublishers[0]), { + status: 201, + }); + } catch (e) { + console.error(e); + throw new Error('Something went wrong creating Publisher'); + } +} \ No newline at end of file diff --git a/src/lib/utils/dbUtils.ts b/src/lib/utils/dbUtils.ts deleted file mode 100644 index 6619824..0000000 --- a/src/lib/utils/dbUtils.ts +++ /dev/null @@ -1,415 +0,0 @@ -import type { Game } from '@prisma/client'; -import kebabCase from 'just-kebab-case'; -import type { BggLinkDto } from 'boardgamegeekclient/dist/esm/dto/concrete/subdto'; -import { mapAPIGameToBoredGame } from './gameMapper'; -import db from '$lib/drizzle'; -import { externalIds, games, publishersToExternalIds, type Publishers, publishers } from '../../schema'; -import { eq, sql } from 'drizzle-orm'; -import { error } from '@sveltejs/kit'; - -export async function createPublisher(locals: App.Locals, publisher: Publishers, externalId: string) { - if (!publisher || !externalId || externalId === '') { - error(400, 'Invalid Request'); - } - - try { - let dbExternalId = await db.query.externalIds.findFirst({ - where: eq(externalIds.id, externalId), - }); - - if (dbExternalId) { - const dbPublisher = await db.select().from(publishers).leftJoin(publishersToExternalIds, eq(publishersToExternalIds.externalId, externalId)); - } - let dbPublisher = await db.query.publishers.findFirst({ - where: eq(publishers.external_id, externalPublisher.id), - columns: { - id: true, - name: true, - slug: true, - external_id: true - }, - with: { - publishersToExternalIds: { - columns: { - externalId: true - } - } - } - }); - if (dbPublisher) { - console.log('Publisher already exists', dbPublisher.name); - return dbPublisher; - } - console.log('Creating publisher', JSON.stringify(externalPublisher, null, 2)); - let publisher = await prisma.publisher.create({ - data: { - name: externalPublisher.value, - external_id: externalPublisher.id, - slug: kebabCase(externalPublisher.value) - }, - select: { - id: true, - name: true, - slug: true, - external_id: true - } - }); - - console.log('Created publisher', JSON.stringify(publisher, null, 2)); - return publisher; - } catch (e) { - console.error(e); - throw new Error('Something went wrong creating Publisher'); - } -} - -export async function createCategory(locals: App.Locals, externalCategory: BggLinkDto) { - try { - let dbCategory = await prisma.category.findFirst({ - where: { - external_id: externalCategory.id - }, - select: { - id: true, - name: true, - slug: true, - external_id: true - } - }); - if (dbCategory) { - console.log('Category already exists', dbCategory.name); - return dbCategory; - } - console.log('Creating category', JSON.stringify(externalCategory, null, 2)); - let category = await prisma.category.create({ - data: { - name: externalCategory.value, - external_id: externalCategory.id, - slug: kebabCase(externalCategory.value) - }, - select: { - id: true, - name: true, - slug: true, - external_id: true - } - }); - - console.log('Created category', JSON.stringify(category, null, 2)); - - return category; - } catch (e) { - console.error(e); - throw new Error('Something went wrong creating Category'); - } -} - -export async function createMechanic(locals: App.Locals, externalMechanic: BggLinkDto) { - try { - let dbMechanic = await prisma.mechanic.findFirst({ - where: { - external_id: externalMechanic.id - }, - select: { - id: true, - name: true, - slug: true, - external_id: true - } - }); - if (dbMechanic) { - console.log('Mechanic already exists', dbMechanic.name); - return dbMechanic; - } - console.log('Creating mechanic', JSON.stringify(externalMechanic, null, 2)); - let mechanic = await prisma.mechanic.upsert({ - where: { - external_id: externalMechanic.id - }, - create: { - name: externalMechanic.value, - external_id: externalMechanic.id, - slug: kebabCase(externalMechanic.value) - }, - update: { - name: externalMechanic.value, - slug: kebabCase(externalMechanic.value) - } - }); - - console.log('Created mechanic', JSON.stringify(mechanic, null, 2)); - - return mechanic; - } catch (e) { - console.error(e); - throw new Error('Something went wrong creating Mechanic'); - } -} - -export async function createExpansion( - locals: App.Locals, - game: Game, - externalExpansion: BggLinkDto, - gameIsExpansion: boolean, - eventFetch: Function -) { - try { - let dbExpansionGame = await prisma.game.findUnique({ - where: { - external_id: externalExpansion.id - } - }); - - if (!dbExpansionGame) { - const externalGameResponse = await eventFetch( - `/api/external/game/${externalExpansion.id}?simplified=true` - ); - if (externalGameResponse.ok) { - const externalGame = await externalGameResponse.json(); - console.log('externalGame', externalGame); - let boredGame = mapAPIGameToBoredGame(externalGame); - dbExpansionGame = await createOrUpdateGameMinimal(locals, boredGame); - } else { - throw new Error( - `${gameIsExpansion ? 'Base game' : 'Expansion game'} not found and failed to create.` - ); - } - } - - let dbExpansion; - let baseGameId; - let gameId; - if (gameIsExpansion) { - console.log( - 'External expansion is expansion. Looking for base game', - JSON.stringify(game, null, 2) - ); - dbExpansion = await prisma.expansion.findFirst({ - where: { - game_id: dbExpansionGame.id - }, - select: { - id: true, - base_game_id: true, - game_id: true - } - }); - baseGameId = game.id; - gameId = dbExpansionGame.id; - } else { - console.log( - 'External Expansion is base game. Looking for expansion', - JSON.stringify(game, null, 2) - ); - dbExpansion = await prisma.expansion.findFirst({ - where: { - base_game_id: dbExpansionGame.id - }, - select: { - id: true, - base_game_id: true, - game_id: true - } - }); - baseGameId = dbExpansionGame.id; - gameId = game.id; - } - - if (dbExpansion) { - console.log('Expansion already exists', JSON.stringify(dbExpansion, null, 2)); - return dbExpansion; - } - - console.log(`Creating expansion. baseGameId: ${baseGameId}, gameId: ${gameId}`); - let expansion = await prisma.expansion.create({ - data: { - base_game_id: baseGameId, - game_id: gameId - } - }); - - console.log('Created expansion', JSON.stringify(expansion, null, 2)); - - if (gameIsExpansion) { - console.log('Connecting current game to expansion'); - await prisma.game.update({ - where: { - id: gameId - }, - data: { - expansions: { - connect: { - id: expansion.id - } - } - } - }); - } else { - console.log('Connecting current game to base game'); - await prisma.game.update({ - where: { - id: baseGameId - }, - data: { - expansions: { - connect: { - id: expansion.id - } - } - } - }); - } - - return expansion; - } catch (e) { - console.error(e); - throw new Error('Something went wrong creating Expansion'); - } -} - -export async function createOrUpdateGameMinimal(locals: App.Locals, game: Game) { - console.log('Creating or updating minimal game data', JSON.stringify(game, null, 2)); - const externalUrl = `https://boardgamegeek.com/boardgame/${game.external_id}`; - await db.insert(games).values({ - external_id: game.external_id, - name: game.name, - slug: kebabCase(game.name), - description: game.description, - url: externalUrl, - thumb_url: game.thumb_url, - image_url: game.image_url, - min_age: game.min_age || 0, - min_players: game.min_players || 0, - max_players: game.max_players || 0, - min_playtime: game.min_playtime || 0, - max_playtime: game.max_playtime || 0, - year_published: game.year_published || 0, - }).onDuplicateKeyUpdate({ set: { external_id: sql`external_id` } }); - - return db.query.games.findFirst({ where: eq(games.external_id, game.external_id) }); -} - -export async function createOrUpdateGame(locals: App.Locals, game: Game) { - console.log('Creating or updating game', JSON.stringify(game, null, 2)); - const categoryIds = game.categories; - const mechanicIds = game.mechanics; - const publisherIds = game.publishers; - const designerIds = game.designers; - const artistIds = game.artists; - // const expansionIds = game.expansions; - const externalUrl = `https://boardgamegeek.com/boardgame/${game.external_id}`; - console.log('categoryIds', categoryIds); - console.log('mechanicIds', mechanicIds); - await db.transaction(async (transaction) => { - const dbGame = await transaction.insert(games).values({ - name: game.name, - slug: kebabCase(game.name), - description: game.description, - external_id: game.external_id, - url: externalUrl, - thumb_url: game.thumb_url, - image_url: game.image_url, - min_age: game.min_age || 0, - min_players: game.min_players || 0, - max_players: game.max_players || 0, - min_playtime: game.min_playtime || 0, - max_playtime: game.max_playtime || 0, - year_published: game.year_published || 0, - last_sync_at: new Date(), - }).onConflictDoUpdate({ - target: games.id, set: { - name: game.name, - slug: kebabCase(game.name), - description: game.description, - external_id: game.external_id, - url: externalUrl, - thumb_url: game.thumb_url, - image_url: game.image_url, - min_age: game.min_age || 0, - min_players: game.min_players || 0, - max_players: game.max_players || 0, - min_playtime: game.min_playtime || 0, - max_playtime: game.max_playtime || 0, - year_published: game.year_published || 0, - last_sync_at: new Date(), - } - }).returning(); - - // TODO: Connect to everything else - // await transaction.insert() - }); - // await db.insert(games).values({ - // include: { - // mechanics: true, - // publishers: true, - // designers: true, - // artists: true, - // expansions: true - // }, - // where: { - // external_id: game.external_id - // }, - // create: { - // name: game.name, - // slug: kebabCase(game.name), - // description: game.description, - // external_id: game.external_id, - // url: externalUrl, - // thumb_url: game.thumb_url, - // image_url: game.image_url, - // min_age: game.min_age || 0, - // min_players: game.min_players || 0, - // max_players: game.max_players || 0, - // min_playtime: game.min_playtime || 0, - // max_playtime: game.max_playtime || 0, - // year_published: game.year_published || 0, - // last_sync_at: new Date(), - // categories: { - // connect: categoryIds - // }, - // mechanics: { - // connect: mechanicIds - // }, - // publishers: { - // connect: publisherIds - // }, - // designers: { - // connect: designerIds - // }, - // artists: { - // connect: artistIds - // } - // }, - // update: { - // name: game.name, - // slug: kebabCase(game.name), - // description: game.description, - // external_id: game.external_id, - // url: externalUrl, - // thumb_url: game.thumb_url, - // image_url: game.image_url, - // min_age: game.min_age || 0, - // min_players: game.min_players || 0, - // max_players: game.max_players || 0, - // min_playtime: game.min_playtime || 0, - // max_playtime: game.max_playtime || 0, - // year_published: game.year_published || 0, - // last_sync_at: new Date(), - // categories: { - // connect: categoryIds - // }, - // mechanics: { - // connect: mechanicIds - // }, - // publishers: { - // connect: publisherIds - // }, - // designers: { - // connect: designerIds - // }, - // artists: { - // connect: artistIds - // } - // } - }); -} diff --git a/src/routes/(app)/game/[id]/+page.server.ts b/src/routes/(app)/game/[id]/+page.server.ts index ced13a9..2db7c8a 100644 --- a/src/routes/(app)/game/[id]/+page.server.ts +++ b/src/routes/(app)/game/[id]/+page.server.ts @@ -8,7 +8,7 @@ import { createMechanic, createOrUpdateGame, createPublisher -} from '$lib/utils/dbUtils.js'; +} from '$lib/utils/db/dbUtils.js'; import { mapAPIGameToBoredGame } from '$lib/utils/gameMapper.js'; import prisma from '$lib/prisma'; import type { PageServerLoad } from './$types'; @@ -119,11 +119,11 @@ async function syncGameAndConnectedData(locals: App.Locals, game: Game, eventFet if (externalGameResponse.ok) { const externalGame = await externalGameResponse.json(); console.log('externalGame', externalGame); - let categories = []; - let mechanics = []; - let artists = []; - let designers = []; - let publishers = []; + const categories = []; + const mechanics = []; + const artists = []; + const designers = []; + const publishers = []; for (const externalCategory of externalGame.categories) { const category = await createCategory(locals, externalCategory); categories.push({ @@ -156,7 +156,7 @@ async function syncGameAndConnectedData(locals: App.Locals, game: Game, eventFet } } - let boredGame = mapAPIGameToBoredGame(externalGame); + const boredGame = mapAPIGameToBoredGame(externalGame); boredGame.categories = categories; boredGame.mechanics = mechanics; diff --git a/src/routes/(app)/search/+page.server.ts b/src/routes/(app)/search/+page.server.ts index 326b4ff..ab1e9eb 100644 --- a/src/routes/(app)/search/+page.server.ts +++ b/src/routes/(app)/search/+page.server.ts @@ -15,7 +15,7 @@ import { createOrUpdateGame, createOrUpdateGameMinimal, createPublisher -} from '$lib/utils/dbUtils.js'; +} from '$lib/utils/db/dbUtils.js'; // import { listGameSchema } from '$lib/config/zod-schemas.js'; async function searchForGames( diff --git a/src/routes/api/publisher/+server.ts b/src/routes/api/publisher/+server.ts new file mode 100644 index 0000000..bce4a51 --- /dev/null +++ b/src/routes/api/publisher/+server.ts @@ -0,0 +1,21 @@ +import { createPublisher } from '$lib/utils/db/publisherUtils.js'; +import type { Publishers } from '../../../schema.js'; + +type PublisherCreate = { + publisher: Publishers; + externalId: string; +} + +export async function POST({ request, locals }) { + const data: PublisherCreate = await request.json(); + console.log('data', data); + + try { + return await createPublisher(locals, data.publisher, data.externalId); + } catch (e) { + console.error(e); + return new Response('Could not create publisher', { + status: 500 + }); + } +} \ No newline at end of file diff --git a/src/routes/api/publisher/[id]/+server.ts b/src/routes/api/publisher/[id]/+server.ts new file mode 100644 index 0000000..f7505b8 --- /dev/null +++ b/src/routes/api/publisher/[id]/+server.ts @@ -0,0 +1,19 @@ +import { getPublisher, updatePublisher } from '$lib/utils/db/publisherUtils.js'; +import type { Publishers } from '../../../../schema.js'; + +export async function GET({ locals, params }) { + try { + return await getPublisher(locals, params.id); + } catch (e) { + console.error(e); + return new Response('Could not get publishers', { + status: 500 + }); + } +} + +export async function PUT({ locals, params, request }) { + const data: Publishers = await request.json(); + const publisherId = params.id; + return await updatePublisher(locals, data, publisherId); +} \ No newline at end of file diff --git a/src/schema.ts b/src/schema.ts index 2f3845f..4468dca 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -136,6 +136,8 @@ export const user_role_relations = relations(user_roles, ({ one }) => ({ }) })); +export type UserRoles = InferSelectModel; + export const collections = pgTable('collections', { id: varchar('id', { length: 255 @@ -195,6 +197,8 @@ export const collection_items = pgTable('collection_items', { }).default(sql`now()`) }); +export type CollectionItems = InferSelectModel; + export const collection_item_relations = relations(collection_items, ({ one }) => ({ collection: one(collections, { fields: [collection_items.collection_id], @@ -229,6 +233,8 @@ export const wishlists = pgTable('wishlists', { }).default(sql`now()`) }); +export type Wishlists = InferSelectModel; + export const wishlists_relations = relations(wishlists, ({ one }) => ({ user: one(users, { fields: [wishlists.user_id], @@ -264,6 +270,8 @@ export const wishlist_items = pgTable('wishlist_items', { }).default(sql`now()`) }); +export type WishlistItems = InferSelectModel; + export const wishlist_item_relations = relations(wishlist_items, ({ one }) => ({ wishlist: one(wishlists, { fields: [wishlist_items.wishlist_id], @@ -298,6 +306,8 @@ export const externalIds = pgTable('external_ids', { }).notNull() }); +export type ExternalIds = InferSelectModel; + export const games = pgTable( 'games', { @@ -415,30 +425,9 @@ export const expansions = pgTable('expansions', { }).default(sql`now()`) }); -export const expansionsToExternalIds = pgTable( - 'expansions_to_external_ids', - { - expansionId: varchar('expansion_id', { - length: 255 - }) - .notNull() - .references(() => expansions.id, { onDelete: 'restrict', onUpdate: 'cascade' }), - externalId: varchar('external_id', { - length: 255 - }) - .notNull() - .references(() => externalIds.id, { onDelete: 'restrict', onUpdate: 'cascade' }) - }, - (table) => { - return { - expansionsToExternalIdsPkey: primaryKey({ - columns: [table.expansionId, table.externalId] - }) - }; - } -); +export type Expansions = InferSelectModel; -export const expansion_relations = relations(expansions, ({ one, many }) => ({ +export const expansion_relations = relations(expansions, ({ one }) => ({ baseGame: one(games, { fields: [expansions.base_game_id], references: [games.id] @@ -446,8 +435,7 @@ export const expansion_relations = relations(expansions, ({ one, many }) => ({ game: one(games, { fields: [expansions.game_id], references: [games.id] - }), - expansionsToExternalIds: many(expansionsToExternalIds) + }) })); export const publishers = pgTable('publishers', { @@ -462,7 +450,6 @@ export const publishers = pgTable('publishers', { slug: varchar('slug', { length: 255 }), - external_id: integer('external_id'), created_at: timestamp('created_at', { withTimezone: true, mode: 'date', @@ -513,7 +500,6 @@ export const categories = pgTable('categories', { slug: varchar('slug', { length: 255 }), - external_id: integer('external_id'), created_at: timestamp('created_at', { withTimezone: true, mode: 'date', @@ -526,6 +512,8 @@ export const categories = pgTable('categories', { }).default(sql`now()`) }); +export type Categories = InferSelectModel; + export const categoriesToExternalIds = pgTable('categories_to_external_ids', { categoryId: varchar('category_id', { length: 255 @@ -592,7 +580,6 @@ export const mechanics = pgTable('mechanics', { slug: varchar('slug', { length: 255 }), - external_id: integer('external_id'), created_at: timestamp('created_at', { withTimezone: true, mode: 'date', @@ -605,6 +592,8 @@ export const mechanics = pgTable('mechanics', { }).default(sql`now()`) }); +export type Mechanics = InferSelectModel; + export const mechanicsToExternalIds = pgTable('mechanics_to_external_ids', { mechanicId: varchar('mechanic_id', { length: 255 From 39ecce591aa15525aee7326c4a03d75d90c4faf7 Mon Sep 17 00:00:00 2001 From: Bradley Shellnut Date: Tue, 20 Feb 2024 23:31:05 -0800 Subject: [PATCH 22/34] Adding more game util methods and add game pages. --- src/lib/utils/db/gameUtils.ts | 17 ++++++++++++++++ src/lib/zodValidation.ts | 4 ++++ .../collection/add/+page.server.ts | 11 ++++++++++ .../(protected)/collection/add/+page.svelte | 10 ++++++++++ .../collection/add/bgg/+page.server.ts | 15 ++++++++++++++ .../collection/add/bgg/+page.svelte | 14 +++++++++++++ src/routes/(app)/search/+page.server.ts | 2 +- src/routes/api/game/[id]/+server.ts | 20 +++++++++++++++++++ 8 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 src/routes/(app)/(protected)/collection/add/+page.server.ts create mode 100644 src/routes/(app)/(protected)/collection/add/+page.svelte create mode 100644 src/routes/(app)/(protected)/collection/add/bgg/+page.server.ts create mode 100644 src/routes/(app)/(protected)/collection/add/bgg/+page.svelte diff --git a/src/lib/utils/db/gameUtils.ts b/src/lib/utils/db/gameUtils.ts index 7ae301a..cef1edc 100644 --- a/src/lib/utils/db/gameUtils.ts +++ b/src/lib/utils/db/gameUtils.ts @@ -5,6 +5,23 @@ import { eq } from 'drizzle-orm'; import { error } from '@sveltejs/kit'; import { PUBLIC_SITE_URL } from '$env/static/public'; +export async function getGame(locals: App.Locals, id: string) { + if (!id || id === '') { + error(400, 'Invalid Request'); + } + + try { + return await db.query.games.findFirst({ + where: eq(games.id, id) + }); + } catch (e) { + console.error(e); + return new Response('Could not get games', { + status: 500 + }); + } +} + export async function createGame(locals: App.Locals, game: Games, externalId: string) { if (!game || !externalId || externalId === '') { error(400, 'Invalid Request'); diff --git a/src/lib/zodValidation.ts b/src/lib/zodValidation.ts index 8fbac7d..e66ce7d 100644 --- a/src/lib/zodValidation.ts +++ b/src/lib/zodValidation.ts @@ -117,6 +117,10 @@ export const search_schema = z export type SearchSchema = typeof search_schema; +export const BggForm = z.object({ + link: z.string().trim().startsWith('https://boardgamegeek.com/boardgame/') +}) + export const collection_search_schema = Search.extend({ collection_id: z.string() }); diff --git a/src/routes/(app)/(protected)/collection/add/+page.server.ts b/src/routes/(app)/(protected)/collection/add/+page.server.ts new file mode 100644 index 0000000..9388402 --- /dev/null +++ b/src/routes/(app)/(protected)/collection/add/+page.server.ts @@ -0,0 +1,11 @@ +import { redirect } from "@sveltejs/kit"; +import type { PageServerLoad } from "../$types"; + +export const load: PageServerLoad = async ({ locals, fetch }) => { + const user = locals.user; + if (!user) { + redirect(302, '/login'); + } + + +} \ No newline at end of file diff --git a/src/routes/(app)/(protected)/collection/add/+page.svelte b/src/routes/(app)/(protected)/collection/add/+page.svelte new file mode 100644 index 0000000..201b843 --- /dev/null +++ b/src/routes/(app)/(protected)/collection/add/+page.svelte @@ -0,0 +1,10 @@ + +

Add a game to your collection

+ +

Board Game Geek URL

+ + diff --git a/src/routes/(app)/(protected)/collection/add/bgg/+page.server.ts b/src/routes/(app)/(protected)/collection/add/bgg/+page.server.ts new file mode 100644 index 0000000..edd4dca --- /dev/null +++ b/src/routes/(app)/(protected)/collection/add/bgg/+page.server.ts @@ -0,0 +1,15 @@ +import { redirect } from "@sveltejs/kit"; +import type { PageServerLoad } from "../$types"; +import { BggForm } from "$lib/zodValidation"; +import { superValidate } from "sveltekit-superforms/server"; + +export const load: PageServerLoad = async ({ locals, fetch }) => { + const user = locals.user; + if (!user) { + redirect(302, '/login'); + } + + const form = await superValidate({}, BggForm); + + return { form }; +} \ No newline at end of file diff --git a/src/routes/(app)/(protected)/collection/add/bgg/+page.svelte b/src/routes/(app)/(protected)/collection/add/bgg/+page.svelte new file mode 100644 index 0000000..80b0154 --- /dev/null +++ b/src/routes/(app)/(protected)/collection/add/bgg/+page.svelte @@ -0,0 +1,14 @@ + +

Add a game to your collection

+ +
+ + + +
diff --git a/src/routes/(app)/search/+page.server.ts b/src/routes/(app)/search/+page.server.ts index ab1e9eb..910b641 100644 --- a/src/routes/(app)/search/+page.server.ts +++ b/src/routes/(app)/search/+page.server.ts @@ -20,7 +20,7 @@ import { async function searchForGames( locals: App.Locals, - eventFetch: Function, + eventFetch, urlQueryParams: SearchQuery ) { try { diff --git a/src/routes/api/game/[id]/+server.ts b/src/routes/api/game/[id]/+server.ts index e69de29..afe3581 100644 --- a/src/routes/api/game/[id]/+server.ts +++ b/src/routes/api/game/[id]/+server.ts @@ -0,0 +1,20 @@ +import { error, json } from '@sveltejs/kit'; +import { getGame } from '$lib/utils/db/gameUtils.js'; + +export const GET = async ({ locals, params }) => { + const game_id = Number(params.id).valueOf(); + + // TODO: Debounce excessive calls and possibly throttle + if (isNaN(game_id) || !isFinite(game_id)) { + error(400, { message: 'Invalid game id' }); + } + + try { + return json(await getGame(locals, params.id)); + } catch (e) { + console.error(e); + return new Response('Could not get games', { + status: 500 + }); + } +} \ No newline at end of file From becf1d83497603f54639db38d4650e7c4d518f9d Mon Sep 17 00:00:00 2001 From: Bradley Shellnut Date: Thu, 22 Feb 2024 19:13:04 -0800 Subject: [PATCH 23/34] Fix text search. --- package.json | 10 +- pnpm-lock.yaml | 296 +++++++++--------- src/lib/utils/gameMapper.ts | 7 +- .../collection/add/bgg/+page.svelte | 1 - src/routes/(app)/search/+page.server.ts | 14 +- src/routes/api/game/search/+server.ts | 17 +- 6 files changed, 159 insertions(+), 186 deletions(-) diff --git a/package.json b/package.json index 0109c03..5c4e6a0 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "@resvg/resvg-js": "^2.6.0", "@sveltejs/adapter-auto": "^3.1.1", "@sveltejs/enhanced-img": "^0.1.8", - "@sveltejs/kit": "^2.5.0", + "@sveltejs/kit": "^2.5.1", "@sveltejs/vite-plugin-svelte": "^3.0.2", "@types/cookie": "^0.6.0", "@types/node": "^20.11.19", @@ -69,8 +69,8 @@ "tslib": "^2.6.1", "tsx": "^4.7.1", "typescript": "^5.3.3", - "vite": "^5.1.3", - "vitest": "^1.3.0", + "vite": "^5.1.4", + "vitest": "^1.3.1", "zod": "^3.22.4" }, "type": "module", @@ -98,7 +98,7 @@ "class-variance-authority": "^0.7.0", "clsx": "^2.1.0", "cookie": "^0.6.0", - "drizzle-orm": "^0.29.3", + "drizzle-orm": "^0.29.4", "feather-icons": "^4.29.1", "formsnap": "^0.4.4", "html-entities": "^2.4.0", @@ -109,7 +109,7 @@ "lucide-svelte": "^0.335.0", "mysql2": "^3.9.1", "nanoid": "^5.0.6", - "open-props": "^1.6.18", + "open-props": "^1.6.19", "oslo": "^1.1.2", "pg": "^8.11.3", "postgres": "^3.4.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 40e1868..b103d53 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -37,10 +37,10 @@ dependencies: version: 5.9.1(prisma@5.9.1) '@sentry/sveltekit': specifier: ^7.100.1 - version: 7.100.1(@sveltejs/kit@2.5.0)(svelte@4.2.11) + version: 7.100.1(@sveltejs/kit@2.5.1)(svelte@4.2.11) '@sveltejs/adapter-vercel': specifier: ^5.1.0 - version: 5.1.0(@sveltejs/kit@2.5.0) + version: 5.1.0(@sveltejs/kit@2.5.1) '@types/feather-icons': specifier: ^4.29.4 version: 4.29.4 @@ -63,8 +63,8 @@ dependencies: specifier: ^0.6.0 version: 0.6.0 drizzle-orm: - specifier: ^0.29.3 - version: 0.29.3(@neondatabase/serverless@0.8.1)(@planetscale/database@1.16.0)(@types/pg@8.11.0)(mysql2@3.9.1)(pg@8.11.3)(postgres@3.4.3) + specifier: ^0.29.4 + version: 0.29.4(@neondatabase/serverless@0.8.1)(@planetscale/database@1.16.0)(@types/pg@8.11.0)(mysql2@3.9.1)(pg@8.11.3)(postgres@3.4.3) feather-icons: specifier: ^4.29.1 version: 4.29.1 @@ -96,8 +96,8 @@ dependencies: specifier: ^5.0.6 version: 5.0.6 open-props: - specifier: ^1.6.18 - version: 1.6.18 + specifier: ^1.6.19 + version: 1.6.19 oslo: specifier: ^1.1.2 version: 1.1.2 @@ -144,16 +144,16 @@ devDependencies: version: 2.6.0 '@sveltejs/adapter-auto': specifier: ^3.1.1 - version: 3.1.1(@sveltejs/kit@2.5.0) + version: 3.1.1(@sveltejs/kit@2.5.1) '@sveltejs/enhanced-img': specifier: ^0.1.8 version: 0.1.8(svelte@4.2.11) '@sveltejs/kit': - specifier: ^2.5.0 - version: 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.11)(vite@5.1.3) + specifier: ^2.5.1 + version: 2.5.1(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.11)(vite@5.1.4) '@sveltejs/vite-plugin-svelte': specifier: ^3.0.2 - version: 3.0.2(svelte@4.2.11)(vite@5.1.3) + version: 3.0.2(svelte@4.2.11)(vite@5.1.4) '@types/cookie': specifier: ^0.6.0 version: 0.6.0 @@ -240,13 +240,13 @@ devDependencies: version: 2.0.1 sveltekit-flash-message: specifier: ^2.4.2 - version: 2.4.2(@sveltejs/kit@2.5.0)(svelte@4.2.11) + version: 2.4.2(@sveltejs/kit@2.5.1)(svelte@4.2.11) sveltekit-rate-limiter: specifier: ^0.4.3 - version: 0.4.3(@sveltejs/kit@2.5.0) + version: 0.4.3(@sveltejs/kit@2.5.1) sveltekit-superforms: specifier: ^1.13.4 - version: 1.13.4(@sveltejs/kit@2.5.0)(svelte@4.2.11)(zod@3.22.4) + version: 1.13.4(@sveltejs/kit@2.5.1)(svelte@4.2.11)(zod@3.22.4) tailwindcss: specifier: ^3.4.1 version: 3.4.1(ts-node@10.9.2) @@ -263,11 +263,11 @@ devDependencies: specifier: ^5.3.3 version: 5.3.3 vite: - specifier: ^5.1.3 - version: 5.1.3(@types/node@20.11.19)(sass@1.71.0) + specifier: ^5.1.4 + version: 5.1.4(@types/node@20.11.19)(sass@1.71.0) vitest: - specifier: ^1.3.0 - version: 1.3.0(@types/node@20.11.19)(sass@1.71.0) + specifier: ^1.3.1 + version: 1.3.1(@types/node@20.11.19)(sass@1.71.0) zod: specifier: ^3.22.4 version: 3.22.4 @@ -2667,92 +2667,92 @@ packages: picomatch: 2.3.1 dev: true - /@rollup/rollup-android-arm-eabi@4.9.6: - resolution: {integrity: sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==} + /@rollup/rollup-android-arm-eabi@4.12.0: + resolution: {integrity: sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==} cpu: [arm] os: [android] requiresBuild: true optional: true - /@rollup/rollup-android-arm64@4.9.6: - resolution: {integrity: sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==} + /@rollup/rollup-android-arm64@4.12.0: + resolution: {integrity: sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==} cpu: [arm64] os: [android] requiresBuild: true optional: true - /@rollup/rollup-darwin-arm64@4.9.6: - resolution: {integrity: sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==} + /@rollup/rollup-darwin-arm64@4.12.0: + resolution: {integrity: sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==} cpu: [arm64] os: [darwin] requiresBuild: true optional: true - /@rollup/rollup-darwin-x64@4.9.6: - resolution: {integrity: sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==} + /@rollup/rollup-darwin-x64@4.12.0: + resolution: {integrity: sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==} cpu: [x64] os: [darwin] requiresBuild: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.9.6: - resolution: {integrity: sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==} + /@rollup/rollup-linux-arm-gnueabihf@4.12.0: + resolution: {integrity: sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==} cpu: [arm] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.9.6: - resolution: {integrity: sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==} + /@rollup/rollup-linux-arm64-gnu@4.12.0: + resolution: {integrity: sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-arm64-musl@4.9.6: - resolution: {integrity: sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==} + /@rollup/rollup-linux-arm64-musl@4.12.0: + resolution: {integrity: sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-riscv64-gnu@4.9.6: - resolution: {integrity: sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==} + /@rollup/rollup-linux-riscv64-gnu@4.12.0: + resolution: {integrity: sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==} cpu: [riscv64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-x64-gnu@4.9.6: - resolution: {integrity: sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==} + /@rollup/rollup-linux-x64-gnu@4.12.0: + resolution: {integrity: sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-x64-musl@4.9.6: - resolution: {integrity: sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==} + /@rollup/rollup-linux-x64-musl@4.12.0: + resolution: {integrity: sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.9.6: - resolution: {integrity: sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==} + /@rollup/rollup-win32-arm64-msvc@4.12.0: + resolution: {integrity: sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==} cpu: [arm64] os: [win32] requiresBuild: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.9.6: - resolution: {integrity: sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==} + /@rollup/rollup-win32-ia32-msvc@4.12.0: + resolution: {integrity: sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==} cpu: [ia32] os: [win32] requiresBuild: true optional: true - /@rollup/rollup-win32-x64-msvc@4.9.6: - resolution: {integrity: sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==} + /@rollup/rollup-win32-x64-msvc@4.12.0: + resolution: {integrity: sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==} cpu: [x64] os: [win32] requiresBuild: true @@ -2901,7 +2901,7 @@ packages: svelte: 4.2.11 dev: false - /@sentry/sveltekit@7.100.1(@sveltejs/kit@2.5.0)(svelte@4.2.11): + /@sentry/sveltekit@7.100.1(@sveltejs/kit@2.5.1)(svelte@4.2.11): resolution: {integrity: sha512-t6JaivTmw5oIqOpKQ8PNbGjNP99AQY6vMPkhxzVuwPa3A3o2WtmzQoIXNxdrkux5XkoBI9CsT6TsM5TbaMDwjQ==} engines: {node: '>=16'} peerDependencies: @@ -2915,7 +2915,7 @@ packages: '@sentry/types': 7.100.1 '@sentry/utils': 7.100.1 '@sentry/vite-plugin': 0.6.1 - '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.11)(vite@5.1.3) + '@sveltejs/kit': 2.5.1(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.11)(vite@5.1.4) magicast: 0.2.8 sorcery: 0.11.0 transitivePeerDependencies: @@ -2977,21 +2977,21 @@ packages: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} dev: true - /@sveltejs/adapter-auto@3.1.1(@sveltejs/kit@2.5.0): + /@sveltejs/adapter-auto@3.1.1(@sveltejs/kit@2.5.1): resolution: {integrity: sha512-6LeZft2Fo/4HfmLBi5CucMYmgRxgcETweQl/yQoZo/895K3S9YWYN4Sfm/IhwlIpbJp3QNvhKmwCHbsqQNYQpw==} peerDependencies: '@sveltejs/kit': ^2.0.0 dependencies: - '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.11)(vite@5.1.3) + '@sveltejs/kit': 2.5.1(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.11)(vite@5.1.4) import-meta-resolve: 4.0.0 dev: true - /@sveltejs/adapter-vercel@5.1.0(@sveltejs/kit@2.5.0): + /@sveltejs/adapter-vercel@5.1.0(@sveltejs/kit@2.5.1): resolution: {integrity: sha512-Z9yRJ4H2/7LcBlvN2/TKu1H0hWoRGonr8kPhP1GJ23LRW76IbiiX5gs/MLc6+ZGogCZYVJ4USmx6m+RFtvQTRw==} peerDependencies: '@sveltejs/kit': ^2.4.0 dependencies: - '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.11)(vite@5.1.3) + '@sveltejs/kit': 2.5.1(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.11)(vite@5.1.4) '@vercel/nft': 0.26.2 esbuild: 0.19.11 transitivePeerDependencies: @@ -3010,8 +3010,8 @@ packages: - svelte dev: true - /@sveltejs/kit@2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.11)(vite@5.1.3): - resolution: {integrity: sha512-1uyXvzC2Lu1FZa30T4y5jUAC21R309ZMRG0TPt+PPPbNUoDpy8zSmSNVWYaBWxYDqLGQ5oPNWvjvvF2IjJ1jmA==} + /@sveltejs/kit@2.5.1(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.11)(vite@5.1.4): + resolution: {integrity: sha512-TKj08o3mJCoQNLTdRdGkHPePTCPUGTgkew65RDqjVU3MtPVxljsofXQYfXndHfq0P7KoPRO/0/reF6HesU0Djw==} engines: {node: '>=18.13'} hasBin: true requiresBuild: true @@ -3020,23 +3020,23 @@ packages: svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.3 dependencies: - '@sveltejs/vite-plugin-svelte': 3.0.2(svelte@4.2.11)(vite@5.1.3) + '@sveltejs/vite-plugin-svelte': 3.0.2(svelte@4.2.11)(vite@5.1.4) '@types/cookie': 0.6.0 cookie: 0.6.0 devalue: 4.3.2 esm-env: 1.0.0 import-meta-resolve: 4.0.0 kleur: 4.1.5 - magic-string: 0.30.5 + magic-string: 0.30.7 mrmime: 2.0.0 sade: 1.8.1 set-cookie-parser: 2.6.0 sirv: 2.0.4 svelte: 4.2.11 tiny-glob: 0.2.9 - vite: 5.1.3(@types/node@20.11.19)(sass@1.71.0) + vite: 5.1.4(@types/node@20.11.19)(sass@1.71.0) - /@sveltejs/vite-plugin-svelte-inspector@2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.11)(vite@5.1.3): + /@sveltejs/vite-plugin-svelte-inspector@2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.11)(vite@5.1.4): resolution: {integrity: sha512-gjr9ZFg1BSlIpfZ4PRewigrvYmHWbDrq2uvvPB1AmTWKuM+dI1JXQSUu2pIrYLb/QncyiIGkFDFKTwJ0XqQZZg==} engines: {node: ^18.0.0 || >=20} peerDependencies: @@ -3044,29 +3044,29 @@ packages: svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.0 dependencies: - '@sveltejs/vite-plugin-svelte': 3.0.2(svelte@4.2.11)(vite@5.1.3) + '@sveltejs/vite-plugin-svelte': 3.0.2(svelte@4.2.11)(vite@5.1.4) debug: 4.3.4 svelte: 4.2.11 - vite: 5.1.3(@types/node@20.11.19)(sass@1.71.0) + vite: 5.1.4(@types/node@20.11.19)(sass@1.71.0) transitivePeerDependencies: - supports-color - /@sveltejs/vite-plugin-svelte@3.0.2(svelte@4.2.11)(vite@5.1.3): + /@sveltejs/vite-plugin-svelte@3.0.2(svelte@4.2.11)(vite@5.1.4): resolution: {integrity: sha512-MpmF/cju2HqUls50WyTHQBZUV3ovV/Uk8k66AN2gwHogNAG8wnW8xtZDhzNBsFJJuvmq1qnzA5kE7YfMJNFv2Q==} engines: {node: ^18.0.0 || >=20} peerDependencies: svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.0 dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.11)(vite@5.1.3) + '@sveltejs/vite-plugin-svelte-inspector': 2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.11)(vite@5.1.4) debug: 4.3.4 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.5 svelte: 4.2.11 svelte-hmr: 0.15.3(svelte@4.2.11) - vite: 5.1.3(@types/node@20.11.19)(sass@1.71.0) - vitefu: 0.2.5(vite@5.1.3) + vite: 5.1.4(@types/node@20.11.19)(sass@1.71.0) + vitefu: 0.2.5(vite@5.1.4) transitivePeerDependencies: - supports-color @@ -3304,38 +3304,38 @@ packages: yoga-wasm-web: 0.3.3 dev: false - /@vitest/expect@1.3.0: - resolution: {integrity: sha512-7bWt0vBTZj08B+Ikv70AnLRicohYwFgzNjFqo9SxxqHHxSlUJGSXmCRORhOnRMisiUryKMdvsi1n27Bc6jL9DQ==} + /@vitest/expect@1.3.1: + resolution: {integrity: sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw==} dependencies: - '@vitest/spy': 1.3.0 - '@vitest/utils': 1.3.0 - chai: 4.3.10 + '@vitest/spy': 1.3.1 + '@vitest/utils': 1.3.1 + chai: 4.4.1 dev: true - /@vitest/runner@1.3.0: - resolution: {integrity: sha512-1Jb15Vo/Oy7mwZ5bXi7zbgszsdIBNjc4IqP8Jpr/8RdBC4nF1CTzIAn2dxYvpF1nGSseeL39lfLQ2uvs5u1Y9A==} + /@vitest/runner@1.3.1: + resolution: {integrity: sha512-5FzF9c3jG/z5bgCnjr8j9LNq/9OxV2uEBAITOXfoe3rdZJTdO7jzThth7FXv/6b+kdY65tpRQB7WaKhNZwX+Kg==} dependencies: - '@vitest/utils': 1.3.0 + '@vitest/utils': 1.3.1 p-limit: 5.0.0 - pathe: 1.1.1 + pathe: 1.1.2 dev: true - /@vitest/snapshot@1.3.0: - resolution: {integrity: sha512-swmktcviVVPYx9U4SEQXLV6AEY51Y6bZ14jA2yo6TgMxQ3h+ZYiO0YhAHGJNp0ohCFbPAis1R9kK0cvN6lDPQA==} + /@vitest/snapshot@1.3.1: + resolution: {integrity: sha512-EF++BZbt6RZmOlE3SuTPu/NfwBF6q4ABS37HHXzs2LUVPBLx2QoY/K0fKpRChSo8eLiuxcbCVfqKgx/dplCDuQ==} dependencies: - magic-string: 0.30.5 - pathe: 1.1.1 + magic-string: 0.30.7 + pathe: 1.1.2 pretty-format: 29.7.0 dev: true - /@vitest/spy@1.3.0: - resolution: {integrity: sha512-AkCU0ThZunMvblDpPKgjIi025UxR8V7MZ/g/EwmAGpjIujLVV2X6rGYGmxE2D4FJbAy0/ijdROHMWa2M/6JVMw==} + /@vitest/spy@1.3.1: + resolution: {integrity: sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig==} dependencies: tinyspy: 2.2.1 dev: true - /@vitest/utils@1.3.0: - resolution: {integrity: sha512-/LibEY/fkaXQufi4GDlQZhikQsPO2entBKtfuyIpr1jV4DpaeasqkeHjhdOhU24vSHshcSuEyVlWdzvv2XmYCw==} + /@vitest/utils@1.3.1: + resolution: {integrity: sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ==} dependencies: diff-sequences: 29.6.3 estree-walker: 3.0.3 @@ -3381,7 +3381,6 @@ packages: resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} engines: {node: '>=0.4.0'} hasBin: true - dev: false /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} @@ -3655,8 +3654,8 @@ packages: resolution: {integrity: sha512-+hVY9jE44uKLkH0SrUTqxjxqNTOWHsbnQDIKjwkZ3lNTzUUVdBLBGXtj/q5Mp5u98r3droaZAewQuEDzjQdZlQ==} dev: true - /chai@4.3.10: - resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==} + /chai@4.4.1: + resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} engines: {node: '>=4'} dependencies: assertion-error: 1.1.0 @@ -4043,8 +4042,8 @@ packages: - supports-color dev: true - /drizzle-orm@0.29.3(@neondatabase/serverless@0.8.1)(@planetscale/database@1.16.0)(@types/pg@8.11.0)(mysql2@3.9.1)(pg@8.11.3)(postgres@3.4.3): - resolution: {integrity: sha512-uSE027csliGSGYD0pqtM+SAQATMREb3eSM/U8s6r+Y0RFwTKwftnwwSkqx3oS65UBgqDOM0gMTl5UGNpt6lW0A==} + /drizzle-orm@0.29.4(@neondatabase/serverless@0.8.1)(@planetscale/database@1.16.0)(@types/pg@8.11.0)(mysql2@3.9.1)(pg@8.11.3)(postgres@3.4.3): + resolution: {integrity: sha512-ZnSM8TAxFhzH7p1s3+w3pRE/eKaOeNkH9SKitm717pubDVVcV2I0BCDBPGKV+pe02+wMfw37ntlTcCyo2rA3IA==} peerDependencies: '@aws-sdk/client-rds-data': '>=3' '@cloudflare/workers-types': '>=3' @@ -4578,7 +4577,7 @@ packages: zod: ^3.22.2 dependencies: svelte: 4.2.11 - sveltekit-superforms: 1.13.4(@sveltejs/kit@2.5.0)(svelte@4.2.11)(zod@3.22.4) + sveltekit-superforms: 1.13.4(@sveltejs/kit@2.5.1)(svelte@4.2.11)(zod@3.22.4) zod: 3.22.4 dev: false @@ -5058,8 +5057,8 @@ packages: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + /jsonc-parser@3.2.1: + resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} dev: true /just-clone@6.2.0: @@ -5131,7 +5130,7 @@ packages: resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} engines: {node: '>=14'} dependencies: - mlly: 1.4.2 + mlly: 1.6.0 pkg-types: 1.0.3 dev: true @@ -5235,7 +5234,6 @@ packages: engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - dev: false /magicast@0.2.8: resolution: {integrity: sha512-zEnqeb3E6TfMKYXGyHv3utbuHNixr04o3/gVGviSzVQkbFiU46VZUd+Ea/1npKfvEsEWxBYuIksKzoztTDPg0A==} @@ -5388,13 +5386,13 @@ packages: hasBin: true dev: false - /mlly@1.4.2: - resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==} + /mlly@1.6.0: + resolution: {integrity: sha512-YOvg9hfYQmnaB56Yb+KrJE2u0Yzz5zR+sLejEvF4fzwzV1Al6hkf2vyHTwqCRyv0hCi9rVCqVoXpyYevQIRwLQ==} dependencies: - acorn: 8.11.2 - pathe: 1.1.1 + acorn: 8.11.3 + pathe: 1.1.2 pkg-types: 1.0.3 - ufo: 1.3.1 + ufo: 1.4.0 dev: true /mri@1.2.0: @@ -5560,8 +5558,8 @@ packages: mimic-fn: 4.0.0 dev: true - /open-props@1.6.18: - resolution: {integrity: sha512-xhkbGo6vFdYHWR9mt81p4mlPoRLQHunA6XJAuQ2cUyvoOGKGxDj8dGgXDIbR1EMJVyHPxU1AbtfbloAIRLHWKw==} + /open-props@1.6.19: + resolution: {integrity: sha512-jf+TFfHH9oH1/8mv9w5IrCCtwwK7SvQlGZbatk2TTWpZQBngfa15XlAmvmXKEfn13as8uL+8WtN/CRecljPCuA==} dev: false /optionator@0.9.3: @@ -5664,8 +5662,8 @@ packages: engines: {node: '>=8'} dev: true - /pathe@1.1.1: - resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} + /pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} dev: true /pathval@1.1.1: @@ -5775,9 +5773,9 @@ packages: /pkg-types@1.0.3: resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} dependencies: - jsonc-parser: 3.2.0 - mlly: 1.4.2 - pathe: 1.1.1 + jsonc-parser: 3.2.1 + mlly: 1.6.0 + pathe: 1.1.2 dev: true /playwright-core@1.41.2: @@ -6463,26 +6461,26 @@ packages: dependencies: glob: 7.2.3 - /rollup@4.9.6: - resolution: {integrity: sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==} + /rollup@4.12.0: + resolution: {integrity: sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.9.6 - '@rollup/rollup-android-arm64': 4.9.6 - '@rollup/rollup-darwin-arm64': 4.9.6 - '@rollup/rollup-darwin-x64': 4.9.6 - '@rollup/rollup-linux-arm-gnueabihf': 4.9.6 - '@rollup/rollup-linux-arm64-gnu': 4.9.6 - '@rollup/rollup-linux-arm64-musl': 4.9.6 - '@rollup/rollup-linux-riscv64-gnu': 4.9.6 - '@rollup/rollup-linux-x64-gnu': 4.9.6 - '@rollup/rollup-linux-x64-musl': 4.9.6 - '@rollup/rollup-win32-arm64-msvc': 4.9.6 - '@rollup/rollup-win32-ia32-msvc': 4.9.6 - '@rollup/rollup-win32-x64-msvc': 4.9.6 + '@rollup/rollup-android-arm-eabi': 4.12.0 + '@rollup/rollup-android-arm64': 4.12.0 + '@rollup/rollup-darwin-arm64': 4.12.0 + '@rollup/rollup-darwin-x64': 4.12.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.12.0 + '@rollup/rollup-linux-arm64-gnu': 4.12.0 + '@rollup/rollup-linux-arm64-musl': 4.12.0 + '@rollup/rollup-linux-riscv64-gnu': 4.12.0 + '@rollup/rollup-linux-x64-gnu': 4.12.0 + '@rollup/rollup-linux-x64-musl': 4.12.0 + '@rollup/rollup-win32-arm64-msvc': 4.12.0 + '@rollup/rollup-win32-ia32-msvc': 4.12.0 + '@rollup/rollup-win32-x64-msvc': 4.12.0 fsevents: 2.3.3 /run-parallel@1.2.0: @@ -6983,33 +6981,33 @@ packages: magic-string: 0.30.5 periscopic: 3.1.0 - /sveltekit-flash-message@2.4.2(@sveltejs/kit@2.5.0)(svelte@4.2.11): + /sveltekit-flash-message@2.4.2(@sveltejs/kit@2.5.1)(svelte@4.2.11): resolution: {integrity: sha512-iXZSOp8La7kHQuOsXOcjIp7x24J/Ycs2uPoHwtjsbObVCbjgxZrtvjd0XUfA0mYZBp97BtAQ5SW5owRDJCWq6A==} peerDependencies: '@sveltejs/kit': 1.x || 2.x svelte: 3.x || 4.x || >=5.0.0-next.51 dependencies: - '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.11)(vite@5.1.3) + '@sveltejs/kit': 2.5.1(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.11)(vite@5.1.4) svelte: 4.2.11 dev: true - /sveltekit-rate-limiter@0.4.3(@sveltejs/kit@2.5.0): + /sveltekit-rate-limiter@0.4.3(@sveltejs/kit@2.5.1): resolution: {integrity: sha512-BKkD2tvgyz5j4Fn1vt0y7FLF0zZ01f9thjWPGDb6fyX3tBXyMrtZ8ISK8M7zjz9Cik/2KrkvFtmldhXF6/hjqw==} peerDependencies: '@sveltejs/kit': 1.x || 2.x dependencies: '@isaacs/ttlcache': 1.4.1 - '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.11)(vite@5.1.3) + '@sveltejs/kit': 2.5.1(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.11)(vite@5.1.4) dev: true - /sveltekit-superforms@1.13.4(@sveltejs/kit@2.5.0)(svelte@4.2.11)(zod@3.22.4): + /sveltekit-superforms@1.13.4(@sveltejs/kit@2.5.1)(svelte@4.2.11)(zod@3.22.4): resolution: {integrity: sha512-rM2+Ictaw7OAIorCLmvg82orci/mtO9ZouI4emtx8SyYngx9aED+eNZlHPLufgB6D7geL2a+hMSFtM3zmMQixQ==} peerDependencies: '@sveltejs/kit': 1.x || 2.x svelte: 3.x || 4.x zod: 3.x dependencies: - '@sveltejs/kit': 2.5.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.11)(vite@5.1.3) + '@sveltejs/kit': 2.5.1(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.11)(vite@5.1.4) devalue: 4.3.2 klona: 2.0.6 svelte: 4.2.11 @@ -7119,8 +7117,8 @@ packages: /tiny-inflate@1.0.3: resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} - /tinybench@2.5.1: - resolution: {integrity: sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==} + /tinybench@2.6.0: + resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} dev: true /tinypool@0.8.2: @@ -7252,8 +7250,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - /ufo@1.3.1: - resolution: {integrity: sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==} + /ufo@1.4.0: + resolution: {integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==} dev: true /ultrahtml@1.5.2: @@ -7348,16 +7346,16 @@ packages: - rollup dev: true - /vite-node@1.3.0(@types/node@20.11.19)(sass@1.71.0): - resolution: {integrity: sha512-D/oiDVBw75XMnjAXne/4feCkCEwcbr2SU1bjAhCcfI5Bq3VoOHji8/wCPAfUkDIeohJ5nSZ39fNxM3dNZ6OBOA==} + /vite-node@1.3.1(@types/node@20.11.19)(sass@1.71.0): + resolution: {integrity: sha512-azbRrqRxlWTJEVbzInZCTchx0X69M/XPTCz4H+TLvlTcR/xH/3hkRqhOakT41fMJCMzXTu4UvegkZiEoJAWvng==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true dependencies: cac: 6.7.14 debug: 4.3.4 - pathe: 1.1.1 + pathe: 1.1.2 picocolors: 1.0.0 - vite: 5.1.3(@types/node@20.11.19)(sass@1.71.0) + vite: 5.1.4(@types/node@20.11.19)(sass@1.71.0) transitivePeerDependencies: - '@types/node' - less @@ -7369,8 +7367,8 @@ packages: - terser dev: true - /vite@5.1.3(@types/node@20.11.19)(sass@1.71.0): - resolution: {integrity: sha512-UfmUD36DKkqhi/F75RrxvPpry+9+tTkrXfMNZD+SboZqBCMsxKtO52XeGzzuh7ioz+Eo/SYDBbdb0Z7vgcDJew==} + /vite@5.1.4(@types/node@20.11.19)(sass@1.71.0): + resolution: {integrity: sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -7400,12 +7398,12 @@ packages: '@types/node': 20.11.19 esbuild: 0.19.12 postcss: 8.4.35 - rollup: 4.9.6 + rollup: 4.12.0 sass: 1.71.0 optionalDependencies: fsevents: 2.3.3 - /vitefu@0.2.5(vite@5.1.3): + /vitefu@0.2.5(vite@5.1.4): resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} peerDependencies: vite: ^3.0.0 || ^4.0.0 || ^5.0.0 @@ -7413,17 +7411,17 @@ packages: vite: optional: true dependencies: - vite: 5.1.3(@types/node@20.11.19)(sass@1.71.0) + vite: 5.1.4(@types/node@20.11.19)(sass@1.71.0) - /vitest@1.3.0(@types/node@20.11.19)(sass@1.71.0): - resolution: {integrity: sha512-V9qb276J1jjSx9xb75T2VoYXdO1UKi+qfflY7V7w93jzX7oA/+RtYE6TcifxksxsZvygSSMwu2Uw6di7yqDMwg==} + /vitest@1.3.1(@types/node@20.11.19)(sass@1.71.0): + resolution: {integrity: sha512-/1QJqXs8YbCrfv/GPQ05wAZf2eakUPLPa18vkJAKE7RXOKfVHqMZZ1WlTjiwl6Gcn65M5vpNUB6EFLnEdRdEXQ==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.3.0 - '@vitest/ui': 1.3.0 + '@vitest/browser': 1.3.1 + '@vitest/ui': 1.3.1 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -7441,25 +7439,25 @@ packages: optional: true dependencies: '@types/node': 20.11.19 - '@vitest/expect': 1.3.0 - '@vitest/runner': 1.3.0 - '@vitest/snapshot': 1.3.0 - '@vitest/spy': 1.3.0 - '@vitest/utils': 1.3.0 + '@vitest/expect': 1.3.1 + '@vitest/runner': 1.3.1 + '@vitest/snapshot': 1.3.1 + '@vitest/spy': 1.3.1 + '@vitest/utils': 1.3.1 acorn-walk: 8.3.2 - chai: 4.3.10 + chai: 4.4.1 debug: 4.3.4 execa: 8.0.1 local-pkg: 0.5.0 - magic-string: 0.30.5 - pathe: 1.1.1 + magic-string: 0.30.7 + pathe: 1.1.2 picocolors: 1.0.0 std-env: 3.7.0 strip-literal: 2.0.0 - tinybench: 2.5.1 + tinybench: 2.6.0 tinypool: 0.8.2 - vite: 5.1.3(@types/node@20.11.19)(sass@1.71.0) - vite-node: 1.3.0(@types/node@20.11.19)(sass@1.71.0) + vite: 5.1.4(@types/node@20.11.19)(sass@1.71.0) + vite-node: 1.3.1(@types/node@20.11.19)(sass@1.71.0) why-is-node-running: 2.2.2 transitivePeerDependencies: - less diff --git a/src/lib/utils/gameMapper.ts b/src/lib/utils/gameMapper.ts index d21f7dd..696f5a1 100644 --- a/src/lib/utils/gameMapper.ts +++ b/src/lib/utils/gameMapper.ts @@ -1,6 +1,7 @@ import type { GameType, SavedGameType } from '$lib/types'; import type { Game } from '@prisma/client'; import kebabCase from 'just-kebab-case'; +import type { Games } from '../../schema'; export function convertToSavedGame(game: GameType | SavedGameType): SavedGameType { return { @@ -43,10 +44,9 @@ export function mapSavedGameToGame(game: SavedGameType): GameType { }; } -export function mapAPIGameToBoredGame(game: GameType): Game { +export function mapAPIGameToBoredGame(game: GameType): Games { // TODO: Fix types return { - external_id: game.external_id, name: game.name, slug: kebabCase(game.name), thumb_url: game.thumbnail, @@ -57,7 +57,6 @@ export function mapAPIGameToBoredGame(game: GameType): Game { min_playtime: game.min_playtime, max_playtime: game.max_playtime, min_age: game.min_age, - description: game.description, - playtime: game.playing_time + description: game.description }; } diff --git a/src/routes/(app)/(protected)/collection/add/bgg/+page.svelte b/src/routes/(app)/(protected)/collection/add/bgg/+page.svelte index 80b0154..ef1d361 100644 --- a/src/routes/(app)/(protected)/collection/add/bgg/+page.svelte +++ b/src/routes/(app)/(protected)/collection/add/bgg/+page.svelte @@ -1,5 +1,4 @@ diff --git a/src/lib/components/ui/avatar/avatar.svelte b/src/lib/components/ui/avatar/avatar.svelte index b8a6ee1..99ae927 100644 --- a/src/lib/components/ui/avatar/avatar.svelte +++ b/src/lib/components/ui/avatar/avatar.svelte @@ -11,10 +11,7 @@ diff --git a/src/lib/components/ui/avatar/index.ts b/src/lib/components/ui/avatar/index.ts index b08c780..d06457b 100644 --- a/src/lib/components/ui/avatar/index.ts +++ b/src/lib/components/ui/avatar/index.ts @@ -9,5 +9,5 @@ export { // Root as Avatar, Image as AvatarImage, - Fallback as AvatarFallback + Fallback as AvatarFallback, }; diff --git a/src/lib/components/ui/button/index.ts b/src/lib/components/ui/button/index.ts index f52065b..cfb5560 100644 --- a/src/lib/components/ui/button/index.ts +++ b/src/lib/components/ui/button/index.ts @@ -12,19 +12,19 @@ const buttonVariants = tv({ "border border-input bg-background hover:bg-accent hover:text-accent-foreground", secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80", ghost: "hover:bg-accent hover:text-accent-foreground", - link: "text-primary underline-offset-4 hover:underline" + link: "text-primary underline-offset-4 hover:underline", }, size: { default: "h-10 px-4 py-2", sm: "h-9 rounded-md px-3", lg: "h-11 rounded-md px-8", - icon: "h-10 w-10" - } + icon: "h-10 w-10", + }, }, defaultVariants: { variant: "default", - size: "default" - } + size: "default", + }, }); type Variant = VariantProps["variant"]; @@ -45,5 +45,5 @@ export { Root as Button, type Props as ButtonProps, type Events as ButtonEvents, - buttonVariants + buttonVariants, }; diff --git a/src/lib/components/ui/card/card.svelte b/src/lib/components/ui/card/card.svelte index 5869a7a..593947f 100644 --- a/src/lib/components/ui/card/card.svelte +++ b/src/lib/components/ui/card/card.svelte @@ -9,10 +9,7 @@
diff --git a/src/lib/components/ui/card/index.ts b/src/lib/components/ui/card/index.ts index 14a7f72..bcc031d 100644 --- a/src/lib/components/ui/card/index.ts +++ b/src/lib/components/ui/card/index.ts @@ -18,7 +18,7 @@ export { Description as CardDescription, Footer as CardFooter, Header as CardHeader, - Title as CardTitle + Title as CardTitle, }; export type HeadingLevel = "h1" | "h2" | "h3" | "h4" | "h5" | "h6"; diff --git a/src/lib/components/ui/collapsible/collapsible-content.svelte b/src/lib/components/ui/collapsible/collapsible-content.svelte index 5b6b3e5..2a8e5fa 100644 --- a/src/lib/components/ui/collapsible/collapsible-content.svelte +++ b/src/lib/components/ui/collapsible/collapsible-content.svelte @@ -6,7 +6,7 @@ export let transition: $$Props["transition"] = slide; export let transitionConfig: $$Props["transitionConfig"] = { - duration: 150 + duration: 150, }; diff --git a/src/lib/components/ui/collapsible/index.ts b/src/lib/components/ui/collapsible/index.ts index 04c3c2a..168834e 100644 --- a/src/lib/components/ui/collapsible/index.ts +++ b/src/lib/components/ui/collapsible/index.ts @@ -11,5 +11,5 @@ export { // Root as Collapsible, Content as CollapsibleContent, - Trigger as CollapsibleTrigger + Trigger as CollapsibleTrigger, }; diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte index 23e83e1..76b1b18 100644 --- a/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte @@ -1,7 +1,7 @@ - + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte index 6690085..349db76 100644 --- a/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte @@ -9,7 +9,7 @@ export let transition: $$Props["transition"] = flyAndScale; export let transitionConfig: $$Props["transitionConfig"] = { x: -10, - y: 0 + y: 0, }; export { className as class }; diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte index 75cf264..2990eb4 100644 --- a/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte @@ -1,7 +1,7 @@ - + diff --git a/src/lib/components/ui/form/form-description.svelte b/src/lib/components/ui/form/form-description.svelte index 9e02bc3..b404729 100644 --- a/src/lib/components/ui/form/form-description.svelte +++ b/src/lib/components/ui/form/form-description.svelte @@ -1,5 +1,5 @@ - - + + diff --git a/src/lib/components/ui/form/form-element-field.svelte b/src/lib/components/ui/form/form-element-field.svelte new file mode 100644 index 0000000..72d024a --- /dev/null +++ b/src/lib/components/ui/form/form-element-field.svelte @@ -0,0 +1,26 @@ + + + + + +
+ +
+
diff --git a/src/lib/components/ui/form/form-field-errors.svelte b/src/lib/components/ui/form/form-field-errors.svelte new file mode 100644 index 0000000..00fdbec --- /dev/null +++ b/src/lib/components/ui/form/form-field-errors.svelte @@ -0,0 +1,26 @@ + + + + + {#each errors as error} +
{error}
+ {/each} +
+
diff --git a/src/lib/components/ui/form/form-field.svelte b/src/lib/components/ui/form/form-field.svelte new file mode 100644 index 0000000..745f87c --- /dev/null +++ b/src/lib/components/ui/form/form-field.svelte @@ -0,0 +1,26 @@ + + + + + +
+ +
+
diff --git a/src/lib/components/ui/form/form-fieldset.svelte b/src/lib/components/ui/form/form-fieldset.svelte new file mode 100644 index 0000000..6d35255 --- /dev/null +++ b/src/lib/components/ui/form/form-fieldset.svelte @@ -0,0 +1,31 @@ + + + + + + + diff --git a/src/lib/components/ui/form/form-label.svelte b/src/lib/components/ui/form/form-label.svelte index 2a4ead6..0fd76c6 100644 --- a/src/lib/components/ui/form/form-label.svelte +++ b/src/lib/components/ui/form/form-label.svelte @@ -1,6 +1,6 @@ -