From bd6d2b3804864c6916c88d65e05a3df345eeff41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tina=C3=ABl=20Devresse?= <9126633-hunteroi@users.noreply.gitlab.com> Date: Mon, 17 Mar 2025 14:32:20 +0100 Subject: [PATCH 1/9] feat: support prisma --- .vscode/settings.json | 12 +++- package.json | 8 ++- prisma/README.md | 2 + prisma/migrations/0_init/migration.sql | 60 ++++++++++++++++ prisma/schema.prisma | 60 ++++++++++++++++ prisma/seed.ts | 21 ++++++ src/services/PgDatabaseService.ts | 97 ++++++++++++++++++++++++++ yarn.lock | 71 ++++++++++++++++++- 8 files changed, 327 insertions(+), 4 deletions(-) create mode 100644 prisma/README.md create mode 100644 prisma/migrations/0_init/migration.sql create mode 100644 prisma/schema.prisma create mode 100644 prisma/seed.ts create mode 100644 src/services/PgDatabaseService.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index ad83b87..d641c5b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -6,11 +6,19 @@ "javascript.preferences.importModuleSpecifier": "relative", "typescript.preferences.importModuleSpecifier": "relative", "files.exclude": { - "node_modules": true + "**/.git": true, + "**/.svn": true, + "**/.hg": true, + "**/CVS": true, + "**/.DS_Store": true, + "**/Thumbs.db": true, + "node_modules": true, + "**/.idea": true }, "npm.packageManager": "yarn", "files.eol": "\n", "editor.insertSpaces": true, "editor.tabSize": 4, - "typescript.enablePromptUseWorkspaceTsdk": true + "typescript.enablePromptUseWorkspaceTsdk": true, + "explorerExclude.backup": {} } diff --git a/package.json b/package.json index a1e1565..0c93ba5 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,9 @@ "version": "2.1.1", "type": "module", "main": "./build/index.js", + "prisma": { + "seed": "tsx prisma/seed.ts" + }, "scripts": { "cu": "docker compose up --build", "cd": "docker compose down", @@ -10,7 +13,8 @@ "build": "rm -rf build/ && tsc", "deploy:commands": "yarn build && node ./scripts/deploy-commands.cjs", "lint": "biome check --write index.ts ./src ./scripts", - "env-gen": "node ./scripts/envgen.cjs" + "env-gen": "node ./scripts/envgen.cjs", + "prisma": "dotenvx run --convention=nextjs -- prisma" }, "repository": { "type": "git", @@ -28,6 +32,7 @@ "@hunteroi/discord-selfrole": "^4.0.5", "@hunteroi/discord-temp-channels": "^3.3.1", "@hunteroi/discord-verification": "^1.5.2", + "@prisma/client": "^5.22.0", "discord-sync-commands": "^0.5.2", "discord.js": "^14.22.1", "nodemailer": "^7.0.6", @@ -37,6 +42,7 @@ "@biomejs/biome": "^2.2.4", "@types/node": "^24.5.2", "@types/nodemailer": "^7.0.1", + "prisma": "^5.22.0", "tsx": "^4.20.5", "typescript": "^5.9.2" } diff --git a/prisma/README.md b/prisma/README.md new file mode 100644 index 0000000..03f2cd4 --- /dev/null +++ b/prisma/README.md @@ -0,0 +1,2 @@ +`yarn prisma migrate resolve --applied 0_init --preview-feature` +or `yarn prisma migrate dev` diff --git a/prisma/migrations/0_init/migration.sql b/prisma/migrations/0_init/migration.sql new file mode 100644 index 0000000..264b255 --- /dev/null +++ b/prisma/migrations/0_init/migration.sql @@ -0,0 +1,60 @@ +-- CreateSchema +CREATE SCHEMA IF NOT EXISTS "cron"; + +-- CreateSchema +CREATE SCHEMA IF NOT EXISTS "public"; + +-- CreateExtension +CREATE EXTENSION IF NOT EXISTS "pg_cron"; + +-- CreateTable +CREATE TABLE "cron"."job" ( + "jobid" BIGSERIAL NOT NULL, + "schedule" TEXT NOT NULL, + "command" TEXT NOT NULL, + "nodename" TEXT NOT NULL DEFAULT 'localhost', + "nodeport" INTEGER NOT NULL DEFAULT inet_server_port(), + "database" TEXT NOT NULL DEFAULT current_database(), + "username" TEXT NOT NULL DEFAULT CURRENT_USER, + "active" BOOLEAN NOT NULL DEFAULT true, + "jobname" TEXT, + CONSTRAINT "job_pkey" PRIMARY KEY ("jobid") +); + +-- CreateTable +CREATE TABLE "cron"."job_run_details" ( + "jobid" BIGINT, + "runid" BIGSERIAL NOT NULL, + "job_pid" INTEGER, + "database" TEXT, + "username" TEXT, + "command" TEXT, + "status" TEXT, + "return_message" TEXT, + "start_time" TIMESTAMPTZ(6), + "end_time" TIMESTAMPTZ(6), + CONSTRAINT "job_run_details_pkey" PRIMARY KEY ("runid") +); + +-- CreateTable +CREATE TABLE "public"."users" ( + "userid" TEXT NOT NULL, + "data" TEXT, + "code" TEXT, + "activatedcode" TEXT, + "activationtimestamp" TEXT, + "username" TEXT NOT NULL, + "status" INTEGER NOT NULL, + "nbcodecalled" INTEGER NOT NULL DEFAULT 0, + "nbverifycalled" INTEGER NOT NULL DEFAULT 0, + "createdat" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedat" TIMESTAMP(6), + "isdeleted" TIMESTAMP(6), + CONSTRAINT "users_pkey" PRIMARY KEY ("userid") +); + +-- CreateIndex +CREATE UNIQUE INDEX "jobname_username_uniq" ON "cron"."job"("jobname", "username"); + +-- CreateIndex +CREATE UNIQUE INDEX "users_data_key" ON "public"."users"("data"); diff --git a/prisma/schema.prisma b/prisma/schema.prisma new file mode 100644 index 0000000..0428341 --- /dev/null +++ b/prisma/schema.prisma @@ -0,0 +1,60 @@ +generator client { + provider = "prisma-client-js" + previewFeatures = ["multiSchema", "postgresqlExtensions"] +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") + extensions = [pg_cron] + schemas = ["cron", "public"] +} + +/// This model contains row level security and requires additional setup for migrations. Visit https://pris.ly/d/row-level-security for more info. +model job { + jobid BigInt @id @default(autoincrement()) + schedule String + command String + nodename String @default("localhost") + nodeport Int @default(dbgenerated("inet_server_port()")) + database String @default(dbgenerated("current_database()")) + username String @default(dbgenerated("CURRENT_USER")) + active Boolean @default(true) + jobname String? + + @@unique([jobname, username], map: "jobname_username_uniq") + @@schema("cron") +} + +/// This model contains row level security and requires additional setup for migrations. Visit https://pris.ly/d/row-level-security for more info. +model job_run_details { + jobid BigInt? + runid BigInt @id @default(autoincrement()) + job_pid Int? + database String? + username String? + command String? + status String? + return_message String? + start_time DateTime? @db.Timestamptz(6) + end_time DateTime? @db.Timestamptz(6) + + @@schema("cron") +} + +model users { + userid String @id + data String? @unique + code String? + activatedCode String? + activationTimestamp Int? + username String + status Int + nbCodeCalled Int @default(0) + nbVerifyCalled Int @default(0) + createdAt DateTime @default(now()) @db.Timestamp(6) + updatedAt DateTime @updatedAt @db.Timestamp(6) + isDeleted DateTime? @db.Timestamp(6) + + @@schema("public") +} diff --git a/prisma/seed.ts b/prisma/seed.ts new file mode 100644 index 0000000..69da1f8 --- /dev/null +++ b/prisma/seed.ts @@ -0,0 +1,21 @@ +import { PrismaClient } from '@prisma/client' + +const database = new PrismaClient(); + +async function main() { + database.job.upsert({ + where: { jobid: 1 }, + create: { jobid: 1, schedule: '0 0 * * *', command: 'DELETE FROM Users WHERE isDeleted IS NOT NULL AND isDeleted < NOW() - INTERVAL \'6 months\'' }, + update: { schedule: '0 0 * * *', command: 'DELETE FROM Users WHERE isDeleted IS NOT NULL AND isDeleted < NOW() - INTERVAL \'6 months\'' } + }); +} + +main() + .then(async () => { + await database.$disconnect(); + }) + .catch(async (e) => { + console.error(e); + await database.$disconnect(); + process.exit(1); + }); diff --git a/src/services/PgDatabaseService.ts b/src/services/PgDatabaseService.ts new file mode 100644 index 0000000..ab04d0f --- /dev/null +++ b/src/services/PgDatabaseService.ts @@ -0,0 +1,97 @@ +import type { Snowflake } from 'discord.js'; +import { PrismaClient } from '@prisma/client'; + +import type { ConsoleLogger } from '@hunteroi/advanced-logger'; + +import type { IDatabaseService } from '../models/IDatabaseService.js'; +import type { User } from '../models/User.js'; + +export default class PgDatabaseService extends PrismaClient implements IDatabaseService { + readonly #logger: ConsoleLogger; + + constructor(logger: ConsoleLogger) { + super(); + this.#logger = logger; + } + + async start(): Promise { + await this.$connect(); + } + + async stop(): Promise { + await this.$disconnect(); + } + + /** + * @inherited + */ + async delete(userid: Snowflake): Promise { + this.#logger.verbose( + `Suppresion de l'utilisateur sur base de l'identifiant ${userid}`, + ); + await this.users.update({ + where: { userid }, + data: { isDeleted: new Date() } + }); + } + + /** + * @inherited + */ + async undoDelete(userid: Snowflake): Promise { + this.#logger.verbose( + `Réversion de la suppresion de l'utilisateur sur base de l'identifiant ${userid}`, + ); + await this.users.update({ + where: { userid }, + data: { isDeleted: null } + }); + } + + /** + * @inherited + */ + async read(userid: Snowflake): Promise { + this.#logger.verbose( + `Lecture de l'utilisateur sur base de l'identifiant ${userid}`, + ); + return this.users.findUnique({ + where: { userid } + }); + } + + /** + * @inherited + */ + readBy( + argument: // biome-ignore lint/suspicious/noExplicitAny: DB values can be of any type + Map | ((user: User, index: string | number) => boolean), + ): Promise { + if (!(argument instanceof Map)) + throw new Error("Method not implemented."); + + this.#logger.verbose( + `Lecture de l'utilisateur sur base des filtres ${JSON.stringify(argument)}`, + ); + + const keysAndValues = [...argument.entries()].flat(); + let sqlQuery = "WHERE "; + let nbArguments = 1; + while (nbArguments <= keysAndValues.length) { + if (nbArguments > 1 && nbArguments % 2 === 0) sqlQuery += " AND "; + sqlQuery += `${keysAndValues[nbArguments]} = ${keysAndValues[++nbArguments]}`; + nbArguments++; + } + return this.$queryRaw`SELECT * FROM Users ${sqlQuery};`; + } + + /** + * @inherited + */ + async write(user: User): Promise { + this.#logger.verbose( + `Écriture de l'utilisateur ${JSON.stringify(user)}`, + ); + this.users.upsert({ create: user, update: user, where: { userid: user.userid } }); + } +} diff --git a/yarn.lock b/yarn.lock index ff7c5ef..3be72f9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -773,6 +773,47 @@ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.8.0.tgz#cee43d801fcef9644b11b8194857695acd5f815a" integrity sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A== +"@prisma/client@^5.22.0": + version "5.22.0" + resolved "https://registry.yarnpkg.com/@prisma/client/-/client-5.22.0.tgz#da1ca9c133fbefe89e0da781c75e1c59da5f8802" + integrity sha512-M0SVXfyHnQREBKxCgyo7sffrKttwE6R8PMq330MIUF0pTwjUhLbW84pFDlf06B27XyCR++VtjugEnIHdr07SVA== + +"@prisma/debug@5.22.0": + version "5.22.0" + resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-5.22.0.tgz#58af56ed7f6f313df9fb1042b6224d3174bbf412" + integrity sha512-AUt44v3YJeggO2ZU5BkXI7M4hu9BF2zzH2iF2V5pyXT/lRTyWiElZ7It+bRH1EshoMRxHgpYg4VB6rCM+mG5jQ== + +"@prisma/engines-version@5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2": + version "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2" + resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2.tgz#d534dd7235c1ba5a23bacd5b92cc0ca3894c28f4" + integrity sha512-2PTmxFR2yHW/eB3uqWtcgRcgAbG1rwG9ZriSvQw+nnb7c4uCr3RAcGMb6/zfE88SKlC1Nj2ziUvc96Z379mHgQ== + +"@prisma/engines@5.22.0": + version "5.22.0" + resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-5.22.0.tgz#28f3f52a2812c990a8b66eb93a0987816a5b6d84" + integrity sha512-UNjfslWhAt06kVL3CjkuYpHAWSO6L4kDCVPegV6itt7nD1kSJavd3vhgAEhjglLJJKEdJ7oIqDJ+yHk6qO8gPA== + dependencies: + "@prisma/debug" "5.22.0" + "@prisma/engines-version" "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2" + "@prisma/fetch-engine" "5.22.0" + "@prisma/get-platform" "5.22.0" + +"@prisma/fetch-engine@5.22.0": + version "5.22.0" + resolved "https://registry.yarnpkg.com/@prisma/fetch-engine/-/fetch-engine-5.22.0.tgz#4fb691b483a450c5548aac2f837b267dd50ef52e" + integrity sha512-bkrD/Mc2fSvkQBV5EpoFcZ87AvOgDxbG99488a5cexp5Ccny+UM6MAe/UFkUC0wLYD9+9befNOqGiIJhhq+HbA== + dependencies: + "@prisma/debug" "5.22.0" + "@prisma/engines-version" "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2" + "@prisma/get-platform" "5.22.0" + +"@prisma/get-platform@5.22.0": + version "5.22.0" + resolved "https://registry.yarnpkg.com/@prisma/get-platform/-/get-platform-5.22.0.tgz#fc675bc9d12614ca2dade0506c9c4a77e7dddacd" + integrity sha512-pHhpQdr1UPFpt+zFfnPazhulaZYCUqeIcPpJViYoq9R+D/yw4fjE+CtnsnKzPYm0ddUbeXUzjGVGIRVgPDCk4Q== + dependencies: + "@prisma/debug" "5.22.0" + "@sapphire/async-queue@^1.5.2", "@sapphire/async-queue@^1.5.3": version "1.5.5" resolved "https://registry.yarnpkg.com/@sapphire/async-queue/-/async-queue-1.5.5.tgz#2b18d402bb920b65b13ad4ed8dfb6c386300dd84" @@ -1382,7 +1423,21 @@ fdir@^6.2.0: resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== -fsevents@~2.3.3: +follow-redirects@^1.15.6: + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fsevents@2.3.3, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== @@ -1493,6 +1548,20 @@ picomatch@^4.0.2: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== +prisma@^5.22.0: + version "5.22.0" + resolved "https://registry.yarnpkg.com/prisma/-/prisma-5.22.0.tgz#1f6717ff487cdef5f5799cc1010459920e2e6197" + integrity sha512-vtpjW3XuYCSnMsNVBjLMNkTj6OZbudcPPTPYHqX0CJfpcdWciI1dM8uHETwmDxxiqEwCIE6WvXucWUetJgfu/A== + dependencies: + "@prisma/engines" "5.22.0" + optionalDependencies: + fsevents "2.3.3" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + resolve-pkg-maps@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" From ab44b5cbc95b1c72742192437e32e3a2a24b4abf Mon Sep 17 00:00:00 2001 From: HunteRoi Date: Thu, 28 May 2026 00:09:25 +0200 Subject: [PATCH 2/9] chore: add Prisma configuration file for database setup --- .gitignore | 2 + package.json | 20 +- prisma.config.ts | 14 + prisma/schema.prisma | 3 +- src/services/PostgresDatabaseService.ts | 2 +- tsconfig.json | 33 +- yarn.lock | 2079 ++++++++++------------- 7 files changed, 935 insertions(+), 1218 deletions(-) create mode 100644 prisma.config.ts diff --git a/.gitignore b/.gitignore index bc13ade..7c1f95a 100644 --- a/.gitignore +++ b/.gitignore @@ -64,3 +64,5 @@ typings/ .idea/ build/ + +/generated/prisma diff --git a/package.json b/package.json index 0c93ba5..d36ff16 100644 --- a/package.json +++ b/package.json @@ -27,23 +27,23 @@ }, "homepage": "https://github.com/section-IG/DataDrop#readme", "dependencies": { - "@dotenvx/dotenvx": "^1.51.0", + "@dotenvx/dotenvx": "^1.69.1", "@hunteroi/advanced-logger": "^0.2.0", "@hunteroi/discord-selfrole": "^4.0.5", "@hunteroi/discord-temp-channels": "^3.3.1", "@hunteroi/discord-verification": "^1.5.2", - "@prisma/client": "^5.22.0", + "@prisma/client": "^7.8.0", "discord-sync-commands": "^0.5.2", - "discord.js": "^14.22.1", - "nodemailer": "^7.0.6", + "discord.js": "^14.26.4", + "nodemailer": "^8.0.9", "ts-postgres": "1.3.0" }, "devDependencies": { - "@biomejs/biome": "^2.2.4", - "@types/node": "^24.5.2", - "@types/nodemailer": "^7.0.1", - "prisma": "^5.22.0", - "tsx": "^4.20.5", - "typescript": "^5.9.2" + "@biomejs/biome": "^2.4.16", + "@types/node": "^25.9.1", + "@types/nodemailer": "^8.0.0", + "prisma": "^7.8.0", + "tsx": "^4.22.3", + "typescript": "^6.0.3" } } diff --git a/prisma.config.ts b/prisma.config.ts new file mode 100644 index 0000000..831a20f --- /dev/null +++ b/prisma.config.ts @@ -0,0 +1,14 @@ +// This file was generated by Prisma, and assumes you have installed the following: +// npm install --save-dev prisma dotenv +import "dotenv/config"; +import { defineConfig } from "prisma/config"; + +export default defineConfig({ + schema: "prisma/schema.prisma", + migrations: { + path: "prisma/migrations", + }, + datasource: { + url: process.env["DATABASE_URL"], + }, +}); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 0428341..8fb1f7e 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -1,11 +1,10 @@ generator client { provider = "prisma-client-js" - previewFeatures = ["multiSchema", "postgresqlExtensions"] + previewFeatures = ["postgresqlExtensions"] } datasource db { provider = "postgresql" - url = env("DATABASE_URL") extensions = [pg_cron] schemas = ["cron", "public"] } diff --git a/src/services/PostgresDatabaseService.ts b/src/services/PostgresDatabaseService.ts index 5738dcb..cb8961d 100644 --- a/src/services/PostgresDatabaseService.ts +++ b/src/services/PostgresDatabaseService.ts @@ -104,7 +104,7 @@ export class PostgresDatabaseService implements IDatabaseService { */ public async readBy( argument: // biome-ignore lint/suspicious/noExplicitAny: DB values can be of any type - Map | ((user: User, index: string | number) => boolean), + Map | ((user: User, index: string | number) => boolean), ): Promise { if (!(argument instanceof Map)) throw new Error("Method not implemented."); diff --git a/tsconfig.json b/tsconfig.json index 56cdd8e..3e2e246 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,19 +1,18 @@ { - "compilerOptions": { - "target": "ESNext", - "module": "NodeNext", - "moduleResolution": "NodeNext", - "allowSyntheticDefaultImports": true, - "skipLibCheck": true, - "strict": true, - "useUnknownInCatchVariables": true, - "resolveJsonModule": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "noImplicitAny": false, - "rootDir": ".", - "outDir": "build", - "baseUrl": ".", - "resolvePackageJsonImports": true - } + "compilerOptions": { + "target": "ESNext", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "allowSyntheticDefaultImports": true, + "skipLibCheck": true, + "strict": true, + "useUnknownInCatchVariables": true, + "resolveJsonModule": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "noImplicitAny": false, + "rootDir": ".", + "outDir": "build", + "resolvePackageJsonImports": true + } } diff --git a/yarn.lock b/yarn.lock index 3be72f9..8165045 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,521 +2,59 @@ # yarn lockfile v1 -"@aws-crypto/sha256-browser@5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz#153895ef1dba6f9fce38af550e0ef58988eb649e" - integrity sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw== - dependencies: - "@aws-crypto/sha256-js" "^5.2.0" - "@aws-crypto/supports-web-crypto" "^5.2.0" - "@aws-crypto/util" "^5.2.0" - "@aws-sdk/types" "^3.222.0" - "@aws-sdk/util-locate-window" "^3.0.0" - "@smithy/util-utf8" "^2.0.0" - tslib "^2.6.2" - -"@aws-crypto/sha256-js@5.2.0", "@aws-crypto/sha256-js@^5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz#c4fdb773fdbed9a664fc1a95724e206cf3860042" - integrity sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA== - dependencies: - "@aws-crypto/util" "^5.2.0" - "@aws-sdk/types" "^3.222.0" - tslib "^2.6.2" - -"@aws-crypto/supports-web-crypto@^5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz#a1e399af29269be08e695109aa15da0a07b5b5fb" - integrity sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg== - dependencies: - tslib "^2.6.2" - -"@aws-crypto/util@^5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-5.2.0.tgz#71284c9cffe7927ddadac793c14f14886d3876da" - integrity sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ== - dependencies: - "@aws-sdk/types" "^3.222.0" - "@smithy/util-utf8" "^2.0.0" - tslib "^2.6.2" - -"@aws-sdk/client-sesv2@^3.839.0": - version "3.896.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sesv2/-/client-sesv2-3.896.0.tgz#d7b4b88d74f69a008130a145942261710593da85" - integrity sha512-KqWoxNmSKw4KYDrB3IH6AIfX855Dlorya1PcRqODa16xUp8aqoYACuBq+cjSuy5F6j9YDGSZgc20JDmWQRkN8Q== - dependencies: - "@aws-crypto/sha256-browser" "5.2.0" - "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.896.0" - "@aws-sdk/credential-provider-node" "3.896.0" - "@aws-sdk/middleware-host-header" "3.893.0" - "@aws-sdk/middleware-logger" "3.893.0" - "@aws-sdk/middleware-recursion-detection" "3.893.0" - "@aws-sdk/middleware-user-agent" "3.896.0" - "@aws-sdk/region-config-resolver" "3.893.0" - "@aws-sdk/signature-v4-multi-region" "3.896.0" - "@aws-sdk/types" "3.893.0" - "@aws-sdk/util-endpoints" "3.895.0" - "@aws-sdk/util-user-agent-browser" "3.893.0" - "@aws-sdk/util-user-agent-node" "3.896.0" - "@smithy/config-resolver" "^4.2.2" - "@smithy/core" "^3.12.0" - "@smithy/fetch-http-handler" "^5.2.1" - "@smithy/hash-node" "^4.1.1" - "@smithy/invalid-dependency" "^4.1.1" - "@smithy/middleware-content-length" "^4.1.1" - "@smithy/middleware-endpoint" "^4.2.4" - "@smithy/middleware-retry" "^4.3.0" - "@smithy/middleware-serde" "^4.1.1" - "@smithy/middleware-stack" "^4.1.1" - "@smithy/node-config-provider" "^4.2.2" - "@smithy/node-http-handler" "^4.2.1" - "@smithy/protocol-http" "^5.2.1" - "@smithy/smithy-client" "^4.6.4" - "@smithy/types" "^4.5.0" - "@smithy/url-parser" "^4.1.1" - "@smithy/util-base64" "^4.1.0" - "@smithy/util-body-length-browser" "^4.1.0" - "@smithy/util-body-length-node" "^4.1.0" - "@smithy/util-defaults-mode-browser" "^4.1.4" - "@smithy/util-defaults-mode-node" "^4.1.4" - "@smithy/util-endpoints" "^3.1.2" - "@smithy/util-middleware" "^4.1.1" - "@smithy/util-retry" "^4.1.2" - "@smithy/util-utf8" "^4.1.0" - tslib "^2.6.2" - -"@aws-sdk/client-sso@3.896.0": - version "3.896.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.896.0.tgz#a93eb9043e28156345676c5e35035365f67897d9" - integrity sha512-mpE3mrNili1dcvEvxaYjyoib8HlRXkb2bY5a3WeK++KObFY+HUujKtgQmiNSRX5YwQszm//fTrmGMmv9zpMcKg== - dependencies: - "@aws-crypto/sha256-browser" "5.2.0" - "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.896.0" - "@aws-sdk/middleware-host-header" "3.893.0" - "@aws-sdk/middleware-logger" "3.893.0" - "@aws-sdk/middleware-recursion-detection" "3.893.0" - "@aws-sdk/middleware-user-agent" "3.896.0" - "@aws-sdk/region-config-resolver" "3.893.0" - "@aws-sdk/types" "3.893.0" - "@aws-sdk/util-endpoints" "3.895.0" - "@aws-sdk/util-user-agent-browser" "3.893.0" - "@aws-sdk/util-user-agent-node" "3.896.0" - "@smithy/config-resolver" "^4.2.2" - "@smithy/core" "^3.12.0" - "@smithy/fetch-http-handler" "^5.2.1" - "@smithy/hash-node" "^4.1.1" - "@smithy/invalid-dependency" "^4.1.1" - "@smithy/middleware-content-length" "^4.1.1" - "@smithy/middleware-endpoint" "^4.2.4" - "@smithy/middleware-retry" "^4.3.0" - "@smithy/middleware-serde" "^4.1.1" - "@smithy/middleware-stack" "^4.1.1" - "@smithy/node-config-provider" "^4.2.2" - "@smithy/node-http-handler" "^4.2.1" - "@smithy/protocol-http" "^5.2.1" - "@smithy/smithy-client" "^4.6.4" - "@smithy/types" "^4.5.0" - "@smithy/url-parser" "^4.1.1" - "@smithy/util-base64" "^4.1.0" - "@smithy/util-body-length-browser" "^4.1.0" - "@smithy/util-body-length-node" "^4.1.0" - "@smithy/util-defaults-mode-browser" "^4.1.4" - "@smithy/util-defaults-mode-node" "^4.1.4" - "@smithy/util-endpoints" "^3.1.2" - "@smithy/util-middleware" "^4.1.1" - "@smithy/util-retry" "^4.1.2" - "@smithy/util-utf8" "^4.1.0" - tslib "^2.6.2" - -"@aws-sdk/core@3.896.0": - version "3.896.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.896.0.tgz#883360ca8035e0844372370501c62409c0c8ce12" - integrity sha512-uJaoyWKeGNyCyeI+cIJrD7LEB4iF/W8/x2ij7zg32OFpAAJx96N34/e+XSKp/xkJpO5FKiBOskKLnHeUsJsAPA== - dependencies: - "@aws-sdk/types" "3.893.0" - "@aws-sdk/xml-builder" "3.894.0" - "@smithy/core" "^3.12.0" - "@smithy/node-config-provider" "^4.2.2" - "@smithy/property-provider" "^4.1.1" - "@smithy/protocol-http" "^5.2.1" - "@smithy/signature-v4" "^5.2.1" - "@smithy/smithy-client" "^4.6.4" - "@smithy/types" "^4.5.0" - "@smithy/util-base64" "^4.1.0" - "@smithy/util-middleware" "^4.1.1" - "@smithy/util-utf8" "^4.1.0" - tslib "^2.6.2" - -"@aws-sdk/credential-provider-env@3.896.0": - version "3.896.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.896.0.tgz#f385c8395fee16abdda5f73c391dee78dd326157" - integrity sha512-Cnqhupdkp825ICySrz4QTI64Nq3AmUAscPW8dueanni0avYBDp7RBppX4H0+6icqN569B983XNfQ0YSImQhfhg== - dependencies: - "@aws-sdk/core" "3.896.0" - "@aws-sdk/types" "3.893.0" - "@smithy/property-provider" "^4.1.1" - "@smithy/types" "^4.5.0" - tslib "^2.6.2" - -"@aws-sdk/credential-provider-http@3.896.0": - version "3.896.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.896.0.tgz#4715b4205c42c4adf0b6efb3e228639f1e038802" - integrity sha512-CN0fTCKCUA1OTSx1c76o8XyJCy2WoI/av3J8r8mL6GmxTerhLRyzDy/MwxzPjTYPoL+GLEg6V4a9fRkWj1hBUA== - dependencies: - "@aws-sdk/core" "3.896.0" - "@aws-sdk/types" "3.893.0" - "@smithy/fetch-http-handler" "^5.2.1" - "@smithy/node-http-handler" "^4.2.1" - "@smithy/property-provider" "^4.1.1" - "@smithy/protocol-http" "^5.2.1" - "@smithy/smithy-client" "^4.6.4" - "@smithy/types" "^4.5.0" - "@smithy/util-stream" "^4.3.2" - tslib "^2.6.2" - -"@aws-sdk/credential-provider-ini@3.896.0": - version "3.896.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.896.0.tgz#8e4eaa85ad10ce5988381ee19f6bf96d14cbcab0" - integrity sha512-+rbYG98czzwZLTYHJasK+VBjnIeXk73mRpZXHvaa4kDNxBezdN2YsoGNpLlPSxPdbpq18LY3LRtkdFTaT6DIQA== - dependencies: - "@aws-sdk/core" "3.896.0" - "@aws-sdk/credential-provider-env" "3.896.0" - "@aws-sdk/credential-provider-http" "3.896.0" - "@aws-sdk/credential-provider-process" "3.896.0" - "@aws-sdk/credential-provider-sso" "3.896.0" - "@aws-sdk/credential-provider-web-identity" "3.896.0" - "@aws-sdk/nested-clients" "3.896.0" - "@aws-sdk/types" "3.893.0" - "@smithy/credential-provider-imds" "^4.1.2" - "@smithy/property-provider" "^4.1.1" - "@smithy/shared-ini-file-loader" "^4.2.0" - "@smithy/types" "^4.5.0" - tslib "^2.6.2" - -"@aws-sdk/credential-provider-node@3.896.0": - version "3.896.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.896.0.tgz#6b25a92b18d051d04b88d31ed36ff5025cfe7c10" - integrity sha512-J0Jm+56MNngk1PIyqoJFf5FC2fjA4CYXlqODqNRDtid7yk7HB9W3UTtvxofmii5KJOLcHGNPdGnHWKkUc+xYgw== - dependencies: - "@aws-sdk/credential-provider-env" "3.896.0" - "@aws-sdk/credential-provider-http" "3.896.0" - "@aws-sdk/credential-provider-ini" "3.896.0" - "@aws-sdk/credential-provider-process" "3.896.0" - "@aws-sdk/credential-provider-sso" "3.896.0" - "@aws-sdk/credential-provider-web-identity" "3.896.0" - "@aws-sdk/types" "3.893.0" - "@smithy/credential-provider-imds" "^4.1.2" - "@smithy/property-provider" "^4.1.1" - "@smithy/shared-ini-file-loader" "^4.2.0" - "@smithy/types" "^4.5.0" - tslib "^2.6.2" - -"@aws-sdk/credential-provider-process@3.896.0": - version "3.896.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.896.0.tgz#008a1e09f7d276336bead54a9b7572ab2a7b8b3e" - integrity sha512-UfWVMQPZy7dus40c4LWxh5vQ+I51z0q4vf09Eqas5848e9DrGRG46GYIuc/gy+4CqEypjbg/XNMjnZfGLHxVnQ== - dependencies: - "@aws-sdk/core" "3.896.0" - "@aws-sdk/types" "3.893.0" - "@smithy/property-provider" "^4.1.1" - "@smithy/shared-ini-file-loader" "^4.2.0" - "@smithy/types" "^4.5.0" - tslib "^2.6.2" - -"@aws-sdk/credential-provider-sso@3.896.0": - version "3.896.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.896.0.tgz#78609a50ed292675b691fef11f87281f4d844ad4" - integrity sha512-77Te8WrVdLABKlv7QyetXP6aYEX1UORiahLA1PXQb/p66aFBw18Xc6JiN/6zJ4RqdyV1Xr9rwYBwGYua93ANIA== - dependencies: - "@aws-sdk/client-sso" "3.896.0" - "@aws-sdk/core" "3.896.0" - "@aws-sdk/token-providers" "3.896.0" - "@aws-sdk/types" "3.893.0" - "@smithy/property-provider" "^4.1.1" - "@smithy/shared-ini-file-loader" "^4.2.0" - "@smithy/types" "^4.5.0" - tslib "^2.6.2" - -"@aws-sdk/credential-provider-web-identity@3.896.0": - version "3.896.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.896.0.tgz#b80271e417bd2f26f349bec5a718301a16af9772" - integrity sha512-gwMwZWumo+V0xJplO8j2HIb1TfPsF9fbcRGXS0CanEvjg4fF2Xs1pOQl2oCw3biPZpxHB0plNZjqSF2eneGg9g== - dependencies: - "@aws-sdk/core" "3.896.0" - "@aws-sdk/nested-clients" "3.896.0" - "@aws-sdk/types" "3.893.0" - "@smithy/property-provider" "^4.1.1" - "@smithy/shared-ini-file-loader" "^4.2.0" - "@smithy/types" "^4.5.0" - tslib "^2.6.2" - -"@aws-sdk/middleware-host-header@3.893.0": - version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.893.0.tgz#1a4b14c11cff158b383e2b859be5c468d2c2c162" - integrity sha512-qL5xYRt80ahDfj9nDYLhpCNkDinEXvjLe/Qen/Y/u12+djrR2MB4DRa6mzBCkLkdXDtf0WAoW2EZsNCfGrmOEQ== - dependencies: - "@aws-sdk/types" "3.893.0" - "@smithy/protocol-http" "^5.2.1" - "@smithy/types" "^4.5.0" - tslib "^2.6.2" - -"@aws-sdk/middleware-logger@3.893.0": - version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.893.0.tgz#4ecb20ee0771a2f3afdc07c1310b97251d3854e2" - integrity sha512-ZqzMecjju5zkBquSIfVfCORI/3Mge21nUY4nWaGQy+NUXehqCGG4W7AiVpiHGOcY2cGJa7xeEkYcr2E2U9U0AA== - dependencies: - "@aws-sdk/types" "3.893.0" - "@smithy/types" "^4.5.0" - tslib "^2.6.2" - -"@aws-sdk/middleware-recursion-detection@3.893.0": - version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.893.0.tgz#9fde6f10e72fcbd8ce4f0eea629c07ca64ce86ba" - integrity sha512-H7Zotd9zUHQAr/wr3bcWHULYhEeoQrF54artgsoUGIf/9emv6LzY89QUccKIxYd6oHKNTrTyXm9F0ZZrzXNxlg== - dependencies: - "@aws-sdk/types" "3.893.0" - "@aws/lambda-invoke-store" "^0.0.1" - "@smithy/protocol-http" "^5.2.1" - "@smithy/types" "^4.5.0" - tslib "^2.6.2" - -"@aws-sdk/middleware-sdk-s3@3.896.0": - version "3.896.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.896.0.tgz#419d558892d49b63db68265577b6ca6a1e35516e" - integrity sha512-hlPu/AZ5Afa4ZafP+aXIjRtKm7BX57lurA+TJ+7nXm1Az8Du3Sg2tZXP2/GfqTztLIFQYj/Jy5smkJ0+1HNAPQ== - dependencies: - "@aws-sdk/core" "3.896.0" - "@aws-sdk/types" "3.893.0" - "@aws-sdk/util-arn-parser" "3.893.0" - "@smithy/core" "^3.12.0" - "@smithy/node-config-provider" "^4.2.2" - "@smithy/protocol-http" "^5.2.1" - "@smithy/signature-v4" "^5.2.1" - "@smithy/smithy-client" "^4.6.4" - "@smithy/types" "^4.5.0" - "@smithy/util-config-provider" "^4.1.0" - "@smithy/util-middleware" "^4.1.1" - "@smithy/util-stream" "^4.3.2" - "@smithy/util-utf8" "^4.1.0" - tslib "^2.6.2" - -"@aws-sdk/middleware-user-agent@3.896.0": - version "3.896.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.896.0.tgz#be459f4b652e200cfded484f87353ac69fbef69f" - integrity sha512-so/3tZH34YIeqG/QJgn5ZinnmHRdXV1ehsj4wVUrezL/dVW86jfwIkQIwpw8roOC657UoUf91c9FDhCxs3J5aQ== - dependencies: - "@aws-sdk/core" "3.896.0" - "@aws-sdk/types" "3.893.0" - "@aws-sdk/util-endpoints" "3.895.0" - "@smithy/core" "^3.12.0" - "@smithy/protocol-http" "^5.2.1" - "@smithy/types" "^4.5.0" - tslib "^2.6.2" - -"@aws-sdk/nested-clients@3.896.0": - version "3.896.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/nested-clients/-/nested-clients-3.896.0.tgz#5fb0f31ca8a4a26d92b812e946e068d9b3c63bc6" - integrity sha512-KaHALB6DIXScJL/ExmonADr3jtTV6dpOHoEeTRSskJ/aW+rhZo7kH8SLmrwOT/qX8d5tza17YyR/oRkIKY6Eaw== - dependencies: - "@aws-crypto/sha256-browser" "5.2.0" - "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.896.0" - "@aws-sdk/middleware-host-header" "3.893.0" - "@aws-sdk/middleware-logger" "3.893.0" - "@aws-sdk/middleware-recursion-detection" "3.893.0" - "@aws-sdk/middleware-user-agent" "3.896.0" - "@aws-sdk/region-config-resolver" "3.893.0" - "@aws-sdk/types" "3.893.0" - "@aws-sdk/util-endpoints" "3.895.0" - "@aws-sdk/util-user-agent-browser" "3.893.0" - "@aws-sdk/util-user-agent-node" "3.896.0" - "@smithy/config-resolver" "^4.2.2" - "@smithy/core" "^3.12.0" - "@smithy/fetch-http-handler" "^5.2.1" - "@smithy/hash-node" "^4.1.1" - "@smithy/invalid-dependency" "^4.1.1" - "@smithy/middleware-content-length" "^4.1.1" - "@smithy/middleware-endpoint" "^4.2.4" - "@smithy/middleware-retry" "^4.3.0" - "@smithy/middleware-serde" "^4.1.1" - "@smithy/middleware-stack" "^4.1.1" - "@smithy/node-config-provider" "^4.2.2" - "@smithy/node-http-handler" "^4.2.1" - "@smithy/protocol-http" "^5.2.1" - "@smithy/smithy-client" "^4.6.4" - "@smithy/types" "^4.5.0" - "@smithy/url-parser" "^4.1.1" - "@smithy/util-base64" "^4.1.0" - "@smithy/util-body-length-browser" "^4.1.0" - "@smithy/util-body-length-node" "^4.1.0" - "@smithy/util-defaults-mode-browser" "^4.1.4" - "@smithy/util-defaults-mode-node" "^4.1.4" - "@smithy/util-endpoints" "^3.1.2" - "@smithy/util-middleware" "^4.1.1" - "@smithy/util-retry" "^4.1.2" - "@smithy/util-utf8" "^4.1.0" - tslib "^2.6.2" - -"@aws-sdk/region-config-resolver@3.893.0": - version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.893.0.tgz#570dfd2314b3f71eb263557bb06fea36b5188cd6" - integrity sha512-/cJvh3Zsa+Of0Zbg7vl9wp/kZtdb40yk/2+XcroAMVPO9hPvmS9r/UOm6tO7FeX4TtkRFwWaQJiTZTgSdsPY+Q== - dependencies: - "@aws-sdk/types" "3.893.0" - "@smithy/node-config-provider" "^4.2.2" - "@smithy/types" "^4.5.0" - "@smithy/util-config-provider" "^4.1.0" - "@smithy/util-middleware" "^4.1.1" - tslib "^2.6.2" - -"@aws-sdk/signature-v4-multi-region@3.896.0": - version "3.896.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.896.0.tgz#2aa0ca3055dc000f6d68fe48adcee612ce814d36" - integrity sha512-txiQDEZXL9tlNP8mbnNaDtuHBYc/FCqaZ8Y76qnfM3o6CTIn0t0tTAlnx1CyFe4EaikVBgQuZvj5KfNA8PmlzA== - dependencies: - "@aws-sdk/middleware-sdk-s3" "3.896.0" - "@aws-sdk/types" "3.893.0" - "@smithy/protocol-http" "^5.2.1" - "@smithy/signature-v4" "^5.2.1" - "@smithy/types" "^4.5.0" - tslib "^2.6.2" - -"@aws-sdk/token-providers@3.896.0": - version "3.896.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.896.0.tgz#760cdca947129cd422ca636218addefffa932420" - integrity sha512-WBoD+RY7tUfW9M+wGrZ2vdveR+ziZOjGHWFY3lcGnDvI8KE+fcSccEOTxgJBNBS5Z8B+WHKU2sZjb+Z7QqGwjw== - dependencies: - "@aws-sdk/core" "3.896.0" - "@aws-sdk/nested-clients" "3.896.0" - "@aws-sdk/types" "3.893.0" - "@smithy/property-provider" "^4.1.1" - "@smithy/shared-ini-file-loader" "^4.2.0" - "@smithy/types" "^4.5.0" - tslib "^2.6.2" - -"@aws-sdk/types@3.893.0", "@aws-sdk/types@^3.222.0": - version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.893.0.tgz#1afbdb9d62bf86caeac380e3cac11a051076400a" - integrity sha512-Aht1nn5SnA0N+Tjv0dzhAY7CQbxVtmq1bBR6xI0MhG7p2XYVh1wXuKTzrldEvQWwA3odOYunAfT9aBiKZx9qIg== - dependencies: - "@smithy/types" "^4.5.0" - tslib "^2.6.2" - -"@aws-sdk/util-arn-parser@3.893.0": - version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-arn-parser/-/util-arn-parser-3.893.0.tgz#fcc9b792744b9da597662891c2422dda83881d8d" - integrity sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA== - dependencies: - tslib "^2.6.2" - -"@aws-sdk/util-endpoints@3.895.0": - version "3.895.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.895.0.tgz#d3881250cecc40fa9d721a33661c1aaa64aba643" - integrity sha512-MhxBvWbwxmKknuggO2NeMwOVkHOYL98pZ+1ZRI5YwckoCL3AvISMnPJgfN60ww6AIXHGpkp+HhpFdKOe8RHSEg== - dependencies: - "@aws-sdk/types" "3.893.0" - "@smithy/types" "^4.5.0" - "@smithy/url-parser" "^4.1.1" - "@smithy/util-endpoints" "^3.1.2" - tslib "^2.6.2" - -"@aws-sdk/util-locate-window@^3.0.0": - version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.893.0.tgz#5df15f24e1edbe12ff1fe8906f823b51cd53bae8" - integrity sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg== - dependencies: - tslib "^2.6.2" - -"@aws-sdk/util-user-agent-browser@3.893.0": - version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.893.0.tgz#be0aac5c73a30c2a03aedb2e3501bb277bad79a1" - integrity sha512-PE9NtbDBW6Kgl1bG6A5fF3EPo168tnkj8TgMcT0sg4xYBWsBpq0bpJZRh+Jm5Bkwiw9IgTCLjEU7mR6xWaMB9w== - dependencies: - "@aws-sdk/types" "3.893.0" - "@smithy/types" "^4.5.0" - bowser "^2.11.0" - tslib "^2.6.2" - -"@aws-sdk/util-user-agent-node@3.896.0": - version "3.896.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.896.0.tgz#190a8aa7ffae3f8d29bacdd3835b901daf116195" - integrity sha512-jegizucAwoxyBddKl0kRGNEgRHcfGuMeyhP1Nf+wIUmHz/9CxobIajqcVk/KRNLdZY5mSn7YG2VtP3z0BcBb0w== - dependencies: - "@aws-sdk/middleware-user-agent" "3.896.0" - "@aws-sdk/types" "3.893.0" - "@smithy/node-config-provider" "^4.2.2" - "@smithy/types" "^4.5.0" - tslib "^2.6.2" - -"@aws-sdk/xml-builder@3.894.0": - version "3.894.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.894.0.tgz#7110e86622345d3da220a2ed5259a30a91dec4bc" - integrity sha512-E6EAMc9dT1a2DOdo4zyOf3fp5+NJ2wI+mcm7RaW1baFIWDwcb99PpvWoV7YEiK7oaBDshuOEGWKUSYXdW+JYgA== - dependencies: - "@smithy/types" "^4.5.0" - fast-xml-parser "5.2.5" - tslib "^2.6.2" - -"@aws/lambda-invoke-store@^0.0.1": - version "0.0.1" - resolved "https://registry.yarnpkg.com/@aws/lambda-invoke-store/-/lambda-invoke-store-0.0.1.tgz#92d792a7dda250dfcb902e13228f37a81be57c8f" - integrity sha512-ORHRQ2tmvnBXc8t/X9Z8IcSbBA4xTLKuN873FopzklHMeqBst7YG0d+AX97inkvDX+NChYtSr+qGfcqGFaI8Zw== - -"@biomejs/biome@^2.2.4": - version "2.2.4" - resolved "https://registry.yarnpkg.com/@biomejs/biome/-/biome-2.2.4.tgz#184e4b83f89bd0d4151682a5aa3840df37748e17" - integrity sha512-TBHU5bUy/Ok6m8c0y3pZiuO/BZoY/OcGxoLlrfQof5s8ISVwbVBdFINPQZyFfKwil8XibYWb7JMwnT8wT4WVPg== +"@biomejs/biome@^2.4.16": + version "2.4.16" + resolved "https://registry.yarnpkg.com/@biomejs/biome/-/biome-2.4.16.tgz#241feeafcbc9c26ced1600e5c6016f4b3b599d24" + integrity sha512-x9ajFh1zChVybCiM3TN6OD4phAqLgtPZjFrZF+aTMYCPjwBO+k529TX7PPsAqtGNLeV4UgzwQnowEgS7bGmzcA== optionalDependencies: - "@biomejs/cli-darwin-arm64" "2.2.4" - "@biomejs/cli-darwin-x64" "2.2.4" - "@biomejs/cli-linux-arm64" "2.2.4" - "@biomejs/cli-linux-arm64-musl" "2.2.4" - "@biomejs/cli-linux-x64" "2.2.4" - "@biomejs/cli-linux-x64-musl" "2.2.4" - "@biomejs/cli-win32-arm64" "2.2.4" - "@biomejs/cli-win32-x64" "2.2.4" - -"@biomejs/cli-darwin-arm64@2.2.4": - version "2.2.4" - resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.2.4.tgz#9b50620c93501e370b7e6d5a8445f117f9946a0c" - integrity sha512-RJe2uiyaloN4hne4d2+qVj3d3gFJFbmrr5PYtkkjei1O9c+BjGXgpUPVbi8Pl8syumhzJjFsSIYkcLt2VlVLMA== - -"@biomejs/cli-darwin-x64@2.2.4": - version "2.2.4" - resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.2.4.tgz#343620c884fc8141155d114430e80e4eacfddc9e" - integrity sha512-cFsdB4ePanVWfTnPVaUX+yr8qV8ifxjBKMkZwN7gKb20qXPxd/PmwqUH8mY5wnM9+U0QwM76CxFyBRJhC9tQwg== - -"@biomejs/cli-linux-arm64-musl@2.2.4": - version "2.2.4" - resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.2.4.tgz#cabcdadce2bc88b697f4063374224266c6f8b6e5" - integrity sha512-7TNPkMQEWfjvJDaZRSkDCPT/2r5ESFPKx+TEev+I2BXDGIjfCZk2+b88FOhnJNHtksbOZv8ZWnxrA5gyTYhSsQ== - -"@biomejs/cli-linux-arm64@2.2.4": - version "2.2.4" - resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.2.4.tgz#55620f8f088145e62e1158eb85c568554d0c8673" - integrity sha512-M/Iz48p4NAzMXOuH+tsn5BvG/Jb07KOMTdSVwJpicmhN309BeEyRyQX+n1XDF0JVSlu28+hiTQ2L4rZPvu7nMw== - -"@biomejs/cli-linux-x64-musl@2.2.4": - version "2.2.4" - resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.2.4.tgz#6bfaea72505afdbda66a66c998d2d169a8b55f90" - integrity sha512-m41nFDS0ksXK2gwXL6W6yZTYPMH0LughqbsxInSKetoH6morVj43szqKx79Iudkp8WRT5SxSh7qVb8KCUiewGg== - -"@biomejs/cli-linux-x64@2.2.4": - version "2.2.4" - resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64/-/cli-linux-x64-2.2.4.tgz#8c1ed61dcafb8a5939346c714ec122651f57e1db" - integrity sha512-orr3nnf2Dpb2ssl6aihQtvcKtLySLta4E2UcXdp7+RTa7mfJjBgIsbS0B9GC8gVu0hjOu021aU8b3/I1tn+pVQ== - -"@biomejs/cli-win32-arm64@2.2.4": - version "2.2.4" - resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.2.4.tgz#b2528f6c436e753d6083d7779f0662e08786cedb" - integrity sha512-NXnfTeKHDFUWfxAefa57DiGmu9VyKi0cDqFpdI+1hJWQjGJhJutHPX0b5m+eXvTKOaf+brU+P0JrQAZMb5yYaQ== - -"@biomejs/cli-win32-x64@2.2.4": - version "2.2.4" - resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-x64/-/cli-win32-x64-2.2.4.tgz#c8e21413120fe073fa49b78fdd987022941ff66f" - integrity sha512-3Y4V4zVRarVh/B/eSHczR4LYoSVyv3Dfuvm3cWs5w/HScccS0+Wt/lHOcDTRYeHjQmMYVC3rIRWqyN2EI52+zg== + "@biomejs/cli-darwin-arm64" "2.4.16" + "@biomejs/cli-darwin-x64" "2.4.16" + "@biomejs/cli-linux-arm64" "2.4.16" + "@biomejs/cli-linux-arm64-musl" "2.4.16" + "@biomejs/cli-linux-x64" "2.4.16" + "@biomejs/cli-linux-x64-musl" "2.4.16" + "@biomejs/cli-win32-arm64" "2.4.16" + "@biomejs/cli-win32-x64" "2.4.16" + +"@biomejs/cli-darwin-arm64@2.4.16": + version "2.4.16" + resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.4.16.tgz#c361db44920728d57e2b0a48bb88c09ad01101b9" + integrity sha512-wxPvu4XOA85YJk9ixSWUmq/QBHbid85BISbOAqqBM/5xQpPk9ayjk5375tOlSC0BeCwNSbPFafQBm+vBumXq0A== + +"@biomejs/cli-darwin-x64@2.4.16": + version "2.4.16" + resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.4.16.tgz#4e69cfecd92f2909b87a9a1dff61f18dbc013088" + integrity sha512-xFCqGPwYusQJp4N4NJLi1XJiZqjwFdjhT+KqtNy+Ug3qgfczqnTa6MSDvxJF6TkuDLoYJItMapz6tAf7kCekFw== + +"@biomejs/cli-linux-arm64-musl@2.4.16": + version "2.4.16" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.4.16.tgz#5485d4a544d0818a29ce022256299ace49531779" + integrity sha512-oYxnW0ARfJkr72ezzF2OR8N/rtkgLUQeYtF8cFhVswbknHxtTcmzSsanVJP8yQKnGpGpc2ck6c5zLvHahL6Cbg== + +"@biomejs/cli-linux-arm64@2.4.16": + version "2.4.16" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.4.16.tgz#d6df1fb75ca5d05dec7985d74ffe503c4c3d33b1" + integrity sha512-2kFb4//jxfZaP6D+Rj5VkHkxgyD9EoRAVBEQb8PKRv+s4NO2zYNJKXFaJmK1CmhufJOWEfpHKaRbOja7qjmdhQ== + +"@biomejs/cli-linux-x64-musl@2.4.16": + version "2.4.16" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.4.16.tgz#4ccb530d703878a239c204b13aeb8d5c8cf80d8f" + integrity sha512-iHDS+MCM65DPqWGu+ECC3uoALyj2H7F4nVUPxIPjz/PIl94EUu+EDfGZDzFP+NY1EOPVt9NQvwFqq7HdMmowdg== + +"@biomejs/cli-linux-x64@2.4.16": + version "2.4.16" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64/-/cli-linux-x64-2.4.16.tgz#725c4e4dc0ec7182bb49c18c9d301184e669889e" + integrity sha512-NbcBbi/nJqn5baae6wqRXdS7Gadf2uRpehSh6vMSYpG8OhkXl/Xg8aorWrJ+9VWqAT5ml90alLvorkpMW0nBwQ== + +"@biomejs/cli-win32-arm64@2.4.16": + version "2.4.16" + resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.4.16.tgz#639e5433eb2c412c7798702708c96851de0b7827" + integrity sha512-0rgImMsNb5v/chhkIFe3wu7PEFClS6RBAYUijGL9UsYN3PanSaoK24HSSuSJb1pYbYYVjzAyZTl3gtjJ84BM8A== + +"@biomejs/cli-win32-x64@2.4.16": + version "2.4.16" + resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-x64/-/cli-win32-x64-2.4.16.tgz#30fb75d856864ff9d3324da20c72c9f121c9ae16" + integrity sha512-Kp85jgoBHa05gix6UIRjfCDiUV3w/8VIdZ247VyyO2gEjaw12WEVhdIjlxp/AMzXxqxQwbxNTDVZ3Mwd2RG5rw== "@discordjs/builders@^1.11.2": version "1.11.3" @@ -531,6 +69,19 @@ ts-mixer "^6.0.4" tslib "^2.6.3" +"@discordjs/builders@^1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@discordjs/builders/-/builders-1.14.1.tgz#c0ec04f3ae7a584296bfd1dccdda59bf580a0c89" + integrity sha512-gSKkhXLqs96TCzk66VZuHHl8z2bQMJFGwrXC0f33ngK+FLNau4hU1PYny3DNJfNdSH+gVMzE85/d5FQ2BpcNwQ== + dependencies: + "@discordjs/formatters" "^0.6.2" + "@discordjs/util" "^1.2.0" + "@sapphire/shapeshift" "^4.0.0" + discord-api-types "^0.38.40" + fast-deep-equal "^3.1.3" + ts-mixer "^6.0.4" + tslib "^2.6.3" + "@discordjs/collection@1.5.3": version "1.5.3" resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-1.5.3.tgz#5a1250159ebfff9efa4f963cfa7e97f1b291be18" @@ -548,6 +99,13 @@ dependencies: discord-api-types "^0.38.1" +"@discordjs/formatters@^0.6.2": + version "0.6.2" + resolved "https://registry.yarnpkg.com/@discordjs/formatters/-/formatters-0.6.2.tgz#93c4a213ceb49c9a28e8adb65d50a027579b8c30" + integrity sha512-y4UPwWhH6vChKRkGdMB4odasUbHOUwy7KL+OVwF86PvT6QVOwElx+TiI1/6kcmcEe+g5YRXJFiXSXUdabqZOvQ== + dependencies: + discord-api-types "^0.38.33" + "@discordjs/rest@^2.5.1", "@discordjs/rest@^2.6.0": version "2.6.0" resolved "https://registry.yarnpkg.com/@discordjs/rest/-/rest-2.6.0.tgz#8c449b0d5c22a4cd9c655f5d1d53a20b05c37f10" @@ -563,11 +121,33 @@ tslib "^2.6.3" undici "6.21.3" +"@discordjs/rest@^2.6.1": + version "2.6.1" + resolved "https://registry.yarnpkg.com/@discordjs/rest/-/rest-2.6.1.tgz#53f88b5b150392e325c85d32a3ad894e9d839380" + integrity sha512-wwQdgjeaoYFiaG+atbqx6aJDpqW7JHAo0HrQkBTbYzM3/PJ3GweQIpgElNcGZ26DCUOXMyawYd0YF7vtr+fZXg== + dependencies: + "@discordjs/collection" "^2.1.1" + "@discordjs/util" "^1.2.0" + "@sapphire/async-queue" "^1.5.3" + "@sapphire/snowflake" "^3.5.5" + "@vladfrangu/async_event_emitter" "^2.4.6" + discord-api-types "^0.38.40" + magic-bytes.js "^1.13.0" + tslib "^2.6.3" + undici "6.24.1" + "@discordjs/util@^1.1.0", "@discordjs/util@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@discordjs/util/-/util-1.1.1.tgz#bafcde0faa116c834da1258d78ec237080bbab29" integrity sha512-eddz6UnOBEB1oITPinyrB2Pttej49M9FZQY8NxgEvc3tq6ZICZ19m70RsmzRdDHk80O9NoYN/25AqJl8vPVf/g== +"@discordjs/util@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@discordjs/util/-/util-1.2.0.tgz#a45a2b643423094eb6378060c623f4d3e6d593d4" + integrity sha512-3LKP7F2+atl9vJFhaBjn4nOaSWahZ/yWjOvA4e5pnXkt2qyXRCHLxoBQy81GFtLGCq7K9lPm9R517M1U+/90Qg== + dependencies: + discord-api-types "^0.38.33" + "@discordjs/ws@^1.2.3": version "1.2.3" resolved "https://registry.yarnpkg.com/@discordjs/ws/-/ws-1.2.3.tgz#7cf80d8528366c6810c02b43ca49958ef154c3d4" @@ -583,155 +163,177 @@ tslib "^2.6.2" ws "^8.17.0" -"@dotenvx/dotenvx@^1.51.0": - version "1.51.0" - resolved "https://registry.yarnpkg.com/@dotenvx/dotenvx/-/dotenvx-1.51.0.tgz#6faf730e7cf532f0ecafdc87dc854d07e31c2915" - integrity sha512-CbMGzyOYSyFF7d4uaeYwO9gpSBzLTnMmSmTVpCZjvpJFV69qYbjYPpzNnCz1mb2wIvEhjWjRwQWuBzTO0jITww== +"@dotenvx/dotenvx@^1.69.1": + version "1.69.1" + resolved "https://registry.yarnpkg.com/@dotenvx/dotenvx/-/dotenvx-1.69.1.tgz#97f3b62c42dfc2330c4b0f13169765c5a976e13a" + integrity sha512-kwQB5KcAegxw/+NGUgXAo5ovyOSjlMhoXSSnSEpDhoHJwzMcMO0HE1U0VCYZ7jbAeCMGamed9XdWzOA5ixtTNg== dependencies: commander "^11.1.0" dotenv "^17.2.1" eciesjs "^0.4.10" + enquirer "^2.4.1" execa "^5.1.1" fdir "^6.2.0" ignore "^5.3.0" object-treeify "1.1.33" - picomatch "^4.0.2" + picomatch "^4.0.4" which "^4.0.0" + yocto-spinner "^1.1.0" "@ecies/ciphers@^0.2.3": version "0.2.4" resolved "https://registry.yarnpkg.com/@ecies/ciphers/-/ciphers-0.2.4.tgz#20a4e51f61d521e5e311eb49385d93d91087de51" integrity sha512-t+iX+Wf5nRKyNzk8dviW3Ikb/280+aEJAnw9YXvCp2tYGPSkMki+NRY+8aNLmVFv3eNtMdvViPNOPxS8SZNP+w== -"@esbuild/aix-ppc64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz#ee6b7163a13528e099ecf562b972f2bcebe0aa97" - integrity sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw== - -"@esbuild/android-arm64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz#115fc76631e82dd06811bfaf2db0d4979c16e2cb" - integrity sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg== - -"@esbuild/android-arm@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.10.tgz#8d5811912da77f615398611e5bbc1333fe321aa9" - integrity sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w== - -"@esbuild/android-x64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.10.tgz#e3e96516b2d50d74105bb92594c473e30ddc16b1" - integrity sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg== - -"@esbuild/darwin-arm64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz#6af6bb1d05887dac515de1b162b59dc71212ed76" - integrity sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA== - -"@esbuild/darwin-x64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz#99ae82347fbd336fc2d28ffd4f05694e6e5b723d" - integrity sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg== - -"@esbuild/freebsd-arm64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz#0c6d5558a6322b0bdb17f7025c19bd7d2359437d" - integrity sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg== - -"@esbuild/freebsd-x64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz#8c35873fab8c0857a75300a3dcce4324ca0b9844" - integrity sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA== - -"@esbuild/linux-arm64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz#3edc2f87b889a15b4cedaf65f498c2bed7b16b90" - integrity sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ== - -"@esbuild/linux-arm@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz#86501cfdfb3d110176d80c41b27ed4611471cde7" - integrity sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg== - -"@esbuild/linux-ia32@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz#e6589877876142537c6864680cd5d26a622b9d97" - integrity sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ== - -"@esbuild/linux-loong64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz#11119e18781f136d8083ea10eb6be73db7532de8" - integrity sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg== - -"@esbuild/linux-mips64el@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz#3052f5436b0c0c67a25658d5fc87f045e7def9e6" - integrity sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA== - -"@esbuild/linux-ppc64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz#2f098920ee5be2ce799f35e367b28709925a8744" - integrity sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA== - -"@esbuild/linux-riscv64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz#fa51d7fd0a22a62b51b4b94b405a3198cf7405dd" - integrity sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA== - -"@esbuild/linux-s390x@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz#a27642e36fc282748fdb38954bd3ef4f85791e8a" - integrity sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew== - -"@esbuild/linux-x64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz#9d9b09c0033d17529570ced6d813f98315dfe4e9" - integrity sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA== - -"@esbuild/netbsd-arm64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz#25c09a659c97e8af19e3f2afd1c9190435802151" - integrity sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A== - -"@esbuild/netbsd-x64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz#7fa5f6ffc19be3a0f6f5fd32c90df3dc2506937a" - integrity sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig== - -"@esbuild/openbsd-arm64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz#8faa6aa1afca0c6d024398321d6cb1c18e72a1c3" - integrity sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw== - -"@esbuild/openbsd-x64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz#a42979b016f29559a8453d32440d3c8cd420af5e" - integrity sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw== - -"@esbuild/openharmony-arm64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz#fd87bfeadd7eeb3aa384bbba907459ffa3197cb1" - integrity sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag== - -"@esbuild/sunos-x64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz#3a18f590e36cb78ae7397976b760b2b8c74407f4" - integrity sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ== - -"@esbuild/win32-arm64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz#e71741a251e3fd971408827a529d2325551f530c" - integrity sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw== - -"@esbuild/win32-ia32@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz#c6f010b5d3b943d8901a0c87ea55f93b8b54bf94" - integrity sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw== - -"@esbuild/win32-x64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz#e4b3e255a1b4aea84f6e1d2ae0b73f826c3785bd" - integrity sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw== +"@electric-sql/pglite-socket@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@electric-sql/pglite-socket/-/pglite-socket-0.1.1.tgz#af443da3a60130aee254faee4daf50fb79fb8d1f" + integrity sha512-p2hoXw3Z3LQHwTeikdZNsFBOvXGqKY2hk51BBw+8NKND8eoH+8LFOtW9Z8CQKmTJ2qqGYu82ipqiyFZOTTXNfw== + +"@electric-sql/pglite-tools@0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@electric-sql/pglite-tools/-/pglite-tools-0.3.1.tgz#b1b23dc45dcce22fb4d5a0505ba063923d09c105" + integrity sha512-C+T3oivmy9bpQvSxVqXA1UDY8cB9Eb9vZHL9zxWwEUfDixbXv4G3r2LjoTdR33LD8aomR3O9ZXEO3XEwr/cUCA== + +"@electric-sql/pglite@0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@electric-sql/pglite/-/pglite-0.4.1.tgz#a113476c3c20539756a8d77eb86d248d84a8d097" + integrity sha512-mZ9NzzUSYPOCnxHH1oAHPRzoMFJHY472raDKwXl/+6oPbpdJ7g8LsCN4FSaIIfkiCKHhb3iF/Zqo3NYxaIhU7Q== + +"@esbuild/aix-ppc64@0.28.0": + version "0.28.0" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.28.0.tgz#7a289c158e29cbf59ea0afc83cc80f06d1c89402" + integrity sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA== + +"@esbuild/android-arm64@0.28.0": + version "0.28.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.28.0.tgz#b8828d9edfa3a92660644eb8de6e4f3c203d7b17" + integrity sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw== + +"@esbuild/android-arm@0.28.0": + version "0.28.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.28.0.tgz#5ec1847605e05b5dbe5df90db9ff7e3e4c58dca7" + integrity sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ== + +"@esbuild/android-x64@0.28.0": + version "0.28.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.28.0.tgz#390642175b88ef82bad4cce03f8ab13fe9b1912e" + integrity sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA== + +"@esbuild/darwin-arm64@0.28.0": + version "0.28.0" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.28.0.tgz#ae45325960d5950cd6951e4f97396f4e1ff7d8d3" + integrity sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q== + +"@esbuild/darwin-x64@0.28.0": + version "0.28.0" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.28.0.tgz#c079247d589b6b99449659d94f06951b84bff2e4" + integrity sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ== + +"@esbuild/freebsd-arm64@0.28.0": + version "0.28.0" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.0.tgz#45c456215a486593c94900297202dc11c880a37a" + integrity sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q== + +"@esbuild/freebsd-x64@0.28.0": + version "0.28.0" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.28.0.tgz#0399494c1c85e4388e9b7040bd60d48f2a5b0d2c" + integrity sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw== + +"@esbuild/linux-arm64@0.28.0": + version "0.28.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.28.0.tgz#d6d9f09ef0de54116bf459a4d53cac7e0952fe39" + integrity sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A== + +"@esbuild/linux-arm@0.28.0": + version "0.28.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.28.0.tgz#7b42ffa84c288ae94fdc431c1b28a89e3c3b9278" + integrity sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw== + +"@esbuild/linux-ia32@0.28.0": + version "0.28.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.28.0.tgz#deb15d112ed8dd605346b6b953d23a21ff81253f" + integrity sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ== + +"@esbuild/linux-loong64@0.28.0": + version "0.28.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.28.0.tgz#81fb89d07eecc79b157dea61033757726fce0ca4" + integrity sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg== + +"@esbuild/linux-mips64el@0.28.0": + version "0.28.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.28.0.tgz#d0e42691b3ff7af9fb2217b70fc01f343bdb62bb" + integrity sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w== + +"@esbuild/linux-ppc64@0.28.0": + version "0.28.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.28.0.tgz#389f3e5e98f17d477c467cc87136e1a076eead87" + integrity sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg== + +"@esbuild/linux-riscv64@0.28.0": + version "0.28.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.28.0.tgz#763bd60d59b242be12da1e67d5729f3024c605fa" + integrity sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ== + +"@esbuild/linux-s390x@0.28.0": + version "0.28.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.28.0.tgz#aac6061634872e4677de693bce8030d73b1fd055" + integrity sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q== + +"@esbuild/linux-x64@0.28.0": + version "0.28.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.28.0.tgz#4f2917747188fe77632bcec65b2d84b422419779" + integrity sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ== + +"@esbuild/netbsd-arm64@0.28.0": + version "0.28.0" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.0.tgz#814df0ae57a0c386814491b8397eeba82094a947" + integrity sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw== + +"@esbuild/netbsd-x64@0.28.0": + version "0.28.0" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.28.0.tgz#e01bdf7e60fa1a08e46d46d960b0d9bb8ac210af" + integrity sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw== + +"@esbuild/openbsd-arm64@0.28.0": + version "0.28.0" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.0.tgz#4a15c36aacca68d2d5a4c90b710c06759f4c1ffa" + integrity sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g== + +"@esbuild/openbsd-x64@0.28.0": + version "0.28.0" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.28.0.tgz#475e6101498a8ecce3008d7c388111d7a27c17bd" + integrity sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA== + +"@esbuild/openharmony-arm64@0.28.0": + version "0.28.0" + resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.0.tgz#cfdc3957f0b7a69f1bde129aad17fcc2f6fa033e" + integrity sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w== + +"@esbuild/sunos-x64@0.28.0": + version "0.28.0" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.28.0.tgz#a013c856fecacd1c3aec985c8afe1d1cb017497d" + integrity sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw== + +"@esbuild/win32-arm64@0.28.0": + version "0.28.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.28.0.tgz#eae05e0f35271cad3898b43168d3e9a3bbaf47e5" + integrity sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA== + +"@esbuild/win32-ia32@0.28.0": + version "0.28.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.28.0.tgz#06161ebc5bf75c08d69feb3c6b22560515913998" + integrity sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA== + +"@esbuild/win32-x64@0.28.0": + version "0.28.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz#04d90d5752b4ce65d2b6ac25eba08ff7624fe07c" + integrity sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw== + +"@hono/node-server@1.19.11": + version "1.19.11" + resolved "https://registry.yarnpkg.com/@hono/node-server/-/node-server-1.19.11.tgz#dc419f0826dd2504e9fc86ad289d5636a0444e2f" + integrity sha512-dr8/3zEaB+p0D2n/IUrlPF1HZm586qgJNXK1a9fhg/PzdtkK7Ksd5l312tJX2yBuALqDYBlG20QEbayqPyxn+g== "@hunteroi/advanced-logger@^0.2.0": version "0.2.0" @@ -756,6 +358,11 @@ resolved "https://registry.yarnpkg.com/@hunteroi/discord-verification/-/discord-verification-1.5.2.tgz#fcb6bbc626d11af2230f625f011323f5fa7edc04" integrity sha512-F31p2ARYAm16tjbRadio898ype5nmhAI0eJ1vUXo08posyrxxW07VxNiy6hV09FulaM2+KwPYn7pXAZMGC2dMg== +"@kurkle/color@^0.3.0": + version "0.3.4" + resolved "https://registry.yarnpkg.com/@kurkle/color/-/color-0.3.4.tgz#4d4ff677e1609214fc71c580125ddddd86abcabf" + integrity sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w== + "@noble/ciphers@^1.3.0": version "1.3.0" resolved "https://registry.yarnpkg.com/@noble/ciphers/-/ciphers-1.3.0.tgz#f64b8ff886c240e644e5573c097f86e5b43676dc" @@ -773,486 +380,222 @@ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.8.0.tgz#cee43d801fcef9644b11b8194857695acd5f815a" integrity sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A== -"@prisma/client@^5.22.0": - version "5.22.0" - resolved "https://registry.yarnpkg.com/@prisma/client/-/client-5.22.0.tgz#da1ca9c133fbefe89e0da781c75e1c59da5f8802" - integrity sha512-M0SVXfyHnQREBKxCgyo7sffrKttwE6R8PMq330MIUF0pTwjUhLbW84pFDlf06B27XyCR++VtjugEnIHdr07SVA== - -"@prisma/debug@5.22.0": - version "5.22.0" - resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-5.22.0.tgz#58af56ed7f6f313df9fb1042b6224d3174bbf412" - integrity sha512-AUt44v3YJeggO2ZU5BkXI7M4hu9BF2zzH2iF2V5pyXT/lRTyWiElZ7It+bRH1EshoMRxHgpYg4VB6rCM+mG5jQ== - -"@prisma/engines-version@5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2": - version "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2" - resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2.tgz#d534dd7235c1ba5a23bacd5b92cc0ca3894c28f4" - integrity sha512-2PTmxFR2yHW/eB3uqWtcgRcgAbG1rwG9ZriSvQw+nnb7c4uCr3RAcGMb6/zfE88SKlC1Nj2ziUvc96Z379mHgQ== - -"@prisma/engines@5.22.0": - version "5.22.0" - resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-5.22.0.tgz#28f3f52a2812c990a8b66eb93a0987816a5b6d84" - integrity sha512-UNjfslWhAt06kVL3CjkuYpHAWSO6L4kDCVPegV6itt7nD1kSJavd3vhgAEhjglLJJKEdJ7oIqDJ+yHk6qO8gPA== - dependencies: - "@prisma/debug" "5.22.0" - "@prisma/engines-version" "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2" - "@prisma/fetch-engine" "5.22.0" - "@prisma/get-platform" "5.22.0" - -"@prisma/fetch-engine@5.22.0": - version "5.22.0" - resolved "https://registry.yarnpkg.com/@prisma/fetch-engine/-/fetch-engine-5.22.0.tgz#4fb691b483a450c5548aac2f837b267dd50ef52e" - integrity sha512-bkrD/Mc2fSvkQBV5EpoFcZ87AvOgDxbG99488a5cexp5Ccny+UM6MAe/UFkUC0wLYD9+9befNOqGiIJhhq+HbA== - dependencies: - "@prisma/debug" "5.22.0" - "@prisma/engines-version" "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2" - "@prisma/get-platform" "5.22.0" - -"@prisma/get-platform@5.22.0": - version "5.22.0" - resolved "https://registry.yarnpkg.com/@prisma/get-platform/-/get-platform-5.22.0.tgz#fc675bc9d12614ca2dade0506c9c4a77e7dddacd" - integrity sha512-pHhpQdr1UPFpt+zFfnPazhulaZYCUqeIcPpJViYoq9R+D/yw4fjE+CtnsnKzPYm0ddUbeXUzjGVGIRVgPDCk4Q== - dependencies: - "@prisma/debug" "5.22.0" - -"@sapphire/async-queue@^1.5.2", "@sapphire/async-queue@^1.5.3": - version "1.5.5" - resolved "https://registry.yarnpkg.com/@sapphire/async-queue/-/async-queue-1.5.5.tgz#2b18d402bb920b65b13ad4ed8dfb6c386300dd84" - integrity sha512-cvGzxbba6sav2zZkH8GPf2oGk9yYoD5qrNWdu9fRehifgnFZJMV+nuy2nON2roRO4yQQ+v7MK/Pktl/HgfsUXg== - -"@sapphire/shapeshift@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@sapphire/shapeshift/-/shapeshift-4.0.0.tgz#86c1b41002ff5d0b2ad21cbc3418b06834b89040" - integrity sha512-d9dUmWVA7MMiKobL3VpLF8P2aeanRTu6ypG2OIaEv/ZHH/SUQ2iHOVyi5wAPjQ+HmnMuL0whK9ez8I/raWbtIg== - dependencies: - fast-deep-equal "^3.1.3" - lodash "^4.17.21" - -"@sapphire/snowflake@3.5.3": - version "3.5.3" - resolved "https://registry.yarnpkg.com/@sapphire/snowflake/-/snowflake-3.5.3.tgz#0c102aa2ec5b34f806e9bc8625fc6a5e1d0a0c6a" - integrity sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ== - -"@sapphire/snowflake@^3.5.3": - version "3.5.5" - resolved "https://registry.yarnpkg.com/@sapphire/snowflake/-/snowflake-3.5.5.tgz#33a60ab4231e3cab29e8a0077f342125f2c8d1bd" - integrity sha512-xzvBr1Q1c4lCe7i6sRnrofxeO1QTP/LKQ6A6qy0iB4x5yfiSfARMEQEghojzTNALDTcv8En04qYNIco9/K9eZQ== - -"@smithy/abort-controller@^4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-4.1.1.tgz#9b3872ab6b2c061486175c281dadc0a853260533" - integrity sha512-vkzula+IwRvPR6oKQhMYioM3A/oX/lFCZiwuxkQbRhqJS2S4YRY2k7k/SyR2jMf3607HLtbEwlRxi0ndXHMjRg== - dependencies: - "@smithy/types" "^4.5.0" - tslib "^2.6.2" - -"@smithy/config-resolver@^4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-4.2.2.tgz#3f6a3c163f9b5b7f852d7d1817bc9e3b2136fa5f" - integrity sha512-IT6MatgBWagLybZl1xQcURXRICvqz1z3APSCAI9IqdvfCkrA7RaQIEfgC6G/KvfxnDfQUDqFV+ZlixcuFznGBQ== - dependencies: - "@smithy/node-config-provider" "^4.2.2" - "@smithy/types" "^4.5.0" - "@smithy/util-config-provider" "^4.1.0" - "@smithy/util-middleware" "^4.1.1" - tslib "^2.6.2" - -"@smithy/core@^3.12.0": - version "3.12.0" - resolved "https://registry.yarnpkg.com/@smithy/core/-/core-3.12.0.tgz#81bb6a2a113e334ddaede9d502ff17ce4d8a2cc6" - integrity sha512-zJeAgogZfbwlPGL93y4Z/XNeIN37YCreRUd6YMIRvaq+6RnBK8PPYYIQ85Is/GglPh3kNImD5riDCXbVSDpCiQ== - dependencies: - "@smithy/middleware-serde" "^4.1.1" - "@smithy/protocol-http" "^5.2.1" - "@smithy/types" "^4.5.0" - "@smithy/util-base64" "^4.1.0" - "@smithy/util-body-length-browser" "^4.1.0" - "@smithy/util-middleware" "^4.1.1" - "@smithy/util-stream" "^4.3.2" - "@smithy/util-utf8" "^4.1.0" - "@smithy/uuid" "^1.0.0" - tslib "^2.6.2" - -"@smithy/credential-provider-imds@^4.1.2": - version "4.1.2" - resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-4.1.2.tgz#68662c873dbe812c13159cb2be3c4ba8aeb52149" - integrity sha512-JlYNq8TShnqCLg0h+afqe2wLAwZpuoSgOyzhYvTgbiKBWRov+uUve+vrZEQO6lkdLOWPh7gK5dtb9dS+KGendg== - dependencies: - "@smithy/node-config-provider" "^4.2.2" - "@smithy/property-provider" "^4.1.1" - "@smithy/types" "^4.5.0" - "@smithy/url-parser" "^4.1.1" - tslib "^2.6.2" - -"@smithy/fetch-http-handler@^5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-5.2.1.tgz#fe284a00f1b3a35edf9fba454d287b7f74ef20af" - integrity sha512-5/3wxKNtV3wO/hk1is+CZUhL8a1yy/U+9u9LKQ9kZTkMsHaQjJhc3stFfiujtMnkITjzWfndGA2f7g9Uh9vKng== - dependencies: - "@smithy/protocol-http" "^5.2.1" - "@smithy/querystring-builder" "^4.1.1" - "@smithy/types" "^4.5.0" - "@smithy/util-base64" "^4.1.0" - tslib "^2.6.2" - -"@smithy/hash-node@^4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-4.1.1.tgz#86ceca92487492267e944e4f4507106b731e7971" - integrity sha512-H9DIU9WBLhYrvPs9v4sYvnZ1PiAI0oc8CgNQUJ1rpN3pP7QADbTOUjchI2FB764Ub0DstH5xbTqcMJu1pnVqxA== - dependencies: - "@smithy/types" "^4.5.0" - "@smithy/util-buffer-from" "^4.1.0" - "@smithy/util-utf8" "^4.1.0" - tslib "^2.6.2" - -"@smithy/invalid-dependency@^4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-4.1.1.tgz#2511335ff889944701c7d2a3b1e4a4d6fe9ddfab" - integrity sha512-1AqLyFlfrrDkyES8uhINRlJXmHA2FkG+3DY8X+rmLSqmFwk3DJnvhyGzyByPyewh2jbmV+TYQBEfngQax8IFGg== - dependencies: - "@smithy/types" "^4.5.0" - tslib "^2.6.2" - -"@smithy/is-array-buffer@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz#f84f0d9f9a36601a9ca9381688bd1b726fd39111" - integrity sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA== - dependencies: - tslib "^2.6.2" - -"@smithy/is-array-buffer@^4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-4.1.0.tgz#d18a2f22280e7173633cb91a9bdb6f3d8a6560b8" - integrity sha512-ePTYUOV54wMogio+he4pBybe8fwg4sDvEVDBU8ZlHOZXbXK3/C0XfJgUCu6qAZcawv05ZhZzODGUerFBPsPUDQ== - dependencies: - tslib "^2.6.2" - -"@smithy/middleware-content-length@^4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-4.1.1.tgz#eaea7bd14c7a0b64aef87b8c372c2a04d7b9cb72" - integrity sha512-9wlfBBgTsRvC2JxLJxv4xDGNBrZuio3AgSl0lSFX7fneW2cGskXTYpFxCdRYD2+5yzmsiTuaAJD1Wp7gWt9y9w== - dependencies: - "@smithy/protocol-http" "^5.2.1" - "@smithy/types" "^4.5.0" - tslib "^2.6.2" - -"@smithy/middleware-endpoint@^4.2.4": - version "4.2.4" - resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-4.2.4.tgz#d815d27b7869a66ee97b41932053ca5d5ec6315e" - integrity sha512-FZ4hzupOmthm8Q8ujYrd0I+/MHwVMuSTdkDtIQE0xVuvJt9pLT6Q+b0p4/t+slDyrpcf+Wj7SN+ZqT5OryaaZg== - dependencies: - "@smithy/core" "^3.12.0" - "@smithy/middleware-serde" "^4.1.1" - "@smithy/node-config-provider" "^4.2.2" - "@smithy/shared-ini-file-loader" "^4.2.0" - "@smithy/types" "^4.5.0" - "@smithy/url-parser" "^4.1.1" - "@smithy/util-middleware" "^4.1.1" - tslib "^2.6.2" - -"@smithy/middleware-retry@^4.3.0": - version "4.3.0" - resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-4.3.0.tgz#453c9668b013fbfa900957857f74f3b15936b384" - integrity sha512-qhEX9745fAxZvtLM4bQJAVC98elWjiMO2OiHl1s6p7hUzS4QfZO1gXUYNwEK8m0J6NoCD5W52ggWxbIDHI0XSg== - dependencies: - "@smithy/node-config-provider" "^4.2.2" - "@smithy/protocol-http" "^5.2.1" - "@smithy/service-error-classification" "^4.1.2" - "@smithy/smithy-client" "^4.6.4" - "@smithy/types" "^4.5.0" - "@smithy/util-middleware" "^4.1.1" - "@smithy/util-retry" "^4.1.2" - "@smithy/uuid" "^1.0.0" - tslib "^2.6.2" - -"@smithy/middleware-serde@^4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-4.1.1.tgz#cfb99f53c744d7730928235cbe66cc7ff8a8a9b2" - integrity sha512-lh48uQdbCoj619kRouev5XbWhCwRKLmphAif16c4J6JgJ4uXjub1PI6RL38d3BLliUvSso6klyB/LTNpWSNIyg== - dependencies: - "@smithy/protocol-http" "^5.2.1" - "@smithy/types" "^4.5.0" - tslib "^2.6.2" - -"@smithy/middleware-stack@^4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-4.1.1.tgz#1d533fde4ccbb62d7fc0f0b8ac518b7e4791e311" - integrity sha512-ygRnniqNcDhHzs6QAPIdia26M7e7z9gpkIMUe/pK0RsrQ7i5MblwxY8078/QCnGq6AmlUUWgljK2HlelsKIb/A== - dependencies: - "@smithy/types" "^4.5.0" - tslib "^2.6.2" - -"@smithy/node-config-provider@^4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-4.2.2.tgz#ede9ac2f689cfdf26815a53fadf139e6aa77bdbb" - integrity sha512-SYGTKyPvyCfEzIN5rD8q/bYaOPZprYUPD2f5g9M7OjaYupWOoQFYJ5ho+0wvxIRf471i2SR4GoiZ2r94Jq9h6A== - dependencies: - "@smithy/property-provider" "^4.1.1" - "@smithy/shared-ini-file-loader" "^4.2.0" - "@smithy/types" "^4.5.0" - tslib "^2.6.2" - -"@smithy/node-http-handler@^4.2.1": - version "4.2.1" - resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-4.2.1.tgz#d7ab8e31659030d3d5a68f0982f15c00b1e67a0c" - integrity sha512-REyybygHlxo3TJICPF89N2pMQSf+p+tBJqpVe1+77Cfi9HBPReNjTgtZ1Vg73exq24vkqJskKDpfF74reXjxfw== - dependencies: - "@smithy/abort-controller" "^4.1.1" - "@smithy/protocol-http" "^5.2.1" - "@smithy/querystring-builder" "^4.1.1" - "@smithy/types" "^4.5.0" - tslib "^2.6.2" - -"@smithy/property-provider@^4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-4.1.1.tgz#6e11ae6729840314afed05fd6ab48f62c654116b" - integrity sha512-gm3ZS7DHxUbzC2wr8MUCsAabyiXY0gaj3ROWnhSx/9sPMc6eYLMM4rX81w1zsMaObj2Lq3PZtNCC1J6lpEY7zg== - dependencies: - "@smithy/types" "^4.5.0" - tslib "^2.6.2" - -"@smithy/protocol-http@^5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-5.2.1.tgz#33f2b8e4e1082c3ae0372d1322577e6fa71d7824" - integrity sha512-T8SlkLYCwfT/6m33SIU/JOVGNwoelkrvGjFKDSDtVvAXj/9gOT78JVJEas5a+ETjOu4SVvpCstKgd0PxSu/aHw== - dependencies: - "@smithy/types" "^4.5.0" - tslib "^2.6.2" - -"@smithy/querystring-builder@^4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-4.1.1.tgz#4d35c1735de8214055424045a117fa5d1d5cdec1" - integrity sha512-J9b55bfimP4z/Jg1gNo+AT84hr90p716/nvxDkPGCD4W70MPms0h8KF50RDRgBGZeL83/u59DWNqJv6tEP/DHA== - dependencies: - "@smithy/types" "^4.5.0" - "@smithy/util-uri-escape" "^4.1.0" - tslib "^2.6.2" +"@prisma/client-runtime-utils@7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@prisma/client-runtime-utils/-/client-runtime-utils-7.8.0.tgz#202c0a2ac295e19677debd4a2d18dc35f9ccfb21" + integrity sha512-5NQZztQ0oY/ADFkmd9gPuweH5A1/CCY8YQPorLLO0Mu6a87mY5gsnDkzmFmIHs9NFaLnZojzgddFVN4RpKYrdw== -"@smithy/querystring-parser@^4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-4.1.1.tgz#21b861439b2db16abeb0a6789b126705fa25eea1" - integrity sha512-63TEp92YFz0oQ7Pj9IuI3IgnprP92LrZtRAkE3c6wLWJxfy/yOPRt39IOKerVr0JS770olzl0kGafXlAXZ1vng== +"@prisma/client@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@prisma/client/-/client-7.8.0.tgz#dce2fb00238c733f6bedeb769547b01f69b86d42" + integrity sha512-HFp3Dawv/3sU3JtlPha90IB+48lS7zHiH4LKZPjmcE8YH5P9DOXGPvo8dqOtO7MqLDd1p2hOWMcFlRT1DMblHw== dependencies: - "@smithy/types" "^4.5.0" - tslib "^2.6.2" + "@prisma/client-runtime-utils" "7.8.0" -"@smithy/service-error-classification@^4.1.2": - version "4.1.2" - resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-4.1.2.tgz#06839c332f4620a4b80c78a0c32377732dc6697a" - integrity sha512-Kqd8wyfmBWHZNppZSMfrQFpc3M9Y/kjyN8n8P4DqJJtuwgK1H914R471HTw7+RL+T7+kI1f1gOnL7Vb5z9+NgQ== +"@prisma/config@7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@prisma/config/-/config-7.8.0.tgz#401f1f108f2e463e508ac20ca08979d4ee215c65" + integrity sha512-HFESzd9rx2ZQxlK+TL7tu1HPvCqrHiL6LCxYykI2c34mvaUuIVVl3lYuicJD/MNnzgPnyeBEMlK4WTomJCV5jw== dependencies: - "@smithy/types" "^4.5.0" + c12 "3.3.4" + deepmerge-ts "7.1.5" + effect "3.20.0" + empathic "2.0.0" -"@smithy/shared-ini-file-loader@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.2.0.tgz#e4717242686bf611bd1a5d6f79870abe480c1c99" - integrity sha512-OQTfmIEp2LLuWdxa8nEEPhZmiOREO6bcB6pjs0AySf4yiZhl6kMOfqmcwcY8BaBPX+0Tb+tG7/Ia/6mwpoZ7Pw== +"@prisma/debug@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-7.2.0.tgz#569b1cbc10eb3e8cae798b40075fd11d21f6b533" + integrity sha512-YSGTiSlBAVJPzX4ONZmMotL+ozJwQjRmZweQNIq/ER0tQJKJynNkRB3kyvt37eOfsbMCXk3gnLF6J9OJ4QWftw== + +"@prisma/debug@7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-7.8.0.tgz#8e2f70d284b3091c2d713aa093a0f5898487e431" + integrity sha512-p+QZReysDUqXC+mk17q9a+Y/qzh4c2KYliDK30buYUyfrGeTGSyfmc0AIrJRhZJrLHhRiJa9Au/J72h3C+szvA== + +"@prisma/dev@0.24.3": + version "0.24.3" + resolved "https://registry.yarnpkg.com/@prisma/dev/-/dev-0.24.3.tgz#a235c2cfca28134f904e6b964d7652a9dfbd60f4" + integrity sha512-ffHlQuKXZiaDt9Go0OnCTdJZrHxK0k7omJKNV86/VjpsXu5EIHZLK0T7JSWgvNlJwh56kW9JFu9v0qJciFzepg== + dependencies: + "@electric-sql/pglite" "0.4.1" + "@electric-sql/pglite-socket" "0.1.1" + "@electric-sql/pglite-tools" "0.3.1" + "@hono/node-server" "1.19.11" + "@prisma/get-platform" "7.2.0" + "@prisma/query-plan-executor" "7.2.0" + "@prisma/streams-local" "0.1.2" + foreground-child "3.3.1" + get-port-please "3.2.0" + hono "^4.12.8" + http-status-codes "2.3.0" + pathe "2.0.3" + proper-lockfile "4.1.2" + remeda "2.33.4" + std-env "3.10.0" + valibot "1.2.0" + zeptomatch "2.1.0" + +"@prisma/engines-version@7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a": + version "7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a" + resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a.tgz#6ab01f7c2619a9f9f1634418288a08080a630d18" + integrity sha512-fJPQxCkLgA5EayWaW8eArgCvjJ+N+Kz3VyeNKMEeYiQC4alNkxRKFVAGxv/ZUzuJISKqdw+zGeDbS6mn6RCPOA== + +"@prisma/engines@7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-7.8.0.tgz#214c778871929bcf96a056285270ddf1d74e7051" + integrity sha512-jx3rCnNNrt5uzbkKlegtQ2GZHxSlihMCzutgT/BP6UIDF1r9tDI39hV/0T/cHZgzJ3ELbuQPXlVZy+Y1n0pcgw== + dependencies: + "@prisma/debug" "7.8.0" + "@prisma/engines-version" "7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a" + "@prisma/fetch-engine" "7.8.0" + "@prisma/get-platform" "7.8.0" + +"@prisma/fetch-engine@7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@prisma/fetch-engine/-/fetch-engine-7.8.0.tgz#699c1876d862b1f965b0318eb5e80b6c3744aa3f" + integrity sha512-gwB0Euiz/DDRyxFRpLXYlK3RfaZUj1c5dAYMuhZYfApg7arknJlcb9bIsOHDppJmbqYaVA+yBIiFMDBfprsNPQ== + dependencies: + "@prisma/debug" "7.8.0" + "@prisma/engines-version" "7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a" + "@prisma/get-platform" "7.8.0" + +"@prisma/get-platform@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@prisma/get-platform/-/get-platform-7.2.0.tgz#b3a92db68de6a76e840e61d2f26659aa9f915e3e" + integrity sha512-k1V0l0Td1732EHpAfi2eySTezyllok9dXb6UQanajkJQzPUGi3vO2z7jdkz67SypFTdmbnyGYxvEvYZdZsMAVA== dependencies: - "@smithy/types" "^4.5.0" - tslib "^2.6.2" - -"@smithy/signature-v4@^5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-5.2.1.tgz#0048489d2f1b3c888382595a085edd31967498f8" - integrity sha512-M9rZhWQLjlQVCCR37cSjHfhriGRN+FQ8UfgrYNufv66TJgk+acaggShl3KS5U/ssxivvZLlnj7QH2CUOKlxPyA== - dependencies: - "@smithy/is-array-buffer" "^4.1.0" - "@smithy/protocol-http" "^5.2.1" - "@smithy/types" "^4.5.0" - "@smithy/util-hex-encoding" "^4.1.0" - "@smithy/util-middleware" "^4.1.1" - "@smithy/util-uri-escape" "^4.1.0" - "@smithy/util-utf8" "^4.1.0" - tslib "^2.6.2" - -"@smithy/smithy-client@^4.6.4": - version "4.6.4" - resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-4.6.4.tgz#3a66bb71c91dadf1806adab664ba2e164a1139ab" - integrity sha512-qL7O3VDyfzCSN9r+sdbQXGhaHtrfSJL30En6Jboj0I3bobf2g1/T0eP2L4qxqrEW26gWhJ4THI4ElVVLjYyBHg== - dependencies: - "@smithy/core" "^3.12.0" - "@smithy/middleware-endpoint" "^4.2.4" - "@smithy/middleware-stack" "^4.1.1" - "@smithy/protocol-http" "^5.2.1" - "@smithy/types" "^4.5.0" - "@smithy/util-stream" "^4.3.2" - tslib "^2.6.2" + "@prisma/debug" "7.2.0" -"@smithy/types@^4.5.0": - version "4.5.0" - resolved "https://registry.yarnpkg.com/@smithy/types/-/types-4.5.0.tgz#850e334662a1ef1286c35814940c80880400a370" - integrity sha512-RkUpIOsVlAwUIZXO1dsz8Zm+N72LClFfsNqf173catVlvRZiwPy0x2u0JLEA4byreOPKDZPGjmPDylMoP8ZJRg== +"@prisma/get-platform@7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@prisma/get-platform/-/get-platform-7.8.0.tgz#7b1dade4117939c68c1324150ac72773f7272e68" + integrity sha512-WlxgRGnolL8VH2EmkH1R/DkKNr/mVdS3G2h42IZFFZ3eUrH9OT6t73kIOSlkkrv50wG123Iq8d96ufv5LlZktw== dependencies: - tslib "^2.6.2" + "@prisma/debug" "7.8.0" -"@smithy/url-parser@^4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-4.1.1.tgz#0e9a5e72b3cf9d7ab7305f9093af5528d9debaf6" - integrity sha512-bx32FUpkhcaKlEoOMbScvc93isaSiRM75pQ5IgIBaMkT7qMlIibpPRONyx/0CvrXHzJLpOn/u6YiDX2hcvs7Dg== - dependencies: - "@smithy/querystring-parser" "^4.1.1" - "@smithy/types" "^4.5.0" - tslib "^2.6.2" +"@prisma/query-plan-executor@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@prisma/query-plan-executor/-/query-plan-executor-7.2.0.tgz#00b218d78066957f25ccae0954bbef708396cc9f" + integrity sha512-EOZmNzcV8uJ0mae3DhTsiHgoNCuu1J9mULQpGCh62zN3PxPTd+qI9tJvk5jOst8WHKQNwJWR3b39t0XvfBB0WQ== -"@smithy/util-base64@^4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@smithy/util-base64/-/util-base64-4.1.0.tgz#5965026081d9aef4a8246f5702807570abe538b2" - integrity sha512-RUGd4wNb8GeW7xk+AY5ghGnIwM96V0l2uzvs/uVHf+tIuVX2WSvynk5CxNoBCsM2rQRSZElAo9rt3G5mJ/gktQ== +"@prisma/streams-local@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@prisma/streams-local/-/streams-local-0.1.2.tgz#531679bf13aafe4c663778848ff61a106b95df27" + integrity sha512-l49yTxKKF2odFxaAXTmwmkBKL3+bVQ1tFOooGifu4xkdb9NMNLxHj27XAhTylWZod8I+ISGM5erU1xcl/oBCtg== dependencies: - "@smithy/util-buffer-from" "^4.1.0" - "@smithy/util-utf8" "^4.1.0" - tslib "^2.6.2" + ajv "^8.12.0" + better-result "^2.7.0" + env-paths "^3.0.0" + proper-lockfile "^4.1.2" -"@smithy/util-body-length-browser@^4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@smithy/util-body-length-browser/-/util-body-length-browser-4.1.0.tgz#636bdf4bc878c546627dab4b9b0e4db31b475be7" - integrity sha512-V2E2Iez+bo6bUMOTENPr6eEmepdY8Hbs+Uc1vkDKgKNA/brTJqOW/ai3JO1BGj9GbCeLqw90pbbH7HFQyFotGQ== +"@prisma/studio-core@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@prisma/studio-core/-/studio-core-0.27.3.tgz#45246d76565ada1728bc7e0d29217c0e4746a631" + integrity sha512-AADjNFPdsrglxHQVTmHFqv6DuKQZ5WY4p5/gVFY017twvNrSwpLJ9lqUbYYxEu2W7nbvVxTZA8deJ8LseNALsw== dependencies: - tslib "^2.6.2" + "@radix-ui/react-toggle" "1.1.10" + chart.js "4.5.1" -"@smithy/util-body-length-node@^4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@smithy/util-body-length-node/-/util-body-length-node-4.1.0.tgz#646750e4af58f97254a5d5cfeaba7d992f0152ec" - integrity sha512-BOI5dYjheZdgR9XiEM3HJcEMCXSoqbzu7CzIgYrx0UtmvtC3tC2iDGpJLsSRFffUpy8ymsg2ARMP5fR8mtuUQQ== - dependencies: - tslib "^2.6.2" +"@radix-ui/primitive@1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.1.3.tgz#e2dbc13bdc5e4168f4334f75832d7bdd3e2de5ba" + integrity sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg== -"@smithy/util-buffer-from@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz#6fc88585165ec73f8681d426d96de5d402021e4b" - integrity sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA== - dependencies: - "@smithy/is-array-buffer" "^2.2.0" - tslib "^2.6.2" +"@radix-ui/react-compose-refs@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz#a2c4c47af6337048ee78ff6dc0d090b390d2bb30" + integrity sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg== -"@smithy/util-buffer-from@^4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-4.1.0.tgz#21f9e644a0eb41226d92e4eff763f76a7db7e9cc" - integrity sha512-N6yXcjfe/E+xKEccWEKzK6M+crMrlwaCepKja0pNnlSkm6SjAeLKKA++er5Ba0I17gvKfN/ThV+ZOx/CntKTVw== +"@radix-ui/react-primitive@2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz#db9b8bcff49e01be510ad79893fb0e4cda50f1bc" + integrity sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ== dependencies: - "@smithy/is-array-buffer" "^4.1.0" - tslib "^2.6.2" + "@radix-ui/react-slot" "1.2.3" -"@smithy/util-config-provider@^4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@smithy/util-config-provider/-/util-config-provider-4.1.0.tgz#6a07d73446c1e9a46d7a3c125f2a9301060bc957" - integrity sha512-swXz2vMjrP1ZusZWVTB/ai5gK+J8U0BWvP10v9fpcFvg+Xi/87LHvHfst2IgCs1i0v4qFZfGwCmeD/KNCdJZbQ== +"@radix-ui/react-slot@1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.2.3.tgz#502d6e354fc847d4169c3bc5f189de777f68cfe1" + integrity sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A== dependencies: - tslib "^2.6.2" + "@radix-ui/react-compose-refs" "1.1.2" -"@smithy/util-defaults-mode-browser@^4.1.4": - version "4.1.4" - resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.1.4.tgz#a967e994d4581682891f7252c7a42a2d6c1841e4" - integrity sha512-mLDJ1s4eA3vwOGaQOEPlg5LB4LdZUUMpB5UMOMofeGhWqiS7WR7dTpLiNi9zVn+YziKUd3Af5NLfxDs7NJqmIw== +"@radix-ui/react-toggle@1.1.10": + version "1.1.10" + resolved "https://registry.yarnpkg.com/@radix-ui/react-toggle/-/react-toggle-1.1.10.tgz#b04ba0f9609599df666fce5b2f38109a197f08cf" + integrity sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ== dependencies: - "@smithy/property-provider" "^4.1.1" - "@smithy/smithy-client" "^4.6.4" - "@smithy/types" "^4.5.0" - bowser "^2.11.0" - tslib "^2.6.2" + "@radix-ui/primitive" "1.1.3" + "@radix-ui/react-primitive" "2.1.3" + "@radix-ui/react-use-controllable-state" "1.2.2" -"@smithy/util-defaults-mode-node@^4.1.4": - version "4.1.4" - resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.1.4.tgz#ce6b88431db4c5b42933904fd0051c91415c41ab" - integrity sha512-pjX2iMTcOASaSanAd7bu6i3fcMMezr3NTr8Rh64etB0uHRZi+Aw86DoCxPESjY4UTIuA06hhqtTtw95o//imYA== - dependencies: - "@smithy/config-resolver" "^4.2.2" - "@smithy/credential-provider-imds" "^4.1.2" - "@smithy/node-config-provider" "^4.2.2" - "@smithy/property-provider" "^4.1.1" - "@smithy/smithy-client" "^4.6.4" - "@smithy/types" "^4.5.0" - tslib "^2.6.2" - -"@smithy/util-endpoints@^3.1.2": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-3.1.2.tgz#be4005c8616923d453347048ef26a439267b2782" - integrity sha512-+AJsaaEGb5ySvf1SKMRrPZdYHRYSzMkCoK16jWnIMpREAnflVspMIDeCVSZJuj+5muZfgGpNpijE3mUNtjv01Q== +"@radix-ui/react-use-controllable-state@1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz#905793405de57d61a439f4afebbb17d0645f3190" + integrity sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg== dependencies: - "@smithy/node-config-provider" "^4.2.2" - "@smithy/types" "^4.5.0" - tslib "^2.6.2" + "@radix-ui/react-use-effect-event" "0.0.2" + "@radix-ui/react-use-layout-effect" "1.1.1" -"@smithy/util-hex-encoding@^4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@smithy/util-hex-encoding/-/util-hex-encoding-4.1.0.tgz#9b27cf0c25d0de2c8ebfe75cc20df84e5014ccc9" - integrity sha512-1LcueNN5GYC4tr8mo14yVYbh/Ur8jHhWOxniZXii+1+ePiIbsLZ5fEI0QQGtbRRP5mOhmooos+rLmVASGGoq5w== +"@radix-ui/react-use-effect-event@0.0.2": + version "0.0.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz#090cf30d00a4c7632a15548512e9152217593907" + integrity sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA== dependencies: - tslib "^2.6.2" + "@radix-ui/react-use-layout-effect" "1.1.1" -"@smithy/util-middleware@^4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-4.1.1.tgz#e19749a127499c9bdada713a8afd807d92d846e2" - integrity sha512-CGmZ72mL29VMfESz7S6dekqzCh8ZISj3B+w0g1hZFXaOjGTVaSqfAEFAq8EGp8fUL+Q2l8aqNmt8U1tglTikeg== - dependencies: - "@smithy/types" "^4.5.0" - tslib "^2.6.2" - -"@smithy/util-retry@^4.1.2": - version "4.1.2" - resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-4.1.2.tgz#8d28c27cf69643e173c75cc18ff0186deb7cefed" - integrity sha512-NCgr1d0/EdeP6U5PSZ9Uv5SMR5XRRYoVr1kRVtKZxWL3tixEL3UatrPIMFZSKwHlCcp2zPLDvMubVDULRqeunA== - dependencies: - "@smithy/service-error-classification" "^4.1.2" - "@smithy/types" "^4.5.0" - tslib "^2.6.2" +"@radix-ui/react-use-layout-effect@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz#0c4230a9eed49d4589c967e2d9c0d9d60a23971e" + integrity sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ== -"@smithy/util-stream@^4.3.2": - version "4.3.2" - resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-4.3.2.tgz#7ce40c266b1e828d73c27e545959cda4f42fd61f" - integrity sha512-Ka+FA2UCC/Q1dEqUanCdpqwxOFdf5Dg2VXtPtB1qxLcSGh5C1HdzklIt18xL504Wiy9nNUKwDMRTVCbKGoK69g== - dependencies: - "@smithy/fetch-http-handler" "^5.2.1" - "@smithy/node-http-handler" "^4.2.1" - "@smithy/types" "^4.5.0" - "@smithy/util-base64" "^4.1.0" - "@smithy/util-buffer-from" "^4.1.0" - "@smithy/util-hex-encoding" "^4.1.0" - "@smithy/util-utf8" "^4.1.0" - tslib "^2.6.2" +"@sapphire/async-queue@^1.5.2", "@sapphire/async-queue@^1.5.3": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@sapphire/async-queue/-/async-queue-1.5.5.tgz#2b18d402bb920b65b13ad4ed8dfb6c386300dd84" + integrity sha512-cvGzxbba6sav2zZkH8GPf2oGk9yYoD5qrNWdu9fRehifgnFZJMV+nuy2nON2roRO4yQQ+v7MK/Pktl/HgfsUXg== -"@smithy/util-uri-escape@^4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@smithy/util-uri-escape/-/util-uri-escape-4.1.0.tgz#ed4a5c498f1da07122ca1e3df4ca3e2c67c6c18a" - integrity sha512-b0EFQkq35K5NHUYxU72JuoheM6+pytEVUGlTwiFxWFpmddA+Bpz3LgsPRIpBk8lnPE47yT7AF2Egc3jVnKLuPg== +"@sapphire/shapeshift@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@sapphire/shapeshift/-/shapeshift-4.0.0.tgz#86c1b41002ff5d0b2ad21cbc3418b06834b89040" + integrity sha512-d9dUmWVA7MMiKobL3VpLF8P2aeanRTu6ypG2OIaEv/ZHH/SUQ2iHOVyi5wAPjQ+HmnMuL0whK9ez8I/raWbtIg== dependencies: - tslib "^2.6.2" + fast-deep-equal "^3.1.3" + lodash "^4.17.21" -"@smithy/util-utf8@^2.0.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-2.3.0.tgz#dd96d7640363259924a214313c3cf16e7dd329c5" - integrity sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A== - dependencies: - "@smithy/util-buffer-from" "^2.2.0" - tslib "^2.6.2" +"@sapphire/snowflake@3.5.3": + version "3.5.3" + resolved "https://registry.yarnpkg.com/@sapphire/snowflake/-/snowflake-3.5.3.tgz#0c102aa2ec5b34f806e9bc8625fc6a5e1d0a0c6a" + integrity sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ== -"@smithy/util-utf8@^4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-4.1.0.tgz#912c33c1a06913f39daa53da79cb8f7ab740d97b" - integrity sha512-mEu1/UIXAdNYuBcyEPbjScKi/+MQVXNIuY/7Cm5XLIWe319kDrT5SizBE95jqtmEXoDbGoZxKLCMttdZdqTZKQ== - dependencies: - "@smithy/util-buffer-from" "^4.1.0" - tslib "^2.6.2" +"@sapphire/snowflake@^3.5.3", "@sapphire/snowflake@^3.5.5": + version "3.5.5" + resolved "https://registry.yarnpkg.com/@sapphire/snowflake/-/snowflake-3.5.5.tgz#33a60ab4231e3cab29e8a0077f342125f2c8d1bd" + integrity sha512-xzvBr1Q1c4lCe7i6sRnrofxeO1QTP/LKQ6A6qy0iB4x5yfiSfARMEQEghojzTNALDTcv8En04qYNIco9/K9eZQ== -"@smithy/uuid@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@smithy/uuid/-/uuid-1.0.0.tgz#a0fd3aa879d57e2f2fd6a7308deee864a412e1cf" - integrity sha512-OlA/yZHh0ekYFnbUkmYBDQPE6fGfdrvgz39ktp8Xf+FA6BfxLejPTMDOG0Nfk5/rDySAz1dRbFf24zaAFYVXlQ== - dependencies: - tslib "^2.6.2" +"@standard-schema/spec@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.1.0.tgz#a79b55dbaf8604812f52d140b2c9ab41bc150bb8" + integrity sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w== -"@types/node@*", "@types/node@^24.5.2": +"@types/node@*": version "24.5.2" resolved "https://registry.yarnpkg.com/@types/node/-/node-24.5.2.tgz#52ceb83f50fe0fcfdfbd2a9fab6db2e9e7ef6446" integrity sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ== dependencies: undici-types "~7.12.0" -"@types/nodemailer@^7.0.1": - version "7.0.1" - resolved "https://registry.yarnpkg.com/@types/nodemailer/-/nodemailer-7.0.1.tgz#d52f769bb09745cc67e09bf3935531b992d22857" - integrity sha512-UfHAghPmGZVzaL8x9y+mKZMWyHC399+iq0MOmya5tIyenWX3lcdSb60vOmp0DocR6gCDTYTozv/ULQnREyyjkg== +"@types/node@^25.9.1": + version "25.9.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-25.9.1.tgz#3bda556db500ae4319c08e7fc9ab94f19013ba0b" + integrity sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg== + dependencies: + undici-types ">=7.24.0 <7.24.7" + +"@types/nodemailer@^8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@types/nodemailer/-/nodemailer-8.0.0.tgz#ea189a9c151c04cc65c8a2a4c668c65d952a24e2" + integrity sha512-fyf8jWULsCo0d0BuoQ75i6IeoHs47qcqxWc7yUdUcV0pOZGjUTTOvwdG1PRXUDqN/8A64yQdQdnA2pZgcdi+cA== dependencies: - "@aws-sdk/client-sesv2" "^3.839.0" "@types/node" "*" "@types/ws@^8.5.10": @@ -1267,6 +610,26 @@ resolved "https://registry.yarnpkg.com/@vladfrangu/async_event_emitter/-/async_event_emitter-2.4.6.tgz#508b6c45b03f917112a9008180b308ba0e4d1805" integrity sha512-RaI5qZo6D2CVS6sTHFKg1v5Ohq/+Bo2LZ5gzUEwZ/WkHhwtGTCB/sVLw8ijOkAUxasZ+WshN/Rzj4ywsABJ5ZA== +ajv@^8.12.0: + version "8.20.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.20.0.tgz#304b3636add88ba7d936760dd50ece006dea95f9" + integrity sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA== + dependencies: + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + +ansi-colors@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" @@ -1274,10 +637,33 @@ ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -bowser@^2.11.0: - version "2.12.1" - resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.12.1.tgz#f9ad78d7aebc472feb63dd9635e3ce2337e0e2c1" - integrity sha512-z4rE2Gxh7tvshQ4hluIT7XcFrgLIQaw9X3A+kTTRdovCz5PMukm/0QC/BKSYPj3omF5Qfypn9O/c5kgpmvYUCw== +aws-ssl-profiles@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz#157dd77e9f19b1d123678e93f120e6f193022641" + integrity sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g== + +better-result@^2.7.0: + version "2.9.2" + resolved "https://registry.yarnpkg.com/better-result/-/better-result-2.9.2.tgz#34da6e0e352bd44e4252acb88e2a4a35ec4c335e" + integrity sha512-WIFoBPCdnTOdk9inkE1ZRvCZ4P0CpSkAiLlchC65N7n9DcjZ3NhqkBOlafzpOVnO8ixyi37kicmSJ3ENhPZl7Q== + +c12@3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/c12/-/c12-3.3.4.tgz#1253a5faf8b61244884d42459b4a6412571fe9f3" + integrity sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA== + dependencies: + chokidar "^5.0.0" + confbox "^0.2.4" + defu "^6.1.6" + dotenv "^17.3.1" + exsolve "^1.0.8" + giget "^3.2.0" + jiti "^2.6.1" + ohash "^2.0.11" + pathe "^2.0.3" + perfect-debounce "^2.1.0" + pkg-types "^2.3.0" + rc9 "^3.0.1" chalk@^3.0.0: version "3.0.0" @@ -1287,6 +673,20 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chart.js@4.5.1: + version "4.5.1" + resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-4.5.1.tgz#19dd1a9a386a3f6397691672231cb5fc9c052c35" + integrity sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw== + dependencies: + "@kurkle/color" "^0.3.0" + +chokidar@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-5.0.0.tgz#949c126a9238a80792be9a0265934f098af369a5" + integrity sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw== + dependencies: + readdirp "^5.0.0" + color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" @@ -1304,7 +704,12 @@ commander@^11.1.0: resolved "https://registry.yarnpkg.com/commander/-/commander-11.1.0.tgz#62fdce76006a68e5c1ab3314dc92e800eb83d906" integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== -cross-spawn@^7.0.3: +confbox@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.2.4.tgz#592e7be71f882a4a874e3c88f0ac1ef6f7da1ce5" + integrity sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ== + +cross-spawn@^7.0.3, cross-spawn@^7.0.6: version "7.0.6" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== @@ -1313,11 +718,36 @@ cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +deepmerge-ts@7.1.5: + version "7.1.5" + resolved "https://registry.yarnpkg.com/deepmerge-ts/-/deepmerge-ts-7.1.5.tgz#ff818564007f5c150808d2b7b732cac83aa415ab" + integrity sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw== + +defu@^6.1.6: + version "6.1.7" + resolved "https://registry.yarnpkg.com/defu/-/defu-6.1.7.tgz#72543567c8e9f97ff13ce402b6dbe09ac5ae4d23" + integrity sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ== + +denque@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1" + integrity sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw== + +destr@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/destr/-/destr-2.0.5.tgz#7d112ff1b925fb8d2079fac5bdb4a90973b51fdb" + integrity sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA== + discord-api-types@^0.38.1, discord-api-types@^0.38.16: version "0.38.26" resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.38.26.tgz#d30f6bf0a4725b0a5ea46e0a12cef0b8880bbc9a" integrity sha512-xpmPviHjIJ6dFu1eNwNDIGQ3N6qmPUUYFVAx/YZ64h7ZgPkTcKjnciD8bZe8Vbeji7yS5uYljyciunpq0J5NSw== +discord-api-types@^0.38.33, discord-api-types@^0.38.40: + version "0.38.48" + resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.38.48.tgz#305894ebecc26547693b70eb12894c38e064bd8b" + integrity sha512-WFUE/2o0lBlLeCQonQ+Pu2RqHAqbytBJ2RlXR91gzk05InSS6k9ShzzLYoymrA4c2oRgRKGE7/VqQJNNdGWSxQ== + discord-sync-commands@^0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/discord-sync-commands/-/discord-sync-commands-0.5.2.tgz#093aa08894980e5158a672139077d675d94c5f4c" @@ -1325,7 +755,7 @@ discord-sync-commands@^0.5.2: dependencies: discord.js "^14.20.0" -discord.js@^14.20.0, discord.js@^14.22.1: +discord.js@^14.20.0: version "14.22.1" resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-14.22.1.tgz#aa364cf0108b41bac3eaa9fa1aae836d0882a91c" integrity sha512-3k+Kisd/v570Jr68A1kNs7qVhNehDwDJAPe4DZ2Syt+/zobf9zEcuYFvsfIaAOgCa0BiHMfOOKQY4eYINl0z7w== @@ -1344,11 +774,35 @@ discord.js@^14.20.0, discord.js@^14.22.1: tslib "^2.6.3" undici "6.21.3" +discord.js@^14.26.4: + version "14.26.4" + resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-14.26.4.tgz#090b1b906055f6f0be64fac2c72161a98146b346" + integrity sha512-4oBp8tc6Kf8IDBwAHhbsMaAqx1b5fob9SNasZT7V6yyyUydoO5i5fGuX7TmvRtR+q/WgKRnRViRoAWnG7fNyvA== + dependencies: + "@discordjs/builders" "^1.14.1" + "@discordjs/collection" "1.5.3" + "@discordjs/formatters" "^0.6.2" + "@discordjs/rest" "^2.6.1" + "@discordjs/util" "^1.2.0" + "@discordjs/ws" "^1.2.3" + "@sapphire/snowflake" "3.5.3" + discord-api-types "^0.38.40" + fast-deep-equal "3.1.3" + lodash.snakecase "4.1.1" + magic-bytes.js "^1.13.0" + tslib "^2.6.3" + undici "6.24.1" + dotenv@^17.2.1: version "17.2.2" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-17.2.2.tgz#4010cfe1c2be4fc0f46fd3d951afb424bc067ac6" integrity sha512-Sf2LSQP+bOlhKWWyhFsn0UsfdK/kCWRv1iuA2gXAwt3dyNabr6QSj00I2V10pidqz69soatm9ZwZvpQMTIOd5Q== +dotenv@^17.3.1: + version "17.4.2" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-17.4.2.tgz#c07e54a746e11eba021dd9e1047ced5afdc1c034" + integrity sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw== + eciesjs@^0.4.10: version "0.4.15" resolved "https://registry.yarnpkg.com/eciesjs/-/eciesjs-0.4.15.tgz#8c7191ce425c54627ee5c65328ab54eaa6ed4556" @@ -1359,37 +813,63 @@ eciesjs@^0.4.10: "@noble/curves" "^1.9.1" "@noble/hashes" "^1.8.0" -esbuild@~0.25.0: - version "0.25.10" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.10.tgz#37f5aa5cd14500f141be121c01b096ca83ac34a9" - integrity sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ== +effect@3.20.0: + version "3.20.0" + resolved "https://registry.yarnpkg.com/effect/-/effect-3.20.0.tgz#827752d2c90f0a12562f1fdac3bf0197d067fd6a" + integrity sha512-qMLfDJscrNG8p/aw+IkT9W7fgj50Z4wG5bLBy0Txsxz8iUHjDIkOgO3SV0WZfnQbNG2VJYb0b+rDLMrhM4+Krw== + dependencies: + "@standard-schema/spec" "^1.0.0" + fast-check "^3.23.1" + +empathic@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/empathic/-/empathic-2.0.0.tgz#71d3c2b94fad49532ef98a6c34be0386659f6131" + integrity sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA== + +enquirer@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== + dependencies: + ansi-colors "^4.1.1" + strip-ansi "^6.0.1" + +env-paths@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-3.0.0.tgz#2f1e89c2f6dbd3408e1b1711dd82d62e317f58da" + integrity sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A== + +esbuild@~0.28.0: + version "0.28.0" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.28.0.tgz#5dee347ffb3e3874212a35a69836b077b1ce6d96" + integrity sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw== optionalDependencies: - "@esbuild/aix-ppc64" "0.25.10" - "@esbuild/android-arm" "0.25.10" - "@esbuild/android-arm64" "0.25.10" - "@esbuild/android-x64" "0.25.10" - "@esbuild/darwin-arm64" "0.25.10" - "@esbuild/darwin-x64" "0.25.10" - "@esbuild/freebsd-arm64" "0.25.10" - "@esbuild/freebsd-x64" "0.25.10" - "@esbuild/linux-arm" "0.25.10" - "@esbuild/linux-arm64" "0.25.10" - "@esbuild/linux-ia32" "0.25.10" - "@esbuild/linux-loong64" "0.25.10" - "@esbuild/linux-mips64el" "0.25.10" - "@esbuild/linux-ppc64" "0.25.10" - "@esbuild/linux-riscv64" "0.25.10" - "@esbuild/linux-s390x" "0.25.10" - "@esbuild/linux-x64" "0.25.10" - "@esbuild/netbsd-arm64" "0.25.10" - "@esbuild/netbsd-x64" "0.25.10" - "@esbuild/openbsd-arm64" "0.25.10" - "@esbuild/openbsd-x64" "0.25.10" - "@esbuild/openharmony-arm64" "0.25.10" - "@esbuild/sunos-x64" "0.25.10" - "@esbuild/win32-arm64" "0.25.10" - "@esbuild/win32-ia32" "0.25.10" - "@esbuild/win32-x64" "0.25.10" + "@esbuild/aix-ppc64" "0.28.0" + "@esbuild/android-arm" "0.28.0" + "@esbuild/android-arm64" "0.28.0" + "@esbuild/android-x64" "0.28.0" + "@esbuild/darwin-arm64" "0.28.0" + "@esbuild/darwin-x64" "0.28.0" + "@esbuild/freebsd-arm64" "0.28.0" + "@esbuild/freebsd-x64" "0.28.0" + "@esbuild/linux-arm" "0.28.0" + "@esbuild/linux-arm64" "0.28.0" + "@esbuild/linux-ia32" "0.28.0" + "@esbuild/linux-loong64" "0.28.0" + "@esbuild/linux-mips64el" "0.28.0" + "@esbuild/linux-ppc64" "0.28.0" + "@esbuild/linux-riscv64" "0.28.0" + "@esbuild/linux-s390x" "0.28.0" + "@esbuild/linux-x64" "0.28.0" + "@esbuild/netbsd-arm64" "0.28.0" + "@esbuild/netbsd-x64" "0.28.0" + "@esbuild/openbsd-arm64" "0.28.0" + "@esbuild/openbsd-x64" "0.28.0" + "@esbuild/openharmony-arm64" "0.28.0" + "@esbuild/sunos-x64" "0.28.0" + "@esbuild/win32-arm64" "0.28.0" + "@esbuild/win32-ia32" "0.28.0" + "@esbuild/win32-x64" "0.28.0" execa@^5.1.1: version "5.1.1" @@ -1406,69 +886,120 @@ execa@^5.1.1: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +exsolve@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/exsolve/-/exsolve-1.0.8.tgz#7f5e34da61cd1116deda5136e62292c096f50613" + integrity sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA== + +fast-check@^3.23.1: + version "3.23.2" + resolved "https://registry.yarnpkg.com/fast-check/-/fast-check-3.23.2.tgz#0129f1eb7e4f500f58e8290edc83c670e4a574a2" + integrity sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A== + dependencies: + pure-rand "^6.1.0" + fast-deep-equal@3.1.3, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-xml-parser@5.2.5: - version "5.2.5" - resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz#4809fdfb1310494e341098c25cb1341a01a9144a" - integrity sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ== - dependencies: - strnum "^2.1.0" +fast-uri@^3.0.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.2.tgz#8af3d4fc9d3e71b11572cc2673b514a7d1a8c8ec" + integrity sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ== fdir@^6.2.0: version "6.5.0" resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== -follow-redirects@^1.15.6: - version "1.15.9" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" - integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== - -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== +foreground-child@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" + integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" + cross-spawn "^7.0.6" + signal-exit "^4.0.1" -fsevents@2.3.3, fsevents@~2.3.3: +fsevents@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== +generate-function@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.3.1.tgz#f069617690c10c868e73b8465746764f97c3479f" + integrity sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ== + dependencies: + is-property "^1.0.2" + +get-port-please@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/get-port-please/-/get-port-please-3.2.0.tgz#0ce3cee194c448ac640ec39dc357a500f5d7d2bb" + integrity sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A== + get-stream@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -get-tsconfig@^4.7.5: - version "4.10.1" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.10.1.tgz#d34c1c01f47d65a606c37aa7a177bc3e56ab4b2e" - integrity sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ== - dependencies: - resolve-pkg-maps "^1.0.0" +giget@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/giget/-/giget-3.2.0.tgz#bacfdd1264f81485a915928b0ae219be0e81a7c9" + integrity sha512-GvHTWcykIR/fP8cj8dMpuMMkvaeJfPvYnhq0oW+chSeIr+ldX21ifU2Ms6KBoyKZQZmVaUAAhQ2EZ68KJF8a7A== + +graceful-fs@^4.2.4: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +grammex@^3.1.11: + version "3.1.12" + resolved "https://registry.yarnpkg.com/grammex/-/grammex-3.1.12.tgz#08f021dd2cad009e64248fb53247cc6108788404" + integrity sha512-6ufJOsSA7LcQehIJNCO7HIBykfM7DXQual0Ny780/DEcJIpBlHRvcqEBWGPYd7hrXL2GJ3oJI1MIhaXjWmLQOQ== + +graphmatch@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/graphmatch/-/graphmatch-1.1.1.tgz#dcec68e8cb74de0a372d5252fc06e241daf71c38" + integrity sha512-5ykVn/EXM1hF0XCaWh05VbYvEiOL2lY1kBxZtaYsyvjp7cmWOU1XsAdfQBwClraEofXDT197lFbXOEVMHpvQOg== has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +hono@^4.12.8: + version "4.12.23" + resolved "https://registry.yarnpkg.com/hono/-/hono-4.12.23.tgz#998b91651686149f0e6edbb8564d604da04f3cf8" + integrity sha512-eIaZ9qDgu7XV0pxOCrg7/WhnQ6Ivm22UcxhXx/A3dcbqbbYgBEkc6e/J/s7j2tS96zoB0S9VBdLwQNCWwUo4LA== + +http-status-codes@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/http-status-codes/-/http-status-codes-2.3.0.tgz#987fefb28c69f92a43aecc77feec2866349a8bfc" + integrity sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA== + human-signals@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== +iconv-lite@^0.7.0: + version "0.7.2" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.7.2.tgz#d0bdeac3f12b4835b7359c2ad89c422a4d1cc72e" + integrity sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + ignore@^5.3.0: version "5.3.2" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== +is-property@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + integrity sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g== + is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" @@ -1484,6 +1015,16 @@ isexe@^3.1.1: resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== +jiti@^2.6.1: + version "2.7.0" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-2.7.0.tgz#974228f2f4ca2bc21885a1797b45fea68e950c64" + integrity sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + lodash.snakecase@4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" @@ -1494,11 +1035,26 @@ lodash@^4.17.21: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +long@^5.2.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/long/-/long-5.3.2.tgz#1d84463095999262d7d7b7f8bfd4a8cc55167f83" + integrity sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA== + +lru.min@^1.0.0, lru.min@^1.1.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/lru.min/-/lru.min-1.1.4.tgz#6ea1737a8c1ba2300cc87ad46910a4bdffa0117b" + integrity sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA== + magic-bytes.js@^1.10.0: version "1.12.1" resolved "https://registry.yarnpkg.com/magic-bytes.js/-/magic-bytes.js-1.12.1.tgz#031fedceb1fc652c1ccd917c6b45a6e8d6554245" integrity sha512-ThQLOhN86ZkJ7qemtVRGYM+gRgR8GEXNli9H/PMvpnZsE44Xfh3wx9kGJaldg314v85m+bFW6WBMaVHJc/c3zA== +magic-bytes.js@^1.13.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/magic-bytes.js/-/magic-bytes.js-1.13.0.tgz#b86cc065639368599034ec67941da39d88d7795e" + integrity sha512-afO2mnxW7GDTXMm5/AoN1WuOcdoKhtgXjIvHmobqTD1grNplhGdv3PFOyjCVmrnOZBIT/gD/koDKpYG+0mvHcg== + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -1514,10 +1070,32 @@ moment@^2.24.0: resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== -nodemailer@^7.0.6: - version "7.0.6" - resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-7.0.6.tgz#e850630242e28c64fd666c7f6ca8382baf5a5661" - integrity sha512-F44uVzgwo49xboqbFgBGkRaiMgtoBrBEWCVincJPK9+S9Adkzt/wXCLKbf7dxucmxfTI5gHGB+bEmdyzN6QKjw== +mysql2@3.15.3: + version "3.15.3" + resolved "https://registry.yarnpkg.com/mysql2/-/mysql2-3.15.3.tgz#f0348d9c7401bb98cb1f45ffc5a773b109f70808" + integrity sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg== + dependencies: + aws-ssl-profiles "^1.1.1" + denque "^2.1.0" + generate-function "^2.3.1" + iconv-lite "^0.7.0" + long "^5.2.1" + lru.min "^1.0.0" + named-placeholders "^1.1.3" + seq-queue "^0.0.5" + sqlstring "^2.3.2" + +named-placeholders@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/named-placeholders/-/named-placeholders-1.1.6.tgz#c50c6920b43f258f59c16add1e56654f5cc02bb5" + integrity sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w== + dependencies: + lru.min "^1.1.0" + +nodemailer@^8.0.9: + version "8.0.9" + resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-8.0.9.tgz#9ea0bdb84b04b1ee65d83b15aa7d62761e9b5677" + integrity sha512-5ofa7BUN8+C+Hckh5V2GjeeOGRQBx0CJQA6KxrvuZfC8iU4/q7sLn8XrtEEhJkjV6HdyIiQs7Bba6bTao8JhkA== npm-run-path@^4.0.1: version "4.0.1" @@ -1531,6 +1109,11 @@ object-treeify@1.1.33: resolved "https://registry.yarnpkg.com/object-treeify/-/object-treeify-1.1.33.tgz#f06fece986830a3cba78ddd32d4c11d1f76cdf40" integrity sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A== +ohash@^2.0.11: + version "2.0.11" + resolved "https://registry.yarnpkg.com/ohash/-/ohash-2.0.11.tgz#60b11e8cff62ca9dee88d13747a5baa145f5900b" + integrity sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ== + onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" @@ -1543,29 +1126,98 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -picomatch@^4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" - integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== +pathe@2.0.3, pathe@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" + integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== -prisma@^5.22.0: - version "5.22.0" - resolved "https://registry.yarnpkg.com/prisma/-/prisma-5.22.0.tgz#1f6717ff487cdef5f5799cc1010459920e2e6197" - integrity sha512-vtpjW3XuYCSnMsNVBjLMNkTj6OZbudcPPTPYHqX0CJfpcdWciI1dM8uHETwmDxxiqEwCIE6WvXucWUetJgfu/A== +perfect-debounce@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/perfect-debounce/-/perfect-debounce-2.1.0.tgz#e7078e38f231cb191855c3136a4423aef725d261" + integrity sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g== + +picomatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.4.tgz#fd6f5e00a143086e074dffe4c924b8fb293b0589" + integrity sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A== + +pkg-types@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-2.3.1.tgz#fa27ed0940efcf40bba453b0e5cab41217b0d442" + integrity sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg== + dependencies: + confbox "^0.2.4" + exsolve "^1.0.8" + pathe "^2.0.3" + +postgres@3.4.7: + version "3.4.7" + resolved "https://registry.yarnpkg.com/postgres/-/postgres-3.4.7.tgz#122f460a808fe300cae53f592108b9906e625345" + integrity sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw== + +prisma@^7.8.0: + version "7.8.0" + resolved "https://registry.yarnpkg.com/prisma/-/prisma-7.8.0.tgz#f64db69e59131fe10859efb5969af1c7e50e6620" + integrity sha512-yfN4yrw7HV9kEJhoy1+jgah0jafEIQsf7uWouSsM8MvJtlubsk+kM7AIBWZ8+GJl74Yj3c+nbYqBkMOxtsZ3Lw== + dependencies: + "@prisma/config" "7.8.0" + "@prisma/dev" "0.24.3" + "@prisma/engines" "7.8.0" + "@prisma/studio-core" "0.27.3" + mysql2 "3.15.3" + postgres "3.4.7" + +proper-lockfile@4.1.2, proper-lockfile@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-4.1.2.tgz#c8b9de2af6b2f1601067f98e01ac66baa223141f" + integrity sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA== dependencies: - "@prisma/engines" "5.22.0" - optionalDependencies: - fsevents "2.3.3" + graceful-fs "^4.2.4" + retry "^0.12.0" + signal-exit "^3.0.2" -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== +pure-rand@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" + integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== -resolve-pkg-maps@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" - integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== +rc9@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/rc9/-/rc9-3.0.1.tgz#3895e5834a2b5c2d8fb76d93e802fbcbc2579bc7" + integrity sha512-gMDyleLWVE+i6Sgtc0QbbY6pEKqYs97NGi6isHQPqYlLemPoO8dxQ3uGi0f4NiP98c+jMW6cG1Kx9dDwfvqARQ== + dependencies: + defu "^6.1.6" + destr "^2.0.5" + +readdirp@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-5.0.0.tgz#fbf1f71a727891d685bb1786f9ba74084f6e2f91" + integrity sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ== + +remeda@2.33.4: + version "2.33.4" + resolved "https://registry.yarnpkg.com/remeda/-/remeda-2.33.4.tgz#eae3bb2ec9795db58a1b66249913772a1a2c7989" + integrity sha512-ygHswjlc/opg2VrtiYvUOPLjxjtdKvjGz1/plDhkG66hjNjFr1xmfrs2ClNFo/E6TyUFiwYNh53bKV26oBoMGQ== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +seq-queue@^0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/seq-queue/-/seq-queue-0.0.5.tgz#d56812e1c017a6e4e7c3e3a37a1da6d78dd3c93e" + integrity sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q== shebang-command@^2.0.0: version "2.0.0" @@ -1579,21 +1231,38 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -signal-exit@^3.0.3: +signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +sqlstring@^2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/sqlstring/-/sqlstring-2.3.3.tgz#2ddc21f03bce2c387ed60680e739922c65751d0c" + integrity sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg== + +std-env@3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.10.0.tgz#d810b27e3a073047b2b5e40034881f5ea6f9c83b" + integrity sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg== + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strnum@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/strnum/-/strnum-2.1.1.tgz#cf2a6e0cf903728b8b2c4b971b7e36b4e82d46ab" - integrity sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw== - supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" @@ -1623,20 +1292,24 @@ tslib@^2.6.2, tslib@^2.6.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== -tsx@^4.20.5: - version "4.20.5" - resolved "https://registry.yarnpkg.com/tsx/-/tsx-4.20.5.tgz#856c8b2f114c50a9f4ae108126967a167f240dc7" - integrity sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw== +tsx@^4.22.3: + version "4.22.3" + resolved "https://registry.yarnpkg.com/tsx/-/tsx-4.22.3.tgz#7ca7cb34028e3e247f1fad300c157e42a90a1f50" + integrity sha512-mdoNxBC/cSQObGGVQ5Bpn5i+yv7j68gk3Nfm3wFjcJg3Z0Mix9jzAFfP12prmm5eVGmDKtp0yyArrs0Q+8gZHg== dependencies: - esbuild "~0.25.0" - get-tsconfig "^4.7.5" + esbuild "~0.28.0" optionalDependencies: fsevents "~2.3.3" -typescript@^5.9.2: - version "5.9.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.2.tgz#d93450cddec5154a2d5cabe3b8102b83316fb2a6" - integrity sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A== +typescript@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-6.0.3.tgz#90251dc007916e972786cb94d74d15b185577d21" + integrity sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw== + +"undici-types@>=7.24.0 <7.24.7": + version "7.24.6" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.24.6.tgz#61275b485d7fd4e9d269c7cf04ec2873c9cc0f91" + integrity sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg== undici-types@~7.12.0: version "7.12.0" @@ -1648,6 +1321,16 @@ undici@6.21.3: resolved "https://registry.yarnpkg.com/undici/-/undici-6.21.3.tgz#185752ad92c3d0efe7a7d1f6854a50f83b552d7a" integrity sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw== +undici@6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/undici/-/undici-6.24.1.tgz#9df1425cede20b836d95634347946f79578b7e71" + integrity sha512-sC+b0tB1whOCzbtlx20fx3WgCXwkW627p4EA9uM+/tNNPkSS+eSEld6pAs9nDv7WbY1UUljBMYPtu9BCOrCWKA== + +valibot@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/valibot/-/valibot-1.2.0.tgz#8fc720d9e4082ba16e30a914064a39619b2f1d6f" + integrity sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg== + which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -1666,3 +1349,23 @@ ws@^8.17.0: version "8.18.3" resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.3.tgz#b56b88abffde62791c639170400c93dcb0c95472" integrity sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg== + +yocto-spinner@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/yocto-spinner/-/yocto-spinner-1.2.0.tgz#2892d776c682ddb0c20888fef20eaaced6c9bcf1" + integrity sha512-Yw0hUB6UA3o4YUgKy3oSe9a4cxoaZ9sBfYDw+JSxo6Id0KoJGoxzPA24qqUXYKBWABs/zDSGTz9kww7t3F0XGw== + dependencies: + yoctocolors "^2.1.1" + +yoctocolors@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yoctocolors/-/yoctocolors-2.1.2.tgz#d795f54d173494e7d8db93150cec0ed7f678c83a" + integrity sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug== + +zeptomatch@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/zeptomatch/-/zeptomatch-2.1.0.tgz#cca2cb2c61308d0c26f9689e6640f6335d0f2101" + integrity sha512-KiGErG2J0G82LSpniV0CtIzjlJ10E04j02VOudJsPyPwNZgGnRKQy7I1R7GMyg/QswnE4l7ohSGrQbQbjXPPDA== + dependencies: + grammex "^3.1.11" + graphmatch "^1.1.0" From 322f51f5f89f4b89f991cb2d3506ca06459fb705 Mon Sep 17 00:00:00 2001 From: HunteRoi Date: Thu, 28 May 2026 00:14:02 +0200 Subject: [PATCH 3/9] refactor(seed): use top-level await --- prisma/seed.ts | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/prisma/seed.ts b/prisma/seed.ts index 69da1f8..2e5c08a 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -1,21 +1,28 @@ -import { PrismaClient } from '@prisma/client' +import { PrismaClient } from "@prisma/client"; const database = new PrismaClient(); async function main() { database.job.upsert({ where: { jobid: 1 }, - create: { jobid: 1, schedule: '0 0 * * *', command: 'DELETE FROM Users WHERE isDeleted IS NOT NULL AND isDeleted < NOW() - INTERVAL \'6 months\'' }, - update: { schedule: '0 0 * * *', command: 'DELETE FROM Users WHERE isDeleted IS NOT NULL AND isDeleted < NOW() - INTERVAL \'6 months\'' } + create: { + jobid: 1, + schedule: "0 0 * * *", + command: + "DELETE FROM Users WHERE isDeleted IS NOT NULL AND isDeleted < NOW() - INTERVAL '6 months'", + }, + update: { + schedule: "0 0 * * *", + command: + "DELETE FROM Users WHERE isDeleted IS NOT NULL AND isDeleted < NOW() - INTERVAL '6 months'", + }, }); } -main() - .then(async () => { - await database.$disconnect(); - }) - .catch(async (e) => { - console.error(e); - await database.$disconnect(); - process.exit(1); - }); +try { + await main(); +} catch (e) { + console.error(e); +} finally { + await database.$disconnect(); +} From 96c5bce395849779361f0ecd0dbf084c6c7dca8d Mon Sep 17 00:00:00 2001 From: HunteRoi Date: Thu, 28 May 2026 00:40:03 +0200 Subject: [PATCH 4/9] refactor(PostgresDatabaseService): upgrade to ts-postgres v2 --- package.json | 2 +- src/services/PostgresDatabaseService.ts | 33 +++++++++++-------------- yarn.lock | 15 +++-------- 3 files changed, 20 insertions(+), 30 deletions(-) diff --git a/package.json b/package.json index d36ff16..bfc9b6a 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "discord-sync-commands": "^0.5.2", "discord.js": "^14.26.4", "nodemailer": "^8.0.9", - "ts-postgres": "1.3.0" + "ts-postgres": "2.0.4" }, "devDependencies": { "@biomejs/biome": "^2.4.16", diff --git a/src/services/PostgresDatabaseService.ts b/src/services/PostgresDatabaseService.ts index cb8961d..bae09d0 100644 --- a/src/services/PostgresDatabaseService.ts +++ b/src/services/PostgresDatabaseService.ts @@ -1,10 +1,10 @@ import type { ConsoleLogger } from "@hunteroi/advanced-logger"; import type { Snowflake } from "discord.js"; import { - Client, + type Client, + connect, type DatabaseError, type PreparedStatement, - type Value, } from "ts-postgres"; import { getErrorMessage } from "../helpers.js"; @@ -12,7 +12,7 @@ import type { IDatabaseService, User } from "../models/index.js"; export class PostgresDatabaseService implements IDatabaseService { readonly #logger: ConsoleLogger; - readonly #database: Client; + #database!: Client; /** * Creates an instance of DatabaseService. @@ -21,7 +21,13 @@ export class PostgresDatabaseService implements IDatabaseService { */ constructor(logger: ConsoleLogger) { this.#logger = logger; - this.#database = new Client({ + } + + /** + * @inherited + */ + public async start(): Promise { + this.#database = await connect({ user: process.env.POSTGRES_USER, password: process.env.POSTGRES_PASSWORD, host: process.env.DATABASE_HOST, @@ -29,13 +35,6 @@ export class PostgresDatabaseService implements IDatabaseService { database: process.env.POSTGRES_DB, }); this.#listenToDatabaseEvents(); - } - - /** - * @inherited - */ - public async start(): Promise { - await this.#database.connect(); await this.#database.query(`CREATE TABLE IF NOT EXISTS Migrations ( id serial PRIMARY KEY, @@ -230,9 +229,6 @@ export class PostgresDatabaseService implements IDatabaseService { } #listenToDatabaseEvents() { - this.#database.on("connect", () => - this.#logger.info("Connexion établie avec la base de données!"), - ); this.#database.on("end", () => this.#logger.info("Connexion fermée avec la base de données!"), ); @@ -266,7 +262,7 @@ export class PostgresDatabaseService implements IDatabaseService { } // biome-ignore lint/suspicious/noExplicitAny: DB values can be of any type - #deconstructValues(values: [string, any][]): Value[] { + #deconstructValues(values: [string, any][]): any[] { return values.flatMap(([, v]) => v instanceof Object && typeof v !== "bigint" ? JSON.stringify(v) @@ -276,15 +272,16 @@ export class PostgresDatabaseService implements IDatabaseService { async #executeStatement( statement: PreparedStatement, - values: Value[] = [], + // biome-ignore lint/suspicious/noExplicitAny: DB values can be of any type + values: any[] = [], isSelect = true, ): Promise { const notFoundMessage = "User not found"; try { - const entities = await statement.execute(values); + const result = await statement.execute(values); if (!isSelect) return null; - const entity = [...entities].pop(); + const entity = result.rows.at(-1); if (!entity) throw new Error(notFoundMessage); const asDate = (value: string | undefined | null): Date | null => diff --git a/yarn.lock b/yarn.lock index 8165045..2b95eea 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1275,17 +1275,10 @@ ts-mixer@^6.0.4: resolved "https://registry.yarnpkg.com/ts-mixer/-/ts-mixer-6.0.4.tgz#1da39ceabc09d947a82140d9f09db0f84919ca28" integrity sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA== -ts-postgres@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/ts-postgres/-/ts-postgres-1.3.0.tgz#b58e3335545acd7d37d5821ff0aeb1146d9d37e5" - integrity sha512-YQY6omZM9RiMeJpzyVn36ankicZnTbSTkHaq+NTkqrLHSRYigsNW9JsPwrZXxLt1es3mV+V6/VUj0eOVcYXq1g== - dependencies: - ts-typed-events "^3.0.0" - -ts-typed-events@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ts-typed-events/-/ts-typed-events-3.0.0.tgz#2f9d96ff962edfc936402c859370337373880faa" - integrity sha512-+2FZ0XPX+UPR7PO8ZQjuvnuDMYRhzrDaCRaNHaBG1xSL//0oPa3XMU5yxgDTzW67VzkE33fQpx1YxWBdkaF7Zw== +ts-postgres@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/ts-postgres/-/ts-postgres-2.0.4.tgz#06146c561d9e94c7a48673212352a037391e07e3" + integrity sha512-KQL9xd4C2tVJdV+bshA5q9KikMrqfyc1MRQCGYF5QQSBAz+prpK/b4U1wiywOLtIBzgvFfXrvEZULu3Yp7GDsg== tslib@^2.6.2, tslib@^2.6.3: version "2.8.1" From 1bbf5fc1977482845a4bf7a8efd759e0f8f1611f Mon Sep 17 00:00:00 2001 From: HunteRoi Date: Thu, 28 May 2026 00:43:16 +0200 Subject: [PATCH 5/9] refactor(PgDatabaseService): remove obsolete PG database service implementation --- src/services/PgDatabaseService.ts | 97 ------------------------------- 1 file changed, 97 deletions(-) delete mode 100644 src/services/PgDatabaseService.ts diff --git a/src/services/PgDatabaseService.ts b/src/services/PgDatabaseService.ts deleted file mode 100644 index ab04d0f..0000000 --- a/src/services/PgDatabaseService.ts +++ /dev/null @@ -1,97 +0,0 @@ -import type { Snowflake } from 'discord.js'; -import { PrismaClient } from '@prisma/client'; - -import type { ConsoleLogger } from '@hunteroi/advanced-logger'; - -import type { IDatabaseService } from '../models/IDatabaseService.js'; -import type { User } from '../models/User.js'; - -export default class PgDatabaseService extends PrismaClient implements IDatabaseService { - readonly #logger: ConsoleLogger; - - constructor(logger: ConsoleLogger) { - super(); - this.#logger = logger; - } - - async start(): Promise { - await this.$connect(); - } - - async stop(): Promise { - await this.$disconnect(); - } - - /** - * @inherited - */ - async delete(userid: Snowflake): Promise { - this.#logger.verbose( - `Suppresion de l'utilisateur sur base de l'identifiant ${userid}`, - ); - await this.users.update({ - where: { userid }, - data: { isDeleted: new Date() } - }); - } - - /** - * @inherited - */ - async undoDelete(userid: Snowflake): Promise { - this.#logger.verbose( - `Réversion de la suppresion de l'utilisateur sur base de l'identifiant ${userid}`, - ); - await this.users.update({ - where: { userid }, - data: { isDeleted: null } - }); - } - - /** - * @inherited - */ - async read(userid: Snowflake): Promise { - this.#logger.verbose( - `Lecture de l'utilisateur sur base de l'identifiant ${userid}`, - ); - return this.users.findUnique({ - where: { userid } - }); - } - - /** - * @inherited - */ - readBy( - argument: // biome-ignore lint/suspicious/noExplicitAny: DB values can be of any type - Map | ((user: User, index: string | number) => boolean), - ): Promise { - if (!(argument instanceof Map)) - throw new Error("Method not implemented."); - - this.#logger.verbose( - `Lecture de l'utilisateur sur base des filtres ${JSON.stringify(argument)}`, - ); - - const keysAndValues = [...argument.entries()].flat(); - let sqlQuery = "WHERE "; - let nbArguments = 1; - while (nbArguments <= keysAndValues.length) { - if (nbArguments > 1 && nbArguments % 2 === 0) sqlQuery += " AND "; - sqlQuery += `${keysAndValues[nbArguments]} = ${keysAndValues[++nbArguments]}`; - nbArguments++; - } - return this.$queryRaw`SELECT * FROM Users ${sqlQuery};`; - } - - /** - * @inherited - */ - async write(user: User): Promise { - this.#logger.verbose( - `Écriture de l'utilisateur ${JSON.stringify(user)}`, - ); - this.users.upsert({ create: user, update: user, where: { userid: user.userid } }); - } -} From b5c81ecb66f346b2be910346359d825cfe081731 Mon Sep 17 00:00:00 2001 From: HunteRoi Date: Sun, 7 Jun 2026 10:40:46 +0200 Subject: [PATCH 6/9] ci: move to latest job versions --- .github/workflows/build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index bb2bef8..e839896 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -13,12 +13,12 @@ jobs: strategy: matrix: - node-version: [20.x] + node-version: [25.x] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v6 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 + uses: actions/setup-node@v6 with: node-version: ${{ matrix.node-version }} cache: 'yarn' From f1f97b6a2165cc142baf0243d0bfa142fffc0a0c Mon Sep 17 00:00:00 2001 From: HunteRoi Date: Sun, 7 Jun 2026 10:40:54 +0200 Subject: [PATCH 7/9] chore: upgrade dependencies --- biome.json | 10 +- package.json | 8 +- yarn.lock | 380 +++++++++++++++++++++++++-------------------------- 3 files changed, 196 insertions(+), 202 deletions(-) diff --git a/biome.json b/biome.json index 0d61572..0e2e2b5 100644 --- a/biome.json +++ b/biome.json @@ -1,6 +1,12 @@ { - "$schema": "https://biomejs.dev/schemas/2.2.4/schema.json", - "assist": { "actions": { "source": { "organizeImports": "on" } } }, + "$schema": "https://biomejs.dev/schemas/2.4.16/schema.json", + "assist": { + "actions": { + "source": { + "organizeImports": "on" + } + } + }, "vcs": { "enabled": true, "clientKind": "git", diff --git a/package.json b/package.json index bfc9b6a..324ab7e 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ }, "homepage": "https://github.com/section-IG/DataDrop#readme", "dependencies": { - "@dotenvx/dotenvx": "^1.69.1", + "@dotenvx/dotenvx": "^1.71.0", "@hunteroi/advanced-logger": "^0.2.0", "@hunteroi/discord-selfrole": "^4.0.5", "@hunteroi/discord-temp-channels": "^3.3.1", @@ -35,15 +35,15 @@ "@prisma/client": "^7.8.0", "discord-sync-commands": "^0.5.2", "discord.js": "^14.26.4", - "nodemailer": "^8.0.9", + "nodemailer": "^8.0.10", "ts-postgres": "2.0.4" }, "devDependencies": { "@biomejs/biome": "^2.4.16", - "@types/node": "^25.9.1", + "@types/node": "^25.9.2", "@types/nodemailer": "^8.0.0", "prisma": "^7.8.0", - "tsx": "^4.22.3", + "tsx": "^4.22.4", "typescript": "^6.0.3" } } diff --git a/yarn.lock b/yarn.lock index 2b95eea..aeef1db 100644 --- a/yarn.lock +++ b/yarn.lock @@ -53,12 +53,12 @@ "@biomejs/cli-win32-x64@2.4.16": version "2.4.16" - resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-x64/-/cli-win32-x64-2.4.16.tgz#30fb75d856864ff9d3324da20c72c9f121c9ae16" + resolved "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.4.16.tgz" integrity sha512-Kp85jgoBHa05gix6UIRjfCDiUV3w/8VIdZ247VyyO2gEjaw12WEVhdIjlxp/AMzXxqxQwbxNTDVZ3Mwd2RG5rw== "@discordjs/builders@^1.11.2": version "1.11.3" - resolved "https://registry.yarnpkg.com/@discordjs/builders/-/builders-1.11.3.tgz#14b8b027e16b73136924faecaf1819b94711647c" + resolved "https://registry.npmjs.org/@discordjs/builders/-/builders-1.11.3.tgz" integrity sha512-p3kf5eV49CJiRTfhtutUCeivSyQ/l2JlKodW1ZquRwwvlOWmG9+6jFShX6x8rUiYhnP6wKI96rgN/SXMy5e5aw== dependencies: "@discordjs/formatters" "^0.6.1" @@ -71,7 +71,7 @@ "@discordjs/builders@^1.14.1": version "1.14.1" - resolved "https://registry.yarnpkg.com/@discordjs/builders/-/builders-1.14.1.tgz#c0ec04f3ae7a584296bfd1dccdda59bf580a0c89" + resolved "https://registry.npmjs.org/@discordjs/builders/-/builders-1.14.1.tgz" integrity sha512-gSKkhXLqs96TCzk66VZuHHl8z2bQMJFGwrXC0f33ngK+FLNau4hU1PYny3DNJfNdSH+gVMzE85/d5FQ2BpcNwQ== dependencies: "@discordjs/formatters" "^0.6.2" @@ -84,31 +84,31 @@ "@discordjs/collection@1.5.3": version "1.5.3" - resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-1.5.3.tgz#5a1250159ebfff9efa4f963cfa7e97f1b291be18" + resolved "https://registry.npmjs.org/@discordjs/collection/-/collection-1.5.3.tgz" integrity sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ== "@discordjs/collection@^2.1.0", "@discordjs/collection@^2.1.1": version "2.1.1" - resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-2.1.1.tgz#901917bc538c12b9c3613036d317847baee08cae" + resolved "https://registry.npmjs.org/@discordjs/collection/-/collection-2.1.1.tgz" integrity sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg== "@discordjs/formatters@^0.6.1": version "0.6.1" - resolved "https://registry.yarnpkg.com/@discordjs/formatters/-/formatters-0.6.1.tgz#211bf3eb060d8fe7fa1f020b8be3c4adad00555a" + resolved "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.6.1.tgz" integrity sha512-5cnX+tASiPCqCWtFcFslxBVUaCetB0thvM/JyavhbXInP1HJIEU+Qv/zMrnuwSsX3yWH2lVXNJZeDK3EiP4HHg== dependencies: discord-api-types "^0.38.1" "@discordjs/formatters@^0.6.2": version "0.6.2" - resolved "https://registry.yarnpkg.com/@discordjs/formatters/-/formatters-0.6.2.tgz#93c4a213ceb49c9a28e8adb65d50a027579b8c30" + resolved "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.6.2.tgz" integrity sha512-y4UPwWhH6vChKRkGdMB4odasUbHOUwy7KL+OVwF86PvT6QVOwElx+TiI1/6kcmcEe+g5YRXJFiXSXUdabqZOvQ== dependencies: discord-api-types "^0.38.33" "@discordjs/rest@^2.5.1", "@discordjs/rest@^2.6.0": version "2.6.0" - resolved "https://registry.yarnpkg.com/@discordjs/rest/-/rest-2.6.0.tgz#8c449b0d5c22a4cd9c655f5d1d53a20b05c37f10" + resolved "https://registry.npmjs.org/@discordjs/rest/-/rest-2.6.0.tgz" integrity sha512-RDYrhmpB7mTvmCKcpj+pc5k7POKszS4E2O9TYc+U+Y4iaCP+r910QdO43qmpOja8LRr1RJ0b3U+CqVsnPqzf4w== dependencies: "@discordjs/collection" "^2.1.1" @@ -123,7 +123,7 @@ "@discordjs/rest@^2.6.1": version "2.6.1" - resolved "https://registry.yarnpkg.com/@discordjs/rest/-/rest-2.6.1.tgz#53f88b5b150392e325c85d32a3ad894e9d839380" + resolved "https://registry.npmjs.org/@discordjs/rest/-/rest-2.6.1.tgz" integrity sha512-wwQdgjeaoYFiaG+atbqx6aJDpqW7JHAo0HrQkBTbYzM3/PJ3GweQIpgElNcGZ26DCUOXMyawYd0YF7vtr+fZXg== dependencies: "@discordjs/collection" "^2.1.1" @@ -138,19 +138,19 @@ "@discordjs/util@^1.1.0", "@discordjs/util@^1.1.1": version "1.1.1" - resolved "https://registry.yarnpkg.com/@discordjs/util/-/util-1.1.1.tgz#bafcde0faa116c834da1258d78ec237080bbab29" + resolved "https://registry.npmjs.org/@discordjs/util/-/util-1.1.1.tgz" integrity sha512-eddz6UnOBEB1oITPinyrB2Pttej49M9FZQY8NxgEvc3tq6ZICZ19m70RsmzRdDHk80O9NoYN/25AqJl8vPVf/g== "@discordjs/util@^1.2.0": version "1.2.0" - resolved "https://registry.yarnpkg.com/@discordjs/util/-/util-1.2.0.tgz#a45a2b643423094eb6378060c623f4d3e6d593d4" + resolved "https://registry.npmjs.org/@discordjs/util/-/util-1.2.0.tgz" integrity sha512-3LKP7F2+atl9vJFhaBjn4nOaSWahZ/yWjOvA4e5pnXkt2qyXRCHLxoBQy81GFtLGCq7K9lPm9R517M1U+/90Qg== dependencies: discord-api-types "^0.38.33" "@discordjs/ws@^1.2.3": version "1.2.3" - resolved "https://registry.yarnpkg.com/@discordjs/ws/-/ws-1.2.3.tgz#7cf80d8528366c6810c02b43ca49958ef154c3d4" + resolved "https://registry.npmjs.org/@discordjs/ws/-/ws-1.2.3.tgz" integrity sha512-wPlQDxEmlDg5IxhJPuxXr3Vy9AjYq5xCvFWGJyD7w7Np8ZGu+Mc+97LCoEc/+AYCo2IDpKioiH0/c/mj5ZR9Uw== dependencies: "@discordjs/collection" "^2.1.0" @@ -163,10 +163,10 @@ tslib "^2.6.2" ws "^8.17.0" -"@dotenvx/dotenvx@^1.69.1": - version "1.69.1" - resolved "https://registry.yarnpkg.com/@dotenvx/dotenvx/-/dotenvx-1.69.1.tgz#97f3b62c42dfc2330c4b0f13169765c5a976e13a" - integrity sha512-kwQB5KcAegxw/+NGUgXAo5ovyOSjlMhoXSSnSEpDhoHJwzMcMO0HE1U0VCYZ7jbAeCMGamed9XdWzOA5ixtTNg== +"@dotenvx/dotenvx@^1.71.0": + version "1.71.0" + resolved "https://registry.npmjs.org/@dotenvx/dotenvx/-/dotenvx-1.71.0.tgz" + integrity sha512-KEUw/mGu+EDRhYWRTNGHIimVCs9NvMFaIXOGrHSXoCteKLE5EsJnmPjOPpYorjXVg/0xG0fbdVw720azw1z4ag== dependencies: commander "^11.1.0" dotenv "^17.2.1" @@ -182,22 +182,22 @@ "@ecies/ciphers@^0.2.3": version "0.2.4" - resolved "https://registry.yarnpkg.com/@ecies/ciphers/-/ciphers-0.2.4.tgz#20a4e51f61d521e5e311eb49385d93d91087de51" + resolved "https://registry.npmjs.org/@ecies/ciphers/-/ciphers-0.2.4.tgz" integrity sha512-t+iX+Wf5nRKyNzk8dviW3Ikb/280+aEJAnw9YXvCp2tYGPSkMki+NRY+8aNLmVFv3eNtMdvViPNOPxS8SZNP+w== "@electric-sql/pglite-socket@0.1.1": version "0.1.1" - resolved "https://registry.yarnpkg.com/@electric-sql/pglite-socket/-/pglite-socket-0.1.1.tgz#af443da3a60130aee254faee4daf50fb79fb8d1f" + resolved "https://registry.npmjs.org/@electric-sql/pglite-socket/-/pglite-socket-0.1.1.tgz" integrity sha512-p2hoXw3Z3LQHwTeikdZNsFBOvXGqKY2hk51BBw+8NKND8eoH+8LFOtW9Z8CQKmTJ2qqGYu82ipqiyFZOTTXNfw== "@electric-sql/pglite-tools@0.3.1": version "0.3.1" - resolved "https://registry.yarnpkg.com/@electric-sql/pglite-tools/-/pglite-tools-0.3.1.tgz#b1b23dc45dcce22fb4d5a0505ba063923d09c105" + resolved "https://registry.npmjs.org/@electric-sql/pglite-tools/-/pglite-tools-0.3.1.tgz" integrity sha512-C+T3oivmy9bpQvSxVqXA1UDY8cB9Eb9vZHL9zxWwEUfDixbXv4G3r2LjoTdR33LD8aomR3O9ZXEO3XEwr/cUCA== "@electric-sql/pglite@0.4.1": version "0.4.1" - resolved "https://registry.yarnpkg.com/@electric-sql/pglite/-/pglite-0.4.1.tgz#a113476c3c20539756a8d77eb86d248d84a8d097" + resolved "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.4.1.tgz" integrity sha512-mZ9NzzUSYPOCnxHH1oAHPRzoMFJHY472raDKwXl/+6oPbpdJ7g8LsCN4FSaIIfkiCKHhb3iF/Zqo3NYxaIhU7Q== "@esbuild/aix-ppc64@0.28.0": @@ -327,17 +327,17 @@ "@esbuild/win32-x64@0.28.0": version "0.28.0" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz#04d90d5752b4ce65d2b6ac25eba08ff7624fe07c" + resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz" integrity sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw== "@hono/node-server@1.19.11": version "1.19.11" - resolved "https://registry.yarnpkg.com/@hono/node-server/-/node-server-1.19.11.tgz#dc419f0826dd2504e9fc86ad289d5636a0444e2f" + resolved "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.11.tgz" integrity sha512-dr8/3zEaB+p0D2n/IUrlPF1HZm586qgJNXK1a9fhg/PzdtkK7Ksd5l312tJX2yBuALqDYBlG20QEbayqPyxn+g== "@hunteroi/advanced-logger@^0.2.0": version "0.2.0" - resolved "https://registry.yarnpkg.com/@hunteroi/advanced-logger/-/advanced-logger-0.2.0.tgz#750064e84e2eb04e3e838c789815d41547572876" + resolved "https://registry.npmjs.org/@hunteroi/advanced-logger/-/advanced-logger-0.2.0.tgz" integrity sha512-KWxMQtGXjHIrEfv8VtTxjZEwAHtJQGpyV771WKqGKwCMpbB8ULIIocRri9ncntW9qixjpPpWDgii7xbznuzqRQ== dependencies: chalk "^3.0.0" @@ -345,56 +345,56 @@ "@hunteroi/discord-selfrole@^4.0.5": version "4.0.5" - resolved "https://registry.yarnpkg.com/@hunteroi/discord-selfrole/-/discord-selfrole-4.0.5.tgz#28bd5a4e02483c4f6db2f8a550d984b07882d4a3" + resolved "https://registry.npmjs.org/@hunteroi/discord-selfrole/-/discord-selfrole-4.0.5.tgz" integrity sha512-oBxE0nY/NsV8hds0CdzJhz5jVdaOXCLPdFqBmVxG6qHDF1quccEgJN/hM3CVXwT4BrQlk2/ezNkrTnmiQlIq/w== "@hunteroi/discord-temp-channels@^3.3.1": version "3.3.1" - resolved "https://registry.yarnpkg.com/@hunteroi/discord-temp-channels/-/discord-temp-channels-3.3.1.tgz#351f6657ab5482b31507b9d8e925481c05fa216c" + resolved "https://registry.npmjs.org/@hunteroi/discord-temp-channels/-/discord-temp-channels-3.3.1.tgz" integrity sha512-zm0aJVnh3Nnyk5ImUhxzecWwHvlvOZICK8+8uKeiHXtrvj9gkJyYUGTWM7rvDg6BASjSlTVkLEbD5WdzOgjMiw== "@hunteroi/discord-verification@^1.5.2": version "1.5.2" - resolved "https://registry.yarnpkg.com/@hunteroi/discord-verification/-/discord-verification-1.5.2.tgz#fcb6bbc626d11af2230f625f011323f5fa7edc04" + resolved "https://registry.npmjs.org/@hunteroi/discord-verification/-/discord-verification-1.5.2.tgz" integrity sha512-F31p2ARYAm16tjbRadio898ype5nmhAI0eJ1vUXo08posyrxxW07VxNiy6hV09FulaM2+KwPYn7pXAZMGC2dMg== "@kurkle/color@^0.3.0": version "0.3.4" - resolved "https://registry.yarnpkg.com/@kurkle/color/-/color-0.3.4.tgz#4d4ff677e1609214fc71c580125ddddd86abcabf" + resolved "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz" integrity sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w== "@noble/ciphers@^1.3.0": version "1.3.0" - resolved "https://registry.yarnpkg.com/@noble/ciphers/-/ciphers-1.3.0.tgz#f64b8ff886c240e644e5573c097f86e5b43676dc" + resolved "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz" integrity sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw== "@noble/curves@^1.9.1": version "1.9.7" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.9.7.tgz#79d04b4758a43e4bca2cbdc62e7771352fa6b951" + resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz" integrity sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw== dependencies: "@noble/hashes" "1.8.0" "@noble/hashes@1.8.0", "@noble/hashes@^1.8.0": version "1.8.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.8.0.tgz#cee43d801fcef9644b11b8194857695acd5f815a" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz" integrity sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A== "@prisma/client-runtime-utils@7.8.0": version "7.8.0" - resolved "https://registry.yarnpkg.com/@prisma/client-runtime-utils/-/client-runtime-utils-7.8.0.tgz#202c0a2ac295e19677debd4a2d18dc35f9ccfb21" + resolved "https://registry.npmjs.org/@prisma/client-runtime-utils/-/client-runtime-utils-7.8.0.tgz" integrity sha512-5NQZztQ0oY/ADFkmd9gPuweH5A1/CCY8YQPorLLO0Mu6a87mY5gsnDkzmFmIHs9NFaLnZojzgddFVN4RpKYrdw== "@prisma/client@^7.8.0": version "7.8.0" - resolved "https://registry.yarnpkg.com/@prisma/client/-/client-7.8.0.tgz#dce2fb00238c733f6bedeb769547b01f69b86d42" + resolved "https://registry.npmjs.org/@prisma/client/-/client-7.8.0.tgz" integrity sha512-HFp3Dawv/3sU3JtlPha90IB+48lS7zHiH4LKZPjmcE8YH5P9DOXGPvo8dqOtO7MqLDd1p2hOWMcFlRT1DMblHw== dependencies: "@prisma/client-runtime-utils" "7.8.0" "@prisma/config@7.8.0": version "7.8.0" - resolved "https://registry.yarnpkg.com/@prisma/config/-/config-7.8.0.tgz#401f1f108f2e463e508ac20ca08979d4ee215c65" + resolved "https://registry.npmjs.org/@prisma/config/-/config-7.8.0.tgz" integrity sha512-HFESzd9rx2ZQxlK+TL7tu1HPvCqrHiL6LCxYykI2c34mvaUuIVVl3lYuicJD/MNnzgPnyeBEMlK4WTomJCV5jw== dependencies: c12 "3.3.4" @@ -404,17 +404,17 @@ "@prisma/debug@7.2.0": version "7.2.0" - resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-7.2.0.tgz#569b1cbc10eb3e8cae798b40075fd11d21f6b533" + resolved "https://registry.npmjs.org/@prisma/debug/-/debug-7.2.0.tgz" integrity sha512-YSGTiSlBAVJPzX4ONZmMotL+ozJwQjRmZweQNIq/ER0tQJKJynNkRB3kyvt37eOfsbMCXk3gnLF6J9OJ4QWftw== "@prisma/debug@7.8.0": version "7.8.0" - resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-7.8.0.tgz#8e2f70d284b3091c2d713aa093a0f5898487e431" + resolved "https://registry.npmjs.org/@prisma/debug/-/debug-7.8.0.tgz" integrity sha512-p+QZReysDUqXC+mk17q9a+Y/qzh4c2KYliDK30buYUyfrGeTGSyfmc0AIrJRhZJrLHhRiJa9Au/J72h3C+szvA== "@prisma/dev@0.24.3": version "0.24.3" - resolved "https://registry.yarnpkg.com/@prisma/dev/-/dev-0.24.3.tgz#a235c2cfca28134f904e6b964d7652a9dfbd60f4" + resolved "https://registry.npmjs.org/@prisma/dev/-/dev-0.24.3.tgz" integrity sha512-ffHlQuKXZiaDt9Go0OnCTdJZrHxK0k7omJKNV86/VjpsXu5EIHZLK0T7JSWgvNlJwh56kW9JFu9v0qJciFzepg== dependencies: "@electric-sql/pglite" "0.4.1" @@ -437,12 +437,12 @@ "@prisma/engines-version@7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a": version "7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a" - resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a.tgz#6ab01f7c2619a9f9f1634418288a08080a630d18" + resolved "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a.tgz" integrity sha512-fJPQxCkLgA5EayWaW8eArgCvjJ+N+Kz3VyeNKMEeYiQC4alNkxRKFVAGxv/ZUzuJISKqdw+zGeDbS6mn6RCPOA== "@prisma/engines@7.8.0": version "7.8.0" - resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-7.8.0.tgz#214c778871929bcf96a056285270ddf1d74e7051" + resolved "https://registry.npmjs.org/@prisma/engines/-/engines-7.8.0.tgz" integrity sha512-jx3rCnNNrt5uzbkKlegtQ2GZHxSlihMCzutgT/BP6UIDF1r9tDI39hV/0T/cHZgzJ3ELbuQPXlVZy+Y1n0pcgw== dependencies: "@prisma/debug" "7.8.0" @@ -452,7 +452,7 @@ "@prisma/fetch-engine@7.8.0": version "7.8.0" - resolved "https://registry.yarnpkg.com/@prisma/fetch-engine/-/fetch-engine-7.8.0.tgz#699c1876d862b1f965b0318eb5e80b6c3744aa3f" + resolved "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-7.8.0.tgz" integrity sha512-gwB0Euiz/DDRyxFRpLXYlK3RfaZUj1c5dAYMuhZYfApg7arknJlcb9bIsOHDppJmbqYaVA+yBIiFMDBfprsNPQ== dependencies: "@prisma/debug" "7.8.0" @@ -461,26 +461,26 @@ "@prisma/get-platform@7.2.0": version "7.2.0" - resolved "https://registry.yarnpkg.com/@prisma/get-platform/-/get-platform-7.2.0.tgz#b3a92db68de6a76e840e61d2f26659aa9f915e3e" + resolved "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-7.2.0.tgz" integrity sha512-k1V0l0Td1732EHpAfi2eySTezyllok9dXb6UQanajkJQzPUGi3vO2z7jdkz67SypFTdmbnyGYxvEvYZdZsMAVA== dependencies: "@prisma/debug" "7.2.0" "@prisma/get-platform@7.8.0": version "7.8.0" - resolved "https://registry.yarnpkg.com/@prisma/get-platform/-/get-platform-7.8.0.tgz#7b1dade4117939c68c1324150ac72773f7272e68" + resolved "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-7.8.0.tgz" integrity sha512-WlxgRGnolL8VH2EmkH1R/DkKNr/mVdS3G2h42IZFFZ3eUrH9OT6t73kIOSlkkrv50wG123Iq8d96ufv5LlZktw== dependencies: "@prisma/debug" "7.8.0" "@prisma/query-plan-executor@7.2.0": version "7.2.0" - resolved "https://registry.yarnpkg.com/@prisma/query-plan-executor/-/query-plan-executor-7.2.0.tgz#00b218d78066957f25ccae0954bbef708396cc9f" + resolved "https://registry.npmjs.org/@prisma/query-plan-executor/-/query-plan-executor-7.2.0.tgz" integrity sha512-EOZmNzcV8uJ0mae3DhTsiHgoNCuu1J9mULQpGCh62zN3PxPTd+qI9tJvk5jOst8WHKQNwJWR3b39t0XvfBB0WQ== "@prisma/streams-local@0.1.2": version "0.1.2" - resolved "https://registry.yarnpkg.com/@prisma/streams-local/-/streams-local-0.1.2.tgz#531679bf13aafe4c663778848ff61a106b95df27" + resolved "https://registry.npmjs.org/@prisma/streams-local/-/streams-local-0.1.2.tgz" integrity sha512-l49yTxKKF2odFxaAXTmwmkBKL3+bVQ1tFOooGifu4xkdb9NMNLxHj27XAhTylWZod8I+ISGM5erU1xcl/oBCtg== dependencies: ajv "^8.12.0" @@ -490,7 +490,7 @@ "@prisma/studio-core@0.27.3": version "0.27.3" - resolved "https://registry.yarnpkg.com/@prisma/studio-core/-/studio-core-0.27.3.tgz#45246d76565ada1728bc7e0d29217c0e4746a631" + resolved "https://registry.npmjs.org/@prisma/studio-core/-/studio-core-0.27.3.tgz" integrity sha512-AADjNFPdsrglxHQVTmHFqv6DuKQZ5WY4p5/gVFY017twvNrSwpLJ9lqUbYYxEu2W7nbvVxTZA8deJ8LseNALsw== dependencies: "@radix-ui/react-toggle" "1.1.10" @@ -498,31 +498,31 @@ "@radix-ui/primitive@1.1.3": version "1.1.3" - resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.1.3.tgz#e2dbc13bdc5e4168f4334f75832d7bdd3e2de5ba" + resolved "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz" integrity sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg== "@radix-ui/react-compose-refs@1.1.2": version "1.1.2" - resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz#a2c4c47af6337048ee78ff6dc0d090b390d2bb30" + resolved "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz" integrity sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg== "@radix-ui/react-primitive@2.1.3": version "2.1.3" - resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz#db9b8bcff49e01be510ad79893fb0e4cda50f1bc" + resolved "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz" integrity sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ== dependencies: "@radix-ui/react-slot" "1.2.3" "@radix-ui/react-slot@1.2.3": version "1.2.3" - resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.2.3.tgz#502d6e354fc847d4169c3bc5f189de777f68cfe1" + resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz" integrity sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A== dependencies: "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-toggle@1.1.10": version "1.1.10" - resolved "https://registry.yarnpkg.com/@radix-ui/react-toggle/-/react-toggle-1.1.10.tgz#b04ba0f9609599df666fce5b2f38109a197f08cf" + resolved "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.10.tgz" integrity sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ== dependencies: "@radix-ui/primitive" "1.1.3" @@ -531,7 +531,7 @@ "@radix-ui/react-use-controllable-state@1.2.2": version "1.2.2" - resolved "https://registry.yarnpkg.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz#905793405de57d61a439f4afebbb17d0645f3190" + resolved "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz" integrity sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg== dependencies: "@radix-ui/react-use-effect-event" "0.0.2" @@ -539,24 +539,24 @@ "@radix-ui/react-use-effect-event@0.0.2": version "0.0.2" - resolved "https://registry.yarnpkg.com/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz#090cf30d00a4c7632a15548512e9152217593907" + resolved "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz" integrity sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA== dependencies: "@radix-ui/react-use-layout-effect" "1.1.1" "@radix-ui/react-use-layout-effect@1.1.1": version "1.1.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz#0c4230a9eed49d4589c967e2d9c0d9d60a23971e" + resolved "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz" integrity sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ== "@sapphire/async-queue@^1.5.2", "@sapphire/async-queue@^1.5.3": version "1.5.5" - resolved "https://registry.yarnpkg.com/@sapphire/async-queue/-/async-queue-1.5.5.tgz#2b18d402bb920b65b13ad4ed8dfb6c386300dd84" + resolved "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.5.tgz" integrity sha512-cvGzxbba6sav2zZkH8GPf2oGk9yYoD5qrNWdu9fRehifgnFZJMV+nuy2nON2roRO4yQQ+v7MK/Pktl/HgfsUXg== "@sapphire/shapeshift@^4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@sapphire/shapeshift/-/shapeshift-4.0.0.tgz#86c1b41002ff5d0b2ad21cbc3418b06834b89040" + resolved "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-4.0.0.tgz" integrity sha512-d9dUmWVA7MMiKobL3VpLF8P2aeanRTu6ypG2OIaEv/ZHH/SUQ2iHOVyi5wAPjQ+HmnMuL0whK9ez8I/raWbtIg== dependencies: fast-deep-equal "^3.1.3" @@ -564,55 +564,48 @@ "@sapphire/snowflake@3.5.3": version "3.5.3" - resolved "https://registry.yarnpkg.com/@sapphire/snowflake/-/snowflake-3.5.3.tgz#0c102aa2ec5b34f806e9bc8625fc6a5e1d0a0c6a" + resolved "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.3.tgz" integrity sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ== "@sapphire/snowflake@^3.5.3", "@sapphire/snowflake@^3.5.5": version "3.5.5" - resolved "https://registry.yarnpkg.com/@sapphire/snowflake/-/snowflake-3.5.5.tgz#33a60ab4231e3cab29e8a0077f342125f2c8d1bd" + resolved "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.5.tgz" integrity sha512-xzvBr1Q1c4lCe7i6sRnrofxeO1QTP/LKQ6A6qy0iB4x5yfiSfARMEQEghojzTNALDTcv8En04qYNIco9/K9eZQ== "@standard-schema/spec@^1.0.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.1.0.tgz#a79b55dbaf8604812f52d140b2c9ab41bc150bb8" + resolved "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz" integrity sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w== -"@types/node@*": - version "24.5.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-24.5.2.tgz#52ceb83f50fe0fcfdfbd2a9fab6db2e9e7ef6446" - integrity sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ== - dependencies: - undici-types "~7.12.0" - -"@types/node@^25.9.1": - version "25.9.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-25.9.1.tgz#3bda556db500ae4319c08e7fc9ab94f19013ba0b" - integrity sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg== +"@types/node@*", "@types/node@^25.9.2": + version "25.9.2" + resolved "https://registry.npmjs.org/@types/node/-/node-25.9.2.tgz" + integrity sha512-G05zqtJhcDLb8uslf5EjCxXg9G1KQxiV8OS0R26IC//Eoyitzqe8z37I7cqvnZlrlSfgocQRfSn/AHBZJJFyGw== dependencies: undici-types ">=7.24.0 <7.24.7" "@types/nodemailer@^8.0.0": version "8.0.0" - resolved "https://registry.yarnpkg.com/@types/nodemailer/-/nodemailer-8.0.0.tgz#ea189a9c151c04cc65c8a2a4c668c65d952a24e2" + resolved "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-8.0.0.tgz" integrity sha512-fyf8jWULsCo0d0BuoQ75i6IeoHs47qcqxWc7yUdUcV0pOZGjUTTOvwdG1PRXUDqN/8A64yQdQdnA2pZgcdi+cA== dependencies: "@types/node" "*" "@types/ws@^8.5.10": version "8.18.1" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.18.1.tgz#48464e4bf2ddfd17db13d845467f6070ffea4aa9" + resolved "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz" integrity sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg== dependencies: "@types/node" "*" "@vladfrangu/async_event_emitter@^2.2.4", "@vladfrangu/async_event_emitter@^2.4.6": version "2.4.6" - resolved "https://registry.yarnpkg.com/@vladfrangu/async_event_emitter/-/async_event_emitter-2.4.6.tgz#508b6c45b03f917112a9008180b308ba0e4d1805" + resolved "https://registry.npmjs.org/@vladfrangu/async_event_emitter/-/async_event_emitter-2.4.6.tgz" integrity sha512-RaI5qZo6D2CVS6sTHFKg1v5Ohq/+Bo2LZ5gzUEwZ/WkHhwtGTCB/sVLw8ijOkAUxasZ+WshN/Rzj4ywsABJ5ZA== ajv@^8.12.0: version "8.20.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.20.0.tgz#304b3636add88ba7d936760dd50ece006dea95f9" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz" integrity sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA== dependencies: fast-deep-equal "^3.1.3" @@ -622,34 +615,34 @@ ajv@^8.12.0: ansi-colors@^4.1.1: version "4.1.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" aws-ssl-profiles@^1.1.1: version "1.1.2" - resolved "https://registry.yarnpkg.com/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz#157dd77e9f19b1d123678e93f120e6f193022641" + resolved "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz" integrity sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g== better-result@^2.7.0: version "2.9.2" - resolved "https://registry.yarnpkg.com/better-result/-/better-result-2.9.2.tgz#34da6e0e352bd44e4252acb88e2a4a35ec4c335e" + resolved "https://registry.npmjs.org/better-result/-/better-result-2.9.2.tgz" integrity sha512-WIFoBPCdnTOdk9inkE1ZRvCZ4P0CpSkAiLlchC65N7n9DcjZ3NhqkBOlafzpOVnO8ixyi37kicmSJ3ENhPZl7Q== c12@3.3.4: version "3.3.4" - resolved "https://registry.yarnpkg.com/c12/-/c12-3.3.4.tgz#1253a5faf8b61244884d42459b4a6412571fe9f3" + resolved "https://registry.npmjs.org/c12/-/c12-3.3.4.tgz" integrity sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA== dependencies: chokidar "^5.0.0" @@ -667,7 +660,7 @@ c12@3.3.4: chalk@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + resolved "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz" integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== dependencies: ansi-styles "^4.1.0" @@ -675,43 +668,43 @@ chalk@^3.0.0: chart.js@4.5.1: version "4.5.1" - resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-4.5.1.tgz#19dd1a9a386a3f6397691672231cb5fc9c052c35" + resolved "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz" integrity sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw== dependencies: "@kurkle/color" "^0.3.0" chokidar@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-5.0.0.tgz#949c126a9238a80792be9a0265934f098af369a5" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz" integrity sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw== dependencies: readdirp "^5.0.0" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== commander@^11.1.0: version "11.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-11.1.0.tgz#62fdce76006a68e5c1ab3314dc92e800eb83d906" + resolved "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz" integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== confbox@^0.2.4: version "0.2.4" - resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.2.4.tgz#592e7be71f882a4a874e3c88f0ac1ef6f7da1ce5" + resolved "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz" integrity sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ== cross-spawn@^7.0.3, cross-spawn@^7.0.6: version "7.0.6" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" @@ -720,44 +713,44 @@ cross-spawn@^7.0.3, cross-spawn@^7.0.6: deepmerge-ts@7.1.5: version "7.1.5" - resolved "https://registry.yarnpkg.com/deepmerge-ts/-/deepmerge-ts-7.1.5.tgz#ff818564007f5c150808d2b7b732cac83aa415ab" + resolved "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.5.tgz" integrity sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw== defu@^6.1.6: version "6.1.7" - resolved "https://registry.yarnpkg.com/defu/-/defu-6.1.7.tgz#72543567c8e9f97ff13ce402b6dbe09ac5ae4d23" + resolved "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz" integrity sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ== denque@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1" + resolved "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz" integrity sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw== destr@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/destr/-/destr-2.0.5.tgz#7d112ff1b925fb8d2079fac5bdb4a90973b51fdb" + resolved "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz" integrity sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA== discord-api-types@^0.38.1, discord-api-types@^0.38.16: version "0.38.26" - resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.38.26.tgz#d30f6bf0a4725b0a5ea46e0a12cef0b8880bbc9a" + resolved "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.38.26.tgz" integrity sha512-xpmPviHjIJ6dFu1eNwNDIGQ3N6qmPUUYFVAx/YZ64h7ZgPkTcKjnciD8bZe8Vbeji7yS5uYljyciunpq0J5NSw== discord-api-types@^0.38.33, discord-api-types@^0.38.40: version "0.38.48" - resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.38.48.tgz#305894ebecc26547693b70eb12894c38e064bd8b" + resolved "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.38.48.tgz" integrity sha512-WFUE/2o0lBlLeCQonQ+Pu2RqHAqbytBJ2RlXR91gzk05InSS6k9ShzzLYoymrA4c2oRgRKGE7/VqQJNNdGWSxQ== discord-sync-commands@^0.5.2: version "0.5.2" - resolved "https://registry.yarnpkg.com/discord-sync-commands/-/discord-sync-commands-0.5.2.tgz#093aa08894980e5158a672139077d675d94c5f4c" + resolved "https://registry.npmjs.org/discord-sync-commands/-/discord-sync-commands-0.5.2.tgz" integrity sha512-RGinA7lJ1zg1bE7Ph6ltvHXiajzUeLD8bH3TtXpB6E4PUL35jHG295WySG838+TnTzk1j9AxtRLmjeOS64c09A== dependencies: discord.js "^14.20.0" discord.js@^14.20.0: version "14.22.1" - resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-14.22.1.tgz#aa364cf0108b41bac3eaa9fa1aae836d0882a91c" + resolved "https://registry.npmjs.org/discord.js/-/discord.js-14.22.1.tgz" integrity sha512-3k+Kisd/v570Jr68A1kNs7qVhNehDwDJAPe4DZ2Syt+/zobf9zEcuYFvsfIaAOgCa0BiHMfOOKQY4eYINl0z7w== dependencies: "@discordjs/builders" "^1.11.2" @@ -776,7 +769,7 @@ discord.js@^14.20.0: discord.js@^14.26.4: version "14.26.4" - resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-14.26.4.tgz#090b1b906055f6f0be64fac2c72161a98146b346" + resolved "https://registry.npmjs.org/discord.js/-/discord.js-14.26.4.tgz" integrity sha512-4oBp8tc6Kf8IDBwAHhbsMaAqx1b5fob9SNasZT7V6yyyUydoO5i5fGuX7TmvRtR+q/WgKRnRViRoAWnG7fNyvA== dependencies: "@discordjs/builders" "^1.14.1" @@ -795,17 +788,17 @@ discord.js@^14.26.4: dotenv@^17.2.1: version "17.2.2" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-17.2.2.tgz#4010cfe1c2be4fc0f46fd3d951afb424bc067ac6" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-17.2.2.tgz" integrity sha512-Sf2LSQP+bOlhKWWyhFsn0UsfdK/kCWRv1iuA2gXAwt3dyNabr6QSj00I2V10pidqz69soatm9ZwZvpQMTIOd5Q== dotenv@^17.3.1: version "17.4.2" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-17.4.2.tgz#c07e54a746e11eba021dd9e1047ced5afdc1c034" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-17.4.2.tgz" integrity sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw== eciesjs@^0.4.10: version "0.4.15" - resolved "https://registry.yarnpkg.com/eciesjs/-/eciesjs-0.4.15.tgz#8c7191ce425c54627ee5c65328ab54eaa6ed4556" + resolved "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.15.tgz" integrity sha512-r6kEJXDKecVOCj2nLMuXK/FCPeurW33+3JRpfXVbjLja3XUYFfD9I/JBreH6sUyzcm3G/YQboBjMla6poKeSdA== dependencies: "@ecies/ciphers" "^0.2.3" @@ -815,7 +808,7 @@ eciesjs@^0.4.10: effect@3.20.0: version "3.20.0" - resolved "https://registry.yarnpkg.com/effect/-/effect-3.20.0.tgz#827752d2c90f0a12562f1fdac3bf0197d067fd6a" + resolved "https://registry.npmjs.org/effect/-/effect-3.20.0.tgz" integrity sha512-qMLfDJscrNG8p/aw+IkT9W7fgj50Z4wG5bLBy0Txsxz8iUHjDIkOgO3SV0WZfnQbNG2VJYb0b+rDLMrhM4+Krw== dependencies: "@standard-schema/spec" "^1.0.0" @@ -823,12 +816,12 @@ effect@3.20.0: empathic@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/empathic/-/empathic-2.0.0.tgz#71d3c2b94fad49532ef98a6c34be0386659f6131" + resolved "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz" integrity sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA== enquirer@^2.4.1: version "2.4.1" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz" integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== dependencies: ansi-colors "^4.1.1" @@ -836,12 +829,12 @@ enquirer@^2.4.1: env-paths@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-3.0.0.tgz#2f1e89c2f6dbd3408e1b1711dd82d62e317f58da" + resolved "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz" integrity sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A== esbuild@~0.28.0: version "0.28.0" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.28.0.tgz#5dee347ffb3e3874212a35a69836b077b1ce6d96" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz" integrity sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw== optionalDependencies: "@esbuild/aix-ppc64" "0.28.0" @@ -873,7 +866,7 @@ esbuild@~0.28.0: execa@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== dependencies: cross-spawn "^7.0.3" @@ -888,34 +881,34 @@ execa@^5.1.1: exsolve@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/exsolve/-/exsolve-1.0.8.tgz#7f5e34da61cd1116deda5136e62292c096f50613" + resolved "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz" integrity sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA== fast-check@^3.23.1: version "3.23.2" - resolved "https://registry.yarnpkg.com/fast-check/-/fast-check-3.23.2.tgz#0129f1eb7e4f500f58e8290edc83c670e4a574a2" + resolved "https://registry.npmjs.org/fast-check/-/fast-check-3.23.2.tgz" integrity sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A== dependencies: pure-rand "^6.1.0" fast-deep-equal@3.1.3, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-uri@^3.0.1: version "3.1.2" - resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.2.tgz#8af3d4fc9d3e71b11572cc2673b514a7d1a8c8ec" + resolved "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz" integrity sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ== fdir@^6.2.0: version "6.5.0" - resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" + resolved "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz" integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== foreground-child@3.3.1: version "3.3.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" + resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz" integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== dependencies: cross-spawn "^7.0.6" @@ -928,151 +921,151 @@ fsevents@~2.3.3: generate-function@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.3.1.tgz#f069617690c10c868e73b8465746764f97c3479f" + resolved "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz" integrity sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ== dependencies: is-property "^1.0.2" get-port-please@3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/get-port-please/-/get-port-please-3.2.0.tgz#0ce3cee194c448ac640ec39dc357a500f5d7d2bb" + resolved "https://registry.npmjs.org/get-port-please/-/get-port-please-3.2.0.tgz" integrity sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A== get-stream@^6.0.0: version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== giget@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/giget/-/giget-3.2.0.tgz#bacfdd1264f81485a915928b0ae219be0e81a7c9" + resolved "https://registry.npmjs.org/giget/-/giget-3.2.0.tgz" integrity sha512-GvHTWcykIR/fP8cj8dMpuMMkvaeJfPvYnhq0oW+chSeIr+ldX21ifU2Ms6KBoyKZQZmVaUAAhQ2EZ68KJF8a7A== graceful-fs@^4.2.4: version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== grammex@^3.1.11: version "3.1.12" - resolved "https://registry.yarnpkg.com/grammex/-/grammex-3.1.12.tgz#08f021dd2cad009e64248fb53247cc6108788404" + resolved "https://registry.npmjs.org/grammex/-/grammex-3.1.12.tgz" integrity sha512-6ufJOsSA7LcQehIJNCO7HIBykfM7DXQual0Ny780/DEcJIpBlHRvcqEBWGPYd7hrXL2GJ3oJI1MIhaXjWmLQOQ== graphmatch@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/graphmatch/-/graphmatch-1.1.1.tgz#dcec68e8cb74de0a372d5252fc06e241daf71c38" + resolved "https://registry.npmjs.org/graphmatch/-/graphmatch-1.1.1.tgz" integrity sha512-5ykVn/EXM1hF0XCaWh05VbYvEiOL2lY1kBxZtaYsyvjp7cmWOU1XsAdfQBwClraEofXDT197lFbXOEVMHpvQOg== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== hono@^4.12.8: version "4.12.23" - resolved "https://registry.yarnpkg.com/hono/-/hono-4.12.23.tgz#998b91651686149f0e6edbb8564d604da04f3cf8" + resolved "https://registry.npmjs.org/hono/-/hono-4.12.23.tgz" integrity sha512-eIaZ9qDgu7XV0pxOCrg7/WhnQ6Ivm22UcxhXx/A3dcbqbbYgBEkc6e/J/s7j2tS96zoB0S9VBdLwQNCWwUo4LA== http-status-codes@2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/http-status-codes/-/http-status-codes-2.3.0.tgz#987fefb28c69f92a43aecc77feec2866349a8bfc" + resolved "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz" integrity sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA== human-signals@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== iconv-lite@^0.7.0: version "0.7.2" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.7.2.tgz#d0bdeac3f12b4835b7359c2ad89c422a4d1cc72e" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz" integrity sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" ignore@^5.3.0: version "5.3.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== is-property@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + resolved "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz" integrity sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g== is-stream@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isexe@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" + resolved "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz" integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== jiti@^2.6.1: version "2.7.0" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-2.7.0.tgz#974228f2f4ca2bc21885a1797b45fea68e950c64" + resolved "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz" integrity sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ== json-schema-traverse@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== lodash.snakecase@4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" + resolved "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz" integrity sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== lodash@^4.17.21: version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== long@^5.2.1: version "5.3.2" - resolved "https://registry.yarnpkg.com/long/-/long-5.3.2.tgz#1d84463095999262d7d7b7f8bfd4a8cc55167f83" + resolved "https://registry.npmjs.org/long/-/long-5.3.2.tgz" integrity sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA== lru.min@^1.0.0, lru.min@^1.1.0: version "1.1.4" - resolved "https://registry.yarnpkg.com/lru.min/-/lru.min-1.1.4.tgz#6ea1737a8c1ba2300cc87ad46910a4bdffa0117b" + resolved "https://registry.npmjs.org/lru.min/-/lru.min-1.1.4.tgz" integrity sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA== magic-bytes.js@^1.10.0: version "1.12.1" - resolved "https://registry.yarnpkg.com/magic-bytes.js/-/magic-bytes.js-1.12.1.tgz#031fedceb1fc652c1ccd917c6b45a6e8d6554245" + resolved "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.12.1.tgz" integrity sha512-ThQLOhN86ZkJ7qemtVRGYM+gRgR8GEXNli9H/PMvpnZsE44Xfh3wx9kGJaldg314v85m+bFW6WBMaVHJc/c3zA== magic-bytes.js@^1.13.0: version "1.13.0" - resolved "https://registry.yarnpkg.com/magic-bytes.js/-/magic-bytes.js-1.13.0.tgz#b86cc065639368599034ec67941da39d88d7795e" + resolved "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.13.0.tgz" integrity sha512-afO2mnxW7GDTXMm5/AoN1WuOcdoKhtgXjIvHmobqTD1grNplhGdv3PFOyjCVmrnOZBIT/gD/koDKpYG+0mvHcg== merge-stream@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== mimic-fn@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== moment@^2.24.0: version "2.30.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" + resolved "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz" integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== mysql2@3.15.3: version "3.15.3" - resolved "https://registry.yarnpkg.com/mysql2/-/mysql2-3.15.3.tgz#f0348d9c7401bb98cb1f45ffc5a773b109f70808" + resolved "https://registry.npmjs.org/mysql2/-/mysql2-3.15.3.tgz" integrity sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg== dependencies: aws-ssl-profiles "^1.1.1" @@ -1087,63 +1080,63 @@ mysql2@3.15.3: named-placeholders@^1.1.3: version "1.1.6" - resolved "https://registry.yarnpkg.com/named-placeholders/-/named-placeholders-1.1.6.tgz#c50c6920b43f258f59c16add1e56654f5cc02bb5" + resolved "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.6.tgz" integrity sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w== dependencies: lru.min "^1.1.0" -nodemailer@^8.0.9: - version "8.0.9" - resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-8.0.9.tgz#9ea0bdb84b04b1ee65d83b15aa7d62761e9b5677" - integrity sha512-5ofa7BUN8+C+Hckh5V2GjeeOGRQBx0CJQA6KxrvuZfC8iU4/q7sLn8XrtEEhJkjV6HdyIiQs7Bba6bTao8JhkA== +nodemailer@^8.0.10: + version "8.0.10" + resolved "https://registry.npmjs.org/nodemailer/-/nodemailer-8.0.10.tgz" + integrity sha512-BLFuSth7QtHOkBzyqTehWWyub0NTRDuK2Q2SQfnGLsrJnzyU+Yeh4WpV1eZGuARFj1xQJHIdnTuJZLP+b9R1GQ== npm-run-path@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" object-treeify@1.1.33: version "1.1.33" - resolved "https://registry.yarnpkg.com/object-treeify/-/object-treeify-1.1.33.tgz#f06fece986830a3cba78ddd32d4c11d1f76cdf40" + resolved "https://registry.npmjs.org/object-treeify/-/object-treeify-1.1.33.tgz" integrity sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A== ohash@^2.0.11: version "2.0.11" - resolved "https://registry.yarnpkg.com/ohash/-/ohash-2.0.11.tgz#60b11e8cff62ca9dee88d13747a5baa145f5900b" + resolved "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz" integrity sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ== onetime@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== pathe@2.0.3, pathe@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" + resolved "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz" integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== perfect-debounce@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/perfect-debounce/-/perfect-debounce-2.1.0.tgz#e7078e38f231cb191855c3136a4423aef725d261" + resolved "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz" integrity sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g== picomatch@^4.0.4: version "4.0.4" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.4.tgz#fd6f5e00a143086e074dffe4c924b8fb293b0589" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz" integrity sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A== pkg-types@^2.3.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-2.3.1.tgz#fa27ed0940efcf40bba453b0e5cab41217b0d442" + resolved "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.1.tgz" integrity sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg== dependencies: confbox "^0.2.4" @@ -1152,12 +1145,12 @@ pkg-types@^2.3.0: postgres@3.4.7: version "3.4.7" - resolved "https://registry.yarnpkg.com/postgres/-/postgres-3.4.7.tgz#122f460a808fe300cae53f592108b9906e625345" + resolved "https://registry.npmjs.org/postgres/-/postgres-3.4.7.tgz" integrity sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw== prisma@^7.8.0: version "7.8.0" - resolved "https://registry.yarnpkg.com/prisma/-/prisma-7.8.0.tgz#f64db69e59131fe10859efb5969af1c7e50e6620" + resolved "https://registry.npmjs.org/prisma/-/prisma-7.8.0.tgz" integrity sha512-yfN4yrw7HV9kEJhoy1+jgah0jafEIQsf7uWouSsM8MvJtlubsk+kM7AIBWZ8+GJl74Yj3c+nbYqBkMOxtsZ3Lw== dependencies: "@prisma/config" "7.8.0" @@ -1169,7 +1162,7 @@ prisma@^7.8.0: proper-lockfile@4.1.2, proper-lockfile@^4.1.2: version "4.1.2" - resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-4.1.2.tgz#c8b9de2af6b2f1601067f98e01ac66baa223141f" + resolved "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz" integrity sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA== dependencies: graceful-fs "^4.2.4" @@ -1178,12 +1171,12 @@ proper-lockfile@4.1.2, proper-lockfile@^4.1.2: pure-rand@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" + resolved "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz" integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== rc9@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/rc9/-/rc9-3.0.1.tgz#3895e5834a2b5c2d8fb76d93e802fbcbc2579bc7" + resolved "https://registry.npmjs.org/rc9/-/rc9-3.0.1.tgz" integrity sha512-gMDyleLWVE+i6Sgtc0QbbY6pEKqYs97NGi6isHQPqYlLemPoO8dxQ3uGi0f4NiP98c+jMW6cG1Kx9dDwfvqARQ== dependencies: defu "^6.1.6" @@ -1191,104 +1184,104 @@ rc9@^3.0.1: readdirp@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-5.0.0.tgz#fbf1f71a727891d685bb1786f9ba74084f6e2f91" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz" integrity sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ== remeda@2.33.4: version "2.33.4" - resolved "https://registry.yarnpkg.com/remeda/-/remeda-2.33.4.tgz#eae3bb2ec9795db58a1b66249913772a1a2c7989" + resolved "https://registry.npmjs.org/remeda/-/remeda-2.33.4.tgz" integrity sha512-ygHswjlc/opg2VrtiYvUOPLjxjtdKvjGz1/plDhkG66hjNjFr1xmfrs2ClNFo/E6TyUFiwYNh53bKV26oBoMGQ== require-from-string@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== retry@^0.12.0: version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + resolved "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz" integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== seq-queue@^0.0.5: version "0.0.5" - resolved "https://registry.yarnpkg.com/seq-queue/-/seq-queue-0.0.5.tgz#d56812e1c017a6e4e7c3e3a37a1da6d78dd3c93e" + resolved "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz" integrity sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q== shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== signal-exit@^4.0.1: version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== sqlstring@^2.3.2: version "2.3.3" - resolved "https://registry.yarnpkg.com/sqlstring/-/sqlstring-2.3.3.tgz#2ddc21f03bce2c387ed60680e739922c65751d0c" + resolved "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz" integrity sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg== std-env@3.10.0: version "3.10.0" - resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.10.0.tgz#d810b27e3a073047b2b5e40034881f5ea6f9c83b" + resolved "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz" integrity sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg== strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-final-newline@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" ts-mixer@^6.0.4: version "6.0.4" - resolved "https://registry.yarnpkg.com/ts-mixer/-/ts-mixer-6.0.4.tgz#1da39ceabc09d947a82140d9f09db0f84919ca28" + resolved "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz" integrity sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA== ts-postgres@2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/ts-postgres/-/ts-postgres-2.0.4.tgz#06146c561d9e94c7a48673212352a037391e07e3" + resolved "https://registry.npmjs.org/ts-postgres/-/ts-postgres-2.0.4.tgz" integrity sha512-KQL9xd4C2tVJdV+bshA5q9KikMrqfyc1MRQCGYF5QQSBAz+prpK/b4U1wiywOLtIBzgvFfXrvEZULu3Yp7GDsg== tslib@^2.6.2, tslib@^2.6.3: version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== -tsx@^4.22.3: - version "4.22.3" - resolved "https://registry.yarnpkg.com/tsx/-/tsx-4.22.3.tgz#7ca7cb34028e3e247f1fad300c157e42a90a1f50" - integrity sha512-mdoNxBC/cSQObGGVQ5Bpn5i+yv7j68gk3Nfm3wFjcJg3Z0Mix9jzAFfP12prmm5eVGmDKtp0yyArrs0Q+8gZHg== +tsx@^4.22.4: + version "4.22.4" + resolved "https://registry.npmjs.org/tsx/-/tsx-4.22.4.tgz" + integrity sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg== dependencies: esbuild "~0.28.0" optionalDependencies: @@ -1296,68 +1289,63 @@ tsx@^4.22.3: typescript@^6.0.3: version "6.0.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-6.0.3.tgz#90251dc007916e972786cb94d74d15b185577d21" + resolved "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz" integrity sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw== "undici-types@>=7.24.0 <7.24.7": version "7.24.6" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.24.6.tgz#61275b485d7fd4e9d269c7cf04ec2873c9cc0f91" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz" integrity sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg== -undici-types@~7.12.0: - version "7.12.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.12.0.tgz#15c5c7475c2a3ba30659529f5cdb4674b622fafb" - integrity sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ== - undici@6.21.3: version "6.21.3" - resolved "https://registry.yarnpkg.com/undici/-/undici-6.21.3.tgz#185752ad92c3d0efe7a7d1f6854a50f83b552d7a" + resolved "https://registry.npmjs.org/undici/-/undici-6.21.3.tgz" integrity sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw== undici@6.24.1: version "6.24.1" - resolved "https://registry.yarnpkg.com/undici/-/undici-6.24.1.tgz#9df1425cede20b836d95634347946f79578b7e71" + resolved "https://registry.npmjs.org/undici/-/undici-6.24.1.tgz" integrity sha512-sC+b0tB1whOCzbtlx20fx3WgCXwkW627p4EA9uM+/tNNPkSS+eSEld6pAs9nDv7WbY1UUljBMYPtu9BCOrCWKA== valibot@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/valibot/-/valibot-1.2.0.tgz#8fc720d9e4082ba16e30a914064a39619b2f1d6f" + resolved "https://registry.npmjs.org/valibot/-/valibot-1.2.0.tgz" integrity sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg== which@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" which@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/which/-/which-4.0.0.tgz#cd60b5e74503a3fbcfbf6cd6b4138a8bae644c1a" + resolved "https://registry.npmjs.org/which/-/which-4.0.0.tgz" integrity sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg== dependencies: isexe "^3.1.1" ws@^8.17.0: version "8.18.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.3.tgz#b56b88abffde62791c639170400c93dcb0c95472" + resolved "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz" integrity sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg== yocto-spinner@^1.1.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/yocto-spinner/-/yocto-spinner-1.2.0.tgz#2892d776c682ddb0c20888fef20eaaced6c9bcf1" + resolved "https://registry.npmjs.org/yocto-spinner/-/yocto-spinner-1.2.0.tgz" integrity sha512-Yw0hUB6UA3o4YUgKy3oSe9a4cxoaZ9sBfYDw+JSxo6Id0KoJGoxzPA24qqUXYKBWABs/zDSGTz9kww7t3F0XGw== dependencies: yoctocolors "^2.1.1" yoctocolors@^2.1.1: version "2.1.2" - resolved "https://registry.yarnpkg.com/yoctocolors/-/yoctocolors-2.1.2.tgz#d795f54d173494e7d8db93150cec0ed7f678c83a" + resolved "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz" integrity sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug== zeptomatch@2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/zeptomatch/-/zeptomatch-2.1.0.tgz#cca2cb2c61308d0c26f9689e6640f6335d0f2101" + resolved "https://registry.npmjs.org/zeptomatch/-/zeptomatch-2.1.0.tgz" integrity sha512-KiGErG2J0G82LSpniV0CtIzjlJ10E04j02VOudJsPyPwNZgGnRKQy7I1R7GMyg/QswnE4l7ohSGrQbQbjXPPDA== dependencies: grammex "^3.1.11" From 0139fc303c8d030a90fada283d34720fad95b75e Mon Sep 17 00:00:00 2001 From: HunteRoi Date: Sun, 7 Jun 2026 18:39:56 +0200 Subject: [PATCH 8/9] docs: add comprehensive documentation for DataDrop architecture and workflows - Introduced architecture.md detailing system context, high-level diagram, tenant access flow, and cross-entrypoint consistency. - Created bpmn-lifecycle.md outlining the onboarding and eligibility process with a BPMN-style flow diagram. - Added discord-sources.md to reference authoritative Discord API and Discord.js documentation. - Established github-sources.md to track project-level GitHub issues and repository references. - Developed issue-93-specification.md as an umbrella epic for bot refactor and web app delivery, including MVP definition and implementation phases. - Defined mvp-scope.md to clarify in-scope and out-of-scope features for the MVP. - Outlined non-mvp-roadmap.md for planned features post-MVP and suggested delivery order. - Documented state-machine.md to illustrate the membership lifecycle and critical guard rules. - Created traceability-matrix.md to map rules to specifications, GitHub issues, and implementation targets. --- docs/README.md | 25 ++ docs/assets/datadrop-visual-marker.svg | 60 ++++ docs/assets/issue-93-feature-list.svg | 80 ++++++ docs/specs/architecture.md | 68 +++++ docs/specs/bpmn-lifecycle.md | 47 ++++ docs/specs/discord-sources.md | 49 ++++ docs/specs/github-sources.md | 136 ++++++++++ docs/specs/issue-93-specification.md | 361 +++++++++++++++++++++++++ docs/specs/mvp-scope.md | 34 +++ docs/specs/non-mvp-roadmap.md | 22 ++ docs/specs/state-machine.md | 70 +++++ docs/specs/traceability-matrix.md | 84 ++++++ 12 files changed, 1036 insertions(+) create mode 100644 docs/README.md create mode 100644 docs/assets/datadrop-visual-marker.svg create mode 100644 docs/assets/issue-93-feature-list.svg create mode 100644 docs/specs/architecture.md create mode 100644 docs/specs/bpmn-lifecycle.md create mode 100644 docs/specs/discord-sources.md create mode 100644 docs/specs/github-sources.md create mode 100644 docs/specs/issue-93-specification.md create mode 100644 docs/specs/mvp-scope.md create mode 100644 docs/specs/non-mvp-roadmap.md create mode 100644 docs/specs/state-machine.md create mode 100644 docs/specs/traceability-matrix.md diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..340062d --- /dev/null +++ b/docs/README.md @@ -0,0 +1,25 @@ +# DataDrop Documentation + +This folder is the project knowledge base for Issue 93 and related implementation work. + +## What is in here + +- [Issue 93 Specification](specs/issue-93-specification.md) +- [Architecture](specs/architecture.md) +- [Membership State Machine](specs/state-machine.md) +- [BPMN-Style Lifecycle](specs/bpmn-lifecycle.md) +- [MVP Scope](specs/mvp-scope.md) +- [Discord API and Discord.js Sources](specs/discord-sources.md) +- [GitHub Sources](specs/github-sources.md) +- [Strict Traceability Matrix](specs/traceability-matrix.md) +- [Roadmap Beyond MVP](specs/non-mvp-roadmap.md) + +## Visual Assets + +- Feature list snapshot: ![Issue 93 Feature Map](assets/issue-93-feature-list.svg) +- Project visual marker: ![DataDrop Visual Marker](assets/datadrop-visual-marker.svg) + +## Notes + +- Mermaid diagrams are embedded directly in markdown files. +- Any statement tied to Discord API or Discord.js behavior is sourced in [Discord API and Discord.js Sources](specs/discord-sources.md). diff --git a/docs/assets/datadrop-visual-marker.svg b/docs/assets/datadrop-visual-marker.svg new file mode 100644 index 0000000..2b5af7a --- /dev/null +++ b/docs/assets/datadrop-visual-marker.svg @@ -0,0 +1,60 @@ + + DataDrop Visual Marker + A branded banner with the DataDrop name, bot and web nodes, and the theme of reliable multi-entrypoint delivery. + + + + + + + + + + + + + + + + + + + + DataDrop + Reliable bot and web delivery across shared identity, config, and compliance flows + + + + Bot entrypoint + Commands, events, transitions + + + + + Web entrypoint + OAuth, admin UX, user flows + + + + + Shared domain + Identity, config, compliance + + + + + Trust layer + Audit, SLOs, retries, DLQ + + + + + + + Use this as the project banner in docs/README and related spec pages. + diff --git a/docs/assets/issue-93-feature-list.svg b/docs/assets/issue-93-feature-list.svg new file mode 100644 index 0000000..ec5d933 --- /dev/null +++ b/docs/assets/issue-93-feature-list.svg @@ -0,0 +1,80 @@ + + DataDrop Issue 93 Feature Map + A visual summary of the epic broken into delivery foundation, identity, admin configuration, compliance, and user features. + + + + + + + + + + + + + + + DataDrop Issue 93 + Feature map grouped by implementation phase and product area + + + + + + Phase 0 - Foundation + #104 delivery pipeline, #111 Prisma ORM, #71 logging + Stabilize platform before shipping product flows. + + + + Phase 1 - Reliability + #135 audit trail, #136 stale-write detection, #132 locking, #140 dead-letter, #139 SLOs + Make writes observable, conflict-safe, and recoverable. + + + + Phase 2 - Identity + #128 global verification, #130 email uniqueness, #131 manual verify guard, #129 onboarding, #133 reverification + Identity rules are shared across bot and web entrypoints. + + + + Phase 3 - Admin + #90-#92 role/channel controls and command/web config surfaces + Guild configuration becomes structured and role-aware. + + + + Phase 4 - Compliance + #137 delete/deactivate, #138 evidence retention, #77 staff contact, #68 ban appeal + Separate user lifecycle flows from moderation records. + + + + Phase 5 - Growth + #72 yearly reset, #70 server generation, #74 stats, #73 leaderboard, #69, #94 + Ship automation and reporting after the core is stable. + + + + + Role/Target split + Admin: bot + web + Bot owner: platform/ops + User: bot + web + shared + + + + Completed work is intentionally shown as context, not backlog. + The epic checklist should now point only to live GitHub issues. + + + diff --git a/docs/specs/architecture.md b/docs/specs/architecture.md new file mode 100644 index 0000000..3b59e12 --- /dev/null +++ b/docs/specs/architecture.md @@ -0,0 +1,68 @@ +# Architecture + +## Context + +DataDrop has two behavior entrypoints: + +1. Discord Bot runtime +2. Web App + Backend API + +Both must enforce the same business rules and write to the same domain model. + +## High-Level System Diagram + +```mermaid +flowchart LR + U[User] -->|Discord Client| D[Discord Platform] + U -->|Browser| W[Web App] + + D -->|Gateway Events| B[DataDrop Bot] + B -->|Commands, role updates, onboarding checks| D + + W -->|JWT-authenticated calls| A[DataDrop Backend API] + A --> DB[(PostgreSQL)] + B --> DB + + DB --> Q[Dead Letter Queue] + Q --> R[Staff Remediation Panel] + + A --> O[Audit and Security Logs] + B --> O +``` + +## Tenant and Access Flow + +```mermaid +sequenceDiagram + participant User + participant Web as Web App + participant Discord as Discord OAuth API + participant API as Backend API + participant DB as PostgreSQL + + User->>Web: Login with Discord + Web->>Discord: OAuth exchange + Discord-->>Web: user identity + guild list + Web->>API: fetch guilds known by DataDrop for user + API->>DB: read guild memberships and roles + DB-->>API: guilds from platform scope + API-->>Web: intersection list for guild selector + User->>Web: select guild + Web->>API: request guild context + API->>DB: action-time authorization check + DB-->>API: allowed or denied + API-->>Web: scoped response +``` + +## Cross-Entrypoint Consistency + +Design rule: + +- Bot and API writes use strict optimistic locking +- Transition preconditions include expected state and expected version +- Conflict retries are bounded +- Retry exhaustion creates dead-letter records + +## Source Notes + +For Discord gateway and member update semantics, see [Discord API and Discord.js Sources](discord-sources.md). diff --git a/docs/specs/bpmn-lifecycle.md b/docs/specs/bpmn-lifecycle.md new file mode 100644 index 0000000..62aa2a5 --- /dev/null +++ b/docs/specs/bpmn-lifecycle.md @@ -0,0 +1,47 @@ +# BPMN-Style Lifecycle Flow + +This document captures the intended operational flow for onboarding, eligibility, rules acceptance, verification, and admin override handling. + +## Flow Diagram + +```mermaid +flowchart TD + A[Member joins guild] --> B[Discord onboarding starts] + B --> C{Onboarding completed?} + C -->|No| B + C -->|Yes| D[Eligibility evaluation from roles and rules] + + D --> E{Eligible?} + E -->|No| X[RejectedNotEligible] + E -->|Yes| F[RulesAccepted] + + F --> G[VerificationPending] + G --> H{Verification success?} + H -->|Code verified| I[Verified] + H -->|Admin implicit verification valid| I + H -->|Deadline exceeded| J[Kicked or Rejected] + + G --> K{Admin implicit verification request} + K -->|State != VerificationPending| L[Hard reject override] + K -->|Email missing| M[Hard fail override] + K -->|State ok and email present| I + + I --> N{Reverification campaign targeted?} + N -->|No| O[Remain Verified] + N -->|Yes| P[Return to VerificationPending] +``` + +## Rule Highlights + +1. Rules acceptance remains per guild because onboarding is a guild-bound Discord flow. +2. Global verification identity does not bypass guild onboarding acceptance. +3. Manual implicit verification is constrained to `VerificationPending` and requires email presence. +4. Historical override does not provide permanent bypass entitlement in future campaigns. + +## Discord-Specific Notes + +1. Member updates are observed through gateway member update events. +2. Onboarding and member flags are platform-defined by Discord. +3. Membership screening and pending semantics are Discord-defined. + +Reference all platform-specific semantics through [Discord API and Discord.js Sources](discord-sources.md). diff --git a/docs/specs/discord-sources.md b/docs/specs/discord-sources.md new file mode 100644 index 0000000..c55fdb2 --- /dev/null +++ b/docs/specs/discord-sources.md @@ -0,0 +1,49 @@ +# Discord API and Discord.js Sources + +This file lists the authoritative references used for Discord-specific behavior statements in the documentation. + +## Discord API Sources + +1. Gateway Events overview + - https://docs.discord.com/developers/events/gateway-events + +2. Guild Member Update event + - https://docs.discord.com/developers/events/gateway-events#guild-member-update + +3. Guild Resource and Guild Member object + - https://docs.discord.com/developers/resources/guild + +4. Guild Member flags including onboarding-related flags + - https://docs.discord.com/developers/resources/guild#guild-member-object-guild-member-flags + +5. Membership screening `pending` behavior + - https://docs.discord.com/developers/resources/guild#membership-screening-object + +6. Guild onboarding object and prompts + - https://docs.discord.com/developers/resources/guild#guild-onboarding-object + +7. Message timestamp formatting in Discord messages + - https://docs.discord.com/developers/reference#message-formatting + +## Discord.js Sources + +1. Discord.js guide and docs entrypoint + - https://discord.js.org + +2. Events reference including guild member updates + - https://discord.js.org/docs/packages/discord.js/main/Events:Enum + +3. `GuildMember` structure and role/member fields + - https://discord.js.org/docs/packages/discord.js/main/GuildMember:Class + +## How to Use These Sources in This Project + +1. If a behavior claim depends on Discord platform event semantics, cite a Discord API source above. +2. If a behavior claim depends on discord.js runtime object shape or event names in code, cite a Discord.js source above. +3. For ambiguous platform behavior, rely on observed runtime tests in development and document the result in project docs. + +## Project-Level GitHub Sources + +Repository and issue references are maintained in: + +- [GitHub Sources](github-sources.md) diff --git a/docs/specs/github-sources.md b/docs/specs/github-sources.md new file mode 100644 index 0000000..7ff7ce3 --- /dev/null +++ b/docs/specs/github-sources.md @@ -0,0 +1,136 @@ +# GitHub Sources + +This file tracks project-level GitHub sources used in this documentation set. + +## Repository + +1. DataDrop repository + - https://github.com/section-ig/datadrop + +## Core Issues + +1. Umbrella epic + - Issue #93: https://github.com/section-ig/datadrop/issues/93 + +2. Web interface scope reference + - Issue #91: https://github.com/section-ig/datadrop/issues/91 + +3. Global one-time verification identity across guilds + - Issue #128: https://github.com/Section-IG/DataDrop/issues/128 + +4. Per-guild onboarding and rules acceptance for globally verified users + - Issue #129: https://github.com/Section-IG/DataDrop/issues/129 + +5. Global email uniqueness and duplicate-email conflict handling + - Issue #130: https://github.com/Section-IG/DataDrop/issues/130 + +6. Guard manual implicit verification transitions + - Issue #131: https://github.com/Section-IG/DataDrop/issues/131 + +7. Strict optimistic locking with bounded retries for transition writes + - Issue #132: https://github.com/Section-IG/DataDrop/issues/132 + +8. Reverification campaigns with cohort filters and no historical override bypass + - Issue #133: https://github.com/Section-IG/DataDrop/issues/133 + +9. Yearly reset dry-run summary and explicit confirmation + - Issue #134: https://github.com/Section-IG/DataDrop/issues/134 + +10. Persist config create/update audit trail + - Issue #135: https://github.com/Section-IG/DataDrop/issues/135 + +11. Stale-write detection and superseded update deprecation for guild config + - Issue #136: https://github.com/Section-IG/DataDrop/issues/136 + +12. Self-serve data deletion and account deactivation + - Issue #137: https://github.com/Section-IG/DataDrop/issues/137 + +13. Evidence retention with userId linkage and pseudonymization + - Issue #138: https://github.com/Section-IG/DataDrop/issues/138 + +14. p95 under 500ms SLO instrumentation and alerting + - Issue #139: https://github.com/Section-IG/DataDrop/issues/139 + +15. Dead-letter queue and remediation workflow for failed transitions + - Issue #140: https://github.com/Section-IG/DataDrop/issues/140 + +## Feature List Issues (from issue board snapshot) + +1. Issue #94 + - https://github.com/section-ig/datadrop/issues/94 +2. Issue #92 + - https://github.com/section-ig/datadrop/issues/92 +3. Issue #90 + - https://github.com/section-ig/datadrop/issues/90 +4. Issue #89 + - https://github.com/section-ig/datadrop/issues/89 +5. Issue #88 + - https://github.com/section-ig/datadrop/issues/88 +6. Issue #87 + - https://github.com/section-ig/datadrop/issues/87 +7. Issue #86 + - https://github.com/section-ig/datadrop/issues/86 +8. Issue #85 + - https://github.com/section-ig/datadrop/issues/85 +9. Issue #84 + - https://github.com/section-ig/datadrop/issues/84 +10. Issue #83 + - https://github.com/section-ig/datadrop/issues/83 +11. Issue #82 + - https://github.com/section-ig/datadrop/issues/82 +12. Issue #81 + - https://github.com/section-ig/datadrop/issues/81 +13. Issue #80 + - https://github.com/section-ig/datadrop/issues/80 +14. Issue #79 + - https://github.com/section-ig/datadrop/issues/79 +15. Issue #78 + - https://github.com/section-ig/datadrop/issues/78 +16. Issue #77 + - https://github.com/section-ig/datadrop/issues/77 +17. Issue #76 + - https://github.com/section-ig/datadrop/issues/76 +18. Issue #75 + - https://github.com/section-ig/datadrop/issues/75 +19. Issue #74 + - https://github.com/section-ig/datadrop/issues/74 +20. Issue #73 + - https://github.com/section-ig/datadrop/issues/73 +21. Issue #72 + - https://github.com/section-ig/datadrop/issues/72 +22. Issue #71 + - https://github.com/section-ig/datadrop/issues/71 +23. Issue #70 + - https://github.com/section-ig/datadrop/issues/70 +24. Issue #69 + - https://github.com/section-ig/datadrop/issues/69 +25. Issue #68 + - https://github.com/section-ig/datadrop/issues/68 +26. Issue #67 + - https://github.com/section-ig/datadrop/issues/67 + +## Specification Coverage Status + +Current status of specification areas previously tracked as draft-backed issue gaps: + +1. None currently + +Created from draft backlog: + +1. DRAFT-02 -> Issue #128: https://github.com/Section-IG/DataDrop/issues/128 +2. DRAFT-01 -> Issue #129: https://github.com/Section-IG/DataDrop/issues/129 +3. DRAFT-03 -> Issue #130: https://github.com/Section-IG/DataDrop/issues/130 +4. DRAFT-04 -> Issue #131: https://github.com/Section-IG/DataDrop/issues/131 +5. DRAFT-13 -> Issue #132: https://github.com/Section-IG/DataDrop/issues/132 +6. DRAFT-05 -> Issue #133: https://github.com/Section-IG/DataDrop/issues/133 +7. DRAFT-06 -> Issue #134: https://github.com/Section-IG/DataDrop/issues/134 +8. DRAFT-07 -> Issue #135: https://github.com/Section-IG/DataDrop/issues/135 +9. DRAFT-08 -> Issue #136: https://github.com/Section-IG/DataDrop/issues/136 +10. DRAFT-09 -> Issue #137: https://github.com/Section-IG/DataDrop/issues/137 +11. DRAFT-10 -> Issue #138: https://github.com/Section-IG/DataDrop/issues/138 +12. DRAFT-11 -> Issue #139: https://github.com/Section-IG/DataDrop/issues/139 +13. DRAFT-12 -> Issue #140: https://github.com/Section-IG/DataDrop/issues/140 + +Cross-reference: + +- [Strict Traceability Matrix](traceability-matrix.md) diff --git a/docs/specs/issue-93-specification.md b/docs/specs/issue-93-specification.md new file mode 100644 index 0000000..a706ac7 --- /dev/null +++ b/docs/specs/issue-93-specification.md @@ -0,0 +1,361 @@ +# Issue 93 Specification + +## Purpose + +Issue 93 is the umbrella epic for: + +- Bot refactor +- Web app delivery + +GitHub source links: + +- Repository: https://github.com/section-ig/datadrop +- Issue #93: https://github.com/section-ig/datadrop/issues/93 +- Issue #91 (web interface scope reference): https://github.com/section-ig/datadrop/issues/91 + +Priority order: + +1. Bot refactor first +2. Web app can ship partially + +## MVP Definition (Non-Negotiable) + +MVP is done when all of the following are true: + +1. Bot is multi-tenant +2. Verification is mandatory +3. BPMN flow is enforced +4. Start-of-year reset and announcement automation is available +5. Before yearly reset, admins are prompted to validate or update year settings + +Settings requested before yearly reset include at minimum: + +- Year start date +- Number of years +- Number of groups per year + +These settings remain editable at any time. + +## Tenant Model + +- Tenant key is `guildId` everywhere. +- Web app guild selection is based on intersection: + - guilds known by DataDrop in database + - guilds returned by Discord OAuth identity + +Ban appeal uses a separate flow because banned members are no longer in a guild member list. + +## Authorization Model + +Authorization is dual-layered: + +1. Login-time role-aware UI shaping +2. Action-time permission re-check on every privileged operation + +## Identity and Verification + +Identity anchor: + +- Discord `userId` is canonical identity key + +Metadata only: + +- Username and discriminator changes + +Verification model: + +1. Discord OAuth only +2. Verification required to continue platform usage +3. Verification can be executed in web app +4. Verification is one-time global across all guilds using DataDrop +5. Per-guild onboarding and rules acceptance still required by Discord guild flow + +Email uniqueness rule: + +- Henallux email is globally unique per person +- Duplicate email attempt on another Discord account is denied and staff-notified +- If a student becomes teacher and receives new email, reverification uses the new email + +## State and Override Rules + +Manual implicit verification by admin: + +1. Allowed only from `VerificationPending` +2. Hard reject in any other state +3. Hard fail if user email is missing +4. Successful path is `VerificationPending -> Verified` +5. Treated as point-in-time override only +6. Historical override does not imply future bypass in reverification campaigns + +Reverification campaigns: + +- Targeted cohorts by filters are required +- Includes cohorts such as manually overridden users and date-based cohorts + +## Discord Access Enforcement + +- Enforcement is channel and role gating +- Not auto-kick for unverified users by default + +## Start-of-Year Reset + +Required behavior: + +1. Bot prompts admin for updated configuration ahead of reset window +2. Dry-run summary is generated +3. Explicit admin confirmation is required +4. Reset is applied and announcement is posted automatically + +## Config Management + +1. Redesign now and map current JSON config keys to database model +2. No built-in config versioning requirement +3. Create and update audit is mandatory +4. Rollback is manual only +5. Stale-write protection is required for concurrent updates + +Stale-write behavior: + +- User who submits outdated config is informed +- Superseded submission is marked deprecated + +## Ban Appeal + +1. Appeal identity is strictly Discord `userId` +2. User authenticates through Discord OAuth +3. Reviewer set is admins, owner, and configurable reviewer roles +4. Outcomes are `unban` or `reject` +5. No rate limit requirement + +## Data Deletion and Deactivation + +User actions are self-serve and distinct: + +1. Delete my data +2. Deactivate account + +Common retention behavior: + +- Soft delete first +- 6-month grace period +- Hard delete after inactivity window + +Evidence retention after hard delete: + +- Keep moderation evidence +- Keep audit and security events +- Keep userId linkage +- Also include pseudonymization + +Deactivation access rule: + +- Login blocked for rolling 24 hours + +## Performance and Reliability + +1. Bot is continuous background event process +2. Performance target is p95 under 500ms +3. Dead-letter queue required for transition failures +4. Staff remediation panel required + +Concurrency model: + +1. Strict optimistic locking with retry +2. Transition writes include expected state and version preconditions +3. Bounded retries on conflict +4. Dead-letter after retry exhaustion + +## Source Traceability + +Any Discord API or Discord.js behavior in this document is backed by: + +- [Discord API and Discord.js Sources](discord-sources.md) + +Project issue and repository references are tracked in: + +- [GitHub Sources](github-sources.md) + +Rule-by-rule traceability and linked implementation issues are tracked in: + +- [Strict Traceability Matrix](traceability-matrix.md) + +## Updated Issue #93 Description (Ready to Paste) + +Issue #93 is the umbrella epic for the DataDrop bot refactor and web app delivery. + +Implementation priority: + +1. Stabilize platform and data layer first +2. Enforce identity and verification rules second +3. Deliver admin configuration capabilities third +4. Deliver user-facing flows and analytics after the core is stable + +### Ordered Implementation Plan + +Phase 0: Delivery and persistence foundation + +1. #104 Deployment pipeline always fails +2. #111 Change ORM to Prisma +3. #71 The bot should log everything + +Phase 1: Concurrency, auditability, reliability, and SLOs + +1. #135 Persist config create/update audit trail +2. #136 Implement stale-write detection and superseded update deprecation for guild config +3. #132 Enforce strict optimistic locking with bounded retries for transition writes +4. #140 Implement dead-letter queue and remediation workflow for failed transitions +5. #139 Implement p95 under 500ms SLO instrumentation and alerting + +Phase 2: Identity and verification lifecycle + +1. #128 Implement global one-time verification identity across all DataDrop guilds +2. #130 Enforce global Henallux email uniqueness with staff alert on duplicate usage +3. #131 Guard manual implicit verification to VerificationPending with mandatory email check +4. #129 Enforce per-guild onboarding and rules acceptance even for globally verified users +5. #133 Add reverification campaigns with cohort filters and no historical override bypass + +Phase 3: Admin configuration (role and channel governance) + +1. #90 Configure admin role +2. #89 Configure announcement channel +3. #88 Configure number of years +4. #87 Configure number of classes/groups per year +5. #84 Configure grant-roles channel +6. #85 Configure general roles +7. #86 Configure role definitions (name, color, etc.) +8. #92 Configure through Discord commands +9. #91 Configure through web interface + +Phase 4: Compliance and user lifecycle + +1. #137 Self-serve data deletion and account deactivation with rolling 24h login block +2. #138 Retain moderation and audit evidence with userId linkage and pseudonymization +3. #77 User can contact guild staff by private message to the bot +4. #68 User can appeal guild ban through web interface + +Phase 5: Automation, provisioning, and insights + +1. #72 Automatic start-of-year announcement and yearly update campaign +2. #70 Generate server from saved guild configuration +3. #74 Read access to guild statistics +4. #73 Read access to dynamic leaderboard +5. #69 Additional user feature from the feature board +6. #94 Additional feature-list item tracked by epic + +### Role and Target Categorization + +Admin features + +- Bot target: #92, #90, #89, #88, #87, #86, #85, #84, #72, #71, #70 +- Web app target: #91 +- Shared bot and web target: #111, #135, #136 + +Bot owner features + +- Bot target: #81 (completed), #80 (completed) +- Platform target (ops): #104, #139, #140 + +User features + +- Bot target: #77, #74, #73, #69 +- Web app target: #68, #94 +- Shared bot and web target: #128, #129, #130, #131, #133, #137, #138 +- Already completed user features: #79, #78, #76, #75, #67 + +Feature-list items already completed in the admin bucket + +- #83 (completed) +- #82 (completed) + +### Notes + +- #93 remains tracking-only and should be updated as a checklist/progress board. +- #104 and #111 are hard prerequisites for predictable delivery speed and safe implementation of later phases. +- #132 and #140 should be treated as a pair: conflict policy first, failure handling immediately after. + +## Issue #93 Checkbox Board Format (GitHub-Ready) + +Use this block directly in Issue #93. + +```md +# Issue #93 - DataDrop Umbrella Epic + +This issue tracks bot refactor and web app delivery. + +Implementation priority: +1. Stabilize platform and data layer first +2. Enforce identity and verification rules second +3. Deliver admin configuration capabilities third +4. Deliver user-facing flows and analytics after the core is stable + +## Phase 0 - Delivery and persistence foundation + +- [ ] #104 Deployment pipeline always fails +- [ ] #111 Change ORM to Prisma +- [ ] #71 The bot should log everything + +## Phase 1 - Concurrency, auditability, reliability, and SLOs + +- [ ] #135 Persist config create/update audit trail +- [ ] #136 Implement stale-write detection and superseded update deprecation for guild config +- [ ] #132 Enforce strict optimistic locking with bounded retries for transition writes +- [ ] #140 Implement dead-letter queue and remediation workflow for failed transitions +- [ ] #139 Implement p95 under 500ms SLO instrumentation and alerting + +## Phase 2 - Identity and verification lifecycle + +- [ ] #128 Implement global one-time verification identity across all DataDrop guilds +- [ ] #130 Enforce global Henallux email uniqueness with staff alert on duplicate usage +- [ ] #131 Guard manual implicit verification to VerificationPending with mandatory email check +- [ ] #129 Enforce per-guild onboarding and rules acceptance even for globally verified users +- [ ] #133 Add reverification campaigns with cohort filters and no historical override bypass + +## Phase 3 - Admin configuration (role and channel governance) + +- [ ] #90 Configure admin role +- [ ] #89 Configure announcement channel +- [ ] #88 Configure number of years +- [ ] #87 Configure number of classes/groups per year +- [ ] #84 Configure grant-roles channel +- [ ] #85 Configure general roles +- [ ] #86 Configure role definitions (name, color, etc.) +- [ ] #92 Configure through Discord commands +- [ ] #91 Configure through web interface + +## Phase 4 - Compliance and user lifecycle + +- [ ] #137 Self-serve data deletion and account deactivation with rolling 24h login block +- [ ] #138 Retain moderation and audit evidence with userId linkage and pseudonymization +- [ ] #77 User can contact guild staff by private message to the bot +- [ ] #68 User can appeal guild ban through web interface + +## Phase 5 - Automation, provisioning, and insights + +- [ ] #72 Automatic start-of-year announcement and yearly update campaign +- [ ] #74 Read access to guild statistics +- [ ] #73 Read access to dynamic leaderboard + +## Role and target categorization + +### Admin features + +- Bot target: #92, #90, #89, #88, #87, #86, #85, #84, #72, #71 +- Web app target: #91 +- Shared bot and web target: #111, #135, #136 + +### Bot owner features + +- Platform target (ops): #104, #139, #140 + +### User features + +- Bot target: #77, #74, #73 +- Web app target: #68 +- Shared bot and web target: #128, #129, #130, #131, #133, #137, #138 + +## Tracking notes + +- #93 stays tracking-only. +- #104 and #111 are prerequisites for predictable delivery. +- #132 and #140 should be implemented as a reliability pair. +``` diff --git a/docs/specs/mvp-scope.md b/docs/specs/mvp-scope.md new file mode 100644 index 0000000..d91d3cd --- /dev/null +++ b/docs/specs/mvp-scope.md @@ -0,0 +1,34 @@ +# MVP Scope + +## In Scope + +1. Multi-tenant behavior keyed by `guildId`. +2. Mandatory verification flow integrated with lifecycle state machine. +3. BPMN-aligned transition enforcement. +4. Start-of-year automation: + - pre-reset admin prompt for settings + - dry-run summary + - explicit confirmation + - role reset and announcement +5. Config redesign path from JSON toward database model. +6. Core operational safety: + - optimistic locking with retry + - dead-letter queue + - remediation visibility for staff + +## Out of Scope for MVP (Later) + +1. discord-mailbox integration +2. member statistics portal +3. guild-wide statistics dashboards +4. public or private leaderboards +5. ban appeal web workflow + +## Acceptance Criteria + +1. A new guild can be onboarded without code changes. +2. Unverified users remain gated from protected channels and capabilities. +3. Manual override constraints are enforced by guard rules. +4. Yearly reset can be executed safely with admin confirmation. +5. Transition conflicts are handled without inconsistent state. +6. p95 latency target under 500ms is met for core operations. diff --git a/docs/specs/non-mvp-roadmap.md b/docs/specs/non-mvp-roadmap.md new file mode 100644 index 0000000..68cc2c8 --- /dev/null +++ b/docs/specs/non-mvp-roadmap.md @@ -0,0 +1,22 @@ +# Non-MVP Roadmap + +## Planned Features After MVP + +1. Ban appeal workflow in web app +2. Member personal stats +3. Guild analytics +4. Leaderboards with role-based exclusions +5. discord-mailbox and staff communication workflows + +## Suggested Delivery Order + +1. Ban appeal and reviewer workflow +2. Member and guild telemetry endpoints +3. Leaderboard rendering and filters +4. Communication workflows + +## Dependency Notes + +1. Ban appeal depends on persistent ban identity model keyed by `guildId + userId`. +2. Stats and leaderboards depend on stable telemetry ingestion and UTC storage conventions. +3. Web admin features depend on final config schema migration to database. diff --git a/docs/specs/state-machine.md b/docs/specs/state-machine.md new file mode 100644 index 0000000..934b304 --- /dev/null +++ b/docs/specs/state-machine.md @@ -0,0 +1,70 @@ +# Membership State Machine + +## Canonical Lifecycle + +```mermaid +stateDiagram-v2 + [*] --> InvitedOrJoined + InvitedOrJoined --> OnboardingInProgress + OnboardingInProgress --> OnboardingCompleted + OnboardingCompleted --> RoleEligible + RoleEligible --> RulesAccepted + RulesAccepted --> VerificationPending + VerificationPending --> Verified + + VerificationPending --> RejectedNotEligible + VerificationPending --> Kicked + VerificationPending --> LeftGuild + VerificationPending --> Banned + + Verified --> LeftGuild + Verified --> Banned + + RejectedNotEligible --> [*] + Kicked --> [*] + LeftGuild --> [*] + Banned --> [*] +``` + +## Critical Guard Rules + +1. Admin implicit verification transition is valid only from `VerificationPending`. +2. Admin implicit verification must hard fail if email is missing. +3. Successful manual implicit verification transition is only `VerificationPending -> Verified`. +4. Historical manual override does not grant bypass in future reverification waves. +5. Per-guild onboarding and rules acceptance remain mandatory even when user is globally verified. + +## Transition Control + +Every transition must include: + +1. Expected current state +2. Expected aggregate version +3. Idempotency key +4. Transition source +5. Reason code + +## Reconciliation Model + +```mermaid +flowchart TD + E[Event arrives from Bot or API] --> P[Load member aggregate] + P --> C{Expected state and version match?} + C -->|Yes| T[Apply transition] + T --> W[Write transition ledger + snapshot] + C -->|No| R[Reload and retry] + R --> B{Retry budget exceeded?} + B -->|No| C + B -->|Yes| D[Write dead-letter record] + D --> S[Show in remediation panel] +``` + +## Notes on Discord Signals + +- `GUILD_MEMBER_UPDATE` is treated as an input signal, not sole source of truth. +- Role and flag deltas can trigger reconciliation runs. +- No assumption is made that onboarding reruns always produce unique onboarding-specific flags changes. + +## Source Notes + +For member update events, pending behavior, and member flags, see [Discord API and Discord.js Sources](discord-sources.md). diff --git a/docs/specs/traceability-matrix.md b/docs/specs/traceability-matrix.md new file mode 100644 index 0000000..f72a760 --- /dev/null +++ b/docs/specs/traceability-matrix.md @@ -0,0 +1,84 @@ +# Strict Traceability Matrix + +This matrix maps each accepted rule to: + +1. Source specification section +2. GitHub issue link when available +3. Implementation target +4. Validation target + +If no issue exists yet, the traceability row must point to an explicit GitHub issue that is still pending implementation. + +## Matrix + +| Rule ID | Rule | Source | GitHub Issue | Coverage | Implementation Target | Validation Target | +|---|---|---|---|---|---|---| +| TRC-001 | Issue 93 is umbrella epic for bot refactor and web app | issue-93-specification.md / Purpose | https://github.com/section-ig/datadrop/issues/93 | Existing | Planning and milestone docs under docs/specs | Release checklist by epic gates | +| TRC-002 | Bot refactor has higher priority, web app can ship partially | issue-93-specification.md / Purpose | https://github.com/section-ig/datadrop/issues/93 | Existing | Delivery sequencing in docs/specs/mvp-scope.md and docs/specs/non-mvp-roadmap.md | Milestone scope audit | +| TRC-003 | Multi-tenant model keyed by guildId | issue-93-specification.md / Tenant Model | https://github.com/section-ig/datadrop/issues/93 | Partial | src/models/Configuration.ts, src/services/PostgresDatabaseService.ts, prisma/schema.prisma | Integration tests for tenant isolation | +| TRC-004 | Mandatory verification flow for platform access | issue-93-specification.md / Identity and Verification | https://github.com/section-ig/datadrop/issues/67 | Partial | src/events/interactionCreate.ts, src/events/guildMemberAdd.ts, src/datadrop.ts | End-to-end verification flow tests | +| TRC-005 | Per-guild onboarding and rules acceptance still mandatory | issue-93-specification.md / Identity and Verification | https://github.com/Section-IG/DataDrop/issues/129 | Existing | src/events/interactionCreate.ts, src/events/guildMemberAdd.ts, src/services/CommandHandler.ts | Scenario tests: globally verified but not guild-onboarded | +| TRC-006 | Global one-time verification across all servers using bot | issue-93-specification.md / Identity and Verification | https://github.com/Section-IG/DataDrop/issues/128 | Existing | prisma/schema.prisma, src/services/PostgresDatabaseService.ts, src/models/User.ts | Cross-guild identity tests | +| TRC-007 | Email uniqueness and duplicate-email staff notification | issue-93-specification.md / Identity and Verification | https://github.com/Section-IG/DataDrop/issues/130 | Existing | src/events/interactionCreate.ts, src/services/PostgresDatabaseService.ts, src/commands/admins/announce.ts | Duplicate verification conflict tests | +| TRC-008 | Admin implicit verification only from VerificationPending | issue-93-specification.md / State and Override Rules | https://github.com/Section-IG/DataDrop/issues/131 | Existing | src/events/interactionCreate.ts, src/services/PostgresDatabaseService.ts | State-guard unit tests | +| TRC-009 | Admin implicit verification fails if email missing | issue-93-specification.md / State and Override Rules | https://github.com/Section-IG/DataDrop/issues/131 | Existing | src/events/interactionCreate.ts, src/services/PostgresDatabaseService.ts | Command failure-path tests | +| TRC-010 | Historical manual override does not auto-bypass future reverification | issue-93-specification.md / State and Override Rules | https://github.com/Section-IG/DataDrop/issues/133 | Existing | prisma/schema.prisma, src/services/PostgresDatabaseService.ts | Reverification campaign tests | +| TRC-011 | Reverification supports targeted cohorts by filters | issue-93-specification.md / State and Override Rules | https://github.com/Section-IG/DataDrop/issues/133 | Existing | New admin command module under src/commands/admins, db query layer in src/services/PostgresDatabaseService.ts | Cohort filter integration tests | +| TRC-012 | Discord access blocked by role/channel gating for unverified users | issue-93-specification.md / Discord Access Enforcement | https://github.com/section-ig/datadrop/issues/75 | Partial | src/events/guildMemberAdd.ts, src/events/interactionCreate.ts, src/datadrop.ts | Permission and channel visibility tests | +| TRC-013 | Start-of-year reset with admin pre-check prompt | issue-93-specification.md / Start-of-Year Reset | https://github.com/section-ig/datadrop/issues/72 | Partial | src/events/clientReady.ts, new scheduler service under src/services | Scheduled workflow tests | +| TRC-014 | Year reset requires dry-run summary and explicit confirmation | issue-93-specification.md / Start-of-Year Reset | https://github.com/Section-IG/DataDrop/issues/134 | Existing | New admin command(s) under src/commands/admins, scheduler service under src/services | Dry-run confirmation flow tests | +| TRC-015 | Config redesign from JSON to DB model | issue-93-specification.md / Config Management | https://github.com/section-ig/datadrop/issues/91 | Partial | src/config.ts, src/models/Configuration.ts, prisma/schema.prisma | Migration and fallback tests | +| TRC-016 | Config create/update audit is mandatory | issue-93-specification.md / Config Management | https://github.com/Section-IG/DataDrop/issues/135 | Existing | prisma/schema.prisma, src/services/PostgresDatabaseService.ts, admin command handlers | Audit log assertion tests | +| TRC-017 | Stale-write detection and deprecation of superseded config submit | issue-93-specification.md / Config Management | https://github.com/Section-IG/DataDrop/issues/136 | Existing | src/services/PostgresDatabaseService.ts, admin config command handlers | Concurrency update tests | +| TRC-018 | Ban appeal is OAuth, strict by Discord userId, with reviewer roles | issue-93-specification.md / Ban Appeal | https://github.com/section-ig/datadrop/issues/68 | Existing (future) | Web app and API modules (to be created), moderation persistence in prisma/schema.prisma | Appeal identity and reviewer authorization tests | +| TRC-019 | Outcomes for ban appeal are unban or reject only | issue-93-specification.md / Ban Appeal | https://github.com/section-ig/datadrop/issues/68 | Existing (future) | Web app/API moderation workflows (to be created) | Decision outcome tests | +| TRC-020 | Self-serve delete-data and deactivate-account with distinct semantics | issue-93-specification.md / Data Deletion and Deactivation | https://github.com/Section-IG/DataDrop/issues/137 | Existing | New API endpoints (to be created), src/services/PostgresDatabaseService.ts, prisma/schema.prisma | Compliance flow tests | +| TRC-021 | Soft delete then hard delete after 6 months inactivity | issue-93-specification.md / Data Deletion and Deactivation | Existing behavior partially in https://github.com/section-ig/datadrop/issues/93 | Partial | src/services/PostgresDatabaseService.ts, prisma/schema.prisma | Retention scheduler tests | +| TRC-022 | Keep audit and moderation evidence with userId linkage plus pseudonymization | issue-93-specification.md / Data Deletion and Deactivation | https://github.com/Section-IG/DataDrop/issues/138 | Existing | New evidence retention model in prisma/schema.prisma and API (to be created) | Evidence retention tests | +| TRC-023 | Deactivation blocks login for rolling 24h | issue-93-specification.md / Data Deletion and Deactivation | https://github.com/Section-IG/DataDrop/issues/137 | Existing | Web auth API (to be created), token/session middleware (to be created) | Auth gate tests | +| TRC-024 | Performance SLO is p95 under 500ms | issue-93-specification.md / Performance and Reliability | https://github.com/Section-IG/DataDrop/issues/139 | Existing | Runtime instrumentation in bot and API (to be created) | SLO dashboards and load tests | +| TRC-025 | Dead-letter queue and staff remediation panel for failures | issue-93-specification.md / Performance and Reliability | https://github.com/Section-IG/DataDrop/issues/140 | Existing | New queue/error subsystem (to be created), admin panel integration (to be created) | Fault injection tests | +| TRC-026 | Strict optimistic locking with bounded retries for bot/API races | issue-93-specification.md / Performance and Reliability | https://github.com/Section-IG/DataDrop/issues/132 | Existing | src/services/PostgresDatabaseService.ts, prisma/schema.prisma, API write handlers (to be created) | Concurrency race tests | +| TRC-027 | Web app uses Discord OAuth and JWT for backend API access | issue-93-specification.md / Identity and Verification; Security and Compliance | https://github.com/section-ig/datadrop/issues/91 | Partial | Web auth/API modules (to be created) | OAuth and JWT security tests | +| TRC-028 | Stats and leaderboards are post-MVP with Discord plus telemetry sources | issue-93-specification.md / Data + non-mvp-roadmap.md | https://github.com/section-ig/datadrop/issues/73 and https://github.com/section-ig/datadrop/issues/74 | Existing (future) | Telemetry ingestion and reporting services (to be created) | Stats accuracy tests | + +## Strict Rules for Future Spec Changes + +1. No new rule may be accepted without a traceability row. +2. Every row must include either an existing GitHub issue link or an issue draft reference. +3. Every row must define at least one implementation target and one validation target. + +## Feature Request Coverage Map + +This map ensures known repository feature requests are traceable to spec scope and delivery phase. + +| Issue | Link | Traceability Status | Spec Mapping | +|---|---|---|---| +| #67 | https://github.com/section-ig/datadrop/issues/67 | Traced | issue-93-specification.md / Identity and Verification | +| #68 | https://github.com/section-ig/datadrop/issues/68 | Traced | issue-93-specification.md / Ban Appeal | +| #69 | https://github.com/section-ig/datadrop/issues/69 | Traced | non-mvp-roadmap.md / Planned Features | +| #70 | https://github.com/section-ig/datadrop/issues/70 | Traced | non-mvp-roadmap.md / Dependency Notes | +| #71 | https://github.com/section-ig/datadrop/issues/71 | Traced | issue-93-specification.md / Performance and Reliability | +| #72 | https://github.com/section-ig/datadrop/issues/72 | Traced | issue-93-specification.md / Start-of-Year Reset | +| #73 | https://github.com/section-ig/datadrop/issues/73 | Traced | non-mvp-roadmap.md / Planned Features | +| #74 | https://github.com/section-ig/datadrop/issues/74 | Traced | non-mvp-roadmap.md / Planned Features | +| #75 | https://github.com/section-ig/datadrop/issues/75 | Traced | issue-93-specification.md / Discord Access Enforcement | +| #76 | https://github.com/section-ig/datadrop/issues/76 | Traced | issue-93-specification.md / Identity and Verification | +| #77 | https://github.com/section-ig/datadrop/issues/77 | Traced | non-mvp-roadmap.md / Planned Features | +| #78 | https://github.com/section-ig/datadrop/issues/78 | Traced | non-mvp-roadmap.md / Planned Features | +| #79 | https://github.com/section-ig/datadrop/issues/79 | Traced | non-mvp-roadmap.md / Planned Features | +| #80 | https://github.com/section-ig/datadrop/issues/80 | Traced | non-mvp-roadmap.md / Suggested Delivery Order | +| #81 | https://github.com/section-ig/datadrop/issues/81 | Traced | issue-93-specification.md / Tenant Model and Config Management | +| #82 | https://github.com/section-ig/datadrop/issues/82 | Traced | issue-93-specification.md / Start-of-Year Reset | +| #83 | https://github.com/section-ig/datadrop/issues/83 | Traced | issue-93-specification.md / Config Management | +| #84 | https://github.com/section-ig/datadrop/issues/84 | Traced | issue-93-specification.md / Config Management | +| #85 | https://github.com/section-ig/datadrop/issues/85 | Traced | issue-93-specification.md / Config Management | +| #86 | https://github.com/section-ig/datadrop/issues/86 | Traced | issue-93-specification.md / Config Management | +| #87 | https://github.com/section-ig/datadrop/issues/87 | Traced | issue-93-specification.md / Start-of-Year Reset and Config Management | +| #88 | https://github.com/section-ig/datadrop/issues/88 | Traced | issue-93-specification.md / Start-of-Year Reset and Config Management | +| #89 | https://github.com/section-ig/datadrop/issues/89 | Traced | issue-93-specification.md / Start-of-Year Reset | +| #90 | https://github.com/section-ig/datadrop/issues/90 | Traced | issue-93-specification.md / Authorization Model | +| #91 | https://github.com/section-ig/datadrop/issues/91 | Traced | issue-93-specification.md / Purpose and Config Management | +| #92 | https://github.com/section-ig/datadrop/issues/92 | Traced | issue-93-specification.md / Purpose and MVP Scope | +| #93 | https://github.com/section-ig/datadrop/issues/93 | Traced | issue-93-specification.md / Purpose | +| #94 | https://github.com/section-ig/datadrop/issues/94 | Traced | non-mvp-roadmap.md / Planned Features | From 81f200bf7d7063267212cc59aa2722bdc0d136a7 Mon Sep 17 00:00:00 2001 From: HunteRoi Date: Sun, 7 Jun 2026 19:01:27 +0200 Subject: [PATCH 9/9] feat: configuration management in database with Prisma ORM migration --- docs/specs/traceability-matrix.md | 24 +- prisma/schema.prisma | 9 + scripts/envgen.cjs | 33 --- src/config.ts | 67 +++-- src/datadrop.ts | 34 ++- src/models/IDatabaseService.ts | 11 + src/services/PostgresDatabaseService.ts | 323 ------------------------ src/services/PrismaDatabaseService.ts | 216 ++++++++++++++++ src/services/index.ts | 2 +- 9 files changed, 329 insertions(+), 390 deletions(-) delete mode 100644 scripts/envgen.cjs delete mode 100644 src/services/PostgresDatabaseService.ts create mode 100644 src/services/PrismaDatabaseService.ts diff --git a/docs/specs/traceability-matrix.md b/docs/specs/traceability-matrix.md index f72a760..ed26e0c 100644 --- a/docs/specs/traceability-matrix.md +++ b/docs/specs/traceability-matrix.md @@ -15,30 +15,30 @@ If no issue exists yet, the traceability row must point to an explicit GitHub is |---|---|---|---|---|---|---| | TRC-001 | Issue 93 is umbrella epic for bot refactor and web app | issue-93-specification.md / Purpose | https://github.com/section-ig/datadrop/issues/93 | Existing | Planning and milestone docs under docs/specs | Release checklist by epic gates | | TRC-002 | Bot refactor has higher priority, web app can ship partially | issue-93-specification.md / Purpose | https://github.com/section-ig/datadrop/issues/93 | Existing | Delivery sequencing in docs/specs/mvp-scope.md and docs/specs/non-mvp-roadmap.md | Milestone scope audit | -| TRC-003 | Multi-tenant model keyed by guildId | issue-93-specification.md / Tenant Model | https://github.com/section-ig/datadrop/issues/93 | Partial | src/models/Configuration.ts, src/services/PostgresDatabaseService.ts, prisma/schema.prisma | Integration tests for tenant isolation | +| TRC-003 | Multi-tenant model keyed by guildId | issue-93-specification.md / Tenant Model | https://github.com/section-ig/datadrop/issues/93 | Partial | src/models/Configuration.ts, src/services/PrismaDatabaseService.ts, prisma/schema.prisma | Integration tests for tenant isolation | | TRC-004 | Mandatory verification flow for platform access | issue-93-specification.md / Identity and Verification | https://github.com/section-ig/datadrop/issues/67 | Partial | src/events/interactionCreate.ts, src/events/guildMemberAdd.ts, src/datadrop.ts | End-to-end verification flow tests | | TRC-005 | Per-guild onboarding and rules acceptance still mandatory | issue-93-specification.md / Identity and Verification | https://github.com/Section-IG/DataDrop/issues/129 | Existing | src/events/interactionCreate.ts, src/events/guildMemberAdd.ts, src/services/CommandHandler.ts | Scenario tests: globally verified but not guild-onboarded | -| TRC-006 | Global one-time verification across all servers using bot | issue-93-specification.md / Identity and Verification | https://github.com/Section-IG/DataDrop/issues/128 | Existing | prisma/schema.prisma, src/services/PostgresDatabaseService.ts, src/models/User.ts | Cross-guild identity tests | -| TRC-007 | Email uniqueness and duplicate-email staff notification | issue-93-specification.md / Identity and Verification | https://github.com/Section-IG/DataDrop/issues/130 | Existing | src/events/interactionCreate.ts, src/services/PostgresDatabaseService.ts, src/commands/admins/announce.ts | Duplicate verification conflict tests | -| TRC-008 | Admin implicit verification only from VerificationPending | issue-93-specification.md / State and Override Rules | https://github.com/Section-IG/DataDrop/issues/131 | Existing | src/events/interactionCreate.ts, src/services/PostgresDatabaseService.ts | State-guard unit tests | -| TRC-009 | Admin implicit verification fails if email missing | issue-93-specification.md / State and Override Rules | https://github.com/Section-IG/DataDrop/issues/131 | Existing | src/events/interactionCreate.ts, src/services/PostgresDatabaseService.ts | Command failure-path tests | -| TRC-010 | Historical manual override does not auto-bypass future reverification | issue-93-specification.md / State and Override Rules | https://github.com/Section-IG/DataDrop/issues/133 | Existing | prisma/schema.prisma, src/services/PostgresDatabaseService.ts | Reverification campaign tests | -| TRC-011 | Reverification supports targeted cohorts by filters | issue-93-specification.md / State and Override Rules | https://github.com/Section-IG/DataDrop/issues/133 | Existing | New admin command module under src/commands/admins, db query layer in src/services/PostgresDatabaseService.ts | Cohort filter integration tests | +| TRC-006 | Global one-time verification across all servers using bot | issue-93-specification.md / Identity and Verification | https://github.com/Section-IG/DataDrop/issues/128 | Existing | prisma/schema.prisma, src/services/PrismaDatabaseService.ts, src/models/User.ts | Cross-guild identity tests | +| TRC-007 | Email uniqueness and duplicate-email staff notification | issue-93-specification.md / Identity and Verification | https://github.com/Section-IG/DataDrop/issues/130 | Existing | src/events/interactionCreate.ts, src/services/PrismaDatabaseService.ts, src/commands/admins/announce.ts | Duplicate verification conflict tests | +| TRC-008 | Admin implicit verification only from VerificationPending | issue-93-specification.md / State and Override Rules | https://github.com/Section-IG/DataDrop/issues/131 | Existing | src/events/interactionCreate.ts, src/services/PrismaDatabaseService.ts | State-guard unit tests | +| TRC-009 | Admin implicit verification fails if email missing | issue-93-specification.md / State and Override Rules | https://github.com/Section-IG/DataDrop/issues/131 | Existing | src/events/interactionCreate.ts, src/services/PrismaDatabaseService.ts | Command failure-path tests | +| TRC-010 | Historical manual override does not auto-bypass future reverification | issue-93-specification.md / State and Override Rules | https://github.com/Section-IG/DataDrop/issues/133 | Existing | prisma/schema.prisma, src/services/PrismaDatabaseService.ts | Reverification campaign tests | +| TRC-011 | Reverification supports targeted cohorts by filters | issue-93-specification.md / State and Override Rules | https://github.com/Section-IG/DataDrop/issues/133 | Existing | New admin command module under src/commands/admins, db query layer in src/services/PrismaDatabaseService.ts | Cohort filter integration tests | | TRC-012 | Discord access blocked by role/channel gating for unverified users | issue-93-specification.md / Discord Access Enforcement | https://github.com/section-ig/datadrop/issues/75 | Partial | src/events/guildMemberAdd.ts, src/events/interactionCreate.ts, src/datadrop.ts | Permission and channel visibility tests | | TRC-013 | Start-of-year reset with admin pre-check prompt | issue-93-specification.md / Start-of-Year Reset | https://github.com/section-ig/datadrop/issues/72 | Partial | src/events/clientReady.ts, new scheduler service under src/services | Scheduled workflow tests | | TRC-014 | Year reset requires dry-run summary and explicit confirmation | issue-93-specification.md / Start-of-Year Reset | https://github.com/Section-IG/DataDrop/issues/134 | Existing | New admin command(s) under src/commands/admins, scheduler service under src/services | Dry-run confirmation flow tests | | TRC-015 | Config redesign from JSON to DB model | issue-93-specification.md / Config Management | https://github.com/section-ig/datadrop/issues/91 | Partial | src/config.ts, src/models/Configuration.ts, prisma/schema.prisma | Migration and fallback tests | -| TRC-016 | Config create/update audit is mandatory | issue-93-specification.md / Config Management | https://github.com/Section-IG/DataDrop/issues/135 | Existing | prisma/schema.prisma, src/services/PostgresDatabaseService.ts, admin command handlers | Audit log assertion tests | -| TRC-017 | Stale-write detection and deprecation of superseded config submit | issue-93-specification.md / Config Management | https://github.com/Section-IG/DataDrop/issues/136 | Existing | src/services/PostgresDatabaseService.ts, admin config command handlers | Concurrency update tests | +| TRC-016 | Config create/update audit is mandatory | issue-93-specification.md / Config Management | https://github.com/Section-IG/DataDrop/issues/135 | Existing | prisma/schema.prisma, src/services/PrismaDatabaseService.ts, admin command handlers | Audit log assertion tests | +| TRC-017 | Stale-write detection and deprecation of superseded config submit | issue-93-specification.md / Config Management | https://github.com/Section-IG/DataDrop/issues/136 | Existing | src/services/PrismaDatabaseService.ts, admin config command handlers | Concurrency update tests | | TRC-018 | Ban appeal is OAuth, strict by Discord userId, with reviewer roles | issue-93-specification.md / Ban Appeal | https://github.com/section-ig/datadrop/issues/68 | Existing (future) | Web app and API modules (to be created), moderation persistence in prisma/schema.prisma | Appeal identity and reviewer authorization tests | | TRC-019 | Outcomes for ban appeal are unban or reject only | issue-93-specification.md / Ban Appeal | https://github.com/section-ig/datadrop/issues/68 | Existing (future) | Web app/API moderation workflows (to be created) | Decision outcome tests | -| TRC-020 | Self-serve delete-data and deactivate-account with distinct semantics | issue-93-specification.md / Data Deletion and Deactivation | https://github.com/Section-IG/DataDrop/issues/137 | Existing | New API endpoints (to be created), src/services/PostgresDatabaseService.ts, prisma/schema.prisma | Compliance flow tests | -| TRC-021 | Soft delete then hard delete after 6 months inactivity | issue-93-specification.md / Data Deletion and Deactivation | Existing behavior partially in https://github.com/section-ig/datadrop/issues/93 | Partial | src/services/PostgresDatabaseService.ts, prisma/schema.prisma | Retention scheduler tests | +| TRC-020 | Self-serve delete-data and deactivate-account with distinct semantics | issue-93-specification.md / Data Deletion and Deactivation | https://github.com/Section-IG/DataDrop/issues/137 | Existing | New API endpoints (to be created), src/services/PrismaDatabaseService.ts, prisma/schema.prisma | Compliance flow tests | +| TRC-021 | Soft delete then hard delete after 6 months inactivity | issue-93-specification.md / Data Deletion and Deactivation | Existing behavior partially in https://github.com/section-ig/datadrop/issues/93 | Partial | src/services/PrismaDatabaseService.ts, prisma/schema.prisma | Retention scheduler tests | | TRC-022 | Keep audit and moderation evidence with userId linkage plus pseudonymization | issue-93-specification.md / Data Deletion and Deactivation | https://github.com/Section-IG/DataDrop/issues/138 | Existing | New evidence retention model in prisma/schema.prisma and API (to be created) | Evidence retention tests | | TRC-023 | Deactivation blocks login for rolling 24h | issue-93-specification.md / Data Deletion and Deactivation | https://github.com/Section-IG/DataDrop/issues/137 | Existing | Web auth API (to be created), token/session middleware (to be created) | Auth gate tests | | TRC-024 | Performance SLO is p95 under 500ms | issue-93-specification.md / Performance and Reliability | https://github.com/Section-IG/DataDrop/issues/139 | Existing | Runtime instrumentation in bot and API (to be created) | SLO dashboards and load tests | | TRC-025 | Dead-letter queue and staff remediation panel for failures | issue-93-specification.md / Performance and Reliability | https://github.com/Section-IG/DataDrop/issues/140 | Existing | New queue/error subsystem (to be created), admin panel integration (to be created) | Fault injection tests | -| TRC-026 | Strict optimistic locking with bounded retries for bot/API races | issue-93-specification.md / Performance and Reliability | https://github.com/Section-IG/DataDrop/issues/132 | Existing | src/services/PostgresDatabaseService.ts, prisma/schema.prisma, API write handlers (to be created) | Concurrency race tests | +| TRC-026 | Strict optimistic locking with bounded retries for bot/API races | issue-93-specification.md / Performance and Reliability | https://github.com/Section-IG/DataDrop/issues/132 | Existing | src/services/PrismaDatabaseService.ts, prisma/schema.prisma, API write handlers (to be created) | Concurrency race tests | | TRC-027 | Web app uses Discord OAuth and JWT for backend API access | issue-93-specification.md / Identity and Verification; Security and Compliance | https://github.com/section-ig/datadrop/issues/91 | Partial | Web auth/API modules (to be created) | OAuth and JWT security tests | | TRC-028 | Stats and leaderboards are post-MVP with Discord plus telemetry sources | issue-93-specification.md / Data + non-mvp-roadmap.md | https://github.com/section-ig/datadrop/issues/73 and https://github.com/section-ig/datadrop/issues/74 | Existing (future) | Telemetry ingestion and reporting services (to be created) | Stats accuracy tests | diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 8fb1f7e..402191e 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -57,3 +57,12 @@ model users { @@schema("public") } + +model guild_configurations { + guildid String @id + data String + createdat DateTime @default(now()) @db.Timestamp(6) + updatedat DateTime @updatedAt @db.Timestamp(6) + + @@schema("public") +} diff --git a/scripts/envgen.cjs b/scripts/envgen.cjs deleted file mode 100644 index 0fad551..0000000 --- a/scripts/envgen.cjs +++ /dev/null @@ -1,33 +0,0 @@ -const fs = require("node:fs/promises"); - -const path = `${__dirname}/..`; - -function stringifyOnSingleLine(json) { - const object = JSON.parse(json); - return JSON.stringify(object); -} - -function extractEnvironmentName(envContent) { - const regex = /NODE_ENV=(\w+)/; - const matches = regex.exec(envContent); - return matches && matches.length >= 2 && matches[1]; -} - -async function asASingleVariable() { - const templatedEnv = await fs.readFile(`${path}/.env`, "utf-8"); - const environment = ( - extractEnvironmentName(templatedEnv) || "development" - ).toLowerCase(); - const json = await fs.readFile( - `${path}/config.${environment}.json`, - "utf-8", - ); - - console.log(`Loading configuration for ${environment}`); - await fs.writeFile( - `${path}/.env`, - `CONFIG=${stringifyOnSingleLine(json)}\n${templatedEnv}`, - ); -} - -asASingleVariable(); diff --git a/src/config.ts b/src/config.ts index 1e4754b..2fa786f 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,3 +1,6 @@ +import { readFile } from "node:fs/promises"; +import { join } from "node:path"; + import packageInfo from "../package.json" with { type: "json" }; import type { Configuration } from "./models/index.js"; @@ -41,26 +44,56 @@ export async function readConfig(): Promise { const environment = ( process.env.NODE_ENV || "development" ).toLowerCase(); + const jsonPath = join(import.meta.dirname, "..", `config.${environment}.json`); + const json = JSON.parse(await readFile(jsonPath, "utf-8")); - const json = JSON.parse(process.env.CONFIG ?? "{}"); - for (const prop in json) { - if (/regex/i.exec(prop)) { - json[prop] = new RegExp(json[prop]); - } - } - - const config = { - ...json, - version: `${environment}-v${packageInfo.version}`, - }; - config.communicationServiceOptions.auth = { - user: process.env.SMTP_USER, - pass: process.env.SMTP_PASS, - }; - - return config; + return fromRawConfiguration(json); } catch (err: unknown) { console.error(err); return defaultConfig; } } + +export function toPersistedConfiguration( + config: Configuration, +): Record { + const { version: _, dynamicChannelPrefixRegex, communicationServiceOptions, ...rest } = + config; + const { auth: __, ...smtpOptions } = communicationServiceOptions; + + return { + ...rest, + dynamicChannelPrefixRegex: dynamicChannelPrefixRegex.source, + communicationServiceOptions: smtpOptions, + }; +} + +export function fromPersistedConfiguration( + persisted: Record, +): Configuration { + return fromRawConfiguration(persisted); +} + +function fromRawConfiguration(raw: Record): Configuration { + const environment = (process.env.NODE_ENV || "development").toLowerCase(); + const dynamicChannelPrefixRegex = + typeof raw.dynamicChannelPrefixRegex === "string" + ? new RegExp(raw.dynamicChannelPrefixRegex) + : defaultConfig.dynamicChannelPrefixRegex; + const communicationServiceOptions = { + ...defaultConfig.communicationServiceOptions, + ...(raw.communicationServiceOptions as Record), + auth: { + user: process.env.SMTP_USER ?? "", + pass: process.env.SMTP_PASS ?? "", + }, + }; + + return { + ...defaultConfig, + ...(raw as Partial), + dynamicChannelPrefixRegex, + communicationServiceOptions, + version: `${environment}-v${packageInfo.version}`, + }; +} diff --git a/src/datadrop.ts b/src/datadrop.ts index 26da22d..faacf21 100644 --- a/src/datadrop.ts +++ b/src/datadrop.ts @@ -34,7 +34,6 @@ import { type VoiceChannel, } from "discord.js"; -import { readConfig } from "./config.js"; import { getErrorMessage, readFilesFrom } from "./helpers.js"; import type { Command, @@ -43,7 +42,7 @@ import type { IDatabaseService, User, } from "./models/index.js"; -import { PostgresDatabaseService, SMTPService } from "./services/index.js"; +import { PrismaDatabaseService, SMTPService } from "./services/index.js"; export class DatadropClient extends Client { #config: Configuration; @@ -74,7 +73,7 @@ export class DatadropClient extends Client { }); this.tempChannelsManager = new TempChannelsManager(this); - this.database = new PostgresDatabaseService(this.logger); + this.database = new PrismaDatabaseService(this.logger); const communicationService = new SMTPService( config.communicationServiceOptions, ); @@ -105,7 +104,18 @@ export class DatadropClient extends Client { } async reloadConfig(): Promise { - this.#config = await readConfig(); + const configFromDatabase = await this.database.readConfiguration( + this.#config.guildId, + ); + + if (!configFromDatabase) { + this.logger.warn( + `Aucune configuration trouvée en base pour la guilde ${this.#config.guildId}.`, + ); + return; + } + + this.#config = configFromDatabase; } #listenToVerificationEvents(): void { @@ -410,6 +420,22 @@ export class DatadropClient extends Client { await this.#bindCommands(); await this.database?.start(); + const configFromDatabase = await this.database.readConfiguration( + this.#config.guildId, + ); + + if (configFromDatabase) { + this.#config = configFromDatabase; + this.logger.info( + `Configuration de la guilde ${this.#config.guildId} chargée depuis la base de données.`, + ); + } else { + await this.database.writeConfiguration(this.#config); + this.logger.info( + `Configuration de la guilde ${this.#config.guildId} initialisée en base de données depuis la configuration de bootstrap.`, + ); + } + this.login(); } catch (error) { this.logger.error( diff --git a/src/models/IDatabaseService.ts b/src/models/IDatabaseService.ts index 7181e78..6d6397e 100644 --- a/src/models/IDatabaseService.ts +++ b/src/models/IDatabaseService.ts @@ -1,6 +1,7 @@ import type { IStoringSystem } from "@hunteroi/discord-verification"; import type { Snowflake } from "discord.js"; +import type { Configuration } from "./Configuration.js"; import type { User } from "./User.js"; export type IDatabaseService = { @@ -25,4 +26,14 @@ export type IDatabaseService = { * */ undoDelete: (userid: Snowflake) => Promise; + + /** + * Reads a guild configuration. + */ + readConfiguration: (guildId: Snowflake) => Promise; + + /** + * Persists a guild configuration. + */ + writeConfiguration: (config: Configuration) => Promise; } & IStoringSystem; diff --git a/src/services/PostgresDatabaseService.ts b/src/services/PostgresDatabaseService.ts deleted file mode 100644 index bae09d0..0000000 --- a/src/services/PostgresDatabaseService.ts +++ /dev/null @@ -1,323 +0,0 @@ -import type { ConsoleLogger } from "@hunteroi/advanced-logger"; -import type { Snowflake } from "discord.js"; -import { - type Client, - connect, - type DatabaseError, - type PreparedStatement, -} from "ts-postgres"; - -import { getErrorMessage } from "../helpers.js"; -import type { IDatabaseService, User } from "../models/index.js"; - -export class PostgresDatabaseService implements IDatabaseService { - readonly #logger: ConsoleLogger; - #database!: Client; - - /** - * Creates an instance of DatabaseService. - * @param {Logger} logger - * @memberof DatabaseService - */ - constructor(logger: ConsoleLogger) { - this.#logger = logger; - } - - /** - * @inherited - */ - public async start(): Promise { - this.#database = await connect({ - user: process.env.POSTGRES_USER, - password: process.env.POSTGRES_PASSWORD, - host: process.env.DATABASE_HOST, - port: Number(process.env.DATABASE_PORT), - database: process.env.POSTGRES_DB, - }); - this.#listenToDatabaseEvents(); - - await this.#database.query(`CREATE TABLE IF NOT EXISTS Migrations ( - id serial PRIMARY KEY, - name text UNIQUE, - date timestamp NOT NULL DEFAULT now() - );`); - - await this.#database.query(`CREATE TABLE IF NOT EXISTS Users ( - userId text NOT NULL PRIMARY KEY, - data text UNIQUE, - code text, - activatedCode text, - activationTimestamp text, - username text NOT NULL, - status integer NOT NULL, - nbCodeCalled integer NOT NULL DEFAULT 0, - nbVerifyCalled integer NOT NULL DEFAULT 0, - createdAt timestamp NOT NULL DEFAULT now(), - updatedAt timestamp, - isDeleted timestamp - );`); - await this.#database.query(`CREATE OR REPLACE FUNCTION set_updatedAt() RETURNS TRIGGER AS $set_updatedAt$ - BEGIN - NEW.updatedAt = now(); - RETURN NEW; - END; - $set_updatedAt$ LANGUAGE plpgsql; - `); - await this.#database.query( - "CREATE OR REPLACE TRIGGER users_update BEFORE UPDATE ON Users FOR EACH ROW EXECUTE PROCEDURE set_updatedAt();", - ); - - const jobs = await this.#database.query("SELECT * FROM cron.job"); - if (jobs.rows.length === 0) { - await this.#database.query("SELECT cron.schedule($1, $2);", [ - "0 0 * * *", - "DELETE FROM Users WHERE isDeleted IS NOT NULL AND isDeleted < NOW() - INTERVAL '6 months'", - ]); - } - - await this.#runMigrations(); - } - - /** - * @inherited - */ - public async stop(): Promise { - await this.#database.end(); - } - - /** - * @inherited - */ - public async read(userid: Snowflake): Promise { - this.#logger.verbose( - `Lecture de l'utilisateur sur base de l'identifiant ${userid}`, - ); - const statement = await this.#database.prepare( - "SELECT * FROM Users WHERE userId = $1;", - ); - return await this.#executeStatement(statement, [userid]); - } - - /** - * @inherited - */ - public async readBy( - argument: // biome-ignore lint/suspicious/noExplicitAny: DB values can be of any type - Map | ((user: User, index: string | number) => boolean), - ): Promise { - if (!(argument instanceof Map)) - throw new Error("Method not implemented."); - - this.#logger.verbose( - `Lecture de l'utilisateur sur base des filtres ${JSON.stringify(argument)}`, - ); - let sqlQuery = "SELECT * FROM Users"; - let nbArguments = 1; - while (nbArguments <= argument.size * 2) { - if (sqlQuery.includes("WHERE")) sqlQuery += " AND "; - else sqlQuery += " WHERE "; - sqlQuery += `$${nbArguments} = $${++nbArguments}`; - nbArguments++; - } - const statement = await this.#database.prepare(sqlQuery); - return await this.#executeStatement( - statement, - [...argument.entries()].flat(), - ); - } - - /** - * @inherited - */ - public async write(user: User): Promise { - this.#logger.verbose( - `Écriture de l'utilisateur ${JSON.stringify(user)}`, - ); - - const userid = user.userid; - const data = user.data; - const offset = 3; - const userEntries = Object.entries(user); - const insertColumns = [ - "status", - "code", - "nbCodeCalled", - "nbVerifyCalled", - "username", - ].sort(this.#ascendingSort); - const insertValues = userEntries - .filter(([prop]) => insertColumns.includes(prop)) - .sort(([prop1], [prop2]) => this.#ascendingSort(prop1, prop2)); - const updateColumns = new Set( - [ - "status", - "code", - "nbCodeCalled", - "nbVerifyCalled", - "activatedCode", - "activationTimestamp", - ].sort(this.#ascendingSort), - ); - const updateValues = userEntries - .filter(([prop]) => updateColumns.has(prop)) - .sort(([prop1], [prop2]) => this.#ascendingSort(prop1, prop2)); - - const sqlQuery = `INSERT INTO Users (userId, data, createdAt, ${this.#listParameters(insertColumns)}) - VALUES ($1, $2, NOW(), ${this.#listValues(insertValues, offset)}) - ON CONFLICT (userId) DO UPDATE SET ${this.#listParametersWithValues(updateValues, offset + insertValues.length)} WHERE EXCLUDED.userId = $1;`; - const values = [ - userid, - JSON.stringify(data), - ...this.#deconstructValues(insertValues), - ...this.#deconstructValues(updateValues), - ]; - - const statement = await this.#database.prepare(sqlQuery); - await this.#executeStatement(statement, values, false); - } - - /** - * @inherited - */ - public async delete(userid: Snowflake): Promise { - this.#logger.verbose( - `Suppresion de l'utilisateur sur base de l'identifiant ${userid}`, - ); - const statement = await this.#database.prepare( - "UPDATE Users SET isDeleted = NOW() WHERE userId = $1;", - ); - await this.#executeStatement(statement, [userid], false); - } - - /** - * @inherited - */ - public async undoDelete(userid: Snowflake): Promise { - this.#logger.verbose( - `Réversion de la suppresion de l'utilisateur sur base de l'identifiant ${userid}`, - ); - const statement = await this.#database.prepare( - "UPDATE Users SET isDeleted = NULL WHERE userId = $1;", - ); - await this.#executeStatement(statement, [userid], false); - } - - //#region private - async #runMigrations(): Promise { - await this.#runMigration("User soft delete", async () => { - await this.#database.query( - "ALTER TABLE Users ADD COLUMN IF NOT EXISTS isDeleted timestamp;", - ); - }); - } - - async #runMigration(name: string, callback: () => Promise) { - const result = await this.#database.query( - "SELECT * FROM Migrations WHERE name = $1", - [name], - ); - this.#logger.verbose( - `Running migration "${name}" with pre-query returning ${JSON.stringify(result)}`, - ); - if (result && result.rows.length === 0) { - await this.#database.query( - "INSERT INTO Migrations (name) VALUES($1);", - [name], - ); - await callback(); - } - } - - #listenToDatabaseEvents() { - this.#database.on("end", () => - this.#logger.info("Connexion fermée avec la base de données!"), - ); - this.#database.on("error", (error: DatabaseError) => - this.#logger.error( - `Une erreur est survenue lors de l'utilisation de la base de données: \n${error.message}`, - ), - ); - } - - #ascendingSort(string1: string, string2: string): number { - if (string1 > string2) return 1; - if (string1 < string2) return -1; - return 0; - } - - #listParameters(parameters: string[]): string { - return parameters.join(", "); - } - - // biome-ignore lint/suspicious/noExplicitAny: DB values can be of any type - #listValues(values: [string, any][], offset: number): string { - return values.map((_, index) => `$${index + offset}`).join(", "); - } - - // biome-ignore lint/suspicious/noExplicitAny: DB values can be of any type - #listParametersWithValues(values: [string, any][], offset: number) { - return values - .map(([prop], index) => `${prop} = $${index + offset}`) - .join(", "); - } - - // biome-ignore lint/suspicious/noExplicitAny: DB values can be of any type - #deconstructValues(values: [string, any][]): any[] { - return values.flatMap(([, v]) => - v instanceof Object && typeof v !== "bigint" - ? JSON.stringify(v) - : (v ?? null), - ); - } - - async #executeStatement( - statement: PreparedStatement, - // biome-ignore lint/suspicious/noExplicitAny: DB values can be of any type - values: any[] = [], - isSelect = true, - ): Promise { - const notFoundMessage = "User not found"; - try { - const result = await statement.execute(values); - if (!isSelect) return null; - - const entity = result.rows.at(-1); - if (!entity) throw new Error(notFoundMessage); - - const asDate = (value: string | undefined | null): Date | null => - value ? new Date(value) : null; - const asInteger = ( - value: string | undefined | null, - ): number | null => (value ? Number.parseInt(value, 10) : null); - const user = { - userid: entity.get("userid")?.valueOf(), - data: JSON.parse(entity.get("data")?.toString() ?? "{}"), - username: entity.get("username")?.valueOf(), - createdAt: asDate(entity.get("createdat")?.valueOf() as string), - updatedAt: asDate(entity.get("updatedat")?.valueOf() as string), - status: entity.get("status")?.valueOf(), - code: entity.get("code")?.valueOf(), - activatedCode: entity.get("activatedcode")?.valueOf(), - activationTimestamp: asInteger( - entity.get("activationtimestamp")?.valueOf() as string, - ), - nbCodeCalled: entity.get("nbcodecalled")?.valueOf(), - nbVerifyCalled: entity.get("nbverifycalled")?.valueOf(), - isDeleted: asDate(entity.get("isdeleted")?.valueOf() as string), - } as User; - - return user; - } catch (error) { - const errorMessage = getErrorMessage(error); - if (errorMessage === notFoundMessage) { - this.#logger.verbose(errorMessage); - } else { - this.#logger.error(errorMessage); - } - return null; - } finally { - await statement.close(); - } - } - //#endregion -} diff --git a/src/services/PrismaDatabaseService.ts b/src/services/PrismaDatabaseService.ts new file mode 100644 index 0000000..8b6483d --- /dev/null +++ b/src/services/PrismaDatabaseService.ts @@ -0,0 +1,216 @@ +import type { ConsoleLogger } from "@hunteroi/advanced-logger"; +import { PrismaClient } from "@prisma/client"; +import type { Snowflake } from "discord.js"; + +import { + fromPersistedConfiguration, + toPersistedConfiguration, +} from "../config.js"; +import { getErrorMessage } from "../helpers.js"; +import type { Configuration, IDatabaseService, User } from "../models/index.js"; + +export class PrismaDatabaseService implements IDatabaseService { + readonly #logger: ConsoleLogger; + readonly #database: PrismaClient; + + constructor(logger: ConsoleLogger) { + this.#logger = logger; + this.#database = new PrismaClient(); + } + + public async start(): Promise { + await this.#database.$connect(); + + this.#logger.info("Connexion Prisma ouverte avec la base de donnees."); + } + + public async stop(): Promise { + await this.#database.$disconnect(); + + this.#logger.info("Connexion Prisma fermee avec la base de donnees."); + } + + public async read(userid: Snowflake): Promise { + this.#logger.verbose( + `Lecture de l'utilisateur sur base de l'identifiant ${userid}`, + ); + + try { + const entity = await this.#database.users.findUnique({ + where: { userid }, + }); + + return entity ? this.#mapDatabaseUser(entity) : null; + } catch (error) { + this.#logger.error(getErrorMessage(error)); + return null; + } + } + + public async readBy( + argument: + | Map + | ((user: User, index: string | number) => boolean), + ): Promise { + try { + if (argument instanceof Map) { + this.#logger.verbose( + `Lecture de l'utilisateur sur base des filtres ${JSON.stringify([...argument.entries()])}`, + ); + + const where: Record = {}; + for (const [key, value] of argument.entries()) { + where[key] = + typeof value === "object" && value !== null + ? JSON.stringify(value) + : value; + } + + const entity = await this.#database.users.findFirst({ where }); + return entity ? this.#mapDatabaseUser(entity) : null; + } + + // Fallback for callback-based filtering expected by the storage contract. + const users = await this.#database.users.findMany(); + const matched = users + .map((user) => this.#mapDatabaseUser(user)) + .find(argument); + return matched ?? null; + } catch (error) { + this.#logger.error(getErrorMessage(error)); + return null; + } + } + + public async write(user: User): Promise { + this.#logger.verbose(`Ecriture de l'utilisateur ${JSON.stringify(user)}`); + + try { + await this.#database.users.upsert({ + where: { userid: user.userid }, + create: { + userid: user.userid, + data: JSON.stringify(user.data), + code: user.code ?? null, + activatedCode: user.activatedCode ?? null, + activationTimestamp: user.activationTimestamp ?? null, + username: user.username, + status: user.status, + nbCodeCalled: user.nbCodeCalled, + nbVerifyCalled: user.nbVerifyCalled, + isDeleted: user.isDeleted ?? null, + }, + update: { + data: JSON.stringify(user.data), + code: user.code ?? null, + activatedCode: user.activatedCode ?? null, + activationTimestamp: user.activationTimestamp ?? null, + username: user.username, + status: user.status, + nbCodeCalled: user.nbCodeCalled, + nbVerifyCalled: user.nbVerifyCalled, + }, + }); + } catch (error) { + this.#logger.error(getErrorMessage(error)); + } + } + + public async delete(userid: Snowflake): Promise { + this.#logger.verbose( + `Suppression de l'utilisateur sur base de l'identifiant ${userid}`, + ); + + try { + await this.#database.users.update({ + where: { userid }, + data: { isDeleted: new Date() }, + }); + } catch (error) { + this.#logger.error(getErrorMessage(error)); + } + } + + public async undoDelete(userid: Snowflake): Promise { + this.#logger.verbose( + `Reversion de la suppression de l'utilisateur sur base de l'identifiant ${userid}`, + ); + + try { + await this.#database.users.update({ + where: { userid }, + data: { isDeleted: null }, + }); + } catch (error) { + this.#logger.error(getErrorMessage(error)); + } + } + + public async readConfiguration( + guildId: Snowflake, + ): Promise { + this.#logger.verbose(`Lecture de la configuration de guilde ${guildId}`); + + try { + const rows = await this.#database.$queryRaw< + Array<{ data: string }> + >`SELECT data FROM "GuildConfigurations" WHERE "guildId" = ${guildId} LIMIT 1`; + const entity = rows.at(-1); + if (!entity) return null; + + return fromPersistedConfiguration( + JSON.parse(entity.data) as Record, + ); + } catch (error) { + this.#logger.error(getErrorMessage(error)); + return null; + } + } + + public async writeConfiguration(config: Configuration): Promise { + this.#logger.verbose( + `Ecriture de la configuration de guilde ${config.guildId}`, + ); + + try { + await this.#database.$executeRaw` + INSERT INTO "GuildConfigurations" ("guildId", data, "createdAt") + VALUES (${config.guildId}, ${JSON.stringify(toPersistedConfiguration(config))}, NOW()) + ON CONFLICT ("guildId") + DO UPDATE SET data = EXCLUDED.data, "updatedAt" = NOW(); + `; + } catch (error) { + this.#logger.error(getErrorMessage(error)); + } + } + + #mapDatabaseUser(entity: { + userid: string; + data: string | null; + code: string | null; + activatedCode: string | null; + activationTimestamp: number | null; + username: string; + status: number; + nbCodeCalled: number; + nbVerifyCalled: number; + createdAt: Date; + updatedAt: Date; + isDeleted: Date | null; + }): User { + return { + userid: entity.userid, + data: JSON.parse(entity.data ?? "{}"), + code: entity.code ?? undefined, + activatedCode: entity.activatedCode ?? undefined, + activationTimestamp: entity.activationTimestamp ?? undefined, + username: entity.username, + status: entity.status, + nbCodeCalled: entity.nbCodeCalled, + nbVerifyCalled: entity.nbVerifyCalled, + createdAt: entity.createdAt, + updatedAt: entity.updatedAt, + isDeleted: entity.isDeleted, + } as User; + } +} diff --git a/src/services/index.ts b/src/services/index.ts index 3d88b47..76621b5 100644 --- a/src/services/index.ts +++ b/src/services/index.ts @@ -1,2 +1,2 @@ -export { PostgresDatabaseService } from "./PostgresDatabaseService.js"; +export { PrismaDatabaseService } from "./PrismaDatabaseService.js"; export { SMTPService } from "./SMTPService.js";