diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..a539bcd --- /dev/null +++ b/.env.example @@ -0,0 +1,36 @@ +# Private +ORIGIN=http://localhost:5173 + +NODE_ENV=development + +DATABASE_USER='postgres' +DATABASE_PASSWORD='postgres' +DATABASE_HOST='localhost' +DATABASE_PORT=5432 +DATABASE_DB='postgres' + +REDIS_URL='redis://127.0.0.1:6379/0' + +DB_MIGRATING='false' +DB_SEEDING='false' +ADMIN_USERNAME= +ADMIN_PASSWORD= + +TWO_FACTOR_TIMEOUT=300000 + +# OAuth +GITHUB_CLIENT_ID="" +GITHUB_CLIENT_SECRET="" +GOOGLE_CLIENT_ID="" +GOOGLE_CLIENT_SECRET="" + +# Public + +PUBLIC_SITE_NAME='Bored Game' +PUBLIC_SITE_URL='http://localhost:5173' +PUBLIC_UMAMI_DO_NOT_TRACK=true +PUBLIC_UMAMI_URL= +PUBLIC_UMAMI_ID= + +# quick setting for key-combo only +SVELTE_INSPECTOR_TOGGLE=control-shift-i diff --git a/.vscode/settings.json b/.vscode/settings.json index 82fd2e1..dfc4497 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,9 @@ { - "cSpell.words": ["iconify", "kickstarter", "lucide", "msrp", "pcss"] + "cSpell.words": [ + "iconify", + "kickstarter", + "lucide", + "msrp", + "pcss" + ] } diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..2af8905 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License Copyright (c) 2024 Bradley Shellnut + +Permission is hereby granted, +free of charge, to any person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice +(including the next paragraph) shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO +EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/components.json b/components.json index 767bdc4..8d5d8e6 100644 --- a/components.json +++ b/components.json @@ -1,14 +1,14 @@ { - "$schema": "https://shadcn-svelte.com/schema.json", - "style": "default", - "tailwind": { - "config": "tailwind.config.js", - "css": "src/app.postcss", - "baseColor": "slate" - }, - "aliases": { - "components": "$lib/components", - "utils": "$lib/utils" - }, + "$schema": "https://shadcn-svelte.com/schema.json", + "style": "default", + "tailwind": { + "config": "tailwind.config.js", + "css": "src/lib/styles/app.pcss", + "baseColor": "slate" + }, + "aliases": { + "components": "$lib/components", + "utils": "$lib/utils/ui" + }, "typescript": true -} \ No newline at end of file +} diff --git a/drizzle.config.ts b/drizzle.config.ts index d254a3e..f5f2c7e 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -1,6 +1,6 @@ import 'dotenv/config' +import env from './src/lib/server/api/common/env' import { defineConfig } from 'drizzle-kit' -import env from './src/env' export default defineConfig({ dialect: 'postgresql', diff --git a/oldApis/games/[id]/+server.ts b/oldApis/games/[id]/+server.ts index afe3581..8f10e6c 100644 --- a/oldApis/games/[id]/+server.ts +++ b/oldApis/games/[id]/+server.ts @@ -1,20 +1,20 @@ -import { error, json } from '@sveltejs/kit'; -import { getGame } from '$lib/utils/db/gameUtils.js'; +import { getGame } from '$lib/utils/db/gameUtils.js' +import { error, json } from '@sveltejs/kit' export const GET = async ({ locals, params }) => { - const game_id = Number(params.id).valueOf(); + 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' }); + error(400, { message: 'Invalid game id' }) } try { - return json(await getGame(locals, params.id)); + return json(await getGame(locals, params.id)) } catch (e) { - console.error(e); - return new Response('Could not get games', { - status: 500 - }); + console.error(e) + return new Response('Could not get gamesTable', { + status: 500, + }) } -} \ No newline at end of file +} diff --git a/oldApis/games/search/+server.ts b/oldApis/games/search/+server.ts index 1df29da..aac02df 100644 --- a/oldApis/games/search/+server.ts +++ b/oldApis/games/search/+server.ts @@ -1,44 +1,34 @@ -import { error, json } from '@sveltejs/kit'; -import db from '../../../../db'; -import { asc, desc, eq, ilike, or } from 'drizzle-orm'; -import { games } from '$db/schema'; -import kebabCase from 'just-kebab-case'; -import { - FilterSchema, - PaginationSchema, - SearchSchema, - SortSchema, -} from '$lib/validations/zod-schemas'; +import { games } from '$db/schema' +import { FilterSchema, PaginationSchema, SearchSchema, SortSchema } from '$lib/validations/zod-schemas' +import { error, json } from '@sveltejs/kit' +import { asc, desc, eq, ilike, or } from 'drizzle-orm' +import kebabCase from 'just-kebab-case' +import db from '../../../../db' // Search a user's collection export const GET = async ({ url, locals }) => { - const searchParams = Object.fromEntries(url.searchParams); + const searchParams = Object.fromEntries(url.searchParams) - const searchGames = PaginationSchema.merge(FilterSchema) - .merge(SortSchema) - .merge(SearchSchema) - .parse(searchParams); + const searchGames = PaginationSchema.merge(FilterSchema).merge(SortSchema).merge(SearchSchema).parse(searchParams) if (searchGames.status !== 'success') { - error(400, 'Invalid request'); + error(400, 'Invalid request') } - const q = searchParams?.q?.trim() || ''; - const limit = parseInt(searchParams?.limit) || 10; - const skip = parseInt(searchParams?.skip) || 0; - const order: OrderDirection = searchParams?.order === 'desc' ? 'desc' : 'asc'; - const exact = searchParams?.exact === 'true'; - let orderBy = searchParams?.orderBy || 'slug'; + const q = searchParams?.q?.trim() || '' + const limit = parseInt(searchParams?.limit) || 10 + const skip = parseInt(searchParams?.skip) || 0 + const order: OrderDirection = searchParams?.order === 'desc' ? 'desc' : 'asc' + const exact = searchParams?.exact === 'true' + let orderBy = searchParams?.orderBy || 'slug' if (orderBy === 'name') { - orderBy = 'slug'; + orderBy = 'slug' } - console.log( - `q: ${q}, limit: ${limit}, skip: ${skip}, order: ${order}, exact: ${exact}, orderBy: ${orderBy}`, - ); - console.log(exact); + console.log(`q: ${q}, limit: ${limit}, skip: ${skip}, order: ${order}, exact: ${exact}, orderBy: ${orderBy}`) + console.log(exact) if (exact) { - console.log('Exact Search API'); + console.log('Exact Search API') const game = await db.query.games.findFirst({ where: eq(games.name, q), columns: { @@ -47,14 +37,14 @@ export const GET = async ({ url, locals }) => { slug: true, thumb_url: true, }, - }); + }) if (!game) { - error(404, { message: 'No games found' }); + error(404, { message: 'No gamesTable found' }) } - const foundGames = [game]; - console.log('Games found in Exact Search API', JSON.stringify(foundGames, null, 2)); - return json(foundGames); + const foundGames = [game] + console.log('Games found in Exact Search API', JSON.stringify(foundGames, null, 2)) + return json(foundGames) } else { const foundGames = (await db @@ -68,37 +58,37 @@ export const GET = async ({ url, locals }) => { .where(or(ilike(games.name, `%${q}%`), ilike(games.slug, `%${kebabCase(q)}%`))) .orderBy(getOrderDirection(order)(getOrderBy(orderBy))) .offset(skip) - .limit(limit)) || []; + .limit(limit)) || [] // const foundGames = await db.select({ - // id: games.id, - // name: games.name, - // slug: games.slug, - // thumb_url: games.thumb_url + // id: gamesTable.id, + // name: gamesTable.name, + // slug: gamesTable.slug, + // thumb_url: gamesTable.thumb_url // }) - // .from(games) - // .where(sql`to_tsvector('simple', ${games.name}) || to_tsvector('simple', ${games.slug}) @@ to_tsquery('simple', ${q})`) + // .from(gamesTable) + // .where(sql`to_tsvector('simple', ${gamesTable.name}) || to_tsvector('simple', ${gamesTable.slug}) @@ to_tsquery('simple', ${q})`) // .orderBy(sql`${orderBy} ${order}`).offset(skip).limit(limit) || []; if (foundGames.length === 0) { - error(404, { message: 'No games found' }); + error(404, { message: 'No gamesTable found' }) } - console.log('Games found in Search API', JSON.stringify(foundGames, null, 2)); - return json(foundGames); + console.log('Games found in Search API', JSON.stringify(foundGames, null, 2)) + return json(foundGames) } -}; +} -type OrderDirection = 'asc' | 'desc'; +type OrderDirection = 'asc' | 'desc' const getOrderDirection = (direction: OrderDirection) => { - return direction === 'asc' ? asc : desc; -}; + return direction === 'asc' ? asc : desc +} const getOrderBy = (orderBy: string) => { switch (orderBy) { case 'name': - return games.name; + return games.name case 'slug': - return games.slug; + return games.slug default: - return games.slug; + return games.slug } -}; +} diff --git a/oldApis/publisher/[id]/+server.ts b/oldApis/publisher/[id]/+server.ts index 6f2d9d6..9d5a51d 100644 --- a/oldApis/publisher/[id]/+server.ts +++ b/oldApis/publisher/[id]/+server.ts @@ -1,19 +1,19 @@ -import { getPublisher, updatePublisher } from '$lib/utils/db/publisherUtils.js'; -import type { Publishers } from '$db/schema'; +import type { Publishers } from '$db/schema' +import { getPublisher, updatePublisher } from '$lib/utils/db/publisherUtils.js' export async function GET({ locals, params }) { try { - return await getPublisher(locals, params.id); + return await getPublisher(locals, params.id) } catch (e) { - console.error(e); - return new Response('Could not get publishers', { + console.error(e) + return new Response('Could not get publishersTable', { 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); + const data: Publishers = await request.json() + const publisherId = params.id + return await updatePublisher(locals, data, publisherId) } diff --git a/package.json b/package.json index 9bc112e..dc6a12c 100644 --- a/package.json +++ b/package.json @@ -27,56 +27,54 @@ "@faker-js/faker": "^8.4.1", "@melt-ui/pp": "^0.3.2", "@melt-ui/svelte": "^0.83.0", - "@playwright/test": "^1.46.1", - "@sveltejs/adapter-auto": "^3.2.4", - "@sveltejs/enhanced-img": "^0.3.4", - "@sveltejs/kit": "^2.5.25", - "@sveltejs/vite-plugin-svelte": "^3.1.2", + "@playwright/test": "^1.47.1", + "@sveltejs/adapter-auto": "^3.2.5", + "@sveltejs/enhanced-img": "^0.3.8", + "@sveltejs/kit": "^2.6.1", + "@sveltejs/vite-plugin-svelte": "4.0.0-next.7", "@types/cookie": "^0.6.0", - "@types/node": "^20.16.3", - "@types/pg": "^8.11.8", + "@types/node": "^20.16.10", + "@types/pg": "^8.11.10", + "@types/qrcode": "^1.5.5", "@typescript-eslint/eslint-plugin": "^7.18.0", "@typescript-eslint/parser": "^7.18.0", + "arctic": "^1.9.2", "autoprefixer": "^10.4.20", "drizzle-kit": "^0.23.2", - "eslint": "^8.57.0", + "eslint": "^8.57.1", "eslint-config-prettier": "^9.1.0", - "eslint-plugin-svelte": "^2.43.0", + "eslint-plugin-svelte": "2.36.0-next.13", "just-clone": "^6.2.0", "just-debounce-it": "^3.2.0", "lucia": "3.2.0", "lucide-svelte": "^0.408.0", "nodemailer": "^6.9.15", - "postcss": "^8.4.44", + "postcss": "^8.4.47", "postcss-import": "^16.1.0", "postcss-load-config": "^5.1.0", "postcss-preset-env": "^9.6.0", "prettier": "^3.3.3", - "prettier-plugin-svelte": "^3.2.6", - "sass": "^1.77.8", - "satori": "^0.10.14", - "satori-html": "^0.3.2", + "prettier-plugin-svelte": "^3.2.7", "svelte": "5.0.0-next.175", "svelte-check": "^3.8.6", "svelte-headless-table": "^0.18.2", "svelte-meta-tags": "^3.1.4", - "svelte-preprocess": "^6.0.2", - "svelte-sequential-preprocessor": "^2.0.1", + "svelte-preprocess": "^6.0.3", + "svelte-sequential-preprocessor": "^2.0.2", "sveltekit-flash-message": "^2.4.4", - "sveltekit-rate-limiter": "^0.5.2", - "sveltekit-superforms": "^2.17.0", - "tailwindcss": "^3.4.10", + "sveltekit-superforms": "^2.18.1", + "tailwindcss": "^3.4.13", "ts-node": "^10.9.2", "tslib": "^2.7.0", - "tsx": "^4.19.0", - "typescript": "^5.5.4", - "vite": "^5.4.3", + "tsx": "^4.19.1", + "typescript": "^5.6.2", + "vite": "^5.4.8", "vitest": "^1.6.0", "zod": "^3.23.8" }, "type": "module", "dependencies": { - "@fontsource/fira-mono": "^5.0.14", + "@fontsource/fira-mono": "^5.1.0", "@hono/swagger-ui": "^0.4.1", "@hono/zod-openapi": "^0.15.3", "@hono/zod-validator": "^0.2.2", @@ -86,16 +84,20 @@ "@lucia-auth/adapter-drizzle": "^1.1.0", "@lukeed/uuid": "^2.0.1", "@neondatabase/serverless": "^0.9.5", + "@node-rs/argon2": "^1.8.3", + "@oslojs/crypto": "^1.0.1", + "@oslojs/encoding": "^1.1.0", + "@oslojs/jwt": "^0.2.0", + "@oslojs/oauth2": "^0.5.0", + "@oslojs/otp": "^1.0.0", + "@oslojs/webauthn": "^1.0.0", "@paralleldrive/cuid2": "^2.2.2", - "@resvg/resvg-js": "^2.6.2", - "@sveltejs/adapter-node": "^5.2.2", - "@sveltejs/adapter-vercel": "^5.4.3", + "@sveltejs/adapter-node": "^5.2.5", + "@sveltejs/adapter-vercel": "^5.4.4", "@types/feather-icons": "^4.29.4", - "@vercel/og": "^0.5.20", - "arctic": "^1.9.2", "bits-ui": "^0.21.13", "boardgamegeekclient": "^1.9.1", - "bullmq": "^5.12.13", + "bullmq": "^5.14.0", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", "cookie": "^0.6.0", @@ -106,7 +108,7 @@ "feather-icons": "^4.29.2", "formsnap": "^1.0.1", "handlebars": "^4.7.8", - "hono": "^4.5.11", + "hono": "^4.6.3", "hono-rate-limiter": "^0.4.0", "html-entities": "^2.5.2", "iconify-icon": "^2.1.0", @@ -116,7 +118,7 @@ "loader": "^2.1.1", "open-props": "^1.7.6", "oslo": "^1.2.1", - "pg": "^8.12.0", + "pg": "^8.13.0", "postgres": "^3.4.4", "qrcode": "^1.5.4", "radix-svelte": "^0.9.0", @@ -128,6 +130,6 @@ "tailwind-variants": "^0.2.1", "tailwindcss-animate": "^1.0.7", "tsyringe": "^4.8.0", - "zod-to-json-schema": "^3.23.2" + "zod-to-json-schema": "^3.23.3" } -} \ No newline at end of file +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d6ffa34..453dea3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,17 +9,17 @@ importers: .: dependencies: '@fontsource/fira-mono': - specifier: ^5.0.14 - version: 5.0.14 + specifier: ^5.1.0 + version: 5.1.0 '@hono/swagger-ui': specifier: ^0.4.1 - version: 0.4.1(hono@4.5.11) + version: 0.4.1(hono@4.6.3) '@hono/zod-openapi': specifier: ^0.15.3 - version: 0.15.3(hono@4.5.11)(zod@3.23.8) + version: 0.15.3(hono@4.6.3)(zod@3.23.8) '@hono/zod-validator': specifier: ^0.2.2 - version: 0.2.2(hono@4.5.11)(zod@3.23.8) + version: 0.2.2(hono@4.6.3)(zod@3.23.8) '@iconify-icons/line-md': specifier: ^1.2.30 version: 1.2.30 @@ -31,43 +31,55 @@ importers: version: 3.5.5 '@lucia-auth/adapter-drizzle': specifier: ^1.1.0 - version: 1.1.0(drizzle-orm@0.32.2(@neondatabase/serverless@0.9.5)(@types/pg@8.11.8)(pg@8.12.0)(postgres@3.4.4))(lucia@3.2.0) + version: 1.1.0(drizzle-orm@0.32.2(@neondatabase/serverless@0.9.5)(@types/pg@8.11.10)(pg@8.13.0(pg-native@3.2.0))(postgres@3.4.4))(lucia@3.2.0) '@lukeed/uuid': specifier: ^2.0.1 version: 2.0.1 '@neondatabase/serverless': specifier: ^0.9.5 version: 0.9.5 + '@node-rs/argon2': + specifier: ^1.8.3 + version: 1.8.3 + '@oslojs/crypto': + specifier: ^1.0.1 + version: 1.0.1 + '@oslojs/encoding': + specifier: ^1.1.0 + version: 1.1.0 + '@oslojs/jwt': + specifier: ^0.2.0 + version: 0.2.0 + '@oslojs/oauth2': + specifier: ^0.5.0 + version: 0.5.0 + '@oslojs/otp': + specifier: ^1.0.0 + version: 1.0.0 + '@oslojs/webauthn': + specifier: ^1.0.0 + version: 1.0.0 '@paralleldrive/cuid2': specifier: ^2.2.2 version: 2.2.2 - '@resvg/resvg-js': - specifier: ^2.6.2 - version: 2.6.2 '@sveltejs/adapter-node': - specifier: ^5.2.2 - version: 5.2.2(@sveltejs/kit@2.5.25(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8))) + specifier: ^5.2.5 + version: 5.2.5(@sveltejs/kit@2.6.1(@sveltejs/vite-plugin-svelte@4.0.0-next.7(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1))) '@sveltejs/adapter-vercel': - specifier: ^5.4.3 - version: 5.4.3(@sveltejs/kit@2.5.25(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8))) + specifier: ^5.4.4 + version: 5.4.4(@sveltejs/kit@2.6.1(@sveltejs/vite-plugin-svelte@4.0.0-next.7(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1))) '@types/feather-icons': specifier: ^4.29.4 version: 4.29.4 - '@vercel/og': - specifier: ^0.5.20 - version: 0.5.20 - arctic: - specifier: ^1.9.2 - version: 1.9.2 bits-ui: specifier: ^0.21.13 - version: 0.21.13(svelte@5.0.0-next.175) + version: 0.21.15(svelte@5.0.0-next.175) boardgamegeekclient: specifier: ^1.9.1 version: 1.9.1 bullmq: - specifier: ^5.12.13 - version: 5.12.13 + specifier: ^5.14.0 + version: 5.14.0 class-variance-authority: specifier: ^0.7.0 version: 0.7.0 @@ -85,25 +97,25 @@ importers: version: 11.0.6 drizzle-orm: specifier: ^0.32.2 - version: 0.32.2(@neondatabase/serverless@0.9.5)(@types/pg@8.11.8)(pg@8.12.0)(postgres@3.4.4) + version: 0.32.2(@neondatabase/serverless@0.9.5)(@types/pg@8.11.10)(pg@8.13.0(pg-native@3.2.0))(postgres@3.4.4) drizzle-zod: specifier: ^0.5.1 - version: 0.5.1(drizzle-orm@0.32.2(@neondatabase/serverless@0.9.5)(@types/pg@8.11.8)(pg@8.12.0)(postgres@3.4.4))(zod@3.23.8) + version: 0.5.1(drizzle-orm@0.32.2(@neondatabase/serverless@0.9.5)(@types/pg@8.11.10)(pg@8.13.0(pg-native@3.2.0))(postgres@3.4.4))(zod@3.23.8) feather-icons: specifier: ^4.29.2 version: 4.29.2 formsnap: specifier: ^1.0.1 - version: 1.0.1(svelte@5.0.0-next.175)(sveltekit-superforms@2.17.0(@sveltejs/kit@2.5.25(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)))(svelte@5.0.0-next.175)) + version: 1.0.1(svelte@5.0.0-next.175)(sveltekit-superforms@2.19.0(@sveltejs/kit@2.6.1(@sveltejs/vite-plugin-svelte@4.0.0-next.7(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)))(@types/json-schema@7.0.15)(svelte@5.0.0-next.175)) handlebars: specifier: ^4.7.8 version: 4.7.8 hono: - specifier: ^4.5.11 - version: 4.5.11 + specifier: ^4.6.3 + version: 4.6.3 hono-rate-limiter: specifier: ^0.4.0 - version: 0.4.0(hono@4.5.11) + version: 0.4.0(hono@4.6.3) html-entities: specifier: ^2.5.2 version: 2.5.2 @@ -129,8 +141,8 @@ importers: specifier: ^1.2.1 version: 1.2.1 pg: - specifier: ^8.12.0 - version: 8.12.0 + specifier: ^8.13.0 + version: 8.13.0(pg-native@3.2.0) postgres: specifier: ^3.4.4 version: 3.4.4 @@ -142,7 +154,7 @@ importers: version: 0.9.0(svelte@5.0.0-next.175) rate-limit-redis: specifier: ^4.2.0 - version: 4.2.0(express-rate-limit@7.3.1(express@4.19.2)) + version: 4.2.0(express-rate-limit@7.4.0(express@4.19.2)) reflect-metadata: specifier: ^0.2.2 version: 0.2.2 @@ -157,16 +169,16 @@ importers: version: 2.5.2 tailwind-variants: specifier: ^0.2.1 - version: 0.2.1(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.3)(typescript@5.5.4))) + version: 0.2.1(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2))) tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.3)(typescript@5.5.4))) + version: 1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2))) tsyringe: specifier: ^4.8.0 version: 4.8.0 zod-to-json-schema: - specifier: ^3.23.2 - version: 3.23.2(zod@3.23.8) + specifier: ^3.23.3 + version: 3.23.3(zod@3.23.8) devDependencies: '@biomejs/biome': specifier: 1.8.3 @@ -181,50 +193,56 @@ importers: specifier: ^0.83.0 version: 0.83.0(svelte@5.0.0-next.175) '@playwright/test': - specifier: ^1.46.1 - version: 1.46.1 + specifier: ^1.47.1 + version: 1.47.2 '@sveltejs/adapter-auto': - specifier: ^3.2.4 - version: 3.2.4(@sveltejs/kit@2.5.25(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8))) + specifier: ^3.2.5 + version: 3.2.5(@sveltejs/kit@2.6.1(@sveltejs/vite-plugin-svelte@4.0.0-next.7(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1))) '@sveltejs/enhanced-img': - specifier: ^0.3.4 - version: 0.3.4(rollup@4.18.1)(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)) + specifier: ^0.3.8 + version: 0.3.8(rollup@4.21.2)(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)) '@sveltejs/kit': - specifier: ^2.5.25 - version: 2.5.25(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)) + specifier: ^2.6.1 + version: 2.6.1(@sveltejs/vite-plugin-svelte@4.0.0-next.7(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)) '@sveltejs/vite-plugin-svelte': - specifier: ^3.1.2 - version: 3.1.2(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)) + specifier: 4.0.0-next.7 + version: 4.0.0-next.7(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)) '@types/cookie': specifier: ^0.6.0 version: 0.6.0 '@types/node': - specifier: ^20.16.3 - version: 20.16.3 + specifier: ^20.16.10 + version: 20.16.10 '@types/pg': - specifier: ^8.11.8 - version: 8.11.8 + specifier: ^8.11.10 + version: 8.11.10 + '@types/qrcode': + specifier: ^1.5.5 + version: 1.5.5 '@typescript-eslint/eslint-plugin': specifier: ^7.18.0 - version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) + version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2) '@typescript-eslint/parser': specifier: ^7.18.0 - version: 7.18.0(eslint@8.57.0)(typescript@5.5.4) + version: 7.18.0(eslint@8.57.1)(typescript@5.6.2) + arctic: + specifier: ^1.9.2 + version: 1.9.2 autoprefixer: specifier: ^10.4.20 - version: 10.4.20(postcss@8.4.44) + version: 10.4.20(postcss@8.4.47) drizzle-kit: specifier: ^0.23.2 version: 0.23.2 eslint: - specifier: ^8.57.0 - version: 8.57.0 + specifier: ^8.57.1 + version: 8.57.1 eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.0) + version: 9.1.0(eslint@8.57.1) eslint-plugin-svelte: - specifier: ^2.43.0 - version: 2.43.0(eslint@8.57.0)(svelte@5.0.0-next.175)(ts-node@10.9.2(@types/node@20.16.3)(typescript@5.5.4)) + specifier: 2.36.0-next.13 + version: 2.36.0-next.13(eslint@8.57.1)(svelte@5.0.0-next.175)(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2)) just-clone: specifier: ^6.2.0 version: 6.2.0 @@ -241,80 +259,68 @@ importers: specifier: ^6.9.15 version: 6.9.15 postcss: - specifier: ^8.4.44 - version: 8.4.44 + specifier: ^8.4.47 + version: 8.4.47 postcss-import: specifier: ^16.1.0 - version: 16.1.0(postcss@8.4.44) + version: 16.1.0(postcss@8.4.47) postcss-load-config: specifier: ^5.1.0 - version: 5.1.0(jiti@1.21.6)(postcss@8.4.44)(tsx@4.19.0) + version: 5.1.0(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.1) postcss-preset-env: specifier: ^9.6.0 - version: 9.6.0(postcss@8.4.44) + version: 9.6.0(postcss@8.4.47) prettier: specifier: ^3.3.3 version: 3.3.3 prettier-plugin-svelte: - specifier: ^3.2.6 - version: 3.2.6(prettier@3.3.3)(svelte@5.0.0-next.175) - sass: - specifier: ^1.77.8 - version: 1.77.8 - satori: - specifier: ^0.10.14 - version: 0.10.14 - satori-html: - specifier: ^0.3.2 - version: 0.3.2 + specifier: ^3.2.7 + version: 3.2.7(prettier@3.3.3)(svelte@5.0.0-next.175) svelte: specifier: 5.0.0-next.175 version: 5.0.0-next.175 svelte-check: specifier: ^3.8.6 - version: 3.8.6(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.44)(tsx@4.19.0))(postcss@8.4.44)(sass@1.77.8)(svelte@5.0.0-next.175) + version: 3.8.6(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.1))(postcss@8.4.47)(sass@1.79.1)(svelte@5.0.0-next.175) svelte-headless-table: specifier: ^0.18.2 version: 0.18.2(svelte@5.0.0-next.175) svelte-meta-tags: specifier: ^3.1.4 - version: 3.1.4(svelte@5.0.0-next.175)(typescript@5.5.4) + version: 3.1.4(svelte@5.0.0-next.175)(typescript@5.6.2) svelte-preprocess: - specifier: ^6.0.2 - version: 6.0.2(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.44)(tsx@4.19.0))(postcss@8.4.44)(sass@1.77.8)(svelte@5.0.0-next.175)(typescript@5.5.4) + specifier: ^6.0.3 + version: 6.0.3(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.1))(postcss@8.4.47)(sass@1.79.1)(svelte@5.0.0-next.175)(typescript@5.6.2) svelte-sequential-preprocessor: - specifier: ^2.0.1 - version: 2.0.1 + specifier: ^2.0.2 + version: 2.0.2 sveltekit-flash-message: specifier: ^2.4.4 - version: 2.4.4(@sveltejs/kit@2.5.25(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)))(svelte@5.0.0-next.175) - sveltekit-rate-limiter: - specifier: ^0.5.2 - version: 0.5.2(@sveltejs/kit@2.5.25(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8))) + version: 2.4.4(@sveltejs/kit@2.6.1(@sveltejs/vite-plugin-svelte@4.0.0-next.7(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)))(svelte@5.0.0-next.175) sveltekit-superforms: - specifier: ^2.17.0 - version: 2.17.0(@sveltejs/kit@2.5.25(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)))(svelte@5.0.0-next.175) + specifier: ^2.18.1 + version: 2.19.0(@sveltejs/kit@2.6.1(@sveltejs/vite-plugin-svelte@4.0.0-next.7(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)))(@types/json-schema@7.0.15)(svelte@5.0.0-next.175) tailwindcss: - specifier: ^3.4.10 - version: 3.4.10(ts-node@10.9.2(@types/node@20.16.3)(typescript@5.5.4)) + specifier: ^3.4.13 + version: 3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2)) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.16.3)(typescript@5.5.4) + version: 10.9.2(@types/node@20.16.10)(typescript@5.6.2) tslib: specifier: ^2.7.0 version: 2.7.0 tsx: - specifier: ^4.19.0 - version: 4.19.0 + specifier: ^4.19.1 + version: 4.19.1 typescript: - specifier: ^5.5.4 - version: 5.5.4 + specifier: ^5.6.2 + version: 5.6.2 vite: - specifier: ^5.4.3 - version: 5.4.3(@types/node@20.16.3)(sass@1.77.8) + specifier: ^5.4.8 + version: 5.4.8(@types/node@20.16.10)(sass@1.79.1) vitest: specifier: ^1.6.0 - version: 1.6.0(@types/node@20.16.3)(sass@1.77.8) + version: 1.6.0(@types/node@20.16.10)(sass@1.79.1) zod: specifier: ^3.23.8 version: 3.23.8 @@ -329,19 +335,19 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@ark/schema@0.2.0': - resolution: {integrity: sha512-IkNWCSHdjaoemMXpps4uFHEAQzwJPbTAS8K2vcQpk90sa+eNBuPSVyB/81/Qyl1VYW0iX3ceGC5NL/OznQv1jg==} + '@ark/schema@0.10.0': + resolution: {integrity: sha512-zpfXwWLOzj9aUK+dXQ6aleJAOgle4/WrHDop5CMX2M88dFQ85NdH8O0v0pvMAQnfFcaQAZ/nVDYLlBJsFc09XA==} - '@ark/util@0.1.0': - resolution: {integrity: sha512-qCLYICQoCy3kEKDVwirQp8qvxhY7NJd8BhhoHaj1l3wCFAk9NUbcDsxAkPStZEMdPI/d7NcbGJe8SWZuRG2twQ==} + '@ark/util@0.10.0': + resolution: {integrity: sha512-uK+9VU5doGMYOoOZVE+XaSs1vYACoaEJdrDkuBx26S4X7y3ChyKsPnIg/9pIw2vUySph1GkAXbvBnfVE2GmXgQ==} '@asteasolutions/zod-to-openapi@7.1.1': resolution: {integrity: sha512-lF0d1gAc0lYLO9/BAGivwTwE2Sh9h6CHuDcbk5KnGBfIuAsAkDC+Fdat4dkQY3CS/zUWKHRmFEma0B7X132Ymw==} peerDependencies: zod: ^3.20.2 - '@babel/runtime@7.24.8': - resolution: {integrity: sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==} + '@babel/runtime@7.25.6': + resolution: {integrity: sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==} engines: {node: '>=6.9.0'} '@biomejs/biome@1.8.3': @@ -419,8 +425,8 @@ packages: '@csstools/css-parser-algorithms': ^2.7.1 '@csstools/css-tokenizer': ^2.4.1 - '@csstools/css-color-parser@2.0.4': - resolution: {integrity: sha512-yUb0mk/k2yVNcQvRmd9uikpu6D0aamFJGgU++5d0lng6ucaJkhKyhDCQCj9rVuQYntvFQKqyU6UfTPQWU2UkXQ==} + '@csstools/css-color-parser@2.0.5': + resolution: {integrity: sha512-lRZSmtl+DSjok3u9hTWpmkxFZnz7stkbZxzKc08aDUsdrWwhSgWo8yq9rq9DaFUtbAyAq2xnH92fj01S+pwIww==} engines: {node: ^14 || ^16 || >=18} peerDependencies: '@csstools/css-parser-algorithms': ^2.7.1 @@ -647,12 +653,18 @@ packages: '@emnapi/core@0.45.0': resolution: {integrity: sha512-DPWjcUDQkCeEM4VnljEOEcXdAD7pp8zSZsgOujk/LGIwCXWbXJngin+MO4zbH429lzeC3WbYLGjE2MaUOwzpyw==} + '@emnapi/core@1.2.0': + resolution: {integrity: sha512-E7Vgw78I93we4ZWdYCb4DGAwRROGkMIXk7/y87UmANR+J6qsWusmC3gLt0H+O0KOt5e6O38U8oJamgbudrES/w==} + '@emnapi/runtime@0.45.0': resolution: {integrity: sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w==} '@emnapi/runtime@1.2.0': resolution: {integrity: sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==} + '@emnapi/wasi-threads@1.0.1': + resolution: {integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==} + '@esbuild-kit/core-utils@3.3.2': resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} @@ -671,8 +683,8 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.23.0': - resolution: {integrity: sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==} + '@esbuild/aix-ppc64@0.23.1': + resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -695,8 +707,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.23.0': - resolution: {integrity: sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==} + '@esbuild/android-arm64@0.23.1': + resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -719,8 +731,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.23.0': - resolution: {integrity: sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==} + '@esbuild/android-arm@0.23.1': + resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -743,8 +755,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.23.0': - resolution: {integrity: sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==} + '@esbuild/android-x64@0.23.1': + resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -767,8 +779,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.23.0': - resolution: {integrity: sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==} + '@esbuild/darwin-arm64@0.23.1': + resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -791,8 +803,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.23.0': - resolution: {integrity: sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==} + '@esbuild/darwin-x64@0.23.1': + resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -815,8 +827,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.23.0': - resolution: {integrity: sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==} + '@esbuild/freebsd-arm64@0.23.1': + resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -839,8 +851,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.23.0': - resolution: {integrity: sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==} + '@esbuild/freebsd-x64@0.23.1': + resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -863,8 +875,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.23.0': - resolution: {integrity: sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==} + '@esbuild/linux-arm64@0.23.1': + resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -887,8 +899,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.23.0': - resolution: {integrity: sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==} + '@esbuild/linux-arm@0.23.1': + resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -911,8 +923,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.23.0': - resolution: {integrity: sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==} + '@esbuild/linux-ia32@0.23.1': + resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -935,8 +947,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.23.0': - resolution: {integrity: sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==} + '@esbuild/linux-loong64@0.23.1': + resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -959,8 +971,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.23.0': - resolution: {integrity: sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==} + '@esbuild/linux-mips64el@0.23.1': + resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -983,8 +995,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.23.0': - resolution: {integrity: sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==} + '@esbuild/linux-ppc64@0.23.1': + resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -1007,8 +1019,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.23.0': - resolution: {integrity: sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==} + '@esbuild/linux-riscv64@0.23.1': + resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -1031,8 +1043,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.23.0': - resolution: {integrity: sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==} + '@esbuild/linux-s390x@0.23.1': + resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -1055,8 +1067,8 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.23.0': - resolution: {integrity: sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==} + '@esbuild/linux-x64@0.23.1': + resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] @@ -1079,14 +1091,14 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.23.0': - resolution: {integrity: sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==} + '@esbuild/netbsd-x64@0.23.1': + resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.23.0': - resolution: {integrity: sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==} + '@esbuild/openbsd-arm64@0.23.1': + resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] @@ -1109,8 +1121,8 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.23.0': - resolution: {integrity: sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==} + '@esbuild/openbsd-x64@0.23.1': + resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] @@ -1133,8 +1145,8 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.23.0': - resolution: {integrity: sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==} + '@esbuild/sunos-x64@0.23.1': + resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -1157,8 +1169,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.23.0': - resolution: {integrity: sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==} + '@esbuild/win32-arm64@0.23.1': + resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -1181,8 +1193,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.23.0': - resolution: {integrity: sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==} + '@esbuild/win32-ia32@0.23.1': + resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -1205,8 +1217,8 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.23.0': - resolution: {integrity: sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==} + '@esbuild/win32-x64@0.23.1': + resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -1217,16 +1229,16 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.10.0': - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + '@eslint-community/regexpp@4.11.0': + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} '@eslint/eslintrc@2.1.4': resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@eslint/js@8.57.0': - resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + '@eslint/js@8.57.1': + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} '@exodus/schemasafe@1.3.0': @@ -1236,29 +1248,17 @@ packages: resolution: {integrity: sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0, npm: '>=6.14.13'} - '@floating-ui/core@1.6.1': - resolution: {integrity: sha512-42UH54oPZHPdRHdw6BgoBD6cg/eVTmVrFcgeRDM3jbO7uxSoipVcmcIGFcA5jmOHO5apcyvBhkSKES3fQJnu7A==} + '@floating-ui/core@1.6.7': + resolution: {integrity: sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g==} - '@floating-ui/core@1.6.2': - resolution: {integrity: sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==} + '@floating-ui/dom@1.6.10': + resolution: {integrity: sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==} - '@floating-ui/core@1.6.4': - resolution: {integrity: sha512-a4IowK4QkXl4SCWTGUR0INAfEOX3wtsYw3rKK5InQEHMGObkR8Xk44qYQD9P4r6HHw0iIfK6GUKECmY8sTkqRA==} + '@floating-ui/utils@0.2.7': + resolution: {integrity: sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==} - '@floating-ui/dom@1.6.5': - resolution: {integrity: sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==} - - '@floating-ui/dom@1.6.7': - resolution: {integrity: sha512-wmVfPG5o2xnKDU4jx/m4w5qva9FWHcnZ8BvzEe90D/RpwsJaTAVYPEPdQ8sbr/N8zZTAHlZUTQdqg8ZUbzHmng==} - - '@floating-ui/utils@0.2.2': - resolution: {integrity: sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==} - - '@floating-ui/utils@0.2.4': - resolution: {integrity: sha512-dWO2pw8hhi+WrXq1YJy2yCuWoL20PddgGaqTgVe4cOS9Q6qklXCiA1tJEqX6BEwRNSCP84/afac9hd4MS+zEUA==} - - '@fontsource/fira-mono@5.0.14': - resolution: {integrity: sha512-4IKa+cuHipk/vr2frgZh4pyR2XcoQk/j3zmMlo8uuAGUB3IPLpQlgN6Qm5d3RfRZ7dXGlTn/PWiAJeU8bkmD4w==} + '@fontsource/fira-mono@5.1.0': + resolution: {integrity: sha512-6+nftSKApXyN0I9FC5GJuG5TUCh+in5OehtrXRIsHJvq38Pm//oA1kZZYNdXv99JYzLzJ3lzsTAavmS+xGLGDw==} '@gcornut/valibot-json-schema@0.31.0': resolution: {integrity: sha512-3xGptCurm23e7nuPQkdrE5rEs1FeTPHhAUsBuwwqG4/YeZLwJOoYZv+fmsppUEfo5y9lzUwNQrNqLS/q7HMc7g==} @@ -1288,9 +1288,10 @@ packages: hono: '>=3.9.0' zod: ^3.19.1 - '@humanwhocodes/config-array@0.11.14': - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} @@ -1298,6 +1299,7 @@ packages: '@humanwhocodes/object-schema@2.0.3': resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead '@iconify-icons/line-md@1.2.30': resolution: {integrity: sha512-91gXvybU5yYJV8g+thOVubdmjOb5Oqn97kcwzQh2c3ZpYNZic2C6tqDd40xJ7rEdeJ8fBFIPGaZ5cXagnaVLlw==} @@ -1308,116 +1310,108 @@ packages: '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - '@img/sharp-darwin-arm64@0.33.4': - resolution: {integrity: sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA==} - engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-darwin-arm64@0.33.5': + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.33.4': - resolution: {integrity: sha512-0l7yRObwtTi82Z6ebVI2PnHT8EB2NxBgpK2MiKJZJ7cz32R4lxd001ecMhzzsZig3Yv9oclvqqdV93jo9hy+Dw==} - engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-darwin-x64@0.33.5': + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.0.2': - resolution: {integrity: sha512-tcK/41Rq8IKlSaKRCCAuuY3lDJjQnYIW1UXU1kxcEKrfL8WR7N6+rzNoOxoQRJWTAECuKwgAHnPvqXGN8XfkHA==} - engines: {macos: '>=11', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-libvips-darwin-arm64@1.0.4': + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.0.2': - resolution: {integrity: sha512-Ofw+7oaWa0HiiMiKWqqaZbaYV3/UGL2wAPeLuJTx+9cXpCRdvQhCLG0IH8YGwM0yGWGLpsF4Su9vM1o6aer+Fw==} - engines: {macos: '>=10.13', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-libvips-darwin-x64@1.0.4': + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.0.2': - resolution: {integrity: sha512-x7kCt3N00ofFmmkkdshwj3vGPCnmiDh7Gwnd4nUwZln2YjqPxV1NlTyZOvoDWdKQVDL911487HOueBvrpflagw==} - engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-libvips-linux-arm64@1.0.4': + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linux-arm@1.0.2': - resolution: {integrity: sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw==} - engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-libvips-linux-arm@1.0.5': + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} cpu: [arm] os: [linux] - '@img/sharp-libvips-linux-s390x@1.0.2': - resolution: {integrity: sha512-cmhQ1J4qVhfmS6szYW7RT+gLJq9dH2i4maq+qyXayUSn9/3iY2ZeWpbAgSpSVbV2E1JUL2Gg7pwnYQ1h8rQIog==} - engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-libvips-linux-s390x@1.0.4': + resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} cpu: [s390x] os: [linux] - '@img/sharp-libvips-linux-x64@1.0.2': - resolution: {integrity: sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ==} - engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-libvips-linux-x64@1.0.4': + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} cpu: [x64] os: [linux] - '@img/sharp-libvips-linuxmusl-arm64@1.0.2': - resolution: {integrity: sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ==} - engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linuxmusl-x64@1.0.2': - resolution: {integrity: sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw==} - engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} cpu: [x64] os: [linux] - '@img/sharp-linux-arm64@0.33.4': - resolution: {integrity: sha512-2800clwVg1ZQtxwSoTlHvtm9ObgAax7V6MTAB/hDT945Tfyy3hVkmiHpeLPCKYqYR1Gcmv1uDZ3a4OFwkdBL7Q==} - engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-linux-arm64@0.33.5': + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linux-arm@0.33.4': - resolution: {integrity: sha512-RUgBD1c0+gCYZGCCe6mMdTiOFS0Zc/XrN0fYd6hISIKcDUbAW5NtSQW9g/powkrXYm6Vzwd6y+fqmExDuCdHNQ==} - engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-linux-arm@0.33.5': + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - '@img/sharp-linux-s390x@0.33.4': - resolution: {integrity: sha512-h3RAL3siQoyzSoH36tUeS0PDmb5wINKGYzcLB5C6DIiAn2F3udeFAum+gj8IbA/82+8RGCTn7XW8WTFnqag4tQ==} - engines: {glibc: '>=2.31', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-linux-s390x@0.33.5': + resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - '@img/sharp-linux-x64@0.33.4': - resolution: {integrity: sha512-GoR++s0XW9DGVi8SUGQ/U4AeIzLdNjHka6jidVwapQ/JebGVQIpi52OdyxCNVRE++n1FCLzjDovJNozif7w/Aw==} - engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-linux-x64@0.33.5': + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-linuxmusl-arm64@0.33.4': - resolution: {integrity: sha512-nhr1yC3BlVrKDTl6cO12gTpXMl4ITBUZieehFvMntlCXFzH2bvKG76tBL2Y/OqhupZt81pR7R+Q5YhJxW0rGgQ==} - engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-linuxmusl-arm64@0.33.5': + resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linuxmusl-x64@0.33.4': - resolution: {integrity: sha512-uCPTku0zwqDmZEOi4ILyGdmW76tH7dm8kKlOIV1XC5cLyJ71ENAAqarOHQh0RLfpIpbV5KOpXzdU6XkJtS0daw==} - engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-linuxmusl-x64@0.33.5': + resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-wasm32@0.33.4': - resolution: {integrity: sha512-Bmmauh4sXUsUqkleQahpdNXKvo+wa1V9KhT2pDA4VJGKwnKMJXiSTGphn0gnJrlooda0QxCtXc6RX1XAU6hMnQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-wasm32@0.33.5': + resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] - '@img/sharp-win32-ia32@0.33.4': - resolution: {integrity: sha512-99SJ91XzUhYHbx7uhK3+9Lf7+LjwMGQZMDlO/E/YVJ7Nc3lyDFZPGhjwiYdctoH2BOzW9+TnfqcaMKt0jHLdqw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-win32-ia32@0.33.5': + resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.33.4': - resolution: {integrity: sha512-3QLocdTRVIrFNye5YocZl+KKpYKP+fksi1QhmOArgx7GyhIbQp/WrJRu176jm8IxromS7RIkzMiMINVdBtC8Aw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-win32-x64@0.33.5': + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] @@ -1431,10 +1425,6 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} - '@isaacs/ttlcache@1.4.1': - resolution: {integrity: sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==} - engines: {node: '>=12'} - '@jest/schemas@29.6.3': resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -1451,8 +1441,8 @@ packages: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} @@ -1524,12 +1514,15 @@ packages: cpu: [x64] os: [win32] + '@napi-rs/wasm-runtime@0.2.4': + resolution: {integrity: sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==} + '@neondatabase/serverless@0.9.5': resolution: {integrity: sha512-siFas6gItqv6wD/pZnvdu34wEqgG3nSE6zWZdq5j2DEsa+VvX8i/5HXJOo06qrw5axPXn+lGCxeR+NLaSPIXug==} - '@noble/hashes@1.4.0': - resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} - engines: {node: '>= 16'} + '@noble/hashes@1.5.0': + resolution: {integrity: sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==} + engines: {node: ^14.21.3 || >=16} '@node-rs/argon2-android-arm-eabi@1.7.0': resolution: {integrity: sha512-udDqkr5P9E+wYX1SZwAVPdyfYvaF4ry9Tm+R9LkfSHbzWH0uhU6zjIwNRp7m+n4gx691rk+lqqDAIP8RLKwbhg==} @@ -1537,87 +1530,174 @@ packages: cpu: [arm] os: [android] + '@node-rs/argon2-android-arm-eabi@1.8.3': + resolution: {integrity: sha512-JFZPlNM0A8Og+Tncb8UZsQrhEMlbHBXPsT3hRoKImzVmTmq28Os0ucFWow0AACp2coLHBSydXH3Dh0lZup3rWw==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + '@node-rs/argon2-android-arm64@1.7.0': resolution: {integrity: sha512-s9j/G30xKUx8WU50WIhF0fIl1EdhBGq0RQ06lEhZ0Gi0ap8lhqbE2Bn5h3/G2D1k0Dx+yjeVVNmt/xOQIRG38A==} engines: {node: '>= 10'} cpu: [arm64] os: [android] + '@node-rs/argon2-android-arm64@1.8.3': + resolution: {integrity: sha512-zaf8P3T92caeW2xnMA7P1QvRA4pIt/04oilYP44XlTCtMye//vwXDMeK53sl7dvYiJKnzAWDRx41k8vZvpZazg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + '@node-rs/argon2-darwin-arm64@1.7.0': resolution: {integrity: sha512-ZIz4L6HGOB9U1kW23g+m7anGNuTZ0RuTw0vNp3o+2DWpb8u8rODq6A8tH4JRL79S+Co/Nq608m9uackN2pe0Rw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] + '@node-rs/argon2-darwin-arm64@1.8.3': + resolution: {integrity: sha512-DV/IbmLGdNXBtXb5o2UI5ba6kvqXqPAJgmMOTUCuHeBSp992GlLHdfU4rzGu0dNrxudBnunNZv+crd0YdEQSUA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + '@node-rs/argon2-darwin-x64@1.7.0': resolution: {integrity: sha512-5oi/pxqVhODW/pj1+3zElMTn/YukQeywPHHYDbcAW3KsojFjKySfhcJMd1DjKTc+CHQI+4lOxZzSUzK7mI14Hw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] + '@node-rs/argon2-darwin-x64@1.8.3': + resolution: {integrity: sha512-YMjmBGFZhLfYjfQ2gll9A+BZu/zAMV7lWZIbKxb7ZgEofILQwuGmExjDtY3Jplido/6leCEdpmlk2oIsME00LA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + '@node-rs/argon2-freebsd-x64@1.7.0': resolution: {integrity: sha512-Ify08683hA4QVXYoIm5SUWOY5DPIT/CMB0CQT+IdxQAg/F+qp342+lUkeAtD5bvStQuCx/dFO3bnnzoe2clMhA==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] + '@node-rs/argon2-freebsd-x64@1.8.3': + resolution: {integrity: sha512-Hq3Rj5Yb2RolTG/luRPnv+XiGCbi5nAK25Pc8ou/tVapwX+iktEm/NXbxc5zsMxraYVkCvfdwBjweC5O+KqCGw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + '@node-rs/argon2-linux-arm-gnueabihf@1.7.0': resolution: {integrity: sha512-7DjDZ1h5AUHAtRNjD19RnQatbhL+uuxBASuuXIBu4/w6Dx8n7YPxwTP4MXfsvuRgKuMWiOb/Ub/HJ3kXVCXRkg==} engines: {node: '>= 10'} cpu: [arm] os: [linux] + '@node-rs/argon2-linux-arm-gnueabihf@1.8.3': + resolution: {integrity: sha512-x49l8RgzKoG0/V0IXa5rrEl1TcJEc936ctlYFvqcunSOyowZ6kiWtrp1qrbOR8gbaNILl11KTF52vF6+h8UlEQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + '@node-rs/argon2-linux-arm64-gnu@1.7.0': resolution: {integrity: sha512-nJDoMP4Y3YcqGswE4DvP080w6O24RmnFEDnL0emdI8Nou17kNYBzP2546Nasx9GCyLzRcYQwZOUjrtUuQ+od2g==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + '@node-rs/argon2-linux-arm64-gnu@1.8.3': + resolution: {integrity: sha512-gJesam/qA63reGkb9qJ2TjFSLBtY41zQh2oei7nfnYsmVQPuHHWItJxEa1Bm21SPW53gZex4jFJbDIgj0+PxIw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + '@node-rs/argon2-linux-arm64-musl@1.7.0': resolution: {integrity: sha512-BKWS8iVconhE3jrb9mj6t1J9vwUqQPpzCbUKxfTGJfc+kNL58F1SXHBoe2cDYGnHrFEHTY0YochzXoAfm4Dm/A==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + '@node-rs/argon2-linux-arm64-musl@1.8.3': + resolution: {integrity: sha512-7O6kQdSKzB4Tjx/EBa8zKIxnmLkQE8VdJgPm6Ksrpn+ueo0mx2xf76fIDnbbTCtm3UbB+y+FkTo2wLA7tOqIKg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + '@node-rs/argon2-linux-x64-gnu@1.7.0': resolution: {integrity: sha512-EmgqZOlf4Jurk/szW1iTsVISx25bKksVC5uttJDUloTgsAgIGReCpUUO1R24pBhu9ESJa47iv8NSf3yAfGv6jQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + '@node-rs/argon2-linux-x64-gnu@1.8.3': + resolution: {integrity: sha512-OBH+EFG7BGjFyldaao2H2gSCLmjtrrwf420B1L+lFn7JLW9UAjsIPFKAcWsYwPa/PwYzIge9Y7SGcpqlsSEX0w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + '@node-rs/argon2-linux-x64-musl@1.7.0': resolution: {integrity: sha512-/o1efYCYIxjfuoRYyBTi2Iy+1iFfhqHCvvVsnjNSgO1xWiWrX0Rrt/xXW5Zsl7vS2Y+yu8PL8KFWRzZhaVxfKA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + '@node-rs/argon2-linux-x64-musl@1.8.3': + resolution: {integrity: sha512-bDbMuyekIxZaN7NaX+gHVkOyABB8bcMEJYeRPW1vCXKHj3brJns1wiUFSxqeUXreupifNVJlQfPt1Y5B/vFXgQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + '@node-rs/argon2-wasm32-wasi@1.7.0': resolution: {integrity: sha512-Evmk9VcxqnuwQftfAfYEr6YZYSPLzmKUsbFIMep5nTt9PT4XYRFAERj7wNYp+rOcBenF3X4xoB+LhwcOMTNE5w==} engines: {node: '>=14.0.0'} cpu: [wasm32] + '@node-rs/argon2-wasm32-wasi@1.8.3': + resolution: {integrity: sha512-NBf2cMCDbNKMzp13Pog8ZPmI0M9U4Ak5b95EUjkp17kdKZFds12dwW67EMnj7Zy+pRqby2QLECaWebDYfNENTg==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + '@node-rs/argon2-win32-arm64-msvc@1.7.0': resolution: {integrity: sha512-qgsU7T004COWWpSA0tppDqDxbPLgg8FaU09krIJ7FBl71Sz8SFO40h7fDIjfbTT5w7u6mcaINMQ5bSHu75PCaA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] + '@node-rs/argon2-win32-arm64-msvc@1.8.3': + resolution: {integrity: sha512-AHpPo7UbdW5WWjwreVpgFSY0o1RY4A7cUFaqDXZB2OqEuyrhMxBdZct9PX7PQKI18D85pLsODnR+gvVuTwJ6rQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + '@node-rs/argon2-win32-ia32-msvc@1.7.0': resolution: {integrity: sha512-JGafwWYQ/HpZ3XSwP4adQ6W41pRvhcdXvpzIWtKvX+17+xEXAe2nmGWM6s27pVkg1iV2ZtoYLRDkOUoGqZkCcg==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] + '@node-rs/argon2-win32-ia32-msvc@1.8.3': + resolution: {integrity: sha512-bqzn2rcQkEwCINefhm69ttBVVkgHJb/V03DdBKsPFtiX6H47axXKz62d1imi26zFXhOEYxhKbu3js03GobJOLw==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + '@node-rs/argon2-win32-x64-msvc@1.7.0': resolution: {integrity: sha512-9oq4ShyFakw8AG3mRls0AoCpxBFcimYx7+jvXeAf2OqKNO+mSA6eZ9z7KQeVCi0+SOEUYxMGf5UiGiDb9R6+9Q==} engines: {node: '>= 10'} cpu: [x64] os: [win32] + '@node-rs/argon2-win32-x64-msvc@1.8.3': + resolution: {integrity: sha512-ILlrRThdbp5xNR5gwYM2ic1n/vG5rJ8dQZ+YMRqksl+lnTJ/6FDe5BOyIhiPtiDwlCiCtUA+1NxpDB9KlUCAIA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + '@node-rs/argon2@1.7.0': resolution: {integrity: sha512-zfULc+/tmcWcxn+nHkbyY8vP3+MpEqKORbszt4UkpqZgBgDAAIYvuDN/zukfTgdmo6tmJKKVfzigZOPk4LlIog==} engines: {node: '>= 10'} + '@node-rs/argon2@1.8.3': + resolution: {integrity: sha512-sf/QAEI59hsMEEE2J8vO4hKrXrv4Oplte3KI2N4MhMDYpytH0drkVfErmHBfWFZxxIEK03fX1WsBNswS2nIZKg==} + engines: {node: '>= 10'} + '@node-rs/bcrypt-android-arm-eabi@1.9.0': resolution: {integrity: sha512-nOCFISGtnodGHNiLrG0WYLWr81qQzZKYfmwHc7muUeq+KY0sQXyHOwZk9OuNQAWv/lnntmtbwkwT0QNEmOyLvA==} engines: {node: '>= 10'} @@ -1717,6 +1797,42 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@oslojs/asn1@1.0.0': + resolution: {integrity: sha512-zw/wn0sj0j0QKbIXfIlnEcTviaCzYOY3V5rAyjR6YtOByFtJiT574+8p9Wlach0lZH9fddD4yb9laEAIl4vXQA==} + + '@oslojs/binary@1.0.0': + resolution: {integrity: sha512-9RCU6OwXU6p67H4NODbuxv2S3eenuQ4/WFLrsq+K/k682xrznH5EVWA7N4VFk9VYVcbFtKqur5YQQZc0ySGhsQ==} + + '@oslojs/cbor@1.0.0': + resolution: {integrity: sha512-AY6Lknexs7n2xp8Cgey95c+975VG7XOk4UEdRdNFxHmDDbuf47OC/LAVRsl14DeTLwo8W6xr3HLFwUFmKcndTQ==} + + '@oslojs/crypto@1.0.0': + resolution: {integrity: sha512-dVz8TkkgYdr3tlwxHd7SCYGxoN7ynwHLA0nei/Aq9C+ERU0BK+U8+/3soEzBUxUNKYBf42351DyJUZ2REla50w==} + + '@oslojs/crypto@1.0.1': + resolution: {integrity: sha512-7n08G8nWjAr/Yu3vu9zzrd0L9XnrJfpMioQcvCMxBIiF5orECHe5/3J0jmXRVvgfqMm/+4oxlQ+Sq39COYLcNQ==} + + '@oslojs/encoding@0.4.1': + resolution: {integrity: sha512-hkjo6MuIK/kQR5CrGNdAPZhS01ZCXuWDRJ187zh6qqF2+yMHZpD9fAYpX8q2bOO6Ryhl3XpCT6kUX76N8hhm4Q==} + + '@oslojs/encoding@1.0.0': + resolution: {integrity: sha512-dyIB0SdZgMm5BhGwdSp8rMxEFIopLKxDG1vxIBaiogyom6ZqH2aXPb6DEC2WzOOWKdPSq1cxdNeRx2wAn1Z+ZQ==} + + '@oslojs/encoding@1.1.0': + resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} + + '@oslojs/jwt@0.2.0': + resolution: {integrity: sha512-bLE7BtHrURedCn4Mco3ma9L4Y1GR2SMBuIvjWr7rmQ4/W/4Jy70TIAgZ+0nIlk0xHz1vNP8x8DCns45Sb2XRbg==} + + '@oslojs/oauth2@0.5.0': + resolution: {integrity: sha512-t70+e4EgnzTbU4MrUWXzqWN2A6RJrlSSvwwuBv6E0Ap6/nsIXrjsdRWeTcSvvXTcC6fi0YdWaqEWLipcEm2Cgw==} + + '@oslojs/otp@1.0.0': + resolution: {integrity: sha512-w/vZfoVsFCCcmsmsXVsIMoWbvr1IZmQ9BsDZwdePSpe8rFKMD1Knd+05iJr415adXkFVyu0tYxgrLPYMynNtXQ==} + + '@oslojs/webauthn@1.0.0': + resolution: {integrity: sha512-2ZRpbt3msNURwvjmavzq9vrNlxUnWFBGMYqbC1kO3fYBLskL7r4DiLJT1wbtLoI+hclFwjhl48YhRFBl6RWg1A==} + '@paralleldrive/cuid2@2.2.2': resolution: {integrity: sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==} @@ -1724,8 +1840,8 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@playwright/test@1.46.1': - resolution: {integrity: sha512-Fq6SwLujA/DOIvNC2EL/SojJnkKf/rAwJ//APpJJHRyMi1PdKrY3Az+4XNQ51N4RTbItbIByQ0jgd1tayq1aeA==} + '@playwright/test@1.47.2': + resolution: {integrity: sha512-jTXRsoSPONAs8Za9QEQdyjFn+0ZQFjCiIztAIF6bi1HqhBzG9Ma7g1WotyiGqFSBRZjIEqMdT8RUlbk1QVhzCQ==} engines: {node: '>=18'} hasBin: true @@ -1736,88 +1852,8 @@ packages: resolution: {integrity: sha512-xhhEcEvhQC8mP5oOr5hbE4CmUgmw/IPV1jhpGg2xSkzoFrt9i8YVqBQt9744EFesi5F7pBheWozg63RUBM/5JA==} engines: {node: '>=18.16.0'} - '@resvg/resvg-js-android-arm-eabi@2.6.2': - resolution: {integrity: sha512-FrJibrAk6v29eabIPgcTUMPXiEz8ssrAk7TXxsiZzww9UTQ1Z5KAbFJs+Z0Ez+VZTYgnE5IQJqBcoSiMebtPHA==} - engines: {node: '>= 10'} - cpu: [arm] - os: [android] - - '@resvg/resvg-js-android-arm64@2.6.2': - resolution: {integrity: sha512-VcOKezEhm2VqzXpcIJoITuvUS/fcjIw5NA/w3tjzWyzmvoCdd+QXIqy3FBGulWdClvp4g+IfUemigrkLThSjAQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - - '@resvg/resvg-js-darwin-arm64@2.6.2': - resolution: {integrity: sha512-nmok2LnAd6nLUKI16aEB9ydMC6Lidiiq2m1nEBDR1LaaP7FGs4AJ90qDraxX+CWlVuRlvNjyYJTNv8qFjtL9+A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@resvg/resvg-js-darwin-x64@2.6.2': - resolution: {integrity: sha512-GInyZLjgWDfsVT6+SHxQVRwNzV0AuA1uqGsOAW+0th56J7Nh6bHHKXHBWzUrihxMetcFDmQMAX1tZ1fZDYSRsw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@resvg/resvg-js-linux-arm-gnueabihf@2.6.2': - resolution: {integrity: sha512-YIV3u/R9zJbpqTTNwTZM5/ocWetDKGsro0SWp70eGEM9eV2MerWyBRZnQIgzU3YBnSBQ1RcxRZvY/UxwESfZIw==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - - '@resvg/resvg-js-linux-arm64-gnu@2.6.2': - resolution: {integrity: sha512-zc2BlJSim7YR4FZDQ8OUoJg5holYzdiYMeobb9pJuGDidGL9KZUv7SbiD4E8oZogtYY42UZEap7dqkkYuA91pg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@resvg/resvg-js-linux-arm64-musl@2.6.2': - resolution: {integrity: sha512-3h3dLPWNgSsD4lQBJPb4f+kvdOSJHa5PjTYVsWHxLUzH4IFTJUAnmuWpw4KqyQ3NA5QCyhw4TWgxk3jRkQxEKg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@resvg/resvg-js-linux-x64-gnu@2.6.2': - resolution: {integrity: sha512-IVUe+ckIerA7xMZ50duAZzwf1U7khQe2E0QpUxu5MBJNao5RqC0zwV/Zm965vw6D3gGFUl7j4m+oJjubBVoftw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@resvg/resvg-js-linux-x64-musl@2.6.2': - resolution: {integrity: sha512-UOf83vqTzoYQO9SZ0fPl2ZIFtNIz/Rr/y+7X8XRX1ZnBYsQ/tTb+cj9TE+KHOdmlTFBxhYzVkP2lRByCzqi4jQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@resvg/resvg-js-win32-arm64-msvc@2.6.2': - resolution: {integrity: sha512-7C/RSgCa+7vqZ7qAbItfiaAWhyRSoD4l4BQAbVDqRRsRgY+S+hgS3in0Rxr7IorKUpGE69X48q6/nOAuTJQxeQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@resvg/resvg-js-win32-ia32-msvc@2.6.2': - resolution: {integrity: sha512-har4aPAlvjnLcil40AC77YDIk6loMawuJwFINEM7n0pZviwMkMvjb2W5ZirsNOZY4aDbo5tLx0wNMREp5Brk+w==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - - '@resvg/resvg-js-win32-x64-msvc@2.6.2': - resolution: {integrity: sha512-ZXtYhtUr5SSaBrUDq7DiyjOFJqBVL/dOBN7N/qmi/pO0IgiWW/f/ue3nbvu9joWE5aAKDoIzy/CxsY0suwGosQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@resvg/resvg-js@2.6.2': - resolution: {integrity: sha512-xBaJish5OeGmniDj9cW5PRa/PtmuVU3ziqrbr5xJj901ZDN4TosrVaNZpEiLZAxdfnhAe7uQ7QFWfjPe9d9K2Q==} - engines: {node: '>= 10'} - - '@resvg/resvg-wasm@2.6.0': - resolution: {integrity: sha512-iDkBM6Ivex8nULtBu8cX670/lfsGxq8U1cuqE+qS9xFpPQP1enPdVm/33Kq3+B+bAldA+AHNZnCgpmlHo/fZrQ==} - engines: {node: '>= 10'} - - '@rollup/plugin-commonjs@26.0.1': - resolution: {integrity: sha512-UnsKoZK6/aGIH6AdkptXhNvhaqftcjq3zZdT+LY5Ftms6JR06nADcDsYp5hTU9E2lbJUEOhdlY5J4DNTneM+jQ==} + '@rollup/plugin-commonjs@28.0.0': + resolution: {integrity: sha512-BJcu+a+Mpq476DMXG+hevgPSl56bkUoi88dKT8t3RyUp8kGuOh+2bU8Gs7zXDlu+fyZggnJ+iOBGrb/O1SorYg==} engines: {node: '>=16.0.0 || 14 >= 14.17'} peerDependencies: rollup: ^2.68.0||^3.0.0||^4.0.0 @@ -1834,8 +1870,8 @@ packages: rollup: optional: true - '@rollup/plugin-node-resolve@15.2.3': - resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} + '@rollup/plugin-node-resolve@15.3.0': + resolution: {integrity: sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^2.78.0||^3.0.0||^4.0.0 @@ -1856,171 +1892,95 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.18.1': - resolution: {integrity: sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA==} + '@rollup/pluginutils@5.1.2': + resolution: {integrity: sha512-/FIdS3PyZ39bjZlwqFnWqCOVnW7o963LtKMwQOD0NhQqw22gSr2YY1afu3FxRip4ZCZNsD5jq6Aaz6QV3D/Njw==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.21.2': + resolution: {integrity: sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm-eabi@4.21.0': - resolution: {integrity: sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA==} - cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm64@4.18.1': - resolution: {integrity: sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg==} + '@rollup/rollup-android-arm64@4.21.2': + resolution: {integrity: sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==} cpu: [arm64] os: [android] - '@rollup/rollup-android-arm64@4.21.0': - resolution: {integrity: sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA==} - cpu: [arm64] - os: [android] - - '@rollup/rollup-darwin-arm64@4.18.1': - resolution: {integrity: sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ==} + '@rollup/rollup-darwin-arm64@4.21.2': + resolution: {integrity: sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-arm64@4.21.0': - resolution: {integrity: sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA==} - cpu: [arm64] - os: [darwin] - - '@rollup/rollup-darwin-x64@4.18.1': - resolution: {integrity: sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA==} + '@rollup/rollup-darwin-x64@4.21.2': + resolution: {integrity: sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==} cpu: [x64] os: [darwin] - '@rollup/rollup-darwin-x64@4.21.0': - resolution: {integrity: sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg==} - cpu: [x64] - os: [darwin] - - '@rollup/rollup-linux-arm-gnueabihf@4.18.1': - resolution: {integrity: sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g==} + '@rollup/rollup-linux-arm-gnueabihf@4.21.2': + resolution: {integrity: sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-gnueabihf@4.21.0': - resolution: {integrity: sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==} + '@rollup/rollup-linux-arm-musleabihf@4.21.2': + resolution: {integrity: sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.18.1': - resolution: {integrity: sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm-musleabihf@4.21.0': - resolution: {integrity: sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm64-gnu@4.18.1': - resolution: {integrity: sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ==} + '@rollup/rollup-linux-arm64-gnu@4.21.2': + resolution: {integrity: sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.21.0': - resolution: {integrity: sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==} + '@rollup/rollup-linux-arm64-musl@4.21.2': + resolution: {integrity: sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.18.1': - resolution: {integrity: sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-arm64-musl@4.21.0': - resolution: {integrity: sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-powerpc64le-gnu@4.18.1': - resolution: {integrity: sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ==} + '@rollup/rollup-linux-powerpc64le-gnu@4.21.2': + resolution: {integrity: sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.21.0': - resolution: {integrity: sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==} - cpu: [ppc64] - os: [linux] - - '@rollup/rollup-linux-riscv64-gnu@4.18.1': - resolution: {integrity: sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg==} + '@rollup/rollup-linux-riscv64-gnu@4.21.2': + resolution: {integrity: sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.21.0': - resolution: {integrity: sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-s390x-gnu@4.18.1': - resolution: {integrity: sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg==} + '@rollup/rollup-linux-s390x-gnu@4.21.2': + resolution: {integrity: sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.21.0': - resolution: {integrity: sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==} - cpu: [s390x] - os: [linux] - - '@rollup/rollup-linux-x64-gnu@4.18.1': - resolution: {integrity: sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g==} + '@rollup/rollup-linux-x64-gnu@4.21.2': + resolution: {integrity: sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.21.0': - resolution: {integrity: sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg==} + '@rollup/rollup-linux-x64-musl@4.21.2': + resolution: {integrity: sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.18.1': - resolution: {integrity: sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-linux-x64-musl@4.21.0': - resolution: {integrity: sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-win32-arm64-msvc@4.18.1': - resolution: {integrity: sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g==} + '@rollup/rollup-win32-arm64-msvc@4.21.2': + resolution: {integrity: sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-arm64-msvc@4.21.0': - resolution: {integrity: sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==} - cpu: [arm64] - os: [win32] - - '@rollup/rollup-win32-ia32-msvc@4.18.1': - resolution: {integrity: sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg==} + '@rollup/rollup-win32-ia32-msvc@4.21.2': + resolution: {integrity: sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.21.0': - resolution: {integrity: sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-x64-msvc@4.18.1': - resolution: {integrity: sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw==} + '@rollup/rollup-win32-x64-msvc@4.21.2': + resolution: {integrity: sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.21.0': - resolution: {integrity: sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ==} - cpu: [x64] - os: [win32] - - '@shuding/opentype.js@1.4.0-beta.0': - resolution: {integrity: sha512-3NgmNyH3l/Hv6EvsWJbsvpcpUba6R8IREQ83nH83cyakCw7uM1arZKNfHwv1Wz6jgqrF/j4x5ELvR6PnK9nTcA==} - engines: {node: '>= 8.0.0'} - hasBin: true - '@sideway/address@4.1.5': resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} @@ -2039,29 +1999,29 @@ packages: '@sodaru/yup-to-json-schema@2.0.1': resolution: {integrity: sha512-lWb0Wiz8KZ9ip/dY1eUqt7fhTPmL24p6Hmv5Fd9pzlzAdw/YNcWZr+tiCT4oZ4Zyxzi9+1X4zv82o7jYvcFxYA==} - '@sveltejs/adapter-auto@3.2.4': - resolution: {integrity: sha512-a64AKYbfTUrVwU0xslzv1Jf3M8bj0IwhptaXmhgIkjXspBXhD0od9JiItQHchijpLMGdEDcYBlvqySkEawv6mQ==} + '@sveltejs/adapter-auto@3.2.5': + resolution: {integrity: sha512-27LR+uKccZ62lgq4N/hvyU2G+hTP9fxWEAfnZcl70HnyfAjMSsGk1z/SjAPXNCD1mVJIE7IFu3TQ8cQ/UH3c0A==} peerDependencies: '@sveltejs/kit': ^2.0.0 - '@sveltejs/adapter-node@5.2.2': - resolution: {integrity: sha512-BCX4zP0cf86TXpmvLQTnnT/tp7P12UMezf+5LwljP1MJC1fFzn9XOXpAHQCyP+pyHGy2K7p5gY0LyLcZFAL02w==} + '@sveltejs/adapter-node@5.2.5': + resolution: {integrity: sha512-FVeysFqeIlKFpDF1Oj38gby34f6uA9FuXnV330Z0RHmSyOR9JzJs70/nFKy1Ue3fWtf7S0RemOrP66Vr9Jcmew==} peerDependencies: '@sveltejs/kit': ^2.4.0 - '@sveltejs/adapter-vercel@5.4.3': - resolution: {integrity: sha512-srZBkMpeaa7lflO1ZGdKTW3jWHscE9rdAkyxgRlVMVyugjcPOZ3dcpEfpoM4wtVCbpEOdHniWqQR9yL+zs4ybA==} + '@sveltejs/adapter-vercel@5.4.4': + resolution: {integrity: sha512-KORoxxqB2H5DrxpCHc9Yfijcgvmoaaz6G6eKHEg9fRlTsujJkxN26C0x4YlcgxqDU4dLIi1wfSLHpuZD0E4Irg==} peerDependencies: '@sveltejs/kit': ^2.4.0 - '@sveltejs/enhanced-img@0.3.4': - resolution: {integrity: sha512-eX+ob5uWr0bTLMKeG9nhhM84aR88hqiLiyEfWZPX7ijhk/wlmYSUX9nOiaVHh2ct1U+Ju9Hhb90Copw+ZNOB8w==} + '@sveltejs/enhanced-img@0.3.8': + resolution: {integrity: sha512-n66u46ZeqHltiTm0BEjWptYmCrCY0EltEEvakmC7d5o5ZejDbOvOWm914mebbRKaP2Bezv65TNCod/wqvw/0KA==} peerDependencies: svelte: ^4.0.0 || ^5.0.0-next.0 vite: '>= 5.0.0' - '@sveltejs/kit@2.5.25': - resolution: {integrity: sha512-5hBSEN8XEjDZ5+2bHkFh8Z0QyOk0C187cyb12aANe1c8aeKbfu5ZD5XaC2vEH4h0alJFDXPdUkXQBmeeXeMr1A==} + '@sveltejs/kit@2.6.1': + resolution: {integrity: sha512-QFlch3GPGZYidYhdRAub0fONw8UTguPICFHUSPxNkA/jdlU1p6C6yqq19J1QWdxIHS2El/ycDCGrHb3EAiMNqg==} engines: {node: '>=18.13'} hasBin: true peerDependencies: @@ -2069,23 +2029,23 @@ packages: svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.3 - '@sveltejs/vite-plugin-svelte-inspector@2.1.0': - resolution: {integrity: sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==} - engines: {node: ^18.0.0 || >=20} + '@sveltejs/vite-plugin-svelte-inspector@3.0.0-next.3': + resolution: {integrity: sha512-kuGJ2CZ5lAw3gKF8Kw0AfKtUJWbwdlDHY14K413B0MCyrzvQvsKTorwmwZcky0+QqY6RnVIZ/5FttB9bQmkLXg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22} peerDependencies: - '@sveltejs/vite-plugin-svelte': ^3.0.0 - svelte: ^4.0.0 || ^5.0.0-next.0 + '@sveltejs/vite-plugin-svelte': ^4.0.0-next.0||^4.0.0 + svelte: ^5.0.0-next.96 || ^5.0.0 vite: ^5.0.0 - '@sveltejs/vite-plugin-svelte@3.1.2': - resolution: {integrity: sha512-Txsm1tJvtiYeLUVRNqxZGKR/mI+CzuIQuc2gn+YCs9rMTowpNZ2Nqt53JdL8KF9bLhAf2ruR/dr9eZCwdTriRA==} - engines: {node: ^18.0.0 || >=20} + '@sveltejs/vite-plugin-svelte@4.0.0-next.7': + resolution: {integrity: sha512-yMUnAqquoayvBDztk1rWUgdtvjv7YcHgopCAB7sWl9SQht8U/7lqwTlJU0ZTAY09pFFRe6bbakd7YoiyyIvJiA==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22} peerDependencies: - svelte: ^4.0.0 || ^5.0.0-next.0 + svelte: ^5.0.0-next.96 || ^5.0.0 vite: ^5.0.0 - '@swc/helpers@0.5.11': - resolution: {integrity: sha512-YNlnKRWF2sVojTpIyzwou9XoTNbzbzONwRhOoniEioF1AtaitTvVZblaQRrAzChWQ1bLYyYSWzM18y4WwgzJ+A==} + '@swc/helpers@0.5.13': + resolution: {integrity: sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==} '@tsconfig/node10@1.0.11': resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} @@ -2102,35 +2062,60 @@ packages: '@tybys/wasm-util@0.8.3': resolution: {integrity: sha512-Z96T/L6dUFFxgFJ+pQtkPpne9q7i6kIPYCFnQBHSgSPV9idTsKfIhCss0h5iM9irweZCatkrdeP8yi5uM1eX6Q==} + '@tybys/wasm-util@0.9.0': + resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} + '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/feather-icons@4.29.4': resolution: {integrity: sha512-cvwI455PWx/gJ33XDTIZOdauRy+XCxZggkOT/tAQYZLdySPFATD4RnDC9mxOnCIEaK9kwPm3zZigkAsMkhXb5w==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@20.16.3': - resolution: {integrity: sha512-/wdGiWRkMOm53gAsSyFMXFZHbVg7C6CbkrzHNpaHoYfsUWPg7m6ZRKtvQjgvQ9i8WT540a3ydRlRQbxjY30XxQ==} + '@types/node@20.16.10': + resolution: {integrity: sha512-vQUKgWTjEIRFCvK6CyriPH3MZYiYlNy0fKiEYHWbcoWLEgs4opurGGKlebrTLqdSMIbXImH6XExNiIyNUv3WpA==} + + '@types/pg@8.11.10': + resolution: {integrity: sha512-LczQUW4dbOQzsH2RQ5qoeJ6qJPdrcM/DcMLoqWQkMLMsq83J5lAX3LXjdkWdpscFy67JSOWDnh7Ny/sPFykmkg==} '@types/pg@8.11.6': resolution: {integrity: sha512-/2WmmBXHLsfRqzfHW7BNZ8SbYzE8OSk7i3WjFYvfgRHj7S1xj+16Je5fUKv3lVdVzk/zn9TXOqf+avFCFIE0yQ==} - '@types/pg@8.11.8': - resolution: {integrity: sha512-IqpCf8/569txXN/HoP5i1LjXfKZWL76Yr2R77xgeIICUbAYHeoaEZFhYHo2uDftecLWrTJUq63JvQu8q3lnDyA==} - '@types/pug@2.0.10': resolution: {integrity: sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==} + '@types/qrcode@1.5.5': + resolution: {integrity: sha512-CdfBi/e3Qk+3Z/fXYShipBT13OJ2fDO2Q2w5CIP5anLTLIndQG9z6P1cnm+8zCWSpm5dnxMFd/uREtb0EXuQzg==} + '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} - '@types/validator@13.12.0': - resolution: {integrity: sha512-nH45Lk7oPIJ1RVOF6JgFI6Dy0QpHEzq4QecZhvguxYPDwT8c93prCMqAtiIttm39voZ+DDR+qkNnMpJmMBRqag==} + '@types/validator@13.12.1': + resolution: {integrity: sha512-w0URwf7BQb0rD/EuiG12KP0bailHKHP5YVviJG9zw3ykAokL0TuxU2TUqMB7EwZ59bDHYdeTIvjI5m0S7qHfOA==} + + '@typeschema/class-validator@0.2.0': + resolution: {integrity: sha512-zq0qeflVu1Z6D0ttkqAWZMtxJeNEQ70yo/025sV0jujiOOgQx38JXrky77nSWWPp2E1KIMtgkToQbkzkXyW5yg==} + peerDependencies: + class-validator: ^0.14.1 + peerDependenciesMeta: + class-validator: + optional: true + + '@typeschema/core@0.14.0': + resolution: {integrity: sha512-Ia6PtZHcL3KqsAWXjMi5xIyZ7XMH4aSnOQes8mfMLx+wGFGtGRNlwe6Y7cYvX+WfNK67OL0/HSe9t8QDygV0/w==} + peerDependencies: + '@types/json-schema': ^7.0.15 + peerDependenciesMeta: + '@types/json-schema': + optional: true '@typescript-eslint/eslint-plugin@7.18.0': resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} @@ -2193,15 +2178,11 @@ packages: '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@vercel/nft@0.27.2': - resolution: {integrity: sha512-7LeioS1yE5hwPpQfD3DdH04tuugKjo5KrJk3yK5kAI3Lh76iSsK/ezoFQfzuT08X3ZASQOd1y9ePjLNI9+TxTQ==} + '@vercel/nft@0.27.4': + resolution: {integrity: sha512-Rioz3LJkEKicKCi9BSyc1RXZ5R6GmXosFMeBSThh6msWSOiArKhb7c75MiWwZEgPL7x0/l3TAfH/l0cxKNuUFA==} engines: {node: '>=16'} hasBin: true - '@vercel/og@0.5.20': - resolution: {integrity: sha512-zi+ZXSx/peXA+1lq7s/5Vzmm/TTfTSf/5P1qNYnh42+7X+pZmahWoXt0i7SWiq3WagfsNUNA4hUDapDiHRoXqA==} - engines: {node: '>=16'} - '@vinejs/compiler@2.5.0': resolution: {integrity: sha512-hg4ekaB5Y2zh+IWzBiC/WCDWrIfpVnKu/ubUvelKlidc/VbulsexoFRw5kJGHZenPVI5YzNnDeTdYSALkTV7jQ==} engines: {node: '>=18.0.0'} @@ -2247,17 +2228,12 @@ packages: peerDependencies: acorn: '>=8.9.0' - acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + acorn-walk@8.3.3: + resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} engines: {node: '>=0.4.0'} - acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} - hasBin: true - - acorn@8.12.0: - resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} engines: {node: '>=0.4.0'} hasBin: true @@ -2318,8 +2294,8 @@ packages: aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - arktype@2.0.0-beta.0: - resolution: {integrity: sha512-fE3ssMiXjr/bLqFPzlDhRlXngdyHQreu7p7i8+dtcY1CA+f8WrVUcue6JxywhnqEJXPG4HOcIwQcC+q4VfeUMQ==} + arktype@2.0.0-rc.8: + resolution: {integrity: sha512-ByrqjptsavUCUL9ptts6BUL2LCNkVZyniOdaBw76dlBQ6gYIhYSeycuuj4gRFwcAafszOnAPD2fAqHK7bbo/Zw==} array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} @@ -2341,16 +2317,13 @@ packages: peerDependencies: postcss: ^8.1.0 - axobject-query@4.0.0: - resolution: {integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==} + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - base64-js@0.0.8: - resolution: {integrity: sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==} - engines: {node: '>= 0.4'} - binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -2358,8 +2331,8 @@ packages: bindings@1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - bits-ui@0.21.13: - resolution: {integrity: sha512-7nmOh6Ig7ND4DXZHv1FhNsY9yUGrad0+mf3tc4YN//3MgnJT1LnHtk4HZAKgmxCOe7txSX7/39LtYHbkrXokAQ==} + bits-ui@0.21.15: + resolution: {integrity: sha512-+m5WSpJnFdCcNdXSTIVC1WYBozipO03qRh03GFWgrdxoHiolCfwW71EYG4LPCWYPG6KcTZV0Cj6iHSiZ7cdKdg==} peerDependencies: svelte: ^4.0.0 || ^5.0.0-next.118 @@ -2377,36 +2350,24 @@ packages: brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.23.1: - resolution: {integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - browserslist@4.23.3: resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + buffer-crc32@1.0.0: + resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} + engines: {node: '>=8.0.0'} buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} - - bullmq@5.12.13: - resolution: {integrity: sha512-bFk0s1U9eQ8vKrhH9zYg/1H0+puSLVXuuq/pIW2jxgUmtLebRUBZr0cHJx35azTf2oPUJ+xXfpfHWaUtm4ZveA==} + bullmq@5.14.0: + resolution: {integrity: sha512-qxZHtRuGEp0oHM1aNokuZ4gA0xr6vcZQPe1OLuQoDTuhaEXB4faxApUoo85v/PHnzrniAAqNT9kqD+UBbmECDQ==} bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} @@ -2436,17 +2397,11 @@ packages: resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} engines: {node: '>=16'} - camelize@1.0.1: - resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} + caniuse-lite@1.0.30001655: + resolution: {integrity: sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==} - caniuse-lite@1.0.30001640: - resolution: {integrity: sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA==} - - caniuse-lite@1.0.30001649: - resolution: {integrity: sha512-fJegqZZ0ZX8HOWr6rcafGr72+xcgJKI9oWfDW5DrD7ExUtgZC7a7R7ZYmZqplh7XDocFdGeIFn7roAxhOeYrPQ==} - - chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} + chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} engines: {node: '>=4'} chalk@4.1.2: @@ -2460,10 +2415,17 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + chokidar@4.0.1: + resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} + engines: {node: '>= 14.16.0'} + chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} + class-validator@0.14.1: + resolution: {integrity: sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==} + class-variance-authority@0.7.0: resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==} @@ -2537,8 +2499,8 @@ packages: resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} - core-js@3.37.0: - resolution: {integrity: sha512-fu5vHevQ8ZG4og+LXug8ulUtVxjOcEYvifJr7L5Bfq9GOztVqsKd9/59hUk2ZSbCrS3BqUr3EpaYGIYzq7g3Ug==} + core-js@3.38.1: + resolution: {integrity: sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==} create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -2551,22 +2513,12 @@ packages: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} - css-background-parser@0.1.0: - resolution: {integrity: sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA==} - css-blank-pseudo@6.0.2: resolution: {integrity: sha512-J/6m+lsqpKPqWHOifAFtKFeGLOzw3jR92rxQcwRUfA/eTuZzKfKlxOmYDx2+tqOPQAueNvBiY8WhAeHu5qNmTg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 - css-box-shadow@1.0.0-3: - resolution: {integrity: sha512-9jaqR6e7Ohds+aWwmhe6wILJ99xYQbfmK9QQB9CcMjDbTxPZjwEmUQpU91OG05Xgm8BahT5fW+svbsQGjS/zPg==} - - css-color-keywords@1.0.0: - resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} - engines: {node: '>=4'} - css-has-pseudo@6.0.5: resolution: {integrity: sha512-ZTv6RlvJJZKp32jPYnAJVhowDCrRrHUTAxsYSuUPBEDJjzws6neMnzkRblxtgmv1RgcV5dhH2gn7E3wA9Wt6lw==} engines: {node: ^14 || ^16 || >=18} @@ -2579,9 +2531,6 @@ packages: peerDependencies: postcss: ^8.4 - css-to-react-native@3.2.0: - resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} - css-tree@2.3.1: resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} @@ -2594,8 +2543,8 @@ packages: engines: {node: '>=4'} hasBin: true - dayjs@1.11.11: - resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} @@ -2605,24 +2554,6 @@ packages: supports-color: optional: true - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.3.5: - resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.3.6: resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} engines: {node: '>=6.0'} @@ -2636,8 +2567,8 @@ packages: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} - deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} engines: {node: '>=6'} deep-is@0.1.4: @@ -2681,6 +2612,9 @@ packages: devalue@5.0.0: resolution: {integrity: sha512-gO+/OMXF7488D+u3ue+G7Y4AA3ZmUnB3eHJXmBTgNHvr4ZNzl36A0ZtG+XCRNYCkYx/bFmw4qtkoFLa+wSrwAA==} + devalue@5.1.1: + resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==} + didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} @@ -2819,14 +2753,8 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.4.818: - resolution: {integrity: sha512-eGvIk2V0dGImV9gWLq8fDfTTsCAeMDwZqEPMr+jMInxZdnp9Us8UpovYpRCf9NQ7VOFgrN2doNSgvISbsbNpxA==} - - electron-to-chromium@1.5.4: - resolution: {integrity: sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA==} - - emoji-regex@10.3.0: - resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + electron-to-chromium@1.5.13: + resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -2849,8 +2777,8 @@ packages: es6-promise@3.3.1: resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} - esbuild-register@3.5.0: - resolution: {integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==} + esbuild-register@3.6.0: + resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} peerDependencies: esbuild: '>=0.12 <1' @@ -2875,13 +2803,13 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.23.0: - resolution: {integrity: sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==} + esbuild@0.23.1: + resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} engines: {node: '>=18'} hasBin: true - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} escape-html@1.0.3: @@ -2903,12 +2831,12 @@ packages: peerDependencies: eslint: '>=7.0.0' - eslint-plugin-svelte@2.43.0: - resolution: {integrity: sha512-REkxQWvg2pp7QVLxQNa+dJ97xUqRe7Y2JJbSWkHSuszu0VcblZtXkPBPckkivk99y5CdLw4slqfPylL2d/X4jQ==} + eslint-plugin-svelte@2.36.0-next.13: + resolution: {integrity: sha512-N4bLGdFkGbbAQiKvX17kLfBgnZ+Em00khOY3AReppO7fkP9jaSxwjdgTCcWf+Q5/uZWor58g4GleRqHcb2Dk2w==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0-0 || ^9.0.0-0 - svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.191 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.73 peerDependenciesMeta: svelte: optional: true @@ -2921,8 +2849,8 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true @@ -2933,8 +2861,8 @@ packages: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} esrap@1.2.2: @@ -2966,8 +2894,8 @@ packages: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} - express-rate-limit@7.3.1: - resolution: {integrity: sha512-BbaryvkY4wEgDqLgD18/NSy2lDO2jTuT9Y8c1Mpx0X63Yz0sYd5zN6KPe7UvpuSVvV33T6RaE1o1IVZQjHMYgw==} + express-rate-limit@7.4.0: + resolution: {integrity: sha512-v1204w3cXu5gCDmAvgvzI6qjzZzoMWKnyVDk3ACgfswTQLYiGen+r8w0VnXnGMmzEN/g8fwIQ4JrFFd4ZP6ssg==} engines: {node: '>= 16'} peerDependencies: express: 4 || 5 || ^5.0.0-beta.1 @@ -2996,12 +2924,17 @@ packages: fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fdir@6.3.0: + resolution: {integrity: sha512-QOnuT+BOtivR77wYvCWHfGt9s4Pz1VIMbD463vegT5MLqNXy8rYFT/lPVEqf/bhYeT6qmqrNHhsX+rWwe3rOCQ==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + feather-icons@4.29.2: resolution: {integrity: sha512-0TaCFTnBTVCz6U+baY2UJNKne5ifGh7sMG4ZC2LoBWCZdIyPa+y6UiR4lEYGws1JOFWdee8KAsAIvu0VcXqiqA==} - fflate@0.7.4: - resolution: {integrity: sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==} - file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -3009,10 +2942,6 @@ packages: file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -3039,8 +2968,8 @@ packages: focus-trap@7.5.4: resolution: {integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==} - foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} formsnap@1.0.1: @@ -3103,8 +3032,8 @@ packages: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} - get-tsconfig@4.7.5: - resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} + get-tsconfig@4.8.0: + resolution: {integrity: sha512-Pgba6TExTZ0FJAn1qkJAjIeKoDJ3CsI2ChuLohJnZl/tTU8MVrq3b+2t5UOPfRa4RMsorClBjJALkJUMjG1PAw==} glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} @@ -3114,13 +3043,13 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@10.4.1: - resolution: {integrity: sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==} - engines: {node: '>=16 || 14 >=14.18'} + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported globals@13.24.0: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} @@ -3172,18 +3101,14 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - hex-rgb@4.3.0: - resolution: {integrity: sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw==} - engines: {node: '>=6'} - hono-rate-limiter@0.4.0: resolution: {integrity: sha512-7RWU2HZvxPtfBrvjXKDiQ3F6ZH8k49JhxVkHquUz5UZKjauj5PrP29MvISykThtfpy4mGG6kqxFBHW1ed9wwnA==} peerDependencies: hono: ^4.1.1 - hono@4.5.11: - resolution: {integrity: sha512-62FcjLPtjAFwISVBUshryl+vbHOjg8rE4uIK/dxyR8GpLztunZpwFmfEvmJCUI7xoGh/Sr3CGCDPCmYxVw7wUQ==} - engines: {node: '>=16.0.0'} + hono@4.6.3: + resolution: {integrity: sha512-0LeEuBNFeSHGqZ9sNVVgZjB1V5fmhkBSB0hZrpqStSMLOWgfLy0dHOvrjbJh0H2khsjet6rbHfWTHY0kpYThKQ==} + engines: {node: '>=16.9.0'} html-entities@2.5.2: resolution: {integrity: sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==} @@ -3207,16 +3132,16 @@ packages: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} - ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - imagetools-core@7.0.0: - resolution: {integrity: sha512-6fYbD7u4VIOt6fqKrOlbF77JXgUVyUmEJIPlfYVTuR/S2Ig9cX3gukGiLEU0aSetcfE7CYnhLTPtTEu4mLwhCw==} + imagetools-core@7.0.1: + resolution: {integrity: sha512-XDUx3Ac1VrZ4XF5eAJNYdHbFXRPNyebHFrwJsZ4WHb7X2MitOVW23cFphSDByT3MH5rdWdxKr4edSW2agChvDg==} engines: {node: '>=18.0.0'} - immutable@4.3.5: - resolution: {integrity: sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==} + immutable@4.3.7: + resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} @@ -3231,6 +3156,7 @@ packages: inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -3250,12 +3176,9 @@ packages: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - is-builtin-module@3.2.1: - resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} - engines: {node: '>=6'} - - is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + is-core-module@2.15.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} + engines: {node: '>= 0.4'} is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} @@ -3299,13 +3222,8 @@ packages: jackson-js@1.1.0: resolution: {integrity: sha512-EDKwt9U6dd/zNW/7p3VejSYUYgUkZ5c7v4gGAO7KhA1qLp6DXPpBjIx9ELI9LzQjpFtoL8g6CAQAhBuDmzkYMw==} - jackspeak@3.4.0: - resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} - engines: {node: '>=14'} - - jiti@1.21.3: - resolution: {integrity: sha512-uy2bNX5zQ+tESe+TiC7ilGRz8AtRGmnJH55NC5S0nSUjvvvM2hJHmefHErugGXN4pNv4Qx7vLsnNw9qJ9mtIsw==} - hasBin: true + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} jiti@1.21.6: resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} @@ -3324,8 +3242,8 @@ packages: json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-schema-to-ts@3.1.0: - resolution: {integrity: sha512-UeVN/ery4/JeXI8h4rM8yZPxsH+KqPi/84qFxHfTGHZnWnK9D0UU9ZGYO+6XAaJLqCWMiks+ARuFOKAiSxJCHA==} + json-schema-to-ts@3.1.1: + resolution: {integrity: sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==} engines: {node: '>=16'} json-schema-traverse@0.4.1: @@ -3353,24 +3271,27 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} - known-css-properties@0.34.0: - resolution: {integrity: sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==} + known-css-properties@0.30.0: + resolution: {integrity: sha512-VSWXYUnsPu9+WYKkfmJyLKtIvaRJi1kXUqVmBACORXZQxT5oZDsoZ2vQP+bQFDnWtpI/4eq3MLoRMjI2fnLzTQ==} levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + libphonenumber-js@1.11.8: + resolution: {integrity: sha512-0fv/YKpJBAgXKy0kaS3fnqoUVN8901vUYAKIGD/MWZaDfhJt1nZjPL3ZzdZBt/G8G8Hw2J1xOIrXWdNHFHPAvg==} + + libpq@1.8.13: + resolution: {integrity: sha512-t1wpnGVgwRIFSKoe4RFUllAFj953kNMcdXhGvFJwI0r6lJQqgSwTeiIciaCinjOmHk0HnFeWQSMC6Uw2591G4A==} + lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} - lilconfig@3.1.1: - resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} + lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} engines: {node: '>=14'} - linebreak@1.1.0: - resolution: {integrity: sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==} - lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -3410,9 +3331,8 @@ packages: loupe@2.3.7: resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - lru-cache@10.2.2: - resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} - engines: {node: 14 || >=16.14} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} lucia@3.2.0: resolution: {integrity: sha512-eXMxXwk6hqtjRTj4W/x3EnTUtAztLPm0p2N2TEBMDEbakDLXiYnDQ9z/qahjPdPdhPguQc+vwO0/88zIWxlpuw==} @@ -3422,12 +3342,12 @@ packages: peerDependencies: svelte: ^3 || ^4 || ^5.0.0-next.42 - luxon@3.4.4: - resolution: {integrity: sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==} + luxon@3.5.0: + resolution: {integrity: sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==} engines: {node: '>=12'} - magic-string@0.30.10: - resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + magic-string@0.30.11: + resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} @@ -3471,12 +3391,8 @@ packages: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} - micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - - micromatch@4.0.7: - resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} mime-db@1.52.0: @@ -3503,10 +3419,6 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} - engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -3539,8 +3451,8 @@ packages: engines: {node: '>=10'} hasBin: true - mlly@1.7.0: - resolution: {integrity: sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ==} + mlly@1.7.1: + resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} @@ -3569,6 +3481,9 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + nan@2.19.0: + resolution: {integrity: sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==} + nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -3605,13 +3520,10 @@ packages: resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} hasBin: true - node-gyp-build@4.8.1: - resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} + node-gyp-build@4.8.2: + resolution: {integrity: sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==} hasBin: true - node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - node-releases@2.0.18: resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} @@ -3673,8 +3585,8 @@ packages: open-props@1.7.6: resolution: {integrity: sha512-fE3E22x8lCf6gJrPO3L54NKrPaqQGxeKoXLz4JIXrhALD3Ua1kkE2kMw8HmlTKYF9BSLLMfoVfsT3UC1PJcaww==} - openapi3-ts@4.3.3: - resolution: {integrity: sha512-LKkzBGJcZ6wdvkKGMoSvpK+0cbN5Xc3XuYkJskO+vjEQWJgs1kgtyUk0pjf8KwPuysv323Er62F5P17XQl96Qg==} + openapi3-ts@4.4.0: + resolution: {integrity: sha512-9asTNB9IkKEzWMcHmVZE7Ts3kC9G7AFHfs8i7caD8HbI76gEjdkId4z/AkP83xdZsH7PLAnnbl47qZkXuxpArw==} optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} @@ -3710,16 +3622,13 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - pako@0.2.9: - resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} - parse-css-color@0.2.1: - resolution: {integrity: sha512-bwS/GGIFV3b6KS4uwpzCFj4w297Yl3uqnSgIPsoQkx7GMLROXfMnWvxfNkL0oh8HVhZA4hvJoEoEIqonfJ3BWg==} - parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -3766,25 +3675,34 @@ packages: pg-cloudflare@1.1.1: resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} - pg-connection-string@2.6.4: - resolution: {integrity: sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==} + pg-connection-string@2.7.0: + resolution: {integrity: sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==} pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} engines: {node: '>=4.0.0'} + pg-native@3.2.0: + resolution: {integrity: sha512-9q9I6RmT285DiRc0xkYb8e+bwOIIbnfVLddnzzXW35K1sZc74dR+symo2oeuzSW/sDQ8n24gWAvlGWK/GDJ3+Q==} + pg-numeric@1.0.2: resolution: {integrity: sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==} engines: {node: '>=4'} - pg-pool@3.6.2: - resolution: {integrity: sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==} + pg-pool@3.7.0: + resolution: {integrity: sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g==} peerDependencies: pg: '>=8.0' pg-protocol@1.6.1: resolution: {integrity: sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==} + pg-protocol@1.7.0: + resolution: {integrity: sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==} + + pg-types@1.13.0: + resolution: {integrity: sha512-lfKli0Gkl/+za/+b6lzENajczwZHc7D5kiUCZfgm914jipD2kIOIvEkAhZ8GrW3/TUoP9w8FHjwpPObBye5KQQ==} + pg-types@2.2.0: resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} engines: {node: '>=4'} @@ -3793,8 +3711,8 @@ packages: resolution: {integrity: sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng==} engines: {node: '>=10'} - pg@8.12.0: - resolution: {integrity: sha512-A+LHUSnwnxrnL/tZ+OLfqR1SxLN3c/pgDztZ47Rpbsd4jUytsTtwQo/TLPRzPJMp/1pbhYVhH9cuSZLAajNfjQ==} + pg@8.13.0: + resolution: {integrity: sha512-34wkUTh3SxTClfoHB3pQ7bIMvw9dpFU1audQQeZG837fmHfHpr14n/AELVDoOYVDW2h5RDWU78tFjkD+erSBsw==} engines: {node: '>= 8.0.0'} peerDependencies: pg-native: '>=3.0.1' @@ -3805,11 +3723,8 @@ packages: pgpass@1.0.5: resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} - picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - - picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + picocolors@1.1.0: + resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -3823,16 +3738,16 @@ packages: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} - pkg-types@1.1.0: - resolution: {integrity: sha512-/RpmvKdxKf8uILTtoOhAgf30wYbP2Qw+L9p3Rvshx1JZVX+XQNZQFjlbmGHEGIm4CkVPlSn+NXmIM8+9oWQaSA==} + pkg-types@1.2.0: + resolution: {integrity: sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==} - playwright-core@1.46.1: - resolution: {integrity: sha512-h9LqIQaAv+CYvWzsZ+h3RsrqCStkBHlgo6/TJlFst3cOTlLghBQlJwPOZKQJTKNaD3QIB7aAVQ+gfWbN3NXB7A==} + playwright-core@1.47.2: + resolution: {integrity: sha512-3JvMfF+9LJfe16l7AbSmU555PaTl2tPyQsVInqm3id16pdDfvZ8TTZ/pyzmkbDrZTQefyzU7AIHlZqQnxpqHVQ==} engines: {node: '>=18'} hasBin: true - playwright@1.46.1: - resolution: {integrity: sha512-oPcr1yqoXLCkgKtD5eNUPLiN40rYEM39odNpIb6VE6S7/15gJmA1NzVv6zJYusV0e7tzvkU/utBFNa/Kpxmwng==} + playwright@1.47.2: + resolution: {integrity: sha512-nx1cLMmQWqmA3UsnjaaokyoUpdVaaDhJhMoxX2qj3McpjnsqFHs516QAKYhqHAgOP+oCFTEOCOAaD1RgD/RQfA==} engines: {node: '>=18'} hasBin: true @@ -3998,8 +3913,8 @@ packages: peerDependencies: postcss: ^8.4 - postcss-nested@6.0.1: - resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.2.14 @@ -4068,21 +3983,21 @@ packages: peerDependencies: postcss: ^8.4 - postcss-selector-parser@6.0.16: - resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} - engines: {node: '>=4'} - - postcss-selector-parser@6.1.0: - resolution: {integrity: sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==} + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.4.44: - resolution: {integrity: sha512-Aweb9unOEpQ3ezu4Q00DPvvM2ZTUitJdNKeP/+uQgr1IBIqu574IaZoURId7BKtWMREwzKa9OgzPzezWGPWFQw==} + postcss@8.4.47: + resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} engines: {node: ^10 || ^12 || >=14} + postgres-array@1.0.3: + resolution: {integrity: sha512-5wClXrAP0+78mcsNX3/ithQ5exKvCyK5lr5NEEEeGwwM6NJdQgzIJBVxLvRW+huFpX92F2QnZ5CcokH0VhK2qQ==} + engines: {node: '>=0.10.0'} + postgres-array@2.0.0: resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} engines: {node: '>=4'} @@ -4126,8 +4041,8 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier-plugin-svelte@3.2.6: - resolution: {integrity: sha512-Y1XWLw7vXUQQZmgv1JAEiLcErqUniAF2wO7QJsw8BVMvpLET2dI5WpEIEJx1r11iHVdSMzQxivyfrH9On9t2IQ==} + prettier-plugin-svelte@3.2.7: + resolution: {integrity: sha512-/Dswx/ea0lV34If1eDcG3nulQ63YNr5KPDfMsjbdtpSWOxKKJ7nAc2qlVuYwEvCr4raIuredNoR7K4JCkmTGaQ==} peerDependencies: prettier: ^3.0.0 svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 @@ -4198,6 +4113,10 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + readdirp@4.0.1: + resolution: {integrity: sha512-GkMg9uOTpIWWKbSsgwb5fA4EavTR+SG/PMPoAY8hkhHfEEY0/vqljY+XHqtDf2cr2IJtoNRDbrrEpZUiZCkYRw==} + engines: {node: '>= 14.16.0'} + redis-errors@1.2.0: resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} engines: {node: '>=4'} @@ -4243,19 +4162,16 @@ packages: rimraf@2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rollup@4.18.1: - resolution: {integrity: sha512-Elx2UT8lzxxOXMpy5HWQGZqkrQOtrVDDa/bm9l10+U4rQnVzbL/LgZ4NOM1MPIDyHk69W4InuYDF5dzRh4Kw1A==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - - rollup@4.21.0: - resolution: {integrity: sha512-vo+S/lfA2lMS7rZ2Qoubi6I5hwZwzXeUIctILZLbHI+laNtvhhOIon2S1JksA5UEDQ7l3vberd0fxK44lTYjbQ==} + rollup@4.21.2: + resolution: {integrity: sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -4275,22 +4191,11 @@ packages: sander@0.5.1: resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} - sass@1.77.8: - resolution: {integrity: sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ==} + sass@1.79.1: + resolution: {integrity: sha512-+mA7svoNKeL0DiJqZGeR/ZGUu8he4I8o3jyUcOFyo4eBJrwNgIMmAEwCMo/N2Y3wdjOBcRzoNxZIOtrtMX8EXg==} engines: {node: '>=14.0.0'} hasBin: true - satori-html@0.3.2: - resolution: {integrity: sha512-wjTh14iqADFKDK80e51/98MplTGfxz2RmIzh0GqShlf4a67+BooLywF17TvJPD6phO0Hxm7Mf1N5LtRYvdkYRA==} - - satori@0.10.14: - resolution: {integrity: sha512-abovcqmwl97WKioxpkfuMeZmndB1TuDFY/R+FymrZyiGP+pMYomvgSzVPnbNMWHHESOPosVHGL352oFbdAnJcA==} - engines: {node: '>=16'} - - satori@0.10.9: - resolution: {integrity: sha512-XU9EELUEZuioT4acLIpCXxHcFzrsC8muvg0MY28d+TlqwxbkTzBmWbw+3+hnCzXT7YZ0Qm8k3eXktDaEu+qmEw==} - engines: {node: '>=16'} - schema-dts@1.1.2: resolution: {integrity: sha512-MpNwH0dZJHinVxk9bT8XUdjKTxMYrA5bLtrrGmFA6PTLwlOKnhi67XoRd6/ty+Djt6ZC0slR57qFhZDNMI6DhQ==} peerDependencies: @@ -4300,11 +4205,6 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.6.2: - resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} - engines: {node: '>=10'} - hasBin: true - semver@7.6.3: resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} @@ -4321,8 +4221,8 @@ packages: set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - set-cookie-parser@2.6.0: - resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} + set-cookie-parser@2.7.0: + resolution: {integrity: sha512-lXLOiqpkUumhRdFF3k1osNXCy9akgx/dyPZ5p8qAg9seJzXr5ZrlqZuWIMuY6ejOsVLE6flJ5/h3lsn57fQ/PQ==} set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} @@ -4331,9 +4231,9 @@ packages: setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - sharp@0.33.4: - resolution: {integrity: sha512-7i/dt5kGl7qR4gwPRD2biwD2/SvBn3O04J77XKFgL2OnZtQw+AG9wnuS/csmu80nPRHLYE9E41fyEiG8nhH6/Q==} - engines: {libvips: '>=8.15.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0} + sharp@0.33.5: + resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} @@ -4368,12 +4268,12 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - sorcery@0.11.0: - resolution: {integrity: sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==} + sorcery@0.11.1: + resolution: {integrity: sha512-o7npfeJE6wi6J9l0/5LKshFzZ2rMatRiCDwYeDQaOzqdzRJwALhX7mk/A/ecg6wjMu7wdZbmXfD2S/vpOg0bdQ==} hasBin: true - source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} source-map-support@0.5.21: @@ -4408,9 +4308,6 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string.prototype.codepointat@0.2.1: - resolution: {integrity: sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==} - string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -4482,12 +4379,6 @@ packages: peerDependencies: svelte: ^4.0.0 - svelte-hmr@0.16.0: - resolution: {integrity: sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA==} - engines: {node: ^12.20 || ^14.13.1 || >= 16} - peerDependencies: - svelte: ^3.19.0 || ^4.0.0 - svelte-keyed@2.0.0: resolution: {integrity: sha512-7TeEn+QbJC2OJrHiuM0T8vMBkms3DNpTE+Ir+NtnVBnBMA78aL4f1ft9t0Hn/pBbD/TnIXi4YfjFRAgtN+DZ5g==} peerDependencies: @@ -4543,8 +4434,8 @@ packages: typescript: optional: true - svelte-preprocess@6.0.2: - resolution: {integrity: sha512-OvDTLfaOkkhjprbDKO0SOCkjNYuHy16dbD4SpqbIi6QiabOMHxRT4km5/dzbFFkmW1L0E2INF3MFltG2pgOyKQ==} + svelte-preprocess@6.0.3: + resolution: {integrity: sha512-PLG2k05qHdhmRG7zR/dyo5qKvakhm8IJ+hD2eFRQmMLHp7X3eJnjeupUtvuRpbNiF31RjVw45W+abDwHEmP5OA==} engines: {node: '>= 18.0.0'} peerDependencies: '@babel/core': ^7.10.2 @@ -4585,8 +4476,8 @@ packages: peerDependencies: svelte: ^4.0.0 - svelte-sequential-preprocessor@2.0.1: - resolution: {integrity: sha512-N5JqlBni6BzElxmuFrOPxOJnjsxh1cFDACLEVKs8OHBcx8ZNRO1p5SxuQex1m3qbLzAC8G99EHeWcxGkjyKjLQ==} + svelte-sequential-preprocessor@2.0.2: + resolution: {integrity: sha512-DIFm0kSNscVxtBmKkBiygAHB5otoqN1aVmJ3t57jZhJfCB7Np/lUSoTtSrvPFjmlBbMeOsb1VQ06cut1+rBYOg==} engines: {node: '>=16'} svelte-subscribe@2.0.1: @@ -4599,8 +4490,8 @@ packages: peerDependencies: svelte: ^3.2.1 || ^4.0.0-next.1 || ^5.0.0-next.94 - svelte@4.2.18: - resolution: {integrity: sha512-d0FdzYIiAePqRJEb90WlJDkjUEx42xhivxN8muUBmfZnP+tzUgz12DJ2hRJi8sIHCME7jeK1PTMgKPSfTd8JrA==} + svelte@4.2.19: + resolution: {integrity: sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==} engines: {node: '>=16'} svelte@5.0.0-next.175: @@ -4613,13 +4504,8 @@ packages: '@sveltejs/kit': 1.x || 2.x svelte: 3.x || 4.x || >=5.0.0-next.51 - sveltekit-rate-limiter@0.5.2: - resolution: {integrity: sha512-7CELKmTffNjj0i/RUxT9SKYFA9IO/tQabjgT39clOlkKvlcGozNy8nqoIx+24amWfqEqC/WXYMEIek04PiFdyA==} - peerDependencies: - '@sveltejs/kit': 1.x || 2.x - - sveltekit-superforms@2.17.0: - resolution: {integrity: sha512-QrX8pkcmE0XoeVU42zMhsah4FoDrgtPc/4cZEr38rDlgU+DE0xNc5J0E7z1456sUJNbFjaB0+HZwwAkX0vYqaA==} + sveltekit-superforms@2.19.0: + resolution: {integrity: sha512-WJmdYf8WpuDkl6zxdRP72R+wDefx1OhIQYKdsIQqNkFntNq0/BUrkMdUr1i7d/FbX0gS1A9GRflCx3WiYQlAXg==} peerDependencies: '@sveltejs/kit': 1.x || 2.x svelte: 3.x || 4.x || >=5.0.0-next.51 @@ -4641,8 +4527,8 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders' - tailwindcss@3.4.10: - resolution: {integrity: sha512-KWZkVPm7yJRhdu4SRSl9d4AK2wM3a50UsvgHZO7xY77NQr2V+fIrEuoDGQcbvswWvFGbS2f6e+jC/6WJm1Dl0w==} + tailwindcss@3.4.13: + resolution: {integrity: sha512-KqjHOJKogOUt5Bs752ykCeiwvi0fKVkr5oqsFNt/8px/tA8scFPIlkygsf6jXrfCqGHz7VflA6+yytWuM+XhFw==} engines: {node: '>=14.0.0'} hasBin: true @@ -4666,11 +4552,8 @@ packages: tiny-glob@0.2.9: resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} - tiny-inflate@1.0.3: - resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} - - tinybench@2.8.0: - resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} tinypool@0.8.4: resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} @@ -4734,14 +4617,11 @@ packages: tslib@2.4.0: resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} - tslib@2.6.3: - resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} - tslib@2.7.0: resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} - tsx@4.19.0: - resolution: {integrity: sha512-bV30kM7bsLZKZIOCHeMNVMJ32/LuJzLVajkQI/qf92J2Qr08ueLQvW00PUZGiuLPP760UINwupgUj8qrSCPUKg==} + tsx@4.19.1: + resolution: {integrity: sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==} engines: {node: '>=18.0.0'} hasBin: true @@ -4753,8 +4633,8 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} engines: {node: '>=4'} type-fest@0.20.2: @@ -4769,31 +4649,25 @@ packages: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} - typescript@5.5.4: - resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + typescript@5.6.2: + resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} engines: {node: '>=14.17'} hasBin: true - ufo@1.5.3: - resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} - uglify-js@3.19.1: - resolution: {integrity: sha512-y/2wiW+ceTYR2TSSptAhfnEtpLaQ4Ups5zrjB2d3kuVxHj16j/QJwPl5PvuGy9uARb39J0+iKxcRPvtpsx4A4A==} + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} engines: {node: '>=0.8.0'} hasBin: true - ultrahtml@1.5.3: - resolution: {integrity: sha512-GykOvZwgDWZlTQMtp5jrD4BVL+gNn2NVlVafjcFUJ7taY20tqYdwdoWBFy6GBJsNTZe1GkGPkSl5knQAjtgceg==} - - undici-types@6.19.6: - resolution: {integrity: sha512-e/vggGopEfTKSvj4ihnOLTsqhrKRN3LeO6qSN/GxohhuRv8qH9bNQ4B8W7e/vFL+0XTnmHPB4/kegunZGA4Org==} + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} unfetch@4.2.0: resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} - unicode-trie@2.0.0: - resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} - unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} @@ -4835,8 +4709,8 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - vite-imagetools@7.0.2: - resolution: {integrity: sha512-sA98fIhfIqPdt5qKAMMrQtBzdqK44dlmv4jEUlJMmn4GzR8CdXjKGiyU/GKUFxjReuPi0fK/dd0JhiZixZt06A==} + vite-imagetools@7.0.4: + resolution: {integrity: sha512-C9C7b2p/8/TCN2g26tE9haoer2i8K4x0v2RXUiHsIjiz221vQuKItCQ+VyiVCsUMPXfJC/tlZsmCZVBz5jh7uA==} engines: {node: '>=18.0.0'} vite-node@1.6.0: @@ -4844,8 +4718,8 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - vite@5.4.3: - resolution: {integrity: sha512-IH+nl64eq9lJjFqU+/yrRnrHPVTlgy42/+IzbOdaFDVlyLgI/wDlf+FCobXLX1cT0X5+7LMyH1mIy2xJdLfo8Q==} + vite@5.4.8: + resolution: {integrity: sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -4875,8 +4749,8 @@ packages: terser: optional: true - vitefu@0.2.5: - resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} + vitefu@1.0.2: + resolution: {integrity: sha512-0/iAvbXyM3RiPPJ4lyD4w6Mjgtf4ejTK6TPvTNG3H32PLwuT0N/ZjJLiXug7ETE/LWtTeHw9WRv7uX/tIKYyKg==} peerDependencies: vite: ^3.0.0 || ^4.0.0 || ^5.0.0 peerDependenciesMeta: @@ -4922,8 +4796,8 @@ packages: engines: {node: '>= 8'} hasBin: true - why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} hasBin: true @@ -4966,18 +4840,8 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - yaml@2.4.2: - resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} - engines: {node: '>= 14'} - hasBin: true - - yaml@2.4.3: - resolution: {integrity: sha512-sntgmxj8o7DE7g/Qi60cqpLBA3HG3STcDA0kO+WfB05jEKhZMbY7umNm2rBpQvsmZ16/lPXCJGW2672dgOUkrg==} - engines: {node: '>= 14'} - hasBin: true - - yaml@2.5.0: - resolution: {integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==} + yaml@2.5.1: + resolution: {integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==} engines: {node: '>= 14'} hasBin: true @@ -4997,21 +4861,18 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} engines: {node: '>=12.20'} - yoga-wasm-web@0.3.3: - resolution: {integrity: sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==} - yup@1.4.0: resolution: {integrity: sha512-wPbgkJRCqIf+OHyiTBQoJiP5PFuAXaWiJK6AmYkzQAh5/c2K9hzSApBZG5wV9KoKSePF7sAxmNSvh/13YHkFDg==} zimmerframe@1.1.2: resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} - zod-to-json-schema@3.23.2: - resolution: {integrity: sha512-uSt90Gzc/tUfyNqxnjlfBs8W6WSGpNBv0rVsNxP/BVSMHMKGdthPYff4xtCHYloJGM0CFxFsb3NbC0eqPhfImw==} + zod-to-json-schema@3.23.3: + resolution: {integrity: sha512-TYWChTxKQbRJp5ST22o/Irt9KC5nj7CdBKYB/AosCRdj/wxEMvv4NNaj9XVUHDOIp53ZxArGhnw5HMZziPFjog==} peerDependencies: zod: ^3.23.3 @@ -5027,20 +4888,20 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - '@ark/schema@0.2.0': + '@ark/schema@0.10.0': dependencies: - '@ark/util': 0.1.0 + '@ark/util': 0.10.0 optional: true - '@ark/util@0.1.0': + '@ark/util@0.10.0': optional: true '@asteasolutions/zod-to-openapi@7.1.1(zod@3.23.8)': dependencies: - openapi3-ts: 4.3.3 + openapi3-ts: 4.4.0 zod: 3.23.8 - '@babel/runtime@7.24.8': + '@babel/runtime@7.25.6': dependencies: regenerator-runtime: 0.14.1 optional: true @@ -5096,7 +4957,7 @@ snapshots: '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 - '@csstools/css-color-parser@2.0.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1)': + '@csstools/css-color-parser@2.0.5(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1)': dependencies: '@csstools/color-helpers': 4.2.1 '@csstools/css-calc': 1.2.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) @@ -5114,213 +4975,213 @@ snapshots: '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 - '@csstools/postcss-cascade-layers@4.0.6(postcss@8.4.44)': + '@csstools/postcss-cascade-layers@4.0.6(postcss@8.4.47)': dependencies: - '@csstools/selector-specificity': 3.1.1(postcss-selector-parser@6.1.0) - postcss: 8.4.44 - postcss-selector-parser: 6.1.0 + '@csstools/selector-specificity': 3.1.1(postcss-selector-parser@6.1.2) + postcss: 8.4.47 + postcss-selector-parser: 6.1.2 - '@csstools/postcss-color-function@3.0.19(postcss@8.4.44)': + '@csstools/postcss-color-function@3.0.19(postcss@8.4.47)': dependencies: - '@csstools/css-color-parser': 2.0.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) + '@csstools/css-color-parser': 2.0.5(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 - '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.44) - '@csstools/utilities': 1.0.0(postcss@8.4.44) - postcss: 8.4.44 + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.47) + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 - '@csstools/postcss-color-mix-function@2.0.19(postcss@8.4.44)': + '@csstools/postcss-color-mix-function@2.0.19(postcss@8.4.47)': dependencies: - '@csstools/css-color-parser': 2.0.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) + '@csstools/css-color-parser': 2.0.5(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 - '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.44) - '@csstools/utilities': 1.0.0(postcss@8.4.44) - postcss: 8.4.44 + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.47) + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 - '@csstools/postcss-content-alt-text@1.0.0(postcss@8.4.44)': + '@csstools/postcss-content-alt-text@1.0.0(postcss@8.4.47)': dependencies: '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 - '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.44) - '@csstools/utilities': 1.0.0(postcss@8.4.44) - postcss: 8.4.44 + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.47) + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 - '@csstools/postcss-exponential-functions@1.0.9(postcss@8.4.44)': + '@csstools/postcss-exponential-functions@1.0.9(postcss@8.4.47)': dependencies: '@csstools/css-calc': 1.2.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 - postcss: 8.4.44 + postcss: 8.4.47 - '@csstools/postcss-font-format-keywords@3.0.2(postcss@8.4.44)': + '@csstools/postcss-font-format-keywords@3.0.2(postcss@8.4.47)': dependencies: - '@csstools/utilities': 1.0.0(postcss@8.4.44) - postcss: 8.4.44 + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 postcss-value-parser: 4.2.0 - '@csstools/postcss-gamut-mapping@1.0.11(postcss@8.4.44)': + '@csstools/postcss-gamut-mapping@1.0.11(postcss@8.4.47)': dependencies: - '@csstools/css-color-parser': 2.0.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) + '@csstools/css-color-parser': 2.0.5(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 - postcss: 8.4.44 + postcss: 8.4.47 - '@csstools/postcss-gradients-interpolation-method@4.0.20(postcss@8.4.44)': + '@csstools/postcss-gradients-interpolation-method@4.0.20(postcss@8.4.47)': dependencies: - '@csstools/css-color-parser': 2.0.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) + '@csstools/css-color-parser': 2.0.5(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 - '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.44) - '@csstools/utilities': 1.0.0(postcss@8.4.44) - postcss: 8.4.44 + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.47) + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 - '@csstools/postcss-hwb-function@3.0.18(postcss@8.4.44)': + '@csstools/postcss-hwb-function@3.0.18(postcss@8.4.47)': dependencies: - '@csstools/css-color-parser': 2.0.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) + '@csstools/css-color-parser': 2.0.5(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 - '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.44) - '@csstools/utilities': 1.0.0(postcss@8.4.44) - postcss: 8.4.44 + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.47) + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 - '@csstools/postcss-ic-unit@3.0.7(postcss@8.4.44)': + '@csstools/postcss-ic-unit@3.0.7(postcss@8.4.47)': dependencies: - '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.44) - '@csstools/utilities': 1.0.0(postcss@8.4.44) - postcss: 8.4.44 + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.47) + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 postcss-value-parser: 4.2.0 - '@csstools/postcss-initial@1.0.1(postcss@8.4.44)': + '@csstools/postcss-initial@1.0.1(postcss@8.4.47)': dependencies: - postcss: 8.4.44 + postcss: 8.4.47 - '@csstools/postcss-is-pseudo-class@4.0.8(postcss@8.4.44)': + '@csstools/postcss-is-pseudo-class@4.0.8(postcss@8.4.47)': dependencies: - '@csstools/selector-specificity': 3.1.1(postcss-selector-parser@6.1.0) - postcss: 8.4.44 - postcss-selector-parser: 6.1.0 + '@csstools/selector-specificity': 3.1.1(postcss-selector-parser@6.1.2) + postcss: 8.4.47 + postcss-selector-parser: 6.1.2 - '@csstools/postcss-light-dark-function@1.0.8(postcss@8.4.44)': + '@csstools/postcss-light-dark-function@1.0.8(postcss@8.4.47)': dependencies: '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 - '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.44) - '@csstools/utilities': 1.0.0(postcss@8.4.44) - postcss: 8.4.44 + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.47) + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 - '@csstools/postcss-logical-float-and-clear@2.0.1(postcss@8.4.44)': + '@csstools/postcss-logical-float-and-clear@2.0.1(postcss@8.4.47)': dependencies: - postcss: 8.4.44 + postcss: 8.4.47 - '@csstools/postcss-logical-overflow@1.0.1(postcss@8.4.44)': + '@csstools/postcss-logical-overflow@1.0.1(postcss@8.4.47)': dependencies: - postcss: 8.4.44 + postcss: 8.4.47 - '@csstools/postcss-logical-overscroll-behavior@1.0.1(postcss@8.4.44)': + '@csstools/postcss-logical-overscroll-behavior@1.0.1(postcss@8.4.47)': dependencies: - postcss: 8.4.44 + postcss: 8.4.47 - '@csstools/postcss-logical-resize@2.0.1(postcss@8.4.44)': + '@csstools/postcss-logical-resize@2.0.1(postcss@8.4.47)': dependencies: - postcss: 8.4.44 + postcss: 8.4.47 postcss-value-parser: 4.2.0 - '@csstools/postcss-logical-viewport-units@2.0.11(postcss@8.4.44)': + '@csstools/postcss-logical-viewport-units@2.0.11(postcss@8.4.47)': dependencies: '@csstools/css-tokenizer': 2.4.1 - '@csstools/utilities': 1.0.0(postcss@8.4.44) - postcss: 8.4.44 + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 - '@csstools/postcss-media-minmax@1.1.8(postcss@8.4.44)': + '@csstools/postcss-media-minmax@1.1.8(postcss@8.4.47)': dependencies: '@csstools/css-calc': 1.2.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 '@csstools/media-query-list-parser': 2.1.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) - postcss: 8.4.44 + postcss: 8.4.47 - '@csstools/postcss-media-queries-aspect-ratio-number-values@2.0.11(postcss@8.4.44)': + '@csstools/postcss-media-queries-aspect-ratio-number-values@2.0.11(postcss@8.4.47)': dependencies: '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 '@csstools/media-query-list-parser': 2.1.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) - postcss: 8.4.44 + postcss: 8.4.47 - '@csstools/postcss-nested-calc@3.0.2(postcss@8.4.44)': + '@csstools/postcss-nested-calc@3.0.2(postcss@8.4.47)': dependencies: - '@csstools/utilities': 1.0.0(postcss@8.4.44) - postcss: 8.4.44 + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 postcss-value-parser: 4.2.0 - '@csstools/postcss-normalize-display-values@3.0.2(postcss@8.4.44)': + '@csstools/postcss-normalize-display-values@3.0.2(postcss@8.4.47)': dependencies: - postcss: 8.4.44 + postcss: 8.4.47 postcss-value-parser: 4.2.0 - '@csstools/postcss-oklab-function@3.0.19(postcss@8.4.44)': + '@csstools/postcss-oklab-function@3.0.19(postcss@8.4.47)': dependencies: - '@csstools/css-color-parser': 2.0.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) + '@csstools/css-color-parser': 2.0.5(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 - '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.44) - '@csstools/utilities': 1.0.0(postcss@8.4.44) - postcss: 8.4.44 + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.47) + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 - '@csstools/postcss-progressive-custom-properties@3.3.0(postcss@8.4.44)': + '@csstools/postcss-progressive-custom-properties@3.3.0(postcss@8.4.47)': dependencies: - postcss: 8.4.44 + postcss: 8.4.47 postcss-value-parser: 4.2.0 - '@csstools/postcss-relative-color-syntax@2.0.19(postcss@8.4.44)': + '@csstools/postcss-relative-color-syntax@2.0.19(postcss@8.4.47)': dependencies: - '@csstools/css-color-parser': 2.0.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) + '@csstools/css-color-parser': 2.0.5(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 - '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.44) - '@csstools/utilities': 1.0.0(postcss@8.4.44) - postcss: 8.4.44 + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.47) + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 - '@csstools/postcss-scope-pseudo-class@3.0.1(postcss@8.4.44)': + '@csstools/postcss-scope-pseudo-class@3.0.1(postcss@8.4.47)': dependencies: - postcss: 8.4.44 - postcss-selector-parser: 6.0.16 + postcss: 8.4.47 + postcss-selector-parser: 6.1.2 - '@csstools/postcss-stepped-value-functions@3.0.10(postcss@8.4.44)': + '@csstools/postcss-stepped-value-functions@3.0.10(postcss@8.4.47)': dependencies: '@csstools/css-calc': 1.2.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 - postcss: 8.4.44 + postcss: 8.4.47 - '@csstools/postcss-text-decoration-shorthand@3.0.7(postcss@8.4.44)': + '@csstools/postcss-text-decoration-shorthand@3.0.7(postcss@8.4.47)': dependencies: '@csstools/color-helpers': 4.2.1 - postcss: 8.4.44 + postcss: 8.4.47 postcss-value-parser: 4.2.0 - '@csstools/postcss-trigonometric-functions@3.0.10(postcss@8.4.44)': + '@csstools/postcss-trigonometric-functions@3.0.10(postcss@8.4.47)': dependencies: '@csstools/css-calc': 1.2.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 - postcss: 8.4.44 + postcss: 8.4.47 - '@csstools/postcss-unset-value@3.0.1(postcss@8.4.44)': + '@csstools/postcss-unset-value@3.0.1(postcss@8.4.47)': dependencies: - postcss: 8.4.44 + postcss: 8.4.47 - '@csstools/selector-resolve-nested@1.1.0(postcss-selector-parser@6.1.0)': + '@csstools/selector-resolve-nested@1.1.0(postcss-selector-parser@6.1.2)': dependencies: - postcss-selector-parser: 6.1.0 + postcss-selector-parser: 6.1.2 - '@csstools/selector-specificity@3.1.1(postcss-selector-parser@6.1.0)': + '@csstools/selector-specificity@3.1.1(postcss-selector-parser@6.1.2)': dependencies: - postcss-selector-parser: 6.1.0 + postcss-selector-parser: 6.1.2 - '@csstools/utilities@1.0.0(postcss@8.4.44)': + '@csstools/utilities@1.0.0(postcss@8.4.47)': dependencies: - postcss: 8.4.44 + postcss: 8.4.47 '@drizzle-team/brocli@0.8.2': {} @@ -5329,6 +5190,12 @@ snapshots: tslib: 2.7.0 optional: true + '@emnapi/core@1.2.0': + dependencies: + '@emnapi/wasi-threads': 1.0.1 + tslib: 2.7.0 + optional: true + '@emnapi/runtime@0.45.0': dependencies: tslib: 2.7.0 @@ -5339,6 +5206,11 @@ snapshots: tslib: 2.7.0 optional: true + '@emnapi/wasi-threads@1.0.1': + dependencies: + tslib: 2.7.0 + optional: true + '@esbuild-kit/core-utils@3.3.2': dependencies: esbuild: 0.18.20 @@ -5347,7 +5219,7 @@ snapshots: '@esbuild-kit/esm-loader@2.6.5': dependencies: '@esbuild-kit/core-utils': 3.3.2 - get-tsconfig: 4.7.5 + get-tsconfig: 4.8.0 '@esbuild/aix-ppc64@0.19.12': optional: true @@ -5355,7 +5227,7 @@ snapshots: '@esbuild/aix-ppc64@0.21.5': optional: true - '@esbuild/aix-ppc64@0.23.0': + '@esbuild/aix-ppc64@0.23.1': optional: true '@esbuild/android-arm64@0.18.20': @@ -5367,7 +5239,7 @@ snapshots: '@esbuild/android-arm64@0.21.5': optional: true - '@esbuild/android-arm64@0.23.0': + '@esbuild/android-arm64@0.23.1': optional: true '@esbuild/android-arm@0.18.20': @@ -5379,7 +5251,7 @@ snapshots: '@esbuild/android-arm@0.21.5': optional: true - '@esbuild/android-arm@0.23.0': + '@esbuild/android-arm@0.23.1': optional: true '@esbuild/android-x64@0.18.20': @@ -5391,7 +5263,7 @@ snapshots: '@esbuild/android-x64@0.21.5': optional: true - '@esbuild/android-x64@0.23.0': + '@esbuild/android-x64@0.23.1': optional: true '@esbuild/darwin-arm64@0.18.20': @@ -5403,7 +5275,7 @@ snapshots: '@esbuild/darwin-arm64@0.21.5': optional: true - '@esbuild/darwin-arm64@0.23.0': + '@esbuild/darwin-arm64@0.23.1': optional: true '@esbuild/darwin-x64@0.18.20': @@ -5415,7 +5287,7 @@ snapshots: '@esbuild/darwin-x64@0.21.5': optional: true - '@esbuild/darwin-x64@0.23.0': + '@esbuild/darwin-x64@0.23.1': optional: true '@esbuild/freebsd-arm64@0.18.20': @@ -5427,7 +5299,7 @@ snapshots: '@esbuild/freebsd-arm64@0.21.5': optional: true - '@esbuild/freebsd-arm64@0.23.0': + '@esbuild/freebsd-arm64@0.23.1': optional: true '@esbuild/freebsd-x64@0.18.20': @@ -5439,7 +5311,7 @@ snapshots: '@esbuild/freebsd-x64@0.21.5': optional: true - '@esbuild/freebsd-x64@0.23.0': + '@esbuild/freebsd-x64@0.23.1': optional: true '@esbuild/linux-arm64@0.18.20': @@ -5451,7 +5323,7 @@ snapshots: '@esbuild/linux-arm64@0.21.5': optional: true - '@esbuild/linux-arm64@0.23.0': + '@esbuild/linux-arm64@0.23.1': optional: true '@esbuild/linux-arm@0.18.20': @@ -5463,7 +5335,7 @@ snapshots: '@esbuild/linux-arm@0.21.5': optional: true - '@esbuild/linux-arm@0.23.0': + '@esbuild/linux-arm@0.23.1': optional: true '@esbuild/linux-ia32@0.18.20': @@ -5475,7 +5347,7 @@ snapshots: '@esbuild/linux-ia32@0.21.5': optional: true - '@esbuild/linux-ia32@0.23.0': + '@esbuild/linux-ia32@0.23.1': optional: true '@esbuild/linux-loong64@0.18.20': @@ -5487,7 +5359,7 @@ snapshots: '@esbuild/linux-loong64@0.21.5': optional: true - '@esbuild/linux-loong64@0.23.0': + '@esbuild/linux-loong64@0.23.1': optional: true '@esbuild/linux-mips64el@0.18.20': @@ -5499,7 +5371,7 @@ snapshots: '@esbuild/linux-mips64el@0.21.5': optional: true - '@esbuild/linux-mips64el@0.23.0': + '@esbuild/linux-mips64el@0.23.1': optional: true '@esbuild/linux-ppc64@0.18.20': @@ -5511,7 +5383,7 @@ snapshots: '@esbuild/linux-ppc64@0.21.5': optional: true - '@esbuild/linux-ppc64@0.23.0': + '@esbuild/linux-ppc64@0.23.1': optional: true '@esbuild/linux-riscv64@0.18.20': @@ -5523,7 +5395,7 @@ snapshots: '@esbuild/linux-riscv64@0.21.5': optional: true - '@esbuild/linux-riscv64@0.23.0': + '@esbuild/linux-riscv64@0.23.1': optional: true '@esbuild/linux-s390x@0.18.20': @@ -5535,7 +5407,7 @@ snapshots: '@esbuild/linux-s390x@0.21.5': optional: true - '@esbuild/linux-s390x@0.23.0': + '@esbuild/linux-s390x@0.23.1': optional: true '@esbuild/linux-x64@0.18.20': @@ -5547,7 +5419,7 @@ snapshots: '@esbuild/linux-x64@0.21.5': optional: true - '@esbuild/linux-x64@0.23.0': + '@esbuild/linux-x64@0.23.1': optional: true '@esbuild/netbsd-x64@0.18.20': @@ -5559,10 +5431,10 @@ snapshots: '@esbuild/netbsd-x64@0.21.5': optional: true - '@esbuild/netbsd-x64@0.23.0': + '@esbuild/netbsd-x64@0.23.1': optional: true - '@esbuild/openbsd-arm64@0.23.0': + '@esbuild/openbsd-arm64@0.23.1': optional: true '@esbuild/openbsd-x64@0.18.20': @@ -5574,7 +5446,7 @@ snapshots: '@esbuild/openbsd-x64@0.21.5': optional: true - '@esbuild/openbsd-x64@0.23.0': + '@esbuild/openbsd-x64@0.23.1': optional: true '@esbuild/sunos-x64@0.18.20': @@ -5586,7 +5458,7 @@ snapshots: '@esbuild/sunos-x64@0.21.5': optional: true - '@esbuild/sunos-x64@0.23.0': + '@esbuild/sunos-x64@0.23.1': optional: true '@esbuild/win32-arm64@0.18.20': @@ -5598,7 +5470,7 @@ snapshots: '@esbuild/win32-arm64@0.21.5': optional: true - '@esbuild/win32-arm64@0.23.0': + '@esbuild/win32-arm64@0.23.1': optional: true '@esbuild/win32-ia32@0.18.20': @@ -5610,7 +5482,7 @@ snapshots: '@esbuild/win32-ia32@0.21.5': optional: true - '@esbuild/win32-ia32@0.23.0': + '@esbuild/win32-ia32@0.23.1': optional: true '@esbuild/win32-x64@0.18.20': @@ -5622,23 +5494,23 @@ snapshots: '@esbuild/win32-x64@0.21.5': optional: true - '@esbuild/win32-x64@0.23.0': + '@esbuild/win32-x64@0.23.1': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.1)': dependencies: - eslint: 8.57.0 + eslint: 8.57.1 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.10.0': {} + '@eslint-community/regexpp@4.11.0': {} '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.4 + debug: 4.3.6 espree: 9.6.1 globals: 13.24.0 - ignore: 5.3.1 + ignore: 5.3.2 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -5646,48 +5518,33 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@8.57.0': {} + '@eslint/js@8.57.1': {} '@exodus/schemasafe@1.3.0': optional: true '@faker-js/faker@8.4.1': {} - '@floating-ui/core@1.6.1': + '@floating-ui/core@1.6.7': dependencies: - '@floating-ui/utils': 0.2.2 + '@floating-ui/utils': 0.2.7 - '@floating-ui/core@1.6.2': + '@floating-ui/dom@1.6.10': dependencies: - '@floating-ui/utils': 0.2.2 + '@floating-ui/core': 1.6.7 + '@floating-ui/utils': 0.2.7 - '@floating-ui/core@1.6.4': - dependencies: - '@floating-ui/utils': 0.2.4 + '@floating-ui/utils@0.2.7': {} - '@floating-ui/dom@1.6.5': - dependencies: - '@floating-ui/core': 1.6.2 - '@floating-ui/utils': 0.2.2 - - '@floating-ui/dom@1.6.7': - dependencies: - '@floating-ui/core': 1.6.4 - '@floating-ui/utils': 0.2.4 - - '@floating-ui/utils@0.2.2': {} - - '@floating-ui/utils@0.2.4': {} - - '@fontsource/fira-mono@5.0.14': {} + '@fontsource/fira-mono@5.1.0': {} '@gcornut/valibot-json-schema@0.31.0': dependencies: valibot: 0.31.1 optionalDependencies: '@types/json-schema': 7.0.15 - esbuild: 0.23.0 - esbuild-runner: 2.2.2(esbuild@0.23.0) + esbuild: 0.23.1 + esbuild-runner: 2.2.2(esbuild@0.23.1) optional: true '@hapi/hoek@9.3.0': @@ -5698,26 +5555,26 @@ snapshots: '@hapi/hoek': 9.3.0 optional: true - '@hono/swagger-ui@0.4.1(hono@4.5.11)': + '@hono/swagger-ui@0.4.1(hono@4.6.3)': dependencies: - hono: 4.5.11 + hono: 4.6.3 - '@hono/zod-openapi@0.15.3(hono@4.5.11)(zod@3.23.8)': + '@hono/zod-openapi@0.15.3(hono@4.6.3)(zod@3.23.8)': dependencies: '@asteasolutions/zod-to-openapi': 7.1.1(zod@3.23.8) - '@hono/zod-validator': 0.2.2(hono@4.5.11)(zod@3.23.8) - hono: 4.5.11 + '@hono/zod-validator': 0.2.2(hono@4.6.3)(zod@3.23.8) + hono: 4.6.3 zod: 3.23.8 - '@hono/zod-validator@0.2.2(hono@4.5.11)(zod@3.23.8)': + '@hono/zod-validator@0.2.2(hono@4.6.3)(zod@3.23.8)': dependencies: - hono: 4.5.11 + hono: 4.6.3 zod: 3.23.8 - '@humanwhocodes/config-array@0.11.14': + '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.4 + debug: 4.3.6 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -5736,84 +5593,84 @@ snapshots: '@iconify/types@2.0.0': {} - '@img/sharp-darwin-arm64@0.33.4': + '@img/sharp-darwin-arm64@0.33.5': optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.0.2 + '@img/sharp-libvips-darwin-arm64': 1.0.4 optional: true - '@img/sharp-darwin-x64@0.33.4': + '@img/sharp-darwin-x64@0.33.5': optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.0.2 + '@img/sharp-libvips-darwin-x64': 1.0.4 optional: true - '@img/sharp-libvips-darwin-arm64@1.0.2': + '@img/sharp-libvips-darwin-arm64@1.0.4': optional: true - '@img/sharp-libvips-darwin-x64@1.0.2': + '@img/sharp-libvips-darwin-x64@1.0.4': optional: true - '@img/sharp-libvips-linux-arm64@1.0.2': + '@img/sharp-libvips-linux-arm64@1.0.4': optional: true - '@img/sharp-libvips-linux-arm@1.0.2': + '@img/sharp-libvips-linux-arm@1.0.5': optional: true - '@img/sharp-libvips-linux-s390x@1.0.2': + '@img/sharp-libvips-linux-s390x@1.0.4': optional: true - '@img/sharp-libvips-linux-x64@1.0.2': + '@img/sharp-libvips-linux-x64@1.0.4': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.0.2': + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.0.2': + '@img/sharp-libvips-linuxmusl-x64@1.0.4': optional: true - '@img/sharp-linux-arm64@0.33.4': + '@img/sharp-linux-arm64@0.33.5': optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.0.2 + '@img/sharp-libvips-linux-arm64': 1.0.4 optional: true - '@img/sharp-linux-arm@0.33.4': + '@img/sharp-linux-arm@0.33.5': optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.0.2 + '@img/sharp-libvips-linux-arm': 1.0.5 optional: true - '@img/sharp-linux-s390x@0.33.4': + '@img/sharp-linux-s390x@0.33.5': optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.0.2 + '@img/sharp-libvips-linux-s390x': 1.0.4 optional: true - '@img/sharp-linux-x64@0.33.4': + '@img/sharp-linux-x64@0.33.5': optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.0.2 + '@img/sharp-libvips-linux-x64': 1.0.4 optional: true - '@img/sharp-linuxmusl-arm64@0.33.4': + '@img/sharp-linuxmusl-arm64@0.33.5': optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.0.2 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 optional: true - '@img/sharp-linuxmusl-x64@0.33.4': + '@img/sharp-linuxmusl-x64@0.33.5': optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.0.2 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 optional: true - '@img/sharp-wasm32@0.33.4': + '@img/sharp-wasm32@0.33.5': dependencies: '@emnapi/runtime': 1.2.0 optional: true - '@img/sharp-win32-ia32@0.33.4': + '@img/sharp-win32-ia32@0.33.5': optional: true - '@img/sharp-win32-x64@0.33.4': + '@img/sharp-win32-x64@0.33.5': optional: true '@internationalized/date@3.5.5': dependencies: - '@swc/helpers': 0.5.11 + '@swc/helpers': 0.5.13 '@ioredis/commands@1.2.0': {} @@ -5826,8 +5683,6 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@isaacs/ttlcache@1.4.1': {} - '@jest/schemas@29.6.3': dependencies: '@sinclair/typebox': 0.27.8 @@ -5835,28 +5690,28 @@ snapshots: '@jridgewell/gen-mapping@0.3.5': dependencies: '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.2.1': {} - '@jridgewell/sourcemap-codec@1.4.15': {} + '@jridgewell/sourcemap-codec@1.5.0': {} '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 - '@lucia-auth/adapter-drizzle@1.1.0(drizzle-orm@0.32.2(@neondatabase/serverless@0.9.5)(@types/pg@8.11.8)(pg@8.12.0)(postgres@3.4.4))(lucia@3.2.0)': + '@lucia-auth/adapter-drizzle@1.1.0(drizzle-orm@0.32.2(@neondatabase/serverless@0.9.5)(@types/pg@8.11.10)(pg@8.13.0(pg-native@3.2.0))(postgres@3.4.4))(lucia@3.2.0)': dependencies: - drizzle-orm: 0.32.2(@neondatabase/serverless@0.9.5)(@types/pg@8.11.8)(pg@8.12.0)(postgres@3.4.4) + drizzle-orm: 0.32.2(@neondatabase/serverless@0.9.5)(@types/pg@8.11.10)(pg@8.13.0(pg-native@3.2.0))(postgres@3.4.4) lucia: 3.2.0 '@lukeed/csprng@1.1.0': {} @@ -5874,7 +5729,7 @@ snapshots: nopt: 5.0.0 npmlog: 5.0.1 rimraf: 3.0.2 - semver: 7.6.2 + semver: 7.6.3 tar: 6.2.1 transitivePeerDependencies: - encoding @@ -5884,13 +5739,13 @@ snapshots: dependencies: '@melt-ui/svelte': 0.83.0(svelte@5.0.0-next.175) estree-walker: 3.0.3 - magic-string: 0.30.10 + magic-string: 0.30.11 svelte: 5.0.0-next.175 '@melt-ui/svelte@0.76.2(svelte@5.0.0-next.175)': dependencies: - '@floating-ui/core': 1.6.2 - '@floating-ui/dom': 1.6.5 + '@floating-ui/core': 1.6.7 + '@floating-ui/dom': 1.6.10 '@internationalized/date': 3.5.5 dequal: 2.0.3 focus-trap: 7.5.4 @@ -5899,8 +5754,8 @@ snapshots: '@melt-ui/svelte@0.83.0(svelte@5.0.0-next.175)': dependencies: - '@floating-ui/core': 1.6.4 - '@floating-ui/dom': 1.6.7 + '@floating-ui/core': 1.6.7 + '@floating-ui/dom': 1.6.10 '@internationalized/date': 3.5.5 dequal: 2.0.3 focus-trap: 7.5.4 @@ -5925,42 +5780,79 @@ snapshots: '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': optional: true + '@napi-rs/wasm-runtime@0.2.4': + dependencies: + '@emnapi/core': 1.2.0 + '@emnapi/runtime': 1.2.0 + '@tybys/wasm-util': 0.9.0 + optional: true + '@neondatabase/serverless@0.9.5': dependencies: '@types/pg': 8.11.6 - '@noble/hashes@1.4.0': {} + '@noble/hashes@1.5.0': {} '@node-rs/argon2-android-arm-eabi@1.7.0': optional: true + '@node-rs/argon2-android-arm-eabi@1.8.3': + optional: true + '@node-rs/argon2-android-arm64@1.7.0': optional: true + '@node-rs/argon2-android-arm64@1.8.3': + optional: true + '@node-rs/argon2-darwin-arm64@1.7.0': optional: true + '@node-rs/argon2-darwin-arm64@1.8.3': + optional: true + '@node-rs/argon2-darwin-x64@1.7.0': optional: true + '@node-rs/argon2-darwin-x64@1.8.3': + optional: true + '@node-rs/argon2-freebsd-x64@1.7.0': optional: true + '@node-rs/argon2-freebsd-x64@1.8.3': + optional: true + '@node-rs/argon2-linux-arm-gnueabihf@1.7.0': optional: true + '@node-rs/argon2-linux-arm-gnueabihf@1.8.3': + optional: true + '@node-rs/argon2-linux-arm64-gnu@1.7.0': optional: true + '@node-rs/argon2-linux-arm64-gnu@1.8.3': + optional: true + '@node-rs/argon2-linux-arm64-musl@1.7.0': optional: true + '@node-rs/argon2-linux-arm64-musl@1.8.3': + optional: true + '@node-rs/argon2-linux-x64-gnu@1.7.0': optional: true + '@node-rs/argon2-linux-x64-gnu@1.8.3': + optional: true + '@node-rs/argon2-linux-x64-musl@1.7.0': optional: true + '@node-rs/argon2-linux-x64-musl@1.8.3': + optional: true + '@node-rs/argon2-wasm32-wasi@1.7.0': dependencies: '@emnapi/core': 0.45.0 @@ -5969,15 +5861,29 @@ snapshots: memfs-browser: 3.5.10302 optional: true + '@node-rs/argon2-wasm32-wasi@1.8.3': + dependencies: + '@napi-rs/wasm-runtime': 0.2.4 + optional: true + '@node-rs/argon2-win32-arm64-msvc@1.7.0': optional: true + '@node-rs/argon2-win32-arm64-msvc@1.8.3': + optional: true + '@node-rs/argon2-win32-ia32-msvc@1.7.0': optional: true + '@node-rs/argon2-win32-ia32-msvc@1.8.3': + optional: true + '@node-rs/argon2-win32-x64-msvc@1.7.0': optional: true + '@node-rs/argon2-win32-x64-msvc@1.8.3': + optional: true + '@node-rs/argon2@1.7.0': optionalDependencies: '@node-rs/argon2-android-arm-eabi': 1.7.0 @@ -5995,6 +5901,23 @@ snapshots: '@node-rs/argon2-win32-ia32-msvc': 1.7.0 '@node-rs/argon2-win32-x64-msvc': 1.7.0 + '@node-rs/argon2@1.8.3': + optionalDependencies: + '@node-rs/argon2-android-arm-eabi': 1.8.3 + '@node-rs/argon2-android-arm64': 1.8.3 + '@node-rs/argon2-darwin-arm64': 1.8.3 + '@node-rs/argon2-darwin-x64': 1.8.3 + '@node-rs/argon2-freebsd-x64': 1.8.3 + '@node-rs/argon2-linux-arm-gnueabihf': 1.8.3 + '@node-rs/argon2-linux-arm64-gnu': 1.8.3 + '@node-rs/argon2-linux-arm64-musl': 1.8.3 + '@node-rs/argon2-linux-x64-gnu': 1.8.3 + '@node-rs/argon2-linux-x64-musl': 1.8.3 + '@node-rs/argon2-wasm32-wasi': 1.8.3 + '@node-rs/argon2-win32-arm64-msvc': 1.8.3 + '@node-rs/argon2-win32-ia32-msvc': 1.8.3 + '@node-rs/argon2-win32-x64-msvc': 1.8.3 + '@node-rs/bcrypt-android-arm-eabi@1.9.0': optional: true @@ -6071,216 +5994,164 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 + '@oslojs/asn1@1.0.0': + dependencies: + '@oslojs/binary': 1.0.0 + + '@oslojs/binary@1.0.0': {} + + '@oslojs/cbor@1.0.0': + dependencies: + '@oslojs/binary': 1.0.0 + + '@oslojs/crypto@1.0.0': + dependencies: + '@oslojs/asn1': 1.0.0 + '@oslojs/binary': 1.0.0 + + '@oslojs/crypto@1.0.1': + dependencies: + '@oslojs/asn1': 1.0.0 + '@oslojs/binary': 1.0.0 + + '@oslojs/encoding@0.4.1': {} + + '@oslojs/encoding@1.0.0': {} + + '@oslojs/encoding@1.1.0': {} + + '@oslojs/jwt@0.2.0': + dependencies: + '@oslojs/encoding': 0.4.1 + + '@oslojs/oauth2@0.5.0': {} + + '@oslojs/otp@1.0.0': + dependencies: + '@oslojs/binary': 1.0.0 + '@oslojs/crypto': 1.0.0 + '@oslojs/encoding': 1.0.0 + + '@oslojs/webauthn@1.0.0': + dependencies: + '@oslojs/asn1': 1.0.0 + '@oslojs/binary': 1.0.0 + '@oslojs/cbor': 1.0.0 + '@oslojs/crypto': 1.0.0 + '@oslojs/encoding': 1.0.0 + '@paralleldrive/cuid2@2.2.2': dependencies: - '@noble/hashes': 1.4.0 + '@noble/hashes': 1.5.0 '@pkgjs/parseargs@0.11.0': optional: true - '@playwright/test@1.46.1': + '@playwright/test@1.47.2': dependencies: - playwright: 1.46.1 + playwright: 1.47.2 '@polka/url@1.0.0-next.25': {} '@poppinss/macroable@1.0.2': optional: true - '@resvg/resvg-js-android-arm-eabi@2.6.2': - optional: true - - '@resvg/resvg-js-android-arm64@2.6.2': - optional: true - - '@resvg/resvg-js-darwin-arm64@2.6.2': - optional: true - - '@resvg/resvg-js-darwin-x64@2.6.2': - optional: true - - '@resvg/resvg-js-linux-arm-gnueabihf@2.6.2': - optional: true - - '@resvg/resvg-js-linux-arm64-gnu@2.6.2': - optional: true - - '@resvg/resvg-js-linux-arm64-musl@2.6.2': - optional: true - - '@resvg/resvg-js-linux-x64-gnu@2.6.2': - optional: true - - '@resvg/resvg-js-linux-x64-musl@2.6.2': - optional: true - - '@resvg/resvg-js-win32-arm64-msvc@2.6.2': - optional: true - - '@resvg/resvg-js-win32-ia32-msvc@2.6.2': - optional: true - - '@resvg/resvg-js-win32-x64-msvc@2.6.2': - optional: true - - '@resvg/resvg-js@2.6.2': - optionalDependencies: - '@resvg/resvg-js-android-arm-eabi': 2.6.2 - '@resvg/resvg-js-android-arm64': 2.6.2 - '@resvg/resvg-js-darwin-arm64': 2.6.2 - '@resvg/resvg-js-darwin-x64': 2.6.2 - '@resvg/resvg-js-linux-arm-gnueabihf': 2.6.2 - '@resvg/resvg-js-linux-arm64-gnu': 2.6.2 - '@resvg/resvg-js-linux-arm64-musl': 2.6.2 - '@resvg/resvg-js-linux-x64-gnu': 2.6.2 - '@resvg/resvg-js-linux-x64-musl': 2.6.2 - '@resvg/resvg-js-win32-arm64-msvc': 2.6.2 - '@resvg/resvg-js-win32-ia32-msvc': 2.6.2 - '@resvg/resvg-js-win32-x64-msvc': 2.6.2 - - '@resvg/resvg-wasm@2.6.0': {} - - '@rollup/plugin-commonjs@26.0.1(rollup@4.18.1)': + '@rollup/plugin-commonjs@28.0.0(rollup@4.21.2)': dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.18.1) + '@rollup/pluginutils': 5.1.2(rollup@4.21.2) commondir: 1.0.1 estree-walker: 2.0.2 - glob: 10.4.1 + fdir: 6.3.0(picomatch@2.3.1) is-reference: 1.2.1 - magic-string: 0.30.10 + magic-string: 0.30.11 + picomatch: 2.3.1 optionalDependencies: - rollup: 4.18.1 + rollup: 4.21.2 - '@rollup/plugin-json@6.1.0(rollup@4.18.1)': + '@rollup/plugin-json@6.1.0(rollup@4.21.2)': dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.18.1) + '@rollup/pluginutils': 5.1.0(rollup@4.21.2) optionalDependencies: - rollup: 4.18.1 + rollup: 4.21.2 - '@rollup/plugin-node-resolve@15.2.3(rollup@4.18.1)': + '@rollup/plugin-node-resolve@15.3.0(rollup@4.21.2)': dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.18.1) + '@rollup/pluginutils': 5.1.2(rollup@4.21.2) '@types/resolve': 1.20.2 deepmerge: 4.3.1 - is-builtin-module: 3.2.1 is-module: 1.0.0 resolve: 1.22.8 optionalDependencies: - rollup: 4.18.1 + rollup: 4.21.2 '@rollup/pluginutils@4.2.1': dependencies: estree-walker: 2.0.2 picomatch: 2.3.1 - '@rollup/pluginutils@5.1.0(rollup@4.18.1)': + '@rollup/pluginutils@5.1.0(rollup@4.21.2)': dependencies: '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 optionalDependencies: - rollup: 4.18.1 + rollup: 4.21.2 - '@rollup/rollup-android-arm-eabi@4.18.1': - optional: true - - '@rollup/rollup-android-arm-eabi@4.21.0': - optional: true - - '@rollup/rollup-android-arm64@4.18.1': - optional: true - - '@rollup/rollup-android-arm64@4.21.0': - optional: true - - '@rollup/rollup-darwin-arm64@4.18.1': - optional: true - - '@rollup/rollup-darwin-arm64@4.21.0': - optional: true - - '@rollup/rollup-darwin-x64@4.18.1': - optional: true - - '@rollup/rollup-darwin-x64@4.21.0': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.18.1': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.21.0': - optional: true - - '@rollup/rollup-linux-arm-musleabihf@4.18.1': - optional: true - - '@rollup/rollup-linux-arm-musleabihf@4.21.0': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.18.1': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.21.0': - optional: true - - '@rollup/rollup-linux-arm64-musl@4.18.1': - optional: true - - '@rollup/rollup-linux-arm64-musl@4.21.0': - optional: true - - '@rollup/rollup-linux-powerpc64le-gnu@4.18.1': - optional: true - - '@rollup/rollup-linux-powerpc64le-gnu@4.21.0': - optional: true - - '@rollup/rollup-linux-riscv64-gnu@4.18.1': - optional: true - - '@rollup/rollup-linux-riscv64-gnu@4.21.0': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.18.1': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.21.0': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.18.1': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.21.0': - optional: true - - '@rollup/rollup-linux-x64-musl@4.18.1': - optional: true - - '@rollup/rollup-linux-x64-musl@4.21.0': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.18.1': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.21.0': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.18.1': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.21.0': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.18.1': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.21.0': - optional: true - - '@shuding/opentype.js@1.4.0-beta.0': + '@rollup/pluginutils@5.1.2(rollup@4.21.2)': dependencies: - fflate: 0.7.4 - string.prototype.codepointat: 0.2.1 + '@types/estree': 1.0.6 + estree-walker: 2.0.2 + picomatch: 2.3.1 + optionalDependencies: + rollup: 4.21.2 + + '@rollup/rollup-android-arm-eabi@4.21.2': + optional: true + + '@rollup/rollup-android-arm64@4.21.2': + optional: true + + '@rollup/rollup-darwin-arm64@4.21.2': + optional: true + + '@rollup/rollup-darwin-x64@4.21.2': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.21.2': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.21.2': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.21.2': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.21.2': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.21.2': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.21.2': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.21.2': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.21.2': + optional: true + + '@rollup/rollup-linux-x64-musl@4.21.2': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.21.2': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.21.2': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.21.2': + optional: true '@sideway/address@4.1.5': dependencies: @@ -6301,80 +6172,79 @@ snapshots: '@sodaru/yup-to-json-schema@2.0.1': optional: true - '@sveltejs/adapter-auto@3.2.4(@sveltejs/kit@2.5.25(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)))': + '@sveltejs/adapter-auto@3.2.5(@sveltejs/kit@2.6.1(@sveltejs/vite-plugin-svelte@4.0.0-next.7(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)))': dependencies: - '@sveltejs/kit': 2.5.25(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)) + '@sveltejs/kit': 2.6.1(@sveltejs/vite-plugin-svelte@4.0.0-next.7(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)) import-meta-resolve: 4.1.0 - '@sveltejs/adapter-node@5.2.2(@sveltejs/kit@2.5.25(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)))': + '@sveltejs/adapter-node@5.2.5(@sveltejs/kit@2.6.1(@sveltejs/vite-plugin-svelte@4.0.0-next.7(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)))': dependencies: - '@rollup/plugin-commonjs': 26.0.1(rollup@4.18.1) - '@rollup/plugin-json': 6.1.0(rollup@4.18.1) - '@rollup/plugin-node-resolve': 15.2.3(rollup@4.18.1) - '@sveltejs/kit': 2.5.25(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)) - rollup: 4.18.1 + '@rollup/plugin-commonjs': 28.0.0(rollup@4.21.2) + '@rollup/plugin-json': 6.1.0(rollup@4.21.2) + '@rollup/plugin-node-resolve': 15.3.0(rollup@4.21.2) + '@sveltejs/kit': 2.6.1(@sveltejs/vite-plugin-svelte@4.0.0-next.7(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)) + rollup: 4.21.2 - '@sveltejs/adapter-vercel@5.4.3(@sveltejs/kit@2.5.25(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)))': + '@sveltejs/adapter-vercel@5.4.4(@sveltejs/kit@2.6.1(@sveltejs/vite-plugin-svelte@4.0.0-next.7(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)))': dependencies: - '@sveltejs/kit': 2.5.25(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)) - '@vercel/nft': 0.27.2 + '@sveltejs/kit': 2.6.1(@sveltejs/vite-plugin-svelte@4.0.0-next.7(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)) + '@vercel/nft': 0.27.4 esbuild: 0.21.5 transitivePeerDependencies: - encoding - supports-color - '@sveltejs/enhanced-img@0.3.4(rollup@4.18.1)(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8))': + '@sveltejs/enhanced-img@0.3.8(rollup@4.21.2)(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1))': dependencies: - magic-string: 0.30.10 + magic-string: 0.30.11 svelte: 5.0.0-next.175 svelte-parse-markup: 0.1.5(svelte@5.0.0-next.175) - vite: 5.4.3(@types/node@20.16.3)(sass@1.77.8) - vite-imagetools: 7.0.2(rollup@4.18.1) + vite: 5.4.8(@types/node@20.16.10)(sass@1.79.1) + vite-imagetools: 7.0.4(rollup@4.21.2) transitivePeerDependencies: - rollup - '@sveltejs/kit@2.5.25(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8))': + '@sveltejs/kit@2.6.1(@sveltejs/vite-plugin-svelte@4.0.0-next.7(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)) + '@sveltejs/vite-plugin-svelte': 4.0.0-next.7(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)) '@types/cookie': 0.6.0 cookie: 0.6.0 - devalue: 5.0.0 + devalue: 5.1.1 esm-env: 1.0.0 import-meta-resolve: 4.1.0 kleur: 4.1.5 - magic-string: 0.30.10 + magic-string: 0.30.11 mrmime: 2.0.0 sade: 1.8.1 - set-cookie-parser: 2.6.0 + set-cookie-parser: 2.7.0 sirv: 2.0.4 svelte: 5.0.0-next.175 tiny-glob: 0.2.9 - vite: 5.4.3(@types/node@20.16.3)(sass@1.77.8) + vite: 5.4.8(@types/node@20.16.10)(sass@1.79.1) - '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8))': + '@sveltejs/vite-plugin-svelte-inspector@3.0.0-next.3(@sveltejs/vite-plugin-svelte@4.0.0-next.7(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)) - debug: 4.3.4 + '@sveltejs/vite-plugin-svelte': 4.0.0-next.7(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)) + debug: 4.3.6 svelte: 5.0.0-next.175 - vite: 5.4.3(@types/node@20.16.3)(sass@1.77.8) + vite: 5.4.8(@types/node@20.16.10)(sass@1.79.1) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8))': + '@sveltejs/vite-plugin-svelte@4.0.0-next.7(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)) - debug: 4.3.4 + '@sveltejs/vite-plugin-svelte-inspector': 3.0.0-next.3(@sveltejs/vite-plugin-svelte@4.0.0-next.7(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)) + debug: 4.3.6 deepmerge: 4.3.1 kleur: 4.1.5 - magic-string: 0.30.10 + magic-string: 0.30.11 svelte: 5.0.0-next.175 - svelte-hmr: 0.16.0(svelte@5.0.0-next.175) - vite: 5.4.3(@types/node@20.16.3)(sass@1.77.8) - vitefu: 0.2.5(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)) + vite: 5.4.8(@types/node@20.16.10)(sass@1.79.1) + vitefu: 1.0.2(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)) transitivePeerDependencies: - supports-color - '@swc/helpers@0.5.11': + '@swc/helpers@0.5.13': dependencies: tslib: 2.7.0 @@ -6391,66 +6261,91 @@ snapshots: tslib: 2.7.0 optional: true + '@tybys/wasm-util@0.9.0': + dependencies: + tslib: 2.7.0 + optional: true + '@types/cookie@0.6.0': {} '@types/estree@1.0.5': {} + '@types/estree@1.0.6': {} + '@types/feather-icons@4.29.4': {} '@types/json-schema@7.0.15': optional: true - '@types/node@20.16.3': + '@types/node@20.16.10': dependencies: - undici-types: 6.19.6 + undici-types: 6.19.8 - '@types/pg@8.11.6': + '@types/pg@8.11.10': dependencies: - '@types/node': 20.16.3 + '@types/node': 20.16.10 pg-protocol: 1.6.1 pg-types: 4.0.2 - '@types/pg@8.11.8': + '@types/pg@8.11.6': dependencies: - '@types/node': 20.16.3 + '@types/node': 20.16.10 pg-protocol: 1.6.1 pg-types: 4.0.2 '@types/pug@2.0.10': {} + '@types/qrcode@1.5.5': + dependencies: + '@types/node': 20.16.10 + '@types/resolve@1.20.2': {} - '@types/validator@13.12.0': + '@types/validator@13.12.1': optional: true - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)': + '@typeschema/class-validator@0.2.0(@types/json-schema@7.0.15)(class-validator@0.14.1)': dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.4) - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 7.18.0 - eslint: 8.57.0 - graphemer: 1.4.0 - ignore: 5.3.1 - natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.5.4) + '@typeschema/core': 0.14.0(@types/json-schema@7.0.15) optionalDependencies: - typescript: 5.5.4 + class-validator: 0.14.1 + transitivePeerDependencies: + - '@types/json-schema' + optional: true + + '@typeschema/core@0.14.0(@types/json-schema@7.0.15)': + optionalDependencies: + '@types/json-schema': 7.0.15 + optional: true + + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2)': + dependencies: + '@eslint-community/regexpp': 4.11.0 + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.6.2) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.6.2) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.6.2) + '@typescript-eslint/visitor-keys': 7.18.0 + eslint: 8.57.1 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.3.0(typescript@5.6.2) + optionalDependencies: + typescript: 5.6.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4)': + '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2)': dependencies: '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.2) '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.3.4 - eslint: 8.57.0 + debug: 4.3.6 + eslint: 8.57.1 optionalDependencies: - typescript: 5.5.4 + typescript: 5.6.2 transitivePeerDependencies: - supports-color @@ -6459,42 +6354,42 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - '@typescript-eslint/type-utils@7.18.0(eslint@8.57.0)(typescript@5.5.4)': + '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.6.2)': dependencies: - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.2) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.6.2) debug: 4.3.6 - eslint: 8.57.0 - ts-api-utils: 1.3.0(typescript@5.5.4) + eslint: 8.57.1 + ts-api-utils: 1.3.0(typescript@5.6.2) optionalDependencies: - typescript: 5.5.4 + typescript: 5.6.2 transitivePeerDependencies: - supports-color '@typescript-eslint/types@7.18.0': {} - '@typescript-eslint/typescript-estree@7.18.0(typescript@5.5.4)': + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.6.2)': dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.3.4 + debug: 4.3.6 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.5.4) + ts-api-utils: 1.3.0(typescript@5.6.2) optionalDependencies: - typescript: 5.5.4 + typescript: 5.6.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.18.0(eslint@8.57.0)(typescript@5.5.4)': + '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.6.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) - eslint: 8.57.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.2) + eslint: 8.57.1 transitivePeerDependencies: - supports-color - typescript @@ -6506,40 +6401,34 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vercel/nft@0.27.2': + '@vercel/nft@0.27.4': dependencies: '@mapbox/node-pre-gyp': 1.0.11 '@rollup/pluginutils': 4.2.1 - acorn: 8.12.0 - acorn-import-attributes: 1.9.5(acorn@8.12.0) + acorn: 8.12.1 + acorn-import-attributes: 1.9.5(acorn@8.12.1) async-sema: 3.1.1 bindings: 1.5.0 estree-walker: 2.0.2 glob: 7.2.3 graceful-fs: 4.2.11 - micromatch: 4.0.7 - node-gyp-build: 4.8.1 + micromatch: 4.0.8 + node-gyp-build: 4.8.2 resolve-from: 5.0.0 transitivePeerDependencies: - encoding - supports-color - '@vercel/og@0.5.20': - dependencies: - '@resvg/resvg-wasm': 2.6.0 - satori: 0.10.9 - yoga-wasm-web: 0.3.3 - '@vinejs/compiler@2.5.0': optional: true '@vinejs/vine@1.8.0': dependencies: '@poppinss/macroable': 1.0.2 - '@types/validator': 13.12.0 + '@types/validator': 13.12.1 '@vinejs/compiler': 2.5.0 camelcase: 8.0.0 - dayjs: 1.11.11 + dayjs: 1.11.13 dlv: 1.1.3 normalize-url: 8.0.1 validator: 13.12.0 @@ -6549,7 +6438,7 @@ snapshots: dependencies: '@vitest/spy': 1.6.0 '@vitest/utils': 1.6.0 - chai: 4.4.1 + chai: 4.5.0 '@vitest/runner@1.6.0': dependencies: @@ -6559,7 +6448,7 @@ snapshots: '@vitest/snapshot@1.6.0': dependencies: - magic-string: 0.30.10 + magic-string: 0.30.11 pathe: 1.1.2 pretty-format: 29.7.0 @@ -6581,23 +6470,23 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 - acorn-import-attributes@1.9.5(acorn@8.12.0): + acorn-import-attributes@1.9.5(acorn@8.12.1): dependencies: - acorn: 8.12.0 + acorn: 8.12.1 - acorn-jsx@5.3.2(acorn@8.11.3): + acorn-jsx@5.3.2(acorn@8.12.1): dependencies: - acorn: 8.11.3 + acorn: 8.12.1 - acorn-typescript@1.4.13(acorn@8.12.0): + acorn-typescript@1.4.13(acorn@8.12.1): dependencies: - acorn: 8.12.0 + acorn: 8.12.1 - acorn-walk@8.3.2: {} + acorn-walk@8.3.3: + dependencies: + acorn: 8.12.1 - acorn@8.11.3: {} - - acorn@8.12.0: {} + acorn@8.12.1: {} agent-base@6.0.2: dependencies: @@ -6652,10 +6541,10 @@ snapshots: dependencies: dequal: 2.0.3 - arktype@2.0.0-beta.0: + arktype@2.0.0-rc.8: dependencies: - '@ark/schema': 0.2.0 - '@ark/util': 0.1.0 + '@ark/schema': 0.10.0 + '@ark/util': 0.10.0 optional: true array-flatten@1.1.1: {} @@ -6666,31 +6555,27 @@ snapshots: async-sema@3.1.1: {} - autoprefixer@10.4.20(postcss@8.4.44): + autoprefixer@10.4.20(postcss@8.4.47): dependencies: browserslist: 4.23.3 - caniuse-lite: 1.0.30001649 + caniuse-lite: 1.0.30001655 fraction.js: 4.3.7 normalize-range: 0.1.2 - picocolors: 1.0.1 - postcss: 8.4.44 + picocolors: 1.1.0 + postcss: 8.4.47 postcss-value-parser: 4.2.0 - axobject-query@4.0.0: - dependencies: - dequal: 2.0.3 + axobject-query@4.1.0: {} balanced-match@1.0.2: {} - base64-js@0.0.8: {} - binary-extensions@2.3.0: {} bindings@1.5.0: dependencies: file-uri-to-path: 1.0.0 - bits-ui@0.21.13(svelte@5.0.0-next.175): + bits-ui@0.21.15(svelte@5.0.0-next.175): dependencies: '@internationalized/date': 3.5.5 '@melt-ui/svelte': 0.76.2(svelte@5.0.0-next.175) @@ -6731,35 +6616,22 @@ snapshots: dependencies: balanced-match: 1.0.2 - braces@3.0.2: - dependencies: - fill-range: 7.0.1 - braces@3.0.3: dependencies: fill-range: 7.1.1 - browserslist@4.23.1: - dependencies: - caniuse-lite: 1.0.30001640 - electron-to-chromium: 1.4.818 - node-releases: 2.0.14 - update-browserslist-db: 1.1.0(browserslist@4.23.1) - browserslist@4.23.3: dependencies: - caniuse-lite: 1.0.30001649 - electron-to-chromium: 1.5.4 + caniuse-lite: 1.0.30001655 + electron-to-chromium: 1.5.13 node-releases: 2.0.18 update-browserslist-db: 1.1.0(browserslist@4.23.3) - buffer-crc32@0.2.13: {} + buffer-crc32@1.0.0: {} buffer-from@1.1.2: {} - builtin-modules@3.3.0: {} - - bullmq@5.12.13: + bullmq@5.14.0: dependencies: cron-parser: 4.9.0 ioredis: 5.4.1 @@ -6792,21 +6664,17 @@ snapshots: camelcase@8.0.0: optional: true - camelize@1.0.1: {} + caniuse-lite@1.0.30001655: {} - caniuse-lite@1.0.30001640: {} - - caniuse-lite@1.0.30001649: {} - - chai@4.4.1: + chai@4.5.0: dependencies: assertion-error: 1.1.0 check-error: 1.0.3 - deep-eql: 4.1.3 + deep-eql: 4.1.4 get-func-name: 2.0.2 loupe: 2.3.7 pathval: 1.1.1 - type-detect: 4.0.8 + type-detect: 4.1.0 chalk@4.1.2: dependencies: @@ -6820,7 +6688,7 @@ snapshots: chokidar@3.6.0: dependencies: anymatch: 3.1.3 - braces: 3.0.2 + braces: 3.0.3 glob-parent: 5.1.2 is-binary-path: 2.1.0 is-glob: 4.0.3 @@ -6829,8 +6697,20 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chokidar@4.0.1: + dependencies: + readdirp: 4.0.1 + optional: true + chownr@2.0.0: {} + class-validator@0.14.1: + dependencies: + '@types/validator': 13.12.1 + libphonenumber-js: 1.11.8 + validator: 13.12.0 + optional: true + class-variance-authority@0.7.0: dependencies: clsx: 2.0.0 @@ -6851,9 +6731,9 @@ snapshots: code-red@1.0.4: dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@types/estree': 1.0.5 - acorn: 8.11.3 + acorn: 8.12.1 estree-walker: 3.0.3 periscopic: 3.1.0 @@ -6895,13 +6775,13 @@ snapshots: cookie@0.6.0: {} - core-js@3.37.0: {} + core-js@3.38.1: {} create-require@1.1.1: {} cron-parser@4.9.0: dependencies: - luxon: 3.4.4 + luxon: 3.5.0 cross-spawn@7.0.3: dependencies: @@ -6909,67 +6789,47 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - css-background-parser@0.1.0: {} - - css-blank-pseudo@6.0.2(postcss@8.4.44): + css-blank-pseudo@6.0.2(postcss@8.4.47): dependencies: - postcss: 8.4.44 - postcss-selector-parser: 6.0.16 + postcss: 8.4.47 + postcss-selector-parser: 6.1.2 - css-box-shadow@1.0.0-3: {} - - css-color-keywords@1.0.0: {} - - css-has-pseudo@6.0.5(postcss@8.4.44): + css-has-pseudo@6.0.5(postcss@8.4.47): dependencies: - '@csstools/selector-specificity': 3.1.1(postcss-selector-parser@6.1.0) - postcss: 8.4.44 - postcss-selector-parser: 6.1.0 + '@csstools/selector-specificity': 3.1.1(postcss-selector-parser@6.1.2) + postcss: 8.4.47 + postcss-selector-parser: 6.1.2 postcss-value-parser: 4.2.0 - css-prefers-color-scheme@9.0.1(postcss@8.4.44): + css-prefers-color-scheme@9.0.1(postcss@8.4.47): dependencies: - postcss: 8.4.44 - - css-to-react-native@3.2.0: - dependencies: - camelize: 1.0.1 - css-color-keywords: 1.0.0 - postcss-value-parser: 4.2.0 + postcss: 8.4.47 css-tree@2.3.1: dependencies: mdn-data: 2.0.30 - source-map-js: 1.2.0 + source-map-js: 1.2.1 cssdb@8.1.0: {} cssesc@3.0.0: {} - dayjs@1.11.11: + dayjs@1.11.13: optional: true debug@2.6.9: dependencies: ms: 2.0.0 - debug@4.3.4: - dependencies: - ms: 2.1.2 - - debug@4.3.5: - dependencies: - ms: 2.1.2 - debug@4.3.6: dependencies: ms: 2.1.2 decamelize@1.2.0: {} - deep-eql@4.1.3: + deep-eql@4.1.4: dependencies: - type-detect: 4.0.8 + type-detect: 4.1.0 deep-is@0.1.4: {} @@ -6997,6 +6857,8 @@ snapshots: devalue@5.0.0: {} + devalue@5.1.1: {} + didyoumean@1.2.2: {} diff-sequences@29.6.3: {} @@ -7026,31 +6888,27 @@ snapshots: '@drizzle-team/brocli': 0.8.2 '@esbuild-kit/esm-loader': 2.6.5 esbuild: 0.19.12 - esbuild-register: 3.5.0(esbuild@0.19.12) + esbuild-register: 3.6.0(esbuild@0.19.12) transitivePeerDependencies: - supports-color - drizzle-orm@0.32.2(@neondatabase/serverless@0.9.5)(@types/pg@8.11.8)(pg@8.12.0)(postgres@3.4.4): + drizzle-orm@0.32.2(@neondatabase/serverless@0.9.5)(@types/pg@8.11.10)(pg@8.13.0(pg-native@3.2.0))(postgres@3.4.4): optionalDependencies: '@neondatabase/serverless': 0.9.5 - '@types/pg': 8.11.8 - pg: 8.12.0 + '@types/pg': 8.11.10 + pg: 8.13.0(pg-native@3.2.0) postgres: 3.4.4 - drizzle-zod@0.5.1(drizzle-orm@0.32.2(@neondatabase/serverless@0.9.5)(@types/pg@8.11.8)(pg@8.12.0)(postgres@3.4.4))(zod@3.23.8): + drizzle-zod@0.5.1(drizzle-orm@0.32.2(@neondatabase/serverless@0.9.5)(@types/pg@8.11.10)(pg@8.13.0(pg-native@3.2.0))(postgres@3.4.4))(zod@3.23.8): dependencies: - drizzle-orm: 0.32.2(@neondatabase/serverless@0.9.5)(@types/pg@8.11.8)(pg@8.12.0)(postgres@3.4.4) + drizzle-orm: 0.32.2(@neondatabase/serverless@0.9.5)(@types/pg@8.11.10)(pg@8.13.0(pg-native@3.2.0))(postgres@3.4.4) zod: 3.23.8 eastasianwidth@0.2.0: {} ee-first@1.1.1: {} - electron-to-chromium@1.4.818: {} - - electron-to-chromium@1.5.4: {} - - emoji-regex@10.3.0: {} + electron-to-chromium@1.5.13: {} emoji-regex@8.0.0: {} @@ -7066,16 +6924,16 @@ snapshots: es6-promise@3.3.1: {} - esbuild-register@3.5.0(esbuild@0.19.12): + esbuild-register@3.6.0(esbuild@0.19.12): dependencies: - debug: 4.3.5 + debug: 4.3.6 esbuild: 0.19.12 transitivePeerDependencies: - supports-color - esbuild-runner@2.2.2(esbuild@0.23.0): + esbuild-runner@2.2.2(esbuild@0.23.1): dependencies: - esbuild: 0.23.0 + esbuild: 0.23.1 source-map-support: 0.5.21 tslib: 2.4.0 optional: true @@ -7157,65 +7015,67 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 - esbuild@0.23.0: + esbuild@0.23.1: optionalDependencies: - '@esbuild/aix-ppc64': 0.23.0 - '@esbuild/android-arm': 0.23.0 - '@esbuild/android-arm64': 0.23.0 - '@esbuild/android-x64': 0.23.0 - '@esbuild/darwin-arm64': 0.23.0 - '@esbuild/darwin-x64': 0.23.0 - '@esbuild/freebsd-arm64': 0.23.0 - '@esbuild/freebsd-x64': 0.23.0 - '@esbuild/linux-arm': 0.23.0 - '@esbuild/linux-arm64': 0.23.0 - '@esbuild/linux-ia32': 0.23.0 - '@esbuild/linux-loong64': 0.23.0 - '@esbuild/linux-mips64el': 0.23.0 - '@esbuild/linux-ppc64': 0.23.0 - '@esbuild/linux-riscv64': 0.23.0 - '@esbuild/linux-s390x': 0.23.0 - '@esbuild/linux-x64': 0.23.0 - '@esbuild/netbsd-x64': 0.23.0 - '@esbuild/openbsd-arm64': 0.23.0 - '@esbuild/openbsd-x64': 0.23.0 - '@esbuild/sunos-x64': 0.23.0 - '@esbuild/win32-arm64': 0.23.0 - '@esbuild/win32-ia32': 0.23.0 - '@esbuild/win32-x64': 0.23.0 + '@esbuild/aix-ppc64': 0.23.1 + '@esbuild/android-arm': 0.23.1 + '@esbuild/android-arm64': 0.23.1 + '@esbuild/android-x64': 0.23.1 + '@esbuild/darwin-arm64': 0.23.1 + '@esbuild/darwin-x64': 0.23.1 + '@esbuild/freebsd-arm64': 0.23.1 + '@esbuild/freebsd-x64': 0.23.1 + '@esbuild/linux-arm': 0.23.1 + '@esbuild/linux-arm64': 0.23.1 + '@esbuild/linux-ia32': 0.23.1 + '@esbuild/linux-loong64': 0.23.1 + '@esbuild/linux-mips64el': 0.23.1 + '@esbuild/linux-ppc64': 0.23.1 + '@esbuild/linux-riscv64': 0.23.1 + '@esbuild/linux-s390x': 0.23.1 + '@esbuild/linux-x64': 0.23.1 + '@esbuild/netbsd-x64': 0.23.1 + '@esbuild/openbsd-arm64': 0.23.1 + '@esbuild/openbsd-x64': 0.23.1 + '@esbuild/sunos-x64': 0.23.1 + '@esbuild/win32-arm64': 0.23.1 + '@esbuild/win32-ia32': 0.23.1 + '@esbuild/win32-x64': 0.23.1 - escalade@3.1.2: {} + escalade@3.2.0: {} escape-html@1.0.3: {} escape-string-regexp@4.0.0: {} - eslint-compat-utils@0.5.1(eslint@8.57.0): + eslint-compat-utils@0.5.1(eslint@8.57.1): dependencies: - eslint: 8.57.0 - semver: 7.6.2 + eslint: 8.57.1 + semver: 7.6.3 - eslint-config-prettier@9.1.0(eslint@8.57.0): + eslint-config-prettier@9.1.0(eslint@8.57.1): dependencies: - eslint: 8.57.0 + eslint: 8.57.1 - eslint-plugin-svelte@2.43.0(eslint@8.57.0)(svelte@5.0.0-next.175)(ts-node@10.9.2(@types/node@20.16.3)(typescript@5.5.4)): + eslint-plugin-svelte@2.36.0-next.13(eslint@8.57.1)(svelte@5.0.0-next.175)(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2)): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@jridgewell/sourcemap-codec': 1.4.15 - eslint: 8.57.0 - eslint-compat-utils: 0.5.1(eslint@8.57.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) + '@jridgewell/sourcemap-codec': 1.5.0 + debug: 4.3.6 + eslint: 8.57.1 + eslint-compat-utils: 0.5.1(eslint@8.57.1) esutils: 2.0.3 - known-css-properties: 0.34.0 - postcss: 8.4.44 - postcss-load-config: 3.1.4(postcss@8.4.44)(ts-node@10.9.2(@types/node@20.16.3)(typescript@5.5.4)) - postcss-safe-parser: 6.0.0(postcss@8.4.44) - postcss-selector-parser: 6.1.0 - semver: 7.6.2 + known-css-properties: 0.30.0 + postcss: 8.4.47 + postcss-load-config: 3.1.4(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2)) + postcss-safe-parser: 6.0.0(postcss@8.4.47) + postcss-selector-parser: 6.1.2 + semver: 7.6.3 svelte-eslint-parser: 0.41.0(svelte@5.0.0-next.175) optionalDependencies: svelte: 5.0.0-next.175 transitivePeerDependencies: + - supports-color - ts-node eslint-scope@7.2.2: @@ -7225,26 +7085,26 @@ snapshots: eslint-visitor-keys@3.4.3: {} - eslint@8.57.0: + eslint@8.57.1: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.10.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) + '@eslint-community/regexpp': 4.11.0 '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.0 - '@humanwhocodes/config-array': 0.11.14 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 '@ungap/structured-clone': 1.2.0 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4 + debug: 4.3.6 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - esquery: 1.5.0 + esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 @@ -7252,7 +7112,7 @@ snapshots: glob-parent: 6.0.2 globals: 13.24.0 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -7272,17 +7132,17 @@ snapshots: espree@9.6.1: dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) eslint-visitor-keys: 3.4.3 - esquery@1.5.0: + esquery@1.6.0: dependencies: estraverse: 5.3.0 esrap@1.2.2: dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@types/estree': 1.0.5 esrecurse@4.3.0: @@ -7313,7 +7173,7 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 - express-rate-limit@7.3.1(express@4.19.2): + express-rate-limit@7.4.0(express@4.19.2): dependencies: express: 4.19.2 @@ -7361,7 +7221,7 @@ snapshots: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.5 + micromatch: 4.0.8 fast-json-stable-stringify@2.1.0: {} @@ -7375,12 +7235,14 @@ snapshots: dependencies: reusify: 1.0.4 + fdir@6.3.0(picomatch@2.3.1): + optionalDependencies: + picomatch: 2.3.1 + feather-icons@4.29.2: dependencies: classnames: 2.5.1 - core-js: 3.37.0 - - fflate@0.7.4: {} + core-js: 3.38.1 file-entry-cache@6.0.1: dependencies: @@ -7388,10 +7250,6 @@ snapshots: file-uri-to-path@1.0.0: {} - fill-range@7.0.1: - dependencies: - to-regex-range: 5.0.1 - fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -7430,16 +7288,16 @@ snapshots: dependencies: tabbable: 6.2.0 - foreground-child@3.1.1: + foreground-child@3.3.0: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 - formsnap@1.0.1(svelte@5.0.0-next.175)(sveltekit-superforms@2.17.0(@sveltejs/kit@2.5.25(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)))(svelte@5.0.0-next.175)): + formsnap@1.0.1(svelte@5.0.0-next.175)(sveltekit-superforms@2.19.0(@sveltejs/kit@2.6.1(@sveltejs/vite-plugin-svelte@4.0.0-next.7(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)))(@types/json-schema@7.0.15)(svelte@5.0.0-next.175)): dependencies: nanoid: 5.0.7 svelte: 5.0.0-next.175 - sveltekit-superforms: 2.17.0(@sveltejs/kit@2.5.25(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)))(svelte@5.0.0-next.175) + sveltekit-superforms: 2.19.0(@sveltejs/kit@2.6.1(@sveltejs/vite-plugin-svelte@4.0.0-next.7(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)))(@types/json-schema@7.0.15)(svelte@5.0.0-next.175) forwarded@0.2.0: {} @@ -7490,7 +7348,7 @@ snapshots: get-stream@8.0.1: {} - get-tsconfig@4.7.5: + get-tsconfig@4.8.0: dependencies: resolve-pkg-maps: 1.0.0 @@ -7502,12 +7360,13 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.4.1: + glob@10.4.5: dependencies: - foreground-child: 3.1.1 - jackspeak: 3.4.0 - minimatch: 9.0.4 + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 minipass: 7.1.2 + package-json-from-dist: 1.0.0 path-scurry: 1.11.1 glob@7.2.3: @@ -7530,7 +7389,7 @@ snapshots: array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.3.2 - ignore: 5.3.1 + ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 @@ -7551,7 +7410,7 @@ snapshots: source-map: 0.6.1 wordwrap: 1.0.0 optionalDependencies: - uglify-js: 3.19.1 + uglify-js: 3.19.3 has-flag@4.0.0: {} @@ -7569,13 +7428,11 @@ snapshots: dependencies: function-bind: 1.1.2 - hex-rgb@4.3.0: {} - - hono-rate-limiter@0.4.0(hono@4.5.11): + hono-rate-limiter@0.4.0(hono@4.6.3): dependencies: - hono: 4.5.11 + hono: 4.6.3 - hono@4.5.11: {} + hono@4.6.3: {} html-entities@2.5.2: {} @@ -7604,13 +7461,12 @@ snapshots: dependencies: safer-buffer: 2.1.2 - ignore@5.3.1: {} + ignore@5.3.2: {} - imagetools-core@7.0.0: - dependencies: - sharp: 0.33.4 + imagetools-core@7.0.1: {} - immutable@4.3.5: {} + immutable@4.3.7: + optional: true import-fresh@3.3.0: dependencies: @@ -7632,7 +7488,7 @@ snapshots: dependencies: '@ioredis/commands': 1.2.0 cluster-key-slot: 1.1.2 - debug: 4.3.5 + debug: 4.3.6 denque: 2.1.0 lodash.defaults: 4.2.0 lodash.isarguments: 3.1.0 @@ -7650,11 +7506,7 @@ snapshots: dependencies: binary-extensions: 2.3.0 - is-builtin-module@3.2.1: - dependencies: - builtin-modules: 3.3.0 - - is-core-module@2.13.1: + is-core-module@2.15.1: dependencies: hasown: 2.0.2 @@ -7674,7 +7526,7 @@ snapshots: is-reference@1.2.1: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 is-reference@3.0.2: dependencies: @@ -7698,16 +7550,13 @@ snapshots: meriyah: 1.9.15 reflect-metadata: 0.1.14 - jackspeak@3.4.0: + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jiti@1.21.3: {} - - jiti@1.21.6: - optional: true + jiti@1.21.6: {} joi@17.13.3: dependencies: @@ -7726,9 +7575,9 @@ snapshots: json-buffer@3.0.1: {} - json-schema-to-ts@3.1.0: + json-schema-to-ts@3.1.1: dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.6 ts-algebra: 2.0.0 optional: true @@ -7750,21 +7599,25 @@ snapshots: kleur@4.1.5: {} - known-css-properties@0.34.0: {} + known-css-properties@0.30.0: {} levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 + libphonenumber-js@1.11.8: + optional: true + + libpq@1.8.13: + dependencies: + bindings: 1.5.0 + nan: 2.19.0 + optional: true + lilconfig@2.1.0: {} - lilconfig@3.1.1: {} - - linebreak@1.1.0: - dependencies: - base64-js: 0.0.8 - unicode-trie: 2.0.0 + lilconfig@3.1.2: {} lines-and-columns@1.2.4: {} @@ -7772,8 +7625,8 @@ snapshots: local-pkg@0.5.0: dependencies: - mlly: 1.7.0 - pkg-types: 1.1.0 + mlly: 1.7.1 + pkg-types: 1.2.0 locate-character@3.0.0: {} @@ -7799,7 +7652,7 @@ snapshots: dependencies: get-func-name: 2.0.2 - lru-cache@10.2.2: {} + lru-cache@10.4.3: {} lucia@3.2.0: dependencies: @@ -7809,11 +7662,11 @@ snapshots: dependencies: svelte: 5.0.0-next.175 - luxon@3.4.4: {} + luxon@3.5.0: {} - magic-string@0.30.10: + magic-string@0.30.11: dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 make-dir@3.1.0: dependencies: @@ -7847,12 +7700,7 @@ snapshots: methods@1.1.2: {} - micromatch@4.0.5: - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - - micromatch@4.0.7: + micromatch@4.0.8: dependencies: braces: 3.0.3 picomatch: 2.3.1 @@ -7873,10 +7721,6 @@ snapshots: dependencies: brace-expansion: 1.1.11 - minimatch@9.0.4: - dependencies: - brace-expansion: 2.0.1 - minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 @@ -7902,12 +7746,12 @@ snapshots: mkdirp@1.0.4: {} - mlly@1.7.0: + mlly@1.7.1: dependencies: - acorn: 8.11.3 + acorn: 8.12.1 pathe: 1.1.2 - pkg-types: 1.1.0 - ufo: 1.5.3 + pkg-types: 1.2.0 + ufo: 1.5.4 mri@1.2.0: {} @@ -7941,6 +7785,9 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 + nan@2.19.0: + optional: true + nanoid@3.3.7: {} nanoid@5.0.7: {} @@ -7962,9 +7809,7 @@ snapshots: detect-libc: 2.0.3 optional: true - node-gyp-build@4.8.1: {} - - node-releases@2.0.14: {} + node-gyp-build@4.8.2: {} node-releases@2.0.18: {} @@ -8014,9 +7859,9 @@ snapshots: open-props@1.7.6: {} - openapi3-ts@4.3.3: + openapi3-ts@4.4.0: dependencies: - yaml: 2.5.0 + yaml: 2.5.1 optionator@0.9.4: dependencies: @@ -8047,7 +7892,7 @@ snapshots: p-limit@5.0.0: dependencies: - yocto-queue: 1.0.0 + yocto-queue: 1.1.1 p-locate@4.1.0: dependencies: @@ -8059,17 +7904,12 @@ snapshots: p-try@2.2.0: {} - pako@0.2.9: {} + package-json-from-dist@1.0.0: {} parent-module@1.0.1: dependencies: callsites: 3.1.0 - parse-css-color@0.2.1: - dependencies: - color-name: 1.1.4 - hex-rgb: 4.3.0 - parseurl@1.3.3: {} path-exists@4.0.0: {} @@ -8084,7 +7924,7 @@ snapshots: path-scurry@1.11.1: dependencies: - lru-cache: 10.2.2 + lru-cache: 10.4.3 minipass: 7.1.2 path-to-regexp@0.1.7: {} @@ -8104,18 +7944,35 @@ snapshots: pg-cloudflare@1.1.1: optional: true - pg-connection-string@2.6.4: {} + pg-connection-string@2.7.0: {} pg-int8@1.0.1: {} + pg-native@3.2.0: + dependencies: + libpq: 1.8.13 + pg-types: 1.13.0 + optional: true + pg-numeric@1.0.2: {} - pg-pool@3.6.2(pg@8.12.0): + pg-pool@3.7.0(pg@8.13.0(pg-native@3.2.0)): dependencies: - pg: 8.12.0 + pg: 8.13.0(pg-native@3.2.0) pg-protocol@1.6.1: {} + pg-protocol@1.7.0: {} + + pg-types@1.13.0: + dependencies: + pg-int8: 1.0.1 + postgres-array: 1.0.3 + postgres-bytea: 1.0.0 + postgres-date: 1.0.7 + postgres-interval: 1.2.0 + optional: true + pg-types@2.2.0: dependencies: pg-int8: 1.0.1 @@ -8134,23 +7991,22 @@ snapshots: postgres-interval: 3.0.0 postgres-range: 1.1.4 - pg@8.12.0: + pg@8.13.0(pg-native@3.2.0): dependencies: - pg-connection-string: 2.6.4 - pg-pool: 3.6.2(pg@8.12.0) - pg-protocol: 1.6.1 + pg-connection-string: 2.7.0 + pg-pool: 3.7.0(pg@8.13.0(pg-native@3.2.0)) + pg-protocol: 1.7.0 pg-types: 2.2.0 pgpass: 1.0.5 optionalDependencies: pg-cloudflare: 1.1.1 + pg-native: 3.2.0 pgpass@1.0.5: dependencies: split2: 4.2.0 - picocolors@1.0.0: {} - - picocolors@1.0.1: {} + picocolors@1.1.0: {} picomatch@2.3.1: {} @@ -8158,306 +8014,304 @@ snapshots: pirates@4.0.6: {} - pkg-types@1.1.0: + pkg-types@1.2.0: dependencies: confbox: 0.1.7 - mlly: 1.7.0 + mlly: 1.7.1 pathe: 1.1.2 - playwright-core@1.46.1: {} + playwright-core@1.47.2: {} - playwright@1.46.1: + playwright@1.47.2: dependencies: - playwright-core: 1.46.1 + playwright-core: 1.47.2 optionalDependencies: fsevents: 2.3.2 pngjs@5.0.0: {} - postcss-attribute-case-insensitive@6.0.3(postcss@8.4.44): + postcss-attribute-case-insensitive@6.0.3(postcss@8.4.47): dependencies: - postcss: 8.4.44 - postcss-selector-parser: 6.0.16 + postcss: 8.4.47 + postcss-selector-parser: 6.1.2 - postcss-clamp@4.1.0(postcss@8.4.44): + postcss-clamp@4.1.0(postcss@8.4.47): dependencies: - postcss: 8.4.44 + postcss: 8.4.47 postcss-value-parser: 4.2.0 - postcss-color-functional-notation@6.0.14(postcss@8.4.44): + postcss-color-functional-notation@6.0.14(postcss@8.4.47): dependencies: - '@csstools/css-color-parser': 2.0.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) + '@csstools/css-color-parser': 2.0.5(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 - '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.44) - '@csstools/utilities': 1.0.0(postcss@8.4.44) - postcss: 8.4.44 + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.47) + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 - postcss-color-hex-alpha@9.0.4(postcss@8.4.44): + postcss-color-hex-alpha@9.0.4(postcss@8.4.47): dependencies: - '@csstools/utilities': 1.0.0(postcss@8.4.44) - postcss: 8.4.44 + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 postcss-value-parser: 4.2.0 - postcss-color-rebeccapurple@9.0.3(postcss@8.4.44): + postcss-color-rebeccapurple@9.0.3(postcss@8.4.47): dependencies: - '@csstools/utilities': 1.0.0(postcss@8.4.44) - postcss: 8.4.44 + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 postcss-value-parser: 4.2.0 - postcss-custom-media@10.0.8(postcss@8.4.44): + postcss-custom-media@10.0.8(postcss@8.4.47): dependencies: '@csstools/cascade-layer-name-parser': 1.0.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 '@csstools/media-query-list-parser': 2.1.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) - postcss: 8.4.44 + postcss: 8.4.47 - postcss-custom-properties@13.3.12(postcss@8.4.44): + postcss-custom-properties@13.3.12(postcss@8.4.47): dependencies: '@csstools/cascade-layer-name-parser': 1.0.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 - '@csstools/utilities': 1.0.0(postcss@8.4.44) - postcss: 8.4.44 + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 postcss-value-parser: 4.2.0 - postcss-custom-selectors@7.1.12(postcss@8.4.44): + postcss-custom-selectors@7.1.12(postcss@8.4.47): dependencies: '@csstools/cascade-layer-name-parser': 1.0.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 - postcss: 8.4.44 - postcss-selector-parser: 6.1.0 + postcss: 8.4.47 + postcss-selector-parser: 6.1.2 - postcss-dir-pseudo-class@8.0.1(postcss@8.4.44): + postcss-dir-pseudo-class@8.0.1(postcss@8.4.47): dependencies: - postcss: 8.4.44 - postcss-selector-parser: 6.0.16 + postcss: 8.4.47 + postcss-selector-parser: 6.1.2 - postcss-double-position-gradients@5.0.7(postcss@8.4.44): + postcss-double-position-gradients@5.0.7(postcss@8.4.47): dependencies: - '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.44) - '@csstools/utilities': 1.0.0(postcss@8.4.44) - postcss: 8.4.44 + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.47) + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 postcss-value-parser: 4.2.0 - postcss-focus-visible@9.0.1(postcss@8.4.44): + postcss-focus-visible@9.0.1(postcss@8.4.47): dependencies: - postcss: 8.4.44 - postcss-selector-parser: 6.0.16 + postcss: 8.4.47 + postcss-selector-parser: 6.1.2 - postcss-focus-within@8.0.1(postcss@8.4.44): + postcss-focus-within@8.0.1(postcss@8.4.47): dependencies: - postcss: 8.4.44 - postcss-selector-parser: 6.0.16 + postcss: 8.4.47 + postcss-selector-parser: 6.1.2 - postcss-font-variant@5.0.0(postcss@8.4.44): + postcss-font-variant@5.0.0(postcss@8.4.47): dependencies: - postcss: 8.4.44 + postcss: 8.4.47 - postcss-gap-properties@5.0.1(postcss@8.4.44): + postcss-gap-properties@5.0.1(postcss@8.4.47): dependencies: - postcss: 8.4.44 + postcss: 8.4.47 - postcss-image-set-function@6.0.3(postcss@8.4.44): + postcss-image-set-function@6.0.3(postcss@8.4.47): dependencies: - '@csstools/utilities': 1.0.0(postcss@8.4.44) - postcss: 8.4.44 + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 postcss-value-parser: 4.2.0 - postcss-import@15.1.0(postcss@8.4.44): + postcss-import@15.1.0(postcss@8.4.47): dependencies: - postcss: 8.4.44 + postcss: 8.4.47 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 - postcss-import@16.1.0(postcss@8.4.44): + postcss-import@16.1.0(postcss@8.4.47): dependencies: - postcss: 8.4.44 + postcss: 8.4.47 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 - postcss-js@4.0.1(postcss@8.4.44): + postcss-js@4.0.1(postcss@8.4.47): dependencies: camelcase-css: 2.0.1 - postcss: 8.4.44 + postcss: 8.4.47 - postcss-lab-function@6.0.19(postcss@8.4.44): + postcss-lab-function@6.0.19(postcss@8.4.47): dependencies: - '@csstools/css-color-parser': 2.0.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) + '@csstools/css-color-parser': 2.0.5(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 - '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.44) - '@csstools/utilities': 1.0.0(postcss@8.4.44) - postcss: 8.4.44 + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.47) + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 - postcss-load-config@3.1.4(postcss@8.4.44)(ts-node@10.9.2(@types/node@20.16.3)(typescript@5.5.4)): + postcss-load-config@3.1.4(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2)): dependencies: lilconfig: 2.1.0 yaml: 1.10.2 optionalDependencies: - postcss: 8.4.44 - ts-node: 10.9.2(@types/node@20.16.3)(typescript@5.5.4) + postcss: 8.4.47 + ts-node: 10.9.2(@types/node@20.16.10)(typescript@5.6.2) - postcss-load-config@4.0.2(postcss@8.4.44)(ts-node@10.9.2(@types/node@20.16.3)(typescript@5.5.4)): + postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2)): dependencies: - lilconfig: 3.1.1 - yaml: 2.4.3 + lilconfig: 3.1.2 + yaml: 2.5.1 optionalDependencies: - postcss: 8.4.44 - ts-node: 10.9.2(@types/node@20.16.3)(typescript@5.5.4) + postcss: 8.4.47 + ts-node: 10.9.2(@types/node@20.16.10)(typescript@5.6.2) - postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.44)(tsx@4.19.0): + postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.1): dependencies: - lilconfig: 3.1.1 - yaml: 2.4.2 + lilconfig: 3.1.2 + yaml: 2.5.1 optionalDependencies: jiti: 1.21.6 - postcss: 8.4.44 - tsx: 4.19.0 + postcss: 8.4.47 + tsx: 4.19.1 - postcss-logical@7.0.1(postcss@8.4.44): + postcss-logical@7.0.1(postcss@8.4.47): dependencies: - postcss: 8.4.44 + postcss: 8.4.47 postcss-value-parser: 4.2.0 - postcss-nested@6.0.1(postcss@8.4.44): + postcss-nested@6.2.0(postcss@8.4.47): dependencies: - postcss: 8.4.44 - postcss-selector-parser: 6.1.0 + postcss: 8.4.47 + postcss-selector-parser: 6.1.2 - postcss-nesting@12.1.5(postcss@8.4.44): + postcss-nesting@12.1.5(postcss@8.4.47): dependencies: - '@csstools/selector-resolve-nested': 1.1.0(postcss-selector-parser@6.1.0) - '@csstools/selector-specificity': 3.1.1(postcss-selector-parser@6.1.0) - postcss: 8.4.44 - postcss-selector-parser: 6.1.0 + '@csstools/selector-resolve-nested': 1.1.0(postcss-selector-parser@6.1.2) + '@csstools/selector-specificity': 3.1.1(postcss-selector-parser@6.1.2) + postcss: 8.4.47 + postcss-selector-parser: 6.1.2 - postcss-opacity-percentage@2.0.0(postcss@8.4.44): + postcss-opacity-percentage@2.0.0(postcss@8.4.47): dependencies: - postcss: 8.4.44 + postcss: 8.4.47 - postcss-overflow-shorthand@5.0.1(postcss@8.4.44): + postcss-overflow-shorthand@5.0.1(postcss@8.4.47): dependencies: - postcss: 8.4.44 + postcss: 8.4.47 postcss-value-parser: 4.2.0 - postcss-page-break@3.0.4(postcss@8.4.44): + postcss-page-break@3.0.4(postcss@8.4.47): dependencies: - postcss: 8.4.44 + postcss: 8.4.47 - postcss-place@9.0.1(postcss@8.4.44): + postcss-place@9.0.1(postcss@8.4.47): dependencies: - postcss: 8.4.44 + postcss: 8.4.47 postcss-value-parser: 4.2.0 - postcss-preset-env@9.6.0(postcss@8.4.44): + postcss-preset-env@9.6.0(postcss@8.4.47): dependencies: - '@csstools/postcss-cascade-layers': 4.0.6(postcss@8.4.44) - '@csstools/postcss-color-function': 3.0.19(postcss@8.4.44) - '@csstools/postcss-color-mix-function': 2.0.19(postcss@8.4.44) - '@csstools/postcss-content-alt-text': 1.0.0(postcss@8.4.44) - '@csstools/postcss-exponential-functions': 1.0.9(postcss@8.4.44) - '@csstools/postcss-font-format-keywords': 3.0.2(postcss@8.4.44) - '@csstools/postcss-gamut-mapping': 1.0.11(postcss@8.4.44) - '@csstools/postcss-gradients-interpolation-method': 4.0.20(postcss@8.4.44) - '@csstools/postcss-hwb-function': 3.0.18(postcss@8.4.44) - '@csstools/postcss-ic-unit': 3.0.7(postcss@8.4.44) - '@csstools/postcss-initial': 1.0.1(postcss@8.4.44) - '@csstools/postcss-is-pseudo-class': 4.0.8(postcss@8.4.44) - '@csstools/postcss-light-dark-function': 1.0.8(postcss@8.4.44) - '@csstools/postcss-logical-float-and-clear': 2.0.1(postcss@8.4.44) - '@csstools/postcss-logical-overflow': 1.0.1(postcss@8.4.44) - '@csstools/postcss-logical-overscroll-behavior': 1.0.1(postcss@8.4.44) - '@csstools/postcss-logical-resize': 2.0.1(postcss@8.4.44) - '@csstools/postcss-logical-viewport-units': 2.0.11(postcss@8.4.44) - '@csstools/postcss-media-minmax': 1.1.8(postcss@8.4.44) - '@csstools/postcss-media-queries-aspect-ratio-number-values': 2.0.11(postcss@8.4.44) - '@csstools/postcss-nested-calc': 3.0.2(postcss@8.4.44) - '@csstools/postcss-normalize-display-values': 3.0.2(postcss@8.4.44) - '@csstools/postcss-oklab-function': 3.0.19(postcss@8.4.44) - '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.44) - '@csstools/postcss-relative-color-syntax': 2.0.19(postcss@8.4.44) - '@csstools/postcss-scope-pseudo-class': 3.0.1(postcss@8.4.44) - '@csstools/postcss-stepped-value-functions': 3.0.10(postcss@8.4.44) - '@csstools/postcss-text-decoration-shorthand': 3.0.7(postcss@8.4.44) - '@csstools/postcss-trigonometric-functions': 3.0.10(postcss@8.4.44) - '@csstools/postcss-unset-value': 3.0.1(postcss@8.4.44) - autoprefixer: 10.4.20(postcss@8.4.44) - browserslist: 4.23.1 - css-blank-pseudo: 6.0.2(postcss@8.4.44) - css-has-pseudo: 6.0.5(postcss@8.4.44) - css-prefers-color-scheme: 9.0.1(postcss@8.4.44) + '@csstools/postcss-cascade-layers': 4.0.6(postcss@8.4.47) + '@csstools/postcss-color-function': 3.0.19(postcss@8.4.47) + '@csstools/postcss-color-mix-function': 2.0.19(postcss@8.4.47) + '@csstools/postcss-content-alt-text': 1.0.0(postcss@8.4.47) + '@csstools/postcss-exponential-functions': 1.0.9(postcss@8.4.47) + '@csstools/postcss-font-format-keywords': 3.0.2(postcss@8.4.47) + '@csstools/postcss-gamut-mapping': 1.0.11(postcss@8.4.47) + '@csstools/postcss-gradients-interpolation-method': 4.0.20(postcss@8.4.47) + '@csstools/postcss-hwb-function': 3.0.18(postcss@8.4.47) + '@csstools/postcss-ic-unit': 3.0.7(postcss@8.4.47) + '@csstools/postcss-initial': 1.0.1(postcss@8.4.47) + '@csstools/postcss-is-pseudo-class': 4.0.8(postcss@8.4.47) + '@csstools/postcss-light-dark-function': 1.0.8(postcss@8.4.47) + '@csstools/postcss-logical-float-and-clear': 2.0.1(postcss@8.4.47) + '@csstools/postcss-logical-overflow': 1.0.1(postcss@8.4.47) + '@csstools/postcss-logical-overscroll-behavior': 1.0.1(postcss@8.4.47) + '@csstools/postcss-logical-resize': 2.0.1(postcss@8.4.47) + '@csstools/postcss-logical-viewport-units': 2.0.11(postcss@8.4.47) + '@csstools/postcss-media-minmax': 1.1.8(postcss@8.4.47) + '@csstools/postcss-media-queries-aspect-ratio-number-values': 2.0.11(postcss@8.4.47) + '@csstools/postcss-nested-calc': 3.0.2(postcss@8.4.47) + '@csstools/postcss-normalize-display-values': 3.0.2(postcss@8.4.47) + '@csstools/postcss-oklab-function': 3.0.19(postcss@8.4.47) + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.47) + '@csstools/postcss-relative-color-syntax': 2.0.19(postcss@8.4.47) + '@csstools/postcss-scope-pseudo-class': 3.0.1(postcss@8.4.47) + '@csstools/postcss-stepped-value-functions': 3.0.10(postcss@8.4.47) + '@csstools/postcss-text-decoration-shorthand': 3.0.7(postcss@8.4.47) + '@csstools/postcss-trigonometric-functions': 3.0.10(postcss@8.4.47) + '@csstools/postcss-unset-value': 3.0.1(postcss@8.4.47) + autoprefixer: 10.4.20(postcss@8.4.47) + browserslist: 4.23.3 + css-blank-pseudo: 6.0.2(postcss@8.4.47) + css-has-pseudo: 6.0.5(postcss@8.4.47) + css-prefers-color-scheme: 9.0.1(postcss@8.4.47) cssdb: 8.1.0 - postcss: 8.4.44 - postcss-attribute-case-insensitive: 6.0.3(postcss@8.4.44) - postcss-clamp: 4.1.0(postcss@8.4.44) - postcss-color-functional-notation: 6.0.14(postcss@8.4.44) - postcss-color-hex-alpha: 9.0.4(postcss@8.4.44) - postcss-color-rebeccapurple: 9.0.3(postcss@8.4.44) - postcss-custom-media: 10.0.8(postcss@8.4.44) - postcss-custom-properties: 13.3.12(postcss@8.4.44) - postcss-custom-selectors: 7.1.12(postcss@8.4.44) - postcss-dir-pseudo-class: 8.0.1(postcss@8.4.44) - postcss-double-position-gradients: 5.0.7(postcss@8.4.44) - postcss-focus-visible: 9.0.1(postcss@8.4.44) - postcss-focus-within: 8.0.1(postcss@8.4.44) - postcss-font-variant: 5.0.0(postcss@8.4.44) - postcss-gap-properties: 5.0.1(postcss@8.4.44) - postcss-image-set-function: 6.0.3(postcss@8.4.44) - postcss-lab-function: 6.0.19(postcss@8.4.44) - postcss-logical: 7.0.1(postcss@8.4.44) - postcss-nesting: 12.1.5(postcss@8.4.44) - postcss-opacity-percentage: 2.0.0(postcss@8.4.44) - postcss-overflow-shorthand: 5.0.1(postcss@8.4.44) - postcss-page-break: 3.0.4(postcss@8.4.44) - postcss-place: 9.0.1(postcss@8.4.44) - postcss-pseudo-class-any-link: 9.0.2(postcss@8.4.44) - postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.44) - postcss-selector-not: 7.0.2(postcss@8.4.44) + postcss: 8.4.47 + postcss-attribute-case-insensitive: 6.0.3(postcss@8.4.47) + postcss-clamp: 4.1.0(postcss@8.4.47) + postcss-color-functional-notation: 6.0.14(postcss@8.4.47) + postcss-color-hex-alpha: 9.0.4(postcss@8.4.47) + postcss-color-rebeccapurple: 9.0.3(postcss@8.4.47) + postcss-custom-media: 10.0.8(postcss@8.4.47) + postcss-custom-properties: 13.3.12(postcss@8.4.47) + postcss-custom-selectors: 7.1.12(postcss@8.4.47) + postcss-dir-pseudo-class: 8.0.1(postcss@8.4.47) + postcss-double-position-gradients: 5.0.7(postcss@8.4.47) + postcss-focus-visible: 9.0.1(postcss@8.4.47) + postcss-focus-within: 8.0.1(postcss@8.4.47) + postcss-font-variant: 5.0.0(postcss@8.4.47) + postcss-gap-properties: 5.0.1(postcss@8.4.47) + postcss-image-set-function: 6.0.3(postcss@8.4.47) + postcss-lab-function: 6.0.19(postcss@8.4.47) + postcss-logical: 7.0.1(postcss@8.4.47) + postcss-nesting: 12.1.5(postcss@8.4.47) + postcss-opacity-percentage: 2.0.0(postcss@8.4.47) + postcss-overflow-shorthand: 5.0.1(postcss@8.4.47) + postcss-page-break: 3.0.4(postcss@8.4.47) + postcss-place: 9.0.1(postcss@8.4.47) + postcss-pseudo-class-any-link: 9.0.2(postcss@8.4.47) + postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.47) + postcss-selector-not: 7.0.2(postcss@8.4.47) - postcss-pseudo-class-any-link@9.0.2(postcss@8.4.44): + postcss-pseudo-class-any-link@9.0.2(postcss@8.4.47): dependencies: - postcss: 8.4.44 - postcss-selector-parser: 6.0.16 + postcss: 8.4.47 + postcss-selector-parser: 6.1.2 - postcss-replace-overflow-wrap@4.0.0(postcss@8.4.44): + postcss-replace-overflow-wrap@4.0.0(postcss@8.4.47): dependencies: - postcss: 8.4.44 + postcss: 8.4.47 - postcss-safe-parser@6.0.0(postcss@8.4.44): + postcss-safe-parser@6.0.0(postcss@8.4.47): dependencies: - postcss: 8.4.44 + postcss: 8.4.47 - postcss-scss@4.0.9(postcss@8.4.44): + postcss-scss@4.0.9(postcss@8.4.47): dependencies: - postcss: 8.4.44 + postcss: 8.4.47 - postcss-selector-not@7.0.2(postcss@8.4.44): + postcss-selector-not@7.0.2(postcss@8.4.47): dependencies: - postcss: 8.4.44 - postcss-selector-parser: 6.0.16 + postcss: 8.4.47 + postcss-selector-parser: 6.1.2 - postcss-selector-parser@6.0.16: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - - postcss-selector-parser@6.1.0: + postcss-selector-parser@6.1.2: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 postcss-value-parser@4.2.0: {} - postcss@8.4.44: + postcss@8.4.47: dependencies: nanoid: 3.3.7 - picocolors: 1.0.1 - source-map-js: 1.2.0 + picocolors: 1.1.0 + source-map-js: 1.2.1 + + postgres-array@1.0.3: + optional: true postgres-array@2.0.0: {} @@ -8485,7 +8339,7 @@ snapshots: prelude-ls@1.2.1: {} - prettier-plugin-svelte@3.2.6(prettier@3.3.3)(svelte@5.0.0-next.175): + prettier-plugin-svelte@3.2.7(prettier@3.3.3)(svelte@5.0.0-next.175): dependencies: prettier: 3.3.3 svelte: 5.0.0-next.175 @@ -8522,15 +8376,15 @@ snapshots: radix-svelte@0.9.0(svelte@5.0.0-next.175): dependencies: - '@floating-ui/core': 1.6.1 - '@floating-ui/dom': 1.6.5 + '@floating-ui/core': 1.6.7 + '@floating-ui/dom': 1.6.10 svelte: 5.0.0-next.175 range-parser@1.2.1: {} - rate-limit-redis@4.2.0(express-rate-limit@7.3.1(express@4.19.2)): + rate-limit-redis@4.2.0(express-rate-limit@7.4.0(express@4.19.2)): dependencies: - express-rate-limit: 7.3.1(express@4.19.2) + express-rate-limit: 7.4.0(express@4.19.2) raw-body@2.5.2: dependencies: @@ -8555,6 +8409,9 @@ snapshots: dependencies: picomatch: 2.3.1 + readdirp@4.0.1: + optional: true + redis-errors@1.2.0: {} redis-parser@3.0.0: @@ -8580,7 +8437,7 @@ snapshots: resolve@1.22.8: dependencies: - is-core-module: 2.13.1 + is-core-module: 2.15.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -8594,48 +8451,26 @@ snapshots: dependencies: glob: 7.2.3 - rollup@4.18.1: + rollup@4.21.2: dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.18.1 - '@rollup/rollup-android-arm64': 4.18.1 - '@rollup/rollup-darwin-arm64': 4.18.1 - '@rollup/rollup-darwin-x64': 4.18.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.18.1 - '@rollup/rollup-linux-arm-musleabihf': 4.18.1 - '@rollup/rollup-linux-arm64-gnu': 4.18.1 - '@rollup/rollup-linux-arm64-musl': 4.18.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.18.1 - '@rollup/rollup-linux-riscv64-gnu': 4.18.1 - '@rollup/rollup-linux-s390x-gnu': 4.18.1 - '@rollup/rollup-linux-x64-gnu': 4.18.1 - '@rollup/rollup-linux-x64-musl': 4.18.1 - '@rollup/rollup-win32-arm64-msvc': 4.18.1 - '@rollup/rollup-win32-ia32-msvc': 4.18.1 - '@rollup/rollup-win32-x64-msvc': 4.18.1 - fsevents: 2.3.3 - - rollup@4.21.0: - dependencies: - '@types/estree': 1.0.5 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.21.0 - '@rollup/rollup-android-arm64': 4.21.0 - '@rollup/rollup-darwin-arm64': 4.21.0 - '@rollup/rollup-darwin-x64': 4.21.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.21.0 - '@rollup/rollup-linux-arm-musleabihf': 4.21.0 - '@rollup/rollup-linux-arm64-gnu': 4.21.0 - '@rollup/rollup-linux-arm64-musl': 4.21.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.21.0 - '@rollup/rollup-linux-riscv64-gnu': 4.21.0 - '@rollup/rollup-linux-s390x-gnu': 4.21.0 - '@rollup/rollup-linux-x64-gnu': 4.21.0 - '@rollup/rollup-linux-x64-musl': 4.21.0 - '@rollup/rollup-win32-arm64-msvc': 4.21.0 - '@rollup/rollup-win32-ia32-msvc': 4.21.0 - '@rollup/rollup-win32-x64-msvc': 4.21.0 + '@rollup/rollup-android-arm-eabi': 4.21.2 + '@rollup/rollup-android-arm64': 4.21.2 + '@rollup/rollup-darwin-arm64': 4.21.2 + '@rollup/rollup-darwin-x64': 4.21.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.21.2 + '@rollup/rollup-linux-arm-musleabihf': 4.21.2 + '@rollup/rollup-linux-arm64-gnu': 4.21.2 + '@rollup/rollup-linux-arm64-musl': 4.21.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.21.2 + '@rollup/rollup-linux-riscv64-gnu': 4.21.2 + '@rollup/rollup-linux-s390x-gnu': 4.21.2 + '@rollup/rollup-linux-x64-gnu': 4.21.2 + '@rollup/rollup-linux-x64-musl': 4.21.2 + '@rollup/rollup-win32-arm64-msvc': 4.21.2 + '@rollup/rollup-win32-ia32-msvc': 4.21.2 + '@rollup/rollup-win32-x64-msvc': 4.21.2 fsevents: 2.3.3 run-parallel@1.2.0: @@ -8657,50 +8492,19 @@ snapshots: mkdirp: 0.5.6 rimraf: 2.7.1 - sass@1.77.8: + sass@1.79.1: dependencies: - chokidar: 3.6.0 - immutable: 4.3.5 - source-map-js: 1.2.0 + chokidar: 4.0.1 + immutable: 4.3.7 + source-map-js: 1.2.1 + optional: true - satori-html@0.3.2: + schema-dts@1.1.2(typescript@5.6.2): dependencies: - ultrahtml: 1.5.3 - - satori@0.10.14: - dependencies: - '@shuding/opentype.js': 1.4.0-beta.0 - css-background-parser: 0.1.0 - css-box-shadow: 1.0.0-3 - css-to-react-native: 3.2.0 - emoji-regex: 10.3.0 - escape-html: 1.0.3 - linebreak: 1.1.0 - parse-css-color: 0.2.1 - postcss-value-parser: 4.2.0 - yoga-wasm-web: 0.3.3 - - satori@0.10.9: - dependencies: - '@shuding/opentype.js': 1.4.0-beta.0 - css-background-parser: 0.1.0 - css-box-shadow: 1.0.0-3 - css-to-react-native: 3.2.0 - emoji-regex: 10.3.0 - escape-html: 1.0.3 - linebreak: 1.1.0 - parse-css-color: 0.2.1 - postcss-value-parser: 4.2.0 - yoga-wasm-web: 0.3.3 - - schema-dts@1.1.2(typescript@5.5.4): - dependencies: - typescript: 5.5.4 + typescript: 5.6.2 semver@6.3.1: {} - semver@7.6.2: {} - semver@7.6.3: {} send@0.18.0: @@ -8732,7 +8536,7 @@ snapshots: set-blocking@2.0.0: {} - set-cookie-parser@2.6.0: {} + set-cookie-parser@2.7.0: {} set-function-length@1.2.2: dependencies: @@ -8745,31 +8549,31 @@ snapshots: setprototypeof@1.2.0: {} - sharp@0.33.4: + sharp@0.33.5: dependencies: color: 4.2.3 detect-libc: 2.0.3 - semver: 7.6.2 + semver: 7.6.3 optionalDependencies: - '@img/sharp-darwin-arm64': 0.33.4 - '@img/sharp-darwin-x64': 0.33.4 - '@img/sharp-libvips-darwin-arm64': 1.0.2 - '@img/sharp-libvips-darwin-x64': 1.0.2 - '@img/sharp-libvips-linux-arm': 1.0.2 - '@img/sharp-libvips-linux-arm64': 1.0.2 - '@img/sharp-libvips-linux-s390x': 1.0.2 - '@img/sharp-libvips-linux-x64': 1.0.2 - '@img/sharp-libvips-linuxmusl-arm64': 1.0.2 - '@img/sharp-libvips-linuxmusl-x64': 1.0.2 - '@img/sharp-linux-arm': 0.33.4 - '@img/sharp-linux-arm64': 0.33.4 - '@img/sharp-linux-s390x': 0.33.4 - '@img/sharp-linux-x64': 0.33.4 - '@img/sharp-linuxmusl-arm64': 0.33.4 - '@img/sharp-linuxmusl-x64': 0.33.4 - '@img/sharp-wasm32': 0.33.4 - '@img/sharp-win32-ia32': 0.33.4 - '@img/sharp-win32-x64': 0.33.4 + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-s390x': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-linuxmusl-arm64': 0.33.5 + '@img/sharp-linuxmusl-x64': 0.33.5 + '@img/sharp-wasm32': 0.33.5 + '@img/sharp-win32-ia32': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 shebang-command@2.0.0: dependencies: @@ -8802,14 +8606,14 @@ snapshots: slash@3.0.0: {} - sorcery@0.11.0: + sorcery@0.11.1: dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - buffer-crc32: 0.2.13 + '@jridgewell/sourcemap-codec': 1.5.0 + buffer-crc32: 1.0.0 minimist: 1.2.8 sander: 0.5.1 - source-map-js@1.2.0: {} + source-map-js@1.2.1: {} source-map-support@0.5.21: dependencies: @@ -8840,8 +8644,6 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - string.prototype.codepointat@0.2.1: {} - string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -8872,7 +8674,7 @@ snapshots: dependencies: '@jridgewell/gen-mapping': 0.3.5 commander: 4.1.1 - glob: 10.4.1 + glob: 10.4.5 lines-and-columns: 1.2.4 mz: 2.7.0 pirates: 4.0.6 @@ -8887,15 +8689,15 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte-check@3.8.6(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.44)(tsx@4.19.0))(postcss@8.4.44)(sass@1.77.8)(svelte@5.0.0-next.175): + svelte-check@3.8.6(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.1))(postcss@8.4.47)(sass@1.79.1)(svelte@5.0.0-next.175): dependencies: '@jridgewell/trace-mapping': 0.3.25 chokidar: 3.6.0 - picocolors: 1.0.0 + picocolors: 1.1.0 sade: 1.8.1 svelte: 5.0.0-next.175 - svelte-preprocess: 5.1.4(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.44)(tsx@4.19.0))(postcss@8.4.44)(sass@1.77.8)(svelte@5.0.0-next.175)(typescript@5.5.4) - typescript: 5.5.4 + svelte-preprocess: 5.1.4(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.1))(postcss@8.4.47)(sass@1.79.1)(svelte@5.0.0-next.175)(typescript@5.6.2) + typescript: 5.6.2 transitivePeerDependencies: - '@babel/core' - coffeescript @@ -8912,8 +8714,8 @@ snapshots: eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - postcss: 8.4.44 - postcss-scss: 4.0.9(postcss@8.4.44) + postcss: 8.4.47 + postcss-scss: 4.0.9(postcss@8.4.47) optionalDependencies: svelte: 5.0.0-next.175 @@ -8929,19 +8731,15 @@ snapshots: svelte-render: 2.0.1(svelte@5.0.0-next.175) svelte-subscribe: 2.0.1(svelte@5.0.0-next.175) - svelte-hmr@0.16.0(svelte@5.0.0-next.175): - dependencies: - svelte: 5.0.0-next.175 - svelte-keyed@2.0.0(svelte@5.0.0-next.175): dependencies: svelte: 5.0.0-next.175 svelte-lazy-loader@1.0.0: {} - svelte-meta-tags@3.1.4(svelte@5.0.0-next.175)(typescript@5.5.4): + svelte-meta-tags@3.1.4(svelte@5.0.0-next.175)(typescript@5.6.2): dependencies: - schema-dts: 1.1.2(typescript@5.5.4) + schema-dts: 1.1.2(typescript@5.6.2) svelte: 5.0.0-next.175 transitivePeerDependencies: - typescript @@ -8950,38 +8748,38 @@ snapshots: dependencies: svelte: 5.0.0-next.175 - svelte-preprocess@5.1.4(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.44)(tsx@4.19.0))(postcss@8.4.44)(sass@1.77.8)(svelte@5.0.0-next.175)(typescript@5.5.4): + svelte-preprocess@5.1.4(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.1))(postcss@8.4.47)(sass@1.79.1)(svelte@5.0.0-next.175)(typescript@5.6.2): dependencies: '@types/pug': 2.0.10 detect-indent: 6.1.0 - magic-string: 0.30.10 - sorcery: 0.11.0 + magic-string: 0.30.11 + sorcery: 0.11.1 strip-indent: 3.0.0 svelte: 5.0.0-next.175 optionalDependencies: - postcss: 8.4.44 - postcss-load-config: 5.1.0(jiti@1.21.6)(postcss@8.4.44)(tsx@4.19.0) - sass: 1.77.8 - typescript: 5.5.4 + postcss: 8.4.47 + postcss-load-config: 5.1.0(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.1) + sass: 1.79.1 + typescript: 5.6.2 - svelte-preprocess@6.0.2(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.44)(tsx@4.19.0))(postcss@8.4.44)(sass@1.77.8)(svelte@5.0.0-next.175)(typescript@5.5.4): + svelte-preprocess@6.0.3(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.1))(postcss@8.4.47)(sass@1.79.1)(svelte@5.0.0-next.175)(typescript@5.6.2): dependencies: svelte: 5.0.0-next.175 optionalDependencies: - postcss: 8.4.44 - postcss-load-config: 5.1.0(jiti@1.21.6)(postcss@8.4.44)(tsx@4.19.0) - sass: 1.77.8 - typescript: 5.5.4 + postcss: 8.4.47 + postcss-load-config: 5.1.0(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.1) + sass: 1.79.1 + typescript: 5.6.2 svelte-render@2.0.1(svelte@5.0.0-next.175): dependencies: svelte: 5.0.0-next.175 svelte-subscribe: 2.0.1(svelte@5.0.0-next.175) - svelte-sequential-preprocessor@2.0.1: + svelte-sequential-preprocessor@2.0.2: dependencies: - svelte: 4.2.18 - tslib: 2.6.3 + svelte: 4.2.19 + tslib: 2.7.0 svelte-subscribe@2.0.1(svelte@5.0.0-next.175): dependencies: @@ -8991,52 +8789,47 @@ snapshots: dependencies: svelte: 5.0.0-next.175 - svelte@4.2.18: + svelte@4.2.19: dependencies: '@ampproject/remapping': 2.3.0 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 '@types/estree': 1.0.5 - acorn: 8.11.3 + acorn: 8.12.1 aria-query: 5.3.0 - axobject-query: 4.0.0 + axobject-query: 4.1.0 code-red: 1.0.4 css-tree: 2.3.1 estree-walker: 3.0.3 is-reference: 3.0.2 locate-character: 3.0.0 - magic-string: 0.30.10 + magic-string: 0.30.11 periscopic: 3.1.0 svelte@5.0.0-next.175: dependencies: '@ampproject/remapping': 2.3.0 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@types/estree': 1.0.5 - acorn: 8.12.0 - acorn-typescript: 1.4.13(acorn@8.12.0) + acorn: 8.12.1 + acorn-typescript: 1.4.13(acorn@8.12.1) aria-query: 5.3.0 - axobject-query: 4.0.0 + axobject-query: 4.1.0 esm-env: 1.0.0 esrap: 1.2.2 is-reference: 3.0.2 locate-character: 3.0.0 - magic-string: 0.30.10 + magic-string: 0.30.11 zimmerframe: 1.1.2 - sveltekit-flash-message@2.4.4(@sveltejs/kit@2.5.25(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)))(svelte@5.0.0-next.175): + sveltekit-flash-message@2.4.4(@sveltejs/kit@2.6.1(@sveltejs/vite-plugin-svelte@4.0.0-next.7(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)))(svelte@5.0.0-next.175): dependencies: - '@sveltejs/kit': 2.5.25(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)) + '@sveltejs/kit': 2.6.1(@sveltejs/vite-plugin-svelte@4.0.0-next.7(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)) svelte: 5.0.0-next.175 - sveltekit-rate-limiter@0.5.2(@sveltejs/kit@2.5.25(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8))): + sveltekit-superforms@2.19.0(@sveltejs/kit@2.6.1(@sveltejs/vite-plugin-svelte@4.0.0-next.7(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)))(@types/json-schema@7.0.15)(svelte@5.0.0-next.175): dependencies: - '@isaacs/ttlcache': 1.4.1 - '@sveltejs/kit': 2.5.25(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)) - - sveltekit-superforms@2.17.0(@sveltejs/kit@2.5.25(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)))(svelte@5.0.0-next.175): - dependencies: - '@sveltejs/kit': 2.5.25(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)) + '@sveltejs/kit': 2.6.1(@sveltejs/vite-plugin-svelte@4.0.0-next.7(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)))(svelte@5.0.0-next.175)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)) devalue: 5.0.0 just-clone: 6.2.0 memoize-weak: 1.0.2 @@ -9047,30 +8840,34 @@ snapshots: '@gcornut/valibot-json-schema': 0.31.0 '@sinclair/typebox': 0.32.35 '@sodaru/yup-to-json-schema': 2.0.1 + '@typeschema/class-validator': 0.2.0(@types/json-schema@7.0.15)(class-validator@0.14.1) '@vinejs/vine': 1.8.0 - arktype: 2.0.0-beta.0 + arktype: 2.0.0-rc.8 + class-validator: 0.14.1 joi: 17.13.3 - json-schema-to-ts: 3.1.0 + json-schema-to-ts: 3.1.1 superstruct: 2.0.2 valibot: 0.35.0 yup: 1.4.0 zod: 3.23.8 - zod-to-json-schema: 3.23.2(zod@3.23.8) + zod-to-json-schema: 3.23.3(zod@3.23.8) + transitivePeerDependencies: + - '@types/json-schema' tabbable@6.2.0: {} tailwind-merge@2.5.2: {} - tailwind-variants@0.2.1(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.3)(typescript@5.5.4))): + tailwind-variants@0.2.1(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2))): dependencies: tailwind-merge: 2.5.2 - tailwindcss: 3.4.10(ts-node@10.9.2(@types/node@20.16.3)(typescript@5.5.4)) + tailwindcss: 3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2)) - tailwindcss-animate@1.0.7(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.3)(typescript@5.5.4))): + tailwindcss-animate@1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2))): dependencies: - tailwindcss: 3.4.10(ts-node@10.9.2(@types/node@20.16.3)(typescript@5.5.4)) + tailwindcss: 3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2)) - tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.3)(typescript@5.5.4)): + tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -9080,18 +8877,18 @@ snapshots: fast-glob: 3.3.2 glob-parent: 6.0.2 is-glob: 4.0.3 - jiti: 1.21.3 + jiti: 1.21.6 lilconfig: 2.1.0 - micromatch: 4.0.7 + micromatch: 4.0.8 normalize-path: 3.0.0 object-hash: 3.0.0 - picocolors: 1.0.1 - postcss: 8.4.44 - postcss-import: 15.1.0(postcss@8.4.44) - postcss-js: 4.0.1(postcss@8.4.44) - postcss-load-config: 4.0.2(postcss@8.4.44)(ts-node@10.9.2(@types/node@20.16.3)(typescript@5.5.4)) - postcss-nested: 6.0.1(postcss@8.4.44) - postcss-selector-parser: 6.1.0 + picocolors: 1.1.0 + postcss: 8.4.47 + postcss-import: 15.1.0(postcss@8.4.47) + postcss-js: 4.0.1(postcss@8.4.47) + postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2)) + postcss-nested: 6.2.0(postcss@8.4.47) + postcss-selector-parser: 6.1.2 resolve: 1.22.8 sucrase: 3.35.0 transitivePeerDependencies: @@ -9124,9 +8921,7 @@ snapshots: globalyzer: 0.1.0 globrex: 0.1.2 - tiny-inflate@1.0.3: {} - - tinybench@2.8.0: {} + tinybench@2.9.0: {} tinypool@0.8.4: {} @@ -9148,29 +8943,29 @@ snapshots: ts-algebra@2.0.0: optional: true - ts-api-utils@1.3.0(typescript@5.5.4): + ts-api-utils@1.3.0(typescript@5.6.2): dependencies: - typescript: 5.5.4 + typescript: 5.6.2 ts-deepmerge@7.0.1: {} ts-interface-checker@0.1.13: {} - ts-node@10.9.2(@types/node@20.16.3)(typescript@5.5.4): + ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.16.3 - acorn: 8.11.3 - acorn-walk: 8.3.2 + '@types/node': 20.16.10 + acorn: 8.12.1 + acorn-walk: 8.3.3 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.5.4 + typescript: 5.6.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 @@ -9179,14 +8974,12 @@ snapshots: tslib@2.4.0: optional: true - tslib@2.6.3: {} - tslib@2.7.0: {} - tsx@4.19.0: + tsx@4.19.1: dependencies: - esbuild: 0.23.0 - get-tsconfig: 4.7.5 + esbuild: 0.23.1 + get-tsconfig: 4.8.0 optionalDependencies: fsevents: 2.3.3 @@ -9198,7 +8991,7 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-detect@4.0.8: {} + type-detect@4.1.0: {} type-fest@0.20.2: {} @@ -9210,37 +9003,24 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 - typescript@5.5.4: {} + typescript@5.6.2: {} - ufo@1.5.3: {} + ufo@1.5.4: {} - uglify-js@3.19.1: + uglify-js@3.19.3: optional: true - ultrahtml@1.5.3: {} - - undici-types@6.19.6: {} + undici-types@6.19.8: {} unfetch@4.2.0: {} - unicode-trie@2.0.0: - dependencies: - pako: 0.2.9 - tiny-inflate: 1.0.3 - unpipe@1.0.0: {} - update-browserslist-db@1.1.0(browserslist@4.23.1): - dependencies: - browserslist: 4.23.1 - escalade: 3.1.2 - picocolors: 1.0.1 - update-browserslist-db@1.1.0(browserslist@4.23.3): dependencies: browserslist: 4.23.3 - escalade: 3.1.2 - picocolors: 1.0.1 + escalade: 3.2.0 + picocolors: 1.1.0 uri-js@4.4.1: dependencies: @@ -9265,20 +9045,21 @@ snapshots: vary@1.1.2: {} - vite-imagetools@7.0.2(rollup@4.18.1): + vite-imagetools@7.0.4(rollup@4.21.2): dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.18.1) - imagetools-core: 7.0.0 + '@rollup/pluginutils': 5.1.0(rollup@4.21.2) + imagetools-core: 7.0.1 + sharp: 0.33.5 transitivePeerDependencies: - rollup - vite-node@1.6.0(@types/node@20.16.3)(sass@1.77.8): + vite-node@1.6.0(@types/node@20.16.10)(sass@1.79.1): dependencies: cac: 6.7.14 - debug: 4.3.4 + debug: 4.3.6 pathe: 1.1.2 - picocolors: 1.0.0 - vite: 5.4.3(@types/node@20.16.3)(sass@1.77.8) + picocolors: 1.1.0 + vite: 5.4.8(@types/node@20.16.10)(sass@1.79.1) transitivePeerDependencies: - '@types/node' - less @@ -9290,44 +9071,44 @@ snapshots: - supports-color - terser - vite@5.4.3(@types/node@20.16.3)(sass@1.77.8): + vite@5.4.8(@types/node@20.16.10)(sass@1.79.1): dependencies: esbuild: 0.21.5 - postcss: 8.4.44 - rollup: 4.21.0 + postcss: 8.4.47 + rollup: 4.21.2 optionalDependencies: - '@types/node': 20.16.3 + '@types/node': 20.16.10 fsevents: 2.3.3 - sass: 1.77.8 + sass: 1.79.1 - vitefu@0.2.5(vite@5.4.3(@types/node@20.16.3)(sass@1.77.8)): + vitefu@1.0.2(vite@5.4.8(@types/node@20.16.10)(sass@1.79.1)): optionalDependencies: - vite: 5.4.3(@types/node@20.16.3)(sass@1.77.8) + vite: 5.4.8(@types/node@20.16.10)(sass@1.79.1) - vitest@1.6.0(@types/node@20.16.3)(sass@1.77.8): + vitest@1.6.0(@types/node@20.16.10)(sass@1.79.1): dependencies: '@vitest/expect': 1.6.0 '@vitest/runner': 1.6.0 '@vitest/snapshot': 1.6.0 '@vitest/spy': 1.6.0 '@vitest/utils': 1.6.0 - acorn-walk: 8.3.2 - chai: 4.4.1 - debug: 4.3.4 + acorn-walk: 8.3.3 + chai: 4.5.0 + debug: 4.3.6 execa: 8.0.1 local-pkg: 0.5.0 - magic-string: 0.30.10 + magic-string: 0.30.11 pathe: 1.1.2 - picocolors: 1.0.0 + picocolors: 1.1.0 std-env: 3.7.0 strip-literal: 2.1.0 - tinybench: 2.8.0 + tinybench: 2.9.0 tinypool: 0.8.4 - vite: 5.4.3(@types/node@20.16.3)(sass@1.77.8) - vite-node: 1.6.0(@types/node@20.16.3)(sass@1.77.8) - why-is-node-running: 2.2.2 + vite: 5.4.8(@types/node@20.16.10)(sass@1.79.1) + vite-node: 1.6.0(@types/node@20.16.10)(sass@1.79.1) + why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 20.16.3 + '@types/node': 20.16.10 transitivePeerDependencies: - less - lightningcss @@ -9351,7 +9132,7 @@ snapshots: dependencies: isexe: 2.0.0 - why-is-node-running@2.2.2: + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 stackback: 0.0.2 @@ -9392,11 +9173,7 @@ snapshots: yaml@1.10.2: {} - yaml@2.4.2: {} - - yaml@2.4.3: {} - - yaml@2.5.0: {} + yaml@2.5.1: {} yargs-parser@18.1.3: dependencies: @@ -9421,9 +9198,7 @@ snapshots: yocto-queue@0.1.0: {} - yocto-queue@1.0.0: {} - - yoga-wasm-web@0.3.3: {} + yocto-queue@1.1.1: {} yup@1.4.0: dependencies: @@ -9435,7 +9210,7 @@ snapshots: zimmerframe@1.1.2: {} - zod-to-json-schema@3.23.2(zod@3.23.8): + zod-to-json-schema@3.23.3(zod@3.23.8): dependencies: zod: 3.23.8 diff --git a/src/lib/components/Header.svelte b/src/lib/components/Header.svelte index 5768ad5..4b3a06b 100644 --- a/src/lib/components/Header.svelte +++ b/src/lib/components/Header.svelte @@ -1,20 +1,15 @@
@@ -28,39 +23,48 @@ +
+ +{#snippet userDropdown()} + + + + + {avatar} + + + + + + Account + + + + + Settings + + + + + + Collections + + + + + + Wishlists + + + + { return async ({ result }) => { console.log(result); if (result.type === 'success' || result.type === 'redirect') { @@ -76,26 +80,21 @@ await applyAction(result); }; }} - action="/logout" - method="POST" - > - - - - - - - {:else} - Login - Sign Up - {/if} - - + action="/logout" + method="POST" + > + + + + + + +{/snippet} `); - - const svg = await satori(markup, { - fonts: [ - { - name: 'Fira Sans', - data: await fontData, - style: 'normal' - } - ], - height: +height, - width: +width - }); - - const resvg = new Resvg(svg, { - fitTo: { - mode: 'width', - value: +width - } - }); - - const image = resvg.render(); - - return new Response(image.asPng(), { - headers: { - 'content-type': 'image/png', - 'cache-control': dev ? 'no-cache, no-store' : 'public, immutable, no-transform, max-age=86400' - } - }); -} \ No newline at end of file diff --git a/src/lib/server/api/common/config.ts b/src/lib/server/api/common/config.ts new file mode 100644 index 0000000..0daf6d4 --- /dev/null +++ b/src/lib/server/api/common/config.ts @@ -0,0 +1,36 @@ +import env from './env' +import type { Config } from './types/config' + +const isPreview = process.env.VERCEL_ENV === 'preview' || process.env.VERCEL_ENV === 'development' + +let domain: string +if (process.env.NODE_ENV === 'production' || process.env.VERCEL_ENV === 'production') { + domain = 'boredgame.vercel.app' +} else if (isPreview && process.env.VERCEL_BRANCH_URL !== undefined) { + domain = process.env.VERCEL_BRANCH_URL +} else { + domain = 'localhost' +} + +// export const config = { ...env, isProduction: process.env.NODE_ENV === 'production' +// || process.env.VERCEL_ENV === 'production', domain }; + +export const config: Config = { + isProduction: process.env.NODE_ENV === 'production' || process.env.VERCEL_ENV === 'production', + domain, + api: { + origin: env.ORIGIN, + }, + redis: { + url: env.REDIS_URL, + }, + postgres: { + user: env.DATABASE_USER, + password: env.DATABASE_PASSWORD, + host: env.DATABASE_HOST, + port: env.DATABASE_PORT, + database: env.DATABASE_DB, + ssl: env.DATABASE_HOST !== 'localhost', + max: env.DB_MIGRATING || env.DB_SEEDING ? 1 : undefined, + }, +} diff --git a/src/env.ts b/src/lib/server/api/common/env.ts similarity index 89% rename from src/env.ts rename to src/lib/server/api/common/env.ts index fd60759..5dd1157 100644 --- a/src/env.ts +++ b/src/lib/server/api/common/env.ts @@ -10,8 +10,6 @@ const stringBoolean = z.coerce .default('false') const EnvSchema = z.object({ - ADMIN_USERNAME: z.string(), - ADMIN_PASSWORD: z.string(), DATABASE_USER: z.string(), DATABASE_PASSWORD: z.string(), DATABASE_HOST: z.string(), @@ -19,6 +17,10 @@ const EnvSchema = z.object({ DATABASE_DB: z.string(), DB_MIGRATING: stringBoolean, DB_SEEDING: stringBoolean, + GITHUB_CLIENT_ID: z.string(), + GITHUB_CLIENT_SECRET: z.string(), + GOOGLE_CLIENT_ID: z.string(), + GOOGLE_CLIENT_SECRET: z.string(), NODE_ENV: z.string().default('development'), ORIGIN: z.string(), PUBLIC_SITE_NAME: z.string(), diff --git a/src/lib/server/api/common/exceptions.ts b/src/lib/server/api/common/exceptions.ts index fee54c4..cbda928 100644 --- a/src/lib/server/api/common/exceptions.ts +++ b/src/lib/server/api/common/exceptions.ts @@ -1,26 +1,26 @@ -import { StatusCodes } from '$lib/constants/status-codes'; -import { HTTPException } from 'hono/http-exception'; +import { StatusCodes } from '$lib/constants/status-codes' +import { HTTPException } from 'hono/http-exception' -export function TooManyRequests(message: string = 'Too many requests') { - return new HTTPException(StatusCodes.TOO_MANY_REQUESTS, { message }); +export function TooManyRequests(message = 'Too many requests') { + return new HTTPException(StatusCodes.TOO_MANY_REQUESTS, { message }) } -export function Forbidden(message: string = 'Forbidden') { - return new HTTPException(StatusCodes.FORBIDDEN, { message }); +export function Forbidden(message = 'Forbidden') { + return new HTTPException(StatusCodes.FORBIDDEN, { message }) } -export function Unauthorized(message: string = 'Unauthorized') { - return new HTTPException(StatusCodes.UNAUTHORIZED, { message }); +export function Unauthorized(message = 'Unauthorized') { + return new HTTPException(StatusCodes.UNAUTHORIZED, { message }) } -export function NotFound(message: string = 'Not Found') { - return new HTTPException(StatusCodes.NOT_FOUND, { message }); +export function NotFound(message = 'Not Found') { + return new HTTPException(StatusCodes.NOT_FOUND, { message }) } -export function BadRequest(message: string = 'Bad Request') { - return new HTTPException(StatusCodes.BAD_REQUEST, { message }); +export function BadRequest(message = 'Bad Request') { + return new HTTPException(StatusCodes.BAD_REQUEST, { message }) } -export function InternalError(message: string = 'Internal Error') { - return new HTTPException(StatusCodes.INTERNAL_SERVER_ERROR, { message }); +export function InternalError(message = 'Internal Error') { + return new HTTPException(StatusCodes.INTERNAL_SERVER_ERROR, { message }) } diff --git a/src/lib/server/api/common/interfaces/controller.interface.ts b/src/lib/server/api/common/interfaces/controller.interface.ts deleted file mode 100644 index 7bb91a2..0000000 --- a/src/lib/server/api/common/interfaces/controller.interface.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Hono } from 'hono' -import type { BlankSchema } from 'hono/types' -import type { HonoTypes } from '../../types' - -export interface Controller { - controller: Hono - routes(): any -} diff --git a/src/lib/server/api/common/interfaces/repository.interface.ts b/src/lib/server/api/common/interfaces/repository.interface.ts deleted file mode 100644 index fc96e24..0000000 --- a/src/lib/server/api/common/interfaces/repository.interface.ts +++ /dev/null @@ -1,5 +0,0 @@ -import type { DatabaseProvider } from '$lib/server/api/providers/database.provider' - -export interface Repository { - trxHost(trx: DatabaseProvider): any -} diff --git a/src/lib/server/api/common/types/async-service.ts b/src/lib/server/api/common/types/async-service.ts new file mode 100644 index 0000000..868e17e --- /dev/null +++ b/src/lib/server/api/common/types/async-service.ts @@ -0,0 +1,3 @@ +export abstract class AsyncService { + async init(): Promise {} +} diff --git a/src/lib/server/api/common/types/config.ts b/src/lib/server/api/common/types/config.ts new file mode 100644 index 0000000..1d7e7c2 --- /dev/null +++ b/src/lib/server/api/common/types/config.ts @@ -0,0 +1,33 @@ +export interface Config { + isProduction: boolean + domain: string + api: ApiConfig + // storage: StorageConfig + redis: RedisConfig + postgres: PostgresConfig +} + +interface ApiConfig { + origin: string +} + +// interface StorageConfig { +// accessKey: string +// secretKey: string +// bucket: string +// url: string +// } + +interface RedisConfig { + url: string +} + +interface PostgresConfig { + user: string + password: string + host: string + port: number + database: string + ssl: boolean + max: number | undefined +} diff --git a/src/lib/server/api/common/types/controller.ts b/src/lib/server/api/common/types/controller.ts new file mode 100644 index 0000000..fd77884 --- /dev/null +++ b/src/lib/server/api/common/types/controller.ts @@ -0,0 +1,11 @@ +import { Hono } from 'hono' +import type { BlankSchema } from 'hono/types' +import type { HonoTypes } from './hono' + +export abstract class Controller { + protected readonly controller: Hono + constructor() { + this.controller = new Hono() + } + abstract routes(): Hono +} diff --git a/src/lib/server/api/common/interfaces/email.interface.ts b/src/lib/server/api/common/types/email.ts similarity index 100% rename from src/lib/server/api/common/interfaces/email.interface.ts rename to src/lib/server/api/common/types/email.ts diff --git a/src/lib/server/api/types/index.ts b/src/lib/server/api/common/types/hono.ts similarity index 100% rename from src/lib/server/api/types/index.ts rename to src/lib/server/api/common/types/hono.ts diff --git a/src/lib/server/api/common/types/oauth.ts b/src/lib/server/api/common/types/oauth.ts new file mode 100644 index 0000000..60e8bbd --- /dev/null +++ b/src/lib/server/api/common/types/oauth.ts @@ -0,0 +1,11 @@ +export type OAuthUser = { + sub: string; + given_name?: string; + family_name?: string; + picture?: string; + username: string; + email?: string; + email_verified?: boolean; +} + +export type OAuthProviders = 'github' | 'google' | 'apple' \ No newline at end of file diff --git a/src/lib/server/api/common/utils/repository.utils.ts b/src/lib/server/api/common/utils/repository.ts similarity index 100% rename from src/lib/server/api/common/utils/repository.utils.ts rename to src/lib/server/api/common/utils/repository.ts diff --git a/src/lib/server/api/common/utils/table.utils.ts b/src/lib/server/api/common/utils/table.ts similarity index 100% rename from src/lib/server/api/common/utils/table.utils.ts rename to src/lib/server/api/common/utils/table.ts diff --git a/src/lib/server/api/configs/config.ts b/src/lib/server/api/configs/config.ts deleted file mode 100644 index 35d0ae9..0000000 --- a/src/lib/server/api/configs/config.ts +++ /dev/null @@ -1,15 +0,0 @@ -import env from '../../../../env'; - -const isPreview = process.env.VERCEL_ENV === 'preview' || process.env.VERCEL_ENV === 'development'; - -let domain: string; -if (process.env.NODE_ENV === 'production' || process.env.VERCEL_ENV === 'production') { - domain = 'boredgame.vercel.app'; -} else if (isPreview && process.env.VERCEL_BRANCH_URL !== undefined) { - domain = process.env.VERCEL_BRANCH_URL; -} else { - domain = 'localhost'; -} - -export const config = { ...env, isProduction: process.env.NODE_ENV === 'production' - || process.env.VERCEL_ENV === 'production', domain }; diff --git a/src/lib/server/api/controllers/collection.controller.ts b/src/lib/server/api/controllers/collection.controller.ts index 169e6b5..5cc94cd 100644 --- a/src/lib/server/api/controllers/collection.controller.ts +++ b/src/lib/server/api/controllers/collection.controller.ts @@ -1,16 +1,14 @@ import 'reflect-metadata' -import type { Controller } from '$lib/server/api/common/interfaces/controller.interface' +import { Controller } from '$lib/server/api/common/types/controller' import { CollectionsService } from '$lib/server/api/services/collections.service' -import { Hono } from 'hono' import { inject, injectable } from 'tsyringe' -import { requireAuth } from '../middleware/auth.middleware' -import type { HonoTypes } from '../types' +import { requireAuth } from '../middleware/require-auth.middleware' @injectable() -export class CollectionController implements Controller { - controller = new Hono() - - constructor(@inject(CollectionsService) private readonly collectionsService: CollectionsService) {} +export class CollectionController extends Controller { + constructor(@inject(CollectionsService) private readonly collectionsService: CollectionsService) { + super() + } routes() { return this.controller @@ -20,6 +18,11 @@ export class CollectionController implements Controller { console.log('collections service', collections) return c.json({ collections }) }) + .get('/count', requireAuth, async (c) => { + const user = c.var.user + const collections = await this.collectionsService.findAllByUserIdWithDetails(user.id) + return c.json({ collections }) + }) .get('/:cuid', requireAuth, async (c) => { const cuid = c.req.param('cuid') const collection = await this.collectionsService.findOneByCuid(cuid) diff --git a/src/lib/server/api/controllers/iam.controller.ts b/src/lib/server/api/controllers/iam.controller.ts index df28fb0..0d2010c 100644 --- a/src/lib/server/api/controllers/iam.controller.ts +++ b/src/lib/server/api/controllers/iam.controller.ts @@ -1,26 +1,27 @@ import { StatusCodes } from '$lib/constants/status-codes' -import type { Controller } from '$lib/server/api/common/interfaces/controller.interface' +import { Controller } from '$lib/server/api/common/types/controller' +import { changePasswordDto } from '$lib/server/api/dtos/change-password.dto' import { updateEmailDto } from '$lib/server/api/dtos/update-email.dto' import { updateProfileDto } from '$lib/server/api/dtos/update-profile.dto' import { verifyPasswordDto } from '$lib/server/api/dtos/verify-password.dto' import { limiter } from '$lib/server/api/middleware/rate-limiter.middleware' -import { LuciaProvider } from '$lib/server/api/providers/lucia.provider' import { IamService } from '$lib/server/api/services/iam.service' +import { LoginRequestsService } from '$lib/server/api/services/loginrequest.service' +import { LuciaService } from '$lib/server/api/services/lucia.service' import { zValidator } from '@hono/zod-validator' -import { Hono } from 'hono' import { setCookie } from 'hono/cookie' import { inject, injectable } from 'tsyringe' -import { requireAuth } from '../middleware/auth.middleware' -import type { HonoTypes } from '../types' +import { requireAuth } from '../middleware/require-auth.middleware' @injectable() -export class IamController implements Controller { - controller = new Hono() - +export class IamController extends Controller { constructor( @inject(IamService) private readonly iamService: IamService, - @inject(LuciaProvider) private lucia: LuciaProvider, - ) {} + @inject(LoginRequestsService) private readonly loginRequestService: LoginRequestsService, + @inject(LuciaService) private luciaService: LuciaService, + ) { + super() + } routes() { return this.controller @@ -47,6 +48,32 @@ export class IamController implements Controller { } return c.json({}, StatusCodes.OK) }) + .put('/update/password', requireAuth, zValidator('json', changePasswordDto), limiter({ limit: 10, minutes: 60 }), async (c) => { + const user = c.var.user + const { password, confirm_password } = c.req.valid('json') + if (password !== confirm_password) { + return c.json('Passwords do not match', StatusCodes.BAD_REQUEST) + } + try { + await this.iamService.updatePassword(user.id, { password, confirm_password }) + await this.luciaService.lucia.invalidateUserSessions(user.id) + await this.loginRequestService.createUserSession(user.id, c.req, undefined) + const sessionCookie = this.luciaService.lucia.createBlankSessionCookie() + setCookie(c, sessionCookie.name, sessionCookie.value, { + path: sessionCookie.attributes.path, + maxAge: sessionCookie.attributes.maxAge, + domain: sessionCookie.attributes.domain, + sameSite: sessionCookie.attributes.sameSite as any, + secure: sessionCookie.attributes.secure, + httpOnly: sessionCookie.attributes.httpOnly, + expires: sessionCookie.attributes.expires, + }) + return c.json({ status: 'success' }) + } catch (error) { + console.error('Error updating password', error) + return c.json('Error updating password', StatusCodes.BAD_REQUEST) + } + }) .post('/update/email', requireAuth, zValidator('json', updateEmailDto), limiter({ limit: 10, minutes: 60 }), async (c) => { const user = c.var.user const { email } = c.req.valid('json') @@ -59,7 +86,7 @@ export class IamController implements Controller { .post('/logout', requireAuth, async (c) => { const sessionId = c.var.session.id await this.iamService.logout(sessionId) - const sessionCookie = this.lucia.createBlankSessionCookie() + const sessionCookie = this.luciaService.lucia.createBlankSessionCookie() setCookie(c, sessionCookie.name, sessionCookie.value, { path: sessionCookie.attributes.path, maxAge: sessionCookie.attributes.maxAge, diff --git a/src/lib/server/api/controllers/login.controller.ts b/src/lib/server/api/controllers/login.controller.ts index df9ed50..ea12bf3 100644 --- a/src/lib/server/api/controllers/login.controller.ts +++ b/src/lib/server/api/controllers/login.controller.ts @@ -1,30 +1,28 @@ import 'reflect-metadata' -import type { Controller } from '$lib/server/api/common/interfaces/controller.interface' +import { Controller } from '$lib/server/api/common/types/controller' import { signinUsernameDto } from '$lib/server/api/dtos/signin-username.dto' -import { LuciaProvider } from '$lib/server/api/providers/lucia.provider' +import { LuciaService } from '$lib/server/api/services/lucia.service' import { zValidator } from '@hono/zod-validator' -import { Hono } from 'hono' import { setCookie } from 'hono/cookie' import { TimeSpan } from 'oslo' import { inject, injectable } from 'tsyringe' import { limiter } from '../middleware/rate-limiter.middleware' import { LoginRequestsService } from '../services/loginrequest.service' -import type { HonoTypes } from '../types' @injectable() -export class LoginController implements Controller { - controller = new Hono() - +export class LoginController extends Controller { constructor( @inject(LoginRequestsService) private readonly loginRequestsService: LoginRequestsService, - @inject(LuciaProvider) private lucia: LuciaProvider, - ) {} + @inject(LuciaService) private luciaService: LuciaService, + ) { + super() + } routes() { return this.controller.post('/', zValidator('json', signinUsernameDto), limiter({ limit: 10, minutes: 60 }), async (c) => { const { username, password } = c.req.valid('json') const session = await this.loginRequestsService.verify({ username, password }, c.req) - const sessionCookie = this.lucia.createSessionCookie(session.id) + const sessionCookie = this.luciaService.lucia.createSessionCookie(session.id) console.log('set cookie', sessionCookie) setCookie(c, sessionCookie.name, sessionCookie.value, { path: sessionCookie.attributes.path, diff --git a/src/lib/server/api/controllers/mfa.controller.ts b/src/lib/server/api/controllers/mfa.controller.ts index 9285b79..b08b8c1 100644 --- a/src/lib/server/api/controllers/mfa.controller.ts +++ b/src/lib/server/api/controllers/mfa.controller.ts @@ -1,27 +1,24 @@ import 'reflect-metadata' import { StatusCodes } from '$lib/constants/status-codes' -import type { Controller } from '$lib/server/api/common/interfaces/controller.interface' +import { Controller } from '$lib/server/api/common/types/controller' import { verifyTotpDto } from '$lib/server/api/dtos/verify-totp.dto' -import { db } from '$lib/server/api/packages/drizzle' import { RecoveryCodesService } from '$lib/server/api/services/recovery-codes.service' import { TotpService } from '$lib/server/api/services/totp.service' import { UsersService } from '$lib/server/api/services/users.service' import { zValidator } from '@hono/zod-validator' -import { Hono } from 'hono' import { inject, injectable } from 'tsyringe' import { CredentialsType } from '../databases/tables' -import { requireAuth } from '../middleware/auth.middleware' -import type { HonoTypes } from '../types' +import { requireAuth } from '../middleware/require-auth.middleware' @injectable() -export class MfaController implements Controller { - controller = new Hono() - +export class MfaController extends Controller { constructor( @inject(RecoveryCodesService) private readonly recoveryCodesService: RecoveryCodesService, @inject(TotpService) private readonly totpService: TotpService, @inject(UsersService) private readonly usersService: UsersService, - ) {} + ) { + super() + } routes() { return this.controller @@ -52,8 +49,9 @@ export class MfaController implements Controller { const user = c.var.user // You can only view recovery codes once and that is on creation const existingCodes = await this.recoveryCodesService.findAllRecoveryCodesByUserId(user.id) - if (existingCodes) { - return c.body('You have already generated recovery codes', StatusCodes.BAD_REQUEST) + if (existingCodes && existingCodes.length > 0) { + console.log('Recovery Codes found', existingCodes) + return c.json({ recoveryCodes: existingCodes }) } const recoveryCodes = await this.recoveryCodesService.createRecoveryCodes(user.id) return c.json({ recoveryCodes }) diff --git a/src/lib/server/api/controllers/oauth.controller.ts b/src/lib/server/api/controllers/oauth.controller.ts new file mode 100644 index 0000000..6a542d0 --- /dev/null +++ b/src/lib/server/api/controllers/oauth.controller.ts @@ -0,0 +1,150 @@ +import 'reflect-metadata' +import { Controller } from '$lib/server/api/common/types/controller' +import { LuciaService } from '$lib/server/api/services/lucia.service' +import { OAuthService } from '$lib/server/api/services/oauth.service' +import { github, google } from '$lib/server/auth' +import { OAuth2RequestError } from 'arctic' +import { getCookie, setCookie } from 'hono/cookie' +import { TimeSpan } from 'oslo' +import { inject, injectable } from 'tsyringe' +import type {OAuthUser} from "$lib/server/api/common/types/oauth"; + +@injectable() +export class OAuthController extends Controller { + constructor( + @inject(LuciaService) private luciaService: LuciaService, + @inject(OAuthService) private oauthService: OAuthService, + ) { + super() + } + + routes() { + return this.controller + .get('/github', async (c) => { + try { + const code = c.req.query('code')?.toString() ?? null + const state = c.req.query('state')?.toString() ?? null + const storedState = getCookie(c).github_oauth_state ?? null + + if (!code || !state || !storedState || state !== storedState) { + return c.body(null, 400) + } + + const tokens = await github.validateAuthorizationCode(code) + const githubUserResponse = await fetch('https://api.github.com/user', { + headers: { + Authorization: `Bearer ${tokens.accessToken}`, + }, + }) + const githubUser: GitHubUser = await githubUserResponse.json() + + const oAuthUser: OAuthUser = { + sub: `${githubUser.id}`, + username: githubUser.login, + email: undefined + } + + const userId = await this.oauthService.handleOAuthUser(oAuthUser, 'github') + + const session = await this.luciaService.lucia.createSession(userId, {}) + const sessionCookie = this.luciaService.lucia.createSessionCookie(session.id) + + setCookie(c, sessionCookie.name, sessionCookie.value, { + path: sessionCookie.attributes.path, + maxAge: + sessionCookie?.attributes?.maxAge && sessionCookie?.attributes?.maxAge < new TimeSpan(365, 'd').seconds() + ? sessionCookie.attributes.maxAge + : new TimeSpan(2, 'w').seconds(), + domain: sessionCookie.attributes.domain, + sameSite: sessionCookie.attributes.sameSite as any, + secure: sessionCookie.attributes.secure, + httpOnly: sessionCookie.attributes.httpOnly, + expires: sessionCookie.attributes.expires, + }) + + return c.json({ message: 'ok' }) + } catch (error) { + console.error(error) + // the specific error message depends on the provider + if (error instanceof OAuth2RequestError) { + // invalid code + return c.body(null, 400) + } + return c.body(null, 500) + } + }) + .get('/google', async (c) => { + try { + const code = c.req.query('code')?.toString() ?? null + const state = c.req.query('state')?.toString() ?? null + const storedState = getCookie(c).google_oauth_state ?? null + const storedCodeVerifier = getCookie(c).google_oauth_code_verifier ?? null + + if (!code || !storedState || !storedCodeVerifier || state !== storedState) { + return c.body(null, 400) + } + + const tokens = await google.validateAuthorizationCode(code, storedCodeVerifier) + const googleUserResponse = await fetch("https://openidconnect.googleapis.com/v1/userinfo", { + headers: { + Authorization: `Bearer ${tokens.accessToken}`, + }, + }) + const googleUser: GoogleUser = await googleUserResponse.json() + + const oAuthUser: OAuthUser = { + sub: googleUser.sub, + given_name: googleUser.given_name, + family_name: googleUser.family_name, + picture: googleUser.picture, + username: googleUser.email, + email: googleUser.email, + email_verified: googleUser.email_verified, + } + + const userId = await this.oauthService.handleOAuthUser(oAuthUser, 'google') + + const session = await this.luciaService.lucia.createSession(userId, {}) + const sessionCookie = this.luciaService.lucia.createSessionCookie(session.id) + + setCookie(c, sessionCookie.name, sessionCookie.value, { + path: sessionCookie.attributes.path, + maxAge: + sessionCookie?.attributes?.maxAge && sessionCookie?.attributes?.maxAge < new TimeSpan(365, 'd').seconds() + ? sessionCookie.attributes.maxAge + : new TimeSpan(2, 'w').seconds(), + domain: sessionCookie.attributes.domain, + sameSite: sessionCookie.attributes.sameSite as any, + secure: sessionCookie.attributes.secure, + httpOnly: sessionCookie.attributes.httpOnly, + expires: sessionCookie.attributes.expires, + }) + + return c.json({ message: 'ok' }) + } catch (error) { + console.error(error) + // the specific error message depends on the provider + if (error instanceof OAuth2RequestError) { + // invalid code + return c.body(null, 400) + } + return c.body(null, 500) + } + }) + } +} + +interface GitHubUser { + id: number + login: string +} + +interface GoogleUser { + sub: string + name: string + given_name: string + family_name: string + picture: string + email: string + email_verified: boolean +} diff --git a/src/lib/server/api/controllers/signup.controller.ts b/src/lib/server/api/controllers/signup.controller.ts index 67a7b24..40b1699 100644 --- a/src/lib/server/api/controllers/signup.controller.ts +++ b/src/lib/server/api/controllers/signup.controller.ts @@ -1,26 +1,24 @@ import 'reflect-metadata' -import type { Controller } from '$lib/server/api/common/interfaces/controller.interface' +import { Controller } from '$lib/server/api/common/types/controller' import { signupUsernameEmailDto } from '$lib/server/api/dtos/signup-username-email.dto' import { limiter } from '$lib/server/api/middleware/rate-limiter.middleware' -import { LuciaProvider } from '$lib/server/api/providers/lucia.provider' import { LoginRequestsService } from '$lib/server/api/services/loginrequest.service' +import { LuciaService } from '$lib/server/api/services/lucia.service' import { UsersService } from '$lib/server/api/services/users.service' import { zValidator } from '@hono/zod-validator' -import { Hono } from 'hono' import { setCookie } from 'hono/cookie' import { TimeSpan } from 'oslo' import { inject, injectable } from 'tsyringe' -import type { HonoTypes } from '../types' @injectable() -export class SignupController implements Controller { - controller = new Hono() - +export class SignupController extends Controller { constructor( @inject(UsersService) private readonly usersService: UsersService, @inject(LoginRequestsService) private readonly loginRequestService: LoginRequestsService, - @inject(LuciaProvider) private lucia: LuciaProvider, - ) {} + @inject(LuciaService) private luciaService: LuciaService, + ) { + super() + } routes() { return this.controller.post('/', zValidator('json', signupUsernameEmailDto), limiter({ limit: 10, minutes: 60 }), async (c) => { @@ -38,7 +36,7 @@ export class SignupController implements Controller { } const session = await this.loginRequestService.createUserSession(user.id, c.req, undefined) - const sessionCookie = this.lucia.createSessionCookie(session.id) + const sessionCookie = this.luciaService.lucia.createSessionCookie(session.id) console.log('set cookie', sessionCookie) setCookie(c, sessionCookie.name, sessionCookie.value, { path: sessionCookie.attributes.path, diff --git a/src/lib/server/api/controllers/user.controller.ts b/src/lib/server/api/controllers/user.controller.ts index ec8d7a1..c05cd2e 100644 --- a/src/lib/server/api/controllers/user.controller.ts +++ b/src/lib/server/api/controllers/user.controller.ts @@ -1,16 +1,14 @@ import 'reflect-metadata' -import type { Controller } from '$lib/server/api/common/interfaces/controller.interface' +import { Controller } from '$lib/server/api/common/types/controller' import { UsersService } from '$lib/server/api/services/users.service' -import { Hono } from 'hono' import { inject, injectable } from 'tsyringe' -import { requireAuth } from '../middleware/auth.middleware' -import type { HonoTypes } from '../types' +import { requireAuth } from '../middleware/require-auth.middleware' @injectable() -export class UserController implements Controller { - controller = new Hono() - - constructor(@inject(UsersService) private readonly usersService: UsersService) {} +export class UserController extends Controller { + constructor(@inject(UsersService) private readonly usersService: UsersService) { + super() + } routes() { return this.controller diff --git a/src/lib/server/api/controllers/wishlist.controller.ts b/src/lib/server/api/controllers/wishlist.controller.ts index 9c19d37..1a8da1c 100644 --- a/src/lib/server/api/controllers/wishlist.controller.ts +++ b/src/lib/server/api/controllers/wishlist.controller.ts @@ -1,16 +1,14 @@ import 'reflect-metadata' -import type { Controller } from '$lib/server/api/common/interfaces/controller.interface' +import { Controller } from '$lib/server/api/common/types/controller' import { WishlistsService } from '$lib/server/api/services/wishlists.service' -import { Hono } from 'hono' import { inject, injectable } from 'tsyringe' -import { requireAuth } from '../middleware/auth.middleware' -import type { HonoTypes } from '../types' +import { requireAuth } from '../middleware/require-auth.middleware' @injectable() -export class WishlistController implements Controller { - controller = new Hono() - - constructor(@inject(WishlistsService) private readonly wishlistsService: WishlistsService) {} +export class WishlistController extends Controller { + constructor(@inject(WishlistsService) private readonly wishlistsService: WishlistsService) { + super() + } routes() { return this.controller diff --git a/src/lib/server/api/databases/migrate.ts b/src/lib/server/api/databases/migrate.ts index d476b12..5a12f2f 100644 --- a/src/lib/server/api/databases/migrate.ts +++ b/src/lib/server/api/databases/migrate.ts @@ -3,7 +3,7 @@ import { drizzle } from 'drizzle-orm/postgres-js' import { migrate } from 'drizzle-orm/postgres-js/migrator' import postgres from 'postgres' import config from '../../../../../drizzle.config' -import env from '../../../../env' +import env from '../common/env' const connection = postgres({ host: env.DATABASE_HOST || 'localhost', @@ -17,7 +17,11 @@ const connection = postgres({ const db = drizzle(connection) try { - await migrate(db, { migrationsFolder: config.out! }) + if (!config.out) { + console.error('No migrations folder specified in drizzle.config.ts') + process.exit() + } + await migrate(db, { migrationsFolder: config.out }) console.log('Migrations complete') } catch (e) { console.error(e) diff --git a/src/lib/server/api/databases/migrations/0000_dazzling_stick.sql b/src/lib/server/api/databases/migrations/0000_volatile_warhawk.sql similarity index 92% rename from src/lib/server/api/databases/migrations/0000_dazzling_stick.sql rename to src/lib/server/api/databases/migrations/0000_volatile_warhawk.sql index d02362e..661f48f 100644 --- a/src/lib/server/api/databases/migrations/0000_dazzling_stick.sql +++ b/src/lib/server/api/databases/migrations/0000_volatile_warhawk.sql @@ -47,6 +47,15 @@ CREATE TABLE IF NOT EXISTS "collections" ( CONSTRAINT "collections_cuid_unique" UNIQUE("cuid") ); --> statement-breakpoint +CREATE TABLE IF NOT EXISTS "credentials" ( + "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, + "user_id" uuid NOT NULL, + "type" text DEFAULT 'password' NOT NULL, + "secret_data" text NOT NULL, + "created_at" timestamp with time zone DEFAULT now() NOT NULL, + "updated_at" timestamp with time zone DEFAULT now() NOT NULL +); +--> statement-breakpoint CREATE TABLE IF NOT EXISTS "expansions" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "cuid" text, @@ -65,6 +74,16 @@ CREATE TABLE IF NOT EXISTS "external_ids" ( CONSTRAINT "external_ids_cuid_unique" UNIQUE("cuid") ); --> statement-breakpoint +CREATE TABLE IF NOT EXISTS "federated_identity" ( + "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, + "user_id" uuid NOT NULL, + "identity_provider" text NOT NULL, + "federated_user_id" text NOT NULL, + "federated_username" text NOT NULL, + "created_at" timestamp with time zone DEFAULT now() NOT NULL, + "updated_at" timestamp with time zone DEFAULT now() NOT NULL +); +--> statement-breakpoint CREATE TABLE IF NOT EXISTS "games" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "cuid" text, @@ -177,9 +196,9 @@ CREATE TABLE IF NOT EXISTS "sessions" ( CREATE TABLE IF NOT EXISTS "two_factor" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "cuid" text, - "two_factor_secret" text NOT NULL, - "two_factor_enabled" boolean DEFAULT false NOT NULL, - "initiated_time" timestamp with time zone NOT NULL, + "secret" text NOT NULL, + "enabled" boolean DEFAULT false NOT NULL, + "initiated_time" timestamp with time zone, "user_id" uuid NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, @@ -202,12 +221,12 @@ CREATE TABLE IF NOT EXISTS "users" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "cuid" text, "username" text, - "hashed_password" text, "email" text, "first_name" text, "last_name" text, "verified" boolean DEFAULT false, "receive_email" boolean DEFAULT false, + "mfa_enabled" boolean DEFAULT false NOT NULL, "theme" text DEFAULT 'system', "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, @@ -278,6 +297,12 @@ EXCEPTION WHEN duplicate_object THEN null; END $$; --> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "credentials" ADD CONSTRAINT "credentials_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."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 "public"."games"("id") ON DELETE restrict ON UPDATE cascade; EXCEPTION @@ -290,6 +315,12 @@ EXCEPTION WHEN duplicate_object THEN null; END $$; --> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "federated_identity" ADD CONSTRAINT "federated_identity_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("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_game_id_games_id_fk" FOREIGN KEY ("game_id") REFERENCES "public"."games"("id") ON DELETE restrict ON UPDATE cascade; EXCEPTION diff --git a/src/lib/server/api/databases/migrations/0001_noisy_sally_floyd.sql b/src/lib/server/api/databases/migrations/0001_noisy_sally_floyd.sql deleted file mode 100644 index 5809aa6..0000000 --- a/src/lib/server/api/databases/migrations/0001_noisy_sally_floyd.sql +++ /dev/null @@ -1,2 +0,0 @@ -ALTER TABLE "two_factor" RENAME COLUMN "two_factor_secret" TO "secret";--> statement-breakpoint -ALTER TABLE "two_factor" RENAME COLUMN "two_factor_enabled" TO "enabled"; \ No newline at end of file diff --git a/src/lib/server/api/databases/migrations/0001_pink_the_enforcers.sql b/src/lib/server/api/databases/migrations/0001_pink_the_enforcers.sql new file mode 100644 index 0000000..1135b5e --- /dev/null +++ b/src/lib/server/api/databases/migrations/0001_pink_the_enforcers.sql @@ -0,0 +1,2 @@ +ALTER TABLE "users" ADD COLUMN "email_verified" boolean DEFAULT false;--> statement-breakpoint +ALTER TABLE "users" ADD COLUMN "picture" text; \ No newline at end of file diff --git a/src/lib/server/api/databases/migrations/0002_fancy_valkyrie.sql b/src/lib/server/api/databases/migrations/0002_fancy_valkyrie.sql deleted file mode 100644 index e05cd36..0000000 --- a/src/lib/server/api/databases/migrations/0002_fancy_valkyrie.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE "two_factor" ALTER COLUMN "initiated_time" DROP NOT NULL; \ No newline at end of file diff --git a/src/lib/server/api/databases/migrations/0003_worried_taskmaster.sql b/src/lib/server/api/databases/migrations/0003_worried_taskmaster.sql deleted file mode 100644 index c395895..0000000 --- a/src/lib/server/api/databases/migrations/0003_worried_taskmaster.sql +++ /dev/null @@ -1,32 +0,0 @@ -CREATE TABLE IF NOT EXISTS "credentials" ( - "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, - "user_id" uuid NOT NULL, - "type" text DEFAULT 'password' NOT NULL, - "secret_data" text NOT NULL, - "created_at" timestamp with time zone DEFAULT now() NOT NULL, - "updated_at" timestamp with time zone DEFAULT now() NOT NULL -); ---> statement-breakpoint -CREATE TABLE IF NOT EXISTS "federated_identity" ( - "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, - "user_id" uuid NOT NULL, - "identity_provider" text NOT NULL, - "federated_user_id" text NOT NULL, - "federated_username" text NOT NULL, - "created_at" timestamp with time zone DEFAULT now() NOT NULL, - "updated_at" timestamp with time zone DEFAULT now() NOT NULL -); ---> statement-breakpoint -DO $$ BEGIN - ALTER TABLE "credentials" ADD CONSTRAINT "credentials_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; -EXCEPTION - WHEN duplicate_object THEN null; -END $$; ---> statement-breakpoint -DO $$ BEGIN - ALTER TABLE "federated_identity" ADD CONSTRAINT "federated_identity_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; -EXCEPTION - WHEN duplicate_object THEN null; -END $$; ---> statement-breakpoint -ALTER TABLE "users" DROP COLUMN IF EXISTS "hashed_password"; \ No newline at end of file diff --git a/src/lib/server/api/databases/migrations/0004_heavy_sphinx.sql b/src/lib/server/api/databases/migrations/0004_heavy_sphinx.sql deleted file mode 100644 index 70a7029..0000000 --- a/src/lib/server/api/databases/migrations/0004_heavy_sphinx.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE "users" ADD COLUMN "enabled" boolean DEFAULT false NOT NULL; \ No newline at end of file diff --git a/src/lib/server/api/databases/migrations/0005_true_mathemanic.sql b/src/lib/server/api/databases/migrations/0005_true_mathemanic.sql deleted file mode 100644 index a37a946..0000000 --- a/src/lib/server/api/databases/migrations/0005_true_mathemanic.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE "users" RENAME COLUMN "enabled" TO "mfa_enabled"; \ No newline at end of file diff --git a/src/lib/server/api/databases/migrations/meta/0000_snapshot.json b/src/lib/server/api/databases/migrations/meta/0000_snapshot.json index 91e2a6e..3814642 100644 --- a/src/lib/server/api/databases/migrations/meta/0000_snapshot.json +++ b/src/lib/server/api/databases/migrations/meta/0000_snapshot.json @@ -1,5 +1,5 @@ { - "id": "e120d11a-bf28-4c96-9f2f-96e23e23c7e2", + "id": "4760134e-48bb-47db-b431-56903dad6e24", "prevId": "00000000-0000-0000-0000-000000000000", "version": "7", "dialect": "postgresql", @@ -338,6 +338,70 @@ } } }, + "public.credentials": { + "name": "credentials", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'password'" + }, + "secret_data": { + "name": "secret_data", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "credentials_user_id_users_id_fk": { + "name": "credentials_user_id_users_id_fk", + "tableFrom": "credentials", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, "public.expansions": { "name": "expansions", "schema": "", @@ -466,6 +530,75 @@ } } }, + "public.federated_identity": { + "name": "federated_identity", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "identity_provider": { + "name": "identity_provider", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "federated_user_id": { + "name": "federated_user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "federated_username": { + "name": "federated_username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "federated_identity_user_id_users_id_fk": { + "name": "federated_identity_user_id_users_id_fk", + "tableFrom": "federated_identity", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, "public.games": { "name": "games", "schema": "", @@ -1273,14 +1406,14 @@ "primaryKey": false, "notNull": false }, - "two_factor_secret": { - "name": "two_factor_secret", + "secret": { + "name": "secret", "type": "text", "primaryKey": false, "notNull": true }, - "two_factor_enabled": { - "name": "two_factor_enabled", + "enabled": { + "name": "enabled", "type": "boolean", "primaryKey": false, "notNull": true, @@ -1290,7 +1423,7 @@ "name": "initiated_time", "type": "timestamp with time zone", "primaryKey": false, - "notNull": true + "notNull": false }, "user_id": { "name": "user_id", @@ -1461,12 +1594,6 @@ "primaryKey": false, "notNull": false }, - "hashed_password": { - "name": "hashed_password", - "type": "text", - "primaryKey": false, - "notNull": false - }, "email": { "name": "email", "type": "text", @@ -1499,6 +1626,13 @@ "notNull": false, "default": false }, + "mfa_enabled": { + "name": "mfa_enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, "theme": { "name": "theme", "type": "text", @@ -1720,6 +1854,7 @@ } }, "schemas": {}, + "sequences": {}, "_meta": { "columns": {}, "schemas": {}, diff --git a/src/lib/server/api/databases/migrations/meta/0001_snapshot.json b/src/lib/server/api/databases/migrations/meta/0001_snapshot.json index 4de88b6..ae9ae5b 100644 --- a/src/lib/server/api/databases/migrations/meta/0001_snapshot.json +++ b/src/lib/server/api/databases/migrations/meta/0001_snapshot.json @@ -1,6 +1,6 @@ { - "id": "52e7c416-89cb-4c6a-9118-68a03cfc2920", - "prevId": "e120d11a-bf28-4c96-9f2f-96e23e23c7e2", + "id": "e1230cae-67ce-4669-885a-3d3fe4462f9e", + "prevId": "4760134e-48bb-47db-b431-56903dad6e24", "version": "7", "dialect": "postgresql", "tables": { @@ -338,6 +338,70 @@ } } }, + "public.credentials": { + "name": "credentials", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'password'" + }, + "secret_data": { + "name": "secret_data", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "credentials_user_id_users_id_fk": { + "name": "credentials_user_id_users_id_fk", + "tableFrom": "credentials", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, "public.expansions": { "name": "expansions", "schema": "", @@ -466,6 +530,75 @@ } } }, + "public.federated_identity": { + "name": "federated_identity", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "identity_provider": { + "name": "identity_provider", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "federated_user_id": { + "name": "federated_user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "federated_username": { + "name": "federated_username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "federated_identity_user_id_users_id_fk": { + "name": "federated_identity_user_id_users_id_fk", + "tableFrom": "federated_identity", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, "public.games": { "name": "games", "schema": "", @@ -1290,7 +1423,7 @@ "name": "initiated_time", "type": "timestamp with time zone", "primaryKey": false, - "notNull": true + "notNull": false }, "user_id": { "name": "user_id", @@ -1461,12 +1594,6 @@ "primaryKey": false, "notNull": false }, - "hashed_password": { - "name": "hashed_password", - "type": "text", - "primaryKey": false, - "notNull": false - }, "email": { "name": "email", "type": "text", @@ -1499,6 +1626,26 @@ "notNull": false, "default": false }, + "email_verified": { + "name": "email_verified", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "picture": { + "name": "picture", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mfa_enabled": { + "name": "mfa_enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, "theme": { "name": "theme", "type": "text", @@ -1720,6 +1867,7 @@ } }, "schemas": {}, + "sequences": {}, "_meta": { "columns": {}, "schemas": {}, diff --git a/src/lib/server/api/databases/migrations/meta/0002_snapshot.json b/src/lib/server/api/databases/migrations/meta/0002_snapshot.json deleted file mode 100644 index 8f50271..0000000 --- a/src/lib/server/api/databases/migrations/meta/0002_snapshot.json +++ /dev/null @@ -1,1728 +0,0 @@ -{ - "id": "79adee85-e57c-4a9f-87df-835457b68129", - "prevId": "52e7c416-89cb-4c6a-9118-68a03cfc2920", - "version": "7", - "dialect": "postgresql", - "tables": { - "public.categories": { - "name": "categories", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "slug": { - "name": "slug", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "categories_cuid_unique": { - "name": "categories_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.categories_to_external_ids": { - "name": "categories_to_external_ids", - "schema": "", - "columns": { - "category_id": { - "name": "category_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "external_id": { - "name": "external_id", - "type": "uuid", - "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": {} - }, - "public.categories_to_games": { - "name": "categories_to_games", - "schema": "", - "columns": { - "category_id": { - "name": "category_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "game_id": { - "name": "game_id", - "type": "uuid", - "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": {} - }, - "public.collection_items": { - "name": "collection_items", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "collection_id": { - "name": "collection_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "game_id": { - "name": "game_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "times_played": { - "name": "times_played", - "type": "integer", - "primaryKey": false, - "notNull": false, - "default": 0 - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "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": { - "collection_items_cuid_unique": { - "name": "collection_items_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.collections": { - "name": "collections", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "user_id": { - "name": "user_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "default": "'My Collection'" - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "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": { - "collections_cuid_unique": { - "name": "collections_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.expansions": { - "name": "expansions", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "base_game_id": { - "name": "base_game_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "game_id": { - "name": "game_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "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_cuid_unique": { - "name": "expansions_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.external_ids": { - "name": "external_ids", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "type": { - "name": "type", - "type": "external_id_type", - "typeSchema": "public", - "primaryKey": false, - "notNull": false - }, - "external_id": { - "name": "external_id", - "type": "text", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "external_ids_cuid_unique": { - "name": "external_ids_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.games": { - "name": "games", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "slug": { - "name": "slug", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "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": "text", - "primaryKey": false, - "notNull": false - }, - "thumb_url": { - "name": "thumb_url", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "url": { - "name": "url", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "last_sync_at": { - "name": "last_sync_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": { - "search_index": { - "name": "search_index", - "columns": [ - { - "expression": "(\n\t\t\t\tsetweight(to_tsvector('english', \"name\"), 'A') ||\n setweight(to_tsvector('english', \"slug\"), 'B')\n )", - "asc": true, - "isExpression": true, - "nulls": "last" - } - ], - "isUnique": false, - "concurrently": false, - "method": "gin", - "with": {} - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "games_cuid_unique": { - "name": "games_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.games_to_external_ids": { - "name": "games_to_external_ids", - "schema": "", - "columns": { - "game_id": { - "name": "game_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "external_id": { - "name": "external_id", - "type": "uuid", - "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": {} - }, - "public.mechanics": { - "name": "mechanics", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "slug": { - "name": "slug", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "mechanics_cuid_unique": { - "name": "mechanics_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.mechanics_to_external_ids": { - "name": "mechanics_to_external_ids", - "schema": "", - "columns": { - "mechanic_id": { - "name": "mechanic_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "external_id": { - "name": "external_id", - "type": "uuid", - "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": {} - }, - "public.mechanics_to_games": { - "name": "mechanics_to_games", - "schema": "", - "columns": { - "mechanic_id": { - "name": "mechanic_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "game_id": { - "name": "game_id", - "type": "uuid", - "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": {} - }, - "public.password_reset_tokens": { - "name": "password_reset_tokens", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "user_id": { - "name": "user_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "expires_at": { - "name": "expires_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": { - "password_reset_tokens_user_id_users_id_fk": { - "name": "password_reset_tokens_user_id_users_id_fk", - "tableFrom": "password_reset_tokens", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "public.publishers": { - "name": "publishers", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "slug": { - "name": "slug", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "publishers_cuid_unique": { - "name": "publishers_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.publishers_to_external_ids": { - "name": "publishers_to_external_ids", - "schema": "", - "columns": { - "publisher_id": { - "name": "publisher_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "external_id": { - "name": "external_id", - "type": "uuid", - "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": {} - }, - "public.publishers_to_games": { - "name": "publishers_to_games", - "schema": "", - "columns": { - "publisher_id": { - "name": "publisher_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "game_id": { - "name": "game_id", - "type": "uuid", - "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": {} - }, - "public.recovery_codes": { - "name": "recovery_codes", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "user_id": { - "name": "user_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "code": { - "name": "code", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "used": { - "name": "used", - "type": "boolean", - "primaryKey": false, - "notNull": false, - "default": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": { - "recovery_codes_user_id_users_id_fk": { - "name": "recovery_codes_user_id_users_id_fk", - "tableFrom": "recovery_codes", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "public.roles": { - "name": "roles", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "roles_cuid_unique": { - "name": "roles_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - }, - "roles_name_unique": { - "name": "roles_name_unique", - "nullsNotDistinct": false, - "columns": [ - "name" - ] - } - } - }, - "public.sessions": { - "name": "sessions", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "user_id": { - "name": "user_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "expires_at": { - "name": "expires_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true - }, - "ip_country": { - "name": "ip_country", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "ip_address": { - "name": "ip_address", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "two_factor_auth_enabled": { - "name": "two_factor_auth_enabled", - "type": "boolean", - "primaryKey": false, - "notNull": false, - "default": false - }, - "is_two_factor_authenticated": { - "name": "is_two_factor_authenticated", - "type": "boolean", - "primaryKey": false, - "notNull": false, - "default": 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": {} - }, - "public.two_factor": { - "name": "two_factor", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "secret": { - "name": "secret", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "enabled": { - "name": "enabled", - "type": "boolean", - "primaryKey": false, - "notNull": true, - "default": false - }, - "initiated_time": { - "name": "initiated_time", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - }, - "user_id": { - "name": "user_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": { - "two_factor_user_id_users_id_fk": { - "name": "two_factor_user_id_users_id_fk", - "tableFrom": "two_factor", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "two_factor_cuid_unique": { - "name": "two_factor_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - }, - "two_factor_user_id_unique": { - "name": "two_factor_user_id_unique", - "nullsNotDistinct": false, - "columns": [ - "user_id" - ] - } - } - }, - "public.user_roles": { - "name": "user_roles", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "user_id": { - "name": "user_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "role_id": { - "name": "role_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "primary": { - "name": "primary", - "type": "boolean", - "primaryKey": false, - "notNull": false, - "default": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "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": { - "user_roles_cuid_unique": { - "name": "user_roles_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.users": { - "name": "users", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "username": { - "name": "username", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "hashed_password": { - "name": "hashed_password", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "first_name": { - "name": "first_name", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "last_name": { - "name": "last_name", - "type": "text", - "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": "text", - "primaryKey": false, - "notNull": false, - "default": "'system'" - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "users_cuid_unique": { - "name": "users_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - }, - "users_username_unique": { - "name": "users_username_unique", - "nullsNotDistinct": false, - "columns": [ - "username" - ] - }, - "users_email_unique": { - "name": "users_email_unique", - "nullsNotDistinct": false, - "columns": [ - "email" - ] - } - } - }, - "public.wishlist_items": { - "name": "wishlist_items", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "wishlist_id": { - "name": "wishlist_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "game_id": { - "name": "game_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "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": { - "wishlist_items_cuid_unique": { - "name": "wishlist_items_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.wishlists": { - "name": "wishlists", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "user_id": { - "name": "user_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "default": "'My Wishlist'" - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "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": { - "wishlists_cuid_unique": { - "name": "wishlists_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - } - }, - "enums": { - "public.external_id_type": { - "name": "external_id_type", - "schema": "public", - "values": [ - "game", - "category", - "mechanic", - "publisher", - "designer", - "artist" - ] - } - }, - "schemas": {}, - "_meta": { - "columns": {}, - "schemas": {}, - "tables": {} - } -} \ No newline at end of file diff --git a/src/lib/server/api/databases/migrations/meta/0003_snapshot.json b/src/lib/server/api/databases/migrations/meta/0003_snapshot.json deleted file mode 100644 index a5213e7..0000000 --- a/src/lib/server/api/databases/migrations/meta/0003_snapshot.json +++ /dev/null @@ -1,1856 +0,0 @@ -{ - "id": "5a4165ba-0d5a-4a58-aa14-e68e3e41a181", - "prevId": "79adee85-e57c-4a9f-87df-835457b68129", - "version": "7", - "dialect": "postgresql", - "tables": { - "public.categories": { - "name": "categories", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "slug": { - "name": "slug", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "categories_cuid_unique": { - "name": "categories_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.categories_to_external_ids": { - "name": "categories_to_external_ids", - "schema": "", - "columns": { - "category_id": { - "name": "category_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "external_id": { - "name": "external_id", - "type": "uuid", - "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": {} - }, - "public.categories_to_games": { - "name": "categories_to_games", - "schema": "", - "columns": { - "category_id": { - "name": "category_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "game_id": { - "name": "game_id", - "type": "uuid", - "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": {} - }, - "public.collection_items": { - "name": "collection_items", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "collection_id": { - "name": "collection_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "game_id": { - "name": "game_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "times_played": { - "name": "times_played", - "type": "integer", - "primaryKey": false, - "notNull": false, - "default": 0 - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "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": { - "collection_items_cuid_unique": { - "name": "collection_items_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.collections": { - "name": "collections", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "user_id": { - "name": "user_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "default": "'My Collection'" - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "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": { - "collections_cuid_unique": { - "name": "collections_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.credentials": { - "name": "credentials", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "user_id": { - "name": "user_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "type": { - "name": "type", - "type": "text", - "primaryKey": false, - "notNull": true, - "default": "'password'" - }, - "secret_data": { - "name": "secret_data", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": { - "credentials_user_id_users_id_fk": { - "name": "credentials_user_id_users_id_fk", - "tableFrom": "credentials", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "public.expansions": { - "name": "expansions", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "base_game_id": { - "name": "base_game_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "game_id": { - "name": "game_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "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_cuid_unique": { - "name": "expansions_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.external_ids": { - "name": "external_ids", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "type": { - "name": "type", - "type": "external_id_type", - "typeSchema": "public", - "primaryKey": false, - "notNull": false - }, - "external_id": { - "name": "external_id", - "type": "text", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "external_ids_cuid_unique": { - "name": "external_ids_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.federated_identity": { - "name": "federated_identity", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "user_id": { - "name": "user_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "identity_provider": { - "name": "identity_provider", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "federated_user_id": { - "name": "federated_user_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "federated_username": { - "name": "federated_username", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": { - "federated_identity_user_id_users_id_fk": { - "name": "federated_identity_user_id_users_id_fk", - "tableFrom": "federated_identity", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "public.games": { - "name": "games", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "slug": { - "name": "slug", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "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": "text", - "primaryKey": false, - "notNull": false - }, - "thumb_url": { - "name": "thumb_url", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "url": { - "name": "url", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "last_sync_at": { - "name": "last_sync_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": { - "search_index": { - "name": "search_index", - "columns": [ - { - "expression": "(\n\t\t\t\tsetweight(to_tsvector('english', \"name\"), 'A') ||\n setweight(to_tsvector('english', \"slug\"), 'B')\n )", - "asc": true, - "isExpression": true, - "nulls": "last" - } - ], - "isUnique": false, - "concurrently": false, - "method": "gin", - "with": {} - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "games_cuid_unique": { - "name": "games_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.games_to_external_ids": { - "name": "games_to_external_ids", - "schema": "", - "columns": { - "game_id": { - "name": "game_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "external_id": { - "name": "external_id", - "type": "uuid", - "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": {} - }, - "public.mechanics": { - "name": "mechanics", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "slug": { - "name": "slug", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "mechanics_cuid_unique": { - "name": "mechanics_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.mechanics_to_external_ids": { - "name": "mechanics_to_external_ids", - "schema": "", - "columns": { - "mechanic_id": { - "name": "mechanic_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "external_id": { - "name": "external_id", - "type": "uuid", - "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": {} - }, - "public.mechanics_to_games": { - "name": "mechanics_to_games", - "schema": "", - "columns": { - "mechanic_id": { - "name": "mechanic_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "game_id": { - "name": "game_id", - "type": "uuid", - "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": {} - }, - "public.password_reset_tokens": { - "name": "password_reset_tokens", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "user_id": { - "name": "user_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "expires_at": { - "name": "expires_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": { - "password_reset_tokens_user_id_users_id_fk": { - "name": "password_reset_tokens_user_id_users_id_fk", - "tableFrom": "password_reset_tokens", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "public.publishers": { - "name": "publishers", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "slug": { - "name": "slug", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "publishers_cuid_unique": { - "name": "publishers_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.publishers_to_external_ids": { - "name": "publishers_to_external_ids", - "schema": "", - "columns": { - "publisher_id": { - "name": "publisher_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "external_id": { - "name": "external_id", - "type": "uuid", - "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": {} - }, - "public.publishers_to_games": { - "name": "publishers_to_games", - "schema": "", - "columns": { - "publisher_id": { - "name": "publisher_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "game_id": { - "name": "game_id", - "type": "uuid", - "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": {} - }, - "public.recovery_codes": { - "name": "recovery_codes", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "user_id": { - "name": "user_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "code": { - "name": "code", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "used": { - "name": "used", - "type": "boolean", - "primaryKey": false, - "notNull": false, - "default": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": { - "recovery_codes_user_id_users_id_fk": { - "name": "recovery_codes_user_id_users_id_fk", - "tableFrom": "recovery_codes", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "public.roles": { - "name": "roles", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "roles_cuid_unique": { - "name": "roles_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - }, - "roles_name_unique": { - "name": "roles_name_unique", - "nullsNotDistinct": false, - "columns": [ - "name" - ] - } - } - }, - "public.sessions": { - "name": "sessions", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "user_id": { - "name": "user_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "expires_at": { - "name": "expires_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true - }, - "ip_country": { - "name": "ip_country", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "ip_address": { - "name": "ip_address", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "two_factor_auth_enabled": { - "name": "two_factor_auth_enabled", - "type": "boolean", - "primaryKey": false, - "notNull": false, - "default": false - }, - "is_two_factor_authenticated": { - "name": "is_two_factor_authenticated", - "type": "boolean", - "primaryKey": false, - "notNull": false, - "default": 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": {} - }, - "public.two_factor": { - "name": "two_factor", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "secret": { - "name": "secret", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "enabled": { - "name": "enabled", - "type": "boolean", - "primaryKey": false, - "notNull": true, - "default": false - }, - "initiated_time": { - "name": "initiated_time", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - }, - "user_id": { - "name": "user_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": { - "two_factor_user_id_users_id_fk": { - "name": "two_factor_user_id_users_id_fk", - "tableFrom": "two_factor", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "two_factor_cuid_unique": { - "name": "two_factor_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - }, - "two_factor_user_id_unique": { - "name": "two_factor_user_id_unique", - "nullsNotDistinct": false, - "columns": [ - "user_id" - ] - } - } - }, - "public.user_roles": { - "name": "user_roles", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "user_id": { - "name": "user_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "role_id": { - "name": "role_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "primary": { - "name": "primary", - "type": "boolean", - "primaryKey": false, - "notNull": false, - "default": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "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": { - "user_roles_cuid_unique": { - "name": "user_roles_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.users": { - "name": "users", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "username": { - "name": "username", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "first_name": { - "name": "first_name", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "last_name": { - "name": "last_name", - "type": "text", - "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": "text", - "primaryKey": false, - "notNull": false, - "default": "'system'" - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "users_cuid_unique": { - "name": "users_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - }, - "users_username_unique": { - "name": "users_username_unique", - "nullsNotDistinct": false, - "columns": [ - "username" - ] - }, - "users_email_unique": { - "name": "users_email_unique", - "nullsNotDistinct": false, - "columns": [ - "email" - ] - } - } - }, - "public.wishlist_items": { - "name": "wishlist_items", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "wishlist_id": { - "name": "wishlist_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "game_id": { - "name": "game_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "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": { - "wishlist_items_cuid_unique": { - "name": "wishlist_items_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.wishlists": { - "name": "wishlists", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "user_id": { - "name": "user_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "default": "'My Wishlist'" - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "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": { - "wishlists_cuid_unique": { - "name": "wishlists_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - } - }, - "enums": { - "public.external_id_type": { - "name": "external_id_type", - "schema": "public", - "values": [ - "game", - "category", - "mechanic", - "publisher", - "designer", - "artist" - ] - } - }, - "schemas": {}, - "sequences": {}, - "_meta": { - "columns": {}, - "schemas": {}, - "tables": {} - } -} \ No newline at end of file diff --git a/src/lib/server/api/databases/migrations/meta/0004_snapshot.json b/src/lib/server/api/databases/migrations/meta/0004_snapshot.json deleted file mode 100644 index 11e04b2..0000000 --- a/src/lib/server/api/databases/migrations/meta/0004_snapshot.json +++ /dev/null @@ -1,1863 +0,0 @@ -{ - "id": "ee44907c-0c2a-4aa0-8e3a-59cf74321c7a", - "prevId": "5a4165ba-0d5a-4a58-aa14-e68e3e41a181", - "version": "7", - "dialect": "postgresql", - "tables": { - "public.categories": { - "name": "categories", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "slug": { - "name": "slug", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "categories_cuid_unique": { - "name": "categories_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.categories_to_external_ids": { - "name": "categories_to_external_ids", - "schema": "", - "columns": { - "category_id": { - "name": "category_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "external_id": { - "name": "external_id", - "type": "uuid", - "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": {} - }, - "public.categories_to_games": { - "name": "categories_to_games", - "schema": "", - "columns": { - "category_id": { - "name": "category_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "game_id": { - "name": "game_id", - "type": "uuid", - "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": {} - }, - "public.collection_items": { - "name": "collection_items", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "collection_id": { - "name": "collection_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "game_id": { - "name": "game_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "times_played": { - "name": "times_played", - "type": "integer", - "primaryKey": false, - "notNull": false, - "default": 0 - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "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": { - "collection_items_cuid_unique": { - "name": "collection_items_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.collections": { - "name": "collections", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "user_id": { - "name": "user_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "default": "'My Collection'" - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "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": { - "collections_cuid_unique": { - "name": "collections_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.credentials": { - "name": "credentials", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "user_id": { - "name": "user_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "type": { - "name": "type", - "type": "text", - "primaryKey": false, - "notNull": true, - "default": "'password'" - }, - "secret_data": { - "name": "secret_data", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": { - "credentials_user_id_users_id_fk": { - "name": "credentials_user_id_users_id_fk", - "tableFrom": "credentials", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "public.expansions": { - "name": "expansions", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "base_game_id": { - "name": "base_game_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "game_id": { - "name": "game_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "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_cuid_unique": { - "name": "expansions_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.external_ids": { - "name": "external_ids", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "type": { - "name": "type", - "type": "external_id_type", - "typeSchema": "public", - "primaryKey": false, - "notNull": false - }, - "external_id": { - "name": "external_id", - "type": "text", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "external_ids_cuid_unique": { - "name": "external_ids_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.federated_identity": { - "name": "federated_identity", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "user_id": { - "name": "user_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "identity_provider": { - "name": "identity_provider", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "federated_user_id": { - "name": "federated_user_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "federated_username": { - "name": "federated_username", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": { - "federated_identity_user_id_users_id_fk": { - "name": "federated_identity_user_id_users_id_fk", - "tableFrom": "federated_identity", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "public.games": { - "name": "games", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "slug": { - "name": "slug", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "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": "text", - "primaryKey": false, - "notNull": false - }, - "thumb_url": { - "name": "thumb_url", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "url": { - "name": "url", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "last_sync_at": { - "name": "last_sync_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": { - "search_index": { - "name": "search_index", - "columns": [ - { - "expression": "(\n\t\t\t\tsetweight(to_tsvector('english', \"name\"), 'A') ||\n setweight(to_tsvector('english', \"slug\"), 'B')\n )", - "asc": true, - "isExpression": true, - "nulls": "last" - } - ], - "isUnique": false, - "concurrently": false, - "method": "gin", - "with": {} - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "games_cuid_unique": { - "name": "games_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.games_to_external_ids": { - "name": "games_to_external_ids", - "schema": "", - "columns": { - "game_id": { - "name": "game_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "external_id": { - "name": "external_id", - "type": "uuid", - "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": {} - }, - "public.mechanics": { - "name": "mechanics", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "slug": { - "name": "slug", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "mechanics_cuid_unique": { - "name": "mechanics_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.mechanics_to_external_ids": { - "name": "mechanics_to_external_ids", - "schema": "", - "columns": { - "mechanic_id": { - "name": "mechanic_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "external_id": { - "name": "external_id", - "type": "uuid", - "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": {} - }, - "public.mechanics_to_games": { - "name": "mechanics_to_games", - "schema": "", - "columns": { - "mechanic_id": { - "name": "mechanic_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "game_id": { - "name": "game_id", - "type": "uuid", - "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": {} - }, - "public.password_reset_tokens": { - "name": "password_reset_tokens", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "user_id": { - "name": "user_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "expires_at": { - "name": "expires_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": { - "password_reset_tokens_user_id_users_id_fk": { - "name": "password_reset_tokens_user_id_users_id_fk", - "tableFrom": "password_reset_tokens", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "public.publishers": { - "name": "publishers", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "slug": { - "name": "slug", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "publishers_cuid_unique": { - "name": "publishers_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.publishers_to_external_ids": { - "name": "publishers_to_external_ids", - "schema": "", - "columns": { - "publisher_id": { - "name": "publisher_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "external_id": { - "name": "external_id", - "type": "uuid", - "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": {} - }, - "public.publishers_to_games": { - "name": "publishers_to_games", - "schema": "", - "columns": { - "publisher_id": { - "name": "publisher_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "game_id": { - "name": "game_id", - "type": "uuid", - "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": {} - }, - "public.recovery_codes": { - "name": "recovery_codes", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "user_id": { - "name": "user_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "code": { - "name": "code", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "used": { - "name": "used", - "type": "boolean", - "primaryKey": false, - "notNull": false, - "default": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": { - "recovery_codes_user_id_users_id_fk": { - "name": "recovery_codes_user_id_users_id_fk", - "tableFrom": "recovery_codes", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "public.roles": { - "name": "roles", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "roles_cuid_unique": { - "name": "roles_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - }, - "roles_name_unique": { - "name": "roles_name_unique", - "nullsNotDistinct": false, - "columns": [ - "name" - ] - } - } - }, - "public.sessions": { - "name": "sessions", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "user_id": { - "name": "user_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "expires_at": { - "name": "expires_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true - }, - "ip_country": { - "name": "ip_country", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "ip_address": { - "name": "ip_address", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "two_factor_auth_enabled": { - "name": "two_factor_auth_enabled", - "type": "boolean", - "primaryKey": false, - "notNull": false, - "default": false - }, - "is_two_factor_authenticated": { - "name": "is_two_factor_authenticated", - "type": "boolean", - "primaryKey": false, - "notNull": false, - "default": 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": {} - }, - "public.two_factor": { - "name": "two_factor", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "secret": { - "name": "secret", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "enabled": { - "name": "enabled", - "type": "boolean", - "primaryKey": false, - "notNull": true, - "default": false - }, - "initiated_time": { - "name": "initiated_time", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - }, - "user_id": { - "name": "user_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": { - "two_factor_user_id_users_id_fk": { - "name": "two_factor_user_id_users_id_fk", - "tableFrom": "two_factor", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "two_factor_cuid_unique": { - "name": "two_factor_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - }, - "two_factor_user_id_unique": { - "name": "two_factor_user_id_unique", - "nullsNotDistinct": false, - "columns": [ - "user_id" - ] - } - } - }, - "public.user_roles": { - "name": "user_roles", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "user_id": { - "name": "user_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "role_id": { - "name": "role_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "primary": { - "name": "primary", - "type": "boolean", - "primaryKey": false, - "notNull": false, - "default": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "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": { - "user_roles_cuid_unique": { - "name": "user_roles_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.users": { - "name": "users", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "username": { - "name": "username", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "first_name": { - "name": "first_name", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "last_name": { - "name": "last_name", - "type": "text", - "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 - }, - "enabled": { - "name": "enabled", - "type": "boolean", - "primaryKey": false, - "notNull": true, - "default": false - }, - "theme": { - "name": "theme", - "type": "text", - "primaryKey": false, - "notNull": false, - "default": "'system'" - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "users_cuid_unique": { - "name": "users_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - }, - "users_username_unique": { - "name": "users_username_unique", - "nullsNotDistinct": false, - "columns": [ - "username" - ] - }, - "users_email_unique": { - "name": "users_email_unique", - "nullsNotDistinct": false, - "columns": [ - "email" - ] - } - } - }, - "public.wishlist_items": { - "name": "wishlist_items", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "wishlist_id": { - "name": "wishlist_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "game_id": { - "name": "game_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "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": { - "wishlist_items_cuid_unique": { - "name": "wishlist_items_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.wishlists": { - "name": "wishlists", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "user_id": { - "name": "user_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "default": "'My Wishlist'" - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "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": { - "wishlists_cuid_unique": { - "name": "wishlists_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - } - }, - "enums": { - "public.external_id_type": { - "name": "external_id_type", - "schema": "public", - "values": [ - "game", - "category", - "mechanic", - "publisher", - "designer", - "artist" - ] - } - }, - "schemas": {}, - "sequences": {}, - "_meta": { - "columns": {}, - "schemas": {}, - "tables": {} - } -} \ No newline at end of file diff --git a/src/lib/server/api/databases/migrations/meta/0005_snapshot.json b/src/lib/server/api/databases/migrations/meta/0005_snapshot.json deleted file mode 100644 index c82db66..0000000 --- a/src/lib/server/api/databases/migrations/meta/0005_snapshot.json +++ /dev/null @@ -1,1863 +0,0 @@ -{ - "id": "b7874689-9dc9-4171-9115-5b6333a0f995", - "prevId": "ee44907c-0c2a-4aa0-8e3a-59cf74321c7a", - "version": "7", - "dialect": "postgresql", - "tables": { - "public.categories": { - "name": "categories", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "slug": { - "name": "slug", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "categories_cuid_unique": { - "name": "categories_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.categories_to_external_ids": { - "name": "categories_to_external_ids", - "schema": "", - "columns": { - "category_id": { - "name": "category_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "external_id": { - "name": "external_id", - "type": "uuid", - "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": {} - }, - "public.categories_to_games": { - "name": "categories_to_games", - "schema": "", - "columns": { - "category_id": { - "name": "category_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "game_id": { - "name": "game_id", - "type": "uuid", - "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": {} - }, - "public.collection_items": { - "name": "collection_items", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "collection_id": { - "name": "collection_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "game_id": { - "name": "game_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "times_played": { - "name": "times_played", - "type": "integer", - "primaryKey": false, - "notNull": false, - "default": 0 - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "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": { - "collection_items_cuid_unique": { - "name": "collection_items_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.collections": { - "name": "collections", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "user_id": { - "name": "user_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "default": "'My Collection'" - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "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": { - "collections_cuid_unique": { - "name": "collections_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.credentials": { - "name": "credentials", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "user_id": { - "name": "user_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "type": { - "name": "type", - "type": "text", - "primaryKey": false, - "notNull": true, - "default": "'password'" - }, - "secret_data": { - "name": "secret_data", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": { - "credentials_user_id_users_id_fk": { - "name": "credentials_user_id_users_id_fk", - "tableFrom": "credentials", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "public.expansions": { - "name": "expansions", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "base_game_id": { - "name": "base_game_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "game_id": { - "name": "game_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "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_cuid_unique": { - "name": "expansions_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.external_ids": { - "name": "external_ids", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "type": { - "name": "type", - "type": "external_id_type", - "typeSchema": "public", - "primaryKey": false, - "notNull": false - }, - "external_id": { - "name": "external_id", - "type": "text", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "external_ids_cuid_unique": { - "name": "external_ids_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.federated_identity": { - "name": "federated_identity", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "user_id": { - "name": "user_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "identity_provider": { - "name": "identity_provider", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "federated_user_id": { - "name": "federated_user_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "federated_username": { - "name": "federated_username", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": { - "federated_identity_user_id_users_id_fk": { - "name": "federated_identity_user_id_users_id_fk", - "tableFrom": "federated_identity", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "public.games": { - "name": "games", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "slug": { - "name": "slug", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "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": "text", - "primaryKey": false, - "notNull": false - }, - "thumb_url": { - "name": "thumb_url", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "url": { - "name": "url", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "last_sync_at": { - "name": "last_sync_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": { - "search_index": { - "name": "search_index", - "columns": [ - { - "expression": "(\n\t\t\t\tsetweight(to_tsvector('english', \"name\"), 'A') ||\n setweight(to_tsvector('english', \"slug\"), 'B')\n )", - "asc": true, - "isExpression": true, - "nulls": "last" - } - ], - "isUnique": false, - "concurrently": false, - "method": "gin", - "with": {} - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "games_cuid_unique": { - "name": "games_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.games_to_external_ids": { - "name": "games_to_external_ids", - "schema": "", - "columns": { - "game_id": { - "name": "game_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "external_id": { - "name": "external_id", - "type": "uuid", - "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": {} - }, - "public.mechanics": { - "name": "mechanics", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "slug": { - "name": "slug", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "mechanics_cuid_unique": { - "name": "mechanics_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.mechanics_to_external_ids": { - "name": "mechanics_to_external_ids", - "schema": "", - "columns": { - "mechanic_id": { - "name": "mechanic_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "external_id": { - "name": "external_id", - "type": "uuid", - "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": {} - }, - "public.mechanics_to_games": { - "name": "mechanics_to_games", - "schema": "", - "columns": { - "mechanic_id": { - "name": "mechanic_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "game_id": { - "name": "game_id", - "type": "uuid", - "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": {} - }, - "public.password_reset_tokens": { - "name": "password_reset_tokens", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "user_id": { - "name": "user_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "expires_at": { - "name": "expires_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": { - "password_reset_tokens_user_id_users_id_fk": { - "name": "password_reset_tokens_user_id_users_id_fk", - "tableFrom": "password_reset_tokens", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "public.publishers": { - "name": "publishers", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "slug": { - "name": "slug", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "publishers_cuid_unique": { - "name": "publishers_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.publishers_to_external_ids": { - "name": "publishers_to_external_ids", - "schema": "", - "columns": { - "publisher_id": { - "name": "publisher_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "external_id": { - "name": "external_id", - "type": "uuid", - "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": {} - }, - "public.publishers_to_games": { - "name": "publishers_to_games", - "schema": "", - "columns": { - "publisher_id": { - "name": "publisher_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "game_id": { - "name": "game_id", - "type": "uuid", - "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": {} - }, - "public.recovery_codes": { - "name": "recovery_codes", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "user_id": { - "name": "user_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "code": { - "name": "code", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "used": { - "name": "used", - "type": "boolean", - "primaryKey": false, - "notNull": false, - "default": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": { - "recovery_codes_user_id_users_id_fk": { - "name": "recovery_codes_user_id_users_id_fk", - "tableFrom": "recovery_codes", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "public.roles": { - "name": "roles", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "roles_cuid_unique": { - "name": "roles_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - }, - "roles_name_unique": { - "name": "roles_name_unique", - "nullsNotDistinct": false, - "columns": [ - "name" - ] - } - } - }, - "public.sessions": { - "name": "sessions", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "user_id": { - "name": "user_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "expires_at": { - "name": "expires_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true - }, - "ip_country": { - "name": "ip_country", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "ip_address": { - "name": "ip_address", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "two_factor_auth_enabled": { - "name": "two_factor_auth_enabled", - "type": "boolean", - "primaryKey": false, - "notNull": false, - "default": false - }, - "is_two_factor_authenticated": { - "name": "is_two_factor_authenticated", - "type": "boolean", - "primaryKey": false, - "notNull": false, - "default": 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": {} - }, - "public.two_factor": { - "name": "two_factor", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "secret": { - "name": "secret", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "enabled": { - "name": "enabled", - "type": "boolean", - "primaryKey": false, - "notNull": true, - "default": false - }, - "initiated_time": { - "name": "initiated_time", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - }, - "user_id": { - "name": "user_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": { - "two_factor_user_id_users_id_fk": { - "name": "two_factor_user_id_users_id_fk", - "tableFrom": "two_factor", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "two_factor_cuid_unique": { - "name": "two_factor_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - }, - "two_factor_user_id_unique": { - "name": "two_factor_user_id_unique", - "nullsNotDistinct": false, - "columns": [ - "user_id" - ] - } - } - }, - "public.user_roles": { - "name": "user_roles", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "user_id": { - "name": "user_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "role_id": { - "name": "role_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "primary": { - "name": "primary", - "type": "boolean", - "primaryKey": false, - "notNull": false, - "default": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "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": { - "user_roles_cuid_unique": { - "name": "user_roles_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.users": { - "name": "users", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "username": { - "name": "username", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "first_name": { - "name": "first_name", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "last_name": { - "name": "last_name", - "type": "text", - "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 - }, - "mfa_enabled": { - "name": "mfa_enabled", - "type": "boolean", - "primaryKey": false, - "notNull": true, - "default": false - }, - "theme": { - "name": "theme", - "type": "text", - "primaryKey": false, - "notNull": false, - "default": "'system'" - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "users_cuid_unique": { - "name": "users_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - }, - "users_username_unique": { - "name": "users_username_unique", - "nullsNotDistinct": false, - "columns": [ - "username" - ] - }, - "users_email_unique": { - "name": "users_email_unique", - "nullsNotDistinct": false, - "columns": [ - "email" - ] - } - } - }, - "public.wishlist_items": { - "name": "wishlist_items", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "wishlist_id": { - "name": "wishlist_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "game_id": { - "name": "game_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "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": { - "wishlist_items_cuid_unique": { - "name": "wishlist_items_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - }, - "public.wishlists": { - "name": "wishlists", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "uuid", - "primaryKey": true, - "notNull": true, - "default": "gen_random_uuid()" - }, - "cuid": { - "name": "cuid", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "user_id": { - "name": "user_id", - "type": "uuid", - "primaryKey": false, - "notNull": true - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "default": "'My Wishlist'" - }, - "created_at": { - "name": "created_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "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": { - "wishlists_cuid_unique": { - "name": "wishlists_cuid_unique", - "nullsNotDistinct": false, - "columns": [ - "cuid" - ] - } - } - } - }, - "enums": { - "public.external_id_type": { - "name": "external_id_type", - "schema": "public", - "values": [ - "game", - "category", - "mechanic", - "publisher", - "designer", - "artist" - ] - } - }, - "schemas": {}, - "sequences": {}, - "_meta": { - "columns": {}, - "schemas": {}, - "tables": {} - } -} \ No newline at end of file diff --git a/src/lib/server/api/databases/migrations/meta/_journal.json b/src/lib/server/api/databases/migrations/meta/_journal.json index 3fa0832..6022f03 100644 --- a/src/lib/server/api/databases/migrations/meta/_journal.json +++ b/src/lib/server/api/databases/migrations/meta/_journal.json @@ -5,43 +5,15 @@ { "idx": 0, "version": "7", - "when": 1720625651245, - "tag": "0000_dazzling_stick", + "when": 1725489682980, + "tag": "0000_volatile_warhawk", "breakpoints": true }, { "idx": 1, "version": "7", - "when": 1720625948784, - "tag": "0001_noisy_sally_floyd", - "breakpoints": true - }, - { - "idx": 2, - "version": "7", - "when": 1720626020902, - "tag": "0002_fancy_valkyrie", - "breakpoints": true - }, - { - "idx": 3, - "version": "7", - "when": 1723593488634, - "tag": "0003_worried_taskmaster", - "breakpoints": true - }, - { - "idx": 4, - "version": "7", - "when": 1725055403926, - "tag": "0004_heavy_sphinx", - "breakpoints": true - }, - { - "idx": 5, - "version": "7", - "when": 1725055643756, - "tag": "0005_true_mathemanic", + "when": 1726877846811, + "tag": "0001_pink_the_enforcers", "breakpoints": true } ] diff --git a/src/lib/server/api/databases/seed.ts b/src/lib/server/api/databases/seed.ts index de83be1..fcfffc3 100644 --- a/src/lib/server/api/databases/seed.ts +++ b/src/lib/server/api/databases/seed.ts @@ -1,14 +1,18 @@ -import { Table, getTableName, sql } from 'drizzle-orm' -import env from '../../../../env' -import { db, pool } from '../packages/drizzle' +import 'reflect-metadata' +import { DrizzleService } from '$lib/server/api/services/drizzle.service' +import { type Table, getTableName, sql } from 'drizzle-orm' +import type { NodePgDatabase } from 'drizzle-orm/node-postgres' +import env from '../common/env' import * as seeds from './seeds' import * as schema from './tables' +const drizzleService = new DrizzleService() + if (!env.DB_SEEDING) { throw new Error('You must set DB_SEEDING to "true" when running seeds') } -async function resetTable(db: db, table: Table) { +async function resetTable(db: NodePgDatabase, table: Table) { return db.execute(sql.raw(`TRUNCATE TABLE ${getTableName(table)} RESTART IDENTITY CASCADE`)) } @@ -19,33 +23,33 @@ for (const table of [ schema.collection_items, schema.collections, schema.credentialsTable, - schema.expansions, - schema.externalIds, + schema.expansionsTable, + schema.externalIdsTable, schema.federatedIdentityTable, - schema.games, - schema.gamesToExternalIds, - schema.mechanics, - schema.mechanicsToExternalIds, + schema.gamesTable, + schema.gamesToExternalIdsTable, + schema.mechanicsTable, + schema.mechanicsToExternalIdsTable, schema.mechanics_to_games, schema.password_reset_tokens, - schema.publishers, - schema.publishersToExternalIds, + schema.publishersTable, + schema.publishersToExternalIdsTable, schema.publishers_to_games, schema.recoveryCodesTable, - schema.roles, + schema.rolesTable, schema.sessionsTable, schema.twoFactorTable, schema.user_roles, schema.usersTable, schema.wishlist_items, - schema.wishlists, + schema.wishlistsTable, ]) { // await db.delete(table); // clear tables without truncating / resetting ids - await resetTable(db, table) + await resetTable(drizzleService.db, table) } -await seeds.roles(db) -await seeds.users(db) +await seeds.roles(drizzleService.db) +await seeds.users(drizzleService.db) -await pool.end() +await drizzleService.dispose() process.exit() diff --git a/src/lib/server/api/databases/seeds/roles.ts b/src/lib/server/api/databases/seeds/roles.ts index 518899c..1d5b0e7 100644 --- a/src/lib/server/api/databases/seeds/roles.ts +++ b/src/lib/server/api/databases/seeds/roles.ts @@ -1,11 +1,11 @@ -import * as schema from '$lib/server/api/databases/tables' -import { type db } from '$lib/server/api/packages/drizzle' +import type { db } from '../../packages/drizzle' +import * as schema from '../tables' import roles from './data/roles.json' export default async function seed(db: db) { - console.log('Creating roles ...') + console.log('Creating rolesTable ...') for (const role of roles) { - await db.insert(schema.roles).values(role).onConflictDoNothing() + await db.insert(schema.rolesTable).values(role).onConflictDoNothing() } console.log('Roles created.') } diff --git a/src/lib/server/api/databases/seeds/users.ts b/src/lib/server/api/databases/seeds/users.ts index 23ae9f6..ee039f2 100644 --- a/src/lib/server/api/databases/seeds/users.ts +++ b/src/lib/server/api/databases/seeds/users.ts @@ -1,35 +1,24 @@ -import * as schema from '$lib/server/api/databases/tables' -import { type db } from '$lib/server/api/packages/drizzle' import { eq } from 'drizzle-orm' -import { Argon2id } from 'oslo/password' -import { config } from '../../configs/config' +import type { db } from '../../packages/drizzle' +import { HashingService } from '../../services/hashing.service' +import * as schema from '../tables' import users from './data/users.json' -type JsonUser = { - id: string - username: string - email: string - password: string - roles: { - name: string - primary: boolean - }[] -} - type JsonRole = { name: string primary: boolean } export default async function seed(db: db) { - const adminRole = await db.select().from(schema.roles).where(eq(schema.roles.name, 'admin')) - const userRole = await db.select().from(schema.roles).where(eq(schema.roles.name, 'user')) + const hashingService = new HashingService() + const adminRole = await db.select().from(schema.rolesTable).where(eq(schema.rolesTable.name, 'admin')) + const userRole = await db.select().from(schema.rolesTable).where(eq(schema.rolesTable.name, 'user')) console.log('Admin Role: ', adminRole) const adminUser = await db .insert(schema.usersTable) .values({ - username: `${config.ADMIN_USERNAME}`, + username: `${process.env.ADMIN_USERNAME}`, email: '', first_name: 'Brad', last_name: 'S', @@ -43,12 +32,12 @@ export default async function seed(db: db) { await db.insert(schema.credentialsTable).values({ user_id: adminUser[0].id, type: schema.CredentialsType.PASSWORD, - secret_data: await new Argon2id().hash(`${config.ADMIN_PASSWORD}`), + secret_data: await hashingService.hash(`${process.env.ADMIN_PASSWORD}`), }) await db.insert(schema.collections).values({ user_id: adminUser[0].id }).onConflictDoNothing() - await db.insert(schema.wishlists).values({ user_id: adminUser[0].id }).onConflictDoNothing() + await db.insert(schema.wishlistsTable).values({ user_id: adminUser[0].id }).onConflictDoNothing() await db .insert(schema.user_roles) @@ -71,6 +60,7 @@ export default async function seed(db: db) { .onConflictDoNothing() console.log('Admin user given user role.') + const hasingService = new HashingService() await Promise.all( users.map(async (user) => { const [insertedUser] = await db @@ -82,14 +72,14 @@ export default async function seed(db: db) { await db.insert(schema.credentialsTable).values({ user_id: insertedUser?.id, type: schema.CredentialsType.PASSWORD, - secret_data: await new Argon2id().hash(user.password), + secret_data: await hasingService.hash(user.password), }) await db.insert(schema.collections).values({ user_id: insertedUser?.id }) - await db.insert(schema.wishlists).values({ user_id: insertedUser?.id }) + await db.insert(schema.wishlistsTable).values({ user_id: insertedUser?.id }) await Promise.all( user.roles.map(async (role: JsonRole) => { - const foundRole = await db.query.roles.findFirst({ - where: eq(schema.roles.name, role.name), + const foundRole = await db.query.rolesTable.findFirst({ + where: eq(schema.rolesTable.name, role.name), }) if (!foundRole) { throw new Error('Role not found') diff --git a/src/lib/server/api/databases/tables/categories.table.ts b/src/lib/server/api/databases/tables/categories.table.ts index ed69b23..8f32634 100644 --- a/src/lib/server/api/databases/tables/categories.table.ts +++ b/src/lib/server/api/databases/tables/categories.table.ts @@ -1,9 +1,9 @@ import { createId as cuid2 } from '@paralleldrive/cuid2' import { type InferSelectModel, relations } from 'drizzle-orm' import { pgTable, text, uuid } from 'drizzle-orm/pg-core' -import { timestamps } from '../../common/utils/table.utils' -import { categoriesToExternalIdsTable } from './categoriesToExternalIdsTable' -import { categories_to_games_table } from './categoriesToGames' +import { timestamps } from '../../common/utils/table' +import { categoriesToExternalIdsTable } from './categoriesToExternalIds.table' +import { categories_to_games_table } from './categoriesToGames.table' export const categoriesTable = pgTable('categories', { id: uuid('id').primaryKey().defaultRandom(), diff --git a/src/lib/server/api/databases/tables/categoriesToExternalIds.table.ts b/src/lib/server/api/databases/tables/categoriesToExternalIds.table.ts new file mode 100644 index 0000000..6825bf4 --- /dev/null +++ b/src/lib/server/api/databases/tables/categoriesToExternalIds.table.ts @@ -0,0 +1,34 @@ +import { relations } from 'drizzle-orm' +import { pgTable, primaryKey, uuid } from 'drizzle-orm/pg-core' +import { categoriesTable } from './categories.table' +import { externalIdsTable } from './externalIds.table' + +export const categoriesToExternalIdsTable = pgTable( + 'categories_to_external_ids', + { + categoryId: uuid('category_id') + .notNull() + .references(() => categoriesTable.id, { onDelete: 'restrict', onUpdate: 'cascade' }), + externalId: uuid('external_id') + .notNull() + .references(() => externalIdsTable.id, { onDelete: 'restrict', onUpdate: 'cascade' }), + }, + (table) => { + return { + categoriesToExternalIdsPkey: primaryKey({ + columns: [table.categoryId, table.externalId], + }), + } + }, +) + +export const categoriesToExternalIdsRelations = relations(categoriesToExternalIdsTable, ({ one }) => ({ + category: one(categoriesTable, { + fields: [categoriesToExternalIdsTable.categoryId], + references: [categoriesTable.id], + }), + externalId: one(externalIdsTable, { + fields: [categoriesToExternalIdsTable.externalId], + references: [externalIdsTable.id], + }), +})) diff --git a/src/lib/server/api/databases/tables/categoriesToExternalIdsTable.ts b/src/lib/server/api/databases/tables/categoriesToExternalIdsTable.ts deleted file mode 100644 index c8ab5f3..0000000 --- a/src/lib/server/api/databases/tables/categoriesToExternalIdsTable.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { pgTable, primaryKey, uuid } from 'drizzle-orm/pg-core'; -import { categoriesTable } from './categories.table'; -import { externalIds } from './externalIds'; -import { relations } from 'drizzle-orm'; - -export const categoriesToExternalIdsTable = pgTable( - 'categories_to_external_ids', - { - categoryId: uuid('category_id') - .notNull() - .references(() => categoriesTable.id, { onDelete: 'restrict', onUpdate: 'cascade' }), - externalId: uuid('external_id') - .notNull() - .references(() => externalIds.id, { onDelete: 'restrict', onUpdate: 'cascade' }), - }, - (table) => { - return { - categoriesToExternalIdsPkey: primaryKey({ - columns: [table.categoryId, table.externalId], - }), - }; - }, -); - -export const categoriesToExternalIdsRelations = relations( - categoriesToExternalIdsTable, - ({ one }) => ({ - category: one(categoriesTable, { - fields: [categoriesToExternalIdsTable.categoryId], - references: [categoriesTable.id], - }), - externalId: one(externalIds, { - fields: [categoriesToExternalIdsTable.externalId], - references: [externalIds.id], - }), - }), -); diff --git a/src/lib/server/api/databases/tables/categoriesToGames.ts b/src/lib/server/api/databases/tables/categoriesToGames.table.ts similarity index 65% rename from src/lib/server/api/databases/tables/categoriesToGames.ts rename to src/lib/server/api/databases/tables/categoriesToGames.table.ts index a977fdd..80bb6c5 100644 --- a/src/lib/server/api/databases/tables/categoriesToGames.ts +++ b/src/lib/server/api/databases/tables/categoriesToGames.table.ts @@ -1,7 +1,7 @@ -import { pgTable, primaryKey, uuid } from 'drizzle-orm/pg-core'; -import { relations } from 'drizzle-orm'; -import { categoriesTable } from './categories.table'; -import { games } from './games'; +import { relations } from 'drizzle-orm' +import { pgTable, primaryKey, uuid } from 'drizzle-orm/pg-core' +import { gamesTable } from '././games.table' +import { categoriesTable } from './categories.table' export const categories_to_games_table = pgTable( 'categories_to_games', @@ -11,25 +11,24 @@ export const categories_to_games_table = pgTable( .references(() => categoriesTable.id, { onDelete: 'restrict', onUpdate: 'cascade' }), game_id: uuid('game_id') .notNull() - .references(() => games.id, { onDelete: 'restrict', onUpdate: 'cascade' }), + .references(() => gamesTable.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_table, ({ one }) => ({ category: one(categoriesTable, { fields: [categories_to_games_table.category_id], references: [categoriesTable.id], }), - game: one(games, { + game: one(gamesTable, { fields: [categories_to_games_table.game_id], - references: [games.id], + references: [gamesTable.id], }), -})); - +})) diff --git a/src/lib/server/api/databases/tables/collectionItems.ts b/src/lib/server/api/databases/tables/collectionItems.table.ts similarity index 70% rename from src/lib/server/api/databases/tables/collectionItems.ts rename to src/lib/server/api/databases/tables/collectionItems.table.ts index 8466605..722a707 100644 --- a/src/lib/server/api/databases/tables/collectionItems.ts +++ b/src/lib/server/api/databases/tables/collectionItems.table.ts @@ -1,9 +1,9 @@ -import { timestamps } from '$lib/server/api/common/utils/table.utils' import { createId as cuid2 } from '@paralleldrive/cuid2' import { type InferSelectModel, relations } from 'drizzle-orm' import { integer, pgTable, text, uuid } from 'drizzle-orm/pg-core' -import { collections } from './collections' -import { games } from './games' +import { timestamps } from '../../common/utils/table' +import { gamesTable } from '././games.table' +import { collections } from './collections.table' export const collection_items = pgTable('collection_items', { id: uuid('id').primaryKey().defaultRandom(), @@ -15,20 +15,20 @@ export const collection_items = pgTable('collection_items', { .references(() => collections.id, { onDelete: 'cascade' }), game_id: uuid('game_id') .notNull() - .references(() => games.id, { onDelete: 'cascade' }), + .references(() => gamesTable.id, { onDelete: 'cascade' }), times_played: integer('times_played').default(0), ...timestamps, }) -export type CollectionItems = InferSelectModel +export type CollectionItemsTable = InferSelectModel export const collection_item_relations = relations(collection_items, ({ one }) => ({ collection: one(collections, { fields: [collection_items.collection_id], references: [collections.id], }), - game: one(games, { + game: one(gamesTable, { fields: [collection_items.game_id], - references: [games.id], + references: [gamesTable.id], }), })) diff --git a/src/lib/server/api/databases/tables/collections.ts b/src/lib/server/api/databases/tables/collections.table.ts similarity index 81% rename from src/lib/server/api/databases/tables/collections.ts rename to src/lib/server/api/databases/tables/collections.table.ts index e6a24ff..4b483df 100644 --- a/src/lib/server/api/databases/tables/collections.ts +++ b/src/lib/server/api/databases/tables/collections.table.ts @@ -1,8 +1,9 @@ import { createId as cuid2 } from '@paralleldrive/cuid2' import { type InferSelectModel, relations } from 'drizzle-orm' import { pgTable, text, uuid } from 'drizzle-orm/pg-core' -import { timestamps } from '../../common/utils/table.utils' +import { timestamps } from '../../common/utils/table' import { usersTable } from './users.table' +import { collection_items } from './collectionItems.table' export const collections = pgTable('collections', { id: uuid('id').primaryKey().defaultRandom(), @@ -16,11 +17,12 @@ export const collections = pgTable('collections', { ...timestamps, }) -export const collection_relations = relations(collections, ({ one }) => ({ +export const collection_relations = relations(collections, ({ one, many }) => ({ user: one(usersTable, { fields: [collections.user_id], references: [usersTable.id], }), + collection_items: many(collection_items), })) export type Collections = InferSelectModel diff --git a/src/lib/server/api/databases/tables/credentials.table.ts b/src/lib/server/api/databases/tables/credentials.table.ts index 37cac3c..1a15b7d 100644 --- a/src/lib/server/api/databases/tables/credentials.table.ts +++ b/src/lib/server/api/databases/tables/credentials.table.ts @@ -1,6 +1,6 @@ -import { type InferSelectModel } from 'drizzle-orm' +import type { InferSelectModel } from 'drizzle-orm' import { pgTable, text, uuid } from 'drizzle-orm/pg-core' -import { timestamps } from '../../common/utils/table.utils' +import { timestamps } from '../../common/utils/table' import { usersTable } from './users.table' export enum CredentialsType { diff --git a/src/lib/server/api/databases/tables/expansions.table.ts b/src/lib/server/api/databases/tables/expansions.table.ts new file mode 100644 index 0000000..fc9e634 --- /dev/null +++ b/src/lib/server/api/databases/tables/expansions.table.ts @@ -0,0 +1,32 @@ +import { createId as cuid2 } from '@paralleldrive/cuid2' +import { type InferSelectModel, relations } from 'drizzle-orm' +import { pgTable, text, uuid } from 'drizzle-orm/pg-core' +import { timestamps } from '../../common/utils/table' +import { gamesTable } from '././games.table' + +export const expansionsTable = pgTable('expansions', { + id: uuid('id').primaryKey().defaultRandom(), + cuid: text('cuid') + .unique() + .$defaultFn(() => cuid2()), + base_game_id: uuid('base_game_id') + .notNull() + .references(() => gamesTable.id, { onDelete: 'restrict', onUpdate: 'cascade' }), + game_id: uuid('game_id') + .notNull() + .references(() => gamesTable.id, { onDelete: 'restrict', onUpdate: 'cascade' }), + ...timestamps, +}) + +export type Expansions = InferSelectModel + +export const expansion_relations = relations(expansionsTable, ({ one }) => ({ + baseGame: one(gamesTable, { + fields: [expansionsTable.base_game_id], + references: [gamesTable.id], + }), + game: one(gamesTable, { + fields: [expansionsTable.game_id], + references: [gamesTable.id], + }), +})) diff --git a/src/lib/server/api/databases/tables/externalIds.table.ts b/src/lib/server/api/databases/tables/externalIds.table.ts new file mode 100644 index 0000000..0df8f31 --- /dev/null +++ b/src/lib/server/api/databases/tables/externalIds.table.ts @@ -0,0 +1,16 @@ +import { createId as cuid2 } from '@paralleldrive/cuid2' +import type { InferSelectModel } from 'drizzle-orm' +import { pgEnum, pgTable, text, uuid } from 'drizzle-orm/pg-core' + +export const externalIdType = pgEnum('external_id_type', ['game', 'category', 'mechanic', 'publisher', 'designer', 'artist']) + +export const externalIdsTable = pgTable('external_ids', { + id: uuid('id').primaryKey().defaultRandom(), + cuid: text('cuid') + .unique() + .$defaultFn(() => cuid2()), + type: externalIdType('type'), + externalId: text('external_id').notNull(), +}) + +export type ExternalIds = InferSelectModel diff --git a/src/lib/server/api/databases/tables/externalIds.ts b/src/lib/server/api/databases/tables/externalIds.ts deleted file mode 100644 index 80c1033..0000000 --- a/src/lib/server/api/databases/tables/externalIds.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { pgEnum, pgTable, text, uuid } from 'drizzle-orm/pg-core'; -import { createId as cuid2 } from '@paralleldrive/cuid2'; -import type { InferSelectModel } from 'drizzle-orm'; - -export const externalIdType = pgEnum('external_id_type', [ - 'game', - 'category', - 'mechanic', - 'publisher', - 'designer', - 'artist', -]); - -export const externalIds = pgTable('external_ids', { - id: uuid('id').primaryKey().defaultRandom(), - cuid: text('cuid') - .unique() - .$defaultFn(() => cuid2()), - type: externalIdType('type'), - externalId: text('external_id').notNull(), -}); - -export type ExternalIds = InferSelectModel; diff --git a/src/lib/server/api/databases/tables/federatedIdentity.table.ts b/src/lib/server/api/databases/tables/federatedIdentity.table.ts index e85232f..35b409b 100644 --- a/src/lib/server/api/databases/tables/federatedIdentity.table.ts +++ b/src/lib/server/api/databases/tables/federatedIdentity.table.ts @@ -1,6 +1,6 @@ import { type InferSelectModel } from 'drizzle-orm' import { pgTable, text, uuid } from 'drizzle-orm/pg-core' -import { timestamps } from '../../common/utils/table.utils' +import { timestamps } from '../../common/utils/table' import { usersTable } from './users.table' export const federatedIdentityTable = pgTable('federated_identity', { diff --git a/src/lib/server/api/databases/tables/games.ts b/src/lib/server/api/databases/tables/games.table.ts similarity index 69% rename from src/lib/server/api/databases/tables/games.ts rename to src/lib/server/api/databases/tables/games.table.ts index 94e75af..c2eb49e 100644 --- a/src/lib/server/api/databases/tables/games.ts +++ b/src/lib/server/api/databases/tables/games.table.ts @@ -1,13 +1,13 @@ import { createId as cuid2 } from '@paralleldrive/cuid2' import { type InferSelectModel, relations, sql } from 'drizzle-orm' import { index, integer, pgTable, text, timestamp, uuid } from 'drizzle-orm/pg-core' -import { timestamps } from '../../common/utils/table.utils' -import { categories_to_games_table } from './categoriesToGames' -import { gamesToExternalIds } from './gamesToExternalIds' -import { mechanics_to_games } from './mechanicsToGames' -import { publishers_to_games } from './publishersToGames' +import { timestamps } from '../../common/utils/table' +import { categories_to_games_table } from './categoriesToGames.table' +import { gamesToExternalIdsTable } from './gamesToExternalIds.table' +import { mechanics_to_games } from './mechanicsToGames.table' +import { publishers_to_games } from './publishersToGames.table' -export const games = pgTable( +export const gamesTable = pgTable( 'games', { id: uuid('id').primaryKey().defaultRandom(), @@ -41,11 +41,11 @@ export const games = pgTable( }), ) -export const gameRelations = relations(games, ({ many }) => ({ +export const gameRelations = relations(gamesTable, ({ many }) => ({ categories_to_games: many(categories_to_games_table), mechanics_to_games: many(mechanics_to_games), publishers_to_games: many(publishers_to_games), - gamesToExternalIds: many(gamesToExternalIds), + gamesToExternalIds: many(gamesToExternalIdsTable), })) -export type Games = InferSelectModel +export type Games = InferSelectModel diff --git a/src/lib/server/api/databases/tables/gamesToExternalIds.table.ts b/src/lib/server/api/databases/tables/gamesToExternalIds.table.ts new file mode 100644 index 0000000..3d56ccc --- /dev/null +++ b/src/lib/server/api/databases/tables/gamesToExternalIds.table.ts @@ -0,0 +1,34 @@ +import { pgTable, primaryKey, uuid } from 'drizzle-orm/pg-core' +import { gamesTable } from '././games.table' +import { externalIdsTable } from './externalIds.table' +import { relations } from 'drizzle-orm' + +export const gamesToExternalIdsTable = pgTable( + 'games_to_external_ids', + { + gameId: uuid('game_id') + .notNull() + .references(() => gamesTable.id, { onDelete: 'restrict', onUpdate: 'cascade' }), + externalId: uuid('external_id') + .notNull() + .references(() => externalIdsTable.id, { onDelete: 'restrict', onUpdate: 'cascade' }), + }, + (table) => { + return { + gamesToExternalIdsPkey: primaryKey({ + columns: [table.gameId, table.externalId], + }), + } + }, +) + +export const gamesToExternalIdsRelations = relations(gamesToExternalIdsTable, ({ one }) => ({ + game: one(gamesTable, { + fields: [gamesToExternalIdsTable.gameId], + references: [gamesTable.id], + }), + externalId: one(externalIdsTable, { + fields: [gamesToExternalIdsTable.externalId], + references: [externalIdsTable.id], + }), +})) \ No newline at end of file diff --git a/src/lib/server/api/databases/tables/gamesToExternalIds.ts b/src/lib/server/api/databases/tables/gamesToExternalIds.ts deleted file mode 100644 index b625924..0000000 --- a/src/lib/server/api/databases/tables/gamesToExternalIds.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { pgTable, primaryKey, uuid } from 'drizzle-orm/pg-core'; -import {games} from './games'; -import {externalIds} from './externalIds'; - -export const gamesToExternalIds = pgTable( - 'games_to_external_ids', - { - gameId: uuid('game_id') - .notNull() - .references(() => games.id, { onDelete: 'restrict', onUpdate: 'cascade' }), - externalId: uuid('external_id') - .notNull() - .references(() => externalIds.id, { onDelete: 'restrict', onUpdate: 'cascade' }), - }, - (table) => { - return { - gamesToExternalIdsPkey: primaryKey({ - columns: [table.gameId, table.externalId], - }), - }; - }, -); diff --git a/src/lib/server/api/databases/tables/index.ts b/src/lib/server/api/databases/tables/index.ts index 3f96c54..006272a 100644 --- a/src/lib/server/api/databases/tables/index.ts +++ b/src/lib/server/api/databases/tables/index.ts @@ -1,26 +1,26 @@ -export * from './categories.table'; -export * from './categoriesToExternalIdsTable'; -export * from './categoriesToGames'; -export * from './collectionItems'; -export * from './collections'; -export * from './credentials.table'; -export * from './expansions'; -export * from './externalIds'; -export * from './federatedIdentity.table'; -export * from './games'; -export * from './gamesToExternalIds'; -export * from './mechanics'; -export * from './mechanicsToExternalIds'; -export * from './mechanicsToGames' -export * from './passwordResetTokens'; -export * from './publishers'; -export * from './publishersToExternalIds'; -export * from './publishersToGames'; -export * from './recovery-codes.table'; -export * from './roles'; -export * from './sessions.table'; -export * from './two-factor.table'; -export * from './userRoles'; -export * from './users.table'; -export * from './wishlistItems'; -export * from './wishlists'; \ No newline at end of file +export * from './categories.table' +export * from './categoriesToExternalIds.table' +export * from './categoriesToGames.table' +export * from './collectionItems.table' +export * from './collections.table' +export * from './credentials.table' +export * from './expansions.table' +export * from './externalIds.table' +export * from './federatedIdentity.table' +export * from './games.table' +export * from './gamesToExternalIds.table' +export * from './mechanics.table' +export * from './mechanicsToExternalIds.table' +export * from './mechanicsToGames.table' +export * from './passwordResetTokens.table' +export * from './publishers.table' +export * from './publishersToExternalIds.table' +export * from './publishersToGames.table' +export * from './recovery-codes.table' +export * from './roles.table' +export * from './sessions.table' +export * from './two-factor.table' +export * from './userRoles.table' +export * from './users.table' +export * from './wishlistItems.table' +export * from './wishlists.table' diff --git a/src/lib/server/api/databases/tables/mechanics.table.ts b/src/lib/server/api/databases/tables/mechanics.table.ts new file mode 100644 index 0000000..fab6757 --- /dev/null +++ b/src/lib/server/api/databases/tables/mechanics.table.ts @@ -0,0 +1,23 @@ +import { createId as cuid2 } from '@paralleldrive/cuid2' +import { type InferSelectModel, relations } from 'drizzle-orm' +import { pgTable, text, uuid } from 'drizzle-orm/pg-core' +import { timestamps } from '../../common/utils/table' +import { mechanicsToExternalIdsTable } from './mechanicsToExternalIds.table' +import { mechanics_to_games } from './mechanicsToGames.table' + +export const mechanicsTable = pgTable('mechanics', { + id: uuid('id').primaryKey().defaultRandom(), + cuid: text('cuid') + .unique() + .$defaultFn(() => cuid2()), + name: text('name'), + slug: text('slug'), + ...timestamps, +}) + +export type Mechanics = InferSelectModel + +export const mechanics_relations = relations(mechanicsTable, ({ many }) => ({ + mechanics_to_games: many(mechanics_to_games), + mechanicsToExternalIds: many(mechanicsToExternalIdsTable), +})) diff --git a/src/lib/server/api/databases/tables/mechanicsToExternalIds.table.ts b/src/lib/server/api/databases/tables/mechanicsToExternalIds.table.ts new file mode 100644 index 0000000..840e062 --- /dev/null +++ b/src/lib/server/api/databases/tables/mechanicsToExternalIds.table.ts @@ -0,0 +1,34 @@ +import { pgTable, primaryKey, uuid } from 'drizzle-orm/pg-core' +import { externalIdsTable } from './externalIds.table' +import { mechanicsTable } from './mechanics.table' +import { relations } from 'drizzle-orm' + +export const mechanicsToExternalIdsTable = pgTable( + 'mechanics_to_external_ids', + { + mechanicId: uuid('mechanic_id') + .notNull() + .references(() => mechanicsTable.id, { onDelete: 'restrict', onUpdate: 'cascade' }), + externalId: uuid('external_id') + .notNull() + .references(() => externalIdsTable.id, { onDelete: 'restrict', onUpdate: 'cascade' }), + }, + (table) => { + return { + mechanicsToExternalIdsPkey: primaryKey({ + columns: [table.mechanicId, table.externalId], + }), + } + }, +) + +export const mechanicsToExternalIdsRelations = relations(mechanicsToExternalIdsTable, ({ one }) => ({ + mechanic: one(mechanicsTable, { + fields: [mechanicsToExternalIdsTable.mechanicId], + references: [mechanicsTable.id], + }), + externalId: one(externalIdsTable, { + fields: [mechanicsToExternalIdsTable.externalId], + references: [externalIdsTable.id], + }), +})) diff --git a/src/lib/server/api/databases/tables/mechanicsToExternalIds.ts b/src/lib/server/api/databases/tables/mechanicsToExternalIds.ts deleted file mode 100644 index b755eab..0000000 --- a/src/lib/server/api/databases/tables/mechanicsToExternalIds.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { pgTable, primaryKey, uuid } from 'drizzle-orm/pg-core'; -import {mechanics} from './mechanics'; -import {externalIds} from './externalIds'; - -export const mechanicsToExternalIds = pgTable( - 'mechanics_to_external_ids', - { - mechanicId: uuid('mechanic_id') - .notNull() - .references(() => mechanics.id, { onDelete: 'restrict', onUpdate: 'cascade' }), - externalId: uuid('external_id') - .notNull() - .references(() => externalIds.id, { onDelete: 'restrict', onUpdate: 'cascade' }), - }, - (table) => { - return { - mechanicsToExternalIdsPkey: primaryKey({ - columns: [table.mechanicId, table.externalId], - }), - }; - }, -); diff --git a/src/lib/server/api/databases/tables/mechanicsToGames.table.ts b/src/lib/server/api/databases/tables/mechanicsToGames.table.ts new file mode 100644 index 0000000..eaf9e5a --- /dev/null +++ b/src/lib/server/api/databases/tables/mechanicsToGames.table.ts @@ -0,0 +1,34 @@ +import { relations } from 'drizzle-orm' +import { pgTable, primaryKey, uuid } from 'drizzle-orm/pg-core' +import { gamesTable } from '././games.table' +import { mechanicsTable } from './mechanics.table' + +export const mechanics_to_games = pgTable( + 'mechanics_to_games', + { + mechanic_id: uuid('mechanic_id') + .notNull() + .references(() => mechanicsTable.id, { onDelete: 'restrict', onUpdate: 'cascade' }), + game_id: uuid('game_id') + .notNull() + .references(() => gamesTable.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 }) => ({ + mechanic: one(mechanicsTable, { + fields: [mechanics_to_games.mechanic_id], + references: [mechanicsTable.id], + }), + game: one(gamesTable, { + fields: [mechanics_to_games.game_id], + references: [gamesTable.id], + }), +})) diff --git a/src/lib/server/api/databases/tables/mechanicsToGames.ts b/src/lib/server/api/databases/tables/mechanicsToGames.ts deleted file mode 100644 index c81cde4..0000000 --- a/src/lib/server/api/databases/tables/mechanicsToGames.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { pgTable, primaryKey, uuid } from 'drizzle-orm/pg-core'; -import { relations } from 'drizzle-orm'; -import {mechanics} from './mechanics'; -import {games} from './games'; - -export const mechanics_to_games = pgTable( - 'mechanics_to_games', - { - mechanic_id: uuid('mechanic_id') - .notNull() - .references(() => mechanics.id, { onDelete: 'restrict', onUpdate: 'cascade' }), - game_id: uuid('game_id') - .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 }) => ({ - mechanic: one(mechanics, { - fields: [mechanics_to_games.mechanic_id], - references: [mechanics.id], - }), - game: one(games, { - fields: [mechanics_to_games.game_id], - references: [games.id], - }), -})); diff --git a/src/lib/server/api/databases/tables/passwordResetTokens.ts b/src/lib/server/api/databases/tables/passwordResetTokens.table.ts similarity index 82% rename from src/lib/server/api/databases/tables/passwordResetTokens.ts rename to src/lib/server/api/databases/tables/passwordResetTokens.table.ts index 9531e0e..df5444f 100644 --- a/src/lib/server/api/databases/tables/passwordResetTokens.ts +++ b/src/lib/server/api/databases/tables/passwordResetTokens.table.ts @@ -1,7 +1,7 @@ -import { timestamps } from '$lib/server/api/common/utils/table.utils' import { createId as cuid2 } from '@paralleldrive/cuid2' import { type InferSelectModel, relations } from 'drizzle-orm' import { pgTable, text, timestamp, uuid } from 'drizzle-orm/pg-core' +import { timestamps } from '../../common/utils/table' import { usersTable } from './users.table' export const password_reset_tokens = pgTable('password_reset_tokens', { @@ -15,7 +15,7 @@ export const password_reset_tokens = pgTable('password_reset_tokens', { ...timestamps, }) -export type PasswordResetTokens = InferSelectModel +export type PasswordResetTokensTable = InferSelectModel export const password_reset_token_relations = relations(password_reset_tokens, ({ one }) => ({ user: one(usersTable, { diff --git a/src/lib/server/api/databases/tables/publishers.table.ts b/src/lib/server/api/databases/tables/publishers.table.ts new file mode 100644 index 0000000..fd909b6 --- /dev/null +++ b/src/lib/server/api/databases/tables/publishers.table.ts @@ -0,0 +1,23 @@ +import { createId as cuid2 } from '@paralleldrive/cuid2' +import { type InferSelectModel, relations } from 'drizzle-orm' +import { pgTable, text, uuid } from 'drizzle-orm/pg-core' +import { timestamps } from '../../common/utils/table' +import { publishersToExternalIdsTable } from './publishersToExternalIds.table' +import { publishers_to_games } from './publishersToGames.table' + +export const publishersTable = pgTable('publishers', { + id: uuid('id').primaryKey().defaultRandom(), + cuid: text('cuid') + .unique() + .$defaultFn(() => cuid2()), + name: text('name'), + slug: text('slug'), + ...timestamps, +}) + +export type Publishers = InferSelectModel + +export const publishers_relations = relations(publishersTable, ({ many }) => ({ + publishersToGames: many(publishers_to_games), + publishersToExternalIds: many(publishersToExternalIdsTable), +})) \ No newline at end of file diff --git a/src/lib/server/api/databases/tables/publishersToExternalIds.table.ts b/src/lib/server/api/databases/tables/publishersToExternalIds.table.ts new file mode 100644 index 0000000..2249d2f --- /dev/null +++ b/src/lib/server/api/databases/tables/publishersToExternalIds.table.ts @@ -0,0 +1,34 @@ +import { pgTable, primaryKey, uuid } from 'drizzle-orm/pg-core' +import { externalIdsTable } from './externalIds.table' +import { publishersTable } from './publishers.table' +import { relations } from 'drizzle-orm' + +export const publishersToExternalIdsTable = pgTable( + 'publishers_to_external_ids', + { + publisherId: uuid('publisher_id') + .notNull() + .references(() => publishersTable.id, { onDelete: 'restrict', onUpdate: 'cascade' }), + externalId: uuid('external_id') + .notNull() + .references(() => externalIdsTable.id, { onDelete: 'restrict', onUpdate: 'cascade' }), + }, + (table) => { + return { + publishersToExternalIdsPkey: primaryKey({ + columns: [table.publisherId, table.externalId], + }), + } + }, +) + +export const publishersToExternalIdsRelations = relations(publishersToExternalIdsTable, ({ one }) => ({ + publisher: one(publishersTable, { + fields: [publishersToExternalIdsTable.publisherId], + references: [publishersTable.id], + }), + externalId: one(externalIdsTable, { + fields: [publishersToExternalIdsTable.externalId], + references: [externalIdsTable.id], + }), +})) diff --git a/src/lib/server/api/databases/tables/publishersToExternalIds.ts b/src/lib/server/api/databases/tables/publishersToExternalIds.ts deleted file mode 100644 index 1f630d8..0000000 --- a/src/lib/server/api/databases/tables/publishersToExternalIds.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { pgTable, primaryKey, uuid } from 'drizzle-orm/pg-core'; -import {publishers} from './publishers'; -import {externalIds} from './externalIds'; - -export const publishersToExternalIds = pgTable( - 'publishers_to_external_ids', - { - publisherId: uuid('publisher_id') - .notNull() - .references(() => publishers.id, { onDelete: 'restrict', onUpdate: 'cascade' }), - externalId: uuid('external_id') - .notNull() - .references(() => externalIds.id, { onDelete: 'restrict', onUpdate: 'cascade' }), - }, - (table) => { - return { - publishersToExternalIdsPkey: primaryKey({ - columns: [table.publisherId, table.externalId], - }), - }; - }, -); diff --git a/src/lib/server/api/databases/tables/publishersToGames.ts b/src/lib/server/api/databases/tables/publishersToGames.table.ts similarity index 50% rename from src/lib/server/api/databases/tables/publishersToGames.ts rename to src/lib/server/api/databases/tables/publishersToGames.table.ts index f2c2d24..3d772a2 100644 --- a/src/lib/server/api/databases/tables/publishersToGames.ts +++ b/src/lib/server/api/databases/tables/publishersToGames.table.ts @@ -1,34 +1,34 @@ -import { pgTable, primaryKey, uuid } from 'drizzle-orm/pg-core'; -import { relations } from 'drizzle-orm'; -import {publishers} from './publishers'; -import {games} from './games'; +import { relations } from 'drizzle-orm' +import { pgTable, primaryKey, uuid } from 'drizzle-orm/pg-core' +import { gamesTable } from '././games.table' +import { publishersTable } from './publishers.table' export const publishers_to_games = pgTable( 'publishers_to_games', { publisher_id: uuid('publisher_id') .notNull() - .references(() => publishers.id, { onDelete: 'restrict', onUpdate: 'cascade' }), + .references(() => publishersTable.id, { onDelete: 'restrict', onUpdate: 'cascade' }), game_id: uuid('game_id') .notNull() - .references(() => games.id, { onDelete: 'restrict', onUpdate: 'cascade' }), + .references(() => gamesTable.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 }) => ({ - publisher: one(publishers, { + publisher: one(publishersTable, { fields: [publishers_to_games.publisher_id], - references: [publishers.id], + references: [publishersTable.id], }), - game: one(games, { + game: one(gamesTable, { fields: [publishers_to_games.game_id], - references: [games.id], + references: [gamesTable.id], }), -})); +})) diff --git a/src/lib/server/api/databases/tables/recovery-codes.table.ts b/src/lib/server/api/databases/tables/recovery-codes.table.ts index 683df9a..d79e469 100644 --- a/src/lib/server/api/databases/tables/recovery-codes.table.ts +++ b/src/lib/server/api/databases/tables/recovery-codes.table.ts @@ -1,6 +1,6 @@ -import { timestamps } from '../../common/utils/table.utils' import type { InferSelectModel } from 'drizzle-orm' import { boolean, pgTable, text, uuid } from 'drizzle-orm/pg-core' +import { timestamps } from '../../common/utils/table' import { usersTable } from './users.table' export const recoveryCodesTable = pgTable('recovery_codes', { diff --git a/src/lib/server/api/databases/tables/roles.ts b/src/lib/server/api/databases/tables/roles.table.ts similarity index 51% rename from src/lib/server/api/databases/tables/roles.ts rename to src/lib/server/api/databases/tables/roles.table.ts index 1807480..e9f036f 100644 --- a/src/lib/server/api/databases/tables/roles.ts +++ b/src/lib/server/api/databases/tables/roles.table.ts @@ -1,10 +1,17 @@ -import { timestamps } from '../../common/utils/table.utils' import { createId as cuid2 } from '@paralleldrive/cuid2' import { type InferSelectModel, relations } from 'drizzle-orm' import { pgTable, text, uuid } from 'drizzle-orm/pg-core' -import { user_roles } from './userRoles' +import { timestamps } from '../../common/utils/table' +import { user_roles } from './userRoles.table' -export const roles = pgTable('roles', { +export enum RoleName { + ADMIN = 'admin', + EDITOR = 'editor', + MODERATOR = 'moderator', + USER = 'user', +} + +export const rolesTable = pgTable('roles', { id: uuid('id').primaryKey().defaultRandom(), cuid: text('cuid') .unique() @@ -14,8 +21,8 @@ export const roles = pgTable('roles', { ...timestamps, }) -export type Roles = InferSelectModel +export type Roles = InferSelectModel -export const role_relations = relations(roles, ({ many }) => ({ +export const role_relations = relations(rolesTable, ({ many }) => ({ user_roles: many(user_roles), })) diff --git a/src/lib/server/api/databases/tables/two-factor.table.ts b/src/lib/server/api/databases/tables/two-factor.table.ts index 1c6fd5f..f5e794f 100644 --- a/src/lib/server/api/databases/tables/two-factor.table.ts +++ b/src/lib/server/api/databases/tables/two-factor.table.ts @@ -1,7 +1,7 @@ -import { timestamps } from '../../common/utils/table.utils' import { createId as cuid2 } from '@paralleldrive/cuid2' import { type InferSelectModel, relations } from 'drizzle-orm' import { boolean, pgTable, text, timestamp, uuid } from 'drizzle-orm/pg-core' +import { timestamps } from '../../common/utils/table' import { usersTable } from './users.table' export const twoFactorTable = pgTable('two_factor', { diff --git a/src/lib/server/api/databases/tables/userRoles.ts b/src/lib/server/api/databases/tables/userRoles.table.ts similarity index 74% rename from src/lib/server/api/databases/tables/userRoles.ts rename to src/lib/server/api/databases/tables/userRoles.table.ts index 198a807..e55d121 100644 --- a/src/lib/server/api/databases/tables/userRoles.ts +++ b/src/lib/server/api/databases/tables/userRoles.table.ts @@ -1,8 +1,8 @@ -import { timestamps } from '../../common/utils/table.utils' import { createId as cuid2 } from '@paralleldrive/cuid2' import { type InferSelectModel, relations } from 'drizzle-orm' import { boolean, pgTable, text, uuid } from 'drizzle-orm/pg-core' -import { roles } from './roles' +import { timestamps } from '../../common/utils/table' +import { rolesTable } from './roles.table' import { usersTable } from './users.table' export const user_roles = pgTable('user_roles', { @@ -15,15 +15,15 @@ export const user_roles = pgTable('user_roles', { .references(() => usersTable.id, { onDelete: 'cascade' }), role_id: uuid('role_id') .notNull() - .references(() => roles.id, { onDelete: 'cascade' }), + .references(() => rolesTable.id, { onDelete: 'cascade' }), primary: boolean('primary').default(false), ...timestamps, }) export const user_role_relations = relations(user_roles, ({ one }) => ({ - role: one(roles, { + role: one(rolesTable, { fields: [user_roles.role_id], - references: [roles.id], + references: [rolesTable.id], }), user: one(usersTable, { fields: [user_roles.user_id], @@ -31,4 +31,4 @@ export const user_role_relations = relations(user_roles, ({ one }) => ({ }), })) -export type UserRoles = InferSelectModel +export type UserRolesTable = InferSelectModel diff --git a/src/lib/server/api/databases/tables/users.table.ts b/src/lib/server/api/databases/tables/users.table.ts index 53e244c..c244bbd 100644 --- a/src/lib/server/api/databases/tables/users.table.ts +++ b/src/lib/server/api/databases/tables/users.table.ts @@ -1,8 +1,8 @@ -import { timestamps } from '../../common/utils/table.utils' import { createId as cuid2 } from '@paralleldrive/cuid2' import { type InferSelectModel, relations } from 'drizzle-orm' import { boolean, pgTable, text, uuid } from 'drizzle-orm/pg-core' -import { user_roles } from './userRoles' +import { timestamps } from '../../common/utils/table' +import { user_roles } from './userRoles.table' export const usersTable = pgTable('users', { id: uuid('id').primaryKey().defaultRandom(), @@ -15,6 +15,8 @@ export const usersTable = pgTable('users', { last_name: text('last_name'), verified: boolean('verified').default(false), receive_email: boolean('receive_email').default(false), + email_verified: boolean('email_verified').default(false), + picture: text('picture'), mfa_enabled: boolean('mfa_enabled').notNull().default(false), theme: text('theme').default('system'), ...timestamps, diff --git a/src/lib/server/api/databases/tables/wishlistItems.ts b/src/lib/server/api/databases/tables/wishlistItems.table.ts similarity index 56% rename from src/lib/server/api/databases/tables/wishlistItems.ts rename to src/lib/server/api/databases/tables/wishlistItems.table.ts index e4e7545..358395d 100644 --- a/src/lib/server/api/databases/tables/wishlistItems.ts +++ b/src/lib/server/api/databases/tables/wishlistItems.table.ts @@ -1,9 +1,9 @@ -import { timestamps } from '../../common/utils/table.utils' import { createId as cuid2 } from '@paralleldrive/cuid2' import { type InferSelectModel, relations } from 'drizzle-orm' import { pgTable, text, uuid } from 'drizzle-orm/pg-core' -import { games } from './games' -import { wishlists } from './wishlists' +import { timestamps } from '../../common/utils/table' +import { gamesTable } from '././games.table' +import { wishlistsTable } from './wishlists.table' export const wishlist_items = pgTable('wishlist_items', { id: uuid('id').primaryKey().defaultRandom(), @@ -12,22 +12,22 @@ export const wishlist_items = pgTable('wishlist_items', { .$defaultFn(() => cuid2()), wishlist_id: uuid('wishlist_id') .notNull() - .references(() => wishlists.id, { onDelete: 'cascade' }), + .references(() => wishlistsTable.id, { onDelete: 'cascade' }), game_id: uuid('game_id') .notNull() - .references(() => games.id, { onDelete: 'cascade' }), + .references(() => gamesTable.id, { onDelete: 'cascade' }), ...timestamps, }) -export type WishlistItems = InferSelectModel +export type WishlistItemsTable = InferSelectModel export const wishlist_item_relations = relations(wishlist_items, ({ one }) => ({ - wishlist: one(wishlists, { + wishlist: one(wishlistsTable, { fields: [wishlist_items.wishlist_id], - references: [wishlists.id], + references: [wishlistsTable.id], }), - game: one(games, { + game: one(gamesTable, { fields: [wishlist_items.game_id], - references: [games.id], + references: [gamesTable.id], }), })) diff --git a/src/lib/server/api/databases/tables/wishlists.ts b/src/lib/server/api/databases/tables/wishlists.table.ts similarity index 66% rename from src/lib/server/api/databases/tables/wishlists.ts rename to src/lib/server/api/databases/tables/wishlists.table.ts index deec3b5..34f7bf8 100644 --- a/src/lib/server/api/databases/tables/wishlists.ts +++ b/src/lib/server/api/databases/tables/wishlists.table.ts @@ -1,10 +1,10 @@ -import { timestamps } from '../../common/utils/table.utils' import { createId as cuid2 } from '@paralleldrive/cuid2' import { type InferSelectModel, relations } from 'drizzle-orm' import { pgTable, text, uuid } from 'drizzle-orm/pg-core' +import { timestamps } from '../../common/utils/table' import { usersTable } from './users.table' -export const wishlists = pgTable('wishlists', { +export const wishlistsTable = pgTable('wishlists', { id: uuid('id').primaryKey().defaultRandom(), cuid: text('cuid') .unique() @@ -16,11 +16,11 @@ export const wishlists = pgTable('wishlists', { ...timestamps, }) -export type Wishlists = InferSelectModel +export type Wishlists = InferSelectModel -export const wishlists_relations = relations(wishlists, ({ one }) => ({ +export const wishlists_relations = relations(wishlistsTable, ({ one }) => ({ user: one(usersTable, { - fields: [wishlists.user_id], + fields: [wishlistsTable.user_id], references: [usersTable.id], }), })) diff --git a/src/lib/server/api/dtos/change-password.dto.ts b/src/lib/server/api/dtos/change-password.dto.ts new file mode 100644 index 0000000..b624722 --- /dev/null +++ b/src/lib/server/api/dtos/change-password.dto.ts @@ -0,0 +1,17 @@ +import { refinePasswords } from '$lib/validations/account' +import { z } from 'zod' + +export const changePasswordDto = z + .object({ + password: z.string({ required_error: 'Password is required' }).trim(), + confirm_password: z + .string({ required_error: 'Confirm Password is required' }) + .trim() + .min(8, { message: 'Must be at least 8 characters' }) + .max(128, { message: 'Must be less than 128 characters' }), + }) + .superRefine(({ confirm_password, password }, ctx) => { + return refinePasswords(confirm_password, password, ctx) + }) + +export type ChangePasswordDto = z.infer diff --git a/src/lib/server/api/dtos/update-profile.dto.ts b/src/lib/server/api/dtos/update-profile.dto.ts index 9ea0c6f..1ce379b 100644 --- a/src/lib/server/api/dtos/update-profile.dto.ts +++ b/src/lib/server/api/dtos/update-profile.dto.ts @@ -1,23 +1,14 @@ -import { z } from "zod"; +import { z } from 'zod' export const updateProfileDto = z.object({ firstName: z .string() .trim() - .min(3, {message: 'Must be at least 3 characters'}) - .max(50, {message: 'Must be less than 50 characters'}) + .min(3, { message: 'Must be at least 3 characters' }) + .max(50, { message: 'Must be less than 50 characters' }) .optional(), - lastName: z - .string() - .trim() - .min(3, {message: 'Must be at least 3 characters'}) - .max(50, {message: 'Must be less than 50 characters'}) - .optional(), - username: z - .string() - .trim() - .min(3, {message: 'Must be at least 3 characters'}) - .max(50, {message: 'Must be less than 50 characters'}) -}); + lastName: z.string().trim().min(3, { message: 'Must be at least 3 characters' }).max(50, { message: 'Must be less than 50 characters' }).optional(), + username: z.string().trim().min(3, { message: 'Must be at least 3 characters' }).max(50, { message: 'Must be less than 50 characters' }), +}) -export type UpdateProfileDto = z.infer; +export type UpdateProfileDto = z.infer diff --git a/src/lib/server/api/index.ts b/src/lib/server/api/index.ts index 18ba883..3106d86 100644 --- a/src/lib/server/api/index.ts +++ b/src/lib/server/api/index.ts @@ -1,6 +1,7 @@ import 'reflect-metadata' import { CollectionController } from '$lib/server/api/controllers/collection.controller' import { MfaController } from '$lib/server/api/controllers/mfa.controller' +import { OAuthController } from '$lib/server/api/controllers/oauth.controller' import { SignupController } from '$lib/server/api/controllers/signup.controller' import { UserController } from '$lib/server/api/controllers/user.controller' import { WishlistController } from '$lib/server/api/controllers/wishlist.controller' @@ -10,7 +11,7 @@ import { hc } from 'hono/client' import { cors } from 'hono/cors' import { logger } from 'hono/logger' import { container } from 'tsyringe' -import { config } from './configs/config' +import { config } from './common/config' import { IamController } from './controllers/iam.controller' import { LoginController } from './controllers/login.controller' import { validateAuthSession, verifyOrigin } from './middleware/auth.middleware' @@ -44,6 +45,7 @@ const routes = app .route('/me', container.resolve(IamController).routes()) .route('/user', container.resolve(UserController).routes()) .route('/login', container.resolve(LoginController).routes()) + .route('/oauth', container.resolve(OAuthController).routes()) .route('/signup', container.resolve(SignupController).routes()) .route('/wishlists', container.resolve(WishlistController).routes()) .route('/collections', container.resolve(CollectionController).routes()) diff --git a/src/lib/server/api/jobs/auth-cleanup.job.ts b/src/lib/server/api/jobs/auth-cleanup.job.ts index fb2ec6c..efaf1c1 100644 --- a/src/lib/server/api/jobs/auth-cleanup.job.ts +++ b/src/lib/server/api/jobs/auth-cleanup.job.ts @@ -10,11 +10,11 @@ export class AuthCleanupJobs { this.queue = this.jobsService.createQueue('test') /* ---------------------------- Register Workers ---------------------------- */ - this.worker().then((r) => console.log('auth-cleanup job worker started')) + this.worker().then(() => console.log('auth-cleanup job worker started')) } async deleteStaleEmailVerificationRequests() { - await this.queue.add('delete_stale_email_verifiactions', null, { + await this.queue.add('delete_stale_email_verifications', null, { repeat: { pattern: '0 0 * * 0', // Runs once a week at midnight on Sunday }, @@ -31,7 +31,7 @@ export class AuthCleanupJobs { private async worker() { return this.jobsService.createWorker(this.queue.name, async (job) => { - if (job.name === 'delete_stale_email_verifiactions') { + if (job.name === 'delete_stale_email_verifications') { // delete stale email verifications } if (job.name === 'delete_stale_login_requests') { diff --git a/src/lib/server/api/middleware/auth.middleware.ts b/src/lib/server/api/middleware/auth.middleware.ts index 5d2eab7..b88418b 100644 --- a/src/lib/server/api/middleware/auth.middleware.ts +++ b/src/lib/server/api/middleware/auth.middleware.ts @@ -1,10 +1,12 @@ +import { LuciaService } from '$lib/server/api/services/lucia.service' import type { MiddlewareHandler } from 'hono' import { createMiddleware } from 'hono/factory' -import type { Session, User } from 'lucia' import { verifyRequestOrigin } from 'oslo/request' -import { Unauthorized } from '../common/exceptions' -import { lucia } from '../packages/lucia' -import type { HonoTypes } from '../types' +import { container } from 'tsyringe' +import type { HonoTypes } from '../common/types/hono' + +// resolve dependencies from the container +const { lucia } = container.resolve(LuciaService) export const verifyOrigin: MiddlewareHandler = createMiddleware(async (c, next) => { if (c.req.method === 'GET') { @@ -27,7 +29,7 @@ export const validateAuthSession: MiddlewareHandler = createMiddlewar } const { session, user } = await lucia.validateSession(sessionId) - if (session && session.fresh) { + if (session?.fresh) { c.header('Set-Cookie', lucia.createSessionCookie(session.id).serialize(), { append: true }) } if (!session) { @@ -37,14 +39,3 @@ export const validateAuthSession: MiddlewareHandler = createMiddlewar c.set('user', user) return next() }) - -export const requireAuth: MiddlewareHandler<{ - Variables: { - session: Session - user: User - } -}> = createMiddleware(async (c, next) => { - const user = c.var.user - if (!user) throw Unauthorized('You must be logged in to access this resource') - return next() -}) diff --git a/src/lib/server/api/middleware/rate-limiter.middleware.ts b/src/lib/server/api/middleware/rate-limiter.middleware.ts index 9b49d10..97f0919 100644 --- a/src/lib/server/api/middleware/rate-limiter.middleware.ts +++ b/src/lib/server/api/middleware/rate-limiter.middleware.ts @@ -1,10 +1,11 @@ import { rateLimiter } from 'hono-rate-limiter' -import RedisClient from 'ioredis' import { RedisStore } from 'rate-limit-redis' -import { config } from '../configs/config' -import type { HonoTypes } from '../types' +import { container } from 'tsyringe' +import type { HonoTypes } from '../common/types/hono' +import { RedisService } from '../services/redis.service' -const client = new RedisClient(config.REDIS_URL) +// resolve dependencies from the container +const { client } = container.resolve(RedisService) export function limiter({ limit, diff --git a/src/lib/server/api/middleware/require-auth.middleware.ts b/src/lib/server/api/middleware/require-auth.middleware.ts new file mode 100644 index 0000000..5ca6e09 --- /dev/null +++ b/src/lib/server/api/middleware/require-auth.middleware.ts @@ -0,0 +1,15 @@ +import { Unauthorized } from '$lib/server/api/common/exceptions' +import type { MiddlewareHandler } from 'hono' +import { createMiddleware } from 'hono/factory' +import type { Session, User } from 'lucia' + +export const requireAuth: MiddlewareHandler<{ + Variables: { + session: Session + user: User + } +}> = createMiddleware(async (c, next) => { + const user = c.var.user + if (!user) throw Unauthorized('You must be logged in to access this resource') + return next() +}) diff --git a/src/lib/server/api/mockTest.ts b/src/lib/server/api/mockTest.ts deleted file mode 100644 index a475662..0000000 --- a/src/lib/server/api/mockTest.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Argon2id } from "oslo/password"; - -export async function hash(value: string) { - const argon2 = new Argon2id() - return argon2.hash(value); -} - -export function verify(hashedValue: string, value: string) { - return new Argon2id().verify(hashedValue, value); -} diff --git a/src/lib/server/api/packages/drizzle.ts b/src/lib/server/api/packages/drizzle.ts index 474ce89..c950e4d 100644 --- a/src/lib/server/api/packages/drizzle.ts +++ b/src/lib/server/api/packages/drizzle.ts @@ -1,6 +1,6 @@ import { drizzle } from 'drizzle-orm/node-postgres' import pg from 'pg' -import { config } from '../configs/config' +import { config } from '../common/config' import * as schema from '../databases/tables' // create the connection diff --git a/src/lib/server/api/packages/lucia.ts b/src/lib/server/api/packages/lucia.ts deleted file mode 100644 index 825e478..0000000 --- a/src/lib/server/api/packages/lucia.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { DrizzlePostgreSQLAdapter } from '@lucia-auth/adapter-drizzle' -// lib/server/lucia.ts -import { Lucia, TimeSpan } from 'lucia' -import { config } from '../configs/config' -import { sessionsTable, usersTable } from '../databases/tables' -import { db } from './drizzle' - -const adapter = new DrizzlePostgreSQLAdapter(db, sessionsTable, usersTable) - -export const lucia = new Lucia(adapter, { - getSessionAttributes: (attributes) => { - return { - ipCountry: attributes.ip_country, - ipAddress: attributes.ip_address, - isTwoFactorAuthEnabled: attributes.twoFactorAuthEnabled, - isTwoFactorAuthenticated: attributes.isTwoFactorAuthenticated, - } - }, - getUserAttributes: (attributes) => { - return { - // ...attributes, - username: attributes.username, - email: attributes.email, - firstName: attributes.first_name, - lastName: attributes.last_name, - mfa_enabled: attributes.mfa_enabled, - theme: attributes.theme, - } - }, - sessionExpiresIn: new TimeSpan(2, 'w'), // 2 weeks - sessionCookie: { - name: 'session', - expires: false, // session cookies have very long lifespan (2 years) - attributes: { - // set to `true` when using HTTPS - secure: config.isProduction, - sameSite: 'strict', - domain: config.domain, - }, - }, -}) - -declare module 'lucia' { - interface Register { - Lucia: typeof lucia - DatabaseUserAttributes: DatabaseUserAttributes - DatabaseSessionAttributes: DatabaseSessionAttributes - } - interface DatabaseSessionAttributes { - ip_country: string - ip_address: string - twoFactorAuthEnabled: boolean - isTwoFactorAuthenticated: boolean - } - interface DatabaseUserAttributes { - username: string - email: string - first_name: string - last_name: string - mfa_enabled: boolean - theme: string - } -} diff --git a/src/lib/server/api/providers/redis.provider.ts b/src/lib/server/api/providers/redis.provider.ts index cf7ec0d..490cbd2 100644 --- a/src/lib/server/api/providers/redis.provider.ts +++ b/src/lib/server/api/providers/redis.provider.ts @@ -1,6 +1,6 @@ import RedisClient from 'ioredis' import { container } from 'tsyringe' -import { config } from '../configs/config' +import { config } from '../common/config' export const RedisProvider = Symbol('REDIS_TOKEN') export type RedisProvider = RedisClient diff --git a/src/lib/server/api/repositories/collections.repository.ts b/src/lib/server/api/repositories/collections.repository.ts index fa5669d..c351714 100644 --- a/src/lib/server/api/repositories/collections.repository.ts +++ b/src/lib/server/api/repositories/collections.repository.ts @@ -1,6 +1,5 @@ -import type { Repository } from '$lib/server/api/common/interfaces/repository.interface' -import { takeFirstOrThrow } from '$lib/server/api/common/utils/repository.utils' -import { DatabaseProvider } from '$lib/server/api/providers/database.provider' +import { takeFirstOrThrow } from '$lib/server/api/common/utils/repository' +import { DrizzleService } from '$lib/server/api/services/drizzle.service' import { type InferInsertModel, eq } from 'drizzle-orm' import { inject, injectable } from 'tsyringe' import { collections } from '../databases/tables' @@ -9,15 +8,15 @@ export type CreateCollection = InferInsertModel export type UpdateCollection = Partial @injectable() -export class CollectionsRepository implements Repository { - constructor(@inject(DatabaseProvider) private readonly db: DatabaseProvider) {} +export class CollectionsRepository { + constructor(@inject(DrizzleService) private readonly drizzle: DrizzleService) {} - async findAll() { - return this.db.query.collections.findMany() + async findAll(db = this.drizzle.db) { + return db.query.collections.findMany() } - async findOneById(id: string) { - return this.db.query.collections.findFirst({ + async findOneById(id: string, db = this.drizzle.db) { + return db.query.collections.findFirst({ where: eq(collections.id, id), columns: { cuid: true, @@ -26,8 +25,8 @@ export class CollectionsRepository implements Repository { }) } - async findOneByCuid(cuid: string) { - return this.db.query.collections.findFirst({ + async findOneByCuid(cuid: string, db = this.drizzle.db) { + return db.query.collections.findFirst({ where: eq(collections.cuid, cuid), columns: { cuid: true, @@ -36,8 +35,8 @@ export class CollectionsRepository implements Repository { }) } - async findOneByUserId(userId: string) { - return this.db.query.collections.findFirst({ + async findOneByUserId(userId: string, db = this.drizzle.db) { + return db.query.collections.findFirst({ where: eq(collections.user_id, userId), columns: { cuid: true, @@ -46,21 +45,34 @@ export class CollectionsRepository implements Repository { }) } - async findAllByUserId(userId: string) { - return this.db.query.collections.findMany({ + async findAllByUserId(userId: string, db = this.drizzle.db) { + return db.query.collections.findMany({ where: eq(collections.user_id, userId), }) } - async create(data: CreateCollection) { - return this.db.insert(collections).values(data).returning().then(takeFirstOrThrow) + async findAllByUserIdWithDetails(userId: string, db = this.drizzle.db) { + return db.query.collections.findMany({ + where: eq(collections.user_id, userId), + columns: { + cuid: true, + name: true, + }, + with: { + collection_items: { + columns: { + cuid: true, + }, + }, + }, + }) } - async update(id: string, data: UpdateCollection) { - return this.db.update(collections).set(data).where(eq(collections.id, id)).returning().then(takeFirstOrThrow) + async create(data: CreateCollection, db = this.drizzle.db) { + return db.insert(collections).values(data).returning().then(takeFirstOrThrow) } - trxHost(trx: DatabaseProvider) { - return new CollectionsRepository(trx) + async update(id: string, data: UpdateCollection, db = this.drizzle.db) { + return db.update(collections).set(data).where(eq(collections.id, id)).returning().then(takeFirstOrThrow) } } diff --git a/src/lib/server/api/repositories/credentials.repository.ts b/src/lib/server/api/repositories/credentials.repository.ts index 1ff99e9..bdd8de5 100644 --- a/src/lib/server/api/repositories/credentials.repository.ts +++ b/src/lib/server/api/repositories/credentials.repository.ts @@ -1,75 +1,71 @@ import 'reflect-metadata' -import type { Repository } from '$lib/server/api/common/interfaces/repository.interface' import { CredentialsType, credentialsTable } from '$lib/server/api/databases/tables/credentials.table' -import { DatabaseProvider } from '$lib/server/api/providers/database.provider' +import { DrizzleService } from '$lib/server/api/services/drizzle.service' import { type InferInsertModel, and, eq } from 'drizzle-orm' import { inject, injectable } from 'tsyringe' -import { takeFirstOrThrow } from '../common/utils/repository.utils' +import { takeFirstOrThrow } from '../common/utils/repository' export type CreateCredentials = InferInsertModel export type UpdateCredentials = Partial +export type DeleteCredentials = Pick @injectable() -export class CredentialsRepository implements Repository { - constructor(@inject(DatabaseProvider) private readonly db: DatabaseProvider) {} +export class CredentialsRepository { + constructor(@inject(DrizzleService) private readonly drizzle: DrizzleService) {} - async findOneByUserId(userId: string) { - return this.db.query.credentialsTable.findFirst({ + async findOneByUserId(userId: string, db = this.drizzle.db) { + return db.query.credentialsTable.findFirst({ where: eq(credentialsTable.user_id, userId), }) } - async findOneByUserIdAndType(userId: string, type: CredentialsType) { - return this.db.query.credentialsTable.findFirst({ + async findOneByUserIdAndType(userId: string, type: CredentialsType, db = this.drizzle.db) { + return db.query.credentialsTable.findFirst({ where: and(eq(credentialsTable.user_id, userId), eq(credentialsTable.type, type)), }) } - async findPasswordCredentialsByUserId(userId: string) { - return this.db.query.credentialsTable.findFirst({ + async findPasswordCredentialsByUserId(userId: string, db = this.drizzle.db) { + return db.query.credentialsTable.findFirst({ where: and(eq(credentialsTable.user_id, userId), eq(credentialsTable.type, CredentialsType.PASSWORD)), }) } - async findTOTPCredentialsByUserId(userId: string) { - return this.db.query.credentialsTable.findFirst({ + async findTOTPCredentialsByUserId(userId: string, db = this.drizzle.db) { + return db.query.credentialsTable.findFirst({ where: and(eq(credentialsTable.user_id, userId), eq(credentialsTable.type, CredentialsType.TOTP)), }) } - async findOneById(id: string) { - return this.db.query.credentialsTable.findFirst({ + async findOneById(id: string, db = this.drizzle.db) { + return db.query.credentialsTable.findFirst({ where: eq(credentialsTable.id, id), }) } - async findOneByIdOrThrow(id: string) { - const credentials = await this.findOneById(id) + async findOneByIdOrThrow(id: string, db = this.drizzle.db) { + const credentials = await this.findOneById(id, db) if (!credentials) throw Error('Credentials not found') return credentials } - async create(data: CreateCredentials) { - return this.db.insert(credentialsTable).values(data).returning().then(takeFirstOrThrow) + async create(data: CreateCredentials, db = this.drizzle.db) { + return db.insert(credentialsTable).values(data).returning().then(takeFirstOrThrow) } - async update(id: string, data: UpdateCredentials) { - return this.db.update(credentialsTable).set(data).where(eq(credentialsTable.id, id)).returning().then(takeFirstOrThrow) + async update(id: string, data: UpdateCredentials, db = this.drizzle.db) { + return db.update(credentialsTable).set(data).where(eq(credentialsTable.id, id)).returning().then(takeFirstOrThrow) } - async delete(id: string) { - return this.db.delete(credentialsTable).where(eq(credentialsTable.id, id)) + async delete(id: string, db = this.drizzle.db) { + return db.delete(credentialsTable).where(eq(credentialsTable.id, id)) } - async deleteByUserId(userId: string) { - return this.db.delete(credentialsTable).where(eq(credentialsTable.user_id, userId)) + async deleteByUserId(userId: string, db = this.drizzle.db) { + return db.delete(credentialsTable).where(eq(credentialsTable.user_id, userId)) } - async deleteByUserIdAndType(userId: string, type: CredentialsType) { - return this.db.delete(credentialsTable).where(and(eq(credentialsTable.user_id, userId), eq(credentialsTable.type, type))) - } - - trxHost(trx: DatabaseProvider) { - return new CredentialsRepository(trx) + async deleteByUserIdAndType(userId: string, type: CredentialsType, db = this.drizzle.db) { + return db.delete(credentialsTable).where(and(eq(credentialsTable.user_id, userId), eq(credentialsTable.type, type))) } } diff --git a/src/lib/server/api/repositories/federated_identity.repository.ts b/src/lib/server/api/repositories/federated_identity.repository.ts new file mode 100644 index 0000000..2180590 --- /dev/null +++ b/src/lib/server/api/repositories/federated_identity.repository.ts @@ -0,0 +1,28 @@ +import { type InferInsertModel, and, eq } from 'drizzle-orm' +import { inject, injectable } from 'tsyringe' +import { takeFirstOrThrow } from '../common/utils/repository' +import { federatedIdentityTable } from '../databases/tables' +import { DrizzleService } from '../services/drizzle.service' + +export type CreateFederatedIdentity = InferInsertModel + +@injectable() +export class FederatedIdentityRepository { + constructor(@inject(DrizzleService) private readonly drizzle: DrizzleService) {} + + async findOneByUserIdAndProvider(userId: string, provider: string) { + return this.drizzle.db.query.federatedIdentityTable.findFirst({ + where: and(eq(federatedIdentityTable.user_id, userId), eq(federatedIdentityTable.identity_provider, provider)), + }) + } + + async findOneByFederatedUserIdAndProvider(federatedUserId: string, provider: string) { + return this.drizzle.db.query.federatedIdentityTable.findFirst({ + where: and(eq(federatedIdentityTable.federated_user_id, federatedUserId), eq(federatedIdentityTable.identity_provider, provider)), + }) + } + + async create(data: CreateFederatedIdentity, db = this.drizzle.db) { + return db.insert(federatedIdentityTable).values(data).returning().then(takeFirstOrThrow) + } +} diff --git a/src/lib/server/api/repositories/recovery-codes.repository.ts b/src/lib/server/api/repositories/recovery-codes.repository.ts index 6fdc7f0..f6ff1e9 100644 --- a/src/lib/server/api/repositories/recovery-codes.repository.ts +++ b/src/lib/server/api/repositories/recovery-codes.repository.ts @@ -1,6 +1,6 @@ import 'reflect-metadata' -import type { Repository } from '$lib/server/api/common/interfaces/repository.interface' -import { DatabaseProvider } from '$lib/server/api/providers/database.provider' +import { takeFirstOrThrow } from '$lib/server/api/common/utils/repository' +import { DrizzleService } from '$lib/server/api/services/drizzle.service' import { type InferInsertModel, eq } from 'drizzle-orm' import { inject, injectable } from 'tsyringe' import { recoveryCodesTable } from '../databases/tables' @@ -8,20 +8,20 @@ import { recoveryCodesTable } from '../databases/tables' export type CreateRecoveryCodes = InferInsertModel @injectable() -export class RecoveryCodesRepository implements Repository { - constructor(@inject(DatabaseProvider) private readonly db: DatabaseProvider) {} +export class RecoveryCodesRepository { + constructor(@inject(DrizzleService) private readonly drizzle: DrizzleService) {} - async findAllByUserId(userId: string) { - return this.db.query.recoveryCodesTable.findFirst({ + async create(data: CreateRecoveryCodes, db = this.drizzle.db) { + return db.insert(recoveryCodesTable).values(data).returning().then(takeFirstOrThrow) + } + + async findAllByUserId(userId: string, db = this.drizzle.db) { + return db.query.recoveryCodesTable.findFirst({ where: eq(recoveryCodesTable.userId, userId), }) } - async deleteAllByUserId(userId: string) { - return this.db.delete(recoveryCodesTable).where(eq(recoveryCodesTable.userId, userId)) - } - - trxHost(trx: DatabaseProvider) { - return new RecoveryCodesRepository(trx) + async deleteAllByUserId(userId: string, db = this.drizzle.db) { + return db.delete(recoveryCodesTable).where(eq(recoveryCodesTable.userId, userId)) } } diff --git a/src/lib/server/api/repositories/roles.repository.ts b/src/lib/server/api/repositories/roles.repository.ts index e940f4b..4d9f283 100644 --- a/src/lib/server/api/repositories/roles.repository.ts +++ b/src/lib/server/api/repositories/roles.repository.ts @@ -1,9 +1,8 @@ -import type { Repository } from '$lib/server/api/common/interfaces/repository.interface' -import { DatabaseProvider } from '$lib/server/api/providers/database.provider' +import { DrizzleService } from '$lib/server/api/services/drizzle.service' import { type InferInsertModel, eq } from 'drizzle-orm' import { inject, injectable } from 'tsyringe' -import { takeFirstOrThrow } from '../common/utils/repository.utils' -import { roles } from '../databases/tables' +import { takeFirstOrThrow } from '../common/utils/repository' +import { rolesTable } from '../databases/tables' /* -------------------------------------------------------------------------- */ /* Repository */ @@ -21,54 +20,50 @@ storing data. They should not contain any business logic, only database queries. In our case the method 'trxHost' is used to set the transaction context. */ -export type CreateRole = InferInsertModel +export type CreateRole = InferInsertModel export type UpdateRole = Partial @injectable() -export class RolesRepository implements Repository { - constructor(@inject(DatabaseProvider) private readonly db: DatabaseProvider) {} +export class RolesRepository { + constructor(@inject(DrizzleService) private readonly drizzle: DrizzleService) {} - async findOneById(id: string) { - return this.db.query.roles.findFirst({ - where: eq(roles.id, id), + async findOneById(id: string, db = this.drizzle.db) { + return db.query.rolesTable.findFirst({ + where: eq(rolesTable.id, id), }) } - async findOneByIdOrThrow(id: string) { - const role = await this.findOneById(id) + async findOneByIdOrThrow(id: string, db = this.drizzle.db) { + const role = await this.findOneById(id, db) if (!role) throw Error('Role not found') return role } - async findAll() { - return this.db.query.roles.findMany() + async findAll(db = this.drizzle.db) { + return db.query.rolesTable.findMany() } - async findOneByName(name: string) { - return this.db.query.roles.findFirst({ - where: eq(roles.name, name), + async findOneByName(name: string, db = this.drizzle.db) { + return db.query.rolesTable.findFirst({ + where: eq(rolesTable.name, name), }) } - async findOneByNameOrThrow(name: string) { - const role = await this.findOneByName(name) + async findOneByNameOrThrow(name: string, db = this.drizzle.db) { + const role = await this.findOneByName(name, db) if (!role) throw Error('Role not found') return role } - async create(data: CreateRole) { - return this.db.insert(roles).values(data).returning().then(takeFirstOrThrow) + async create(data: CreateRole, db = this.drizzle.db) { + return db.insert(rolesTable).values(data).returning().then(takeFirstOrThrow) } - async update(id: string, data: UpdateRole) { - return this.db.update(roles).set(data).where(eq(roles.id, id)).returning().then(takeFirstOrThrow) + async update(id: string, data: UpdateRole, db = this.drizzle.db) { + return db.update(rolesTable).set(data).where(eq(rolesTable.id, id)).returning().then(takeFirstOrThrow) } - async delete(id: string) { - return this.db.delete(roles).where(eq(roles.id, id)).returning().then(takeFirstOrThrow) - } - - trxHost(trx: DatabaseProvider) { - return new RolesRepository(trx) + async delete(id: string, db = this.drizzle.db) { + return db.delete(rolesTable).where(eq(rolesTable.id, id)).returning().then(takeFirstOrThrow) } } diff --git a/src/lib/server/api/repositories/user_roles.repository.ts b/src/lib/server/api/repositories/user_roles.repository.ts index 90e2823..ef95b74 100644 --- a/src/lib/server/api/repositories/user_roles.repository.ts +++ b/src/lib/server/api/repositories/user_roles.repository.ts @@ -1,8 +1,7 @@ -import type { Repository } from '$lib/server/api/common/interfaces/repository.interface' -import { DatabaseProvider } from '$lib/server/api/providers/database.provider' +import { DrizzleService } from '$lib/server/api/services/drizzle.service' import { type InferInsertModel, eq } from 'drizzle-orm' import { inject, injectable } from 'tsyringe' -import { takeFirstOrThrow } from '../common/utils/repository.utils' +import { takeFirstOrThrow } from '../common/utils/repository' import { user_roles } from '../databases/tables' /* -------------------------------------------------------------------------- */ @@ -25,36 +24,32 @@ export type CreateUserRole = InferInsertModel export type UpdateUserRole = Partial @injectable() -export class UserRolesRepository implements Repository { - constructor(@inject(DatabaseProvider) private readonly db: DatabaseProvider) {} +export class UserRolesRepository { + constructor(@inject(DrizzleService) private readonly drizzle: DrizzleService) {} - async findOneById(id: string) { - return this.db.query.user_roles.findFirst({ + async findOneById(id: string, db = this.drizzle.db) { + return db.query.user_roles.findFirst({ where: eq(user_roles.id, id), }) } - async findOneByIdOrThrow(id: string) { - const userRole = await this.findOneById(id) + async findOneByIdOrThrow(id: string, db = this.drizzle.db) { + const userRole = await this.findOneById(id, db) if (!userRole) throw Error('User not found') return userRole } - async findAllByUserId(userId: string) { - return this.db.query.user_roles.findMany({ + async findAllByUserId(userId: string, db = this.drizzle.db) { + return db.query.user_roles.findMany({ where: eq(user_roles.user_id, userId), }) } - async create(data: CreateUserRole) { - return this.db.insert(user_roles).values(data).returning().then(takeFirstOrThrow) + async create(data: CreateUserRole, db = this.drizzle.db) { + return db.insert(user_roles).values(data).returning().then(takeFirstOrThrow) } - async delete(id: string) { - return this.db.delete(user_roles).where(eq(user_roles.id, id)).returning().then(takeFirstOrThrow) - } - - trxHost(trx: DatabaseProvider) { - return new UserRolesRepository(trx) + async delete(id: string, db = this.drizzle.db) { + return db.delete(user_roles).where(eq(user_roles.id, id)).returning().then(takeFirstOrThrow) } } diff --git a/src/lib/server/api/repositories/users.repository.ts b/src/lib/server/api/repositories/users.repository.ts index b44b1da..240c66c 100644 --- a/src/lib/server/api/repositories/users.repository.ts +++ b/src/lib/server/api/repositories/users.repository.ts @@ -1,9 +1,8 @@ -import type { Repository } from '$lib/server/api/common/interfaces/repository.interface' import { usersTable } from '$lib/server/api/databases/tables/users.table' -import { DatabaseProvider } from '$lib/server/api/providers/database.provider' +import { DrizzleService } from '$lib/server/api/services/drizzle.service' import { type InferInsertModel, eq } from 'drizzle-orm' import { inject, injectable } from 'tsyringe' -import { takeFirstOrThrow } from '../common/utils/repository.utils' +import { takeFirstOrThrow } from '../common/utils/repository' /* -------------------------------------------------------------------------- */ /* Repository */ @@ -25,46 +24,42 @@ export type CreateUser = InferInsertModel export type UpdateUser = Partial @injectable() -export class UsersRepository implements Repository { - constructor(@inject(DatabaseProvider) private readonly db: DatabaseProvider) {} +export class UsersRepository { + constructor(@inject(DrizzleService) private readonly drizzle: DrizzleService) {} - async findOneById(id: string) { - return this.db.query.usersTable.findFirst({ + async findOneById(id: string, db = this.drizzle.db) { + return db.query.usersTable.findFirst({ where: eq(usersTable.id, id), }) } - async findOneByIdOrThrow(id: string) { + async findOneByIdOrThrow(id: string, db = this.drizzle.db) { const user = await this.findOneById(id) if (!user) throw Error('User not found') return user } - async findOneByUsername(username: string) { - return this.db.query.usersTable.findFirst({ + async findOneByUsername(username: string, db = this.drizzle.db) { + return db.query.usersTable.findFirst({ where: eq(usersTable.username, username), }) } - async findOneByEmail(email: string) { - return this.db.query.usersTable.findFirst({ + async findOneByEmail(email: string, db = this.drizzle.db) { + return db.query.usersTable.findFirst({ where: eq(usersTable.email, email), }) } - async create(data: CreateUser) { - return this.db.insert(usersTable).values(data).returning().then(takeFirstOrThrow) + async create(data: CreateUser, db = this.drizzle.db) { + return db.insert(usersTable).values(data).returning().then(takeFirstOrThrow) } - async update(id: string, data: UpdateUser) { - return this.db.update(usersTable).set(data).where(eq(usersTable.id, id)).returning().then(takeFirstOrThrow) + async update(id: string, data: UpdateUser, db = this.drizzle.db) { + return db.update(usersTable).set(data).where(eq(usersTable.id, id)).returning().then(takeFirstOrThrow) } - async delete(id: string) { - return this.db.delete(usersTable).where(eq(usersTable.id, id)).returning().then(takeFirstOrThrow) - } - - trxHost(trx: DatabaseProvider) { - return new UsersRepository(trx) + async delete(id: string, db = this.drizzle.db) { + return db.delete(usersTable).where(eq(usersTable.id, id)).returning().then(takeFirstOrThrow) } } diff --git a/src/lib/server/api/repositories/wishlists.repository.ts b/src/lib/server/api/repositories/wishlists.repository.ts index 00c074b..5667cc2 100644 --- a/src/lib/server/api/repositories/wishlists.repository.ts +++ b/src/lib/server/api/repositories/wishlists.repository.ts @@ -1,24 +1,23 @@ -import type { Repository } from '$lib/server/api/common/interfaces/repository.interface' -import { DatabaseProvider } from '$lib/server/api/providers/database.provider' +import { DrizzleService } from '$lib/server/api/services/drizzle.service' import { type InferInsertModel, eq } from 'drizzle-orm' import { inject, injectable } from 'tsyringe' -import { takeFirstOrThrow } from '../common/utils/repository.utils' -import { wishlists } from '../databases/tables' +import { takeFirstOrThrow } from '../common/utils/repository' +import { wishlistsTable } from '../databases/tables' -export type CreateWishlist = InferInsertModel +export type CreateWishlist = InferInsertModel export type UpdateWishlist = Partial @injectable() -export class WishlistsRepository implements Repository { - constructor(@inject(DatabaseProvider) private readonly db: DatabaseProvider) {} +export class WishlistsRepository { + constructor(@inject(DrizzleService) private readonly drizzle: DrizzleService) {} - async findAll() { - return this.db.query.wishlists.findMany() + async findAll(db = this.drizzle.db) { + return db.query.wishlistsTable.findMany() } - async findOneById(id: string) { - return this.db.query.wishlists.findFirst({ - where: eq(wishlists.id, id), + async findOneById(id: string, db = this.drizzle.db) { + return db.query.wishlistsTable.findFirst({ + where: eq(wishlistsTable.id, id), columns: { cuid: true, name: true, @@ -26,9 +25,9 @@ export class WishlistsRepository implements Repository { }) } - async findOneByCuid(cuid: string) { - return this.db.query.wishlists.findFirst({ - where: eq(wishlists.cuid, cuid), + async findOneByCuid(cuid: string, db = this.drizzle.db) { + return db.query.wishlistsTable.findFirst({ + where: eq(wishlistsTable.cuid, cuid), columns: { cuid: true, name: true, @@ -36,9 +35,9 @@ export class WishlistsRepository implements Repository { }) } - async findOneByUserId(userId: string) { - return this.db.query.wishlists.findFirst({ - where: eq(wishlists.user_id, userId), + async findOneByUserId(userId: string, db = this.drizzle.db) { + return db.query.wishlistsTable.findFirst({ + where: eq(wishlistsTable.user_id, userId), columns: { cuid: true, name: true, @@ -46,9 +45,9 @@ export class WishlistsRepository implements Repository { }) } - async findAllByUserId(userId: string) { - return this.db.query.wishlists.findMany({ - where: eq(wishlists.user_id, userId), + async findAllByUserId(userId: string, db = this.drizzle.db) { + return db.query.wishlistsTable.findMany({ + where: eq(wishlistsTable.user_id, userId), columns: { cuid: true, name: true, @@ -56,15 +55,11 @@ export class WishlistsRepository implements Repository { }) } - async create(data: CreateWishlist) { - return this.db.insert(wishlists).values(data).returning().then(takeFirstOrThrow) + async create(data: CreateWishlist, db = this.drizzle.db) { + return db.insert(wishlistsTable).values(data).returning().then(takeFirstOrThrow) } - async update(id: string, data: UpdateWishlist) { - return this.db.update(wishlists).set(data).where(eq(wishlists.id, id)).returning().then(takeFirstOrThrow) - } - - trxHost(trx: DatabaseProvider) { - return new WishlistsRepository(trx) + async update(id: string, data: UpdateWishlist, db = this.drizzle.db) { + return db.update(wishlistsTable).set(data).where(eq(wishlistsTable.id, id)).returning().then(takeFirstOrThrow) } } diff --git a/src/lib/server/api/services/collections.service.ts b/src/lib/server/api/services/collections.service.ts index 4e0a009..ccdbcbc 100644 --- a/src/lib/server/api/services/collections.service.ts +++ b/src/lib/server/api/services/collections.service.ts @@ -1,37 +1,50 @@ -import { inject, injectable } from "tsyringe"; -import { generateRandomAnimalName } from "$lib/utils/randomDataUtil"; -import { CollectionsRepository } from "../repositories/collections.repository"; +import type { db } from '$lib/server/api/packages/drizzle' +import { generateRandomAnimalName } from '$lib/utils/randomDataUtil' +import { inject, injectable } from 'tsyringe' +import { CollectionsRepository } from '../repositories/collections.repository' @injectable() export class CollectionsService { - constructor( - @inject(CollectionsRepository) private readonly collectionsRepository: CollectionsRepository - ) { } + constructor(@inject(CollectionsRepository) private readonly collectionsRepository: CollectionsRepository) {} async findOneByUserId(userId: string) { - return this.collectionsRepository.findOneByUserId(userId); + return this.collectionsRepository.findOneByUserId(userId) } async findAllByUserId(userId: string) { - return this.collectionsRepository.findAllByUserId(userId); + return this.collectionsRepository.findAllByUserId(userId) + } + + async findAllByUserIdWithDetails(userId: string) { + return this.collectionsRepository.findAllByUserIdWithDetails(userId) } async findOneById(id: string) { - return this.collectionsRepository.findOneById(id); + return this.collectionsRepository.findOneById(id) } async findOneByCuid(cuid: string) { - return this.collectionsRepository.findOneByCuid(cuid); + return this.collectionsRepository.findOneByCuid(cuid) } - async createEmptyNoName(userId: string) { - return this.createEmpty(userId, null); + async createEmptyNoName(userId: string, trx: Parameters[0]>[0] | null = null) { + return this.createEmpty(userId, null, trx) } - async createEmpty(userId: string, name: string | null) { - return this.collectionsRepository.create({ - user_id: userId, - name: name ?? generateRandomAnimalName(), - }); + async createEmpty(userId: string, name: string | null, trx: Parameters[0]>[0] | null = null) { + if (!trx) { + return this.collectionsRepository.create({ + user_id: userId, + name: name ?? generateRandomAnimalName(), + }) + } + + return this.collectionsRepository.create( + { + user_id: userId, + name: name ?? generateRandomAnimalName(), + }, + trx, + ) } -} \ No newline at end of file +} diff --git a/src/lib/server/api/services/drizzle.service.ts b/src/lib/server/api/services/drizzle.service.ts new file mode 100644 index 0000000..bbcb008 --- /dev/null +++ b/src/lib/server/api/services/drizzle.service.ts @@ -0,0 +1,33 @@ +import { config } from '$lib/server/api/common/config' +import * as schema from '$lib/server/api/databases/tables' +import { type NodePgDatabase, drizzle } from 'drizzle-orm/node-postgres' +import pg from 'pg' +import { type Disposable, injectable } from 'tsyringe' + +@injectable() +export class DrizzleService implements Disposable { + protected readonly pool: pg.Pool + db: NodePgDatabase + readonly schema: typeof schema = schema + + constructor() { + const pool = new pg.Pool({ + user: config.postgres.user, + password: config.postgres.password, + host: config.postgres.host, + port: Number(config.postgres.port).valueOf(), + database: config.postgres.database, + ssl: config.postgres.ssl, + max: config.postgres.max, + }) + this.pool = pool + this.db = drizzle(pool, { + schema, + logger: process.env.NODE_ENV === 'development', + }) + } + + dispose(): Promise | void { + this.pool.end() + } +} diff --git a/src/lib/server/api/services/hashing.service.ts b/src/lib/server/api/services/hashing.service.ts index 5a03f4e..5cd526d 100644 --- a/src/lib/server/api/services/hashing.service.ts +++ b/src/lib/server/api/services/hashing.service.ts @@ -1,34 +1,51 @@ -import { injectable } from "tsyringe"; -import { Argon2id } from "oslo/password"; +import { scrypt } from 'node:crypto' +import { decodeHex, encodeHexLowerCase } from '@oslojs/encoding' +import { constantTimeEqual } from '@oslojs/crypto/subtle' +import { injectable } from 'tsyringe' -/* ---------------------------------- Note ---------------------------------- */ -/* -Reference: https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html#argon2id - -I use Scrpt as the hashing algorithm due to its higher compatability -with vite's build system and it uses less memory than Argon2id. - -You can use Argon2id or any other hashing algorithm you prefer. -*/ -/* -------------------------------------------------------------------------- */ -/* -With Argon2id, you get the following error at times when vite optimizes its dependencies at times, - -Error: Build failed with 2 errors: -node_modules/.pnpm/@node-rs+argon2@1.7.0/node_modules/@node-rs/argon2/index.js:159:36: ERROR: No loader is configured for ".node" files: node_module -*/ -/* -------------------------------------------------------------------------- */ -// If you don't use a hasher from oslo, which are preconfigured with recommended parameters from OWASP, -// ensure that you configure them properly. @injectable() export class HashingService { - private readonly hasher = new Argon2id(); + private N: number + private r: number + private p: number + private dkLen: number - async hash(data: string) { - return this.hasher.hash(data); - } + constructor() { + this.N = 16384 + this.r = 16 + this.p = 1 + this.dkLen = 64 + } + async hash(password: string) { + const salt = encodeHexLowerCase(crypto.getRandomValues(new Uint8Array(16))) + const key = await this.generateKey(password, salt) + return `${salt}:${encodeHexLowerCase(key)}` + } - async verify(hash: string, data: string) { - return this.hasher.verify(hash, data) - } -} \ No newline at end of file + async verify(hash: string, password: string) { + const [salt, key] = hash.split(':') + const targetKey = await this.generateKey(password, salt) + return constantTimeEqual(targetKey, decodeHex(key)) + } + + async generateKey(password: string, salt: string): Promise { + return await new Promise((resolve, reject) => { + scrypt( + password.normalize('NFKC'), + salt, + this.dkLen, + { + N: this.N, + p: this.p, + r: this.r, + // errors when 128 * N * r > `maxmem` (approximately) + maxmem: 128 * this.N * this.r * 2, + }, + (err, buff) => { + if (err) return reject(err) + return resolve(buff) + }, + ) + }) + } +} diff --git a/src/lib/server/api/services/iam.service.ts b/src/lib/server/api/services/iam.service.ts index f7b3599..7d93a5f 100644 --- a/src/lib/server/api/services/iam.service.ts +++ b/src/lib/server/api/services/iam.service.ts @@ -1,7 +1,9 @@ +import { CredentialsType } from '$lib/server/api/databases/tables' +import type { ChangePasswordDto } from '$lib/server/api/dtos/change-password.dto' import type { UpdateEmailDto } from '$lib/server/api/dtos/update-email.dto' import type { UpdateProfileDto } from '$lib/server/api/dtos/update-profile.dto' import type { VerifyPasswordDto } from '$lib/server/api/dtos/verify-password.dto' -import { LuciaProvider } from '$lib/server/api/providers/lucia.provider' +import { LuciaService } from '$lib/server/api/services/lucia.service' import { UsersService } from '$lib/server/api/services/users.service' import { inject, injectable } from 'tsyringe' @@ -25,12 +27,12 @@ simple as possible. This makes the service easier to read, test and understand. @injectable() export class IamService { constructor( - @inject(LuciaProvider) private readonly lucia: LuciaProvider, + @inject(LuciaService) private luciaService: LuciaService, @inject(UsersService) private readonly usersService: UsersService, ) {} async logout(sessionId: string) { - return this.lucia.invalidateSession(sessionId) + return this.luciaService.lucia.invalidateSession(sessionId) } async updateProfile(userId: string, data: UpdateProfileDto) { @@ -42,13 +44,13 @@ export class IamService { } const existingUserForNewUsername = await this.usersService.findOneByUsername(data.username) - if (existingUserForNewUsername && existingUserForNewUsername.id !== userId) { + if (existingUserForNewUsername && existingUserForNewUsername.id !== user.id) { return { error: 'Username already in use', } } - return this.usersService.updateUser(userId, { + return this.usersService.updateUser(user.id, { first_name: data.firstName, last_name: data.lastName, username: data.username !== user.username ? data.username : user.username, @@ -68,6 +70,11 @@ export class IamService { }) } + async updatePassword(userId: string, data: ChangePasswordDto) { + const { password } = data + await this.usersService.updatePassword(userId, password) + } + async verifyPassword(userId: string, data: VerifyPasswordDto) { const user = await this.usersService.findOneById(userId) if (!user) { diff --git a/src/lib/server/api/services/loginrequest.service.ts b/src/lib/server/api/services/loginrequest.service.ts index 6748eb8..4f93c9c 100644 --- a/src/lib/server/api/services/loginrequest.service.ts +++ b/src/lib/server/api/services/loginrequest.service.ts @@ -1,10 +1,10 @@ import type { SigninUsernameDto } from '$lib/server/api/dtos/signin-username.dto' +import { LuciaService } from '$lib/server/api/services/lucia.service' import type { HonoRequest } from 'hono' import { inject, injectable } from 'tsyringe' import { BadRequest } from '../common/exceptions' import type { Credentials } from '../databases/tables' import { DatabaseProvider } from '../providers/database.provider' -import { LuciaProvider } from '../providers/lucia.provider' import { CredentialsRepository } from '../repositories/credentials.repository' import { UsersRepository } from '../repositories/users.repository' import { MailerService } from './mailer.service' @@ -13,7 +13,7 @@ import { TokensService } from './tokens.service' @injectable() export class LoginRequestsService { constructor( - @inject(LuciaProvider) private readonly lucia: LuciaProvider, + @inject(LuciaService) private luciaService: LuciaService, @inject(DatabaseProvider) private readonly db: DatabaseProvider, @inject(TokensService) private readonly tokensService: TokensService, @inject(MailerService) private readonly mailerService: MailerService, @@ -60,7 +60,7 @@ export class LoginRequestsService { async createUserSession(existingUserId: string, req: HonoRequest, totpCredentials: Credentials | undefined) { const requestIpAddress = req.header('x-real-ip') const requestIpCountry = req.header('x-vercel-ip-country') - return this.lucia.createSession(existingUserId, { + return this.luciaService.lucia.createSession(existingUserId, { ip_country: requestIpCountry || 'unknown', ip_address: requestIpAddress || 'unknown', twoFactorAuthEnabled: !!totpCredentials && totpCredentials?.secret_data !== null && totpCredentials?.secret_data !== '', diff --git a/src/lib/server/api/services/lucia.service.ts b/src/lib/server/api/services/lucia.service.ts new file mode 100644 index 0000000..05c5345 --- /dev/null +++ b/src/lib/server/api/services/lucia.service.ts @@ -0,0 +1,45 @@ +import { config } from '$lib/server/api/common/config' +import { DrizzleService } from '$lib/server/api/services/drizzle.service' +import { DrizzlePostgreSQLAdapter } from '@lucia-auth/adapter-drizzle' +import { Lucia, TimeSpan } from 'lucia' +import { inject, injectable } from 'tsyringe' + +@injectable() +export class LuciaService { + readonly lucia: Lucia + constructor(@inject(DrizzleService) private readonly drizzle: DrizzleService) { + const adapter = new DrizzlePostgreSQLAdapter(this.drizzle.db, this.drizzle.schema.sessionsTable, this.drizzle.schema.usersTable) + this.lucia = new Lucia(adapter, { + sessionExpiresIn: new TimeSpan(2, 'w'), // 2 weeks + sessionCookie: { + name: 'session', + expires: false, // session cookies have very long lifespan (2 years) + attributes: { + // set to `true` when using HTTPS + secure: config.isProduction, + sameSite: 'strict', + domain: config.domain, + }, + }, + getSessionAttributes: (attributes) => { + return { + ipCountry: attributes.ip_country, + ipAddress: attributes.ip_address, + isTwoFactorAuthEnabled: attributes.twoFactorAuthEnabled, + isTwoFactorAuthenticated: attributes.isTwoFactorAuthenticated, + } + }, + getUserAttributes: (attributes) => { + return { + // ...attributes, + username: attributes.username, + email: attributes.email, + firstName: attributes.first_name, + lastName: attributes.last_name, + mfa_enabled: attributes.mfa_enabled, + theme: attributes.theme, + } + }, + }) + } +} diff --git a/src/lib/server/api/services/mailer.service.ts b/src/lib/server/api/services/mailer.service.ts index c780275..c8200d1 100644 --- a/src/lib/server/api/services/mailer.service.ts +++ b/src/lib/server/api/services/mailer.service.ts @@ -1,6 +1,6 @@ import { injectable } from 'tsyringe' +import { config } from '../common/config' import type { Email } from '../common/inferfaces/email.interface' -import { config } from '../configs/config' type SendProps = { to: string | string[] diff --git a/src/lib/server/api/services/oauth.service.ts b/src/lib/server/api/services/oauth.service.ts new file mode 100644 index 0000000..ef563c6 --- /dev/null +++ b/src/lib/server/api/services/oauth.service.ts @@ -0,0 +1,27 @@ +import { inject, injectable } from 'tsyringe' +import { FederatedIdentityRepository } from '../repositories/federated_identity.repository' +import { UsersService } from './users.service' +import type {OAuthUser, OAuthProviders} from "$lib/server/api/common/types/oauth"; + +@injectable() +export class OAuthService { + constructor( + @inject(FederatedIdentityRepository) private readonly federatedIdentityRepository: FederatedIdentityRepository, + @inject(UsersService) private readonly usersService: UsersService, + ) {} + + async handleOAuthUser(oAuthUser: OAuthUser, oauthProvider: OAuthProviders) { + const federatedUser = await this.federatedIdentityRepository.findOneByFederatedUserIdAndProvider(oAuthUser.sub, oauthProvider) + + if (federatedUser) { + return federatedUser.user_id + } + + const user = await this.usersService.createOAuthUser(oAuthUser, oauthProvider) + + if (!user) { + throw new Error('Failed to create user') + } + return user.id + } +} diff --git a/src/lib/server/api/services/recovery-codes.service.ts b/src/lib/server/api/services/recovery-codes.service.ts index e1f5567..75d6d6b 100644 --- a/src/lib/server/api/services/recovery-codes.service.ts +++ b/src/lib/server/api/services/recovery-codes.service.ts @@ -1,14 +1,15 @@ import 'reflect-metadata' -import { recoveryCodesTable } from '$lib/server/api/databases/tables' -import { db } from '$lib/server/api/packages/drizzle' import { RecoveryCodesRepository } from '$lib/server/api/repositories/recovery-codes.repository' import { alphabet, generateRandomString } from 'oslo/crypto' -import { Argon2id } from 'oslo/password' import { inject, injectable } from 'tsyringe' +import { HashingService } from './hashing.service' @injectable() export class RecoveryCodesService { - constructor(@inject(RecoveryCodesRepository) private readonly recoveryCodesRepository: RecoveryCodesRepository) {} + constructor( + @inject(HashingService) private readonly hashingService: HashingService, + @inject(RecoveryCodesRepository) private readonly recoveryCodesRepository: RecoveryCodesRepository + ) {} async findAllRecoveryCodesByUserId(userId: string) { return this.recoveryCodesRepository.findAllByUserId(userId) @@ -18,12 +19,9 @@ export class RecoveryCodesService { const createdRecoveryCodes = Array.from({ length: 5 }, () => generateRandomString(10, alphabet('A-Z', '0-9'))) if (createdRecoveryCodes && userId) { for (const code of createdRecoveryCodes) { - const hashedCode = await new Argon2id().hash(code) + const hashedCode = await this.hashingService.hash(code) console.log('Inserting recovery code', code, hashedCode) - await db.insert(recoveryCodesTable).values({ - userId, - code: hashedCode, - }) + await this.recoveryCodesRepository.create({ userId, code: hashedCode }) } return createdRecoveryCodes diff --git a/src/lib/server/api/services/redis.service.ts b/src/lib/server/api/services/redis.service.ts new file mode 100644 index 0000000..40dd623 --- /dev/null +++ b/src/lib/server/api/services/redis.service.ts @@ -0,0 +1,18 @@ +import { config } from '$lib/server/api/common/config' +import { Redis } from 'ioredis' +import { type Disposable, injectable } from 'tsyringe' + +@injectable() +export class RedisService implements Disposable { + readonly client: Redis + + constructor() { + this.client = new Redis(config.REDIS_URL, { + maxRetriesPerRequest: null, + }) + } + + async dispose(): Promise { + this.client.disconnect() + } +} diff --git a/src/lib/server/api/services/totp.service.ts b/src/lib/server/api/services/totp.service.ts index b8c5fbf..ac0253c 100644 --- a/src/lib/server/api/services/totp.service.ts +++ b/src/lib/server/api/services/totp.service.ts @@ -1,7 +1,7 @@ import { CredentialsRepository } from '$lib/server/api/repositories/credentials.repository' import { HMAC } from 'oslo/crypto' -import { decodeHex, encodeHex } from 'oslo/encoding' -import { TOTPController } from 'oslo/otp' +import { decodeHex, encodeHexLowerCase } from '@oslojs/encoding' +import { verifyTOTP } from '@oslojs/otp' import { inject, injectable } from 'tsyringe' import type { CredentialsType } from '../databases/tables' @@ -27,7 +27,7 @@ export class TotpService { try { return await this.credentialsRepository.create({ user_id: userId, - secret_data: encodeHex(twoFactorSecret), + secret_data: encodeHexLowerCase(twoFactorSecret), type: 'totp', }) } catch (e) { @@ -49,6 +49,6 @@ export class TotpService { if (!credential) { throw new Error('TOTP credential not found') } - return await new TOTPController().verify(code, decodeHex(credential.secret_data)) + return await verifyTOTP(decodeHex(credential.secret_data), 30, 6, code) } } diff --git a/src/lib/server/api/services/user_roles.service.ts b/src/lib/server/api/services/user_roles.service.ts index 04ad1d0..ea80eff 100644 --- a/src/lib/server/api/services/user_roles.service.ts +++ b/src/lib/server/api/services/user_roles.service.ts @@ -1,39 +1,51 @@ -import {inject, injectable} from "tsyringe"; -import {type CreateUserRole, UserRolesRepository} from "$lib/server/api/repositories/user_roles.repository"; -import {RolesService} from "$lib/server/api/services/roles.service"; +import type { db } from '$lib/server/api/packages/drizzle' +import { type CreateUserRole, UserRolesRepository } from '$lib/server/api/repositories/user_roles.repository' +import { RolesService } from '$lib/server/api/services/roles.service' +import { inject, injectable } from 'tsyringe' @injectable() export class UserRolesService { constructor( - @inject(UserRolesRepository) private readonly userRolesRepository: UserRolesRepository, - @inject(RolesService) private readonly rolesService: RolesService - ) { } + @inject(UserRolesRepository) private readonly userRolesRepository: UserRolesRepository, + @inject(RolesService) private readonly rolesService: RolesService, + ) {} async findOneById(id: string) { - return this.userRolesRepository.findOneById(id); + return this.userRolesRepository.findOneById(id) } async findAllByUserId(userId: string) { - return this.userRolesRepository.findAllByUserId(userId); + return this.userRolesRepository.findAllByUserId(userId) } async create(data: CreateUserRole) { - return this.userRolesRepository.create(data); + return this.userRolesRepository.create(data) } - async addRoleToUser(userId: string, roleName: string, primary = false) { + async addRoleToUser(userId: string, roleName: string, primary = false, trx: Parameters[0]>[0] | null = null) { // Find the role by its name - const role = await this.rolesService.findOneByNameOrThrow(roleName); + const role = await this.rolesService.findOneByNameOrThrow(roleName) if (!role || !role.id) { - throw new Error(`Role with name ${roleName} not found`); + throw new Error(`Role with name ${roleName} not found`) + } + + if (!trx) { + return this.userRolesRepository.create({ + user_id: userId, + role_id: role.id, + primary, + }) } // Create a UserRole entry linking the user and the role - return this.userRolesRepository.create({ - user_id: userId, - role_id: role.id, - primary, - }); + return this.userRolesRepository.create( + { + user_id: userId, + role_id: role.id, + primary, + }, + trx, + ) } -} \ No newline at end of file +} diff --git a/src/lib/server/api/services/users.service.ts b/src/lib/server/api/services/users.service.ts index 89e6eea..172908f 100644 --- a/src/lib/server/api/services/users.service.ts +++ b/src/lib/server/api/services/users.service.ts @@ -1,21 +1,28 @@ import type { SignupUsernameEmailDto } from '$lib/server/api/dtos/signup-username-email.dto' import { CredentialsRepository } from '$lib/server/api/repositories/credentials.repository' +import { FederatedIdentityRepository } from '$lib/server/api/repositories/federated_identity.repository' +import { WishlistsRepository } from '$lib/server/api/repositories/wishlists.repository' import { TokensService } from '$lib/server/api/services/tokens.service' import { UserRolesService } from '$lib/server/api/services/user_roles.service' import { inject, injectable } from 'tsyringe' -import { CredentialsType } from '../databases/tables' +import {CredentialsType, RoleName} from '../databases/tables' import { type UpdateUser, UsersRepository } from '../repositories/users.repository' import { CollectionsService } from './collections.service' +import { DrizzleService } from './drizzle.service' import { WishlistsService } from './wishlists.service' +import type {OAuthUser} from "$lib/server/api/common/types/oauth"; @injectable() export class UsersService { constructor( @inject(CollectionsService) private readonly collectionsService: CollectionsService, @inject(CredentialsRepository) private readonly credentialsRepository: CredentialsRepository, + @inject(DrizzleService) private readonly drizzleService: DrizzleService, + @inject(FederatedIdentityRepository) private readonly federatedIdentityRepository: FederatedIdentityRepository, @inject(TokensService) private readonly tokenService: TokensService, @inject(UsersRepository) private readonly usersRepository: UsersRepository, @inject(UserRolesService) private readonly userRolesService: UserRolesService, + @inject(WishlistsRepository) private readonly wishlistsRepository: WishlistsRepository, @inject(WishlistsService) private readonly wishlistsService: WishlistsService, ) {} @@ -23,34 +30,76 @@ export class UsersService { const { firstName, lastName, email, username, password } = data const hashedPassword = await this.tokenService.createHashedToken(password) - const user = await this.usersRepository.create({ - first_name: firstName, - last_name: lastName, - email, - username, + return await this.drizzleService.db.transaction(async (trx) => { + const createdUser = await this.usersRepository.create( + { + first_name: firstName, + last_name: lastName, + email, + username, + }, + trx, + ) + + if (!createdUser) { + return null + } + + const credentials = await this.credentialsRepository.create( + { + user_id: createdUser.id, + type: CredentialsType.PASSWORD, + secret_data: hashedPassword, + }, + trx, + ) + + if (!credentials) { + await this.usersRepository.delete(createdUser.id) + return null + } + + await this.userRolesService.addRoleToUser(createdUser.id, RoleName.USER, true, trx) + + await this.wishlistsService.createEmptyNoName(createdUser.id, trx) + await this.collectionsService.createEmptyNoName(createdUser.id, trx) }) + } - if (!user) { - return null - } + async createOAuthUser(oAuthUser: OAuthUser, oauthProvider: string) { + return await this.drizzleService.db.transaction(async (trx) => { + const createdUser = await this.usersRepository.create( + { + username: oAuthUser.username || oAuthUser.username, + email: oAuthUser.email || null, + first_name: oAuthUser.given_name || null, + last_name: oAuthUser.family_name || null, + picture: oAuthUser.picture || null, + email_verified: oAuthUser.email_verified || false, + }, + trx, + ) - const credentials = await this.credentialsRepository.create({ - user_id: user.id, - type: CredentialsType.PASSWORD, - secret_data: hashedPassword, + if (!createdUser) { + return null + } + + await this.federatedIdentityRepository.create( + { + identity_provider: oauthProvider, + user_id: createdUser.id, + federated_user_id: oAuthUser.sub, + federated_username: oAuthUser.email || oAuthUser.username, + }, + trx, + ) + + await this.userRolesService.addRoleToUser(createdUser.id, RoleName.USER, true, trx) + + await this.wishlistsService.createEmptyNoName(createdUser.id, trx) + await this.collectionsService.createEmptyNoName(createdUser.id, trx) + return createdUser }) - - if (!credentials) { - await this.usersRepository.delete(user.id) - return null - } - - await this.userRolesService.addRoleToUser(user.id, 'user', true) - - await this.wishlistsService.createEmptyNoName(user.id) - await this.collectionsService.createEmptyNoName(user.id) - - return user } async updateUser(userId: string, data: UpdateUser) { @@ -69,6 +118,22 @@ export class UsersService { return this.usersRepository.findOneById(id) } + async updatePassword(userId: string, password: string) { + const hashedPassword = await this.tokenService.createHashedToken(password) + const currentCredentials = await this.credentialsRepository.findPasswordCredentialsByUserId(userId) + if (!currentCredentials) { + await this.credentialsRepository.create({ + user_id: userId, + type: CredentialsType.PASSWORD, + secret_data: hashedPassword, + }) + } else { + await this.credentialsRepository.update(currentCredentials.id, { + secret_data: hashedPassword, + }) + } + } + async verifyPassword(userId: string, data: { password: string }) { const user = await this.usersRepository.findOneById(userId) if (!user) { diff --git a/src/lib/server/api/services/wishlists.service.ts b/src/lib/server/api/services/wishlists.service.ts index f7326a1..b06b174 100644 --- a/src/lib/server/api/services/wishlists.service.ts +++ b/src/lib/server/api/services/wishlists.service.ts @@ -1,34 +1,41 @@ -import { inject, injectable } from "tsyringe"; -import { WishlistsRepository } from "../repositories/wishlists.repository"; -import { generateRandomAnimalName } from "$lib/utils/randomDataUtil"; +import type { db } from '$lib/server/api/packages/drizzle' +import { generateRandomAnimalName } from '$lib/utils/randomDataUtil' +import { inject, injectable } from 'tsyringe' +import { WishlistsRepository } from '../repositories/wishlists.repository' @injectable() export class WishlistsService { - - constructor( - @inject(WishlistsRepository) private readonly wishlistsRepository: WishlistsRepository - ) { } + constructor(@inject(WishlistsRepository) private readonly wishlistsRepository: WishlistsRepository) {} async findAllByUserId(userId: string) { - return this.wishlistsRepository.findAllByUserId(userId); + return this.wishlistsRepository.findAllByUserId(userId) } async findOneById(id: string) { - return this.wishlistsRepository.findOneById(id); + return this.wishlistsRepository.findOneById(id) } async findOneByCuid(cuid: string) { - return this.wishlistsRepository.findOneByCuid(cuid); + return this.wishlistsRepository.findOneByCuid(cuid) } - async createEmptyNoName(userId: string) { - return this.createEmpty(userId, null); + async createEmptyNoName(userId: string, trx: Parameters[0]>[0] | null = null) { + return this.createEmpty(userId, null, trx) } - async createEmpty(userId: string, name: string | null) { - return this.wishlistsRepository.create({ - user_id: userId, - name: name ?? generateRandomAnimalName(), - }); + async createEmpty(userId: string, name: string | null, trx: Parameters[0]>[0] | null = null) { + if (!trx) { + return this.wishlistsRepository.create({ + user_id: userId, + name: name ?? generateRandomAnimalName(), + }) + } + return this.wishlistsRepository.create( + { + user_id: userId, + name: name ?? generateRandomAnimalName(), + }, + trx, + ) } -} \ No newline at end of file +} diff --git a/src/lib/server/api/tests/hashing.service.test.ts b/src/lib/server/api/tests/hashing.service.test.ts index 94c7f89..d7fe080 100644 --- a/src/lib/server/api/tests/hashing.service.test.ts +++ b/src/lib/server/api/tests/hashing.service.test.ts @@ -1,32 +1,38 @@ -import 'reflect-metadata'; -import { container } from 'tsyringe'; -import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest'; -import { HashingService } from '../services/hashing.service'; +import 'reflect-metadata' +import { container } from 'tsyringe' +import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest' +import { HashingService } from '../services/hashing.service' describe('HashingService', () => { - let service: HashingService; + let service: HashingService beforeAll(() => { - service = container.resolve(HashingService); - }); + service = container.resolve(HashingService) + }) afterAll(() => { vi.resetAllMocks() - }); + }) describe('Create Hash', () => { it('should create a hash', async () => { - const hash = await service.hash('111'); - expect(hash).not.toBeUndefined(); - expect(hash).not.toBeNull(); - }); + const hash = await service.hash('111') + expect(hash).not.toBeUndefined() + expect(hash).not.toBeNull() + }) }) describe('Verify Hash', () => { it('should verify a hash', async () => { - const hash = await service.hash('111'); - const verifiable = await service.verify(hash, '111'); - expect(verifiable).toBeTruthy(); - }); + const hash = await service.hash('111') + const verifiable = await service.verify(hash, '111') + expect(verifiable).toBeTruthy() + }) + + it('should not verify a hash', async () => { + const hash = await service.hash('111') + const verifiable = await service.verify(hash, '222') + expect(verifiable).toBeFalsy() + }) }) -}) \ No newline at end of file +}) diff --git a/src/lib/server/api/tests/iam.service.test.ts b/src/lib/server/api/tests/iam.service.test.ts new file mode 100644 index 0000000..40b0bae --- /dev/null +++ b/src/lib/server/api/tests/iam.service.test.ts @@ -0,0 +1,124 @@ +import 'reflect-metadata' +import { IamService } from '$lib/server/api/services/iam.service' +import { LuciaService } from '$lib/server/api/services/lucia.service' +import { UsersService } from '$lib/server/api/services/users.service' +import { faker } from '@faker-js/faker' +import { container } from 'tsyringe' +import { afterAll, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest' + +describe('IamService', () => { + let service: IamService + const luciaService = vi.mocked(LuciaService.prototype) + const userService = vi.mocked(UsersService.prototype) + + beforeAll(() => { + service = container + .register(LuciaService, { useValue: luciaService }) + .register(UsersService, { useValue: userService }) + .resolve(IamService) + }) + + beforeEach(() => { + vi.resetAllMocks() + }) + + afterAll(() => { + vi.resetAllMocks() + }) + + const timeStampDate = new Date() + const dbUser = { + id: faker.string.uuid(), + cuid: 'ciglo1j8q0000t9j4xq8d6p5e', + first_name: faker.person.firstName(), + last_name: faker.person.lastName(), + email: faker.internet.email(), + username: faker.internet.userName(), + verified: false, + receive_email: false, + mfa_enabled: false, + theme: 'system', + createdAt: timeStampDate, + updatedAt: timeStampDate, + } + + describe('Update Profile', () => { + it('should update user', async () => { + userService.findOneById = vi.fn().mockResolvedValueOnce(dbUser) + userService.findOneByUsername = vi.fn().mockResolvedValue(undefined) + userService.updateUser = vi.fn().mockResolvedValue(dbUser) + + const spy_userService_findOneById = vi.spyOn(userService, 'findOneById') + const spy_userService_findOneByUsername = vi.spyOn(userService, 'findOneByUsername') + const spy_userService_updateUser = vi.spyOn(userService, 'updateUser') + await expect( + service.updateProfile(faker.string.uuid(), { + username: faker.internet.userName(), + }), + ).resolves.toEqual(dbUser) + expect(spy_userService_findOneById).toBeCalledTimes(1) + expect(spy_userService_findOneByUsername).toBeCalledTimes(1) + expect(spy_userService_updateUser).toBeCalledTimes(1) + }) + + it('should error on no user found', async () => { + userService.findOneById = vi.fn().mockResolvedValueOnce(undefined) + + const spy_userService_findOneById = vi.spyOn(userService, 'findOneById') + const spy_userService_findOneByUsername = vi.spyOn(userService, 'findOneByUsername') + const spy_userService_updateUser = vi.spyOn(userService, 'updateUser') + await expect( + service.updateProfile(faker.string.uuid(), { + username: faker.internet.userName(), + }), + ).resolves.toEqual({ + error: 'User not found', + }) + expect(spy_userService_findOneById).toBeCalledTimes(1) + expect(spy_userService_findOneByUsername).toBeCalledTimes(0) + expect(spy_userService_updateUser).toBeCalledTimes(0) + }) + + it('should error on duplicate username', async () => { + userService.findOneById = vi.fn().mockResolvedValueOnce(dbUser) + userService.findOneByUsername = vi.fn().mockResolvedValue({ + id: faker.string.uuid(), + }) + userService.updateUser = vi.fn().mockResolvedValue(dbUser) + + const spy_userService_findOneById = vi.spyOn(userService, 'findOneById') + const spy_userService_findOneByUsername = vi.spyOn(userService, 'findOneByUsername') + const spy_userService_updateUser = vi.spyOn(userService, 'updateUser') + await expect( + service.updateProfile(faker.string.uuid(), { + username: faker.internet.userName(), + }), + ).resolves.toEqual({ + error: 'Username already in use', + }) + expect(spy_userService_findOneById).toBeCalledTimes(1) + expect(spy_userService_findOneByUsername).toBeCalledTimes(1) + expect(spy_userService_updateUser).toBeCalledTimes(0) + }) + }) + + it('should not error if the user id of new username is the current user id', async () => { + userService.findOneById = vi.fn().mockResolvedValueOnce(dbUser) + userService.findOneByUsername = vi.fn().mockResolvedValue({ + id: dbUser.id, + }) + userService.updateUser = vi.fn().mockResolvedValue(dbUser) + + const spy_userService_findOneById = vi.spyOn(userService, 'findOneById') + const spy_userService_findOneByUsername = vi.spyOn(userService, 'findOneByUsername') + const spy_userService_updateUser = vi.spyOn(userService, 'updateUser') + await expect( + service.updateProfile(dbUser.id, { + username: dbUser.id, + }), + ).resolves.toEqual(dbUser) + expect(spy_userService_findOneById).toBeCalledTimes(1) + expect(spy_userService_findOneByUsername).toBeCalledTimes(1) + expect(spy_userService_updateUser).toBeCalledTimes(1) + }) +}) diff --git a/src/lib/server/api/tests/tokens.service.test.ts b/src/lib/server/api/tests/tokens.service.test.ts index 5c0e34e..7ecdddf 100644 --- a/src/lib/server/api/tests/tokens.service.test.ts +++ b/src/lib/server/api/tests/tokens.service.test.ts @@ -1,49 +1,44 @@ -import 'reflect-metadata'; -import { container } from 'tsyringe'; -import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest'; -import { TokensService } from '../services/tokens.service'; -import { HashingService } from '../services/hashing.service'; -import { Argon2id } from 'oslo/password'; +import 'reflect-metadata' +import { container } from 'tsyringe' +import { afterAll, beforeAll, describe, expect, expectTypeOf, it, vi } from 'vitest' +import { HashingService } from '../services/hashing.service' +import { TokensService } from '../services/tokens.service' describe('TokensService', () => { - let service: TokensService; - const hashingService = vi.mocked(HashingService.prototype); + let service: TokensService + const hashingService = vi.mocked(HashingService.prototype) beforeAll(() => { - service = container - .register(HashingService, { useValue: hashingService }) - .resolve(TokensService); - }); + service = container.register(HashingService, { useValue: hashingService }).resolve(TokensService) + }) afterAll(() => { vi.resetAllMocks() - }); + }) describe('Generate Token', () => { - const hashedPassword = new Argon2id().hash('111'); - - hashingService.hash = vi.fn().mockResolvedValue(hashedPassword); - hashingService.verify = vi.fn().mockResolvedValue(true); - - const spy_hashingService_hash = vi.spyOn(hashingService, 'hash'); - const spy_hashingService_verify = vi.spyOn(hashingService, 'verify'); - it('should resolve', async () => { - await expect(service.createHashedToken('111')).resolves.string + const hashedPassword = 'testhash' + hashingService.hash = vi.fn().mockResolvedValue(hashedPassword) + const spy_hashingService_hash = vi.spyOn(hashingService, 'hash') + const spy_hashingService_verify = vi.spyOn(hashingService, 'verify') + await expectTypeOf(service.createHashedToken('111')).resolves.toBeString() + expect(spy_hashingService_hash).toBeCalledTimes(1) + expect(spy_hashingService_verify).toBeCalledTimes(0) }) it('should generate a token that is verifiable', async () => { - const token = await service.createHashedToken('111'); - expect(token).not.toBeUndefined(); - expect(token).not.toBeNull(); - const verifiable = await service.verifyHashedToken(token, '111'); - expect(verifiable).toBeTruthy(); - }); - - it('should generate a hashed token', async () => { - expect(spy_hashingService_hash).toHaveBeenCalledTimes(2); + hashingService.hash = vi.fn().mockResolvedValue('testhash') + hashingService.verify = vi.fn().mockResolvedValue(true) + const spy_hashingService_hash = vi.spyOn(hashingService, 'hash') + const spy_hashingService_verify = vi.spyOn(hashingService, 'verify') + const token = await service.createHashedToken('111') + expect(token).not.toBeNaN() + expect(token).not.toBeUndefined() + expect(token).not.toBeNull() + const verifiable = await service.verifyHashedToken(token, '111') + expect(verifiable).toBeTruthy() + expect(spy_hashingService_hash).toBeCalledTimes(1) + expect(spy_hashingService_verify).toBeCalledTimes(1) }) - it('should verify a hashed token', async () => { - expect(spy_hashingService_verify).toHaveBeenCalledTimes(1); - }) - }); -}); \ No newline at end of file + }) +}) diff --git a/src/lib/server/api/tests/user_roles.service.test.ts b/src/lib/server/api/tests/user_roles.service.test.ts index dfd47d2..89cde2a 100644 --- a/src/lib/server/api/tests/user_roles.service.test.ts +++ b/src/lib/server/api/tests/user_roles.service.test.ts @@ -1,62 +1,75 @@ -import 'reflect-metadata'; -import { container } from 'tsyringe'; -import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest'; -import { UserRolesService } from '../services/user_roles.service'; -import { UserRolesRepository } from '../repositories/user_roles.repository'; -import { RolesService } from '../services/roles.service'; +import 'reflect-metadata' +import { RoleName } from '$lib/server/api/databases/tables' +import { faker } from '@faker-js/faker' +import { container } from 'tsyringe' +import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest' +import { UserRolesRepository } from '../repositories/user_roles.repository' +import { RolesService } from '../services/roles.service' +import { UserRolesService } from '../services/user_roles.service' describe('UserRolesService', () => { - let service: UserRolesService; - const userRolesRepository = vi.mocked(UserRolesRepository.prototype); - const rolesService = vi.mocked(RolesService.prototype); + let service: UserRolesService + const userRolesRepository = vi.mocked(UserRolesRepository.prototype) + const rolesService = vi.mocked(RolesService.prototype) beforeAll(() => { service = container .register(UserRolesRepository, { useValue: userRolesRepository }) .register(RolesService, { useValue: rolesService }) - .resolve(UserRolesService); - }); + .resolve(UserRolesService) + }) afterAll(() => { vi.resetAllMocks() - }); + }) + + const timeStampDate = new Date() + const roleUUID = faker.string.uuid() + const userUUID = faker.string.uuid() + const dbRole = { + id: roleUUID, + cuid: 'ciglo1j8q0000t9j4xq8d6p5e', + name: RoleName.ADMIN, + createdAt: timeStampDate, + updatedAt: timeStampDate, + } + + const dbUserRole = { + id: faker.string.uuid(), + cuid: 'ciglo1j8q0000t9j4xq8d6p5e', + role_id: roleUUID, + user_id: userUUID, + primary: true, + createdAt: timeStampDate, + updatedAt: timeStampDate, + } describe('Create User Role', () => { - rolesService.findOneByNameOrThrow = vi.fn().mockResolvedValue({ - id: '3e0e9f0f-0a0b-4f0b-8f0b-0a0b4f0b8f0b', - cuid: 'ciglo1j8q0000t9j4xq8d6p5e', - name: 'user', - createdAt: new Date(), - updatedAt: new Date() - } satisfies Awaited>); - - userRolesRepository.create = vi.fn().mockResolvedValue({ - id: '3e0e9f0f-0a0b-4f0b-8f0b-0a0b4f0b8f0b', - cuid: 'ciglo1j8q0000t9j4xq8d6p5e', - user_id: '3e0e9f0f-0a0b-4f0b-8f0b-0a0b4f0b8fff', - role_id: '3e0e9f0f-0a0b-4f0b-8f0b-0a0b4f0b8f0b', - primary: true, - createdAt: new Date(), - updatedAt: new Date() - } satisfies Awaited>); - - const spy_rolesService_findOneByNameOrThrow = vi.spyOn(rolesService, 'findOneByNameOrThrow'); - const spy_userRolesRepository_create = vi.spyOn(userRolesRepository, 'create'); - it('should resolve', async () => { - await expect(service.addRoleToUser('3e0e9f0f-0a0b-4f0b-8f0b-0a0b4f0b8fff', 'user', true)).resolves.not.toThrowError(); - }) - it('should call rolesService.findOneByNameOrThrow', async () => { - expect(spy_rolesService_findOneByNameOrThrow).toBeCalledWith('user'); - expect(spy_rolesService_findOneByNameOrThrow).toBeCalledTimes(1); - }) - it('should call userRolesRepository.create', async () => { + rolesService.findOneByNameOrThrow = vi.fn().mockResolvedValue(dbRole satisfies Awaited>) + + userRolesRepository.create = vi.fn().mockResolvedValue(dbUserRole satisfies Awaited>) + + const spy_rolesService_findOneByNameOrThrow = vi.spyOn(rolesService, 'findOneByNameOrThrow') + const spy_userRolesRepository_create = vi.spyOn(userRolesRepository, 'create') + + await expect(service.addRoleToUser(userUUID, RoleName.ADMIN, true)).resolves.not.toThrowError() + expect(spy_rolesService_findOneByNameOrThrow).toBeCalledWith(RoleName.ADMIN) + expect(spy_rolesService_findOneByNameOrThrow).toBeCalledTimes(1) expect(spy_userRolesRepository_create).toBeCalledWith({ - user_id: '3e0e9f0f-0a0b-4f0b-8f0b-0a0b4f0b8fff', - role_id: '3e0e9f0f-0a0b-4f0b-8f0b-0a0b4f0b8f0b', - primary: true - }); - expect(spy_userRolesRepository_create).toBeCalledTimes(1); + user_id: userUUID, + role_id: dbRole.id, + primary: true, + }) + expect(spy_userRolesRepository_create).toBeCalledTimes(1) + }) + it('should error on no role found', async () => { + rolesService.findOneByNameOrThrow = vi.fn().mockResolvedValue(undefined) + + const spy_rolesService_findOneByNameOrThrow = vi.spyOn(rolesService, 'findOneByNameOrThrow') + await expect(service.addRoleToUser(userUUID, RoleName.ADMIN, true)).rejects.toThrowError(`Role with name ${RoleName.ADMIN} not found`) + expect(spy_rolesService_findOneByNameOrThrow).toBeCalledWith(RoleName.ADMIN) + expect(spy_rolesService_findOneByNameOrThrow).toBeCalledTimes(1) }) }) -}); \ No newline at end of file +}) diff --git a/src/lib/server/api/tests/users.service.test.ts b/src/lib/server/api/tests/users.service.test.ts index fb40e5f..8757df8 100644 --- a/src/lib/server/api/tests/users.service.test.ts +++ b/src/lib/server/api/tests/users.service.test.ts @@ -1,104 +1,156 @@ -import 'reflect-metadata'; -import { container } from 'tsyringe'; -import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest'; -import { UsersService } from '../services/users.service'; -import { CredentialsRepository } from '../repositories/credentials.repository'; -import { TokensService } from '../services/tokens.service'; -import { UserRolesService } from '../services/user_roles.service'; -import { UsersRepository } from '../repositories/users.repository'; -import { Argon2id } from 'oslo/password'; -import { WishlistsService } from '../services/wishlists.service'; -import { CollectionsService } from '../services/collections.service'; +import 'reflect-metadata' +import { CredentialsType } from '$lib/server/api/databases/tables' +import { faker } from '@faker-js/faker' +import { container } from 'tsyringe' +import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest' +import { CredentialsRepository } from '../repositories/credentials.repository' +import { UsersRepository } from '../repositories/users.repository' +import { CollectionsService } from '../services/collections.service' +import { DrizzleService } from '../services/drizzle.service' +import { TokensService } from '../services/tokens.service' +import { UserRolesService } from '../services/user_roles.service' +import { UsersService } from '../services/users.service' +import { WishlistsService } from '../services/wishlists.service' describe('UsersService', () => { - let service: UsersService; - const credentialsRepository = vi.mocked(CredentialsRepository.prototype); - const tokensService = vi.mocked(TokensService.prototype); - const usersRepository = vi.mocked(UsersRepository.prototype); - const userRolesService = vi.mocked(UserRolesService.prototype); - const wishlistsService = vi.mocked(WishlistsService.prototype); - const collectionsService = vi.mocked(CollectionsService.prototype); + let service: UsersService + const credentialsRepository = vi.mocked(CredentialsRepository.prototype) + const drizzleService = vi.mocked(DrizzleService.prototype, { deep: true }) + const tokensService = vi.mocked(TokensService.prototype) + const usersRepository = vi.mocked(UsersRepository.prototype) + const userRolesService = vi.mocked(UserRolesService.prototype) + const wishlistsService = vi.mocked(WishlistsService.prototype) + const collectionsService = vi.mocked(CollectionsService.prototype) - beforeAll(() => { - service = container - .register(CredentialsRepository, { useValue: credentialsRepository }) + // Mocking the dependencies + vi.mock('pg', () => ({ + Pool: vi.fn().mockImplementation(() => ({ + connect: vi.fn(), + end: vi.fn(), + })), + })) + + vi.mock('drizzle-orm/node-postgres', () => ({ + drizzle: vi.fn().mockImplementation(() => ({ + transaction: vi.fn().mockImplementation((callback) => callback()), + // Add other methods you need to mock + })), + })) + + beforeAll(() => { + service = container + .register(CredentialsRepository, { useValue: credentialsRepository }) + .register(DrizzleService, { useValue: drizzleService }) .register(TokensService, { useValue: tokensService }) .register(UsersRepository, { useValue: usersRepository }) .register(UserRolesService, { useValue: userRolesService }) .register(WishlistsService, { useValue: wishlistsService }) .register(CollectionsService, { useValue: collectionsService }) - .resolve(UsersService); - }); + .resolve(UsersService) - afterAll(() => { - vi.resetAllMocks() - }) + drizzleService.db = { + transaction: vi.fn().mockImplementation(async (callback) => { + return await callback() + }), + } as any + }) + + afterAll(() => { + vi.resetAllMocks() + }) + + const timeStampDate = new Date() + const dbUser = { + id: faker.string.uuid(), + cuid: 'ciglo1j8q0000t9j4xq8d6p5e', + first_name: faker.person.firstName(), + last_name: faker.person.lastName(), + email: faker.internet.email(), + username: faker.internet.userName(), + verified: false, + receive_email: false, + mfa_enabled: false, + theme: 'system', + createdAt: timeStampDate, + updatedAt: timeStampDate, + } + const dbCredentials = { + id: faker.string.uuid(), + user_id: dbUser.id, + type: CredentialsType.PASSWORD, + secret_data: 'hashedPassword', + createdAt: timeStampDate, + updatedAt: timeStampDate, + } describe('Create User', () => { - const hashedPassword = new Argon2id().hash('111'); - tokensService.createHashedToken = vi.fn().mockResolvedValue(hashedPassword) + it('should resolve', async () => { + const hashedPassword = 'testhash' + tokensService.createHashedToken = vi.fn().mockResolvedValue(hashedPassword) + // drizzleService.db = { + // transaction: vi.fn().mockResolvedValue(dbUser satisfies Awaited>), + // } + usersRepository.create = vi.fn().mockResolvedValue(dbUser satisfies Awaited>) + credentialsRepository.create = vi.fn().mockResolvedValue(dbCredentials satisfies Awaited>) + userRolesService.addRoleToUser = vi.fn().mockResolvedValue(undefined) + wishlistsService.createEmptyNoName = vi.fn().mockResolvedValue(undefined) + collectionsService.createEmptyNoName = vi.fn().mockResolvedValue(undefined) - usersRepository.create = vi.fn().mockResolvedValue({ - id: '3e0e9f0f-0a0b-4f0b-8f0b-0a0b4f0b8f0b', - cuid: 'ciglo1j8q0000t9j4xq8d6p5e', - first_name: 'test', - last_name: 'test', - email: 'test@example.com', - username: 'test', - verified: false, - receive_email: false, - theme: 'system', - createdAt: new Date(), - updatedAt: new Date() - } satisfies Awaited>) - - credentialsRepository.create = vi.fn().mockResolvedValue({ - id: '3e0e9f0f-0a0b-4f0b-8f0b-0a0b4f0b8f0b', - user_id: '3e0e9f0f-0a0b-4f0b-8f0b-0a0b4f0b8f0b', - type: 'PASSWORD', - secret_data: hashedPassword - }) - - userRolesService.addRoleToUser = vi.fn().mockResolvedValue(undefined) - - wishlistsService.createEmptyNoName = vi.fn().mockResolvedValue(undefined) - - collectionsService.createEmptyNoName = vi.fn().mockResolvedValue(undefined) - - const spy_tokensService_createHashToken = vi.spyOn(tokensService, 'createHashedToken'); - const spy_usersRepository_create = vi.spyOn(usersRepository, 'create'); - const spy_credentialsRepository_create = vi.spyOn(credentialsRepository, 'create'); - const spy_userRolesService_addRoleToUser = vi.spyOn(userRolesService, 'addRoleToUser'); - const spy_wishlistsService_createEmptyNoName = vi.spyOn(wishlistsService, 'createEmptyNoName'); - const spy_collectionsService_createEmptyNoName = vi.spyOn(collectionsService, 'createEmptyNoName'); - - it('should resolve', async () => { - await expect(service.create({ - firstName: 'test', - lastName: 'test', - email: 'test@example.com', - username: 'test', - password: '111', - confirm_password: '111' - })).resolves.not.toThrow() - }) - it('should generate a hashed token', async () => { - expect(spy_tokensService_createHashToken).toBeCalledTimes(1) - }) - it('should create a new user', async () => { - expect(spy_usersRepository_create).toHaveBeenCalledTimes(1) - }) - it('should create a new credential', async () => { - expect(spy_credentialsRepository_create).toBeCalledTimes(1) - }) - it('should add role to user', async () => { + const spy_tokensService_createHashToken = vi.spyOn(tokensService, 'createHashedToken') + const spy_usersRepository_create = vi.spyOn(usersRepository, 'create') + const spy_credentialsRepository_create = vi.spyOn(credentialsRepository, 'create') + const spy_userRolesService_addRoleToUser = vi.spyOn(userRolesService, 'addRoleToUser') + const spy_wishlistsService_createEmptyNoName = vi.spyOn(wishlistsService, 'createEmptyNoName') + const spy_collectionsService_createEmptyNoName = vi.spyOn(collectionsService, 'createEmptyNoName') + await expect( + service.create({ + firstName: faker.person.firstName(), + lastName: faker.person.lastName(), + email: faker.internet.email(), + username: faker.internet.userName(), + password: faker.string.alphanumeric(10), + confirm_password: faker.string.alphanumeric(10), + }), + ).resolves.toEqual(dbUser) + expect(spy_tokensService_createHashToken).toBeCalledTimes(1) + expect(spy_usersRepository_create).toBeCalledTimes(1) + expect(spy_credentialsRepository_create).toBeCalledTimes(1) expect(spy_userRolesService_addRoleToUser).toBeCalledTimes(1) - }) - it('should create a new wishlist', async () => { expect(spy_wishlistsService_createEmptyNoName).toBeCalledTimes(1) - }) - it('should create a new collection', async () => { expect(spy_collectionsService_createEmptyNoName).toBeCalledTimes(1) }) - }) -}); + }) + describe('Update User', () => { + it('should resolve Password Exiting Credentials', async () => { + const hashedPassword = 'testhash' + tokensService.createHashedToken = vi.fn().mockResolvedValue(hashedPassword) + credentialsRepository.update = vi.fn().mockResolvedValue(dbCredentials satisfies Awaited>) + credentialsRepository.findPasswordCredentialsByUserId = vi + .fn() + .mockResolvedValue(dbCredentials satisfies Awaited>) + + const spy_tokensService_createHashToken = vi.spyOn(tokensService, 'createHashedToken') + const spy_credentialsRepository_findPasswordCredentialsByUserId = vi.spyOn(credentialsRepository, 'findPasswordCredentialsByUserId') + const spy_credentialsRepository_update = vi.spyOn(credentialsRepository, 'update') + await expect(service.updatePassword(dbUser.id, faker.string.alphanumeric(10))).resolves.toBeUndefined() + expect(spy_tokensService_createHashToken).toBeCalledTimes(1) + expect(spy_credentialsRepository_findPasswordCredentialsByUserId).toBeCalledTimes(1) + expect(spy_credentialsRepository_update).toBeCalledTimes(1) + }) + it('Should Create User Password No Existing Credentials', async () => { + const hashedPassword = 'testhash' + tokensService.createHashedToken = vi.fn().mockResolvedValue(hashedPassword) + credentialsRepository.findPasswordCredentialsByUserId = vi.fn().mockResolvedValue(null) + credentialsRepository.create = vi.fn().mockResolvedValue(dbCredentials satisfies Awaited>) + + const spy_tokensService_createHashToken = vi.spyOn(tokensService, 'createHashedToken') + const spy_credentialsRepository_create = vi.spyOn(credentialsRepository, 'create') + const spy_credentialsRepository_findPasswordCredentialsByUserId = vi.spyOn(credentialsRepository, 'findPasswordCredentialsByUserId') + + await expect(service.updatePassword(dbUser.id, faker.string.alphanumeric(10))).resolves.not.toThrow() + expect(spy_tokensService_createHashToken).toBeCalledTimes(1) + expect(spy_credentialsRepository_findPasswordCredentialsByUserId).toBeCalledTimes(1) + expect(spy_credentialsRepository_create).toHaveBeenCalledTimes(1) + }) + }) +}) diff --git a/src/lib/server/auth.ts b/src/lib/server/auth.ts new file mode 100644 index 0000000..e06aa3e --- /dev/null +++ b/src/lib/server/auth.ts @@ -0,0 +1,6 @@ +import env from "$lib/server/api/common/env"; +import { GitHub, Google } from "arctic"; + +export const github = new GitHub(env.GITHUB_CLIENT_ID, env.GITHUB_CLIENT_SECRET); + +export const google = new Google(env.GOOGLE_CLIENT_ID, env.GOOGLE_CLIENT_SECRET, `${env.ORIGIN}/auth/callback/google`); \ No newline at end of file diff --git a/src/lib/types.ts b/src/lib/types.ts index 8e9810e..5c859d3 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -1,31 +1,36 @@ -import type { SvelteComponent } from 'svelte'; -import { collections } from '$db/schema'; +import type { collections } from '$lib/server/api/databases/tables' +import type { SvelteComponent } from 'svelte' -export type Message = { status: 'error' | 'success' | 'warning' | 'info'; text: string }; +export type Message = { status: 'error' | 'success' | 'warning' | 'info'; text: string } + +export type Route = { + href: string + label: string +} export type Dialog = { - isOpen: boolean; - content?: typeof SvelteComponent; - additionalData?: SavedGameType | GameType; -}; + isOpen: boolean + content?: typeof SvelteComponent + additionalData?: SavedGameType | GameType +} export type Search = { - name: string; - minAge: string; - minPlayers: string; - maxPlayers: string; - exactMinAge: string; - exactMinPlayers: string; - exactMaxPlayers: string; - skip: number; - currentPage: number; - limit: number; -}; + name: string + minAge: string + minPlayers: string + maxPlayers: string + exactMinAge: string + exactMinPlayers: string + exactMaxPlayers: string + skip: number + currentPage: number + limit: number +} export type BoredStore = { - loading: boolean; - dialog: Dialog; -}; + loading: boolean + dialog: Dialog +} export enum ToastType { INFO = 'INFO', @@ -34,146 +39,141 @@ export enum ToastType { } export type ToastData = { - id: number; - duration: number; - dismissible: boolean; - showButton: boolean; - autoDismiss: boolean; - type: ToastType; - message: string; -}; + id: number + duration: number + dismissible: boolean + showButton: boolean + autoDismiss: boolean + type: ToastType + message: string +} export type GameMechanic = { - id: string; - name: string; - boardGameAtlasLink: string; -}; + id: string + name: string + boardGameAtlasLink: string +} export type SavedGameType = { - id: string; - name: string; - thumb_url: string; - players: string; - playtime: string; - mechanics: GameMechanic[]; - searchTerms: string; - includeInRandom: boolean; -}; + id: string + name: string + thumb_url: string + players: string + playtime: string + mechanics: GameMechanic[] + searchTerms: string + includeInRandom: boolean +} export type ListGameType = { - id: string; - game_id: string; - collection_id: string | undefined; - wishlist_id: string | undefined; - times_played: number; - thumb_url: string; -}; + id: string + game_id: string + collection_id: string | undefined + wishlist_id: string | undefined + times_played: number + thumb_url: string +} export type MechanicType = { - id: string; -}; + id: string +} export type CategoryType = { - id: string; -}; + id: string +} export type PublisherType = { - id: string; -}; + id: string +} export type DesignerType = { - id: string; -}; + id: string +} export type ArtistType = { - id: string; -}; + id: string +} export type ExpansionType = { - id: string; -}; + id: string +} -export type BGGLinkType = - | 'boardgamecategory' - | 'boardgamemechanic' - | 'boardgameexpansion' - | 'boardgameartist' - | 'boardgamepublisher'; +export type BGGLinkType = 'boardgamecategory' | 'boardgamemechanic' | 'boardgameexpansion' | 'boardgameartist' | 'boardgamepublisher' export type BGGLink = { - id: number; - type: BGGLinkType; - value: string; -}; + id: number + type: BGGLinkType + value: string +} export type GameType = { - id: string; - name: string; - slug: string; - url: string; - edit_url: string; - thumb_url: string; - image_url: string; - price: number; - price_ca: number; - price_uk: number; - price_au: number; - msrp: number; - year_published: number; - categories: CategoryType[]; - mechanics: MechanicType[]; - primary_publisher: PublisherType; - publishers: PublisherType[]; - primary_designer: DesignerType; - designers: DesignerType[]; - developers: String[]; - artists: ArtistType[]; - expansions: ExpansionType[]; - min_players: number; - max_players: number; - min_playtime: number; - max_playtime: number; - min_age: number; - description: string; - players: string; - playtime: number; - external_id: number; -}; + id: string + name: string + slug: string + url: string + edit_url: string + thumb_url: string + image_url: string + price: number + price_ca: number + price_uk: number + price_au: number + msrp: number + year_published: number + categories: CategoryType[] + mechanics: MechanicType[] + primary_publisher: PublisherType + publishers: PublisherType[] + primary_designer: DesignerType + designers: DesignerType[] + developers: string[] + artists: ArtistType[] + expansions: ExpansionType[] + min_players: number + max_players: number + min_playtime: number + max_playtime: number + min_age: number + description: string + players: string + playtime: number + external_id: number +} export type SearchQuery = { - limit?: number; - skip?: number; - ids?: string[]; - list_id?: string; - random?: boolean; - q?: string; - exact?: boolean; - designer?: string; - publisher?: string; - artist?: string; - mechanics?: string; - categories?: string; - order_by?: string; - ascending?: boolean; - min_players?: number; - max_players?: number; - min_playtime?: number; - max_playtime?: number; - min_age?: number; - year_published?: number; - gt_min_players?: number; - gt_max_players?: number; - gt_min_playtime?: number; - gt_max_playtime?: number; - gt_min_age?: number; - gt_year_published?: number; - lt_min_players?: number; - lt_max_players?: number; - lt_min_playtime?: number; - lt_max_playtime?: number; - lt_min_age?: number; - lt_year_published?: number; - fields?: string; -}; + limit?: number + skip?: number + ids?: string[] + list_id?: string + random?: boolean + q?: string + exact?: boolean + designer?: string + publisher?: string + artist?: string + mechanics?: string + categories?: string + order_by?: string + ascending?: boolean + min_players?: number + max_players?: number + min_playtime?: number + max_playtime?: number + min_age?: number + year_published?: number + gt_min_players?: number + gt_max_players?: number + gt_min_playtime?: number + gt_max_playtime?: number + gt_min_age?: number + gt_year_published?: number + lt_min_players?: number + lt_max_players?: number + lt_min_playtime?: number + lt_max_playtime?: number + lt_min_age?: number + lt_year_published?: number + fields?: string +} -export type UICollection = Pick; +export type UICollection = Pick diff --git a/src/lib/utils/db/categoryUtils.ts b/src/lib/utils/db/categoryUtils.ts index 780685d..392d267 100644 --- a/src/lib/utils/db/categoryUtils.ts +++ b/src/lib/utils/db/categoryUtils.ts @@ -1,5 +1,5 @@ import { PUBLIC_SITE_URL } from '$env/static/public' -import { type Categories, type Mechanics, categoriesTable, categoriesToExternalIdsTable, externalIds } from '$lib/server/api/databases/tables' +import { type Categories, type Mechanics, categoriesTable, categoriesToExternalIdsTable, externalIdsTable } from '$lib/server/api/databases/tables' import { db } from '$lib/server/api/packages/drizzle' import { error } from '@sveltejs/kit' import { eq } from 'drizzle-orm' @@ -12,7 +12,7 @@ export async function createCategory(locals: App.Locals, category: Categories, e try { const dbExternalId = await db.query.externalIds.findFirst({ - where: eq(externalIds.externalId, externalId), + where: eq(externalIdsTable.externalId, externalId), }) if (dbExternalId) { @@ -48,12 +48,12 @@ export async function createCategory(locals: App.Locals, category: Categories, e }) .returning() const dbExternalIds = await transaction - .insert(externalIds) + .insert(externalIdsTable) .values({ externalId, type: 'category', }) - .returning({ id: externalIds.id }) + .returning({ id: externalIdsTable.id }) await transaction.insert(categoriesToExternalIdsTable).values({ categoryId: dbCategory[0].id, externalId: dbExternalIds[0].id, diff --git a/src/lib/utils/db/expansionUtils.ts b/src/lib/utils/db/expansionUtils.ts index d6ff8db..07bea23 100644 --- a/src/lib/utils/db/expansionUtils.ts +++ b/src/lib/utils/db/expansionUtils.ts @@ -1,5 +1,5 @@ import { PUBLIC_SITE_URL } from '$env/static/public' -import { type Expansions, expansions } from '$lib/server/api/databases/tables' +import { type Expansions, expansionsTable } from '$lib/server/api/databases/tables' import { db } from '$lib/server/api/packages/drizzle' import { error } from '@sveltejs/kit' import { and, eq } from 'drizzle-orm' @@ -11,7 +11,7 @@ export async function createExpansion(locals: App.Locals, expansion: Expansions) 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)), + where: and(eq(expansionsTable.base_game_id, expansion.base_game_id), eq(expansionsTable.game_id, expansion.game_id)), columns: { id: true, game_id: true, @@ -32,7 +32,7 @@ export async function createExpansion(locals: App.Locals, expansion: Expansions) console.log('Creating expansion', JSON.stringify(expansion, null, 2)) const dbExpansion = await db - .insert(expansions) + .insert(expansionsTable) .values({ base_game_id: expansion.base_game_id, game_id: expansion.game_id, @@ -146,7 +146,7 @@ export async function createExpansion(locals: App.Locals, expansion: Expansions) // id: gameId // }, // data: { -// expansions: { +// expansionsTable: { // connect: { // id: expansion.id // } @@ -160,7 +160,7 @@ export async function createExpansion(locals: App.Locals, expansion: Expansions) // id: baseGameId // }, // data: { -// expansions: { +// expansionsTable: { // connect: { // id: expansion.id // } diff --git a/src/lib/utils/db/gameUtils.ts b/src/lib/utils/db/gameUtils.ts index b8a375b..50e79dc 100644 --- a/src/lib/utils/db/gameUtils.ts +++ b/src/lib/utils/db/gameUtils.ts @@ -1,5 +1,5 @@ import { PUBLIC_SITE_URL } from '$env/static/public' -import { type Games, externalIds, games, gamesToExternalIds } from '$lib/server/api/databases/tables' +import { type Games, externalIdsTable, gamesTable, gamesToExternalIdsTable } from '$lib/server/api/databases/tables' import { db } from '$lib/server/api/packages/drizzle' import { error } from '@sveltejs/kit' import { eq } from 'drizzle-orm' @@ -12,11 +12,11 @@ export async function getGame(locals: App.Locals, id: string) { try { return await db.query.games.findFirst({ - where: eq(games.id, id), + where: eq(gamesTable.id, id), }) } catch (e) { console.error(e) - return new Response('Could not get games', { + return new Response('Could not get gamesTable', { status: 500, }) } @@ -29,18 +29,18 @@ export async function createGame(locals: App.Locals, game: Games, externalId: st try { const dbExternalId = await db.query.externalIds.findFirst({ - where: eq(externalIds.externalId, externalId), + where: eq(externalIdsTable.externalId, externalId), }) if (dbExternalId) { const foundGame = await db .select({ - id: games.id, - name: games.name, - slug: games.slug, + id: gamesTable.id, + name: gamesTable.name, + slug: gamesTable.slug, }) - .from(games) - .leftJoin(gamesToExternalIds, eq(gamesToExternalIds.externalId, externalId)) + .from(gamesTable) + .leftJoin(gamesToExternalIdsTable, eq(gamesToExternalIdsTable.externalId, externalId)) console.log('Game already exists', foundGame) if (foundGame.length > 0) { console.log('Game name', foundGame[0].name) @@ -58,7 +58,7 @@ export async function createGame(locals: App.Locals, game: Games, externalId: st console.log('Creating game', JSON.stringify(game, null, 2)) await db.transaction(async (transaction) => { dbGames = await transaction - .insert(games) + .insert(gamesTable) .values({ name: game.name, slug: kebabCase(game.name || game.slug || ''), @@ -75,13 +75,13 @@ export async function createGame(locals: App.Locals, game: Games, externalId: st }) .returning() const dbExternalIds = await transaction - .insert(externalIds) + .insert(externalIdsTable) .values({ externalId, type: 'game', }) - .returning({ id: externalIds.id }) - await transaction.insert(gamesToExternalIds).values({ + .returning({ id: externalIdsTable.id }) + await transaction.insert(gamesToExternalIdsTable).values({ gameId: dbGames[0].id, externalId: dbExternalIds[0].id, }) @@ -115,7 +115,7 @@ export async function createOrUpdateGameMinimal(locals: App.Locals, game: Games, console.log('Creating game', JSON.stringify(game, null, 2)) await db.transaction(async (transaction) => { dbGames = await transaction - .insert(games) + .insert(gamesTable) .values({ name: game.name, slug: kebabCase(game.name ?? game.slug ?? ''), @@ -131,7 +131,7 @@ export async function createOrUpdateGameMinimal(locals: App.Locals, game: Games, max_playtime: game.max_playtime, }) .onConflictDoUpdate({ - target: games.id, + target: gamesTable.id, set: { name: game.name, slug: kebabCase(game.name || game.slug || ''), @@ -149,15 +149,15 @@ export async function createOrUpdateGameMinimal(locals: App.Locals, game: Games, }) .returning() const dbExternalIds = await transaction - .insert(externalIds) + .insert(externalIdsTable) .values({ externalId, type: 'game', }) .onConflictDoNothing() - .returning({ id: externalIds.id }) + .returning({ id: externalIdsTable.id }) await transaction - .insert(gamesToExternalIds) + .insert(gamesToExternalIdsTable) .values({ gameId: dbGames[0].id, externalId: dbExternalIds[0].id, @@ -189,18 +189,18 @@ export async function createOrUpdateGame(locals: App.Locals, game: Games, extern try { const externalUrl = `https://boardgamegeek.com/boardgame/${externalId}` const dbExternalId = await db.query.externalIds.findFirst({ - where: eq(externalIds.externalId, externalId), + where: eq(externalIdsTable.externalId, externalId), }) if (dbExternalId) { const foundGame = await db .select({ - id: games.id, - name: games.name, - slug: games.slug, + id: gamesTable.id, + name: gamesTable.name, + slug: gamesTable.slug, }) - .from(games) - .leftJoin(gamesToExternalIds, eq(gamesToExternalIds.externalId, externalId)) + .from(gamesTable) + .leftJoin(gamesToExternalIdsTable, eq(gamesToExternalIdsTable.externalId, externalId)) console.log('Game already exists', foundGame) if (foundGame.length > 0) { console.log('Game name', foundGame[0].name) @@ -218,7 +218,7 @@ export async function createOrUpdateGame(locals: App.Locals, game: Games, extern console.log('Creating game', JSON.stringify(game, null, 2)) await db.transaction(async (transaction) => { dbGames = await transaction - .insert(games) + .insert(gamesTable) .values({ name: game.name, slug: kebabCase(game.name || game.slug || ''), @@ -234,7 +234,7 @@ export async function createOrUpdateGame(locals: App.Locals, game: Games, extern max_playtime: game.max_playtime, }) .onConflictDoUpdate({ - target: games.id, + target: gamesTable.id, set: { name: game.name, slug: kebabCase(game.name || game.slug || ''), @@ -252,15 +252,15 @@ export async function createOrUpdateGame(locals: App.Locals, game: Games, extern }) .returning() const dbExternalIds = await transaction - .insert(externalIds) + .insert(externalIdsTable) .values({ externalId, type: 'game', }) .onConflictDoNothing() - .returning({ id: externalIds.id }) + .returning({ id: externalIdsTable.id }) await transaction - .insert(gamesToExternalIds) + .insert(gamesToExternalIdsTable) .values({ gameId: dbGames[0].id, externalId: dbExternalIds[0].id, @@ -291,7 +291,7 @@ export async function updateGame(locals: App.Locals, game: Games, id: string) { try { const dbGame = await db - .update(games) + .update(gamesTable) .set({ name: game.name, slug: kebabCase(game.name || game.slug || ''), @@ -306,7 +306,7 @@ export async function updateGame(locals: App.Locals, game: Games, id: string) { min_playtime: game.min_playtime, max_playtime: game.max_playtime, }) - .where(eq(games.id, id)) + .where(eq(gamesTable.id, id)) .returning() return new Response(JSON.stringify(dbGame[0]), { headers: { @@ -315,7 +315,7 @@ export async function updateGame(locals: App.Locals, game: Games, id: string) { }) } catch (e) { console.error(e) - return new Response('Could not get publishers', { + return new Response('Could not get publishersTable', { status: 500, }) } @@ -323,17 +323,17 @@ export async function updateGame(locals: App.Locals, game: Games, id: string) { // console.log('Creating or updating game', JSON.stringify(game, null, 2)); // const categoryIds = game.categories; -// const mechanicIds = game.mechanics; -// const publisherIds = game.publishers; +// const mechanicIds = game.mechanicsTable; +// const publisherIds = game.publishersTable; // const designerIds = game.designers; // const artistIds = game.artists; -// // const expansionIds = game.expansions; +// // const expansionIds = game.expansionsTable; // 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({ +// transaction.insert(gamesTable).values({ // name: game.name, // slug: kebabCase(game.name || ''), // description: game.description, @@ -349,7 +349,7 @@ export async function updateGame(locals: App.Locals, game: Games, id: string) { // year_published: game.year_published || 0, // last_sync_at: new Date(), // }).onConflictDoUpdate({ -// target: games.id, set: { +// target: gamesTable.id, set: { // name: game.name, // slug: kebabCase(game.name), // description: game.description, @@ -369,13 +369,13 @@ export async function updateGame(locals: App.Locals, game: Games, id: string) { // }); // // TODO: Connect to everything else // }); -// await db.insert(games).values({ +// await db.insert(gamesTable).values({ // include: { -// mechanics: true, -// publishers: true, +// mechanicsTable: true, +// publishersTable: true, // designers: true, // artists: true, -// expansions: true +// expansionsTable: true // }, // where: { // external_id: game.external_id @@ -398,10 +398,10 @@ export async function updateGame(locals: App.Locals, game: Games, id: string) { // categories: { // connect: categoryIds // }, -// mechanics: { +// mechanicsTable: { // connect: mechanicIds // }, -// publishers: { +// publishersTable: { // connect: publisherIds // }, // designers: { @@ -429,10 +429,10 @@ export async function updateGame(locals: App.Locals, game: Games, id: string) { // categories: { // connect: categoryIds // }, -// mechanics: { +// mechanicsTable: { // connect: mechanicIds // }, -// publishers: { +// publishersTable: { // connect: publisherIds // }, // designers: { diff --git a/src/lib/utils/db/mechanicUtils.ts b/src/lib/utils/db/mechanicUtils.ts index 4d963c0..071c9c9 100644 --- a/src/lib/utils/db/mechanicUtils.ts +++ b/src/lib/utils/db/mechanicUtils.ts @@ -1,5 +1,5 @@ import { PUBLIC_SITE_URL } from '$env/static/public' -import { type Mechanics, externalIds, mechanics, mechanicsToExternalIds } from '$lib/server/api/databases/tables' +import { type Mechanics, externalIdsTable, mechanicsTable, mechanicsToExternalIdsTable } from '$lib/server/api/databases/tables' import { db } from '$lib/server/api/packages/drizzle' import { error } from '@sveltejs/kit' import { eq } from 'drizzle-orm' @@ -12,18 +12,18 @@ export async function createMechanic(locals: App.Locals, mechanic: Mechanics, ex try { const dbExternalId = await db.query.externalIds.findFirst({ - where: eq(externalIds.externalId, externalId), + where: eq(externalIdsTable.externalId, externalId), }) if (dbExternalId) { const foundMechanic = await db .select({ - id: mechanics.id, - name: mechanics.name, - slug: mechanics.slug, + id: mechanicsTable.id, + name: mechanicsTable.name, + slug: mechanicsTable.slug, }) - .from(mechanics) - .leftJoin(mechanicsToExternalIds, eq(mechanicsToExternalIds.externalId, externalId)) + .from(mechanicsTable) + .leftJoin(mechanicsToExternalIdsTable, eq(mechanicsToExternalIdsTable.externalId, externalId)) console.log('Mechanic already exists', foundMechanic) if (foundMechanic.length > 0) { console.log('Mechanic name', foundMechanic[0].name) @@ -41,20 +41,20 @@ export async function createMechanic(locals: App.Locals, mechanic: Mechanics, ex console.log('Creating mechanic', JSON.stringify(mechanic, null, 2)) await db.transaction(async (transaction) => { dbMechanics = await transaction - .insert(mechanics) + .insert(mechanicsTable) .values({ name: mechanic.name, slug: kebabCase(mechanic.name || mechanic.slug || ''), }) .returning() const dbExternalIds = await transaction - .insert(externalIds) + .insert(externalIdsTable) .values({ externalId, type: 'mechanic', }) - .returning({ id: externalIds.id }) - await transaction.insert(mechanicsToExternalIds).values({ + .returning({ id: externalIdsTable.id }) + await transaction.insert(mechanicsToExternalIdsTable).values({ mechanicId: dbMechanics[0].id, externalId: dbExternalIds[0].id, }) diff --git a/src/lib/utils/db/publisherUtils.ts b/src/lib/utils/db/publisherUtils.ts index a66fe4e..576094d 100644 --- a/src/lib/utils/db/publisherUtils.ts +++ b/src/lib/utils/db/publisherUtils.ts @@ -1,12 +1,12 @@ import { PUBLIC_SITE_URL } from '$env/static/public' -import { type Publishers, externalIds, publishers, publishersToExternalIds } from '$lib/server/api/databases/tables' +import { type Publishers, externalIdsTable, publishersTable, publishersToExternalIdsTable } from '$lib/server/api/databases/tables' import { db } from '$lib/server/api/packages/drizzle' import { error } from '@sveltejs/kit' import { eq } from 'drizzle-orm' import kebabCase from 'just-kebab-case' export async function getPublisher(locals: App.Locals, id: string) { - const publisher = await db.select().from(publishers).where(eq(publishers.id, id)) + const publisher = await db.select().from(publishersTable).where(eq(publishersTable.id, id)) if (publisher.length === 0) { error(404, 'not found') } @@ -24,12 +24,12 @@ export async function updatePublisher(locals: App.Locals, publisher: Publishers, try { const dbPublisher = await db - .update(publishers) + .update(publishersTable) .set({ name: publisher.name, slug: kebabCase(publisher.name || ''), }) - .where(eq(publishers.id, id)) + .where(eq(publishersTable.id, id)) .returning() return new Response(JSON.stringify(dbPublisher[0]), { headers: { @@ -38,7 +38,7 @@ export async function updatePublisher(locals: App.Locals, publisher: Publishers, }) } catch (e) { console.error(e) - return new Response('Could not get publishers', { + return new Response('Could not get publishersTable', { status: 500, }) } @@ -51,18 +51,18 @@ export async function createPublisher(locals: App.Locals, publisher: Publishers, try { const dbExternalId = await db.query.externalIds.findFirst({ - where: eq(externalIds.externalId, externalId), + where: eq(externalIdsTable.externalId, externalId), }) if (dbExternalId) { const foundPublisher = await db .select({ - id: publishers.id, - name: publishers.name, - slug: publishers.slug, + id: publishersTable.id, + name: publishersTable.name, + slug: publishersTable.slug, }) - .from(publishers) - .leftJoin(publishersToExternalIds, eq(publishersToExternalIds.externalId, externalId)) + .from(publishersTable) + .leftJoin(publishersToExternalIdsTable, eq(publishersToExternalIdsTable.externalId, externalId)) console.log('Publisher already exists', foundPublisher) if (foundPublisher.length > 0) { console.log('Publisher name', foundPublisher[0].name) @@ -80,20 +80,20 @@ export async function createPublisher(locals: App.Locals, publisher: Publishers, console.log('Creating publisher', JSON.stringify(publisher, null, 2)) await db.transaction(async (transaction) => { dbPublishers = await transaction - .insert(publishers) + .insert(publishersTable) .values({ name: publisher.name, slug: kebabCase(publisher.name || publisher.slug || ''), }) .returning() const dbExternalIds = await transaction - .insert(externalIds) + .insert(externalIdsTable) .values({ externalId, type: 'publisher', }) - .returning({ id: externalIds.id }) - await transaction.insert(publishersToExternalIds).values({ + .returning({ id: externalIdsTable.id }) + await transaction.insert(publishersToExternalIdsTable).values({ publisherId: dbPublishers[0].id, externalId: dbExternalIds[0].id, }) diff --git a/src/lib/utils/ui.ts b/src/lib/utils/ui.ts index 8af31c7..714692f 100644 --- a/src/lib/utils/ui.ts +++ b/src/lib/utils/ui.ts @@ -1,56 +1,53 @@ -import { type ClassValue, clsx } from 'clsx'; -import { twMerge } from 'tailwind-merge'; -import { cubicOut } from 'svelte/easing'; -import type { TransitionConfig } from 'svelte/transition'; +import { type ClassValue, clsx } from 'clsx' +import { cubicOut } from 'svelte/easing' +import type { TransitionConfig } from 'svelte/transition' +import { twMerge } from 'tailwind-merge' export function cn(...inputs: ClassValue[]) { - return twMerge(clsx(inputs)); + return twMerge(clsx(inputs)) } type FlyAndScaleParams = { - y?: number; - x?: number; - start?: number; - duration?: number; -}; + y?: number + x?: number + start?: number + duration?: number +} -export const flyAndScale = ( - node: Element, - params: FlyAndScaleParams = { y: -8, x: 0, start: 0.95, duration: 150 }, -): TransitionConfig => { - const style = getComputedStyle(node); - const transform = style.transform === 'none' ? '' : style.transform; +export const flyAndScale = (node: Element, params: FlyAndScaleParams = { y: -8, x: 0, start: 0.95, duration: 150 }): TransitionConfig => { + const style = getComputedStyle(node) + const transform = style.transform === 'none' ? '' : style.transform const scaleConversion = (valueA: number, scaleA: [number, number], scaleB: [number, number]) => { - const [minA, maxA] = scaleA; - const [minB, maxB] = scaleB; + const [minA, maxA] = scaleA + const [minB, maxB] = scaleB - const percentage = (valueA - minA) / (maxA - minA); - const valueB = percentage * (maxB - minB) + minB; + const percentage = (valueA - minA) / (maxA - minA) + const valueB = percentage * (maxB - minB) + minB - return valueB; - }; + return valueB + } const styleToString = (style: Record): string => { return Object.keys(style).reduce((str, key) => { - if (style[key] === undefined) return str; - return str + `${key}:${style[key]};`; - }, ''); - }; + if (style[key] === undefined) return str + return str + `${key}:${style[key]};` + }, '') + } return { duration: params.duration ?? 200, delay: 0, css: (t) => { - const y = scaleConversion(t, [0, 1], [params.y ?? 5, 0]); - const x = scaleConversion(t, [0, 1], [params.x ?? 0, 0]); - const scale = scaleConversion(t, [0, 1], [params.start ?? 0.95, 1]); + const y = scaleConversion(t, [0, 1], [params.y ?? 5, 0]) + const x = scaleConversion(t, [0, 1], [params.x ?? 0, 0]) + const scale = scaleConversion(t, [0, 1], [params.start ?? 0.95, 1]) return styleToString({ transform: `${transform} translate3d(${x}px, ${y}px, 0) scale(${scale})`, opacity: t, - }); + }) }, easing: cubicOut, - }; -}; + } +} diff --git a/src/lib/validations/account.ts b/src/lib/validations/account.ts index ca81b4c..b2841cb 100644 --- a/src/lib/validations/account.ts +++ b/src/lib/validations/account.ts @@ -1,112 +1,69 @@ -import { z } from 'zod'; -import { userSchema } from './zod-schemas'; - -export const profileSchema = userSchema.pick({ - firstName: true, - lastName: true, - username: true, -}); - -export const changeEmailSchema = userSchema.pick({ - email: true, -}); - -export const changeUserPasswordSchema = z - .object({ - current_password: z.string({ required_error: 'Current Password is required' }), - password: z.string({ required_error: 'Password is required' }).trim(), - confirm_password: z.string({ required_error: 'Confirm Password is required' }).trim(), - }) - .superRefine(({ confirm_password, password }, ctx) => { - refinePasswords(confirm_password, password, ctx); - }); - -export type ChangeUserPasswordSchema = typeof changeUserPasswordSchema; - -export const addTwoFactorSchema = z.object({ - current_password: z.string({ required_error: 'Current Password is required' }), - two_factor_code: z.string({ required_error: 'Two Factor Code is required' }).trim(), -}); - -export type AddTwoFactorSchema = typeof addTwoFactorSchema; - -export const removeTwoFactorSchema = addTwoFactorSchema.pick({ - current_password: true, -}); - -export type RemoveTwoFactorSchema = typeof removeTwoFactorSchema; +import { z } from 'zod' +import { userSchema } from './zod-schemas' export const updateUserPasswordSchema = userSchema .pick({ password: true, confirm_password: true }) .superRefine(({ confirm_password, password }, ctx) => { - refinePasswords(confirm_password, password, ctx); - }); + refinePasswords(confirm_password, password, ctx) + }) -export const refinePasswords = async function ( - confirm_password: string, - password: string, - ctx: z.RefinementCtx, -) { - comparePasswords(confirm_password, password, ctx); - checkPasswordStrength(password, ctx); -}; +export 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, -) { +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); + 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; + countOfSpecialChar = 0 for (let i = 0; i < password.length; i++) { - const char = password.charAt(i); + const char = password.charAt(i) if (!isNaN(+char)) { - countOfNumbers++; + countOfNumbers++ } else if (containsUppercase(char)) { - countOfUpperCase++; + countOfUpperCase++ } else if (containsLowercase(char)) { - countOfLowerCase++; + countOfLowerCase++ } else if (containsSpecialChar(char)) { - countOfSpecialChar++; + countOfSpecialChar++ } } - let errorMessage = 'Your password:'; + let errorMessage = 'Your password:' if (countOfLowerCase < 1) { - errorMessage = ' Must have at least one lowercase letter. '; + errorMessage = ' Must have at least one lowercase letter. ' } if (countOfNumbers < 1) { - errorMessage += ' Must have at least one number. '; + errorMessage += ' Must have at least one number. ' } if (countOfUpperCase < 1) { - errorMessage += ' Must have at least one uppercase letter. '; + errorMessage += ' Must have at least one uppercase letter. ' } if (countOfSpecialChar < 1) { - errorMessage += ' Must have at least one special character.'; + errorMessage += ' Must have at least one special character.' } if (minimumLength) { - errorMessage += ' Be at least 8 characters long.'; + errorMessage += ' Be at least 8 characters long.' } if (maximumLength) { - errorMessage += ' Be less than 128 characters long.'; + errorMessage += ' Be less than 128 characters long.' } if (errorMessage.length > 'Your password:'.length) { @@ -114,14 +71,14 @@ const checkPasswordStrength = async function (password: string, ctx: z.Refinemen code: 'custom', message: errorMessage, path: ['password'], - }); + }) } -}; +} export const addRoleSchema = z.object({ roles: z.array(z.string()).refine((value) => value.some((item) => item), { message: 'You have to select at least one item.', }), -}); +}) -export type AddRoleSchema = typeof addRoleSchema; +export type AddRoleSchema = typeof addRoleSchema diff --git a/src/routes/(app)/(protected)/admin/+layout.svelte b/src/routes/(app)/(protected)/admin/+layout.svelte index 370488e..35f8d53 100644 --- a/src/routes/(app)/(protected)/admin/+layout.svelte +++ b/src/routes/(app)/(protected)/admin/+layout.svelte @@ -39,7 +39,7 @@

Do the admin stuff

- +{@render children()} diff --git a/src/routes/(app)/(protected)/admin/users/[id]/+page.server.ts b/src/routes/(app)/(protected)/admin/users/[id]/+page.server.ts index 85bdbd7..ab2f1cf 100644 --- a/src/routes/(app)/(protected)/admin/users/[id]/+page.server.ts +++ b/src/routes/(app)/(protected)/admin/users/[id]/+page.server.ts @@ -1,5 +1,5 @@ import { forbiddenMessage, notSignedInMessage } from '$lib/flashMessages' -import { roles, user_roles, usersTable } from '$lib/server/api/databases/tables' +import { rolesTable, user_roles, usersTable } from '$lib/server/api/databases/tables' import { db } from '$lib/server/api/packages/drizzle' import { and, eq, inArray, not } from 'drizzle-orm' import { redirect } from 'sveltekit-flash-message/server' @@ -40,7 +40,7 @@ export const load: PageServerLoad = async (event) => { let availableRoles: { name: string; cuid: string }[] = [] if (currentRoleIds?.length > 0) { availableRoles = await db.query.roles.findMany({ - where: not(inArray(roles.cuid, currentRoleIds)), + where: not(inArray(rolesTable.cuid, currentRoleIds)), columns: { name: true, cuid: true, @@ -86,7 +86,7 @@ export const actions = { const data = await request.formData() const role = data.get('role') const dbRole = await db.query.roles.findFirst({ - where: eq(roles.cuid, role?.toString() ?? ''), + where: eq(rolesTable.cuid, role?.toString() ?? ''), }) console.log('dbRole', dbRole) if (dbRole) { @@ -126,7 +126,7 @@ export const actions = { const data = await request.formData() const role = data.get('role') const dbRole = await db.query.roles.findFirst({ - where: eq(roles.cuid, role?.toString() ?? ''), + where: eq(rolesTable.cuid, role?.toString() ?? ''), }) console.log('dbRole', dbRole) if (dbRole) { diff --git a/src/routes/(app)/(protected)/admin/users/[id]/+page.svelte b/src/routes/(app)/(protected)/admin/users/[id]/+page.svelte index 91cbd87..1c9fdf1 100644 --- a/src/routes/(app)/(protected)/admin/users/[id]/+page.svelte +++ b/src/routes/(app)/(protected)/admin/users/[id]/+page.svelte @@ -1,13 +1,13 @@

User Details

diff --git a/src/routes/(app)/(protected)/admin/users/[id]/add-roles-form.svelte b/src/routes/(app)/(protected)/admin/users/[id]/add-roles-form.svelte index 5e8f10e..27b7fc4 100644 --- a/src/routes/(app)/(protected)/admin/users/[id]/add-roles-form.svelte +++ b/src/routes/(app)/(protected)/admin/users/[id]/add-roles-form.svelte @@ -1,38 +1,34 @@
@@ -40,7 +36,7 @@
Roles - Select the roles you want to add to the user. + Select the rolesTable you want to add to the user.
diff --git a/src/routes/(app)/(protected)/collections/+page.server.ts b/src/routes/(app)/(protected)/collections/+page.server.ts index 55bad0b..881f050 100644 --- a/src/routes/(app)/(protected)/collections/+page.server.ts +++ b/src/routes/(app)/(protected)/collections/+page.server.ts @@ -1,38 +1,26 @@ import { notSignedInMessage } from '$lib/flashMessages' +import { collection_items, collections, gamesTable } from '$lib/server/api/databases/tables' import { db } from '$lib/server/api/packages/drizzle' -import { userNotAuthenticated } from '$lib/server/auth-utils' import { modifyListGameSchema } from '$lib/validations/zod-schemas' import { type Actions, error, fail } from '@sveltejs/kit' import { and, eq } from 'drizzle-orm' import { redirect } from 'sveltekit-flash-message/server' import { zod } from 'sveltekit-superforms/adapters' import { superValidate } from 'sveltekit-superforms/server' -import { collection_items, collections, games } from '../../../../lib/server/api/databases/tables' export async function load(event) { - const { user, session } = event.locals - if (userNotAuthenticated(user, session)) { - redirect(302, '/login', notSignedInMessage, event) + const { locals } = event + + const authedUser = await locals.getAuthedUser() + if (!authedUser) { + throw redirect(302, '/login', notSignedInMessage, event) } try { - const userCollections = await db.query.collections.findMany({ - columns: { - cuid: true, - name: true, - created_at: true, - }, - where: eq(collections.user_id, user!.id!), - }) - console.log('collections', userCollections) - - if (userCollections?.length === 0) { - console.log('Collection was not found') - return fail(404, {}) - } + const { data, error } = await locals.api.collections.$get().then(locals.parseApiResponse) return { - collections: userCollections, + collections: data?.collections || [], } } catch (e) { console.error(e) @@ -46,15 +34,18 @@ export async function load(event) { export const actions: Actions = { // Add game to a wishlist add: async (event) => { - const form = await superValidate(event, zod(modifyListGameSchema)) + const { locals } = event - if (!event.locals.user) { - throw fail(401) + const authedUser = await locals.getAuthedUser() + if (!authedUser) { + throw redirect(302, '/login', notSignedInMessage, event) } + const form = await superValidate(event, zod(modifyListGameSchema)) + const user = event.locals.user - const game = await db.query.games.findFirst({ - where: eq(games.id, form.data.id), + const game = await db.query.gamesTable.findFirst({ + where: eq(gamesTable.id, form.data.id), }) if (!game) { @@ -108,14 +99,16 @@ export const actions: Actions = { // Remove game from a wishlist remove: async (event) => { const { locals } = event - const form = await superValidate(event, zod(modifyListGameSchema)) - if (!locals.user) { - throw fail(401) + const authedUser = await locals.getAuthedUser() + if (!authedUser) { + throw redirect(302, '/login', notSignedInMessage, event) } - const game = await db.query.games.findFirst({ - where: eq(games.id, form.data.id), + const form = await superValidate(event, zod(modifyListGameSchema)) + + const game = await db.query.gamesTable.findFirst({ + where: eq(gamesTable.id, form.data.id), }) if (!game) { @@ -125,7 +118,7 @@ export const actions: Actions = { try { const collection = await db.query.collections.findFirst({ - where: eq(collections.user_id, locals.user.id), + where: eq(collections.user_id, authedUser.id), }) if (!collection) { diff --git a/src/routes/(app)/(protected)/collections/+page.svelte b/src/routes/(app)/(protected)/collections/+page.svelte index 81f993f..6d600b9 100644 --- a/src/routes/(app)/(protected)/collections/+page.svelte +++ b/src/routes/(app)/(protected)/collections/+page.svelte @@ -1,24 +1,34 @@ Your Collections | Bored Game +

Your Collections

-
{#if collections.length === 0}

You have no collections

{:else} {#each collections as collection} -
+ + + {collection.name} + + +

Number of items:

+

Created at: {new Date(collection.createdAt).toLocaleString()}

+
+
+ {/each} {/if}
@@ -30,10 +40,6 @@ width: 100%; } - .collections { - margin: 2rem 0; - } - .collection-list { display: grid; grid-template-columns: repeat(3, minmax(200px, 1fr)); diff --git a/src/routes/(app)/(protected)/collections/[cuid]/+page.server.ts b/src/routes/(app)/(protected)/collections/[cuid]/+page.server.ts index fff5ac2..488fbb1 100644 --- a/src/routes/(app)/(protected)/collections/[cuid]/+page.server.ts +++ b/src/routes/(app)/(protected)/collections/[cuid]/+page.server.ts @@ -1,13 +1,12 @@ import { notSignedInMessage } from '$lib/flashMessages.js' +import { collection_items, collections, gamesTable } from '$lib/server/api/databases/tables' import { db } from '$lib/server/api/packages/drizzle' -import { userNotAuthenticated } from '$lib/server/auth-utils' import { modifyListGameSchema } from '$lib/validations/zod-schemas' -import { type Actions, error, fail } from '@sveltejs/kit' +import { type Actions, error } from '@sveltejs/kit' import { and, eq } from 'drizzle-orm' import { redirect } from 'sveltekit-flash-message/server' import { zod } from 'sveltekit-superforms/adapters' import { superValidate } from 'sveltekit-superforms/server' -import { collection_items, collections, games } from '../../../../../lib/server/api/databases/tables' export async function load(event) { const { params, locals } = event @@ -131,15 +130,16 @@ export const actions: Actions = { // Add game to a wishlist add: async (event) => { const { locals } = event - const { user, session } = locals - if (userNotAuthenticated(user, session)) { - return fail(401) + + const authedUser = await locals.getAuthedUser() + if (!authedUser) { + throw redirect(302, '/login', notSignedInMessage, event) } const form = await superValidate(event, zod(modifyListGameSchema)) - const game = await db.query.games.findFirst({ - where: eq(games.id, form.data.id), + const game = await db.query.gamesTable.findFirst({ + where: eq(gamesTable.id, form.data.id), }) if (!game) { @@ -154,7 +154,7 @@ export const actions: Actions = { try { const collection = await db.query.collections.findFirst({ - where: eq(collections.user_id, user!.id!), + where: eq(collections.user_id, authedUser.id), }) if (!collection) { @@ -179,32 +179,36 @@ export const actions: Actions = { // Create new wishlist create: async (event) => { const { locals } = event - const { user, session } = locals - if (userNotAuthenticated(user, session)) { - return fail(401) + + const authedUser = await locals.getAuthedUser() + if (!authedUser) { + throw redirect(302, '/login', notSignedInMessage, event) } return error(405, 'Method not allowed') }, // Delete a wishlist delete: async (event) => { const { locals } = event - const { user, session } = locals - if (userNotAuthenticated(user, session)) { - return fail(401) + + const authedUser = await locals.getAuthedUser() + if (!authedUser) { + throw redirect(302, '/login', notSignedInMessage, event) } return error(405, 'Method not allowed') }, // Remove game from a wishlist remove: async (event) => { const { locals } = event - const { user, session } = locals - if (userNotAuthenticated(user, session)) { - return fail(401) + + const authedUser = await locals.getAuthedUser() + if (!authedUser) { + throw redirect(302, '/login', notSignedInMessage, event) } + const form = await superValidate(event, zod(modifyListGameSchema)) - const game = await db.query.games.findFirst({ - where: eq(games.id, form.data.id), + const game = await db.query.gamesTable.findFirst({ + where: eq(gamesTable.id, form.data.id), }) if (!game) { @@ -214,7 +218,7 @@ export const actions: Actions = { try { const collection = await db.query.collections.findFirst({ - where: eq(collections.user_id, user!.id!), + where: eq(collections.user_id, authedUser.id), }) if (!collection) { diff --git a/src/routes/(app)/(protected)/collections/[cuid]/+page.svelte b/src/routes/(app)/(protected)/collections/[cuid]/+page.svelte index 3cb772d..70a1054 100644 --- a/src/routes/(app)/(protected)/collections/[cuid]/+page.svelte +++ b/src/routes/(app)/(protected)/collections/[cuid]/+page.svelte @@ -1,33 +1,33 @@ diff --git a/src/routes/(app)/(protected)/collections/add/+page.server.ts b/src/routes/(app)/(protected)/collections/add/+page.server.ts index 174fbbc..76af777 100644 --- a/src/routes/(app)/(protected)/collections/add/+page.server.ts +++ b/src/routes/(app)/(protected)/collections/add/+page.server.ts @@ -1,13 +1,14 @@ -import { redirect } from 'sveltekit-flash-message/server'; -import { notSignedInMessage } from '$lib/flashMessages'; -import { userNotAuthenticated } from '$lib/server/auth-utils'; +import { notSignedInMessage } from '$lib/flashMessages' +import { userNotAuthenticated } from '$lib/server/auth-utils' +import { redirect } from 'sveltekit-flash-message/server' export async function load(event) { - const { locals } = event; - const { user, session } = locals; - if (userNotAuthenticated(user, session)) { - redirect(302, '/login', notSignedInMessage, event); + const { locals } = event + + const authedUser = await locals.getAuthedUser() + if (!authedUser) { + throw redirect(302, '/login', notSignedInMessage, event) } - return {}; + return {} } diff --git a/src/routes/(app)/(protected)/collections/add/bgg/+page.server.ts b/src/routes/(app)/(protected)/collections/add/bgg/+page.server.ts index 4150aea..e4c350f 100644 --- a/src/routes/(app)/(protected)/collections/add/bgg/+page.server.ts +++ b/src/routes/(app)/(protected)/collections/add/bgg/+page.server.ts @@ -1,19 +1,20 @@ -import { redirect } from '@sveltejs/kit'; -import { superValidate } from 'sveltekit-superforms/server'; -import { zod } from 'sveltekit-superforms/adapters'; -import type { PageServerLoad } from '../$types'; -import { BggForm } from '$lib/zodValidation'; -import { userNotAuthenticated } from '$lib/server/auth-utils'; -import { notSignedInMessage } from '$lib/flashMessages'; +import { notSignedInMessage } from '$lib/flashMessages' +import { userNotAuthenticated } from '$lib/server/auth-utils' +import { BggForm } from '$lib/zodValidation' +import { redirect } from '@sveltejs/kit' +import { zod } from 'sveltekit-superforms/adapters' +import { superValidate } from 'sveltekit-superforms/server' +import type { PageServerLoad } from '../$types' export const load: PageServerLoad = async (event) => { - const { locals } = event; - const { user, session } = locals; - if (userNotAuthenticated(user, session)) { - redirect(302, '/login', notSignedInMessage, event); + const { locals } = event + + const authedUser = await locals.getAuthedUser() + if (!authedUser) { + throw redirect(302, '/login', notSignedInMessage, event) } - const form = await superValidate({}, zod(BggForm)); + const form = await superValidate({}, zod(BggForm)) - return { form }; -}; + return { form } +} diff --git a/src/routes/(app)/(protected)/list/+layout.server.ts b/src/routes/(app)/(protected)/list/+layout.server.ts index 30ca610..fd76692 100644 --- a/src/routes/(app)/(protected)/list/+layout.server.ts +++ b/src/routes/(app)/(protected)/list/+layout.server.ts @@ -1,5 +1,5 @@ import { notSignedInMessage } from '$lib/flashMessages' -import { wishlists } from '$lib/server/api/databases/tables' +import { wishlistsTable } from '$lib/server/api/databases/tables' import { db } from '$lib/server/api/packages/drizzle' import { eq } from 'drizzle-orm' import { redirect } from 'sveltekit-flash-message/server' @@ -14,7 +14,7 @@ export async function load(event) { try { const dbWishlists = await db.query.wishlists.findMany({ - where: eq(wishlists.user_id, authedUser.id), + where: eq(wishlistsTable.user_id, authedUser.id), }) return { diff --git a/src/routes/(app)/(protected)/list/+layout.svelte b/src/routes/(app)/(protected)/list/+layout.svelte index 6d59e3a..21bc4cf 100644 --- a/src/routes/(app)/(protected)/list/+layout.svelte +++ b/src/routes/(app)/(protected)/list/+layout.svelte @@ -1,8 +1,8 @@
\ No newline at end of file diff --git a/src/routes/(app)/(protected)/profile/security/+layout.server.ts b/src/routes/(app)/(protected)/profile/security/+layout.server.ts deleted file mode 100644 index e2ef8d4..0000000 --- a/src/routes/(app)/(protected)/profile/security/+layout.server.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const load = async () => { - return {} -} diff --git a/src/routes/(app)/(protected)/profile/security/+layout.svelte b/src/routes/(app)/(protected)/profile/security/+layout.svelte deleted file mode 100644 index c3382ba..0000000 --- a/src/routes/(app)/(protected)/profile/security/+layout.svelte +++ /dev/null @@ -1,15 +0,0 @@ - - - - {@render children()} - diff --git a/src/routes/(app)/(protected)/profile/security/mfa/+page.svelte b/src/routes/(app)/(protected)/profile/security/mfa/+page.svelte deleted file mode 100644 index 0182587..0000000 --- a/src/routes/(app)/(protected)/profile/security/mfa/+page.svelte +++ /dev/null @@ -1,83 +0,0 @@ - - -
-

Two-Factor Authentication

- -{#if twoFactorEnabled} -

Currently you have two factor authentication enabled

-

To disable two factor authentication, please enter your current password.

- - - - Current Password - - - Please enter your current password. - - - Disable Two Factor Authentication - -{:else} -

Please scan the following QR Code

- QR Code -
- - - Enter Code - - - This is the code from your authenticator app. - - - - - Enter Password - - - Please enter your current password. - - - Submit -
- Secret: {secret} -{/if} -
- - \ No newline at end of file diff --git a/src/routes/(app)/(protected)/profile/security/password/change/+page.server.ts b/src/routes/(app)/(protected)/profile/security/password/change/+page.server.ts deleted file mode 100644 index c2b9f75..0000000 --- a/src/routes/(app)/(protected)/profile/security/password/change/+page.server.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { notSignedInMessage } from '$lib/flashMessages' -import { db } from '$lib/server/api/packages/drizzle' -import { changeUserPasswordSchema } from '$lib/validations/account' -import { type Actions, fail } from '@sveltejs/kit' -import { eq } from 'drizzle-orm' -import type { Cookie } from 'lucia' -import { Argon2id } from 'oslo/password' -import { redirect } from 'sveltekit-flash-message/server' -import { zod } from 'sveltekit-superforms/adapters' -import { setError, superValidate } from 'sveltekit-superforms/server' -import type { PageServerLoad } from '../../../$types' -import { usersTable } from '../../../../../../../lib/server/api/databases/tables' - -export const load: PageServerLoad = async (event) => { - const { locals } = event - - const authedUser = await locals.getAuthedUser() - if (!authedUser) { - throw redirect(302, '/login', notSignedInMessage, event) - } - - const form = await superValidate(event, zod(changeUserPasswordSchema)) - - form.data = { - current_password: '', - password: '', - confirm_password: '', - } - return { - form, - } -} - -export const actions: Actions = { - default: async (event) => { - const { locals } = event - - const authedUser = await locals.getAuthedUser() - if (!authedUser) { - throw redirect(302, '/login', notSignedInMessage, event) - } - - const form = await superValidate(event, zod(changeUserPasswordSchema)) - - if (!form.valid) { - return fail(400, { - form, - }) - } - - console.log('updating profile') - if (!event.locals.user) { - redirect(302, '/login', notSignedInMessage, event) - } - - if (!event.locals.session) { - return fail(401) - } - - const dbUser = await db.query.usersTable.findFirst({ - where: eq(usersTable.id, authedUser.id), - }) - - // if (!dbUser?.hashed_password) { - // form.data.password = ''; - // form.data.confirm_password = ''; - // form.data.current_password = ''; - // return setError( - // form, - // 'Error occurred. Please try again or contact support if you need further help.', - // ); - // } - - const currentPasswordVerified = await new Argon2id().verify( - // dbUser.hashed_password, - form.data.current_password, - ) - - if (!currentPasswordVerified) { - return setError(form, 'current_password', 'Your password is incorrect') - } - if (authedUser?.username) { - let sessionCookie: Cookie - try { - if (form.data.password !== form.data.confirm_password) { - return setError(form, 'Password and confirm password do not match') - } - const hashedPassword = await new Argon2id().hash(form.data.password) - await lucia.invalidateUserSessions(authedUser.id) - // await db - // .update(usersTable) - // .set({ hashed_password: hashedPassword }) - // .where(eq(usersTable.id, user.id)); - await lucia.createSession(user.id, { - country: event.locals.session?.ipCountry ?? 'unknown', - }) - sessionCookie = lucia.createBlankSessionCookie() - } catch (e) { - console.error(e) - form.data.password = '' - form.data.confirm_password = '' - form.data.current_password = '' - return setError(form, 'current_password', 'Your password is incorrect.') - } - event.cookies.set(sessionCookie.name, sessionCookie.value, { - path: '.', - ...sessionCookie.attributes, - }) - - const message = { - type: 'success', - message: 'Password Updated. Please sign in.', - } as const - redirect(302, '/login', message, event) - } - return setError(form, 'Error occurred. Please try again or contact support if you need further help.') - // TODO: Add toast instead? - // form.data.password = ''; - // form.data.confirm_password = ''; - // form.data.current_password = ''; - // return message(form, 'Profile updated successfully.'); - }, -} diff --git a/src/routes/(app)/(protected)/profile/security/password/change/+page.svelte b/src/routes/(app)/(protected)/profile/security/password/change/+page.svelte deleted file mode 100644 index e5c7422..0000000 --- a/src/routes/(app)/(protected)/profile/security/password/change/+page.svelte +++ /dev/null @@ -1,60 +0,0 @@ - - -
-

Change Password

-
- - - Heads up! - - Changing your password will log you out of all devices. - - - - - Current Password - - - - - - - New Password - - - - - - - Confirm New Password - - - - - Submit -
- - \ No newline at end of file diff --git a/src/lib/components/LeftNav.svelte b/src/routes/(app)/(protected)/settings/+layout.svelte similarity index 61% rename from src/lib/components/LeftNav.svelte rename to src/routes/(app)/(protected)/settings/+layout.svelte index 40f2ac0..81483b4 100644 --- a/src/lib/components/LeftNav.svelte +++ b/src/routes/(app)/(protected)/settings/+layout.svelte @@ -1,20 +1,24 @@