diff --git a/.dockerignore b/.dockerignore index 473b71bb3..e6c4edc38 100644 --- a/.dockerignore +++ b/.dockerignore @@ -8,6 +8,8 @@ **/node_modules **/dist +**/.pnpm-store +**/.docker **/*.log **/npm-debug.log* @@ -35,6 +37,7 @@ # Debug files **/*.debug.ts **/*.debug.js +/debug **/.vscode diff --git a/.gitattributes b/.gitattributes index 1a6bd4587..416a5df90 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,2 @@ package-lock.json binary +pnpm-lock.yaml binary diff --git a/.github/workflows/codequality.yml b/.github/workflows/codequality.yml index a5a59872b..3d8d61f6b 100644 --- a/.github/workflows/codequality.yml +++ b/.github/workflows/codequality.yml @@ -6,18 +6,18 @@ jobs: build: runs-on: ubuntu-latest - strategy: - matrix: - node-version: [22] - steps: - - uses: actions/checkout@v1 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 + + - uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 with: - node-version: ${{ matrix.node-version }} - - name: npm install, lint, code style check - run: | - npm ci - npm run lint - npm run codestyle-check + node-version: 24 + + - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 + with: + version: 10.19.0 + run_install: true + + - run: | + pnpm run lint + pnpm run codestyle-check diff --git a/.gitignore b/.gitignore index fe2e0caea..ea8b3f580 100644 --- a/.gitignore +++ b/.gitignore @@ -40,6 +40,7 @@ build/Release # Dependency directories node_modules/ jspm_packages/ +.pnpm-store # Typescript v1 declaration files typings/ diff --git a/.nvmrc b/.nvmrc index 2bd5a0a98..a45fd52cc 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -22 +24 diff --git a/AGENTS.md b/AGENTS.md index bfb4a0029..dfdab8357 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,4 +1,4 @@ -The project is called Zeppelin. It's a Discord bot that uses Discord.js. The bot is built on the Knub framework. +The project is called Zeppelin. It's a Discord bot that uses Discord.js. The bot is built on the Vety framework (formerly called Knub). This repository is a monorepository that contains these projects: 1. **Backend**: The shared codebase of the bot and API. Located in `backend`. diff --git a/Dockerfile b/Dockerfile index 5e75e2680..b83a1057e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,12 +1,18 @@ -FROM node:22 AS build +FROM node:24 AS build + +ARG COMMIT_HASH +ARG BUILD_TIME RUN mkdir /zeppelin RUN chown node:node /zeppelin +# Install pnpm +RUN npm install -g pnpm@10.19.0 + USER node # Install dependencies before copying over any other files -COPY --chown=node:node package.json package-lock.json /zeppelin +COPY --chown=node:node package.json pnpm-workspace.yaml pnpm-lock.yaml /zeppelin RUN mkdir /zeppelin/backend COPY --chown=node:node backend/package.json /zeppelin/backend RUN mkdir /zeppelin/shared @@ -15,23 +21,33 @@ RUN mkdir /zeppelin/dashboard COPY --chown=node:node dashboard/package.json /zeppelin/dashboard WORKDIR /zeppelin -RUN npm ci +RUN CI=true pnpm install COPY --chown=node:node . /zeppelin # Build backend WORKDIR /zeppelin/backend -RUN npm run build +RUN pnpm run build # Build dashboard WORKDIR /zeppelin/dashboard -RUN npm run build +RUN pnpm run build -# Prune dev dependencies +# Only keep prod dependencies WORKDIR /zeppelin -RUN npm prune --omit=dev +RUN CI=true pnpm install --prod + +# Add version info +RUN echo "${COMMIT_HASH}" > /zeppelin/.commit-hash +RUN echo "${BUILD_TIME}" > /zeppelin/.build-time + +# --- Main image --- -FROM node:22-alpine AS main +FROM node:24-alpine AS main + +RUN npm install -g pnpm@10.19.0 USER node COPY --from=build --chown=node:node /zeppelin /zeppelin + +WORKDIR /zeppelin diff --git a/backend/package.json b/backend/package.json index 0be8c03f4..40cf9b0e0 100644 --- a/backend/package.json +++ b/backend/package.json @@ -11,55 +11,50 @@ "watch": "tsc-watch --build --onSuccess \"node start-dev.js\"", "watch-yaml-parse-test": "tsc-watch --build --onSuccess \"node dist/yamlParseTest.js\"", "build": "tsc --build", - "start-bot-dev": "node --enable-source-maps --stack-trace-limit=30 --inspect=0.0.0.0:9229 dist/index.js", - "start-bot-dev-debug": "DEBUG=true clinic heapprofiler --collect-only --dest .clinic-bot -- node --enable-source-maps --stack-trace-limit=30 --inspect=0.0.0.0:9229 dist/index.js", - "start-bot-prod": "node --enable-source-maps --stack-trace-limit=30 dist/index.js", - "start-bot-prod-debug": "DEBUG=true clinic heapprofiler --collect-only --dest .clinic-bot -- node --enable-source-maps --stack-trace-limit=30 dist/index.js", - "watch-bot": "tsc-watch --build --onSuccess \"npm run start-bot-dev\"", + "typecheck": "tsc --noEmit", + "start-bot-dev": "node --enable-source-maps --stack-trace-limit=30 --trace-warnings --inspect=0.0.0.0:9229 dist/index.js", + "start-bot-prod": "node --enable-source-maps --stack-trace-limit=30 --trace-warnings dist/index.js", + "watch-bot": "tsc-watch --build --onSuccess \"pnpm run start-bot-dev\"", "start-api-dev": "node --enable-source-maps --stack-trace-limit=30 --inspect=0.0.0.0:9239 dist/api/index.js", - "start-api-dev-debug": "DEBUG=true clinic heapprofiler --collect-only --dest .clinic-api -- node --enable-source-maps --stack-trace-limit=30 --inspect=0.0.0.0:9239 dist/api/index.js", "start-api-prod": "node --enable-source-maps --stack-trace-limit=30 dist/api/index.js", - "start-api-prod-debug": "clinic heapprofiler --collect-only --dest .clinic-api -- node --enable-source-maps --stack-trace-limit=30 dist/api/index.js", - "watch-api": "tsc-watch --build --onSuccess \"npm run start-api-dev\"", - "typeorm": "node ../node_modules/typeorm/cli.js", - "migrate": "npm run typeorm -- migration:run -d dist/data/dataSource.js", - "migrate-prod": "npm run migrate", - "migrate-dev": "npm run build && npm run migrate", - "migrate-rollback": "npm run typeorm -- migration:revert -d dist/data/dataSource.js", - "migrate-rollback-prod": "npm run migrate-rollback", - "migrate-rollback-dev": "npm run build && npm run migrate-rollback", + "watch-api": "tsc-watch --build --onSuccess \"pnpm run start-api-dev\"", + "migrate": "pnpm exec typeorm migration:run -d dist/data/dataSource.js", + "migrate-prod": "pnpm run migrate", + "migrate-dev": "pnpm run build && pnpm run migrate", + "migrate-rollback": "pnpm exec typeorm migration:revert -d dist/data/dataSource.js", + "migrate-rollback-prod": "pnpm run migrate-rollback", + "migrate-rollback-dev": "pnpm run build && pnpm run migrate-rollback", "validate-active-configs": "node --enable-source-maps dist/validateActiveConfigs.js > ../config-errors.txt", "export-config-json-schema": "node --enable-source-maps dist/exportSchemas.js ../config-checker/public/config-schema.json", - "test": "npm run build && npm run run-tests", + "test": "pnpm run build && pnpm run run-tests", "run-tests": "ava", - "test-watch": "tsc-watch --build --onSuccess \"npx ava\"" + "test-watch": "tsc-watch --build --onSuccess \"pnpm exec ava\"" }, "dependencies": { "@silvia-odwyer/photon-node": "^0.3.1", + "@zeppelinbot/shared": "workspace:*", "bufferutil": "^4.0.3", - "clinic": "^13.0.0", "cors": "^2.8.5", "cross-env": "^7.0.3", "deep-diff": "^1.0.2", - "discord.js": "^14.19.3", + "discord.js": "*", "emoji-regex": "^8.0.0", "escape-string-regexp": "^1.0.5", "express": "^4.20.0", "fp-ts": "^2.0.1", "humanize-duration": "^3.15.0", "js-yaml": "^4.1.0", - "knub": "^32.0.0-next.25", "knub-command-manager": "^9.1.0", - "last-commit-log": "^2.1.0", "lodash-es": "^4.17.21", "moment-timezone": "^0.5.21", - "multer": "^1.4.5-lts.1", + "multer": "^2.0.2", "mysql2": "^3.9.8", "parse-color": "^1.0.0", "passport": "^0.6.0", "passport-custom": "^1.0.5", "passport-oauth2": "^1.6.1", "pkg-up": "^3.1.0", + "redis": "^5.9.0", "reflect-metadata": "^0.1.12", "regexp-worker": "^1.1.0", "safe-regex": "^2.0.2", @@ -67,22 +62,20 @@ "strip-combining-marks": "^1.0.0", "threads": "^1.7.0", "tlds": "^1.221.1", - "tmp": "0.0.33", + "tmp": "0.2.5", "tsconfig-paths": "^3.9.0", "twemoji": "^12.1.4", - "typeorm": "^0.3.17", + "typeorm": "^0.3.27", "utf-8-validate": "^5.0.5", "uuid": "^9.0.0", - "yawn-yaml": "github:dragory/yawn-yaml#string-number-fix-build", - "zod": "^3.25.17" + "vety": "1.0.0-rc2", + "zod": "^4.1.12" }, "devDependencies": { "@types/cors": "^2.8.5", "@types/express": "^4.16.1", - "@types/jest": "^24.0.15", "@types/js-yaml": "^3.12.1", "@types/lodash-es": "^4.17.12", - "@types/moment-timezone": "^0.5.6", "@types/multer": "^1.4.7", "@types/passport": "^1.0.0", "@types/passport-oauth2": "^1.4.8", @@ -92,9 +85,7 @@ "@types/twemoji": "^12.1.0", "@types/uuid": "^9.0.2", "ava": "^5.3.1", - "rimraf": "^2.6.2", - "source-map-support": "^0.5.16", - "zod-to-json-schema": "^3.22.3" + "source-map-support": "^0.5.16" }, "ava": { "files": [ diff --git a/backend/src/RegExpRunner.ts b/backend/src/RegExpRunner.ts index ea37fe037..37397c8f5 100644 --- a/backend/src/RegExpRunner.ts +++ b/backend/src/RegExpRunner.ts @@ -1,4 +1,4 @@ -import { CooldownManager } from "knub"; +import { CooldownManager } from "vety"; import { EventEmitter } from "node:events"; import { RegExpWorker, TimeoutError } from "regexp-worker"; import { MINUTES, SECONDS } from "./utils.js"; @@ -9,7 +9,10 @@ const isTimeoutError = (a): a is TimeoutError => { }; export class RegExpTimeoutError extends Error { - constructor(message: string, public elapsedTimeMs: number) { + constructor( + message: string, + public elapsedTimeMs: number, + ) { super(message); } } diff --git a/backend/src/api/auth.ts b/backend/src/api/auth.ts index 983a66923..aae3819ef 100644 --- a/backend/src/api/auth.ts +++ b/backend/src/api/auth.ts @@ -1,6 +1,6 @@ import express, { Request, Response } from "express"; import https from "https"; -import pick from "lodash/pick.js"; +import { pick } from "lodash-es"; import passport from "passport"; import { Strategy as CustomStrategy } from "passport-custom"; import OAuth2Strategy from "passport-oauth2"; diff --git a/backend/src/api/docs.ts b/backend/src/api/docs.ts index 59aef88b9..b5c430f68 100644 --- a/backend/src/api/docs.ts +++ b/backend/src/api/docs.ts @@ -1,10 +1,10 @@ import express from "express"; -import z from "zod/v4"; +import { z } from "zod"; +import { $ZodPipeDef } from "zod/v4/core"; import { availableGuildPlugins } from "../plugins/availablePlugins.js"; import { ZeppelinGuildPluginInfo } from "../types.js"; import { indentLines } from "../utils.js"; import { notFound } from "./responses.js"; -import { $ZodPipeDef } from "zod/v4/core"; function isZodObject(schema: z.ZodType): schema is z.ZodObject { return schema.def.type === "object"; diff --git a/backend/src/api/guilds/importExport.ts b/backend/src/api/guilds/importExport.ts index 15f5d277c..73d8af2f2 100644 --- a/backend/src/api/guilds/importExport.ts +++ b/backend/src/api/guilds/importExport.ts @@ -1,7 +1,7 @@ import { ApiPermissions } from "@zeppelinbot/shared/apiPermissions.js"; import express, { Request, Response } from "express"; import moment from "moment-timezone"; -import { z } from "zod/v4"; +import { z } from "zod"; import { GuildCases } from "../../data/GuildCases.js"; import { Case } from "../../data/entities/Case.js"; import { MINUTES } from "../../utils.js"; diff --git a/backend/src/commandTypes.ts b/backend/src/commandTypes.ts index ca231a5db..f3577d520 100644 --- a/backend/src/commandTypes.ts +++ b/backend/src/commandTypes.ts @@ -12,7 +12,7 @@ import { CommandContext, messageCommandBaseTypeConverters, TypeConversionError, -} from "knub"; +} from "vety"; import { createTypeHelper } from "knub-command-manager"; import { channelMentionRegex, @@ -41,7 +41,7 @@ export const commandTypes = { }, async resolvedUser(value, context: CommandContext) { - const result = await resolveUser(context.pluginData.client, value); + const result = await resolveUser(context.pluginData.client, value, "commandTypes:resolvedUser"); if (result == null || result instanceof UnknownUser) { throw new TypeConversionError(`User \`${escapeCodeBlock(value)}\` was not found`); } @@ -49,7 +49,7 @@ export const commandTypes = { }, async resolvedUserLoose(value, context: CommandContext) { - const result = await resolveUser(context.pluginData.client, value); + const result = await resolveUser(context.pluginData.client, value, "commandTypes:resolvedUserLoose"); if (result == null) { throw new TypeConversionError(`Invalid user: \`${escapeCodeBlock(value)}\``); } diff --git a/backend/src/configValidator.ts b/backend/src/configValidator.ts index e66f97c59..a9892900e 100644 --- a/backend/src/configValidator.ts +++ b/backend/src/configValidator.ts @@ -1,5 +1,5 @@ -import { BaseConfig, ConfigValidationError, GuildPluginBlueprint, PluginConfigManager } from "knub"; -import { z, ZodError } from "zod/v4"; +import { BaseConfig, ConfigValidationError, GuildPluginBlueprint, PluginConfigManager } from "vety"; +import { z, ZodError } from "zod"; import { availableGuildPlugins } from "./plugins/availablePlugins.js"; import { zZeppelinGuildConfig } from "./types.js"; import { formatZodIssue } from "./utils/formatZodIssue.js"; @@ -28,15 +28,12 @@ export async function validateGuildConfig(config: any): Promise { } const plugin = pluginNameToPlugin.get(pluginName)!; - const configManager = new PluginConfigManager( - pluginOptions, - { - configSchema: plugin.configSchema, - defaultOverrides: plugin.defaultOverrides ?? [], - levels: {}, - customOverrideCriteriaFunctions: plugin.customOverrideCriteriaFunctions, - }, - ); + const configManager = new PluginConfigManager(pluginOptions, { + configSchema: plugin.configSchema, + defaultOverrides: plugin.defaultOverrides ?? [], + levels: {}, + customOverrideCriteriaFunctions: plugin.customOverrideCriteriaFunctions, + }); try { await configManager.init(); diff --git a/backend/src/data/DefaultLogMessages.json b/backend/src/data/DefaultLogMessages.json index ff0d12cae..1e8c574ff 100644 --- a/backend/src/data/DefaultLogMessages.json +++ b/backend/src/data/DefaultLogMessages.json @@ -35,10 +35,10 @@ "ROLE_UPDATE": "{timestamp} 🖊 Role **{newRole.name}** (`{newRole.id}`) was edited. Changes:\n{differenceString}", "MESSAGE_EDIT": "{timestamp} ✏ {userMention(user)} edited their message (`{after.id}`) in {channelMention(channel)}:\n**Before:**{messageSummary(before)}**After:**{messageSummary(after)}", - "MESSAGE_DELETE": "{timestamp} 🗑 Message (`{message.id}`) from {userMention(user)} deleted in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}", + "MESSAGE_DELETE": "{timestamp} 🗑 Message (`{message.id}`) from {userMention(user)} deleted in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}{replyInfo}", "MESSAGE_DELETE_BULK": "{timestamp} 🗑 **{count}** messages by {authorIds} deleted in {channelMention(channel)} ({archiveUrl})", "MESSAGE_DELETE_BARE": "{timestamp} 🗑 Message (`{messageId}`) deleted in {channelMention(channel)} (no more info available)", - "MESSAGE_DELETE_AUTO": "{timestamp} 🗑 Auto-deleted message (`{message.id}`) from {userMention(user)} in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}", + "MESSAGE_DELETE_AUTO": "{timestamp} 🗑 Auto-deleted message (`{message.id}`) from {userMention(user)} in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}{replyInfo}", "VOICE_CHANNEL_JOIN": "{timestamp} 🎙 🔵 {userMention(member)} joined {channelMention(channel)}", "VOICE_CHANNEL_MOVE": "{timestamp} 🎙 ↔ {userMention(member)} moved from {channelMention(oldChannel)} to {channelMention(newChannel)}", diff --git a/backend/src/data/FishFish.ts b/backend/src/data/FishFish.ts index 7f502e5de..b06eb4a97 100644 --- a/backend/src/data/FishFish.ts +++ b/backend/src/data/FishFish.ts @@ -1,4 +1,4 @@ -import z from "zod/v4"; +import { z } from "zod"; import { env } from "../env.js"; import { HOURS, MINUTES, SECONDS } from "../utils.js"; @@ -58,10 +58,13 @@ async function getSessionToken(): Promise { throw new FishFishError(`Parse error when fetching session token: ${parseResult.error.message}`); } - const timeUntilExpiry = Date.now() - parseResult.data.expires * 1000; - setTimeout(() => { - sessionTokenPromise = null; - }, timeUntilExpiry - 1 * MINUTES); // Subtract a minute to ensure we refresh before expiry + const timeUntilExpiry = parseResult.data.expires * 1000 - Date.now(); + setTimeout( + () => { + sessionTokenPromise = null; + }, + timeUntilExpiry - 1 * MINUTES, + ); // Subtract a minute to ensure we refresh before expiry return parseResult.data.token; })(); @@ -91,35 +94,6 @@ async function fishFishApiCall(method: string, path: string, query: Record { - if (updatesWs) { - return; - } - const sessionToken = await getSessionToken(); - console.log("[FISHFISH] Connecting to WebSocket for real-time updates"); - updatesWs = new WebSocket("wss://api.fishfish.gg/v1/stream", { - headers: { - Authorization: sessionToken, - }, - }); - updatesWs.addEventListener("open", () => { - console.log("[FISHFISH] WebSocket connection established"); - }); - updatesWs.addEventListener("message", (event) => { - console.log("[FISHFISH] ws update:", event.data); - }); - updatesWs.addEventListener("error", (error) => { - console.error(`[FISHFISH] WebSocket error: ${error.message}`); - }); - updatesWs.addEventListener("close", () => { - console.log("[FISHFISH] WebSocket connection closed, reconnecting after delay"); - updatesWs = null; - setTimeout(() => { - subscribeToFishFishUpdates(); - }, WS_RECONNECT_DELAY); - }); -} - async function refreshFishFishDomains() { const rawData = await fishFishApiCall("GET", "domains", { full: "true" }); const parseResult = z.array(zDomain).safeParse(rawData); @@ -164,7 +138,8 @@ export async function initFishFish() { } await refreshFishFishDomains(); - void subscribeToFishFishUpdates(); + // Real-time updates disabled until we switch to a WebSocket lib that supports authorization headers + // void subscribeToFishFishUpdates(); setInterval(() => refreshFishFishDomains(), FULL_REFRESH_INTERVAL); } diff --git a/backend/src/data/GuildLogs.ts b/backend/src/data/GuildLogs.ts index dc4837eef..40c7138ef 100644 --- a/backend/src/data/GuildLogs.ts +++ b/backend/src/data/GuildLogs.ts @@ -40,9 +40,12 @@ export class GuildLogs extends events.EventEmitter { this.ignoredLogs.push({ type, ignoreId }); // Clear after expiry (15sec by default) - setTimeout(() => { - this.clearIgnoredLog(type, ignoreId); - }, timeout || 1000 * 15); + setTimeout( + () => { + this.clearIgnoredLog(type, ignoreId); + }, + timeout || 1000 * 15, + ); } isLogIgnored(type: keyof typeof LogType, ignoreId: any) { diff --git a/backend/src/data/GuildSavedMessages.ts b/backend/src/data/GuildSavedMessages.ts index 3edc28104..8c33f87b0 100644 --- a/backend/src/data/GuildSavedMessages.ts +++ b/backend/src/data/GuildSavedMessages.ts @@ -119,6 +119,14 @@ export class GuildSavedMessages extends BaseGuildRepository { })); } + if (msg.reference && (msg.reference.messageId || msg.reference.channelId || msg.reference.guildId)) { + data.reference = { + messageId: msg.reference.messageId ?? null, + channelId: msg.reference.channelId ?? null, + guildId: msg.reference.guildId ?? null, + }; + } + return data; } @@ -172,6 +180,10 @@ export class GuildSavedMessages extends BaseGuildRepository { } async getMultiple(messageIds: string[]): Promise { + if (messageIds.length === 0) { + return []; + } + const results = await this.messages .createQueryBuilder() .where("guild_id = :guild_id", { guild_id: this.guildId }) diff --git a/backend/src/data/entities/SavedMessage.ts b/backend/src/data/entities/SavedMessage.ts index 9a0b310ff..0158dadae 100644 --- a/backend/src/data/entities/SavedMessage.ts +++ b/backend/src/data/entities/SavedMessage.ts @@ -75,6 +75,11 @@ export interface ISavedMessageData { embeds?: ISavedMessageEmbedData[]; stickers?: ISavedMessageStickerData[]; timestamp: number; + reference?: { + messageId?: Snowflake | null; + channelId?: Snowflake | null; + guildId?: Snowflake | null; + }; } @Entity("messages") diff --git a/backend/src/data/redis.ts b/backend/src/data/redis.ts new file mode 100644 index 000000000..5a14f512e --- /dev/null +++ b/backend/src/data/redis.ts @@ -0,0 +1,6 @@ +import { createClient } from "redis"; +import { env } from "../env.js"; + +// Silly type inference issue... https://github.com/redis/node-redis/issues/1732#issuecomment-979977316 +type RedisClient = ReturnType; +export const redis: RedisClient = await createClient({ url: env.REDIS_URL }).connect(); diff --git a/backend/src/debugCounters.ts b/backend/src/debugCounters.ts new file mode 100644 index 000000000..91e24e8bb --- /dev/null +++ b/backend/src/debugCounters.ts @@ -0,0 +1,15 @@ +type DebugCounterValue = { + count: number; +}; +const debugCounterValueMap = new Map(); + +export function incrementDebugCounter(name: string) { + if (!debugCounterValueMap.has(name)) { + debugCounterValueMap.set(name, { count: 0 }); + } + debugCounterValueMap.get(name)!.count++; +} + +export function getDebugCounterValues() { + return debugCounterValueMap; +} diff --git a/backend/src/env.ts b/backend/src/env.ts index 260abbe9e..7785d7cfb 100644 --- a/backend/src/env.ts +++ b/backend/src/env.ts @@ -1,7 +1,7 @@ import dotenv from "dotenv"; import fs from "fs"; import path from "path"; -import { z } from "zod/v4"; +import { z } from "zod"; import { rootDir } from "./paths.js"; const envType = z.object({ @@ -48,6 +48,8 @@ const envType = z.object({ DB_PASSWORD: z.string().optional(), DB_DATABASE: z.string().optional(), + REDIS_URL: z.string().default("redis://redis:6379"), + DEVELOPMENT_MYSQL_PASSWORD: z.string().optional(), API_PATH_PREFIX: z.string().optional(), diff --git a/backend/src/exportSchemas.ts b/backend/src/exportSchemas.ts index 003a1216a..5532e01da 100644 --- a/backend/src/exportSchemas.ts +++ b/backend/src/exportSchemas.ts @@ -1,5 +1,5 @@ import fs from "node:fs"; -import { z } from "zod/v4"; +import { z } from "zod"; import { availableGuildPlugins } from "./plugins/availablePlugins.js"; import { zZeppelinGuildConfig } from "./types.js"; import { deepPartial } from "./utils/zodDeepPartial.js"; @@ -34,22 +34,24 @@ const basePluginOverrideCriteriaSchema = z.strictObject({ extra: z.any().optional(), }); -const pluginOverrideCriteriaSchema = basePluginOverrideCriteriaSchema.extend({ - get zzz_dummy_property_do_not_use() { - return pluginOverrideCriteriaSchema.optional(); - }, - get all() { - return z.array(pluginOverrideCriteriaSchema).optional(); - }, - get any() { - return z.array(pluginOverrideCriteriaSchema).optional(); - }, - get not() { - return pluginOverrideCriteriaSchema.optional(); - }, -}).meta({ - id: "overrideCriteria", -}); +const pluginOverrideCriteriaSchema = basePluginOverrideCriteriaSchema + .extend({ + get zzz_dummy_property_do_not_use() { + return pluginOverrideCriteriaSchema.optional(); + }, + get all() { + return z.array(pluginOverrideCriteriaSchema).optional(); + }, + get any() { + return z.array(pluginOverrideCriteriaSchema).optional(); + }, + get not() { + return pluginOverrideCriteriaSchema.optional(); + }, + }) + .meta({ + id: "overrideCriteria", + }); const outputPath = process.argv[2]; if (!outputPath) { diff --git a/backend/src/index.ts b/backend/src/index.ts index 6f9e8771b..b59da52b1 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -12,7 +12,7 @@ import { TextChannel, ThreadChannel, } from "discord.js"; -import { Knub, PluginError, PluginLoadError, PluginNotLoadedError } from "knub"; +import { Vety, PluginError, PluginLoadError, PluginNotLoadedError } from "vety"; import moment from "moment-timezone"; import { performance } from "perf_hooks"; import process from "process"; @@ -74,6 +74,9 @@ const SAFE_TO_IGNORE_ERIS_ERROR_CODES = [ const SAFE_TO_IGNORE_ERIS_ERROR_MESSAGES = ["Server didn't acknowledge previous heartbeat, possible lost connection"]; +// Ignore plugin load errors during initial startup to avoid noise in the logs +let ignorePluginLoadErrors = true; + function errorHandler(err) { const guildId = err.guild?.id || err.guildId || "0"; const guildName = err.guild?.name || (guildId && guildId !== "0" ? "Unknown" : "Global"); @@ -94,8 +97,10 @@ function errorHandler(err) { } if (err instanceof PluginLoadError) { - // tslint:disable:no-console - console.warn(`${guildName} (${guildId}): Failed to load plugin '${err.pluginName}': ${err.message}`); + if (!ignorePluginLoadErrors) { + // tslint:disable:no-console + console.warn(`${guildName} (${guildId}): Failed to load plugin '${err.pluginName}': ${err.message}`); + } return; } @@ -199,14 +204,17 @@ setInterval(() => { avgCount++; lastCheck = now; }, 500); -setInterval(() => { - const avgBlocking = avgTotal / (avgCount || 1); - // FIXME: Debug - // tslint:disable-next-line:no-console - console.log(`Average blocking in the last 5min: ${avgBlocking / avgTotal}ms`); - avgTotal = 0; - avgCount = 0; -}, 5 * 60 * 1000); +setInterval( + () => { + const avgBlocking = avgTotal / (avgCount || 1); + // FIXME: Debug + // tslint:disable-next-line:no-console + console.log(`Average blocking in the last 5min: ${avgBlocking / avgTotal}ms`); + avgTotal = 0; + avgCount = 0; + }, + 5 * 60 * 1000, +); if (env.DEBUG) { logger.info("NOTE: Bot started in DEBUG mode"); @@ -276,12 +284,9 @@ connect().then(async () => { } }); - let ignorePluginLoadErrors = true; client.on("error", (err) => { if (err instanceof PluginLoadError) { - if (!ignorePluginLoadErrors) { - errorHandler(err); - } + errorHandler(err); return; } errorHandler(new DiscordJSError(err.message, (err as any).code, 0)); @@ -290,7 +295,7 @@ connect().then(async () => { const allowedGuilds = new AllowedGuilds(); const guildConfigs = new Configs(); - const bot = new Knub(client, { + const bot = new Vety(client, { guildPlugins: availableGuildPlugins.map((obj) => obj.plugin), globalPlugins: availableGlobalPlugins.map((obj) => obj.plugin), @@ -303,7 +308,7 @@ connect().then(async () => { * Plugins are enabled if they... * - are marked to be autoloaded, or * - are explicitly enabled in the guild config - * Dependencies are also automatically loaded by Knub. + * Dependencies are also automatically loaded by Vety. */ async getEnabledGuildPlugins(ctx, plugins): Promise { if (!ctx.config || !ctx.config.plugins) { @@ -335,7 +340,7 @@ connect().then(async () => { if (loaded.success_emoji || loaded.error_emoji) { const deprecatedKeys = [] as string[]; - const exampleConfig = `plugins:\n common:\n config:\n success_emoji: "👍"\n error_emoji: "👎"`; + // const exampleConfig = `plugins:\n common:\n config:\n success_emoji: "👍"\n error_emoji: "👎"`; if (loaded.success_emoji) { deprecatedKeys.push("success_emoji"); @@ -398,7 +403,7 @@ connect().then(async () => { }, }); - client.once("ready", () => { + client.once("clientReady", () => { startUptimeCounter(); }); diff --git a/backend/src/pluginUtils.ts b/backend/src/pluginUtils.ts index 6d9c0cf88..5a7d64fe9 100644 --- a/backend/src/pluginUtils.ts +++ b/backend/src/pluginUtils.ts @@ -28,10 +28,10 @@ import { GuildPluginData, helpers, PluginConfigManager, -} from "knub"; -import z from "zod/v4"; + Vety, +} from "vety"; +import { z } from "zod"; import { isStaff } from "./staff.js"; -import { TZeppelinKnub } from "./types.js"; import { Tail } from "./utils/typeUtils.js"; const { getMemberLevel } = helpers; @@ -168,7 +168,7 @@ export async function getConfigForContext> { if (context instanceof ChatInputCommandInteraction) { - // TODO: Support for modal interactions (here and Knub) + // TODO: Support for modal interactions (here and Vety) return config.getForInteraction(context); } const channel = await getContextChannel(context); @@ -181,15 +181,15 @@ export async function getConfigForContext) { - const knub = pluginData.getKnubInstance() as TZeppelinKnub; + const vety = pluginData.getVetyInstance() as Vety; // @ts-expect-error - return knub.getGlobalConfig().url; + return vety.getGlobalConfig().url; } export function isOwner(pluginData: AnyPluginData, userId: string) { - const knub = pluginData.getKnubInstance() as TZeppelinKnub; + const vety = pluginData.getVetyInstance() as Vety; // @ts-expect-error - const owners = knub.getGlobalConfig()?.owners; + const owners = vety.getGlobalConfig()?.owners; if (!owners) { return false; } diff --git a/backend/src/plugins/AutoDelete/AutoDeletePlugin.ts b/backend/src/plugins/AutoDelete/AutoDeletePlugin.ts index a60b800f2..7c24a91b5 100644 --- a/backend/src/plugins/AutoDelete/AutoDeletePlugin.ts +++ b/backend/src/plugins/AutoDelete/AutoDeletePlugin.ts @@ -1,4 +1,4 @@ -import { guildPlugin } from "knub"; +import { guildPlugin } from "vety"; import { GuildLogs } from "../../data/GuildLogs.js"; import { GuildSavedMessages } from "../../data/GuildSavedMessages.js"; import { LogsPlugin } from "../Logs/LogsPlugin.js"; diff --git a/backend/src/plugins/AutoDelete/types.ts b/backend/src/plugins/AutoDelete/types.ts index 32260d611..e8a1d6b79 100644 --- a/backend/src/plugins/AutoDelete/types.ts +++ b/backend/src/plugins/AutoDelete/types.ts @@ -1,5 +1,5 @@ -import { BasePluginType } from "knub"; -import z from "zod/v4"; +import { BasePluginType } from "vety"; +import { z } from "zod"; import { GuildLogs } from "../../data/GuildLogs.js"; import { GuildSavedMessages } from "../../data/GuildSavedMessages.js"; import { SavedMessage } from "../../data/entities/SavedMessage.js"; diff --git a/backend/src/plugins/AutoDelete/util/addMessageToDeletionQueue.ts b/backend/src/plugins/AutoDelete/util/addMessageToDeletionQueue.ts index f965e58ab..8ffe5797a 100644 --- a/backend/src/plugins/AutoDelete/util/addMessageToDeletionQueue.ts +++ b/backend/src/plugins/AutoDelete/util/addMessageToDeletionQueue.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { SavedMessage } from "../../../data/entities/SavedMessage.js"; import { sorter } from "../../../utils.js"; import { AutoDeletePluginType } from "../types.js"; diff --git a/backend/src/plugins/AutoDelete/util/deleteNextItem.ts b/backend/src/plugins/AutoDelete/util/deleteNextItem.ts index 217f69cb3..886fce87d 100644 --- a/backend/src/plugins/AutoDelete/util/deleteNextItem.ts +++ b/backend/src/plugins/AutoDelete/util/deleteNextItem.ts @@ -1,5 +1,5 @@ import { PermissionsBitField, Snowflake } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import moment from "moment-timezone"; import { LogType } from "../../../data/LogType.js"; import { logger } from "../../../logger.js"; @@ -55,7 +55,7 @@ export async function deleteNextItem(pluginData: GuildPluginData for message \`${message.id}\`: ${e.message}.`, + }); + } else if (isDiscordAPIError(e)) { const logs = pluginData.getPlugin(LogsPlugin); if (e.code === 10008) { logs.logBotAlert({ diff --git a/backend/src/plugins/AutoReactions/types.ts b/backend/src/plugins/AutoReactions/types.ts index 1d234a359..1d021d7fa 100644 --- a/backend/src/plugins/AutoReactions/types.ts +++ b/backend/src/plugins/AutoReactions/types.ts @@ -1,5 +1,5 @@ -import { BasePluginType, guildPluginEventListener, guildPluginMessageCommand, pluginUtils } from "knub"; -import z from "zod/v4"; +import { BasePluginType, guildPluginEventListener, guildPluginMessageCommand, pluginUtils } from "vety"; +import { z } from "zod"; import { GuildAutoReactions } from "../../data/GuildAutoReactions.js"; import { GuildLogs } from "../../data/GuildLogs.js"; import { GuildSavedMessages } from "../../data/GuildSavedMessages.js"; diff --git a/backend/src/plugins/Automod/AutomodPlugin.ts b/backend/src/plugins/Automod/AutomodPlugin.ts index 022e27e06..ca8bc3ec2 100644 --- a/backend/src/plugins/Automod/AutomodPlugin.ts +++ b/backend/src/plugins/Automod/AutomodPlugin.ts @@ -1,4 +1,4 @@ -import { CooldownManager, guildPlugin } from "knub"; +import { CooldownManager, guildPlugin } from "vety"; import { Queue } from "../../Queue.js"; import { GuildAntiraidLevels } from "../../data/GuildAntiraidLevels.js"; import { GuildArchives } from "../../data/GuildArchives.js"; diff --git a/backend/src/plugins/Automod/actions/addRoles.ts b/backend/src/plugins/Automod/actions/addRoles.ts index 57726e21e..af419a1a9 100644 --- a/backend/src/plugins/Automod/actions/addRoles.ts +++ b/backend/src/plugins/Automod/actions/addRoles.ts @@ -1,5 +1,5 @@ import { PermissionFlagsBits, Snowflake } from "discord.js"; -import z from "zod/v4"; +import { z } from "zod"; import { nonNullish, unique, zSnowflake } from "../../../utils.js"; import { canAssignRole } from "../../../utils/canAssignRole.js"; import { getMissingPermissions } from "../../../utils/getMissingPermissions.js"; diff --git a/backend/src/plugins/Automod/actions/addToCounter.ts b/backend/src/plugins/Automod/actions/addToCounter.ts index 1225651b0..a573a12f4 100644 --- a/backend/src/plugins/Automod/actions/addToCounter.ts +++ b/backend/src/plugins/Automod/actions/addToCounter.ts @@ -1,4 +1,4 @@ -import z from "zod/v4"; +import { z } from "zod"; import { zBoundedCharacters } from "../../../utils.js"; import { CountersPlugin } from "../../Counters/CountersPlugin.js"; import { LogsPlugin } from "../../Logs/LogsPlugin.js"; diff --git a/backend/src/plugins/Automod/actions/alert.ts b/backend/src/plugins/Automod/actions/alert.ts index 56a70f235..9ea5eb822 100644 --- a/backend/src/plugins/Automod/actions/alert.ts +++ b/backend/src/plugins/Automod/actions/alert.ts @@ -1,5 +1,5 @@ import { Snowflake } from "discord.js"; -import z from "zod/v4"; +import { z } from "zod"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer, diff --git a/backend/src/plugins/Automod/actions/archiveThread.ts b/backend/src/plugins/Automod/actions/archiveThread.ts index ee8916694..bf7628eb6 100644 --- a/backend/src/plugins/Automod/actions/archiveThread.ts +++ b/backend/src/plugins/Automod/actions/archiveThread.ts @@ -1,5 +1,5 @@ import { AnyThreadChannel } from "discord.js"; -import z from "zod/v4"; +import { z } from "zod"; import { noop } from "../../../utils.js"; import { automodAction } from "../helpers.js"; diff --git a/backend/src/plugins/Automod/actions/ban.ts b/backend/src/plugins/Automod/actions/ban.ts index 605aed0a9..09aef9d93 100644 --- a/backend/src/plugins/Automod/actions/ban.ts +++ b/backend/src/plugins/Automod/actions/ban.ts @@ -1,4 +1,4 @@ -import z from "zod/v4"; +import { z } from "zod"; import { convertDelayStringToMS, nonNullish, diff --git a/backend/src/plugins/Automod/actions/changeNickname.ts b/backend/src/plugins/Automod/actions/changeNickname.ts index 3af2567a4..5f212a90a 100644 --- a/backend/src/plugins/Automod/actions/changeNickname.ts +++ b/backend/src/plugins/Automod/actions/changeNickname.ts @@ -1,4 +1,4 @@ -import z from "zod/v4"; +import { z } from "zod"; import { nonNullish, unique, zBoundedCharacters } from "../../../utils.js"; import { LogsPlugin } from "../../Logs/LogsPlugin.js"; import { automodAction } from "../helpers.js"; diff --git a/backend/src/plugins/Automod/actions/changePerms.ts b/backend/src/plugins/Automod/actions/changePerms.ts index e70bbb056..7bc721c61 100644 --- a/backend/src/plugins/Automod/actions/changePerms.ts +++ b/backend/src/plugins/Automod/actions/changePerms.ts @@ -1,6 +1,6 @@ import { PermissionsBitField, PermissionsString } from "discord.js"; import { U } from "ts-toolbelt"; -import z from "zod/v4"; +import { z } from "zod"; import { TemplateParseError, TemplateSafeValueContainer, renderTemplate } from "../../../templateFormatter.js"; import { isValidSnowflake, keys, noop, zBoundedCharacters } from "../../../utils.js"; import { @@ -65,10 +65,13 @@ const permissionNames = keys(PermissionsBitField.Flags) as U.ListOf; const allPermissionNames = [...permissionNames, ...legacyPermissionNames] as const; -const permissionTypeMap = allPermissionNames.reduce((map, permName) => { - map[permName] = z.boolean().nullable(); - return map; -}, {} as Record>); +const permissionTypeMap = allPermissionNames.reduce( + (map, permName) => { + map[permName] = z.boolean().nullable(); + return map; + }, + {} as Record<(typeof allPermissionNames)[number], z.ZodNullable>, +); const zPermissionsMap = z.strictObject(permissionTypeMap); export const ChangePermsAction = automodAction({ diff --git a/backend/src/plugins/Automod/actions/clean.ts b/backend/src/plugins/Automod/actions/clean.ts index 35eaf4f8e..fa3eb00ff 100644 --- a/backend/src/plugins/Automod/actions/clean.ts +++ b/backend/src/plugins/Automod/actions/clean.ts @@ -1,5 +1,5 @@ import { GuildTextBasedChannel, Snowflake } from "discord.js"; -import z from "zod/v4"; +import { z } from "zod"; import { LogType } from "../../../data/LogType.js"; import { noop } from "../../../utils.js"; import { automodAction } from "../helpers.js"; diff --git a/backend/src/plugins/Automod/actions/exampleAction.ts b/backend/src/plugins/Automod/actions/exampleAction.ts index fcfc62beb..34f976e2e 100644 --- a/backend/src/plugins/Automod/actions/exampleAction.ts +++ b/backend/src/plugins/Automod/actions/exampleAction.ts @@ -1,4 +1,4 @@ -import z from "zod/v4"; +import { z } from "zod"; import { zBoundedCharacters } from "../../../utils.js"; import { automodAction } from "../helpers.js"; diff --git a/backend/src/plugins/Automod/actions/kick.ts b/backend/src/plugins/Automod/actions/kick.ts index 0485818c7..a0d0863e4 100644 --- a/backend/src/plugins/Automod/actions/kick.ts +++ b/backend/src/plugins/Automod/actions/kick.ts @@ -1,4 +1,4 @@ -import z from "zod/v4"; +import { z } from "zod"; import { asyncMap, nonNullish, resolveMember, unique, zBoundedCharacters, zSnowflake } from "../../../utils.js"; import { CaseArgs } from "../../Cases/types.js"; import { ModActionsPlugin } from "../../ModActions/ModActionsPlugin.js"; diff --git a/backend/src/plugins/Automod/actions/log.ts b/backend/src/plugins/Automod/actions/log.ts index 92928455f..9442a8677 100644 --- a/backend/src/plugins/Automod/actions/log.ts +++ b/backend/src/plugins/Automod/actions/log.ts @@ -1,4 +1,4 @@ -import z from "zod/v4"; +import { z } from "zod"; import { isTruthy, unique } from "../../../utils.js"; import { LogsPlugin } from "../../Logs/LogsPlugin.js"; import { automodAction } from "../helpers.js"; diff --git a/backend/src/plugins/Automod/actions/mute.ts b/backend/src/plugins/Automod/actions/mute.ts index a00e2fd90..613ab7cf5 100644 --- a/backend/src/plugins/Automod/actions/mute.ts +++ b/backend/src/plugins/Automod/actions/mute.ts @@ -1,4 +1,4 @@ -import z from "zod/v4"; +import { z } from "zod"; import { ERRORS, RecoverablePluginError } from "../../../RecoverablePluginError.js"; import { convertDelayStringToMS, diff --git a/backend/src/plugins/Automod/actions/pauseInvites.ts b/backend/src/plugins/Automod/actions/pauseInvites.ts index c5b32c011..8ca47fe84 100644 --- a/backend/src/plugins/Automod/actions/pauseInvites.ts +++ b/backend/src/plugins/Automod/actions/pauseInvites.ts @@ -1,5 +1,5 @@ import { GuildFeature } from "discord.js"; -import z from "zod/v4"; +import { z } from "zod"; import { automodAction } from "../helpers.js"; export const PauseInvitesAction = automodAction({ diff --git a/backend/src/plugins/Automod/actions/removeRoles.ts b/backend/src/plugins/Automod/actions/removeRoles.ts index ccd9e843c..4f5cfcc03 100644 --- a/backend/src/plugins/Automod/actions/removeRoles.ts +++ b/backend/src/plugins/Automod/actions/removeRoles.ts @@ -1,5 +1,5 @@ import { PermissionFlagsBits, Snowflake } from "discord.js"; -import z from "zod/v4"; +import { z } from "zod"; import { nonNullish, unique, zSnowflake } from "../../../utils.js"; import { canAssignRole } from "../../../utils/canAssignRole.js"; import { getMissingPermissions } from "../../../utils/getMissingPermissions.js"; diff --git a/backend/src/plugins/Automod/actions/reply.ts b/backend/src/plugins/Automod/actions/reply.ts index c2ae62836..08a694493 100644 --- a/backend/src/plugins/Automod/actions/reply.ts +++ b/backend/src/plugins/Automod/actions/reply.ts @@ -1,5 +1,5 @@ import { GuildTextBasedChannel, MessageCreateOptions, PermissionsBitField, Snowflake, User } from "discord.js"; -import z from "zod/v4"; +import { z } from "zod"; import { TemplateParseError, TemplateSafeValueContainer, renderTemplate } from "../../../templateFormatter.js"; import { convertDelayStringToMS, diff --git a/backend/src/plugins/Automod/actions/setCounter.ts b/backend/src/plugins/Automod/actions/setCounter.ts index e581799e0..482663833 100644 --- a/backend/src/plugins/Automod/actions/setCounter.ts +++ b/backend/src/plugins/Automod/actions/setCounter.ts @@ -1,4 +1,4 @@ -import z from "zod/v4"; +import { z } from "zod"; import { MAX_COUNTER_VALUE, MIN_COUNTER_VALUE } from "../../../data/GuildCounters.js"; import { zBoundedCharacters } from "../../../utils.js"; import { CountersPlugin } from "../../Counters/CountersPlugin.js"; diff --git a/backend/src/plugins/Automod/actions/setSlowmode.ts b/backend/src/plugins/Automod/actions/setSlowmode.ts index 1f6b045ac..2e5d9f561 100644 --- a/backend/src/plugins/Automod/actions/setSlowmode.ts +++ b/backend/src/plugins/Automod/actions/setSlowmode.ts @@ -1,5 +1,5 @@ import { ChannelType, GuildTextBasedChannel, Snowflake } from "discord.js"; -import z from "zod/v4"; +import { z } from "zod"; import { convertDelayStringToMS, isDiscordAPIError, zDelayString, zSnowflake } from "../../../utils.js"; import { LogsPlugin } from "../../Logs/LogsPlugin.js"; import { automodAction } from "../helpers.js"; diff --git a/backend/src/plugins/Automod/actions/startThread.ts b/backend/src/plugins/Automod/actions/startThread.ts index 83f940c6b..d449839f2 100644 --- a/backend/src/plugins/Automod/actions/startThread.ts +++ b/backend/src/plugins/Automod/actions/startThread.ts @@ -1,5 +1,5 @@ import { ChannelType, GuildTextThreadCreateOptions, ThreadAutoArchiveDuration, ThreadChannel } from "discord.js"; -import z from "zod/v4"; +import { z } from "zod"; import { TemplateParseError, TemplateSafeValueContainer, renderTemplate } from "../../../templateFormatter.js"; import { MINUTES, convertDelayStringToMS, noop, zBoundedCharacters, zDelayString } from "../../../utils.js"; import { savedMessageToTemplateSafeSavedMessage, userToTemplateSafeUser } from "../../../utils/templateSafeObjects.js"; diff --git a/backend/src/plugins/Automod/actions/warn.ts b/backend/src/plugins/Automod/actions/warn.ts index 99fa06841..8b8d2a090 100644 --- a/backend/src/plugins/Automod/actions/warn.ts +++ b/backend/src/plugins/Automod/actions/warn.ts @@ -1,4 +1,4 @@ -import z from "zod/v4"; +import { z } from "zod"; import { asyncMap, nonNullish, resolveMember, unique, zBoundedCharacters, zSnowflake } from "../../../utils.js"; import { CaseArgs } from "../../Cases/types.js"; import { ModActionsPlugin } from "../../ModActions/ModActionsPlugin.js"; diff --git a/backend/src/plugins/Automod/commands/AntiraidClearCmd.ts b/backend/src/plugins/Automod/commands/AntiraidClearCmd.ts index 7686fd8c5..513251b39 100644 --- a/backend/src/plugins/Automod/commands/AntiraidClearCmd.ts +++ b/backend/src/plugins/Automod/commands/AntiraidClearCmd.ts @@ -1,4 +1,4 @@ -import { guildPluginMessageCommand } from "knub"; +import { guildPluginMessageCommand } from "vety"; import { setAntiraidLevel } from "../functions/setAntiraidLevel.js"; import { AutomodPluginType } from "../types.js"; diff --git a/backend/src/plugins/Automod/commands/DebugAutomodCmd.ts b/backend/src/plugins/Automod/commands/DebugAutomodCmd.ts index 63942b9a3..fa0c8703d 100644 --- a/backend/src/plugins/Automod/commands/DebugAutomodCmd.ts +++ b/backend/src/plugins/Automod/commands/DebugAutomodCmd.ts @@ -1,4 +1,4 @@ -import { guildPluginMessageCommand } from "knub"; +import { guildPluginMessageCommand } from "vety"; import moment from "moment-timezone"; import { commandTypeHelpers as ct } from "../../../commandTypes.js"; import { AutomodContext, AutomodPluginType } from "../types.js"; @@ -10,7 +10,7 @@ import { getOrFetchUser } from "../../../utils/getOrFetchUser.js"; export const DebugAutomodCmd = guildPluginMessageCommand()({ trigger: "debug_automod", permission: "can_debug_automod", - + signature: { messageId: ct.string(), }, diff --git a/backend/src/plugins/Automod/commands/SetAntiraidCmd.ts b/backend/src/plugins/Automod/commands/SetAntiraidCmd.ts index 1b8beaf2e..92d0c2f89 100644 --- a/backend/src/plugins/Automod/commands/SetAntiraidCmd.ts +++ b/backend/src/plugins/Automod/commands/SetAntiraidCmd.ts @@ -1,4 +1,4 @@ -import { guildPluginMessageCommand } from "knub"; +import { guildPluginMessageCommand } from "vety"; import { commandTypeHelpers as ct } from "../../../commandTypes.js"; import { setAntiraidLevel } from "../functions/setAntiraidLevel.js"; import { AutomodPluginType } from "../types.js"; diff --git a/backend/src/plugins/Automod/commands/ViewAntiraidCmd.ts b/backend/src/plugins/Automod/commands/ViewAntiraidCmd.ts index 15762d2c9..6d132a705 100644 --- a/backend/src/plugins/Automod/commands/ViewAntiraidCmd.ts +++ b/backend/src/plugins/Automod/commands/ViewAntiraidCmd.ts @@ -1,4 +1,4 @@ -import { guildPluginMessageCommand } from "knub"; +import { guildPluginMessageCommand } from "vety"; import { AutomodPluginType } from "../types.js"; export const ViewAntiraidCmd = guildPluginMessageCommand()({ diff --git a/backend/src/plugins/Automod/constants.ts b/backend/src/plugins/Automod/constants.ts index aecbc97d9..c99845992 100644 --- a/backend/src/plugins/Automod/constants.ts +++ b/backend/src/plugins/Automod/constants.ts @@ -1,4 +1,4 @@ -import z from "zod/v4"; +import { z } from "zod"; import { MINUTES, SECONDS } from "../../utils.js"; export const RECENT_SPAM_EXPIRY_TIME = 10 * SECONDS; diff --git a/backend/src/plugins/Automod/events/RunAutomodOnJoinLeaveEvt.ts b/backend/src/plugins/Automod/events/RunAutomodOnJoinLeaveEvt.ts index edf4314c1..1a7ae688d 100644 --- a/backend/src/plugins/Automod/events/RunAutomodOnJoinLeaveEvt.ts +++ b/backend/src/plugins/Automod/events/RunAutomodOnJoinLeaveEvt.ts @@ -1,4 +1,4 @@ -import { guildPluginEventListener } from "knub"; +import { guildPluginEventListener } from "vety"; import { RecentActionType } from "../constants.js"; import { runAutomod } from "../functions/runAutomod.js"; import { AutomodContext, AutomodPluginType } from "../types.js"; diff --git a/backend/src/plugins/Automod/events/RunAutomodOnMemberUpdate.ts b/backend/src/plugins/Automod/events/RunAutomodOnMemberUpdate.ts index 596e21480..61c388029 100644 --- a/backend/src/plugins/Automod/events/RunAutomodOnMemberUpdate.ts +++ b/backend/src/plugins/Automod/events/RunAutomodOnMemberUpdate.ts @@ -1,4 +1,4 @@ -import { guildPluginEventListener } from "knub"; +import { guildPluginEventListener } from "vety"; import { difference, isEqual } from "lodash-es"; import { runAutomod } from "../functions/runAutomod.js"; import { AutomodContext, AutomodPluginType } from "../types.js"; diff --git a/backend/src/plugins/Automod/events/runAutomodOnAntiraidLevel.ts b/backend/src/plugins/Automod/events/runAutomodOnAntiraidLevel.ts index 1ca8e848d..1ffb31424 100644 --- a/backend/src/plugins/Automod/events/runAutomodOnAntiraidLevel.ts +++ b/backend/src/plugins/Automod/events/runAutomodOnAntiraidLevel.ts @@ -1,5 +1,5 @@ import { User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { runAutomod } from "../functions/runAutomod.js"; import { AutomodContext, AutomodPluginType } from "../types.js"; diff --git a/backend/src/plugins/Automod/events/runAutomodOnCounterTrigger.ts b/backend/src/plugins/Automod/events/runAutomodOnCounterTrigger.ts index b94cc8e78..ed6d165b5 100644 --- a/backend/src/plugins/Automod/events/runAutomodOnCounterTrigger.ts +++ b/backend/src/plugins/Automod/events/runAutomodOnCounterTrigger.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { resolveMember, resolveUser, UnknownUser } from "../../../utils.js"; import { CountersPlugin } from "../../Counters/CountersPlugin.js"; import { runAutomod } from "../functions/runAutomod.js"; @@ -12,7 +12,7 @@ export async function runAutomodOnCounterTrigger( userId: string | null, reverse: boolean, ) { - const user = userId ? await resolveUser(pluginData.client, userId) : undefined; + const user = userId ? await resolveUser(pluginData.client, userId, "Automod:runAutomodOnCounterTrigger") : undefined; const member = (userId && (await resolveMember(pluginData.client, pluginData.guild, userId))) || undefined; const prettyCounterName = pluginData.getPlugin(CountersPlugin).getPrettyNameForCounter(counterName); const prettyTriggerName = pluginData diff --git a/backend/src/plugins/Automod/events/runAutomodOnMessage.ts b/backend/src/plugins/Automod/events/runAutomodOnMessage.ts index f623da9c2..5623d2b05 100644 --- a/backend/src/plugins/Automod/events/runAutomodOnMessage.ts +++ b/backend/src/plugins/Automod/events/runAutomodOnMessage.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import moment from "moment-timezone"; import { performance } from "perf_hooks"; import { SavedMessage } from "../../../data/entities/SavedMessage.js"; @@ -9,12 +9,15 @@ import { runAutomod } from "../functions/runAutomod.js"; import { AutomodContext, AutomodPluginType } from "../types.js"; import { getOrFetchGuildMember } from "../../../utils/getOrFetchGuildMember.js"; import { getOrFetchUser } from "../../../utils/getOrFetchUser.js"; +import { incrementDebugCounter } from "../../../debugCounters.js"; export async function runAutomodOnMessage( pluginData: GuildPluginData, message: SavedMessage, isEdit: boolean, ) { + incrementDebugCounter("automod:runAutomodOnMessage"); + const member = await getOrFetchGuildMember(pluginData.guild, message.user_id); const user = await getOrFetchUser(pluginData.client, message.user_id); @@ -38,7 +41,7 @@ export async function runAutomodOnMessage( if (profilingEnabled()) { pluginData - .getKnubInstance() + .getVetyInstance() .profiler.addDataPoint(`automod:${pluginData.guild.id}`, performance.now() - startTime); } }); diff --git a/backend/src/plugins/Automod/events/runAutomodOnModAction.ts b/backend/src/plugins/Automod/events/runAutomodOnModAction.ts index 19273686e..f164761f8 100644 --- a/backend/src/plugins/Automod/events/runAutomodOnModAction.ts +++ b/backend/src/plugins/Automod/events/runAutomodOnModAction.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { resolveMember, resolveUser, UnknownUser } from "../../../utils.js"; import { ModActionType } from "../../ModActions/types.js"; import { runAutomod } from "../functions/runAutomod.js"; @@ -12,7 +12,7 @@ export async function runAutomodOnModAction( isAutomodAction = false, ) { const [user, member] = await Promise.all([ - resolveUser(pluginData.client, userId), + resolveUser(pluginData.client, userId, "Automod:runAutomodOnModAction"), resolveMember(pluginData.client, pluginData.guild, userId), ]); diff --git a/backend/src/plugins/Automod/events/runAutomodOnThreadEvents.ts b/backend/src/plugins/Automod/events/runAutomodOnThreadEvents.ts index f428b9ca3..d3a64b350 100644 --- a/backend/src/plugins/Automod/events/runAutomodOnThreadEvents.ts +++ b/backend/src/plugins/Automod/events/runAutomodOnThreadEvents.ts @@ -1,4 +1,4 @@ -import { guildPluginEventListener } from "knub"; +import { guildPluginEventListener } from "vety"; import { RecentActionType } from "../constants.js"; import { runAutomod } from "../functions/runAutomod.js"; import { AutomodContext, AutomodPluginType } from "../types.js"; diff --git a/backend/src/plugins/Automod/functions/addRecentActionsFromMessage.ts b/backend/src/plugins/Automod/functions/addRecentActionsFromMessage.ts index cdcb097fc..20f6f81b5 100644 --- a/backend/src/plugins/Automod/functions/addRecentActionsFromMessage.ts +++ b/backend/src/plugins/Automod/functions/addRecentActionsFromMessage.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { getEmojiInString, getRoleMentions, getUrlsInString, getUserMentions } from "../../../utils.js"; import { RecentActionType } from "../constants.js"; import { AutomodContext, AutomodPluginType } from "../types.js"; diff --git a/backend/src/plugins/Automod/functions/applyCooldown.ts b/backend/src/plugins/Automod/functions/applyCooldown.ts index f3902b228..d9262e0aa 100644 --- a/backend/src/plugins/Automod/functions/applyCooldown.ts +++ b/backend/src/plugins/Automod/functions/applyCooldown.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { convertDelayStringToMS } from "../../../utils.js"; import { AutomodContext, AutomodPluginType, TRule } from "../types.js"; diff --git a/backend/src/plugins/Automod/functions/checkCooldown.ts b/backend/src/plugins/Automod/functions/checkCooldown.ts index bb7d1cec2..b7670b4eb 100644 --- a/backend/src/plugins/Automod/functions/checkCooldown.ts +++ b/backend/src/plugins/Automod/functions/checkCooldown.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { AutomodContext, AutomodPluginType, TRule } from "../types.js"; export function checkCooldown( diff --git a/backend/src/plugins/Automod/functions/clearOldNicknameChanges.ts b/backend/src/plugins/Automod/functions/clearOldNicknameChanges.ts index 5572f294b..29686e5a0 100644 --- a/backend/src/plugins/Automod/functions/clearOldNicknameChanges.ts +++ b/backend/src/plugins/Automod/functions/clearOldNicknameChanges.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { RECENT_NICKNAME_CHANGE_EXPIRY_TIME } from "../constants.js"; import { AutomodPluginType } from "../types.js"; diff --git a/backend/src/plugins/Automod/functions/clearOldRecentActions.ts b/backend/src/plugins/Automod/functions/clearOldRecentActions.ts index 8951ee38b..c44510b9a 100644 --- a/backend/src/plugins/Automod/functions/clearOldRecentActions.ts +++ b/backend/src/plugins/Automod/functions/clearOldRecentActions.ts @@ -1,10 +1,10 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { startProfiling } from "../../../utils/easyProfiler.js"; import { RECENT_ACTION_EXPIRY_TIME } from "../constants.js"; import { AutomodPluginType } from "../types.js"; export function clearOldRecentActions(pluginData: GuildPluginData) { - const stopProfiling = startProfiling(pluginData.getKnubInstance().profiler, "automod:fns:clearOldRecentActions"); + const stopProfiling = startProfiling(pluginData.getVetyInstance().profiler, "automod:fns:clearOldRecentActions"); const now = Date.now(); pluginData.state.recentActions = pluginData.state.recentActions.filter((info) => { return info.context.timestamp + RECENT_ACTION_EXPIRY_TIME > now; diff --git a/backend/src/plugins/Automod/functions/clearOldRecentSpam.ts b/backend/src/plugins/Automod/functions/clearOldRecentSpam.ts index dce2f20c8..82d2bc8af 100644 --- a/backend/src/plugins/Automod/functions/clearOldRecentSpam.ts +++ b/backend/src/plugins/Automod/functions/clearOldRecentSpam.ts @@ -1,10 +1,10 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { startProfiling } from "../../../utils/easyProfiler.js"; import { RECENT_SPAM_EXPIRY_TIME } from "../constants.js"; import { AutomodPluginType } from "../types.js"; export function clearOldRecentSpam(pluginData: GuildPluginData) { - const stopProfiling = startProfiling(pluginData.getKnubInstance().profiler, "automod:fns:clearOldRecentSpam"); + const stopProfiling = startProfiling(pluginData.getVetyInstance().profiler, "automod:fns:clearOldRecentSpam"); const now = Date.now(); pluginData.state.recentSpam = pluginData.state.recentSpam.filter((spam) => { return spam.timestamp + RECENT_SPAM_EXPIRY_TIME > now; diff --git a/backend/src/plugins/Automod/functions/clearRecentActionsForMessage.ts b/backend/src/plugins/Automod/functions/clearRecentActionsForMessage.ts index 69e188c12..fa068f0aa 100644 --- a/backend/src/plugins/Automod/functions/clearRecentActionsForMessage.ts +++ b/backend/src/plugins/Automod/functions/clearRecentActionsForMessage.ts @@ -1,10 +1,10 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { startProfiling } from "../../../utils/easyProfiler.js"; import { AutomodContext, AutomodPluginType } from "../types.js"; export function clearRecentActionsForMessage(pluginData: GuildPluginData, context: AutomodContext) { const stopProfiling = startProfiling( - pluginData.getKnubInstance().profiler, + pluginData.getVetyInstance().profiler, "automod:fns:clearRecentActionsForMessage", ); const message = context.message!; diff --git a/backend/src/plugins/Automod/functions/createMessageSpamTrigger.ts b/backend/src/plugins/Automod/functions/createMessageSpamTrigger.ts index d92e82cc2..25f380391 100644 --- a/backend/src/plugins/Automod/functions/createMessageSpamTrigger.ts +++ b/backend/src/plugins/Automod/functions/createMessageSpamTrigger.ts @@ -1,4 +1,4 @@ -import z from "zod/v4"; +import { z } from "zod"; import { SavedMessage } from "../../../data/entities/SavedMessage.js"; import { humanizeDurationShort } from "../../../humanizeDuration.js"; import { getBaseUrl } from "../../../pluginUtils.js"; diff --git a/backend/src/plugins/Automod/functions/findRecentSpam.ts b/backend/src/plugins/Automod/functions/findRecentSpam.ts index d13a0bc1a..de6587c9b 100644 --- a/backend/src/plugins/Automod/functions/findRecentSpam.ts +++ b/backend/src/plugins/Automod/functions/findRecentSpam.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { startProfiling } from "../../../utils/easyProfiler.js"; import { RecentActionType } from "../constants.js"; import { AutomodPluginType } from "../types.js"; @@ -8,7 +8,7 @@ export function findRecentSpam( type: RecentActionType, identifier?: string, ) { - const stopProfiling = startProfiling(pluginData.getKnubInstance().profiler, "automod:fns:findRecentSpam"); + const stopProfiling = startProfiling(pluginData.getVetyInstance().profiler, "automod:fns:findRecentSpam"); const result = pluginData.state.recentSpam.find((spam) => { return spam.type === type && (!identifier || spam.identifiers.includes(identifier)); }); diff --git a/backend/src/plugins/Automod/functions/getMatchingMessageRecentActions.ts b/backend/src/plugins/Automod/functions/getMatchingMessageRecentActions.ts index 6e509ac84..1be5d28f7 100644 --- a/backend/src/plugins/Automod/functions/getMatchingMessageRecentActions.ts +++ b/backend/src/plugins/Automod/functions/getMatchingMessageRecentActions.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import moment from "moment-timezone"; import { SavedMessage } from "../../../data/entities/SavedMessage.js"; import { startProfiling } from "../../../utils/easyProfiler.js"; @@ -15,7 +15,7 @@ export function getMatchingMessageRecentActions( within: number, ) { const stopProfiling = startProfiling( - pluginData.getKnubInstance().profiler, + pluginData.getVetyInstance().profiler, "automod:fns:getMatchingMessageRecentActions", ); const since = moment.utc(message.posted_at).valueOf() - within; diff --git a/backend/src/plugins/Automod/functions/getMatchingRecentActions.ts b/backend/src/plugins/Automod/functions/getMatchingRecentActions.ts index 9262124be..c617eb7ed 100644 --- a/backend/src/plugins/Automod/functions/getMatchingRecentActions.ts +++ b/backend/src/plugins/Automod/functions/getMatchingRecentActions.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { startProfiling } from "../../../utils/easyProfiler.js"; import { RecentActionType } from "../constants.js"; import { AutomodPluginType } from "../types.js"; @@ -10,7 +10,7 @@ export function getMatchingRecentActions( since: number, to?: number, ) { - const stopProfiling = startProfiling(pluginData.getKnubInstance().profiler, "automod:fns:getMatchingRecentActions"); + const stopProfiling = startProfiling(pluginData.getVetyInstance().profiler, "automod:fns:getMatchingRecentActions"); to = to || Date.now(); const result = pluginData.state.recentActions.filter((action) => { diff --git a/backend/src/plugins/Automod/functions/getTextMatchPartialSummary.ts b/backend/src/plugins/Automod/functions/getTextMatchPartialSummary.ts index 3feb5eea2..64c797f27 100644 --- a/backend/src/plugins/Automod/functions/getTextMatchPartialSummary.ts +++ b/backend/src/plugins/Automod/functions/getTextMatchPartialSummary.ts @@ -1,5 +1,5 @@ import { ActivityType, Snowflake } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { messageSummary, verboseChannelMention } from "../../../utils.js"; import { AutomodContext, AutomodPluginType } from "../types.js"; import { MatchableTextType } from "./matchMultipleTextTypesOnMessage.js"; diff --git a/backend/src/plugins/Automod/functions/ignoredRoleChanges.ts b/backend/src/plugins/Automod/functions/ignoredRoleChanges.ts index 773368771..13d1092e6 100644 --- a/backend/src/plugins/Automod/functions/ignoredRoleChanges.ts +++ b/backend/src/plugins/Automod/functions/ignoredRoleChanges.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { MINUTES } from "../../../utils.js"; import { AutomodPluginType } from "../types.js"; diff --git a/backend/src/plugins/Automod/functions/matchMultipleTextTypesOnMessage.ts b/backend/src/plugins/Automod/functions/matchMultipleTextTypesOnMessage.ts index 2152b4c2c..e36a91867 100644 --- a/backend/src/plugins/Automod/functions/matchMultipleTextTypesOnMessage.ts +++ b/backend/src/plugins/Automod/functions/matchMultipleTextTypesOnMessage.ts @@ -1,5 +1,5 @@ import { ActivityType, Embed } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { SavedMessage } from "../../../data/entities/SavedMessage.js"; import { renderUsername, resolveMember } from "../../../utils.js"; import { DeepMutable } from "../../../utils/typeUtils.js"; diff --git a/backend/src/plugins/Automod/functions/resolveActionContactMethods.ts b/backend/src/plugins/Automod/functions/resolveActionContactMethods.ts index 93a0846da..90908c8d8 100644 --- a/backend/src/plugins/Automod/functions/resolveActionContactMethods.ts +++ b/backend/src/plugins/Automod/functions/resolveActionContactMethods.ts @@ -1,5 +1,5 @@ import { Snowflake } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { ERRORS, RecoverablePluginError } from "../../../RecoverablePluginError.js"; import { UserNotificationMethod, disableUserNotificationStrings } from "../../../utils.js"; import { AutomodPluginType } from "../types.js"; diff --git a/backend/src/plugins/Automod/functions/runAutomod.ts b/backend/src/plugins/Automod/functions/runAutomod.ts index e5bed2eae..abb65fdea 100644 --- a/backend/src/plugins/Automod/functions/runAutomod.ts +++ b/backend/src/plugins/Automod/functions/runAutomod.ts @@ -1,5 +1,5 @@ import { GuildTextBasedChannel, Snowflake } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { performance } from "perf_hooks"; import { calculateBlocking, profilingEnabled } from "../../../utils/easyProfiler.js"; import { availableActions } from "../actions/availableActions.js"; @@ -32,7 +32,7 @@ interface RuleResultOutcomeSuccess { interface RuleResultOutcomeFailure { success: false; - reason: typeof ruleFailReason[keyof typeof ruleFailReason]; + reason: (typeof ruleFailReason)[keyof typeof ruleFailReason]; } type RuleResultOutcome = RuleResultOutcomeSuccess | RuleResultOutcomeFailure; @@ -48,7 +48,11 @@ interface AutomodRunResult { rulesChecked: RuleResult[]; } -export async function runAutomod(pluginData: GuildPluginData, context: AutomodContext, dryRun: boolean = false): Promise { +export async function runAutomod( + pluginData: GuildPluginData, + context: AutomodContext, + dryRun = false, +): Promise { const userId = context.user?.id || context.member?.id || context.message?.user_id; const user = context.user || (userId && pluginData.client.users!.cache.get(userId as Snowflake)); const member = context.member || (userId && pluginData.guild.members.cache.get(userId as Snowflake)) || null; @@ -143,7 +147,7 @@ export async function runAutomod(pluginData: GuildPluginData, if (profilingEnabled()) { const blockingTime = getBlockingTime?.() || 0; pluginData - .getKnubInstance() + .getVetyInstance() .profiler.addDataPoint( `automod:${pluginData.guild.id}:${ruleName}:triggers:${triggerName}:blocking`, blockingTime, @@ -187,7 +191,7 @@ export async function runAutomod(pluginData: GuildPluginData, if (profilingEnabled()) { pluginData - .getKnubInstance() + .getVetyInstance() .profiler.addDataPoint( `automod:${pluginData.guild.id}:${ruleName}:triggers:${triggerName}`, performance.now() - triggerStartTime, @@ -230,7 +234,7 @@ export async function runAutomod(pluginData: GuildPluginData, if (profilingEnabled()) { pluginData - .getKnubInstance() + .getVetyInstance() .profiler.addDataPoint( `automod:${pluginData.guild.id}:${ruleName}:actions:${actionName}`, performance.now() - actionStartTime, @@ -253,7 +257,7 @@ export async function runAutomod(pluginData: GuildPluginData, if (profilingEnabled()) { pluginData - .getKnubInstance() + .getVetyInstance() .profiler.addDataPoint(`automod:${pluginData.guild.id}:${ruleName}`, performance.now() - ruleStartTime); } diff --git a/backend/src/plugins/Automod/functions/setAntiraidLevel.ts b/backend/src/plugins/Automod/functions/setAntiraidLevel.ts index a32155d12..53a2a402b 100644 --- a/backend/src/plugins/Automod/functions/setAntiraidLevel.ts +++ b/backend/src/plugins/Automod/functions/setAntiraidLevel.ts @@ -1,5 +1,5 @@ import { User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogsPlugin } from "../../Logs/LogsPlugin.js"; import { runAutomodOnAntiraidLevel } from "../events/runAutomodOnAntiraidLevel.js"; import { AutomodPluginType } from "../types.js"; diff --git a/backend/src/plugins/Automod/helpers.ts b/backend/src/plugins/Automod/helpers.ts index df4f7b978..dc5b443b2 100644 --- a/backend/src/plugins/Automod/helpers.ts +++ b/backend/src/plugins/Automod/helpers.ts @@ -1,5 +1,5 @@ -import { GuildPluginData } from "knub"; -import z, { ZodTypeAny } from "zod/v4"; +import { GuildPluginData } from "vety"; +import { z, type ZodTypeAny } from "zod"; import { Awaitable } from "../../utils/typeUtils.js"; import { AutomodContext, AutomodPluginType } from "./types.js"; diff --git a/backend/src/plugins/Automod/triggers/antiraidLevel.ts b/backend/src/plugins/Automod/triggers/antiraidLevel.ts index 7e7558ae3..961d75036 100644 --- a/backend/src/plugins/Automod/triggers/antiraidLevel.ts +++ b/backend/src/plugins/Automod/triggers/antiraidLevel.ts @@ -1,4 +1,4 @@ -import z from "zod/v4"; +import { z } from "zod"; import { automodTrigger } from "../helpers.js"; interface AntiraidLevelTriggerResult {} diff --git a/backend/src/plugins/Automod/triggers/anyMessage.ts b/backend/src/plugins/Automod/triggers/anyMessage.ts index 95967dc26..5274fb9be 100644 --- a/backend/src/plugins/Automod/triggers/anyMessage.ts +++ b/backend/src/plugins/Automod/triggers/anyMessage.ts @@ -1,5 +1,5 @@ import { Snowflake } from "discord.js"; -import z from "zod/v4"; +import { z } from "zod"; import { verboseChannelMention } from "../../../utils.js"; import { automodTrigger } from "../helpers.js"; diff --git a/backend/src/plugins/Automod/triggers/availableTriggers.ts b/backend/src/plugins/Automod/triggers/availableTriggers.ts index 04f8fc1f2..0dc9b1b39 100644 --- a/backend/src/plugins/Automod/triggers/availableTriggers.ts +++ b/backend/src/plugins/Automod/triggers/availableTriggers.ts @@ -6,6 +6,7 @@ import { BanTrigger } from "./ban.js"; import { CharacterSpamTrigger } from "./characterSpam.js"; import { CounterTrigger } from "./counterTrigger.js"; import { EmojiSpamTrigger } from "./emojiSpam.js"; +import { HasAttachmentsTrigger } from "./hasAttachments.js"; import { KickTrigger } from "./kick.js"; import { LineSpamTrigger } from "./lineSpam.js"; import { LinkSpamTrigger } from "./linkSpam.js"; @@ -41,6 +42,7 @@ export const availableTriggers: Record match_regex: MatchRegexTrigger, match_invites: MatchInvitesTrigger, match_links: MatchLinksTrigger, + has_attachments: HasAttachmentsTrigger, match_attachment_type: MatchAttachmentTypeTrigger, match_mime_type: MatchMimeTypeTrigger, member_join: MemberJoinTrigger, diff --git a/backend/src/plugins/Automod/triggers/ban.ts b/backend/src/plugins/Automod/triggers/ban.ts index 25c03f79a..98c9ead0d 100644 --- a/backend/src/plugins/Automod/triggers/ban.ts +++ b/backend/src/plugins/Automod/triggers/ban.ts @@ -1,4 +1,4 @@ -import z from "zod/v4"; +import { z } from "zod"; import { automodTrigger } from "../helpers.js"; // tslint:disable-next-line:no-empty-interface diff --git a/backend/src/plugins/Automod/triggers/counterTrigger.ts b/backend/src/plugins/Automod/triggers/counterTrigger.ts index 53fc8c5f4..bf0184562 100644 --- a/backend/src/plugins/Automod/triggers/counterTrigger.ts +++ b/backend/src/plugins/Automod/triggers/counterTrigger.ts @@ -1,4 +1,4 @@ -import z from "zod/v4"; +import { z } from "zod"; import { automodTrigger } from "../helpers.js"; // tslint:disable-next-line diff --git a/backend/src/plugins/Automod/triggers/exampleTrigger.ts b/backend/src/plugins/Automod/triggers/exampleTrigger.ts index 063f2b392..4d91483a2 100644 --- a/backend/src/plugins/Automod/triggers/exampleTrigger.ts +++ b/backend/src/plugins/Automod/triggers/exampleTrigger.ts @@ -1,4 +1,4 @@ -import z from "zod/v4"; +import { z } from "zod"; import { automodTrigger } from "../helpers.js"; interface ExampleMatchResultType { diff --git a/backend/src/plugins/Automod/triggers/hasAttachments.ts b/backend/src/plugins/Automod/triggers/hasAttachments.ts new file mode 100644 index 000000000..9388f2d32 --- /dev/null +++ b/backend/src/plugins/Automod/triggers/hasAttachments.ts @@ -0,0 +1,58 @@ +import { Snowflake } from "discord.js"; +import z from "zod"; +import { asSingleLine, messageSummary, verboseChannelMention } from "../../../utils.js"; +import { automodTrigger } from "../helpers.js"; + +interface HasAttachmentsMatchResult { + hasAttachments: boolean; + attachmentCount: number; +} + +const configSchema = z.strictObject({ + min_count: z.number().int().min(0).nullable().default(1), + max_count: z.number().int().nullable().default(null), +}); + +export const HasAttachmentsTrigger = automodTrigger()({ + configSchema, + + async match({ context, triggerConfig }) { + if (!context.message) { + return; + } + if (triggerConfig.min_count == null && triggerConfig.max_count == null) { + return; + } + + const attachments = context.message.data.attachments; + const attachmentCount = attachments?.length ?? 0; + const hasAttachments = attachmentCount > 0; + const matchesMinCount = triggerConfig.min_count != null ? attachmentCount >= triggerConfig.min_count : true; + const matchesMaxCount = triggerConfig.max_count != null ? attachmentCount <= triggerConfig.max_count : true; + + if (matchesMinCount && matchesMaxCount) { + return { + extra: { + hasAttachments, + attachmentCount, + }, + }; + } + + return null; + }, + + renderMatchInformation({ pluginData, contexts, matchResult }) { + const message = contexts[0].message!; + const channel = pluginData.guild.channels.cache.get(message.channel_id as Snowflake); + const prettyChannel = channel ? verboseChannelMention(channel) : "Unknown Channel"; + const descriptor = matchResult.extra.hasAttachments ? "has" : "does not have"; + + return ( + asSingleLine(` + Matched message (\`${message.id}\`) that ${descriptor} attachments + (${matchResult.extra.attachmentCount}) in ${prettyChannel}: + `) + messageSummary(message) + ); + }, +}); diff --git a/backend/src/plugins/Automod/triggers/kick.ts b/backend/src/plugins/Automod/triggers/kick.ts index 0e0d8deb6..dd678db2c 100644 --- a/backend/src/plugins/Automod/triggers/kick.ts +++ b/backend/src/plugins/Automod/triggers/kick.ts @@ -1,4 +1,4 @@ -import z from "zod/v4"; +import { z } from "zod"; import { automodTrigger } from "../helpers.js"; // tslint:disable-next-line:no-empty-interface diff --git a/backend/src/plugins/Automod/triggers/matchAttachmentType.ts b/backend/src/plugins/Automod/triggers/matchAttachmentType.ts index 5848a175d..833776217 100644 --- a/backend/src/plugins/Automod/triggers/matchAttachmentType.ts +++ b/backend/src/plugins/Automod/triggers/matchAttachmentType.ts @@ -1,6 +1,6 @@ import { escapeInlineCode, Snowflake } from "discord.js"; import { extname } from "path"; -import z from "zod/v4"; +import { z } from "zod"; import { asSingleLine, messageSummary, verboseChannelMention } from "../../../utils.js"; import { automodTrigger } from "../helpers.js"; diff --git a/backend/src/plugins/Automod/triggers/matchInvites.ts b/backend/src/plugins/Automod/triggers/matchInvites.ts index cf77fe7e9..89b47e1a1 100644 --- a/backend/src/plugins/Automod/triggers/matchInvites.ts +++ b/backend/src/plugins/Automod/triggers/matchInvites.ts @@ -1,4 +1,4 @@ -import z from "zod/v4"; +import { z } from "zod"; import { getInviteCodesInString, GuildInvite, isGuildInvite, resolveInvite, zSnowflake } from "../../../utils.js"; import { getTextMatchPartialSummary } from "../functions/getTextMatchPartialSummary.js"; import { MatchableTextType, matchMultipleTextTypesOnMessage } from "../functions/matchMultipleTextTypesOnMessage.js"; @@ -15,8 +15,16 @@ const configSchema = z.strictObject({ exclude_guilds: z.array(zSnowflake).max(255).optional(), include_invite_codes: z.array(z.string().max(32)).max(255).optional(), exclude_invite_codes: z.array(z.string().max(32)).max(255).optional(), - include_custom_invite_codes: z.array(z.string().max(32)).max(255).transform(arr => arr.map(str => str.toLowerCase())).optional(), - exclude_custom_invite_codes: z.array(z.string().max(32)).max(255).transform(arr => arr.map(str => str.toLowerCase())).optional(), + include_custom_invite_codes: z + .array(z.string().max(32)) + .max(255) + .transform((arr) => arr.map((str) => str.toLowerCase())) + .optional(), + exclude_custom_invite_codes: z + .array(z.string().max(32)) + .max(255) + .transform((arr) => arr.map((str) => str.toLowerCase())) + .optional(), allow_group_dm_invites: z.boolean().default(false), match_messages: z.boolean().default(true), match_embeds: z.boolean().default(false), diff --git a/backend/src/plugins/Automod/triggers/matchLinks.ts b/backend/src/plugins/Automod/triggers/matchLinks.ts index 9955b3104..7af073f54 100644 --- a/backend/src/plugins/Automod/triggers/matchLinks.ts +++ b/backend/src/plugins/Automod/triggers/matchLinks.ts @@ -1,5 +1,5 @@ import { escapeInlineCode } from "discord.js"; -import z from "zod/v4"; +import { z } from "zod"; import { allowTimeout } from "../../../RegExpRunner.js"; import { getFishFishDomain } from "../../../data/FishFish.js"; import { getUrlsInString, inputPatternToRegExp, zRegex } from "../../../utils.js"; @@ -73,7 +73,10 @@ export const MatchLinksTrigger = automodTrigger()({ if (trigger.exclude_regex) { if (!regexCache.has(trigger.exclude_regex)) { - const toCache = mergeRegexes(trigger.exclude_regex.map(pattern => inputPatternToRegExp(pattern)), "i"); + const toCache = mergeRegexes( + trigger.exclude_regex.map((pattern) => inputPatternToRegExp(pattern)), + "i", + ); regexCache.set(trigger.exclude_regex, toCache); } const regexes = regexCache.get(trigger.exclude_regex)!; @@ -88,7 +91,10 @@ export const MatchLinksTrigger = automodTrigger()({ if (trigger.include_regex) { if (!regexCache.has(trigger.include_regex)) { - const toCache = mergeRegexes(trigger.include_regex.map(pattern => inputPatternToRegExp(pattern)), "i"); + const toCache = mergeRegexes( + trigger.include_regex.map((pattern) => inputPatternToRegExp(pattern)), + "i", + ); regexCache.set(trigger.include_regex, toCache); } const regexes = regexCache.get(trigger.include_regex)!; diff --git a/backend/src/plugins/Automod/triggers/matchMimeType.ts b/backend/src/plugins/Automod/triggers/matchMimeType.ts index 8a1bb8f5e..71ddff855 100644 --- a/backend/src/plugins/Automod/triggers/matchMimeType.ts +++ b/backend/src/plugins/Automod/triggers/matchMimeType.ts @@ -1,5 +1,5 @@ import { escapeInlineCode } from "discord.js"; -import z from "zod/v4"; +import { z } from "zod"; import { asSingleLine, messageSummary, verboseChannelMention } from "../../../utils.js"; import { automodTrigger } from "../helpers.js"; diff --git a/backend/src/plugins/Automod/triggers/matchRegex.ts b/backend/src/plugins/Automod/triggers/matchRegex.ts index 4298cfc36..1eed3206f 100644 --- a/backend/src/plugins/Automod/triggers/matchRegex.ts +++ b/backend/src/plugins/Automod/triggers/matchRegex.ts @@ -1,4 +1,4 @@ -import z from "zod/v4"; +import { z } from "zod"; import { allowTimeout } from "../../../RegExpRunner.js"; import { inputPatternToRegExp, zRegex } from "../../../utils.js"; import { mergeRegexes } from "../../../utils/mergeRegexes.js"; @@ -38,7 +38,10 @@ export const MatchRegexTrigger = automodTrigger()({ if (!regexCache.has(trigger)) { const flags = trigger.case_sensitive ? "" : "i"; - const toCache = mergeRegexes(trigger.patterns.map(pattern => inputPatternToRegExp(pattern)), flags); + const toCache = mergeRegexes( + trigger.patterns.map((pattern) => inputPatternToRegExp(pattern)), + flags, + ); regexCache.set(trigger, toCache); } const regexes = regexCache.get(trigger)!; diff --git a/backend/src/plugins/Automod/triggers/matchWords.ts b/backend/src/plugins/Automod/triggers/matchWords.ts index 0c324e53b..0609c492a 100644 --- a/backend/src/plugins/Automod/triggers/matchWords.ts +++ b/backend/src/plugins/Automod/triggers/matchWords.ts @@ -1,5 +1,5 @@ import escapeStringRegexp from "escape-string-regexp"; -import z from "zod/v4"; +import { z } from "zod"; import { normalizeText } from "../../../utils/normalizeText.js"; import { stripMarkdown } from "../../../utils/stripMarkdown.js"; import { getTextMatchPartialSummary } from "../functions/getTextMatchPartialSummary.js"; @@ -44,9 +44,7 @@ export const MatchWordsTrigger = automodTrigger()({ let pattern; if (trigger.loose_matching) { - pattern = [...word] - .map((c) => escapeStringRegexp(c)) - .join(`[\\s\\-_.,!?]{0,${looseMatchingThreshold}}`); + pattern = [...word].map((c) => escapeStringRegexp(c)).join(`[\\s\\-_.,!?]{0,${looseMatchingThreshold}}`); } else { pattern = escapeStringRegexp(word); } @@ -62,10 +60,7 @@ export const MatchWordsTrigger = automodTrigger()({ return pattern; }); - const mergedRegex = new RegExp( - patterns.map((p) => `(${p})`).join("|"), - trigger.case_sensitive ? "" : "i" - ); + const mergedRegex = new RegExp(patterns.map((p) => `(${p})`).join("|"), trigger.case_sensitive ? "" : "i"); regexCache.set(trigger, [mergedRegex]); } @@ -84,7 +79,7 @@ export const MatchWordsTrigger = automodTrigger()({ for (const regex of regexes) { const match = regex.exec(str); if (match) { - const matchedWordIndex = match.slice(1).findIndex(group => group !== undefined); + const matchedWordIndex = match.slice(1).findIndex((group) => group !== undefined); const matchedWord = trigger.words[matchedWordIndex]; return { diff --git a/backend/src/plugins/Automod/triggers/memberJoin.ts b/backend/src/plugins/Automod/triggers/memberJoin.ts index ed0d6c7ae..f7aee4377 100644 --- a/backend/src/plugins/Automod/triggers/memberJoin.ts +++ b/backend/src/plugins/Automod/triggers/memberJoin.ts @@ -1,4 +1,4 @@ -import z from "zod/v4"; +import { z } from "zod"; import { convertDelayStringToMS, zDelayString } from "../../../utils.js"; import { automodTrigger } from "../helpers.js"; diff --git a/backend/src/plugins/Automod/triggers/memberJoinSpam.ts b/backend/src/plugins/Automod/triggers/memberJoinSpam.ts index 316d92131..022fd68ba 100644 --- a/backend/src/plugins/Automod/triggers/memberJoinSpam.ts +++ b/backend/src/plugins/Automod/triggers/memberJoinSpam.ts @@ -1,4 +1,4 @@ -import z from "zod/v4"; +import { z } from "zod"; import { convertDelayStringToMS, zDelayString } from "../../../utils.js"; import { RecentActionType } from "../constants.js"; import { findRecentSpam } from "../functions/findRecentSpam.js"; diff --git a/backend/src/plugins/Automod/triggers/memberLeave.ts b/backend/src/plugins/Automod/triggers/memberLeave.ts index 6f4c392f7..3a89d7b9d 100644 --- a/backend/src/plugins/Automod/triggers/memberLeave.ts +++ b/backend/src/plugins/Automod/triggers/memberLeave.ts @@ -1,4 +1,4 @@ -import z from "zod/v4"; +import { z } from "zod"; import { automodTrigger } from "../helpers.js"; const configSchema = z.strictObject({}); diff --git a/backend/src/plugins/Automod/triggers/mute.ts b/backend/src/plugins/Automod/triggers/mute.ts index 3f840dd31..2204dd757 100644 --- a/backend/src/plugins/Automod/triggers/mute.ts +++ b/backend/src/plugins/Automod/triggers/mute.ts @@ -1,4 +1,4 @@ -import z from "zod/v4"; +import { z } from "zod"; import { automodTrigger } from "../helpers.js"; // tslint:disable-next-line:no-empty-interface diff --git a/backend/src/plugins/Automod/triggers/note.ts b/backend/src/plugins/Automod/triggers/note.ts index 26efe482a..1cf199bcb 100644 --- a/backend/src/plugins/Automod/triggers/note.ts +++ b/backend/src/plugins/Automod/triggers/note.ts @@ -1,4 +1,4 @@ -import z from "zod/v4"; +import { z } from "zod"; import { automodTrigger } from "../helpers.js"; // tslint:disable-next-line:no-empty-interface diff --git a/backend/src/plugins/Automod/triggers/roleAdded.ts b/backend/src/plugins/Automod/triggers/roleAdded.ts index 500916071..2e8c1ef4e 100644 --- a/backend/src/plugins/Automod/triggers/roleAdded.ts +++ b/backend/src/plugins/Automod/triggers/roleAdded.ts @@ -1,5 +1,5 @@ import { Snowflake } from "discord.js"; -import z from "zod/v4"; +import { z } from "zod"; import { renderUsername, zSnowflake } from "../../../utils.js"; import { consumeIgnoredRoleChange } from "../functions/ignoredRoleChanges.js"; import { automodTrigger } from "../helpers.js"; diff --git a/backend/src/plugins/Automod/triggers/roleRemoved.ts b/backend/src/plugins/Automod/triggers/roleRemoved.ts index cd500a0cc..227eb609d 100644 --- a/backend/src/plugins/Automod/triggers/roleRemoved.ts +++ b/backend/src/plugins/Automod/triggers/roleRemoved.ts @@ -1,5 +1,5 @@ import { Snowflake } from "discord.js"; -import z from "zod/v4"; +import { z } from "zod"; import { renderUsername, zSnowflake } from "../../../utils.js"; import { consumeIgnoredRoleChange } from "../functions/ignoredRoleChanges.js"; import { automodTrigger } from "../helpers.js"; diff --git a/backend/src/plugins/Automod/triggers/threadArchive.ts b/backend/src/plugins/Automod/triggers/threadArchive.ts index 28a531809..054009319 100644 --- a/backend/src/plugins/Automod/triggers/threadArchive.ts +++ b/backend/src/plugins/Automod/triggers/threadArchive.ts @@ -1,5 +1,5 @@ import { User, escapeBold, type Snowflake } from "discord.js"; -import z from "zod/v4"; +import { z } from "zod"; import { renderUsername } from "../../../utils.js"; import { automodTrigger } from "../helpers.js"; diff --git a/backend/src/plugins/Automod/triggers/threadCreate.ts b/backend/src/plugins/Automod/triggers/threadCreate.ts index a11c8813c..6321b5df8 100644 --- a/backend/src/plugins/Automod/triggers/threadCreate.ts +++ b/backend/src/plugins/Automod/triggers/threadCreate.ts @@ -1,5 +1,5 @@ import { User, escapeBold, type Snowflake } from "discord.js"; -import z from "zod/v4"; +import { z } from "zod"; import { renderUsername } from "../../../utils.js"; import { automodTrigger } from "../helpers.js"; diff --git a/backend/src/plugins/Automod/triggers/threadCreateSpam.ts b/backend/src/plugins/Automod/triggers/threadCreateSpam.ts index bb2864084..5ce8f533c 100644 --- a/backend/src/plugins/Automod/triggers/threadCreateSpam.ts +++ b/backend/src/plugins/Automod/triggers/threadCreateSpam.ts @@ -1,4 +1,4 @@ -import z from "zod/v4"; +import { z } from "zod"; import { convertDelayStringToMS, zDelayString } from "../../../utils.js"; import { RecentActionType } from "../constants.js"; import { findRecentSpam } from "../functions/findRecentSpam.js"; diff --git a/backend/src/plugins/Automod/triggers/threadDelete.ts b/backend/src/plugins/Automod/triggers/threadDelete.ts index 774fdf303..3c305b79f 100644 --- a/backend/src/plugins/Automod/triggers/threadDelete.ts +++ b/backend/src/plugins/Automod/triggers/threadDelete.ts @@ -1,5 +1,5 @@ import { User, escapeBold, type Snowflake } from "discord.js"; -import z from "zod/v4"; +import { z } from "zod"; import { renderUsername } from "../../../utils.js"; import { automodTrigger } from "../helpers.js"; diff --git a/backend/src/plugins/Automod/triggers/threadUnarchive.ts b/backend/src/plugins/Automod/triggers/threadUnarchive.ts index d180b0829..9fff2d127 100644 --- a/backend/src/plugins/Automod/triggers/threadUnarchive.ts +++ b/backend/src/plugins/Automod/triggers/threadUnarchive.ts @@ -1,5 +1,5 @@ import { User, escapeBold, type Snowflake } from "discord.js"; -import z from "zod/v4"; +import { z } from "zod"; import { renderUsername } from "../../../utils.js"; import { automodTrigger } from "../helpers.js"; diff --git a/backend/src/plugins/Automod/triggers/unban.ts b/backend/src/plugins/Automod/triggers/unban.ts index c29856bbe..756d8544c 100644 --- a/backend/src/plugins/Automod/triggers/unban.ts +++ b/backend/src/plugins/Automod/triggers/unban.ts @@ -1,4 +1,4 @@ -import z from "zod/v4"; +import { z } from "zod"; import { automodTrigger } from "../helpers.js"; // tslint:disable-next-line:no-empty-interface diff --git a/backend/src/plugins/Automod/triggers/unmute.ts b/backend/src/plugins/Automod/triggers/unmute.ts index 076ac99d9..1ee5c2dba 100644 --- a/backend/src/plugins/Automod/triggers/unmute.ts +++ b/backend/src/plugins/Automod/triggers/unmute.ts @@ -1,4 +1,4 @@ -import z from "zod/v4"; +import { z } from "zod"; import { automodTrigger } from "../helpers.js"; // tslint:disable-next-line:no-empty-interface diff --git a/backend/src/plugins/Automod/triggers/warn.ts b/backend/src/plugins/Automod/triggers/warn.ts index cfec4ba76..bdbe86434 100644 --- a/backend/src/plugins/Automod/triggers/warn.ts +++ b/backend/src/plugins/Automod/triggers/warn.ts @@ -1,4 +1,4 @@ -import z from "zod/v4"; +import { z } from "zod"; import { automodTrigger } from "../helpers.js"; // tslint:disable-next-line:no-empty-interface diff --git a/backend/src/plugins/Automod/types.ts b/backend/src/plugins/Automod/types.ts index 48c326daf..843ed1b15 100644 --- a/backend/src/plugins/Automod/types.ts +++ b/backend/src/plugins/Automod/types.ts @@ -1,6 +1,6 @@ import { GuildMember, GuildTextBasedChannel, PartialGuildMember, ThreadChannel, User } from "discord.js"; -import { BasePluginType, CooldownManager, pluginUtils } from "knub"; -import z from "zod/v4"; +import { BasePluginType, CooldownManager, pluginUtils } from "vety"; +import { z } from "zod"; import { Queue } from "../../Queue.js"; import { RegExpRunner } from "../../RegExpRunner.js"; import { GuildAntiraidLevels } from "../../data/GuildAntiraidLevels.js"; diff --git a/backend/src/plugins/BotControl/BotControlPlugin.ts b/backend/src/plugins/BotControl/BotControlPlugin.ts index bad32a4d4..0d9b277fb 100644 --- a/backend/src/plugins/BotControl/BotControlPlugin.ts +++ b/backend/src/plugins/BotControl/BotControlPlugin.ts @@ -1,5 +1,5 @@ import { Snowflake, TextChannel } from "discord.js"; -import { globalPlugin } from "knub"; +import { globalPlugin } from "vety"; import { AllowedGuilds } from "../../data/AllowedGuilds.js"; import { ApiPermissionAssignments } from "../../data/ApiPermissionAssignments.js"; import { Configs } from "../../data/Configs.js"; @@ -22,6 +22,7 @@ import { RemoveDashboardUserCmd } from "./commands/RemoveDashboardUserCmd.js"; import { RestPerformanceCmd } from "./commands/RestPerformanceCmd.js"; import { ServersCmd } from "./commands/ServersCmd.js"; import { BotControlPluginType, zBotControlConfig } from "./types.js"; +import { DebugCountersCmd } from "./commands/DebugCountersCmd.js"; export const BotControlPlugin = globalPlugin()({ name: "bot_control", @@ -45,6 +46,7 @@ export const BotControlPlugin = globalPlugin()({ RateLimitPerformanceCmd, AddServerFromInviteCmd, ChannelToServerCmd, + DebugCountersCmd, ], async afterLoad(pluginData) { diff --git a/backend/src/plugins/BotControl/commands/DebugCountersCmd.ts b/backend/src/plugins/BotControl/commands/DebugCountersCmd.ts new file mode 100644 index 000000000..3a9967073 --- /dev/null +++ b/backend/src/plugins/BotControl/commands/DebugCountersCmd.ts @@ -0,0 +1,33 @@ +import moment from "moment-timezone"; +import { GuildArchives } from "../../../data/GuildArchives.js"; +import { getDebugCounterValues } from "../../../debugCounters.js"; +import { getBaseUrl } from "../../../pluginUtils.js"; +import { botControlCmd } from "../types.js"; + +type SortableDebugCounter = { + name: string; + count: number; +}; + +export const DebugCountersCmd = botControlCmd({ + trigger: ["debug_counters"], + permission: "can_performance", + + signature: {}, + + async run({ pluginData, message: msg }) { + const debugCounterValueMap = getDebugCounterValues(); + const sortableDebugCounters: SortableDebugCounter[] = []; + for (const [name, value] of debugCounterValueMap) { + sortableDebugCounters.push({ name, count: value.count }); + } + + sortableDebugCounters.sort((a, b) => b.count - a.count); + + const archives = GuildArchives.getGuildInstance("0"); + const archiveId = await archives.create(JSON.stringify(sortableDebugCounters, null, 2), moment().add(1, "hour")); + const archiveUrl = archives.getUrl(getBaseUrl(pluginData), archiveId); + msg.channel.send(`Link: ${archiveUrl}`); + }, +}); +// diff --git a/backend/src/plugins/BotControl/commands/ListDashboardPermsCmd.ts b/backend/src/plugins/BotControl/commands/ListDashboardPermsCmd.ts index c75e520a0..2cfd7ae69 100644 --- a/backend/src/plugins/BotControl/commands/ListDashboardPermsCmd.ts +++ b/backend/src/plugins/BotControl/commands/ListDashboardPermsCmd.ts @@ -68,7 +68,7 @@ export const ListDashboardPermsCmd = botControlCmd({ finalMessage += `The server ${guildInfo} has the following assigned permissions:\n`; // Double \n for consistency with AddDashboardUserCmd for (const assignment of existingGuildAssignment) { - const user = await resolveUser(pluginData.client, assignment.target_id); + const user = await resolveUser(pluginData.client, assignment.target_id, "BotControl:ListDashboardPermsCmd"); finalMessage += `\n**${renderUsername(user)}**, \`${assignment.target_id}\`: ${assignment.permissions.join( ", ", )}`; diff --git a/backend/src/plugins/BotControl/commands/ListDashboardUsersCmd.ts b/backend/src/plugins/BotControl/commands/ListDashboardUsersCmd.ts index 59171660d..794ce1580 100644 --- a/backend/src/plugins/BotControl/commands/ListDashboardUsersCmd.ts +++ b/backend/src/plugins/BotControl/commands/ListDashboardUsersCmd.ts @@ -20,7 +20,7 @@ export const ListDashboardUsersCmd = botControlCmd({ const dashboardUsers = await pluginData.state.apiPermissionAssignments.getByGuildId(guild.id); const users = await Promise.all( dashboardUsers.map(async (perm) => ({ - user: await resolveUser(pluginData.client, perm.target_id), + user: await resolveUser(pluginData.client, perm.target_id, "BotControl:ListDashboardUsersCmd"), permission: perm, })), ); diff --git a/backend/src/plugins/BotControl/commands/ProfilerDataCmd.ts b/backend/src/plugins/BotControl/commands/ProfilerDataCmd.ts index c83c0d72e..6b61273d2 100644 --- a/backend/src/plugins/BotControl/commands/ProfilerDataCmd.ts +++ b/backend/src/plugins/BotControl/commands/ProfilerDataCmd.ts @@ -28,7 +28,7 @@ export const ProfilerDataCmd = botControlCmd({ const headerInfoItems = [`sorted by ${sortProps[sortProp]}`]; - const profilerData = pluginData.getKnubInstance().profiler.getData(); + const profilerData = pluginData.getVetyInstance().profiler.getData(); let entries = Object.entries(profilerData); entries.sort(sorter((entry) => entry[1][sortProp], "DESC")); diff --git a/backend/src/plugins/BotControl/commands/ReloadGlobalPluginsCmd.ts b/backend/src/plugins/BotControl/commands/ReloadGlobalPluginsCmd.ts index c95ea1ddc..08358ed87 100644 --- a/backend/src/plugins/BotControl/commands/ReloadGlobalPluginsCmd.ts +++ b/backend/src/plugins/BotControl/commands/ReloadGlobalPluginsCmd.ts @@ -21,6 +21,6 @@ export const ReloadGlobalPluginsCmd = botControlCmd({ setActiveReload(guildId, message.channel.id); await message.channel.send("Reloading global plugins..."); - pluginData.getKnubInstance().reloadGlobalContext(); + pluginData.getVetyInstance().reloadGlobalContext(); }, }); diff --git a/backend/src/plugins/BotControl/commands/ReloadServerCmd.ts b/backend/src/plugins/BotControl/commands/ReloadServerCmd.ts index b7c94bb33..3b5d45190 100644 --- a/backend/src/plugins/BotControl/commands/ReloadServerCmd.ts +++ b/backend/src/plugins/BotControl/commands/ReloadServerCmd.ts @@ -21,7 +21,7 @@ export const ReloadServerCmd = botControlCmd({ } try { - await pluginData.getKnubInstance().reloadGuild(args.guildId); + await pluginData.getVetyInstance().reloadGuild(args.guildId); } catch (e) { void msg.channel.send(`Failed to reload guild: ${e.message}`); return; diff --git a/backend/src/plugins/BotControl/commands/ServersCmd.ts b/backend/src/plugins/BotControl/commands/ServersCmd.ts index af7bfecaf..b51aa00cb 100644 --- a/backend/src/plugins/BotControl/commands/ServersCmd.ts +++ b/backend/src/plugins/BotControl/commands/ServersCmd.ts @@ -24,7 +24,7 @@ export const ServersCmd = botControlCmd({ const search = args.search ? new RegExp([...args.search].map((s) => escapeStringRegexp(s)).join(".*"), "i") : null; const joinedGuilds = Array.from(pluginData.client.guilds.cache.values()); - const loadedGuilds = pluginData.getKnubInstance().getLoadedGuilds(); + const loadedGuilds = pluginData.getVetyInstance().getLoadedGuilds(); const loadedGuildsMap = loadedGuilds.reduce((map, guildData) => map.set(guildData.guildId, guildData), new Map()); if (showList) { diff --git a/backend/src/plugins/BotControl/functions/isEligible.ts b/backend/src/plugins/BotControl/functions/isEligible.ts index ccc6689d0..536677d48 100644 --- a/backend/src/plugins/BotControl/functions/isEligible.ts +++ b/backend/src/plugins/BotControl/functions/isEligible.ts @@ -1,5 +1,5 @@ import { User } from "discord.js"; -import { GlobalPluginData } from "knub"; +import { GlobalPluginData } from "vety"; import { GuildInvite } from "../../../utils.js"; import { BotControlPluginType } from "../types.js"; diff --git a/backend/src/plugins/BotControl/types.ts b/backend/src/plugins/BotControl/types.ts index 2cdef3138..d6057881b 100644 --- a/backend/src/plugins/BotControl/types.ts +++ b/backend/src/plugins/BotControl/types.ts @@ -1,5 +1,5 @@ -import { BasePluginType, globalPluginEventListener, globalPluginMessageCommand } from "knub"; -import z from "zod/v4"; +import { BasePluginType, globalPluginEventListener, globalPluginMessageCommand } from "vety"; +import { z } from "zod"; import { AllowedGuilds } from "../../data/AllowedGuilds.js"; import { ApiPermissionAssignments } from "../../data/ApiPermissionAssignments.js"; import { Configs } from "../../data/Configs.js"; diff --git a/backend/src/plugins/Cases/CasesPlugin.ts b/backend/src/plugins/Cases/CasesPlugin.ts index 2b97246c3..7601200cd 100644 --- a/backend/src/plugins/Cases/CasesPlugin.ts +++ b/backend/src/plugins/Cases/CasesPlugin.ts @@ -1,4 +1,4 @@ -import { guildPlugin } from "knub"; +import { guildPlugin } from "vety"; import { GuildArchives } from "../../data/GuildArchives.js"; import { GuildCases } from "../../data/GuildCases.js"; import { GuildLogs } from "../../data/GuildLogs.js"; diff --git a/backend/src/plugins/Cases/functions/createCase.ts b/backend/src/plugins/Cases/functions/createCase.ts index b10a71a0d..2a5101a10 100644 --- a/backend/src/plugins/Cases/functions/createCase.ts +++ b/backend/src/plugins/Cases/functions/createCase.ts @@ -1,5 +1,5 @@ import type { Snowflake } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { logger } from "../../../logger.js"; import { renderUsername, resolveUser } from "../../../utils.js"; import { CaseArgs, CasesPluginType } from "../types.js"; @@ -7,16 +7,16 @@ import { createCaseNote } from "./createCaseNote.js"; import { postCaseToCaseLogChannel } from "./postToCaseLogChannel.js"; export async function createCase(pluginData: GuildPluginData, args: CaseArgs) { - const user = await resolveUser(pluginData.client, args.userId); + const user = await resolveUser(pluginData.client, args.userId, "Cases:createCase"); const name = renderUsername(user); - const mod = await resolveUser(pluginData.client, args.modId); + const mod = await resolveUser(pluginData.client, args.modId, "Cases:createCase"); const modName = renderUsername(mod); let ppName: string | null = null; let ppId: Snowflake | null = null; if (args.ppId) { - const pp = await resolveUser(pluginData.client, args.ppId); + const pp = await resolveUser(pluginData.client, args.ppId, "Cases:createCase"); ppName = renderUsername(pp); ppId = pp.id; } diff --git a/backend/src/plugins/Cases/functions/createCaseNote.ts b/backend/src/plugins/Cases/functions/createCaseNote.ts index 635c1b5eb..58201b072 100644 --- a/backend/src/plugins/Cases/functions/createCaseNote.ts +++ b/backend/src/plugins/Cases/functions/createCaseNote.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { ERRORS, RecoverablePluginError } from "../../../RecoverablePluginError.js"; import { UnknownUser, renderUsername, resolveUser } from "../../../utils.js"; import { CaseNoteArgs, CasesPluginType } from "../types.js"; @@ -11,7 +11,7 @@ export async function createCaseNote(pluginData: GuildPluginData; -const caseColorsTypeMap = caseKeys.reduce((map, key) => { - map[key] = zColor; - return map; -}, {} as Record); +const caseColorsTypeMap = caseKeys.reduce( + (map, key) => { + map[key] = zColor; + return map; + }, + {} as Record<(typeof caseKeys)[number], typeof zColor>, +); -const caseIconsTypeMap = caseKeys.reduce((map, key) => { - map[key] = zBoundedCharacters(0, 100); - return map; -}, {} as Record); +const caseIconsTypeMap = caseKeys.reduce( + (map, key) => { + map[key] = zBoundedCharacters(0, 100); + return map; + }, + {} as Record<(typeof caseKeys)[number], z.ZodString>, +); export const zCasesConfig = z.strictObject({ log_automatic_actions: z.boolean().default(true), diff --git a/backend/src/plugins/Censor/CensorPlugin.ts b/backend/src/plugins/Censor/CensorPlugin.ts index ad91b27e3..114032a39 100644 --- a/backend/src/plugins/Censor/CensorPlugin.ts +++ b/backend/src/plugins/Censor/CensorPlugin.ts @@ -1,4 +1,4 @@ -import { PluginOverride, guildPlugin } from "knub"; +import { PluginOverride, guildPlugin } from "vety"; import { GuildLogs } from "../../data/GuildLogs.js"; import { GuildSavedMessages } from "../../data/GuildSavedMessages.js"; import { discardRegExpRunner, getRegExpRunner } from "../../regExpRunners.js"; diff --git a/backend/src/plugins/Censor/types.ts b/backend/src/plugins/Censor/types.ts index 9e36f316a..97954c94d 100644 --- a/backend/src/plugins/Censor/types.ts +++ b/backend/src/plugins/Censor/types.ts @@ -1,5 +1,5 @@ -import { BasePluginType } from "knub"; -import z from "zod/v4"; +import { BasePluginType } from "vety"; +import { z } from "zod"; import { RegExpRunner } from "../../RegExpRunner.js"; import { GuildLogs } from "../../data/GuildLogs.js"; import { GuildSavedMessages } from "../../data/GuildSavedMessages.js"; diff --git a/backend/src/plugins/Censor/util/applyFiltersToMsg.ts b/backend/src/plugins/Censor/util/applyFiltersToMsg.ts index 641ba7ed4..5657c724a 100644 --- a/backend/src/plugins/Censor/util/applyFiltersToMsg.ts +++ b/backend/src/plugins/Censor/util/applyFiltersToMsg.ts @@ -1,6 +1,6 @@ import { Invite } from "discord.js"; import escapeStringRegexp from "escape-string-regexp"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { allowTimeout } from "../../../RegExpRunner.js"; import { ZalgoRegex } from "../../../data/Zalgo.js"; import { ISavedMessageEmbedData, SavedMessage } from "../../../data/entities/SavedMessage.js"; diff --git a/backend/src/plugins/Censor/util/censorMessage.ts b/backend/src/plugins/Censor/util/censorMessage.ts index 653086723..581137b13 100644 --- a/backend/src/plugins/Censor/util/censorMessage.ts +++ b/backend/src/plugins/Censor/util/censorMessage.ts @@ -1,5 +1,5 @@ import { GuildTextBasedChannel, Snowflake } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { SavedMessage } from "../../../data/entities/SavedMessage.js"; import { resolveUser } from "../../../utils.js"; @@ -20,7 +20,7 @@ export async function censorMessage( return; } - const user = await resolveUser(pluginData.client, savedMessage.user_id); + const user = await resolveUser(pluginData.client, savedMessage.user_id, "Censor:censorMessage"); const channel = pluginData.guild.channels.resolve(savedMessage.channel_id as Snowflake)! as GuildTextBasedChannel; pluginData.getPlugin(LogsPlugin).logCensor({ diff --git a/backend/src/plugins/Censor/util/onMessageCreate.ts b/backend/src/plugins/Censor/util/onMessageCreate.ts index fa1c32129..99a8d401a 100644 --- a/backend/src/plugins/Censor/util/onMessageCreate.ts +++ b/backend/src/plugins/Censor/util/onMessageCreate.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { SavedMessage } from "../../../data/entities/SavedMessage.js"; import { messageLock } from "../../../utils/lockNameHelpers.js"; import { CensorPluginType } from "../types.js"; diff --git a/backend/src/plugins/Censor/util/onMessageUpdate.ts b/backend/src/plugins/Censor/util/onMessageUpdate.ts index 5e927c7d6..e814435dc 100644 --- a/backend/src/plugins/Censor/util/onMessageUpdate.ts +++ b/backend/src/plugins/Censor/util/onMessageUpdate.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { SavedMessage } from "../../../data/entities/SavedMessage.js"; import { messageLock } from "../../../utils/lockNameHelpers.js"; import { CensorPluginType } from "../types.js"; diff --git a/backend/src/plugins/ChannelArchiver/ChannelArchiverPlugin.ts b/backend/src/plugins/ChannelArchiver/ChannelArchiverPlugin.ts index 3dc5c0498..3ba270970 100644 --- a/backend/src/plugins/ChannelArchiver/ChannelArchiverPlugin.ts +++ b/backend/src/plugins/ChannelArchiver/ChannelArchiverPlugin.ts @@ -1,4 +1,4 @@ -import { guildPlugin } from "knub"; +import { guildPlugin } from "vety"; import { CommonPlugin } from "../Common/CommonPlugin.js"; import { TimeAndDatePlugin } from "../TimeAndDate/TimeAndDatePlugin.js"; import { ArchiveChannelCmd } from "./commands/ArchiveChannelCmd.js"; diff --git a/backend/src/plugins/ChannelArchiver/types.ts b/backend/src/plugins/ChannelArchiver/types.ts index 440b2f808..6b0217b9c 100644 --- a/backend/src/plugins/ChannelArchiver/types.ts +++ b/backend/src/plugins/ChannelArchiver/types.ts @@ -1,5 +1,5 @@ -import { BasePluginType, guildPluginMessageCommand, pluginUtils } from "knub"; -import { z } from "zod/v4"; +import { BasePluginType, guildPluginMessageCommand, pluginUtils } from "vety"; +import { z } from "zod"; import { CommonPlugin } from "../Common/CommonPlugin.js"; export const zChannelArchiverPluginConfig = z.strictObject({}); diff --git a/backend/src/plugins/CommandAliases/CommandAliasesPlugin.ts b/backend/src/plugins/CommandAliases/CommandAliasesPlugin.ts new file mode 100644 index 000000000..b86c7bb8b --- /dev/null +++ b/backend/src/plugins/CommandAliases/CommandAliasesPlugin.ts @@ -0,0 +1,21 @@ +import { guildPlugin } from "vety"; +import { DispatchAliasEvt } from "./events/DispatchAliasEvt.js"; +import { CommandAliasesPluginType, zCommandAliasesConfig } from "./types.js"; +import { normalizeAliases } from "./functions/normalizeAliases.js"; +import { buildAliasMatchers } from "./functions/buildAliasMatchers.js"; +import { getGuildPrefix } from "../../utils/getGuildPrefix.js"; + +export const CommandAliasesPlugin = guildPlugin()({ + name: "command_aliases", + configSchema: zCommandAliasesConfig, + + beforeLoad(pluginData) { + const prefix = getGuildPrefix(pluginData); + const config = pluginData.config.get(); + const normalizedAliases = normalizeAliases(config.aliases); + + pluginData.state.matchers = buildAliasMatchers(prefix, normalizedAliases); + }, + + events: [DispatchAliasEvt], +}); diff --git a/backend/src/plugins/CommandAliases/docs.ts b/backend/src/plugins/CommandAliases/docs.ts new file mode 100644 index 000000000..85a796cab --- /dev/null +++ b/backend/src/plugins/CommandAliases/docs.ts @@ -0,0 +1,31 @@ +import { ZeppelinPluginDocs } from "../../types.js"; +import { zCommandAliasesConfig } from "./types.js"; + +export const commandAliasesPluginDocs: ZeppelinPluginDocs = { + type: "stable", + prettyName: "Command Aliases", + configSchema: zCommandAliasesConfig, + description: "This plugin lets you create shortcuts for existing commands.", + usageGuide: ` +For example, you can make \`!b\` work the same as \`!ban\`, or \`!c\` work the same as \`!cases\`. + +### Example + +\`\`\`yaml +plugins: + command_aliases: + config: + aliases: + "b": "ban" + "c": "cases" + "b2": "ban -d 2" + "ownerinfo": "info 754421392988045383" +\`\`\` + +With this setup: +- \`!b @User\` runs \`!ban @User\` +- \`!c\` runs \`!cases\` +- \`!b2 @User\` runs \`!ban -d 2 @User\` +- \`!ownerinfo\` runs \`!info 754421392988045383\` + ` +}; diff --git a/backend/src/plugins/CommandAliases/events/DispatchAliasEvt.ts b/backend/src/plugins/CommandAliases/events/DispatchAliasEvt.ts new file mode 100644 index 000000000..4b4c8c2dc --- /dev/null +++ b/backend/src/plugins/CommandAliases/events/DispatchAliasEvt.ts @@ -0,0 +1,24 @@ +import { Message } from "discord.js"; +import { commandAliasesEvt } from "../types.js"; + +export const DispatchAliasEvt = commandAliasesEvt({ + event: "messageCreate", + async listener({ args: { message: msg }, pluginData }) { + if (!msg.guild || !msg.content) return; + if (msg.author.bot || msg.webhookId) return; + + const matchers = pluginData.state.matchers ?? []; + if (matchers.length === 0) return; + + const matchingAlias = matchers.find((matcher) => matcher.regex.test(msg.content)); + if (!matchingAlias) return; + + const newContent = msg.content.replace(matchingAlias.regex, matchingAlias.replacement); + if (newContent === msg.content) return; + + const copiedMessage = Object.create(msg); + copiedMessage.content = newContent; + + await pluginData.getVetyInstance().dispatchMessageCommands(copiedMessage as Message); + }, +}); diff --git a/backend/src/plugins/CommandAliases/functions/buildAliasMatchers.ts b/backend/src/plugins/CommandAliases/functions/buildAliasMatchers.ts new file mode 100644 index 000000000..ac6bdce8c --- /dev/null +++ b/backend/src/plugins/CommandAliases/functions/buildAliasMatchers.ts @@ -0,0 +1,17 @@ +import escapeStringRegexp from "escape-string-regexp"; +import { NormalizedAlias } from "./normalizeAliases.js"; + +export interface AliasMatcher { + regex: RegExp; + replacement: string; +} + +export function buildAliasMatchers(prefix: string, aliases: NormalizedAlias[]): AliasMatcher[] { + return aliases.map((alias) => { + const pattern = `^${escapeStringRegexp(prefix)}${escapeStringRegexp(alias.alias)}\\b`; + return { + regex: new RegExp(pattern, "i"), + replacement: `${prefix}${alias.target}`, + }; + }); +} diff --git a/backend/src/plugins/CommandAliases/functions/normalizeAliases.ts b/backend/src/plugins/CommandAliases/functions/normalizeAliases.ts new file mode 100644 index 000000000..a65babd85 --- /dev/null +++ b/backend/src/plugins/CommandAliases/functions/normalizeAliases.ts @@ -0,0 +1,27 @@ +export interface NormalizedAlias { + alias: string; + target: string; +} + +export function normalizeAliases(aliases: Record | undefined | null): NormalizedAlias[] { + if (!aliases) { + return []; + } + + const normalized: NormalizedAlias[] = []; + for (const [rawAlias, rawTarget] of Object.entries(aliases)) { + const alias = rawAlias.trim(); + const target = rawTarget.trim(); + + if (!alias || !target) { + continue; + } + + normalized.push({ + alias, + target, + }); + } + + return normalized; +} diff --git a/backend/src/plugins/CommandAliases/types.ts b/backend/src/plugins/CommandAliases/types.ts new file mode 100644 index 000000000..7c00aec9e --- /dev/null +++ b/backend/src/plugins/CommandAliases/types.ts @@ -0,0 +1,16 @@ +import { BasePluginType, guildPluginEventListener } from "vety"; +import z from "zod"; +import { AliasMatcher } from "./functions/buildAliasMatchers.js"; + +export const zCommandAliasesConfig = z.strictObject({ + aliases: z.record(z.string().min(1), z.string().min(1)).optional(), +}); + +export interface CommandAliasesPluginType extends BasePluginType { + configSchema: typeof zCommandAliasesConfig; + state: { + matchers: AliasMatcher[]; + }; +} + +export const commandAliasesEvt = guildPluginEventListener(); diff --git a/backend/src/plugins/Common/CommonPlugin.ts b/backend/src/plugins/Common/CommonPlugin.ts index 7e57fc291..660595f86 100644 --- a/backend/src/plugins/Common/CommonPlugin.ts +++ b/backend/src/plugins/Common/CommonPlugin.ts @@ -1,5 +1,5 @@ import { Attachment, MessageMentionOptions, SendableChannels, TextBasedChannel } from "discord.js"; -import { guildPlugin } from "knub"; +import { guildPlugin } from "vety"; import { GenericCommandSource, makePublicFn, sendContextResponse } from "../../pluginUtils.js"; import { errorMessage, successMessage } from "../../utils.js"; import { getErrorEmoji, getSuccessEmoji } from "./functions/getEmoji.js"; @@ -49,7 +49,7 @@ export const CommonPlugin = guildPlugin()({ storeAttachmentsAsMessage: async (attachments: Attachment[], backupChannel?: TextBasedChannel | null) => { const attachmentChannelId = pluginData.config.get().attachment_storing_channel; const channel = attachmentChannelId - ? (pluginData.guild.channels.cache.get(attachmentChannelId) as TextBasedChannel) ?? backupChannel + ? ((pluginData.guild.channels.cache.get(attachmentChannelId) as TextBasedChannel) ?? backupChannel) : backupChannel; if (!channel) { diff --git a/backend/src/plugins/Common/functions/getEmoji.ts b/backend/src/plugins/Common/functions/getEmoji.ts index 336146066..2c3210b66 100644 --- a/backend/src/plugins/Common/functions/getEmoji.ts +++ b/backend/src/plugins/Common/functions/getEmoji.ts @@ -1,6 +1,6 @@ -import { GuildPluginData } from "knub"; -import { CommonPluginType } from "../types.js"; +import { GuildPluginData } from "vety"; import { env } from "../../../env.js"; +import { CommonPluginType } from "../types.js"; export function getSuccessEmoji(pluginData: GuildPluginData) { return pluginData.config.get().success_emoji ?? env.DEFAULT_SUCCESS_EMOJI; diff --git a/backend/src/plugins/Common/types.ts b/backend/src/plugins/Common/types.ts index 9a3978641..aa63a0a6f 100644 --- a/backend/src/plugins/Common/types.ts +++ b/backend/src/plugins/Common/types.ts @@ -1,5 +1,5 @@ -import { BasePluginType } from "knub"; -import z from "zod/v4"; +import { BasePluginType } from "vety"; +import { z } from "zod"; export const zCommonConfig = z.strictObject({ success_emoji: z.string().nullable().default(null), diff --git a/backend/src/plugins/CompanionChannels/CompanionChannelsPlugin.ts b/backend/src/plugins/CompanionChannels/CompanionChannelsPlugin.ts index 1dee4fae5..01ba82344 100644 --- a/backend/src/plugins/CompanionChannels/CompanionChannelsPlugin.ts +++ b/backend/src/plugins/CompanionChannels/CompanionChannelsPlugin.ts @@ -1,4 +1,4 @@ -import { CooldownManager, guildPlugin } from "knub"; +import { CooldownManager, guildPlugin } from "vety"; import { GuildLogs } from "../../data/GuildLogs.js"; import { LogsPlugin } from "../Logs/LogsPlugin.js"; import { VoiceStateUpdateEvt } from "./events/VoiceStateUpdateEvt.js"; diff --git a/backend/src/plugins/CompanionChannels/functions/getCompanionChannelOptsForVoiceChannelId.ts b/backend/src/plugins/CompanionChannels/functions/getCompanionChannelOptsForVoiceChannelId.ts index 3f4e9972f..1dcc42cf9 100644 --- a/backend/src/plugins/CompanionChannels/functions/getCompanionChannelOptsForVoiceChannelId.ts +++ b/backend/src/plugins/CompanionChannels/functions/getCompanionChannelOptsForVoiceChannelId.ts @@ -1,5 +1,5 @@ import { StageChannel, VoiceChannel } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { CompanionChannelsPluginType, TCompanionChannelOpts } from "../types.js"; const defaultCompanionChannelOpts: Partial = { diff --git a/backend/src/plugins/CompanionChannels/functions/handleCompanionPermissions.ts b/backend/src/plugins/CompanionChannels/functions/handleCompanionPermissions.ts index 3e4f08893..3ca0856e2 100644 --- a/backend/src/plugins/CompanionChannels/functions/handleCompanionPermissions.ts +++ b/backend/src/plugins/CompanionChannels/functions/handleCompanionPermissions.ts @@ -1,5 +1,5 @@ import { PermissionsBitField, Snowflake, StageChannel, TextChannel, VoiceChannel } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { MINUTES, isDiscordAPIError } from "../../../utils.js"; import { filterObject } from "../../../utils/filterObject.js"; diff --git a/backend/src/plugins/CompanionChannels/types.ts b/backend/src/plugins/CompanionChannels/types.ts index 6f0bc12f4..081631549 100644 --- a/backend/src/plugins/CompanionChannels/types.ts +++ b/backend/src/plugins/CompanionChannels/types.ts @@ -1,5 +1,5 @@ -import { BasePluginType, CooldownManager, guildPluginEventListener } from "knub"; -import z from "zod/v4"; +import { BasePluginType, CooldownManager, guildPluginEventListener } from "vety"; +import { z } from "zod"; import { GuildLogs } from "../../data/GuildLogs.js"; import { zBoundedCharacters, zSnowflake } from "../../utils.js"; diff --git a/backend/src/plugins/ContextMenus/ContextMenuPlugin.ts b/backend/src/plugins/ContextMenus/ContextMenuPlugin.ts index e4d33a781..e6f8e1d29 100644 --- a/backend/src/plugins/ContextMenus/ContextMenuPlugin.ts +++ b/backend/src/plugins/ContextMenus/ContextMenuPlugin.ts @@ -1,4 +1,4 @@ -import { PluginOverride, guildPlugin } from "knub"; +import { PluginOverride, guildPlugin } from "vety"; import { GuildCases } from "../../data/GuildCases.js"; import { CasesPlugin } from "../Cases/CasesPlugin.js"; import { LogsPlugin } from "../Logs/LogsPlugin.js"; diff --git a/backend/src/plugins/ContextMenus/actions/ban.ts b/backend/src/plugins/ContextMenus/actions/ban.ts index 3a3e282e0..4aa0f464c 100644 --- a/backend/src/plugins/ContextMenus/actions/ban.ts +++ b/backend/src/plugins/ContextMenus/actions/ban.ts @@ -7,7 +7,7 @@ import { TextInputBuilder, TextInputStyle, } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { humanizeDuration } from "../../../humanizeDuration.js"; import { logger } from "../../../logger.js"; import { canActOn } from "../../../pluginUtils.js"; diff --git a/backend/src/plugins/ContextMenus/actions/clean.ts b/backend/src/plugins/ContextMenus/actions/clean.ts index 69f17336a..b3530e481 100644 --- a/backend/src/plugins/ContextMenus/actions/clean.ts +++ b/backend/src/plugins/ContextMenus/actions/clean.ts @@ -7,7 +7,7 @@ import { TextInputBuilder, TextInputStyle, } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { logger } from "../../../logger.js"; import { UtilityPlugin } from "../../../plugins/Utility/UtilityPlugin.js"; import { MODAL_TIMEOUT } from "../commands/ModMenuUserCtxCmd.js"; diff --git a/backend/src/plugins/ContextMenus/actions/mute.ts b/backend/src/plugins/ContextMenus/actions/mute.ts index e2901e6e2..31c5718c5 100644 --- a/backend/src/plugins/ContextMenus/actions/mute.ts +++ b/backend/src/plugins/ContextMenus/actions/mute.ts @@ -7,7 +7,7 @@ import { TextInputBuilder, TextInputStyle, } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { ERRORS, RecoverablePluginError } from "../../../RecoverablePluginError.js"; import { humanizeDuration } from "../../../humanizeDuration.js"; import { logger } from "../../../logger.js"; diff --git a/backend/src/plugins/ContextMenus/actions/note.ts b/backend/src/plugins/ContextMenus/actions/note.ts index 566d44ade..9423291e1 100644 --- a/backend/src/plugins/ContextMenus/actions/note.ts +++ b/backend/src/plugins/ContextMenus/actions/note.ts @@ -7,7 +7,7 @@ import { TextInputBuilder, TextInputStyle, } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { CaseTypes } from "../../../data/CaseTypes.js"; import { logger } from "../../../logger.js"; import { canActOn } from "../../../pluginUtils.js"; diff --git a/backend/src/plugins/ContextMenus/actions/update.ts b/backend/src/plugins/ContextMenus/actions/update.ts index 841b406b8..a8cb1b354 100644 --- a/backend/src/plugins/ContextMenus/actions/update.ts +++ b/backend/src/plugins/ContextMenus/actions/update.ts @@ -1,5 +1,5 @@ import { GuildMember } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { CaseTypes } from "../../../data/CaseTypes.js"; import { Case } from "../../../data/entities/Case.js"; import { CasesPlugin } from "../../Cases/CasesPlugin.js"; diff --git a/backend/src/plugins/ContextMenus/actions/warn.ts b/backend/src/plugins/ContextMenus/actions/warn.ts index e0e34707c..8bc6f92c7 100644 --- a/backend/src/plugins/ContextMenus/actions/warn.ts +++ b/backend/src/plugins/ContextMenus/actions/warn.ts @@ -7,7 +7,7 @@ import { TextInputBuilder, TextInputStyle, } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { logger } from "../../../logger.js"; import { canActOn } from "../../../pluginUtils.js"; import { renderUserUsername } from "../../../utils.js"; diff --git a/backend/src/plugins/ContextMenus/commands/BanUserCtxCmd.ts b/backend/src/plugins/ContextMenus/commands/BanUserCtxCmd.ts index dfff9088f..40c9ce4b8 100644 --- a/backend/src/plugins/ContextMenus/commands/BanUserCtxCmd.ts +++ b/backend/src/plugins/ContextMenus/commands/BanUserCtxCmd.ts @@ -1,5 +1,5 @@ import { PermissionFlagsBits } from "discord.js"; -import { guildPluginUserContextMenuCommand } from "knub"; +import { guildPluginUserContextMenuCommand } from "vety"; import { launchBanActionModal } from "../actions/ban.js"; export const BanCmd = guildPluginUserContextMenuCommand({ diff --git a/backend/src/plugins/ContextMenus/commands/CleanMessageCtxCmd.ts b/backend/src/plugins/ContextMenus/commands/CleanMessageCtxCmd.ts index 83508ae31..688525bd9 100644 --- a/backend/src/plugins/ContextMenus/commands/CleanMessageCtxCmd.ts +++ b/backend/src/plugins/ContextMenus/commands/CleanMessageCtxCmd.ts @@ -1,5 +1,5 @@ import { PermissionFlagsBits } from "discord.js"; -import { guildPluginMessageContextMenuCommand } from "knub"; +import { guildPluginMessageContextMenuCommand } from "vety"; import { launchCleanActionModal } from "../actions/clean.js"; export const CleanCmd = guildPluginMessageContextMenuCommand({ diff --git a/backend/src/plugins/ContextMenus/commands/ModMenuUserCtxCmd.ts b/backend/src/plugins/ContextMenus/commands/ModMenuUserCtxCmd.ts index e3091ca86..a5f2852f3 100644 --- a/backend/src/plugins/ContextMenus/commands/ModMenuUserCtxCmd.ts +++ b/backend/src/plugins/ContextMenus/commands/ModMenuUserCtxCmd.ts @@ -9,7 +9,7 @@ import { PermissionFlagsBits, User, } from "discord.js"; -import { GuildPluginData, guildPluginUserContextMenuCommand } from "knub"; +import { GuildPluginData, guildPluginUserContextMenuCommand } from "vety"; import { Case } from "../../../data/entities/Case.js"; import { logger } from "../../../logger.js"; import { SECONDS, UnknownUser, emptyEmbedValue, renderUserUsername, resolveUser, trimLines } from "../../../utils.js"; @@ -52,7 +52,7 @@ export const ModMenuCmd = guildPluginUserContextMenuCommand({ return; } - const user = await resolveUser(pluginData.client, interaction.targetId); + const user = await resolveUser(pluginData.client, interaction.targetId, "ContextMenus:ModMenuCmd"); if (!user.id) { await interaction.followUp("Error: User not found"); return; diff --git a/backend/src/plugins/ContextMenus/commands/MuteUserCtxCmd.ts b/backend/src/plugins/ContextMenus/commands/MuteUserCtxCmd.ts index 559f6e706..795c5c12b 100644 --- a/backend/src/plugins/ContextMenus/commands/MuteUserCtxCmd.ts +++ b/backend/src/plugins/ContextMenus/commands/MuteUserCtxCmd.ts @@ -1,5 +1,5 @@ import { PermissionFlagsBits } from "discord.js"; -import { guildPluginUserContextMenuCommand } from "knub"; +import { guildPluginUserContextMenuCommand } from "vety"; import { launchMuteActionModal } from "../actions/mute.js"; export const MuteCmd = guildPluginUserContextMenuCommand({ diff --git a/backend/src/plugins/ContextMenus/commands/NoteUserCtxCmd.ts b/backend/src/plugins/ContextMenus/commands/NoteUserCtxCmd.ts index 0e3807f36..5aebcd845 100644 --- a/backend/src/plugins/ContextMenus/commands/NoteUserCtxCmd.ts +++ b/backend/src/plugins/ContextMenus/commands/NoteUserCtxCmd.ts @@ -1,5 +1,5 @@ import { PermissionFlagsBits } from "discord.js"; -import { guildPluginUserContextMenuCommand } from "knub"; +import { guildPluginUserContextMenuCommand } from "vety"; import { launchNoteActionModal } from "../actions/note.js"; export const NoteCmd = guildPluginUserContextMenuCommand({ diff --git a/backend/src/plugins/ContextMenus/commands/WarnUserCtxCmd.ts b/backend/src/plugins/ContextMenus/commands/WarnUserCtxCmd.ts index 4721544a0..8735b2296 100644 --- a/backend/src/plugins/ContextMenus/commands/WarnUserCtxCmd.ts +++ b/backend/src/plugins/ContextMenus/commands/WarnUserCtxCmd.ts @@ -1,5 +1,5 @@ import { PermissionFlagsBits } from "discord.js"; -import { guildPluginUserContextMenuCommand } from "knub"; +import { guildPluginUserContextMenuCommand } from "vety"; import { launchWarnActionModal } from "../actions/warn.js"; export const WarnCmd = guildPluginUserContextMenuCommand({ diff --git a/backend/src/plugins/ContextMenus/types.ts b/backend/src/plugins/ContextMenus/types.ts index 80c56dd13..529e5fa29 100644 --- a/backend/src/plugins/ContextMenus/types.ts +++ b/backend/src/plugins/ContextMenus/types.ts @@ -1,6 +1,6 @@ import { APIEmbed, Awaitable } from "discord.js"; -import { BasePluginType } from "knub"; -import z from "zod/v4"; +import { BasePluginType } from "vety"; +import { z } from "zod"; import { GuildCases } from "../../data/GuildCases.js"; export const zContextMenusConfig = z.strictObject({ diff --git a/backend/src/plugins/Counters/CountersPlugin.ts b/backend/src/plugins/Counters/CountersPlugin.ts index 63c967e68..a28c3eca1 100644 --- a/backend/src/plugins/Counters/CountersPlugin.ts +++ b/backend/src/plugins/Counters/CountersPlugin.ts @@ -1,5 +1,5 @@ import { EventEmitter } from "events"; -import { PluginOverride, guildPlugin } from "knub"; +import { PluginOverride, guildPlugin } from "vety"; import { GuildCounters } from "../../data/GuildCounters.js"; import { CounterTrigger, diff --git a/backend/src/plugins/Counters/commands/AddCounterCmd.ts b/backend/src/plugins/Counters/commands/AddCounterCmd.ts index 6ef3ec579..060fa568f 100644 --- a/backend/src/plugins/Counters/commands/AddCounterCmd.ts +++ b/backend/src/plugins/Counters/commands/AddCounterCmd.ts @@ -1,6 +1,6 @@ import { Snowflake, TextChannel } from "discord.js"; -import { guildPluginMessageCommand } from "knub"; -import { waitForReply } from "knub/helpers"; +import { guildPluginMessageCommand } from "vety"; +import { waitForReply } from "vety/helpers"; import { commandTypeHelpers as ct } from "../../../commandTypes.js"; import { UnknownUser, resolveUser } from "../../../utils.js"; import { changeCounterValue } from "../functions/changeCounterValue.js"; @@ -90,7 +90,7 @@ export const AddCounterCmd = guildPluginMessageCommand()({ return; } - const potentialUser = await resolveUser(pluginData.client, reply.content); + const potentialUser = await resolveUser(pluginData.client, reply.content, "Counters:AddCounterCmd"); if (!potentialUser || potentialUser instanceof UnknownUser) { void pluginData.state.common.sendErrorMessage(message, "Unknown user, cancelling"); return; diff --git a/backend/src/plugins/Counters/commands/CountersListCmd.ts b/backend/src/plugins/Counters/commands/CountersListCmd.ts index ece207270..487823185 100644 --- a/backend/src/plugins/Counters/commands/CountersListCmd.ts +++ b/backend/src/plugins/Counters/commands/CountersListCmd.ts @@ -1,4 +1,4 @@ -import { guildPluginMessageCommand } from "knub"; +import { guildPluginMessageCommand } from "vety"; import { trimMultilineString, ucfirst } from "../../../utils.js"; import { getGuildPrefix } from "../../../utils/getGuildPrefix.js"; import { CountersPluginType } from "../types.js"; diff --git a/backend/src/plugins/Counters/commands/ResetAllCounterValuesCmd.ts b/backend/src/plugins/Counters/commands/ResetAllCounterValuesCmd.ts index 732b41bb9..7a9798c76 100644 --- a/backend/src/plugins/Counters/commands/ResetAllCounterValuesCmd.ts +++ b/backend/src/plugins/Counters/commands/ResetAllCounterValuesCmd.ts @@ -1,4 +1,4 @@ -import { guildPluginMessageCommand } from "knub"; +import { guildPluginMessageCommand } from "vety"; import { commandTypeHelpers as ct } from "../../../commandTypes.js"; import { confirm, noop, trimMultilineString } from "../../../utils.js"; import { resetAllCounterValues } from "../functions/resetAllCounterValues.js"; @@ -53,6 +53,6 @@ export const ResetAllCounterValuesCmd = guildPluginMessageCommand()({ return; } - const potentialUser = await resolveUser(pluginData.client, reply.content); + const potentialUser = await resolveUser(pluginData.client, reply.content, "Counters:ResetCounterCmd"); if (!potentialUser || potentialUser instanceof UnknownUser) { void pluginData.state.common.sendErrorMessage(message, "Unknown user, cancelling"); return; diff --git a/backend/src/plugins/Counters/commands/SetCounterCmd.ts b/backend/src/plugins/Counters/commands/SetCounterCmd.ts index 21243341f..8b346efcc 100644 --- a/backend/src/plugins/Counters/commands/SetCounterCmd.ts +++ b/backend/src/plugins/Counters/commands/SetCounterCmd.ts @@ -1,6 +1,6 @@ import { Snowflake, TextChannel } from "discord.js"; -import { guildPluginMessageCommand } from "knub"; -import { waitForReply } from "knub/helpers"; +import { guildPluginMessageCommand } from "vety"; +import { waitForReply } from "vety/helpers"; import { commandTypeHelpers as ct } from "../../../commandTypes.js"; import { UnknownUser, resolveUser } from "../../../utils.js"; import { setCounterValue } from "../functions/setCounterValue.js"; @@ -90,7 +90,7 @@ export const SetCounterCmd = guildPluginMessageCommand()({ return; } - const potentialUser = await resolveUser(pluginData.client, reply.content); + const potentialUser = await resolveUser(pluginData.client, reply.content, "Counters:SetCounterCmd"); if (!potentialUser || potentialUser instanceof UnknownUser) { void pluginData.state.common.sendErrorMessage(message, "Unknown user, cancelling"); return; diff --git a/backend/src/plugins/Counters/commands/ViewCounterCmd.ts b/backend/src/plugins/Counters/commands/ViewCounterCmd.ts index d49e5ff8f..27e83fd8a 100644 --- a/backend/src/plugins/Counters/commands/ViewCounterCmd.ts +++ b/backend/src/plugins/Counters/commands/ViewCounterCmd.ts @@ -1,6 +1,6 @@ import { Snowflake } from "discord.js"; -import { guildPluginMessageCommand } from "knub"; -import { waitForReply } from "knub/helpers"; +import { guildPluginMessageCommand } from "vety"; +import { waitForReply } from "vety/helpers"; import { commandTypeHelpers as ct } from "../../../commandTypes.js"; import { resolveUser, UnknownUser } from "../../../utils.js"; import { CountersPluginType } from "../types.js"; @@ -84,7 +84,7 @@ export const ViewCounterCmd = guildPluginMessageCommand()({ return; } - const potentialUser = await resolveUser(pluginData.client, reply.content); + const potentialUser = await resolveUser(pluginData.client, reply.content, "Counters:ViewCounterCmd"); if (!potentialUser || potentialUser instanceof UnknownUser) { void pluginData.state.common.sendErrorMessage(message, "Unknown user, cancelling"); return; diff --git a/backend/src/plugins/Counters/functions/changeCounterValue.ts b/backend/src/plugins/Counters/functions/changeCounterValue.ts index 6892ce651..233297e92 100644 --- a/backend/src/plugins/Counters/functions/changeCounterValue.ts +++ b/backend/src/plugins/Counters/functions/changeCounterValue.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { counterIdLock } from "../../../utils/lockNameHelpers.js"; import { CountersPluginType } from "../types.js"; import { checkCounterTrigger } from "./checkCounterTrigger.js"; diff --git a/backend/src/plugins/Counters/functions/checkAllValuesForReverseTrigger.ts b/backend/src/plugins/Counters/functions/checkAllValuesForReverseTrigger.ts index 8772e2253..f972200f4 100644 --- a/backend/src/plugins/Counters/functions/checkAllValuesForReverseTrigger.ts +++ b/backend/src/plugins/Counters/functions/checkAllValuesForReverseTrigger.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { CounterTrigger } from "../../../data/entities/CounterTrigger.js"; import { CountersPluginType } from "../types.js"; import { emitCounterEvent } from "./emitCounterEvent.js"; diff --git a/backend/src/plugins/Counters/functions/checkAllValuesForTrigger.ts b/backend/src/plugins/Counters/functions/checkAllValuesForTrigger.ts index dedc64899..e9fecd690 100644 --- a/backend/src/plugins/Counters/functions/checkAllValuesForTrigger.ts +++ b/backend/src/plugins/Counters/functions/checkAllValuesForTrigger.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { CounterTrigger } from "../../../data/entities/CounterTrigger.js"; import { CountersPluginType } from "../types.js"; import { emitCounterEvent } from "./emitCounterEvent.js"; diff --git a/backend/src/plugins/Counters/functions/checkCounterTrigger.ts b/backend/src/plugins/Counters/functions/checkCounterTrigger.ts index a123c8be1..92c798fe1 100644 --- a/backend/src/plugins/Counters/functions/checkCounterTrigger.ts +++ b/backend/src/plugins/Counters/functions/checkCounterTrigger.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { CounterTrigger } from "../../../data/entities/CounterTrigger.js"; import { CountersPluginType } from "../types.js"; import { emitCounterEvent } from "./emitCounterEvent.js"; diff --git a/backend/src/plugins/Counters/functions/checkReverseCounterTrigger.ts b/backend/src/plugins/Counters/functions/checkReverseCounterTrigger.ts index 6803d4f3d..9350378fe 100644 --- a/backend/src/plugins/Counters/functions/checkReverseCounterTrigger.ts +++ b/backend/src/plugins/Counters/functions/checkReverseCounterTrigger.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { CounterTrigger } from "../../../data/entities/CounterTrigger.js"; import { CountersPluginType } from "../types.js"; import { emitCounterEvent } from "./emitCounterEvent.js"; diff --git a/backend/src/plugins/Counters/functions/counterExists.ts b/backend/src/plugins/Counters/functions/counterExists.ts index c2824e4d8..ac3c6e59d 100644 --- a/backend/src/plugins/Counters/functions/counterExists.ts +++ b/backend/src/plugins/Counters/functions/counterExists.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { CountersPluginType } from "../types.js"; export function counterExists(pluginData: GuildPluginData, counterName: string) { diff --git a/backend/src/plugins/Counters/functions/decayCounter.ts b/backend/src/plugins/Counters/functions/decayCounter.ts index 880c5e2c2..442b30aa3 100644 --- a/backend/src/plugins/Counters/functions/decayCounter.ts +++ b/backend/src/plugins/Counters/functions/decayCounter.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { counterIdLock } from "../../../utils/lockNameHelpers.js"; import { CountersPluginType } from "../types.js"; import { checkAllValuesForReverseTrigger } from "./checkAllValuesForReverseTrigger.js"; diff --git a/backend/src/plugins/Counters/functions/emitCounterEvent.ts b/backend/src/plugins/Counters/functions/emitCounterEvent.ts index df575b1f0..c7502ab98 100644 --- a/backend/src/plugins/Counters/functions/emitCounterEvent.ts +++ b/backend/src/plugins/Counters/functions/emitCounterEvent.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { CounterEvents, CountersPluginType } from "../types.js"; export function emitCounterEvent( diff --git a/backend/src/plugins/Counters/functions/getPrettyNameForCounter.ts b/backend/src/plugins/Counters/functions/getPrettyNameForCounter.ts index 3b4a290d1..cf9f7a7ec 100644 --- a/backend/src/plugins/Counters/functions/getPrettyNameForCounter.ts +++ b/backend/src/plugins/Counters/functions/getPrettyNameForCounter.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { CountersPluginType } from "../types.js"; export function getPrettyNameForCounter(pluginData: GuildPluginData, counterName: string) { diff --git a/backend/src/plugins/Counters/functions/getPrettyNameForCounterTrigger.ts b/backend/src/plugins/Counters/functions/getPrettyNameForCounterTrigger.ts index 097634e9d..79f9bfd15 100644 --- a/backend/src/plugins/Counters/functions/getPrettyNameForCounterTrigger.ts +++ b/backend/src/plugins/Counters/functions/getPrettyNameForCounterTrigger.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { CountersPluginType } from "../types.js"; export function getPrettyNameForCounterTrigger( diff --git a/backend/src/plugins/Counters/functions/offCounterEvent.ts b/backend/src/plugins/Counters/functions/offCounterEvent.ts index 108c5cbcb..d2e84a1bb 100644 --- a/backend/src/plugins/Counters/functions/offCounterEvent.ts +++ b/backend/src/plugins/Counters/functions/offCounterEvent.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { CounterEventEmitter, CountersPluginType } from "../types.js"; export function offCounterEvent( diff --git a/backend/src/plugins/Counters/functions/onCounterEvent.ts b/backend/src/plugins/Counters/functions/onCounterEvent.ts index fb4a3e01f..1549494ea 100644 --- a/backend/src/plugins/Counters/functions/onCounterEvent.ts +++ b/backend/src/plugins/Counters/functions/onCounterEvent.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { CounterEvents, CountersPluginType } from "../types.js"; export function onCounterEvent( diff --git a/backend/src/plugins/Counters/functions/resetAllCounterValues.ts b/backend/src/plugins/Counters/functions/resetAllCounterValues.ts index e3eaed229..4a1a91951 100644 --- a/backend/src/plugins/Counters/functions/resetAllCounterValues.ts +++ b/backend/src/plugins/Counters/functions/resetAllCounterValues.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { counterIdLock } from "../../../utils/lockNameHelpers.js"; import { CountersPluginType } from "../types.js"; diff --git a/backend/src/plugins/Counters/functions/setCounterValue.ts b/backend/src/plugins/Counters/functions/setCounterValue.ts index 23130ab05..b35285ae7 100644 --- a/backend/src/plugins/Counters/functions/setCounterValue.ts +++ b/backend/src/plugins/Counters/functions/setCounterValue.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { counterIdLock } from "../../../utils/lockNameHelpers.js"; import { CountersPluginType } from "../types.js"; import { checkCounterTrigger } from "./checkCounterTrigger.js"; diff --git a/backend/src/plugins/Counters/types.ts b/backend/src/plugins/Counters/types.ts index 82b5eebcf..0c9a061af 100644 --- a/backend/src/plugins/Counters/types.ts +++ b/backend/src/plugins/Counters/types.ts @@ -1,6 +1,6 @@ import { EventEmitter } from "events"; -import { BasePluginType, pluginUtils } from "knub"; -import z from "zod/v4"; +import { BasePluginType, pluginUtils } from "vety"; +import { z } from "zod"; import { GuildCounters, MAX_COUNTER_VALUE, MIN_COUNTER_VALUE } from "../../data/GuildCounters.js"; import { CounterTrigger, diff --git a/backend/src/plugins/CustomEvents/CustomEventsPlugin.ts b/backend/src/plugins/CustomEvents/CustomEventsPlugin.ts index 7115ea9d2..02d85e2e9 100644 --- a/backend/src/plugins/CustomEvents/CustomEventsPlugin.ts +++ b/backend/src/plugins/CustomEvents/CustomEventsPlugin.ts @@ -1,5 +1,5 @@ import { GuildChannel, GuildMember, User } from "discord.js"; -import { guildPlugin, guildPluginMessageCommand, parseSignature } from "knub"; +import { guildPlugin, guildPluginMessageCommand, parseSignature } from "vety"; import { TSignature } from "knub-command-manager"; import { commandTypes } from "../../commandTypes.js"; import { TemplateSafeValueContainer, createTypedTemplateSafeValueContainer } from "../../templateFormatter.js"; diff --git a/backend/src/plugins/CustomEvents/actions/addRoleAction.ts b/backend/src/plugins/CustomEvents/actions/addRoleAction.ts index 0992cc33f..c87063eb1 100644 --- a/backend/src/plugins/CustomEvents/actions/addRoleAction.ts +++ b/backend/src/plugins/CustomEvents/actions/addRoleAction.ts @@ -1,5 +1,5 @@ -import { GuildPluginData } from "knub"; -import z from "zod/v4"; +import { GuildPluginData } from "vety"; +import { z } from "zod"; import { canActOn } from "../../../pluginUtils.js"; import { renderTemplate, TemplateSafeValueContainer } from "../../../templateFormatter.js"; import { resolveMember, zBoundedCharacters, zSnowflake } from "../../../utils.js"; diff --git a/backend/src/plugins/CustomEvents/actions/createCaseAction.ts b/backend/src/plugins/CustomEvents/actions/createCaseAction.ts index 3b00e7d7d..90c67655d 100644 --- a/backend/src/plugins/CustomEvents/actions/createCaseAction.ts +++ b/backend/src/plugins/CustomEvents/actions/createCaseAction.ts @@ -1,5 +1,5 @@ -import { GuildPluginData } from "knub"; -import z from "zod/v4"; +import { GuildPluginData } from "vety"; +import { z } from "zod"; import { CaseTypes } from "../../../data/CaseTypes.js"; import { renderTemplate, TemplateSafeValueContainer } from "../../../templateFormatter.js"; import { zBoundedCharacters } from "../../../utils.js"; diff --git a/backend/src/plugins/CustomEvents/actions/makeRoleMentionableAction.ts b/backend/src/plugins/CustomEvents/actions/makeRoleMentionableAction.ts index ac5f8632a..1f3016939 100644 --- a/backend/src/plugins/CustomEvents/actions/makeRoleMentionableAction.ts +++ b/backend/src/plugins/CustomEvents/actions/makeRoleMentionableAction.ts @@ -1,6 +1,6 @@ import { Snowflake } from "discord.js"; -import { GuildPluginData } from "knub"; -import z from "zod/v4"; +import { GuildPluginData } from "vety"; +import { z } from "zod"; import { TemplateSafeValueContainer } from "../../../templateFormatter.js"; import { convertDelayStringToMS, noop, zBoundedCharacters, zDelayString } from "../../../utils.js"; import { ActionError } from "../ActionError.js"; diff --git a/backend/src/plugins/CustomEvents/actions/makeRoleUnmentionableAction.ts b/backend/src/plugins/CustomEvents/actions/makeRoleUnmentionableAction.ts index 01b4d648b..2f70e5b60 100644 --- a/backend/src/plugins/CustomEvents/actions/makeRoleUnmentionableAction.ts +++ b/backend/src/plugins/CustomEvents/actions/makeRoleUnmentionableAction.ts @@ -1,6 +1,6 @@ import { Snowflake } from "discord.js"; -import { GuildPluginData } from "knub"; -import z from "zod/v4"; +import { GuildPluginData } from "vety"; +import { z } from "zod"; import { TemplateSafeValueContainer } from "../../../templateFormatter.js"; import { zSnowflake } from "../../../utils.js"; import { ActionError } from "../ActionError.js"; diff --git a/backend/src/plugins/CustomEvents/actions/messageAction.ts b/backend/src/plugins/CustomEvents/actions/messageAction.ts index 4f46a512c..4250d1987 100644 --- a/backend/src/plugins/CustomEvents/actions/messageAction.ts +++ b/backend/src/plugins/CustomEvents/actions/messageAction.ts @@ -1,6 +1,6 @@ import { Snowflake, TextChannel } from "discord.js"; -import { GuildPluginData } from "knub"; -import z from "zod/v4"; +import { GuildPluginData } from "vety"; +import { z } from "zod"; import { TemplateSafeValueContainer, renderTemplate } from "../../../templateFormatter.js"; import { zBoundedCharacters } from "../../../utils.js"; import { ActionError } from "../ActionError.js"; diff --git a/backend/src/plugins/CustomEvents/actions/moveToVoiceChannelAction.ts b/backend/src/plugins/CustomEvents/actions/moveToVoiceChannelAction.ts index deac45170..520d51cf7 100644 --- a/backend/src/plugins/CustomEvents/actions/moveToVoiceChannelAction.ts +++ b/backend/src/plugins/CustomEvents/actions/moveToVoiceChannelAction.ts @@ -1,6 +1,6 @@ import { Snowflake, VoiceChannel } from "discord.js"; -import { GuildPluginData } from "knub"; -import z from "zod/v4"; +import { GuildPluginData } from "vety"; +import { z } from "zod"; import { canActOn } from "../../../pluginUtils.js"; import { TemplateSafeValueContainer, renderTemplate } from "../../../templateFormatter.js"; import { resolveMember, zBoundedCharacters } from "../../../utils.js"; diff --git a/backend/src/plugins/CustomEvents/actions/setChannelPermissionOverrides.ts b/backend/src/plugins/CustomEvents/actions/setChannelPermissionOverrides.ts index aa57d2ebd..3ab63d103 100644 --- a/backend/src/plugins/CustomEvents/actions/setChannelPermissionOverrides.ts +++ b/backend/src/plugins/CustomEvents/actions/setChannelPermissionOverrides.ts @@ -1,6 +1,6 @@ import { PermissionsBitField, PermissionsString, Snowflake } from "discord.js"; -import { GuildPluginData } from "knub"; -import z from "zod/v4"; +import { GuildPluginData } from "vety"; +import { z } from "zod"; import { TemplateSafeValueContainer } from "../../../templateFormatter.js"; import { zBoundedCharacters, zSnowflake } from "../../../utils.js"; import { ActionError } from "../ActionError.js"; diff --git a/backend/src/plugins/CustomEvents/functions/runEvent.ts b/backend/src/plugins/CustomEvents/functions/runEvent.ts index 33a0f9c30..55f213e3e 100644 --- a/backend/src/plugins/CustomEvents/functions/runEvent.ts +++ b/backend/src/plugins/CustomEvents/functions/runEvent.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { TemplateSafeValueContainer } from "../../../templateFormatter.js"; import { ActionError } from "../ActionError.js"; import { addRoleAction } from "../actions/addRoleAction.js"; diff --git a/backend/src/plugins/CustomEvents/types.ts b/backend/src/plugins/CustomEvents/types.ts index 877fe3fe7..3562ecd5e 100644 --- a/backend/src/plugins/CustomEvents/types.ts +++ b/backend/src/plugins/CustomEvents/types.ts @@ -1,5 +1,5 @@ -import { BasePluginType, pluginUtils } from "knub"; -import z from "zod/v4"; +import { BasePluginType, pluginUtils } from "vety"; +import { z } from "zod"; import { zBoundedCharacters, zBoundedRecord } from "../../utils.js"; import { CommonPlugin } from "../Common/CommonPlugin.js"; import { zAddRoleAction } from "./actions/addRoleAction.js"; diff --git a/backend/src/plugins/GuildAccessMonitor/GuildAccessMonitorPlugin.ts b/backend/src/plugins/GuildAccessMonitor/GuildAccessMonitorPlugin.ts index ad2c4dfe6..ebf942530 100644 --- a/backend/src/plugins/GuildAccessMonitor/GuildAccessMonitorPlugin.ts +++ b/backend/src/plugins/GuildAccessMonitor/GuildAccessMonitorPlugin.ts @@ -1,5 +1,5 @@ import { Guild } from "discord.js"; -import { GlobalPluginData, globalPlugin, globalPluginEventListener } from "knub"; +import { GlobalPluginData, globalPlugin, globalPluginEventListener } from "vety"; import { AllowedGuilds } from "../../data/AllowedGuilds.js"; import { Configs } from "../../data/Configs.js"; import { env } from "../../env.js"; diff --git a/backend/src/plugins/GuildAccessMonitor/types.ts b/backend/src/plugins/GuildAccessMonitor/types.ts index 5e6b1eb26..e54b6aa1d 100644 --- a/backend/src/plugins/GuildAccessMonitor/types.ts +++ b/backend/src/plugins/GuildAccessMonitor/types.ts @@ -1,5 +1,5 @@ -import { BasePluginType } from "knub"; -import { z } from "zod/v4"; +import { BasePluginType } from "vety"; +import { z } from "zod"; import { AllowedGuilds } from "../../data/AllowedGuilds.js"; export const zGuildAccessMonitorConfig = z.strictObject({}); diff --git a/backend/src/plugins/GuildConfigReloader/GuildConfigReloaderPlugin.ts b/backend/src/plugins/GuildConfigReloader/GuildConfigReloaderPlugin.ts index e90cb48c6..39fbb20bb 100644 --- a/backend/src/plugins/GuildConfigReloader/GuildConfigReloaderPlugin.ts +++ b/backend/src/plugins/GuildConfigReloader/GuildConfigReloaderPlugin.ts @@ -1,4 +1,4 @@ -import { globalPlugin } from "knub"; +import { globalPlugin } from "vety"; import { Configs } from "../../data/Configs.js"; import { reloadChangedGuilds } from "./functions/reloadChangedGuilds.js"; import { GuildConfigReloaderPluginType, zGuildConfigReloaderPluginConfig } from "./types.js"; diff --git a/backend/src/plugins/GuildConfigReloader/functions/reloadChangedGuilds.ts b/backend/src/plugins/GuildConfigReloader/functions/reloadChangedGuilds.ts index 0f0bef790..520fb068a 100644 --- a/backend/src/plugins/GuildConfigReloader/functions/reloadChangedGuilds.ts +++ b/backend/src/plugins/GuildConfigReloader/functions/reloadChangedGuilds.ts @@ -1,5 +1,5 @@ import { Snowflake } from "discord.js"; -import { GlobalPluginData } from "knub"; +import { GlobalPluginData } from "vety"; import { SECONDS } from "../../../utils.js"; import { GuildConfigReloaderPluginType } from "../types.js"; @@ -15,7 +15,7 @@ export async function reloadChangedGuilds(pluginData: GlobalPluginData pluginData.state.highestConfigId) { pluginData.state.highestConfigId = item.id; diff --git a/backend/src/plugins/GuildConfigReloader/types.ts b/backend/src/plugins/GuildConfigReloader/types.ts index ae054856d..9d27529d0 100644 --- a/backend/src/plugins/GuildConfigReloader/types.ts +++ b/backend/src/plugins/GuildConfigReloader/types.ts @@ -1,5 +1,5 @@ -import { BasePluginType } from "knub"; -import { z } from "zod/v4"; +import { BasePluginType } from "vety"; +import { z } from "zod"; import { Configs } from "../../data/Configs.js"; import Timeout = NodeJS.Timeout; diff --git a/backend/src/plugins/GuildInfoSaver/GuildInfoSaverPlugin.ts b/backend/src/plugins/GuildInfoSaver/GuildInfoSaverPlugin.ts index 753801ace..3a0d0c4d7 100644 --- a/backend/src/plugins/GuildInfoSaver/GuildInfoSaverPlugin.ts +++ b/backend/src/plugins/GuildInfoSaver/GuildInfoSaverPlugin.ts @@ -1,5 +1,5 @@ import { Guild } from "discord.js"; -import { guildPlugin, guildPluginEventListener } from "knub"; +import { guildPlugin, guildPluginEventListener } from "vety"; import { AllowedGuilds } from "../../data/AllowedGuilds.js"; import { ApiPermissionAssignments } from "../../data/ApiPermissionAssignments.js"; import { MINUTES } from "../../utils.js"; diff --git a/backend/src/plugins/GuildInfoSaver/types.ts b/backend/src/plugins/GuildInfoSaver/types.ts index 3172856d7..79afa4020 100644 --- a/backend/src/plugins/GuildInfoSaver/types.ts +++ b/backend/src/plugins/GuildInfoSaver/types.ts @@ -1,5 +1,5 @@ -import { BasePluginType } from "knub"; -import { z } from "zod/v4"; +import { BasePluginType } from "vety"; +import { z } from "zod"; export const zGuildInfoSaverConfig = z.strictObject({}); diff --git a/backend/src/plugins/GuildMemberCache/GuildMemberCachePlugin.ts b/backend/src/plugins/GuildMemberCache/GuildMemberCachePlugin.ts index 33fea0806..d4dfe45db 100644 --- a/backend/src/plugins/GuildMemberCache/GuildMemberCachePlugin.ts +++ b/backend/src/plugins/GuildMemberCache/GuildMemberCachePlugin.ts @@ -1,4 +1,4 @@ -import { guildPlugin } from "knub"; +import { guildPlugin } from "vety"; import { GuildMemberCache } from "../../data/GuildMemberCache.js"; import { makePublicFn } from "../../pluginUtils.js"; import { SECONDS } from "../../utils.js"; diff --git a/backend/src/plugins/GuildMemberCache/events/cancelDeletionOnMemberJoin.ts b/backend/src/plugins/GuildMemberCache/events/cancelDeletionOnMemberJoin.ts index d15e49408..93b07ffdc 100644 --- a/backend/src/plugins/GuildMemberCache/events/cancelDeletionOnMemberJoin.ts +++ b/backend/src/plugins/GuildMemberCache/events/cancelDeletionOnMemberJoin.ts @@ -1,4 +1,4 @@ -import { guildPluginEventListener } from "knub"; +import { guildPluginEventListener } from "vety"; import { GuildMemberCachePluginType } from "../types.js"; export const cancelDeletionOnMemberJoin = guildPluginEventListener()({ diff --git a/backend/src/plugins/GuildMemberCache/events/removeMemberCacheOnMemberLeave.ts b/backend/src/plugins/GuildMemberCache/events/removeMemberCacheOnMemberLeave.ts index 08d23ccd8..338106e43 100644 --- a/backend/src/plugins/GuildMemberCache/events/removeMemberCacheOnMemberLeave.ts +++ b/backend/src/plugins/GuildMemberCache/events/removeMemberCacheOnMemberLeave.ts @@ -1,4 +1,4 @@ -import { guildPluginEventListener } from "knub"; +import { guildPluginEventListener } from "vety"; import { GuildMemberCachePluginType } from "../types.js"; export const removeMemberCacheOnMemberLeave = guildPluginEventListener()({ diff --git a/backend/src/plugins/GuildMemberCache/events/updateMemberCacheOnMemberUpdate.ts b/backend/src/plugins/GuildMemberCache/events/updateMemberCacheOnMemberUpdate.ts index 7709902c5..96844e0a9 100644 --- a/backend/src/plugins/GuildMemberCache/events/updateMemberCacheOnMemberUpdate.ts +++ b/backend/src/plugins/GuildMemberCache/events/updateMemberCacheOnMemberUpdate.ts @@ -1,4 +1,4 @@ -import { guildPluginEventListener } from "knub"; +import { guildPluginEventListener } from "vety"; import { updateMemberCacheForMember } from "../functions/updateMemberCacheForMember.js"; import { GuildMemberCachePluginType } from "../types.js"; diff --git a/backend/src/plugins/GuildMemberCache/events/updateMemberCacheOnMessage.ts b/backend/src/plugins/GuildMemberCache/events/updateMemberCacheOnMessage.ts index e7777c53d..8c967d979 100644 --- a/backend/src/plugins/GuildMemberCache/events/updateMemberCacheOnMessage.ts +++ b/backend/src/plugins/GuildMemberCache/events/updateMemberCacheOnMessage.ts @@ -1,4 +1,4 @@ -import { guildPluginEventListener } from "knub"; +import { guildPluginEventListener } from "vety"; import { updateMemberCacheForMember } from "../functions/updateMemberCacheForMember.js"; import { GuildMemberCachePluginType } from "../types.js"; diff --git a/backend/src/plugins/GuildMemberCache/events/updateMemberCacheOnRoleChange.ts b/backend/src/plugins/GuildMemberCache/events/updateMemberCacheOnRoleChange.ts index 8f8f2abb3..a797916ca 100644 --- a/backend/src/plugins/GuildMemberCache/events/updateMemberCacheOnRoleChange.ts +++ b/backend/src/plugins/GuildMemberCache/events/updateMemberCacheOnRoleChange.ts @@ -1,5 +1,5 @@ import { AuditLogEvent } from "discord.js"; -import { guildPluginEventListener } from "knub"; +import { guildPluginEventListener } from "vety"; import { updateMemberCacheForMember } from "../functions/updateMemberCacheForMember.js"; import { GuildMemberCachePluginType } from "../types.js"; diff --git a/backend/src/plugins/GuildMemberCache/events/updateMemberCacheOnVoiceStateUpdate.ts b/backend/src/plugins/GuildMemberCache/events/updateMemberCacheOnVoiceStateUpdate.ts index 0e7bc2125..8ca7a1434 100644 --- a/backend/src/plugins/GuildMemberCache/events/updateMemberCacheOnVoiceStateUpdate.ts +++ b/backend/src/plugins/GuildMemberCache/events/updateMemberCacheOnVoiceStateUpdate.ts @@ -1,4 +1,4 @@ -import { guildPluginEventListener } from "knub"; +import { guildPluginEventListener } from "vety"; import { updateMemberCacheForMember } from "../functions/updateMemberCacheForMember.js"; import { GuildMemberCachePluginType } from "../types.js"; diff --git a/backend/src/plugins/GuildMemberCache/functions/getCachedMemberData.ts b/backend/src/plugins/GuildMemberCache/functions/getCachedMemberData.ts index 340eae919..3957464a8 100644 --- a/backend/src/plugins/GuildMemberCache/functions/getCachedMemberData.ts +++ b/backend/src/plugins/GuildMemberCache/functions/getCachedMemberData.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { MemberCacheItem } from "../../../data/entities/MemberCacheItem.js"; import { GuildMemberCachePluginType } from "../types.js"; diff --git a/backend/src/plugins/GuildMemberCache/functions/updateMemberCacheForMember.ts b/backend/src/plugins/GuildMemberCache/functions/updateMemberCacheForMember.ts index 384af1a81..7b92ba043 100644 --- a/backend/src/plugins/GuildMemberCache/functions/updateMemberCacheForMember.ts +++ b/backend/src/plugins/GuildMemberCache/functions/updateMemberCacheForMember.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { GuildMemberCachePluginType } from "../types.js"; export async function updateMemberCacheForMember( diff --git a/backend/src/plugins/GuildMemberCache/types.ts b/backend/src/plugins/GuildMemberCache/types.ts index 32be0f6db..cda33445b 100644 --- a/backend/src/plugins/GuildMemberCache/types.ts +++ b/backend/src/plugins/GuildMemberCache/types.ts @@ -1,5 +1,5 @@ -import { BasePluginType } from "knub"; -import { z } from "zod/v4"; +import { BasePluginType } from "vety"; +import { z } from "zod"; import { GuildMemberCache } from "../../data/GuildMemberCache.js"; export const zGuildMemberCacheConfig = z.strictObject({}); diff --git a/backend/src/plugins/InternalPoster/InternalPosterPlugin.ts b/backend/src/plugins/InternalPoster/InternalPosterPlugin.ts index 82592ec6f..7fcfc95d8 100644 --- a/backend/src/plugins/InternalPoster/InternalPosterPlugin.ts +++ b/backend/src/plugins/InternalPoster/InternalPosterPlugin.ts @@ -1,4 +1,4 @@ -import { guildPlugin } from "knub"; +import { guildPlugin } from "vety"; import { Queue } from "../../Queue.js"; import { Webhooks } from "../../data/Webhooks.js"; import { makePublicFn } from "../../pluginUtils.js"; diff --git a/backend/src/plugins/InternalPoster/functions/editMessage.ts b/backend/src/plugins/InternalPoster/functions/editMessage.ts index 7f785817c..586f00d5c 100644 --- a/backend/src/plugins/InternalPoster/functions/editMessage.ts +++ b/backend/src/plugins/InternalPoster/functions/editMessage.ts @@ -1,5 +1,5 @@ import { Message, MessageEditOptions, WebhookClient, WebhookMessageEditOptions } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { isDiscordAPIError, noop } from "../../../utils.js"; import { InternalPosterPluginType } from "../types.js"; diff --git a/backend/src/plugins/InternalPoster/functions/getOrCreateWebhookClientForChannel.ts b/backend/src/plugins/InternalPoster/functions/getOrCreateWebhookClientForChannel.ts index 02d2e5e32..502195b10 100644 --- a/backend/src/plugins/InternalPoster/functions/getOrCreateWebhookClientForChannel.ts +++ b/backend/src/plugins/InternalPoster/functions/getOrCreateWebhookClientForChannel.ts @@ -1,5 +1,5 @@ import { WebhookClient } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { InternalPosterPluginType } from "../types.js"; import { getOrCreateWebhookForChannel, WebhookableChannel } from "./getOrCreateWebhookForChannel.js"; diff --git a/backend/src/plugins/InternalPoster/functions/getOrCreateWebhookForChannel.ts b/backend/src/plugins/InternalPoster/functions/getOrCreateWebhookForChannel.ts index 1cceafd4d..d53c35017 100644 --- a/backend/src/plugins/InternalPoster/functions/getOrCreateWebhookForChannel.ts +++ b/backend/src/plugins/InternalPoster/functions/getOrCreateWebhookForChannel.ts @@ -1,5 +1,5 @@ import { GuildBasedChannel, PermissionsBitField } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { isDiscordAPIError } from "../../../utils.js"; import { InternalPosterPluginType } from "../types.js"; diff --git a/backend/src/plugins/InternalPoster/functions/sendMessage.ts b/backend/src/plugins/InternalPoster/functions/sendMessage.ts index 4d8576c46..945268f50 100644 --- a/backend/src/plugins/InternalPoster/functions/sendMessage.ts +++ b/backend/src/plugins/InternalPoster/functions/sendMessage.ts @@ -1,5 +1,5 @@ import { GuildTextBasedChannel, MessageCreateOptions, WebhookClient } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { isDiscordAPIError } from "../../../utils.js"; import { InternalPosterPluginType } from "../types.js"; import { getOrCreateWebhookClientForChannel } from "./getOrCreateWebhookClientForChannel.js"; diff --git a/backend/src/plugins/InternalPoster/types.ts b/backend/src/plugins/InternalPoster/types.ts index 13d4b2142..b3155c437 100644 --- a/backend/src/plugins/InternalPoster/types.ts +++ b/backend/src/plugins/InternalPoster/types.ts @@ -1,6 +1,6 @@ import { WebhookClient } from "discord.js"; -import { BasePluginType } from "knub"; -import { z } from "zod/v4"; +import { BasePluginType } from "vety"; +import { z } from "zod"; import { Queue } from "../../Queue.js"; import { Webhooks } from "../../data/Webhooks.js"; diff --git a/backend/src/plugins/LocateUser/LocateUserPlugin.ts b/backend/src/plugins/LocateUser/LocateUserPlugin.ts index d96506180..1506c9abd 100644 --- a/backend/src/plugins/LocateUser/LocateUserPlugin.ts +++ b/backend/src/plugins/LocateUser/LocateUserPlugin.ts @@ -1,4 +1,4 @@ -import { guildPlugin } from "knub"; +import { guildPlugin } from "vety"; import { onGuildEvent } from "../../data/GuildEvents.js"; import { GuildVCAlerts } from "../../data/GuildVCAlerts.js"; import { CommonPlugin } from "../Common/CommonPlugin.js"; diff --git a/backend/src/plugins/LocateUser/types.ts b/backend/src/plugins/LocateUser/types.ts index e84c673c8..76d2a4775 100644 --- a/backend/src/plugins/LocateUser/types.ts +++ b/backend/src/plugins/LocateUser/types.ts @@ -1,5 +1,5 @@ -import { BasePluginType, guildPluginEventListener, guildPluginMessageCommand, pluginUtils } from "knub"; -import z from "zod/v4"; +import { BasePluginType, guildPluginEventListener, guildPluginMessageCommand, pluginUtils } from "vety"; +import { z } from "zod"; import { GuildVCAlerts } from "../../data/GuildVCAlerts.js"; import { CommonPlugin } from "../Common/CommonPlugin.js"; diff --git a/backend/src/plugins/LocateUser/utils/clearExpiredAlert.ts b/backend/src/plugins/LocateUser/utils/clearExpiredAlert.ts index f09ae9fa4..61610e38a 100644 --- a/backend/src/plugins/LocateUser/utils/clearExpiredAlert.ts +++ b/backend/src/plugins/LocateUser/utils/clearExpiredAlert.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { VCAlert } from "../../../data/entities/VCAlert.js"; import { LocateUserPluginType } from "../types.js"; import { removeUserIdFromActiveAlerts } from "./removeUserIdFromActiveAlerts.js"; diff --git a/backend/src/plugins/LocateUser/utils/fillAlertsList.ts b/backend/src/plugins/LocateUser/utils/fillAlertsList.ts index d3b56fcfd..9a228b398 100644 --- a/backend/src/plugins/LocateUser/utils/fillAlertsList.ts +++ b/backend/src/plugins/LocateUser/utils/fillAlertsList.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LocateUserPluginType } from "../types.js"; export async function fillActiveAlertsList(pluginData: GuildPluginData) { diff --git a/backend/src/plugins/LocateUser/utils/moveMember.ts b/backend/src/plugins/LocateUser/utils/moveMember.ts index 85b068c61..48ddb3661 100644 --- a/backend/src/plugins/LocateUser/utils/moveMember.ts +++ b/backend/src/plugins/LocateUser/utils/moveMember.ts @@ -1,5 +1,5 @@ import { GuildMember, GuildTextBasedChannel, Snowflake } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LocateUserPluginType } from "../types.js"; export async function moveMember( diff --git a/backend/src/plugins/LocateUser/utils/removeUserIdFromActiveAlerts.ts b/backend/src/plugins/LocateUser/utils/removeUserIdFromActiveAlerts.ts index 564c682a0..7dd598f29 100644 --- a/backend/src/plugins/LocateUser/utils/removeUserIdFromActiveAlerts.ts +++ b/backend/src/plugins/LocateUser/utils/removeUserIdFromActiveAlerts.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LocateUserPluginType } from "../types.js"; export async function removeUserIdFromActiveAlerts(pluginData: GuildPluginData, userId: string) { diff --git a/backend/src/plugins/LocateUser/utils/sendAlerts.ts b/backend/src/plugins/LocateUser/utils/sendAlerts.ts index 78a58911c..12c81642f 100644 --- a/backend/src/plugins/LocateUser/utils/sendAlerts.ts +++ b/backend/src/plugins/LocateUser/utils/sendAlerts.ts @@ -1,5 +1,5 @@ import { Snowflake } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { resolveMember } from "../../../utils.js"; import { LocateUserPluginType } from "../types.js"; import { moveMember } from "./moveMember.js"; diff --git a/backend/src/plugins/LocateUser/utils/sendWhere.ts b/backend/src/plugins/LocateUser/utils/sendWhere.ts index ef74cbcd9..05ddf70ad 100644 --- a/backend/src/plugins/LocateUser/utils/sendWhere.ts +++ b/backend/src/plugins/LocateUser/utils/sendWhere.ts @@ -1,6 +1,6 @@ import { GuildMember, GuildTextBasedChannel, Invite, VoiceChannel } from "discord.js"; -import { GuildPluginData } from "knub"; -import { getInviteLink } from "knub/helpers"; +import { GuildPluginData } from "vety"; +import { getInviteLink } from "vety/helpers"; import { LocateUserPluginType } from "../types.js"; import { createOrReuseInvite } from "./createOrReuseInvite.js"; diff --git a/backend/src/plugins/Logs/LogsPlugin.ts b/backend/src/plugins/Logs/LogsPlugin.ts index 0485351c5..573d6926f 100644 --- a/backend/src/plugins/Logs/LogsPlugin.ts +++ b/backend/src/plugins/Logs/LogsPlugin.ts @@ -1,4 +1,4 @@ -import { CooldownManager, guildPlugin } from "knub"; +import { CooldownManager, guildPlugin } from "vety"; import { GuildArchives } from "../../data/GuildArchives.js"; import { GuildCases } from "../../data/GuildCases.js"; import { GuildLogs } from "../../data/GuildLogs.js"; diff --git a/backend/src/plugins/Logs/events/LogsGuildMemberAddEvt.ts b/backend/src/plugins/Logs/events/LogsGuildMemberAddEvt.ts index d792e060c..262055b46 100644 --- a/backend/src/plugins/Logs/events/LogsGuildMemberAddEvt.ts +++ b/backend/src/plugins/Logs/events/LogsGuildMemberAddEvt.ts @@ -12,7 +12,7 @@ export const LogsGuildMemberAddEvt = logsEvt({ member, }); - // TODO: Uncomment below once circular dependencies in Knub have been fixed + // TODO: Uncomment below once circular dependencies in Vety have been fixed // const cases = (await pluginData.state.cases.with("notes").getByUserId(member.id)).filter(c => !c.is_hidden); // cases.sort((a, b) => (a.created_at > b.created_at ? -1 : 1)); diff --git a/backend/src/plugins/Logs/events/LogsGuildMemberRoleChangeEvt.ts b/backend/src/plugins/Logs/events/LogsGuildMemberRoleChangeEvt.ts index 41cd5810d..6801f44e4 100644 --- a/backend/src/plugins/Logs/events/LogsGuildMemberRoleChangeEvt.ts +++ b/backend/src/plugins/Logs/events/LogsGuildMemberRoleChangeEvt.ts @@ -1,5 +1,5 @@ import { APIRole, AuditLogChange, AuditLogEvent } from "discord.js"; -import { guildPluginEventListener } from "knub"; +import { guildPluginEventListener } from "vety"; import { resolveRole } from "../../../utils.js"; import { logMemberRoleAdd } from "../logFunctions/logMemberRoleAdd.js"; import { logMemberRoleRemove } from "../logFunctions/logMemberRoleRemove.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logAutomodAction.ts b/backend/src/plugins/Logs/logFunctions/logAutomodAction.ts index 66af51394..9740f6a46 100644 --- a/backend/src/plugins/Logs/logFunctions/logAutomodAction.ts +++ b/backend/src/plugins/Logs/logFunctions/logAutomodAction.ts @@ -1,5 +1,5 @@ import { User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { userToTemplateSafeUser } from "../../../utils/templateSafeObjects.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logBotAlert.ts b/backend/src/plugins/Logs/logFunctions/logBotAlert.ts index 135dd8db2..954d4be0e 100644 --- a/backend/src/plugins/Logs/logFunctions/logBotAlert.ts +++ b/backend/src/plugins/Logs/logFunctions/logBotAlert.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { LogsPluginType } from "../types.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logCaseCreate.ts b/backend/src/plugins/Logs/logFunctions/logCaseCreate.ts index 270887368..77f3d0377 100644 --- a/backend/src/plugins/Logs/logFunctions/logCaseCreate.ts +++ b/backend/src/plugins/Logs/logFunctions/logCaseCreate.ts @@ -1,5 +1,5 @@ import { User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { userToTemplateSafeUser } from "../../../utils/templateSafeObjects.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logCaseDelete.ts b/backend/src/plugins/Logs/logFunctions/logCaseDelete.ts index 27998d6ea..3fd524570 100644 --- a/backend/src/plugins/Logs/logFunctions/logCaseDelete.ts +++ b/backend/src/plugins/Logs/logFunctions/logCaseDelete.ts @@ -1,5 +1,5 @@ import { GuildMember } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { Case } from "../../../data/entities/Case.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logCaseUpdate.ts b/backend/src/plugins/Logs/logFunctions/logCaseUpdate.ts index 9040130bf..3b7d0402c 100644 --- a/backend/src/plugins/Logs/logFunctions/logCaseUpdate.ts +++ b/backend/src/plugins/Logs/logFunctions/logCaseUpdate.ts @@ -1,5 +1,5 @@ import { User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { userToTemplateSafeUser } from "../../../utils/templateSafeObjects.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logCensor.ts b/backend/src/plugins/Logs/logFunctions/logCensor.ts index 62de0f82b..a9e8b49f5 100644 --- a/backend/src/plugins/Logs/logFunctions/logCensor.ts +++ b/backend/src/plugins/Logs/logFunctions/logCensor.ts @@ -1,6 +1,6 @@ import { GuildTextBasedChannel, User } from "discord.js"; -import { GuildPluginData } from "knub"; -import { deactivateMentions, disableCodeBlocks } from "knub/helpers"; +import { GuildPluginData } from "vety"; +import { deactivateMentions, disableCodeBlocks } from "vety/helpers"; import { LogType } from "../../../data/LogType.js"; import { SavedMessage } from "../../../data/entities/SavedMessage.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logChannelCreate.ts b/backend/src/plugins/Logs/logFunctions/logChannelCreate.ts index 2efc81ad2..8db86541e 100644 --- a/backend/src/plugins/Logs/logFunctions/logChannelCreate.ts +++ b/backend/src/plugins/Logs/logFunctions/logChannelCreate.ts @@ -1,5 +1,5 @@ import { GuildBasedChannel } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { resolveChannelIds } from "../../../utils/resolveChannelIds.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logChannelDelete.ts b/backend/src/plugins/Logs/logFunctions/logChannelDelete.ts index b3481f9ed..e44410f16 100644 --- a/backend/src/plugins/Logs/logFunctions/logChannelDelete.ts +++ b/backend/src/plugins/Logs/logFunctions/logChannelDelete.ts @@ -1,5 +1,5 @@ import { GuildBasedChannel } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { resolveChannelIds } from "../../../utils/resolveChannelIds.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logChannelUpdate.ts b/backend/src/plugins/Logs/logFunctions/logChannelUpdate.ts index a8e9d5bb1..a1333bfc7 100644 --- a/backend/src/plugins/Logs/logFunctions/logChannelUpdate.ts +++ b/backend/src/plugins/Logs/logFunctions/logChannelUpdate.ts @@ -1,5 +1,5 @@ import { GuildBasedChannel } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { resolveChannelIds } from "../../../utils/resolveChannelIds.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logClean.ts b/backend/src/plugins/Logs/logFunctions/logClean.ts index 00d018120..f7e0ebba7 100644 --- a/backend/src/plugins/Logs/logFunctions/logClean.ts +++ b/backend/src/plugins/Logs/logFunctions/logClean.ts @@ -1,5 +1,5 @@ import { GuildTextBasedChannel, User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { resolveChannelIds } from "../../../utils/resolveChannelIds.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logDmFailed.ts b/backend/src/plugins/Logs/logFunctions/logDmFailed.ts index 43ae6733d..d8013531a 100644 --- a/backend/src/plugins/Logs/logFunctions/logDmFailed.ts +++ b/backend/src/plugins/Logs/logFunctions/logDmFailed.ts @@ -1,5 +1,5 @@ import { User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { UnknownUser } from "../../../utils.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logEmojiCreate.ts b/backend/src/plugins/Logs/logFunctions/logEmojiCreate.ts index c9a3439d5..aa010831a 100644 --- a/backend/src/plugins/Logs/logFunctions/logEmojiCreate.ts +++ b/backend/src/plugins/Logs/logFunctions/logEmojiCreate.ts @@ -1,5 +1,5 @@ import { Emoji } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { emojiToTemplateSafeEmoji } from "../../../utils/templateSafeObjects.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logEmojiDelete.ts b/backend/src/plugins/Logs/logFunctions/logEmojiDelete.ts index 3dde59853..0225948fc 100644 --- a/backend/src/plugins/Logs/logFunctions/logEmojiDelete.ts +++ b/backend/src/plugins/Logs/logFunctions/logEmojiDelete.ts @@ -1,5 +1,5 @@ import { Emoji } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { emojiToTemplateSafeEmoji } from "../../../utils/templateSafeObjects.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logEmojiUpdate.ts b/backend/src/plugins/Logs/logFunctions/logEmojiUpdate.ts index 83b628fa7..9e047cd07 100644 --- a/backend/src/plugins/Logs/logFunctions/logEmojiUpdate.ts +++ b/backend/src/plugins/Logs/logFunctions/logEmojiUpdate.ts @@ -1,5 +1,5 @@ import { Emoji } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { emojiToTemplateSafeEmoji } from "../../../utils/templateSafeObjects.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logMassBan.ts b/backend/src/plugins/Logs/logFunctions/logMassBan.ts index 5aac8d6ee..bf1936605 100644 --- a/backend/src/plugins/Logs/logFunctions/logMassBan.ts +++ b/backend/src/plugins/Logs/logFunctions/logMassBan.ts @@ -1,5 +1,5 @@ import { User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { userToTemplateSafeUser } from "../../../utils/templateSafeObjects.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logMassMute.ts b/backend/src/plugins/Logs/logFunctions/logMassMute.ts index 5f6a11b36..47c3049a0 100644 --- a/backend/src/plugins/Logs/logFunctions/logMassMute.ts +++ b/backend/src/plugins/Logs/logFunctions/logMassMute.ts @@ -1,5 +1,5 @@ import { User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { userToTemplateSafeUser } from "../../../utils/templateSafeObjects.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logMassUnban.ts b/backend/src/plugins/Logs/logFunctions/logMassUnban.ts index d68a8d9cf..571e8068e 100644 --- a/backend/src/plugins/Logs/logFunctions/logMassUnban.ts +++ b/backend/src/plugins/Logs/logFunctions/logMassUnban.ts @@ -1,5 +1,5 @@ import { User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { userToTemplateSafeUser } from "../../../utils/templateSafeObjects.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logMemberBan.ts b/backend/src/plugins/Logs/logFunctions/logMemberBan.ts index 001e76156..421b68947 100644 --- a/backend/src/plugins/Logs/logFunctions/logMemberBan.ts +++ b/backend/src/plugins/Logs/logFunctions/logMemberBan.ts @@ -1,5 +1,5 @@ import { PartialUser, User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { UnknownUser } from "../../../utils.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logMemberForceban.ts b/backend/src/plugins/Logs/logFunctions/logMemberForceban.ts index 4aff4ab55..a28dbb2d1 100644 --- a/backend/src/plugins/Logs/logFunctions/logMemberForceban.ts +++ b/backend/src/plugins/Logs/logFunctions/logMemberForceban.ts @@ -1,5 +1,5 @@ import { GuildMember, Snowflake } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { memberToTemplateSafeMember } from "../../../utils/templateSafeObjects.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logMemberJoin.ts b/backend/src/plugins/Logs/logFunctions/logMemberJoin.ts index f4ea29a7b..4c3bca051 100644 --- a/backend/src/plugins/Logs/logFunctions/logMemberJoin.ts +++ b/backend/src/plugins/Logs/logFunctions/logMemberJoin.ts @@ -1,5 +1,5 @@ import { GuildMember } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import moment from "moment-timezone"; import { LogType } from "../../../data/LogType.js"; import { humanizeDuration } from "../../../humanizeDuration.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logMemberJoinWithPriorRecords.ts b/backend/src/plugins/Logs/logFunctions/logMemberJoinWithPriorRecords.ts index 109a9ccfa..c0ad4e901 100644 --- a/backend/src/plugins/Logs/logFunctions/logMemberJoinWithPriorRecords.ts +++ b/backend/src/plugins/Logs/logFunctions/logMemberJoinWithPriorRecords.ts @@ -1,5 +1,5 @@ import { GuildMember } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { memberToTemplateSafeMember } from "../../../utils/templateSafeObjects.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logMemberKick.ts b/backend/src/plugins/Logs/logFunctions/logMemberKick.ts index 46997cb8f..b8f58ea2c 100644 --- a/backend/src/plugins/Logs/logFunctions/logMemberKick.ts +++ b/backend/src/plugins/Logs/logFunctions/logMemberKick.ts @@ -1,5 +1,5 @@ import { User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { UnknownUser } from "../../../utils.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logMemberLeave.ts b/backend/src/plugins/Logs/logFunctions/logMemberLeave.ts index 60dbaaf5c..c1ad2b232 100644 --- a/backend/src/plugins/Logs/logFunctions/logMemberLeave.ts +++ b/backend/src/plugins/Logs/logFunctions/logMemberLeave.ts @@ -1,5 +1,5 @@ import { GuildMember, PartialGuildMember } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { memberToTemplateSafeMember } from "../../../utils/templateSafeObjects.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logMemberMute.ts b/backend/src/plugins/Logs/logFunctions/logMemberMute.ts index 5e3321b5e..04616e2b7 100644 --- a/backend/src/plugins/Logs/logFunctions/logMemberMute.ts +++ b/backend/src/plugins/Logs/logFunctions/logMemberMute.ts @@ -1,5 +1,5 @@ import { User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { UnknownUser } from "../../../utils.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logMemberMuteExpired.ts b/backend/src/plugins/Logs/logFunctions/logMemberMuteExpired.ts index 93f811ab1..588bfd755 100644 --- a/backend/src/plugins/Logs/logFunctions/logMemberMuteExpired.ts +++ b/backend/src/plugins/Logs/logFunctions/logMemberMuteExpired.ts @@ -1,5 +1,5 @@ import { GuildMember } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { UnknownUser } from "../../../utils.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logMemberMuteRejoin.ts b/backend/src/plugins/Logs/logFunctions/logMemberMuteRejoin.ts index e22451b73..cd68d41cc 100644 --- a/backend/src/plugins/Logs/logFunctions/logMemberMuteRejoin.ts +++ b/backend/src/plugins/Logs/logFunctions/logMemberMuteRejoin.ts @@ -1,5 +1,5 @@ import { GuildMember } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { memberToTemplateSafeMember } from "../../../utils/templateSafeObjects.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logMemberNickChange.ts b/backend/src/plugins/Logs/logFunctions/logMemberNickChange.ts index 90ed0afbd..dd9c94983 100644 --- a/backend/src/plugins/Logs/logFunctions/logMemberNickChange.ts +++ b/backend/src/plugins/Logs/logFunctions/logMemberNickChange.ts @@ -1,5 +1,5 @@ import { GuildMember } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { memberToTemplateSafeMember } from "../../../utils/templateSafeObjects.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logMemberNote.ts b/backend/src/plugins/Logs/logFunctions/logMemberNote.ts index 7d808b5c3..573decfe2 100644 --- a/backend/src/plugins/Logs/logFunctions/logMemberNote.ts +++ b/backend/src/plugins/Logs/logFunctions/logMemberNote.ts @@ -1,5 +1,5 @@ import { User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { UnknownUser } from "../../../utils.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logMemberRestore.ts b/backend/src/plugins/Logs/logFunctions/logMemberRestore.ts index a606a70f2..c2c370c32 100644 --- a/backend/src/plugins/Logs/logFunctions/logMemberRestore.ts +++ b/backend/src/plugins/Logs/logFunctions/logMemberRestore.ts @@ -1,5 +1,5 @@ import { GuildMember } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { memberToTemplateSafeMember } from "../../../utils/templateSafeObjects.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logMemberRoleAdd.ts b/backend/src/plugins/Logs/logFunctions/logMemberRoleAdd.ts index 0c238eeaf..dccae4a80 100644 --- a/backend/src/plugins/Logs/logFunctions/logMemberRoleAdd.ts +++ b/backend/src/plugins/Logs/logFunctions/logMemberRoleAdd.ts @@ -1,5 +1,5 @@ import { GuildMember, Role, User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { UnknownRole } from "../../../utils.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logMemberRoleChanges.ts b/backend/src/plugins/Logs/logFunctions/logMemberRoleChanges.ts index f2388c8eb..04dbc2c71 100644 --- a/backend/src/plugins/Logs/logFunctions/logMemberRoleChanges.ts +++ b/backend/src/plugins/Logs/logFunctions/logMemberRoleChanges.ts @@ -1,5 +1,5 @@ import { GuildMember, Role, User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { UnknownUser } from "../../../utils.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logMemberRoleRemove.ts b/backend/src/plugins/Logs/logFunctions/logMemberRoleRemove.ts index 8dd965ee4..60e3ea0fb 100644 --- a/backend/src/plugins/Logs/logFunctions/logMemberRoleRemove.ts +++ b/backend/src/plugins/Logs/logFunctions/logMemberRoleRemove.ts @@ -1,5 +1,5 @@ import { GuildMember, Role, User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { UnknownRole } from "../../../utils.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logMemberTimedBan.ts b/backend/src/plugins/Logs/logFunctions/logMemberTimedBan.ts index 77454117c..bc2648332 100644 --- a/backend/src/plugins/Logs/logFunctions/logMemberTimedBan.ts +++ b/backend/src/plugins/Logs/logFunctions/logMemberTimedBan.ts @@ -1,5 +1,5 @@ import { User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { UnknownUser } from "../../../utils.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logMemberTimedMute.ts b/backend/src/plugins/Logs/logFunctions/logMemberTimedMute.ts index b3a962376..7b98d66f6 100644 --- a/backend/src/plugins/Logs/logFunctions/logMemberTimedMute.ts +++ b/backend/src/plugins/Logs/logFunctions/logMemberTimedMute.ts @@ -1,5 +1,5 @@ import { User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { UnknownUser } from "../../../utils.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logMemberTimedUnban.ts b/backend/src/plugins/Logs/logFunctions/logMemberTimedUnban.ts index 16a767884..5d409c7e7 100644 --- a/backend/src/plugins/Logs/logFunctions/logMemberTimedUnban.ts +++ b/backend/src/plugins/Logs/logFunctions/logMemberTimedUnban.ts @@ -1,5 +1,5 @@ import { User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { UnknownUser } from "../../../utils.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logMemberTimedUnmute.ts b/backend/src/plugins/Logs/logFunctions/logMemberTimedUnmute.ts index 26d9450fa..c16feb20a 100644 --- a/backend/src/plugins/Logs/logFunctions/logMemberTimedUnmute.ts +++ b/backend/src/plugins/Logs/logFunctions/logMemberTimedUnmute.ts @@ -1,5 +1,5 @@ import { User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { UnknownUser } from "../../../utils.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logMemberUnban.ts b/backend/src/plugins/Logs/logFunctions/logMemberUnban.ts index be6c8aa37..215cbc1ab 100644 --- a/backend/src/plugins/Logs/logFunctions/logMemberUnban.ts +++ b/backend/src/plugins/Logs/logFunctions/logMemberUnban.ts @@ -1,5 +1,5 @@ import { PartialUser, Snowflake, User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { UnknownUser } from "../../../utils.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logMemberUnmute.ts b/backend/src/plugins/Logs/logFunctions/logMemberUnmute.ts index cbf0f74b5..fac06b179 100644 --- a/backend/src/plugins/Logs/logFunctions/logMemberUnmute.ts +++ b/backend/src/plugins/Logs/logFunctions/logMemberUnmute.ts @@ -1,5 +1,5 @@ import { User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { UnknownUser } from "../../../utils.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logMemberWarn.ts b/backend/src/plugins/Logs/logFunctions/logMemberWarn.ts index 51c9c277d..8d5ed146a 100644 --- a/backend/src/plugins/Logs/logFunctions/logMemberWarn.ts +++ b/backend/src/plugins/Logs/logFunctions/logMemberWarn.ts @@ -1,5 +1,5 @@ import { GuildMember } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { memberToTemplateSafeMember } from "../../../utils/templateSafeObjects.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logMessageDelete.ts b/backend/src/plugins/Logs/logFunctions/logMessageDelete.ts index 1952d0213..2955e7dbe 100644 --- a/backend/src/plugins/Logs/logFunctions/logMessageDelete.ts +++ b/backend/src/plugins/Logs/logFunctions/logMessageDelete.ts @@ -1,5 +1,5 @@ import { GuildTextBasedChannel, User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import moment from "moment-timezone"; import { LogType } from "../../../data/LogType.js"; import { ISavedMessageAttachmentData, SavedMessage } from "../../../data/entities/SavedMessage.js"; @@ -14,6 +14,7 @@ import { import { TimeAndDatePlugin } from "../../TimeAndDate/TimeAndDatePlugin.js"; import { LogsPluginType } from "../types.js"; import { log } from "../util/log.js"; +import { getMessageReplyLogInfo } from "../util/getMessageReplyLogInfo.js"; export interface LogMessageDeleteData { user: User | UnknownUser; @@ -21,7 +22,7 @@ export interface LogMessageDeleteData { message: SavedMessage; } -export function logMessageDelete(pluginData: GuildPluginData, data: LogMessageDeleteData) { +export async function logMessageDelete(pluginData: GuildPluginData, data: LogMessageDeleteData) { // Replace attachment URLs with media URLs if (data.message.data.attachments) { for (const attachment of data.message.data.attachments as ISavedMessageAttachmentData[]) { @@ -33,6 +34,8 @@ export function logMessageDelete(pluginData: GuildPluginData, da const config = pluginData.config.get(); const timestampFormat = config.timestamp_format ?? undefined; + const { replyInfo, reply } = await getMessageReplyLogInfo(pluginData, data.message); + return log( pluginData, LogType.MESSAGE_DELETE, @@ -44,6 +47,8 @@ export function logMessageDelete(pluginData: GuildPluginData, da .getPlugin(TimeAndDatePlugin) .inGuildTz(moment.utc(data.message.data.timestamp, "x")) .format(timestampFormat), + replyInfo, + reply, }), { userId: data.user.id, diff --git a/backend/src/plugins/Logs/logFunctions/logMessageDeleteAuto.ts b/backend/src/plugins/Logs/logFunctions/logMessageDeleteAuto.ts index bb4a36e7d..f2d3ab92a 100644 --- a/backend/src/plugins/Logs/logFunctions/logMessageDeleteAuto.ts +++ b/backend/src/plugins/Logs/logFunctions/logMessageDeleteAuto.ts @@ -1,9 +1,9 @@ import { GuildBasedChannel, User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; -import { SavedMessage } from "../../../data/entities/SavedMessage.js"; +import { ISavedMessageAttachmentData, SavedMessage } from "../../../data/entities/SavedMessage.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; -import { UnknownUser } from "../../../utils.js"; +import { UnknownUser, useMediaUrls } from "../../../utils.js"; import { resolveChannelIds } from "../../../utils/resolveChannelIds.js"; import { channelToTemplateSafeChannel, @@ -12,6 +12,7 @@ import { } from "../../../utils/templateSafeObjects.js"; import { LogsPluginType } from "../types.js"; import { log } from "../util/log.js"; +import { getMessageReplyLogInfo } from "../util/getMessageReplyLogInfo.js"; export interface LogMessageDeleteAutoData { message: SavedMessage; @@ -20,7 +21,15 @@ export interface LogMessageDeleteAutoData { messageDate: string; } -export function logMessageDeleteAuto(pluginData: GuildPluginData, data: LogMessageDeleteAutoData) { +export async function logMessageDeleteAuto(pluginData: GuildPluginData, data: LogMessageDeleteAutoData) { + if (data.message.data.attachments) { + for (const attachment of data.message.data.attachments as ISavedMessageAttachmentData[]) { + attachment.url = useMediaUrls(attachment.url); + } + } + + const { replyInfo, reply } = await getMessageReplyLogInfo(pluginData, data.message); + return log( pluginData, LogType.MESSAGE_DELETE_AUTO, @@ -29,6 +38,8 @@ export function logMessageDeleteAuto(pluginData: GuildPluginData user: userToTemplateSafeUser(data.user), channel: channelToTemplateSafeChannel(data.channel), messageDate: data.messageDate, + replyInfo, + reply, }), { userId: data.user.id, diff --git a/backend/src/plugins/Logs/logFunctions/logMessageDeleteBare.ts b/backend/src/plugins/Logs/logFunctions/logMessageDeleteBare.ts index ab2579ac2..253c78f16 100644 --- a/backend/src/plugins/Logs/logFunctions/logMessageDeleteBare.ts +++ b/backend/src/plugins/Logs/logFunctions/logMessageDeleteBare.ts @@ -1,5 +1,5 @@ import { GuildTextBasedChannel } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { resolveChannelIds } from "../../../utils/resolveChannelIds.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logMessageDeleteBulk.ts b/backend/src/plugins/Logs/logFunctions/logMessageDeleteBulk.ts index 109727631..54b263a62 100644 --- a/backend/src/plugins/Logs/logFunctions/logMessageDeleteBulk.ts +++ b/backend/src/plugins/Logs/logFunctions/logMessageDeleteBulk.ts @@ -1,5 +1,5 @@ import { GuildTextBasedChannel } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { resolveChannelIds } from "../../../utils/resolveChannelIds.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logMessageEdit.ts b/backend/src/plugins/Logs/logFunctions/logMessageEdit.ts index 8f37aefd4..18340209c 100644 --- a/backend/src/plugins/Logs/logFunctions/logMessageEdit.ts +++ b/backend/src/plugins/Logs/logFunctions/logMessageEdit.ts @@ -1,5 +1,5 @@ import { GuildTextBasedChannel, User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { SavedMessage } from "../../../data/entities/SavedMessage.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logMessageSpamDetected.ts b/backend/src/plugins/Logs/logFunctions/logMessageSpamDetected.ts index bf185bed4..e602a1a6b 100644 --- a/backend/src/plugins/Logs/logFunctions/logMessageSpamDetected.ts +++ b/backend/src/plugins/Logs/logFunctions/logMessageSpamDetected.ts @@ -1,5 +1,5 @@ import { GuildMember, GuildTextBasedChannel } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { resolveChannelIds } from "../../../utils/resolveChannelIds.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logOtherSpamDetected.ts b/backend/src/plugins/Logs/logFunctions/logOtherSpamDetected.ts index 9bd2fa8de..0c3ea3991 100644 --- a/backend/src/plugins/Logs/logFunctions/logOtherSpamDetected.ts +++ b/backend/src/plugins/Logs/logFunctions/logOtherSpamDetected.ts @@ -1,5 +1,5 @@ import { GuildMember } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { memberToTemplateSafeMember } from "../../../utils/templateSafeObjects.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logPostedScheduledMessage.ts b/backend/src/plugins/Logs/logFunctions/logPostedScheduledMessage.ts index ed72d09d4..6a68af445 100644 --- a/backend/src/plugins/Logs/logFunctions/logPostedScheduledMessage.ts +++ b/backend/src/plugins/Logs/logFunctions/logPostedScheduledMessage.ts @@ -1,5 +1,5 @@ import { GuildTextBasedChannel, User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { resolveChannelIds } from "../../../utils/resolveChannelIds.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logRepeatedMessage.ts b/backend/src/plugins/Logs/logFunctions/logRepeatedMessage.ts index 1317a766c..05455be45 100644 --- a/backend/src/plugins/Logs/logFunctions/logRepeatedMessage.ts +++ b/backend/src/plugins/Logs/logFunctions/logRepeatedMessage.ts @@ -1,5 +1,5 @@ import { GuildTextBasedChannel, User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { resolveChannelIds } from "../../../utils/resolveChannelIds.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logRoleCreate.ts b/backend/src/plugins/Logs/logFunctions/logRoleCreate.ts index d90acfaca..c5afa161c 100644 --- a/backend/src/plugins/Logs/logFunctions/logRoleCreate.ts +++ b/backend/src/plugins/Logs/logFunctions/logRoleCreate.ts @@ -1,5 +1,5 @@ import { Role } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { roleToTemplateSafeRole } from "../../../utils/templateSafeObjects.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logRoleDelete.ts b/backend/src/plugins/Logs/logFunctions/logRoleDelete.ts index c41149a43..901af3f1b 100644 --- a/backend/src/plugins/Logs/logFunctions/logRoleDelete.ts +++ b/backend/src/plugins/Logs/logFunctions/logRoleDelete.ts @@ -1,5 +1,5 @@ import { Role } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { roleToTemplateSafeRole } from "../../../utils/templateSafeObjects.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logRoleUpdate.ts b/backend/src/plugins/Logs/logFunctions/logRoleUpdate.ts index 63f04e329..26b64941d 100644 --- a/backend/src/plugins/Logs/logFunctions/logRoleUpdate.ts +++ b/backend/src/plugins/Logs/logFunctions/logRoleUpdate.ts @@ -1,5 +1,5 @@ import { Role } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { roleToTemplateSafeRole } from "../../../utils/templateSafeObjects.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logScheduledMessage.ts b/backend/src/plugins/Logs/logFunctions/logScheduledMessage.ts index 2d8af0b55..52b021c5c 100644 --- a/backend/src/plugins/Logs/logFunctions/logScheduledMessage.ts +++ b/backend/src/plugins/Logs/logFunctions/logScheduledMessage.ts @@ -1,5 +1,5 @@ import { GuildTextBasedChannel, User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { resolveChannelIds } from "../../../utils/resolveChannelIds.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logScheduledRepeatedMessage.ts b/backend/src/plugins/Logs/logFunctions/logScheduledRepeatedMessage.ts index 2e1cbca21..522f8f953 100644 --- a/backend/src/plugins/Logs/logFunctions/logScheduledRepeatedMessage.ts +++ b/backend/src/plugins/Logs/logFunctions/logScheduledRepeatedMessage.ts @@ -1,5 +1,5 @@ import { GuildTextBasedChannel, User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { resolveChannelIds } from "../../../utils/resolveChannelIds.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logSetAntiraidAuto.ts b/backend/src/plugins/Logs/logFunctions/logSetAntiraidAuto.ts index 492c46647..c9153f008 100644 --- a/backend/src/plugins/Logs/logFunctions/logSetAntiraidAuto.ts +++ b/backend/src/plugins/Logs/logFunctions/logSetAntiraidAuto.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { LogsPluginType } from "../types.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logSetAntiraidUser.ts b/backend/src/plugins/Logs/logFunctions/logSetAntiraidUser.ts index 3c8b56858..ff75c444e 100644 --- a/backend/src/plugins/Logs/logFunctions/logSetAntiraidUser.ts +++ b/backend/src/plugins/Logs/logFunctions/logSetAntiraidUser.ts @@ -1,5 +1,5 @@ import { User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { userToTemplateSafeUser } from "../../../utils/templateSafeObjects.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logStageInstanceCreate.ts b/backend/src/plugins/Logs/logFunctions/logStageInstanceCreate.ts index 7cc10f5f0..01499ed51 100644 --- a/backend/src/plugins/Logs/logFunctions/logStageInstanceCreate.ts +++ b/backend/src/plugins/Logs/logFunctions/logStageInstanceCreate.ts @@ -1,5 +1,5 @@ import { StageChannel, StageInstance } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { resolveChannelIds } from "../../../utils/resolveChannelIds.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logStageInstanceDelete.ts b/backend/src/plugins/Logs/logFunctions/logStageInstanceDelete.ts index b520fc8d4..ada827fb4 100644 --- a/backend/src/plugins/Logs/logFunctions/logStageInstanceDelete.ts +++ b/backend/src/plugins/Logs/logFunctions/logStageInstanceDelete.ts @@ -1,5 +1,5 @@ import { StageChannel, StageInstance } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { resolveChannelIds } from "../../../utils/resolveChannelIds.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logStageInstanceUpdate.ts b/backend/src/plugins/Logs/logFunctions/logStageInstanceUpdate.ts index 04679db8c..915b360db 100644 --- a/backend/src/plugins/Logs/logFunctions/logStageInstanceUpdate.ts +++ b/backend/src/plugins/Logs/logFunctions/logStageInstanceUpdate.ts @@ -1,5 +1,5 @@ import { StageChannel, StageInstance } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { resolveChannelIds } from "../../../utils/resolveChannelIds.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logStickerCreate.ts b/backend/src/plugins/Logs/logFunctions/logStickerCreate.ts index 4cd8dfdf7..6ae029747 100644 --- a/backend/src/plugins/Logs/logFunctions/logStickerCreate.ts +++ b/backend/src/plugins/Logs/logFunctions/logStickerCreate.ts @@ -1,5 +1,5 @@ import { Sticker } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { stickerToTemplateSafeSticker } from "../../../utils/templateSafeObjects.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logStickerDelete.ts b/backend/src/plugins/Logs/logFunctions/logStickerDelete.ts index 8ff9ecaa6..d05e13f57 100644 --- a/backend/src/plugins/Logs/logFunctions/logStickerDelete.ts +++ b/backend/src/plugins/Logs/logFunctions/logStickerDelete.ts @@ -1,5 +1,5 @@ import { Sticker } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { stickerToTemplateSafeSticker } from "../../../utils/templateSafeObjects.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logStickerUpdate.ts b/backend/src/plugins/Logs/logFunctions/logStickerUpdate.ts index 568dbf922..0efc1c963 100644 --- a/backend/src/plugins/Logs/logFunctions/logStickerUpdate.ts +++ b/backend/src/plugins/Logs/logFunctions/logStickerUpdate.ts @@ -1,5 +1,5 @@ import { Sticker } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { stickerToTemplateSafeSticker } from "../../../utils/templateSafeObjects.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logThreadCreate.ts b/backend/src/plugins/Logs/logFunctions/logThreadCreate.ts index 0e0e8397f..e091a18a4 100644 --- a/backend/src/plugins/Logs/logFunctions/logThreadCreate.ts +++ b/backend/src/plugins/Logs/logFunctions/logThreadCreate.ts @@ -1,5 +1,5 @@ import { AnyThreadChannel } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { resolveChannelIds } from "../../../utils/resolveChannelIds.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logThreadDelete.ts b/backend/src/plugins/Logs/logFunctions/logThreadDelete.ts index 03f6537ee..477f2e1e8 100644 --- a/backend/src/plugins/Logs/logFunctions/logThreadDelete.ts +++ b/backend/src/plugins/Logs/logFunctions/logThreadDelete.ts @@ -1,5 +1,5 @@ import { AnyThreadChannel } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { resolveChannelIds } from "../../../utils/resolveChannelIds.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logThreadUpdate.ts b/backend/src/plugins/Logs/logFunctions/logThreadUpdate.ts index 824175c52..d344b0728 100644 --- a/backend/src/plugins/Logs/logFunctions/logThreadUpdate.ts +++ b/backend/src/plugins/Logs/logFunctions/logThreadUpdate.ts @@ -1,5 +1,5 @@ import { AnyThreadChannel } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { resolveChannelIds } from "../../../utils/resolveChannelIds.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logVoiceChannelForceDisconnect.ts b/backend/src/plugins/Logs/logFunctions/logVoiceChannelForceDisconnect.ts index 1cfab49e3..7ee5afbe4 100644 --- a/backend/src/plugins/Logs/logFunctions/logVoiceChannelForceDisconnect.ts +++ b/backend/src/plugins/Logs/logFunctions/logVoiceChannelForceDisconnect.ts @@ -1,5 +1,5 @@ import { GuildMember, User, VoiceBasedChannel } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { resolveChannelIds } from "../../../utils/resolveChannelIds.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logVoiceChannelForceMove.ts b/backend/src/plugins/Logs/logFunctions/logVoiceChannelForceMove.ts index d6b9a7d09..3873840f7 100644 --- a/backend/src/plugins/Logs/logFunctions/logVoiceChannelForceMove.ts +++ b/backend/src/plugins/Logs/logFunctions/logVoiceChannelForceMove.ts @@ -1,5 +1,5 @@ import { GuildMember, User, VoiceBasedChannel } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { resolveChannelIds } from "../../../utils/resolveChannelIds.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logVoiceChannelJoin.ts b/backend/src/plugins/Logs/logFunctions/logVoiceChannelJoin.ts index 576849d45..dfe4b217a 100644 --- a/backend/src/plugins/Logs/logFunctions/logVoiceChannelJoin.ts +++ b/backend/src/plugins/Logs/logFunctions/logVoiceChannelJoin.ts @@ -1,5 +1,5 @@ import { GuildMember, VoiceBasedChannel } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { resolveChannelIds } from "../../../utils/resolveChannelIds.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logVoiceChannelLeave.ts b/backend/src/plugins/Logs/logFunctions/logVoiceChannelLeave.ts index a283434df..7525d734e 100644 --- a/backend/src/plugins/Logs/logFunctions/logVoiceChannelLeave.ts +++ b/backend/src/plugins/Logs/logFunctions/logVoiceChannelLeave.ts @@ -1,5 +1,5 @@ import { GuildMember, VoiceBasedChannel } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { resolveChannelIds } from "../../../utils/resolveChannelIds.js"; diff --git a/backend/src/plugins/Logs/logFunctions/logVoiceChannelMove.ts b/backend/src/plugins/Logs/logFunctions/logVoiceChannelMove.ts index ceead506c..f2d795c20 100644 --- a/backend/src/plugins/Logs/logFunctions/logVoiceChannelMove.ts +++ b/backend/src/plugins/Logs/logFunctions/logVoiceChannelMove.ts @@ -1,5 +1,5 @@ import { GuildMember, VoiceBasedChannel } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; import { resolveChannelIds } from "../../../utils/resolveChannelIds.js"; diff --git a/backend/src/plugins/Logs/types.ts b/backend/src/plugins/Logs/types.ts index 1efbbc628..6246e3e21 100644 --- a/backend/src/plugins/Logs/types.ts +++ b/backend/src/plugins/Logs/types.ts @@ -1,12 +1,12 @@ -import { BasePluginType, CooldownManager, guildPluginEventListener } from "knub"; -import { z } from "zod/v4"; +import { BasePluginType, CooldownManager, guildPluginEventListener } from "vety"; +import { z } from "zod"; import { RegExpRunner } from "../../RegExpRunner.js"; import { GuildArchives } from "../../data/GuildArchives.js"; import { GuildCases } from "../../data/GuildCases.js"; import { GuildLogs } from "../../data/GuildLogs.js"; import { GuildSavedMessages } from "../../data/GuildSavedMessages.js"; import { LogType } from "../../data/LogType.js"; -import { keys, zBoundedCharacters, zEmbedInput, zMessageContent, zRegex, zSnowflake, zStrictMessageContent } from "../../utils.js"; +import { keys, zBoundedCharacters, zMessageContent, zRegex, zSnowflake } from "../../utils.js"; import { MessageBuffer } from "../../utils/MessageBuffer.js"; import { TemplateSafeCase, @@ -21,7 +21,9 @@ import { TemplateSafeUnknownUser, TemplateSafeUser, } from "../../utils/templateSafeObjects.js"; +import { TemplateSafeValueContainer } from "../../templateFormatter.js"; import DefaultLogMessages from "../../data/DefaultLogMessages.json" with { type: "json" }; +import { TemplateSafeValueContainer } from "templateFormatter.js"; const DEFAULT_BATCH_TIME = 1000; const MIN_BATCH_TIME = 250; @@ -30,10 +32,13 @@ const MAX_BATCH_TIME = 5000; // A bit of a workaround so we can pass LogType keys to z.enum() const zMessageContentWithDefault = zMessageContent.default(""); const logTypes = keys(LogType); -const logTypeProps = logTypes.reduce((map, type) => { - map[type] = zMessageContent.default(DefaultLogMessages[type] || ""); - return map; -}, {} as Record); +const logTypeProps = logTypes.reduce( + (map, type) => { + map[type] = zMessageContent.default(DefaultLogMessages[type] || ""); + return map; + }, + {} as Record, +); const zLogFormats = z.strictObject(logTypeProps); const zLogChannel = z.strictObject({ @@ -236,6 +241,8 @@ export const LogTypeData = z.object({ channel: z.instanceof(TemplateSafeChannel), messageDate: z.string(), message: z.instanceof(TemplateSafeSavedMessage), + replyInfo: z.string(), + reply: z.instanceof(TemplateSafeValueContainer).nullable(), }), [LogType.MESSAGE_DELETE_BULK]: z.object({ @@ -486,6 +493,8 @@ export const LogTypeData = z.object({ user: z.instanceof(TemplateSafeUser), channel: z.instanceof(TemplateSafeChannel), messageDate: z.string(), + replyInfo: z.string(), + reply: z.instanceof(TemplateSafeValueContainer).nullable(), }), [LogType.SET_ANTIRAID_USER]: z.object({ diff --git a/backend/src/plugins/Logs/util/getLogMessage.ts b/backend/src/plugins/Logs/util/getLogMessage.ts index 30c92087b..91ffc5ba4 100644 --- a/backend/src/plugins/Logs/util/getLogMessage.ts +++ b/backend/src/plugins/Logs/util/getLogMessage.ts @@ -1,5 +1,5 @@ import { MessageCreateOptions } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { SavedMessage } from "../../../data/entities/SavedMessage.js"; import { LogType } from "../../../data/LogType.js"; import { logger } from "../../../logger.js"; diff --git a/backend/src/plugins/Logs/util/getMessageReplyLogInfo.ts b/backend/src/plugins/Logs/util/getMessageReplyLogInfo.ts new file mode 100644 index 000000000..baa530ec6 --- /dev/null +++ b/backend/src/plugins/Logs/util/getMessageReplyLogInfo.ts @@ -0,0 +1,60 @@ +import { GuildPluginData } from "vety"; +import { ISavedMessageAttachmentData, SavedMessage } from "../../../data/entities/SavedMessage.js"; +import { messageLink, messageSummary, useMediaUrls } from "../../../utils.js"; +import { TemplateSafeValueContainer } from "../../../templateFormatter.js"; +import { savedMessageToTemplateSafeSavedMessage, TemplateSafeSavedMessage } from "../../../utils/templateSafeObjects.js"; +import { LogsPluginType } from "../types.js"; + +export interface MessageReplyLogInfo { + replyInfo: string; + reply: TemplateSafeValueContainer | null; +} + +export async function getMessageReplyLogInfo( + pluginData: GuildPluginData, + message: SavedMessage, +): Promise { + const reference = message.data.reference; + if (!reference?.messageId || !reference.channelId) { + return { replyInfo: "", reply: null }; + } + + const link = messageLink(reference.guildId ?? message.guild_id, reference.channelId, reference.messageId); + let replyInfo = `\n**Replied To:** [Jump to message](${link})`; + + const referencedMessage = await pluginData.state.savedMessages.find(reference.messageId, true); + + let timestamp: string | null = null; + let summary: string | null = null; + let timestampMs: number | null = null; + let templateSafeMessage: TemplateSafeSavedMessage | null = null; + + if (referencedMessage) { + if (referencedMessage.data.attachments) { + for (const attachment of referencedMessage.data.attachments as ISavedMessageAttachmentData[]) { + attachment.url = useMediaUrls(attachment.url); + } + } + + timestampMs = referencedMessage.data.timestamp; + timestamp = ``; + replyInfo += ` (posted at ${timestamp})`; + + summary = messageSummary(referencedMessage); + if (summary) { + replyInfo += `\n${summary}`; + } + + templateSafeMessage = savedMessageToTemplateSafeSavedMessage(referencedMessage); + } + + const reply = new TemplateSafeValueContainer({ + link, + timestamp, + timestampMs, + summary, + message: templateSafeMessage, + }); + + return { replyInfo, reply }; +} diff --git a/backend/src/plugins/Logs/util/isLogIgnored.ts b/backend/src/plugins/Logs/util/isLogIgnored.ts index 578c33b34..b48c4898a 100644 --- a/backend/src/plugins/Logs/util/isLogIgnored.ts +++ b/backend/src/plugins/Logs/util/isLogIgnored.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { LogsPluginType } from "../types.js"; diff --git a/backend/src/plugins/Logs/util/log.ts b/backend/src/plugins/Logs/util/log.ts index 94d399c70..2ea857d30 100644 --- a/backend/src/plugins/Logs/util/log.ts +++ b/backend/src/plugins/Logs/util/log.ts @@ -1,5 +1,5 @@ import { APIEmbed, MessageMentionTypes, Snowflake } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { allowTimeout } from "../../../RegExpRunner.js"; import { LogType } from "../../../data/LogType.js"; import { TypedTemplateSafeValueContainer } from "../../../templateFormatter.js"; diff --git a/backend/src/plugins/Logs/util/onMessageDelete.ts b/backend/src/plugins/Logs/util/onMessageDelete.ts index 2d63e7e1d..604c58d07 100644 --- a/backend/src/plugins/Logs/util/onMessageDelete.ts +++ b/backend/src/plugins/Logs/util/onMessageDelete.ts @@ -1,5 +1,5 @@ import { Snowflake } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { SavedMessage } from "../../../data/entities/SavedMessage.js"; import { resolveUser } from "../../../utils.js"; @@ -9,7 +9,7 @@ import { LogsPluginType } from "../types.js"; import { isLogIgnored } from "./isLogIgnored.js"; export async function onMessageDelete(pluginData: GuildPluginData, savedMessage: SavedMessage) { - const user = await resolveUser(pluginData.client, savedMessage.user_id); + const user = await resolveUser(pluginData.client, savedMessage.user_id, "Logs:onMessageDelete"); const channel = pluginData.guild.channels.resolve(savedMessage.channel_id as Snowflake); if (!channel?.isTextBased()) { diff --git a/backend/src/plugins/Logs/util/onMessageDeleteBulk.ts b/backend/src/plugins/Logs/util/onMessageDeleteBulk.ts index 2165eb1c7..ef220a95a 100644 --- a/backend/src/plugins/Logs/util/onMessageDeleteBulk.ts +++ b/backend/src/plugins/Logs/util/onMessageDeleteBulk.ts @@ -1,5 +1,5 @@ import { Snowflake } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../data/LogType.js"; import { SavedMessage } from "../../../data/entities/SavedMessage.js"; import { getBaseUrl } from "../../../pluginUtils.js"; diff --git a/backend/src/plugins/Logs/util/onMessageUpdate.ts b/backend/src/plugins/Logs/util/onMessageUpdate.ts index ecc9a5f12..35455ee4e 100644 --- a/backend/src/plugins/Logs/util/onMessageUpdate.ts +++ b/backend/src/plugins/Logs/util/onMessageUpdate.ts @@ -1,5 +1,5 @@ import { EmbedData, GuildTextBasedChannel, Snowflake } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { SavedMessage } from "../../../data/entities/SavedMessage.js"; import { resolveUser } from "../../../utils.js"; import { logMessageEdit } from "../logFunctions/logMessageEdit.js"; @@ -45,7 +45,7 @@ export async function onMessageUpdate( return; } - const user = await resolveUser(pluginData.client, savedMessage.user_id); + const user = await resolveUser(pluginData.client, savedMessage.user_id, "Logs:onMessageUpdate"); const channel = pluginData.guild.channels.resolve(savedMessage.channel_id as Snowflake)! as GuildTextBasedChannel; logMessageEdit(pluginData, { diff --git a/backend/src/plugins/MessageSaver/MessageSaverPlugin.ts b/backend/src/plugins/MessageSaver/MessageSaverPlugin.ts index fcdf53019..35bc3e543 100644 --- a/backend/src/plugins/MessageSaver/MessageSaverPlugin.ts +++ b/backend/src/plugins/MessageSaver/MessageSaverPlugin.ts @@ -1,4 +1,4 @@ -import { guildPlugin } from "knub"; +import { guildPlugin } from "vety"; import { GuildSavedMessages } from "../../data/GuildSavedMessages.js"; import { CommonPlugin } from "../Common/CommonPlugin.js"; import { SaveMessagesToDBCmd } from "./commands/SaveMessagesToDB.js"; diff --git a/backend/src/plugins/MessageSaver/saveMessagesToDB.ts b/backend/src/plugins/MessageSaver/saveMessagesToDB.ts index 01aa85cbe..68dc98802 100644 --- a/backend/src/plugins/MessageSaver/saveMessagesToDB.ts +++ b/backend/src/plugins/MessageSaver/saveMessagesToDB.ts @@ -1,5 +1,5 @@ import { GuildTextBasedChannel, Message } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { MessageSaverPluginType } from "./types.js"; export async function saveMessagesToDB( diff --git a/backend/src/plugins/MessageSaver/types.ts b/backend/src/plugins/MessageSaver/types.ts index d1f0e77ef..197971212 100644 --- a/backend/src/plugins/MessageSaver/types.ts +++ b/backend/src/plugins/MessageSaver/types.ts @@ -1,5 +1,5 @@ -import { BasePluginType, guildPluginEventListener, guildPluginMessageCommand, pluginUtils } from "knub"; -import z from "zod/v4"; +import { BasePluginType, guildPluginEventListener, guildPluginMessageCommand, pluginUtils } from "vety"; +import { z } from "zod"; import { GuildSavedMessages } from "../../data/GuildSavedMessages.js"; import { CommonPlugin } from "../Common/CommonPlugin.js"; diff --git a/backend/src/plugins/ModActions/ModActionsPlugin.ts b/backend/src/plugins/ModActions/ModActionsPlugin.ts index 80c756800..dcacbdba6 100644 --- a/backend/src/plugins/ModActions/ModActionsPlugin.ts +++ b/backend/src/plugins/ModActions/ModActionsPlugin.ts @@ -1,6 +1,6 @@ import { Message } from "discord.js"; import { EventEmitter } from "events"; -import { guildPlugin } from "knub"; +import { guildPlugin } from "vety"; import { Queue } from "../../Queue.js"; import { GuildCases } from "../../data/GuildCases.js"; import { onGuildEvent } from "../../data/GuildEvents.js"; diff --git a/backend/src/plugins/ModActions/commands/addcase/AddCaseMsgCmd.ts b/backend/src/plugins/ModActions/commands/addcase/AddCaseMsgCmd.ts index 938bc28fd..d238711aa 100644 --- a/backend/src/plugins/ModActions/commands/addcase/AddCaseMsgCmd.ts +++ b/backend/src/plugins/ModActions/commands/addcase/AddCaseMsgCmd.ts @@ -25,7 +25,7 @@ export const AddCaseMsgCmd = modActionsMsgCmd({ ], async run({ pluginData, message: msg, args }) { - const user = await resolveUser(pluginData.client, args.user); + const user = await resolveUser(pluginData.client, args.user, "ModActions:AddCaseCmd"); if (!user.id) { pluginData.state.common.sendErrorMessage(msg, `User not found`); return; diff --git a/backend/src/plugins/ModActions/commands/addcase/AddCaseSlashCmd.ts b/backend/src/plugins/ModActions/commands/addcase/AddCaseSlashCmd.ts index a8d4408c7..e77d06e67 100644 --- a/backend/src/plugins/ModActions/commands/addcase/AddCaseSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/addcase/AddCaseSlashCmd.ts @@ -1,5 +1,5 @@ import { GuildMember } from "discord.js"; -import { slashOptions } from "knub"; +import { slashOptions } from "vety"; import { CaseTypes } from "../../../../data/CaseTypes.js"; import { hasPermission } from "../../../../pluginUtils.js"; import { resolveMember } from "../../../../utils.js"; diff --git a/backend/src/plugins/ModActions/commands/addcase/actualAddCaseCmd.ts b/backend/src/plugins/ModActions/commands/addcase/actualAddCaseCmd.ts index b6ec6a56e..0dfaa1dc8 100644 --- a/backend/src/plugins/ModActions/commands/addcase/actualAddCaseCmd.ts +++ b/backend/src/plugins/ModActions/commands/addcase/actualAddCaseCmd.ts @@ -1,5 +1,5 @@ import { Attachment, ChatInputCommandInteraction, GuildMember, Message, User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { CaseTypes } from "../../../../data/CaseTypes.js"; import { Case } from "../../../../data/entities/Case.js"; import { canActOn } from "../../../../pluginUtils.js"; diff --git a/backend/src/plugins/ModActions/commands/ban/BanMsgCmd.ts b/backend/src/plugins/ModActions/commands/ban/BanMsgCmd.ts index da109c96a..55c460b86 100644 --- a/backend/src/plugins/ModActions/commands/ban/BanMsgCmd.ts +++ b/backend/src/plugins/ModActions/commands/ban/BanMsgCmd.ts @@ -34,7 +34,7 @@ export const BanMsgCmd = modActionsMsgCmd({ ], async run({ pluginData, message: msg, args }) { - const user = await resolveUser(pluginData.client, args.user); + const user = await resolveUser(pluginData.client, args.user, "ModActions:BanMsgCmd"); if (!user.id) { pluginData.state.common.sendErrorMessage(msg, `User not found`); diff --git a/backend/src/plugins/ModActions/commands/ban/BanSlashCmd.ts b/backend/src/plugins/ModActions/commands/ban/BanSlashCmd.ts index 05fe4c5c5..6fe438a48 100644 --- a/backend/src/plugins/ModActions/commands/ban/BanSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/ban/BanSlashCmd.ts @@ -1,5 +1,5 @@ import { ChannelType, GuildMember } from "discord.js"; -import { slashOptions } from "knub"; +import { slashOptions } from "vety"; import { hasPermission } from "../../../../pluginUtils.js"; import { UserNotificationMethod, convertDelayStringToMS, resolveMember } from "../../../../utils.js"; import { generateAttachmentSlashOptions, retrieveMultipleOptions } from "../../../../utils/multipleSlashOptions.js"; diff --git a/backend/src/plugins/ModActions/commands/ban/actualBanCmd.ts b/backend/src/plugins/ModActions/commands/ban/actualBanCmd.ts index 4ae8c127b..3146b9039 100644 --- a/backend/src/plugins/ModActions/commands/ban/actualBanCmd.ts +++ b/backend/src/plugins/ModActions/commands/ban/actualBanCmd.ts @@ -1,6 +1,6 @@ import { Attachment, ChatInputCommandInteraction, GuildMember, Message, User } from "discord.js"; -import { GuildPluginData } from "knub"; -import { getMemberLevel } from "knub/helpers"; +import { GuildPluginData } from "vety"; +import { getMemberLevel } from "vety/helpers"; import { CaseTypes } from "../../../../data/CaseTypes.js"; import { clearExpiringTempban, registerExpiringTempban } from "../../../../data/loops/expiringTempbansLoop.js"; import { humanizeDuration } from "../../../../humanizeDuration.js"; diff --git a/backend/src/plugins/ModActions/commands/case/CaseMsgCmd.ts b/backend/src/plugins/ModActions/commands/case/CaseMsgCmd.ts index 211e529fa..681a997e2 100644 --- a/backend/src/plugins/ModActions/commands/case/CaseMsgCmd.ts +++ b/backend/src/plugins/ModActions/commands/case/CaseMsgCmd.ts @@ -2,10 +2,6 @@ import { commandTypeHelpers as ct } from "../../../../commandTypes.js"; import { modActionsMsgCmd } from "../../types.js"; import { actualCaseCmd } from "./actualCaseCmd.js"; -const opts = { - show: ct.switchOption({ def: false, shortcut: "sh" }), -}; - export const CaseMsgCmd = modActionsMsgCmd({ trigger: "case", permission: "can_view", @@ -14,12 +10,10 @@ export const CaseMsgCmd = modActionsMsgCmd({ signature: [ { caseNumber: ct.number(), - - ...opts, }, ], async run({ pluginData, message: msg, args }) { - actualCaseCmd(pluginData, msg, msg.author.id, args.caseNumber, args.show); + actualCaseCmd(pluginData, msg, msg.author.id, args.caseNumber); }, }); diff --git a/backend/src/plugins/ModActions/commands/case/CaseSlashCmd.ts b/backend/src/plugins/ModActions/commands/case/CaseSlashCmd.ts index c2c7eccc9..33d57b167 100644 --- a/backend/src/plugins/ModActions/commands/case/CaseSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/case/CaseSlashCmd.ts @@ -1,4 +1,4 @@ -import { slashOptions } from "knub"; +import { slashOptions } from "vety"; import { modActionsSlashCmd } from "../../types.js"; import { actualCaseCmd } from "./actualCaseCmd.js"; diff --git a/backend/src/plugins/ModActions/commands/case/actualCaseCmd.ts b/backend/src/plugins/ModActions/commands/case/actualCaseCmd.ts index 15af3e497..2f03d02d0 100644 --- a/backend/src/plugins/ModActions/commands/case/actualCaseCmd.ts +++ b/backend/src/plugins/ModActions/commands/case/actualCaseCmd.ts @@ -1,5 +1,5 @@ import { ChatInputCommandInteraction, Message } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { sendContextResponse } from "../../../../pluginUtils.js"; import { CasesPlugin } from "../../../Cases/CasesPlugin.js"; import { ModActionsPluginType } from "../../types.js"; @@ -9,7 +9,7 @@ export async function actualCaseCmd( context: Message | ChatInputCommandInteraction, authorId: string, caseNumber: number, - show: boolean | null, + show?: boolean | null, ) { const theCase = await pluginData.state.cases.findByCaseNumber(caseNumber); diff --git a/backend/src/plugins/ModActions/commands/cases/CasesSlashCmd.ts b/backend/src/plugins/ModActions/commands/cases/CasesSlashCmd.ts index 4a9d3e153..eec7f1916 100644 --- a/backend/src/plugins/ModActions/commands/cases/CasesSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/cases/CasesSlashCmd.ts @@ -1,5 +1,5 @@ import { GuildMember } from "discord.js"; -import { slashOptions } from "knub"; +import { slashOptions } from "vety"; import { modActionsSlashCmd } from "../../types.js"; import { actualCasesCmd } from "./actualCasesCmd.js"; diff --git a/backend/src/plugins/ModActions/commands/cases/CasesUserMsgCmd.ts b/backend/src/plugins/ModActions/commands/cases/CasesUserMsgCmd.ts index dac005061..88cca4384 100644 --- a/backend/src/plugins/ModActions/commands/cases/CasesUserMsgCmd.ts +++ b/backend/src/plugins/ModActions/commands/cases/CasesUserMsgCmd.ts @@ -35,7 +35,7 @@ export const CasesUserMsgCmd = modActionsMsgCmd({ async run({ pluginData, message: msg, args }) { const user = (await resolveMember(pluginData.client, pluginData.guild, args.user)) || - (await resolveUser(pluginData.client, args.user)); + (await resolveUser(pluginData.client, args.user, "ModActions:CasesUserMsgCmd")); if (user instanceof UnknownUser) { pluginData.state.common.sendErrorMessage(msg, `User not found`); diff --git a/backend/src/plugins/ModActions/commands/cases/actualCasesCmd.ts b/backend/src/plugins/ModActions/commands/cases/actualCasesCmd.ts index 1f668c70c..b0be8439c 100644 --- a/backend/src/plugins/ModActions/commands/cases/actualCasesCmd.ts +++ b/backend/src/plugins/ModActions/commands/cases/actualCasesCmd.ts @@ -1,5 +1,5 @@ import { APIEmbed, ChatInputCommandInteraction, GuildMember, Message, User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { FindOptionsWhere, In } from "typeorm"; import { CaseTypes } from "../../../../data/CaseTypes.js"; import { Case } from "../../../../data/entities/Case.js"; @@ -235,7 +235,7 @@ export async function actualCasesCmd( show: boolean | null, ) { const mod = modId - ? (await resolveMember(pluginData.client, pluginData.guild, modId)) || (await resolveUser(pluginData.client, modId)) + ? (await resolveMember(pluginData.client, pluginData.guild, modId)) || (await resolveUser(pluginData.client, modId, "ModActions:actualCasesCmd")) : null; const modName = modId ? (mod instanceof UnknownUser ? modId : renderUsername(mod!)) : renderUsername(author); diff --git a/backend/src/plugins/ModActions/commands/deletecase/DeleteCaseSlashCmd.ts b/backend/src/plugins/ModActions/commands/deletecase/DeleteCaseSlashCmd.ts index b324c6e32..52a76c27f 100644 --- a/backend/src/plugins/ModActions/commands/deletecase/DeleteCaseSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/deletecase/DeleteCaseSlashCmd.ts @@ -1,5 +1,5 @@ import { GuildMember } from "discord.js"; -import { slashOptions } from "knub"; +import { slashOptions } from "vety"; import { modActionsSlashCmd } from "../../types.js"; import { actualDeleteCaseCmd } from "./actualDeleteCaseCmd.js"; diff --git a/backend/src/plugins/ModActions/commands/deletecase/actualDeleteCaseCmd.ts b/backend/src/plugins/ModActions/commands/deletecase/actualDeleteCaseCmd.ts index dc494c549..42c62805e 100644 --- a/backend/src/plugins/ModActions/commands/deletecase/actualDeleteCaseCmd.ts +++ b/backend/src/plugins/ModActions/commands/deletecase/actualDeleteCaseCmd.ts @@ -1,5 +1,5 @@ import { ChatInputCommandInteraction, GuildMember, Message } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { Case } from "../../../../data/entities/Case.js"; import { getContextChannel } from "../../../../pluginUtils.js"; import { confirm, renderUsername } from "../../../../utils.js"; diff --git a/backend/src/plugins/ModActions/commands/forceban/ForceBanMsgCmd.ts b/backend/src/plugins/ModActions/commands/forceban/ForceBanMsgCmd.ts index d6323098e..4b30ca011 100644 --- a/backend/src/plugins/ModActions/commands/forceban/ForceBanMsgCmd.ts +++ b/backend/src/plugins/ModActions/commands/forceban/ForceBanMsgCmd.ts @@ -24,7 +24,7 @@ export const ForceBanMsgCmd = modActionsMsgCmd({ ], async run({ pluginData, message: msg, args }) { - const user = await resolveUser(pluginData.client, args.user); + const user = await resolveUser(pluginData.client, args.user, "ModActions:ForceBanMsgCmd"); if (!user.id) { pluginData.state.common.sendErrorMessage(msg, `User not found`); return; diff --git a/backend/src/plugins/ModActions/commands/forceban/ForceBanSlashCmd.ts b/backend/src/plugins/ModActions/commands/forceban/ForceBanSlashCmd.ts index 61fc94115..195be332e 100644 --- a/backend/src/plugins/ModActions/commands/forceban/ForceBanSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/forceban/ForceBanSlashCmd.ts @@ -1,5 +1,5 @@ import { GuildMember } from "discord.js"; -import { slashOptions } from "knub"; +import { slashOptions } from "vety"; import { hasPermission } from "../../../../pluginUtils.js"; import { convertDelayStringToMS, resolveMember } from "../../../../utils.js"; import { generateAttachmentSlashOptions, retrieveMultipleOptions } from "../../../../utils/multipleSlashOptions.js"; diff --git a/backend/src/plugins/ModActions/commands/forceban/actualForceBanCmd.ts b/backend/src/plugins/ModActions/commands/forceban/actualForceBanCmd.ts index 63495c62f..18554cf8e 100644 --- a/backend/src/plugins/ModActions/commands/forceban/actualForceBanCmd.ts +++ b/backend/src/plugins/ModActions/commands/forceban/actualForceBanCmd.ts @@ -1,5 +1,5 @@ import { Attachment, ChatInputCommandInteraction, GuildMember, Message, Snowflake, User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { CaseTypes } from "../../../../data/CaseTypes.js"; import { LogType } from "../../../../data/LogType.js"; import { DAYS, MINUTES, UnknownUser } from "../../../../utils.js"; diff --git a/backend/src/plugins/ModActions/commands/forcemute/ForceMuteMsgCmd.ts b/backend/src/plugins/ModActions/commands/forcemute/ForceMuteMsgCmd.ts index 129eb9e54..9fbfe6e3a 100644 --- a/backend/src/plugins/ModActions/commands/forcemute/ForceMuteMsgCmd.ts +++ b/backend/src/plugins/ModActions/commands/forcemute/ForceMuteMsgCmd.ts @@ -33,7 +33,7 @@ export const ForceMuteMsgCmd = modActionsMsgCmd({ ], async run({ pluginData, message: msg, args }) { - const user = await resolveUser(pluginData.client, args.user); + const user = await resolveUser(pluginData.client, args.user, "ModActions:ForceMuteMsgCmd"); if (!user.id) { pluginData.state.common.sendErrorMessage(msg, `User not found`); return; @@ -77,7 +77,7 @@ export const ForceMuteMsgCmd = modActionsMsgCmd({ [...msg.attachments.values()], mod, ppId, - "time" in args ? args.time ?? undefined : undefined, + "time" in args ? (args.time ?? undefined) : undefined, args.reason, contactMethods, ); diff --git a/backend/src/plugins/ModActions/commands/forcemute/ForceMuteSlashCmd.ts b/backend/src/plugins/ModActions/commands/forcemute/ForceMuteSlashCmd.ts index fabdd2ab2..27ba64cb0 100644 --- a/backend/src/plugins/ModActions/commands/forcemute/ForceMuteSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/forcemute/ForceMuteSlashCmd.ts @@ -1,5 +1,5 @@ import { ChannelType, GuildMember } from "discord.js"; -import { slashOptions } from "knub"; +import { slashOptions } from "vety"; import { hasPermission } from "../../../../pluginUtils.js"; import { UserNotificationMethod, convertDelayStringToMS, resolveMember } from "../../../../utils.js"; import { generateAttachmentSlashOptions, retrieveMultipleOptions } from "../../../../utils/multipleSlashOptions.js"; @@ -68,7 +68,7 @@ export const ForceMuteSlashCmd = modActionsSlashCmd({ ppId = interaction.user.id; } - const convertedTime = options.time ? convertDelayStringToMS(options.time) ?? undefined : undefined; + const convertedTime = options.time ? (convertDelayStringToMS(options.time) ?? undefined) : undefined; if (options.time && !convertedTime) { pluginData.state.common.sendErrorMessage(interaction, `Could not convert ${options.time} to a delay`); return; diff --git a/backend/src/plugins/ModActions/commands/forceunmute/ForceUnmuteMsgCmd.ts b/backend/src/plugins/ModActions/commands/forceunmute/ForceUnmuteMsgCmd.ts index b5a7f3c0c..05153d7e5 100644 --- a/backend/src/plugins/ModActions/commands/forceunmute/ForceUnmuteMsgCmd.ts +++ b/backend/src/plugins/ModActions/commands/forceunmute/ForceUnmuteMsgCmd.ts @@ -30,7 +30,7 @@ export const ForceUnmuteMsgCmd = modActionsMsgCmd({ ], async run({ pluginData, message: msg, args }) { - const user = await resolveUser(pluginData.client, args.user); + const user = await resolveUser(pluginData.client, args.user, "ModActions:ForceUnmuteMsgCmd"); if (!user.id) { pluginData.state.common.sendErrorMessage(msg, `User not found`); return; @@ -72,7 +72,7 @@ export const ForceUnmuteMsgCmd = modActionsMsgCmd({ [...msg.attachments.values()], mod, ppId, - "time" in args ? args.time ?? undefined : undefined, + "time" in args ? (args.time ?? undefined) : undefined, args.reason, ); }, diff --git a/backend/src/plugins/ModActions/commands/forceunmute/ForceUnmuteSlashCmd.ts b/backend/src/plugins/ModActions/commands/forceunmute/ForceUnmuteSlashCmd.ts index 1fcd135c1..a55b1cc97 100644 --- a/backend/src/plugins/ModActions/commands/forceunmute/ForceUnmuteSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/forceunmute/ForceUnmuteSlashCmd.ts @@ -1,5 +1,5 @@ import { GuildMember } from "discord.js"; -import { slashOptions } from "knub"; +import { slashOptions } from "vety"; import { hasPermission } from "../../../../pluginUtils.js"; import { convertDelayStringToMS, resolveMember } from "../../../../utils.js"; import { generateAttachmentSlashOptions, retrieveMultipleOptions } from "../../../../utils/multipleSlashOptions.js"; @@ -52,7 +52,7 @@ export const ForceUnmuteSlashCmd = modActionsSlashCmd({ ppId = interaction.user.id; } - const convertedTime = options.time ? convertDelayStringToMS(options.time) ?? undefined : undefined; + const convertedTime = options.time ? (convertDelayStringToMS(options.time) ?? undefined) : undefined; if (options.time && !convertedTime) { pluginData.state.common.sendErrorMessage(interaction, `Could not convert ${options.time} to a delay`); return; diff --git a/backend/src/plugins/ModActions/commands/hidecase/HideCaseSlashCmd.ts b/backend/src/plugins/ModActions/commands/hidecase/HideCaseSlashCmd.ts index 114120dc9..ac0af4304 100644 --- a/backend/src/plugins/ModActions/commands/hidecase/HideCaseSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/hidecase/HideCaseSlashCmd.ts @@ -1,4 +1,4 @@ -import { slashOptions } from "knub"; +import { slashOptions } from "vety"; import { modActionsSlashCmd } from "../../types.js"; import { actualHideCaseCmd } from "./actualHideCaseCmd.js"; diff --git a/backend/src/plugins/ModActions/commands/hidecase/actualHideCaseCmd.ts b/backend/src/plugins/ModActions/commands/hidecase/actualHideCaseCmd.ts index 1c33efc18..d403d06d0 100644 --- a/backend/src/plugins/ModActions/commands/hidecase/actualHideCaseCmd.ts +++ b/backend/src/plugins/ModActions/commands/hidecase/actualHideCaseCmd.ts @@ -1,5 +1,5 @@ import { ChatInputCommandInteraction, Message } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { ModActionsPluginType } from "../../types.js"; export async function actualHideCaseCmd( diff --git a/backend/src/plugins/ModActions/commands/kick/KickMsgCmd.ts b/backend/src/plugins/ModActions/commands/kick/KickMsgCmd.ts index ec7c692bc..3073ac6ec 100644 --- a/backend/src/plugins/ModActions/commands/kick/KickMsgCmd.ts +++ b/backend/src/plugins/ModActions/commands/kick/KickMsgCmd.ts @@ -1,4 +1,4 @@ -import { hasPermission } from "knub/helpers"; +import { hasPermission } from "vety/helpers"; import { commandTypeHelpers as ct } from "../../../../commandTypes.js"; import { resolveMessageMember } from "../../../../pluginUtils.js"; import { resolveUser } from "../../../../utils.js"; @@ -28,7 +28,7 @@ export const KickMsgCmd = modActionsMsgCmd({ ], async run({ pluginData, message: msg, args }) { - const user = await resolveUser(pluginData.client, args.user); + const user = await resolveUser(pluginData.client, args.user, "ModActions:KickMsgCmd"); if (!user.id) { pluginData.state.common.sendErrorMessage(msg, `User not found`); return; diff --git a/backend/src/plugins/ModActions/commands/kick/KickSlashCmd.ts b/backend/src/plugins/ModActions/commands/kick/KickSlashCmd.ts index a020fb5e1..c9843b1d3 100644 --- a/backend/src/plugins/ModActions/commands/kick/KickSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/kick/KickSlashCmd.ts @@ -1,5 +1,5 @@ import { ChannelType, GuildMember } from "discord.js"; -import { slashOptions } from "knub"; +import { slashOptions } from "vety"; import { hasPermission } from "../../../../pluginUtils.js"; import { UserNotificationMethod, resolveMember } from "../../../../utils.js"; import { generateAttachmentSlashOptions, retrieveMultipleOptions } from "../../../../utils/multipleSlashOptions.js"; diff --git a/backend/src/plugins/ModActions/commands/kick/actualKickCmd.ts b/backend/src/plugins/ModActions/commands/kick/actualKickCmd.ts index a51e9a4f8..e6ebd51fa 100644 --- a/backend/src/plugins/ModActions/commands/kick/actualKickCmd.ts +++ b/backend/src/plugins/ModActions/commands/kick/actualKickCmd.ts @@ -1,5 +1,5 @@ import { Attachment, ChatInputCommandInteraction, GuildMember, Message, User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../../data/LogType.js"; import { canActOn } from "../../../../pluginUtils.js"; import { diff --git a/backend/src/plugins/ModActions/commands/massban/MassBanMsgCmd.ts b/backend/src/plugins/ModActions/commands/massban/MassBanMsgCmd.ts index 438f088e0..6cc92ceb5 100644 --- a/backend/src/plugins/ModActions/commands/massban/MassBanMsgCmd.ts +++ b/backend/src/plugins/ModActions/commands/massban/MassBanMsgCmd.ts @@ -1,4 +1,4 @@ -import { waitForReply } from "knub/helpers"; +import { waitForReply } from "vety/helpers"; import { commandTypeHelpers as ct } from "../../../../commandTypes.js"; import { resolveMessageMember } from "../../../../pluginUtils.js"; import { modActionsMsgCmd } from "../../types.js"; diff --git a/backend/src/plugins/ModActions/commands/massban/MassBanSlashCmd.ts b/backend/src/plugins/ModActions/commands/massban/MassBanSlashCmd.ts index df89a7263..675ef51f1 100644 --- a/backend/src/plugins/ModActions/commands/massban/MassBanSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/massban/MassBanSlashCmd.ts @@ -1,5 +1,5 @@ import { GuildMember } from "discord.js"; -import { slashOptions } from "knub"; +import { slashOptions } from "vety"; import { generateAttachmentSlashOptions, retrieveMultipleOptions } from "../../../../utils/multipleSlashOptions.js"; import { modActionsSlashCmd } from "../../types.js"; import { NUMBER_ATTACHMENTS_CASE_CREATION } from "../constants.js"; diff --git a/backend/src/plugins/ModActions/commands/massban/actualMassBanCmd.ts b/backend/src/plugins/ModActions/commands/massban/actualMassBanCmd.ts index 7ab0d46e1..bdaf59c83 100644 --- a/backend/src/plugins/ModActions/commands/massban/actualMassBanCmd.ts +++ b/backend/src/plugins/ModActions/commands/massban/actualMassBanCmd.ts @@ -1,5 +1,5 @@ import { Attachment, ChatInputCommandInteraction, GuildMember, Message, Snowflake } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { CaseTypes } from "../../../../data/CaseTypes.js"; import { LogType } from "../../../../data/LogType.js"; import { humanizeDurationShort } from "../../../../humanizeDuration.js"; diff --git a/backend/src/plugins/ModActions/commands/massmute/MassMuteMsgCmd.ts b/backend/src/plugins/ModActions/commands/massmute/MassMuteMsgCmd.ts index fe96490a6..1f5ad3d94 100644 --- a/backend/src/plugins/ModActions/commands/massmute/MassMuteMsgCmd.ts +++ b/backend/src/plugins/ModActions/commands/massmute/MassMuteMsgCmd.ts @@ -1,4 +1,4 @@ -import { waitForReply } from "knub/helpers"; +import { waitForReply } from "vety/helpers"; import { commandTypeHelpers as ct } from "../../../../commandTypes.js"; import { resolveMessageMember } from "../../../../pluginUtils.js"; import { modActionsMsgCmd } from "../../types.js"; diff --git a/backend/src/plugins/ModActions/commands/massmute/MassMuteSlashCmd.ts b/backend/src/plugins/ModActions/commands/massmute/MassMuteSlashCmd.ts index eabab03eb..57a978c29 100644 --- a/backend/src/plugins/ModActions/commands/massmute/MassMuteSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/massmute/MassMuteSlashCmd.ts @@ -1,5 +1,5 @@ import { GuildMember } from "discord.js"; -import { slashOptions } from "knub"; +import { slashOptions } from "vety"; import { generateAttachmentSlashOptions, retrieveMultipleOptions } from "../../../../utils/multipleSlashOptions.js"; import { modActionsSlashCmd } from "../../types.js"; import { NUMBER_ATTACHMENTS_CASE_CREATION } from "../constants.js"; diff --git a/backend/src/plugins/ModActions/commands/massmute/actualMassMuteCmd.ts b/backend/src/plugins/ModActions/commands/massmute/actualMassMuteCmd.ts index 3c6d109bb..cb3b313ee 100644 --- a/backend/src/plugins/ModActions/commands/massmute/actualMassMuteCmd.ts +++ b/backend/src/plugins/ModActions/commands/massmute/actualMassMuteCmd.ts @@ -1,5 +1,5 @@ import { Attachment, ChatInputCommandInteraction, GuildMember, Message, Snowflake } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { LogType } from "../../../../data/LogType.js"; import { logger } from "../../../../logger.js"; import { canActOn, deleteContextResponse, isContextInteraction, sendContextResponse } from "../../../../pluginUtils.js"; diff --git a/backend/src/plugins/ModActions/commands/massunban/MassUnbanMsgCmd.ts b/backend/src/plugins/ModActions/commands/massunban/MassUnbanMsgCmd.ts index c7166675e..ceb486edc 100644 --- a/backend/src/plugins/ModActions/commands/massunban/MassUnbanMsgCmd.ts +++ b/backend/src/plugins/ModActions/commands/massunban/MassUnbanMsgCmd.ts @@ -1,4 +1,4 @@ -import { waitForReply } from "knub/helpers"; +import { waitForReply } from "vety/helpers"; import { commandTypeHelpers as ct } from "../../../../commandTypes.js"; import { resolveMessageMember } from "../../../../pluginUtils.js"; import { modActionsMsgCmd } from "../../types.js"; diff --git a/backend/src/plugins/ModActions/commands/massunban/MassUnbanSlashCmd.ts b/backend/src/plugins/ModActions/commands/massunban/MassUnbanSlashCmd.ts index 57e69fadd..d3310b8c3 100644 --- a/backend/src/plugins/ModActions/commands/massunban/MassUnbanSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/massunban/MassUnbanSlashCmd.ts @@ -1,5 +1,5 @@ import { GuildMember } from "discord.js"; -import { slashOptions } from "knub"; +import { slashOptions } from "vety"; import { generateAttachmentSlashOptions, retrieveMultipleOptions } from "../../../../utils/multipleSlashOptions.js"; import { modActionsSlashCmd } from "../../types.js"; import { NUMBER_ATTACHMENTS_CASE_CREATION } from "../constants.js"; diff --git a/backend/src/plugins/ModActions/commands/massunban/actualMassUnbanCmd.ts b/backend/src/plugins/ModActions/commands/massunban/actualMassUnbanCmd.ts index 9a132bf58..9d99823a2 100644 --- a/backend/src/plugins/ModActions/commands/massunban/actualMassUnbanCmd.ts +++ b/backend/src/plugins/ModActions/commands/massunban/actualMassUnbanCmd.ts @@ -1,5 +1,5 @@ import { Attachment, ChatInputCommandInteraction, GuildMember, Message, Snowflake } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { CaseTypes } from "../../../../data/CaseTypes.js"; import { LogType } from "../../../../data/LogType.js"; import { deleteContextResponse, isContextInteraction, sendContextResponse } from "../../../../pluginUtils.js"; diff --git a/backend/src/plugins/ModActions/commands/mute/MuteMsgCmd.ts b/backend/src/plugins/ModActions/commands/mute/MuteMsgCmd.ts index 07b23c62a..f2adad96f 100644 --- a/backend/src/plugins/ModActions/commands/mute/MuteMsgCmd.ts +++ b/backend/src/plugins/ModActions/commands/mute/MuteMsgCmd.ts @@ -35,7 +35,7 @@ export const MuteMsgCmd = modActionsMsgCmd({ ], async run({ pluginData, message: msg, args }) { - const user = await resolveUser(pluginData.client, args.user); + const user = await resolveUser(pluginData.client, args.user, "ModActions:MuteMsgCmd"); if (!user.id) { pluginData.state.common.sendErrorMessage(msg, `User not found`); return; @@ -103,7 +103,7 @@ export const MuteMsgCmd = modActionsMsgCmd({ [...msg.attachments.values()], mod, ppId, - "time" in args ? args.time ?? undefined : undefined, + "time" in args ? (args.time ?? undefined) : undefined, args.reason, contactMethods, ); diff --git a/backend/src/plugins/ModActions/commands/mute/MuteSlashCmd.ts b/backend/src/plugins/ModActions/commands/mute/MuteSlashCmd.ts index a8378f76c..cdc80a773 100644 --- a/backend/src/plugins/ModActions/commands/mute/MuteSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/mute/MuteSlashCmd.ts @@ -1,5 +1,5 @@ import { ChannelType, GuildMember } from "discord.js"; -import { slashOptions } from "knub"; +import { slashOptions } from "vety"; import { canActOn, hasPermission } from "../../../../pluginUtils.js"; import { UserNotificationMethod, convertDelayStringToMS, resolveMember } from "../../../../utils.js"; import { generateAttachmentSlashOptions, retrieveMultipleOptions } from "../../../../utils/multipleSlashOptions.js"; @@ -95,7 +95,7 @@ export const MuteSlashCmd = modActionsSlashCmd({ ppId = interaction.user.id; } - const convertedTime = options.time ? convertDelayStringToMS(options.time) ?? undefined : undefined; + const convertedTime = options.time ? (convertDelayStringToMS(options.time) ?? undefined) : undefined; if (options.time && !convertedTime) { pluginData.state.common.sendErrorMessage(interaction, `Could not convert ${options.time} to a delay`); return; diff --git a/backend/src/plugins/ModActions/commands/mute/actualMuteCmd.ts b/backend/src/plugins/ModActions/commands/mute/actualMuteCmd.ts index 736bd42ba..f18e9bf26 100644 --- a/backend/src/plugins/ModActions/commands/mute/actualMuteCmd.ts +++ b/backend/src/plugins/ModActions/commands/mute/actualMuteCmd.ts @@ -1,5 +1,5 @@ import { Attachment, ChatInputCommandInteraction, GuildMember, Message, User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { ERRORS, RecoverablePluginError } from "../../../../RecoverablePluginError.js"; import { humanizeDuration } from "../../../../humanizeDuration.js"; import { logger } from "../../../../logger.js"; diff --git a/backend/src/plugins/ModActions/commands/note/NoteMsgCmd.ts b/backend/src/plugins/ModActions/commands/note/NoteMsgCmd.ts index 9049f9817..433d85374 100644 --- a/backend/src/plugins/ModActions/commands/note/NoteMsgCmd.ts +++ b/backend/src/plugins/ModActions/commands/note/NoteMsgCmd.ts @@ -14,7 +14,7 @@ export const NoteMsgCmd = modActionsMsgCmd({ }, async run({ pluginData, message: msg, args }) { - const user = await resolveUser(pluginData.client, args.user); + const user = await resolveUser(pluginData.client, args.user, "ModActions:NoteMsgCmd"); if (!user.id) { pluginData.state.common.sendErrorMessage(msg, `User not found`); return; diff --git a/backend/src/plugins/ModActions/commands/note/NoteSlashCmd.ts b/backend/src/plugins/ModActions/commands/note/NoteSlashCmd.ts index 507df72ac..6ca2bb1b0 100644 --- a/backend/src/plugins/ModActions/commands/note/NoteSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/note/NoteSlashCmd.ts @@ -1,4 +1,4 @@ -import { slashOptions } from "knub"; +import { slashOptions } from "vety"; import { generateAttachmentSlashOptions, retrieveMultipleOptions } from "../../../../utils/multipleSlashOptions.js"; import { modActionsSlashCmd } from "../../types.js"; import { NUMBER_ATTACHMENTS_CASE_CREATION } from "../constants.js"; diff --git a/backend/src/plugins/ModActions/commands/note/actualNoteCmd.ts b/backend/src/plugins/ModActions/commands/note/actualNoteCmd.ts index 8914a5241..4b342d6ac 100644 --- a/backend/src/plugins/ModActions/commands/note/actualNoteCmd.ts +++ b/backend/src/plugins/ModActions/commands/note/actualNoteCmd.ts @@ -1,5 +1,5 @@ import { Attachment, ChatInputCommandInteraction, Message, User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { CaseTypes } from "../../../../data/CaseTypes.js"; import { UnknownUser, renderUsername } from "../../../../utils.js"; import { CasesPlugin } from "../../../Cases/CasesPlugin.js"; diff --git a/backend/src/plugins/ModActions/commands/unban/UnbanMsgCmd.ts b/backend/src/plugins/ModActions/commands/unban/UnbanMsgCmd.ts index 053427c5b..c78ce949c 100644 --- a/backend/src/plugins/ModActions/commands/unban/UnbanMsgCmd.ts +++ b/backend/src/plugins/ModActions/commands/unban/UnbanMsgCmd.ts @@ -23,7 +23,7 @@ export const UnbanMsgCmd = modActionsMsgCmd({ ], async run({ pluginData, message: msg, args }) { - const user = await resolveUser(pluginData.client, args.user); + const user = await resolveUser(pluginData.client, args.user, "ModActions:UnbanMsgCmd"); if (!user.id) { pluginData.state.common.sendErrorMessage(msg, `User not found`); return; diff --git a/backend/src/plugins/ModActions/commands/unban/UnbanSlashCmd.ts b/backend/src/plugins/ModActions/commands/unban/UnbanSlashCmd.ts index 7c910e539..bb44dfa13 100644 --- a/backend/src/plugins/ModActions/commands/unban/UnbanSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/unban/UnbanSlashCmd.ts @@ -1,5 +1,5 @@ import { GuildMember } from "discord.js"; -import { slashOptions } from "knub"; +import { slashOptions } from "vety"; import { hasPermission } from "../../../../pluginUtils.js"; import { resolveMember } from "../../../../utils.js"; import { generateAttachmentSlashOptions, retrieveMultipleOptions } from "../../../../utils/multipleSlashOptions.js"; @@ -28,12 +28,6 @@ export const UnbanSlashCmd = modActionsSlashCmd({ await interaction.deferReply({ ephemeral: true }); const attachments = retrieveMultipleOptions(NUMBER_ATTACHMENTS_CASE_CREATION, options, "attachment"); - if ((!options.reason || options.reason.trim() === "") && attachments.length < 1) { - pluginData.state.common.sendErrorMessage(interaction, "Text or attachment required", undefined, undefined, true); - - return; - } - let mod = interaction.member as GuildMember; const canActAsOther = await hasPermission(pluginData, "can_act_as_other", { channel: interaction.channel, diff --git a/backend/src/plugins/ModActions/commands/unban/actualUnbanCmd.ts b/backend/src/plugins/ModActions/commands/unban/actualUnbanCmd.ts index e984a944b..8d3420464 100644 --- a/backend/src/plugins/ModActions/commands/unban/actualUnbanCmd.ts +++ b/backend/src/plugins/ModActions/commands/unban/actualUnbanCmd.ts @@ -1,5 +1,5 @@ import { Attachment, ChatInputCommandInteraction, GuildMember, Message, Snowflake, User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { CaseTypes } from "../../../../data/CaseTypes.js"; import { LogType } from "../../../../data/LogType.js"; import { clearExpiringTempban } from "../../../../data/loops/expiringTempbansLoop.js"; diff --git a/backend/src/plugins/ModActions/commands/unhidecase/UnhideCaseSlashCmd.ts b/backend/src/plugins/ModActions/commands/unhidecase/UnhideCaseSlashCmd.ts index 1b29fac6a..4c59fdf81 100644 --- a/backend/src/plugins/ModActions/commands/unhidecase/UnhideCaseSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/unhidecase/UnhideCaseSlashCmd.ts @@ -1,4 +1,4 @@ -import { slashOptions } from "knub"; +import { slashOptions } from "vety"; import { modActionsSlashCmd } from "../../types.js"; import { actualUnhideCaseCmd } from "./actualUnhideCaseCmd.js"; diff --git a/backend/src/plugins/ModActions/commands/unhidecase/actualUnhideCaseCmd.ts b/backend/src/plugins/ModActions/commands/unhidecase/actualUnhideCaseCmd.ts index d270107a0..8b137d5d2 100644 --- a/backend/src/plugins/ModActions/commands/unhidecase/actualUnhideCaseCmd.ts +++ b/backend/src/plugins/ModActions/commands/unhidecase/actualUnhideCaseCmd.ts @@ -1,5 +1,5 @@ import { ChatInputCommandInteraction, Message } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { ModActionsPluginType } from "../../types.js"; export async function actualUnhideCaseCmd( diff --git a/backend/src/plugins/ModActions/commands/unmute/UnmuteMsgCmd.ts b/backend/src/plugins/ModActions/commands/unmute/UnmuteMsgCmd.ts index 6c2887ddb..06fd602de 100644 --- a/backend/src/plugins/ModActions/commands/unmute/UnmuteMsgCmd.ts +++ b/backend/src/plugins/ModActions/commands/unmute/UnmuteMsgCmd.ts @@ -33,7 +33,7 @@ export const UnmuteMsgCmd = modActionsMsgCmd({ ], async run({ pluginData, message: msg, args }) { - const user = await resolveUser(pluginData.client, args.user); + const user = await resolveUser(pluginData.client, args.user, "ModActions:UnmuteMsgCmd"); if (!user.id) { pluginData.state.common.sendErrorMessage(msg, `User not found`); return; @@ -105,7 +105,7 @@ export const UnmuteMsgCmd = modActionsMsgCmd({ [...msg.attachments.values()], mod, ppId, - "time" in args ? args.time ?? undefined : undefined, + "time" in args ? (args.time ?? undefined) : undefined, args.reason, ); }, diff --git a/backend/src/plugins/ModActions/commands/unmute/UnmuteSlashCmd.ts b/backend/src/plugins/ModActions/commands/unmute/UnmuteSlashCmd.ts index 6d3be623b..40c239428 100644 --- a/backend/src/plugins/ModActions/commands/unmute/UnmuteSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/unmute/UnmuteSlashCmd.ts @@ -1,5 +1,5 @@ import { GuildMember } from "discord.js"; -import { slashOptions } from "knub"; +import { slashOptions } from "vety"; import { canActOn, hasPermission } from "../../../../pluginUtils.js"; import { convertDelayStringToMS, resolveMember } from "../../../../utils.js"; import { generateAttachmentSlashOptions, retrieveMultipleOptions } from "../../../../utils/multipleSlashOptions.js"; @@ -99,7 +99,7 @@ export const UnmuteSlashCmd = modActionsSlashCmd({ ppId = interaction.user.id; } - const convertedTime = options.time ? convertDelayStringToMS(options.time) ?? undefined : undefined; + const convertedTime = options.time ? (convertDelayStringToMS(options.time) ?? undefined) : undefined; if (options.time && !convertedTime) { pluginData.state.common.sendErrorMessage(interaction, `Could not convert ${options.time} to a delay`); return; diff --git a/backend/src/plugins/ModActions/commands/unmute/actualUnmuteCmd.ts b/backend/src/plugins/ModActions/commands/unmute/actualUnmuteCmd.ts index cc657ebdd..f8f4a8f03 100644 --- a/backend/src/plugins/ModActions/commands/unmute/actualUnmuteCmd.ts +++ b/backend/src/plugins/ModActions/commands/unmute/actualUnmuteCmd.ts @@ -1,5 +1,5 @@ import { Attachment, ChatInputCommandInteraction, GuildMember, Message, User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { humanizeDuration } from "../../../../humanizeDuration.js"; import { UnknownUser, asSingleLine, renderUsername } from "../../../../utils.js"; import { MutesPlugin } from "../../../Mutes/MutesPlugin.js"; diff --git a/backend/src/plugins/ModActions/commands/update/UpdateSlashCmd.ts b/backend/src/plugins/ModActions/commands/update/UpdateSlashCmd.ts index a5a664a82..68a751614 100644 --- a/backend/src/plugins/ModActions/commands/update/UpdateSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/update/UpdateSlashCmd.ts @@ -1,4 +1,4 @@ -import { slashOptions } from "knub"; +import { slashOptions } from "vety"; import { generateAttachmentSlashOptions, retrieveMultipleOptions } from "../../../../utils/multipleSlashOptions.js"; import { updateCase } from "../../functions/updateCase.js"; import { modActionsSlashCmd } from "../../types.js"; diff --git a/backend/src/plugins/ModActions/commands/warn/WarnMsgCmd.ts b/backend/src/plugins/ModActions/commands/warn/WarnMsgCmd.ts index 91ea058a6..beb940757 100644 --- a/backend/src/plugins/ModActions/commands/warn/WarnMsgCmd.ts +++ b/backend/src/plugins/ModActions/commands/warn/WarnMsgCmd.ts @@ -21,7 +21,7 @@ export const WarnMsgCmd = modActionsMsgCmd({ }, async run({ pluginData, message: msg, args }) { - const user = await resolveUser(pluginData.client, args.user); + const user = await resolveUser(pluginData.client, args.user, "ModActions:WarnMsgCmd"); if (!user.id) { await pluginData.state.common.sendErrorMessage(msg, `User not found`); return; diff --git a/backend/src/plugins/ModActions/commands/warn/WarnSlashCmd.ts b/backend/src/plugins/ModActions/commands/warn/WarnSlashCmd.ts index f0f8c1972..fa00184d0 100644 --- a/backend/src/plugins/ModActions/commands/warn/WarnSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/warn/WarnSlashCmd.ts @@ -1,5 +1,5 @@ import { ChannelType, GuildMember } from "discord.js"; -import { slashOptions } from "knub"; +import { slashOptions } from "vety"; import { canActOn, hasPermission } from "../../../../pluginUtils.js"; import { UserNotificationMethod, resolveMember } from "../../../../utils.js"; import { generateAttachmentSlashOptions, retrieveMultipleOptions } from "../../../../utils/multipleSlashOptions.js"; diff --git a/backend/src/plugins/ModActions/commands/warn/actualWarnCmd.ts b/backend/src/plugins/ModActions/commands/warn/actualWarnCmd.ts index 2decfd282..4d06a64d4 100644 --- a/backend/src/plugins/ModActions/commands/warn/actualWarnCmd.ts +++ b/backend/src/plugins/ModActions/commands/warn/actualWarnCmd.ts @@ -1,5 +1,5 @@ import { Attachment, ChatInputCommandInteraction, GuildMember, Message } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { CaseTypes } from "../../../../data/CaseTypes.js"; import { UserNotificationMethod, renderUsername } from "../../../../utils.js"; import { waitForButtonConfirm } from "../../../../utils/waitForInteraction.js"; diff --git a/backend/src/plugins/ModActions/events/AuditLogEvents.ts b/backend/src/plugins/ModActions/events/AuditLogEvents.ts index fbade396b..963833cc3 100644 --- a/backend/src/plugins/ModActions/events/AuditLogEvents.ts +++ b/backend/src/plugins/ModActions/events/AuditLogEvents.ts @@ -18,7 +18,7 @@ export const AuditLogEvents = modActionsEvt({ // Create mute/unmute cases for manual timeouts if (auditLogEntry.action === AuditLogEvent.MemberUpdate && config.create_cases_for_manual_actions) { - const target = await resolveUser(pluginData.client, auditLogEntry.targetId!); + const target = await resolveUser(pluginData.client, auditLogEntry.targetId!, "ModActions:AuditLogEvents"); // Only act based on the last changes in this log let muteChange: AuditLogChange | null = null; diff --git a/backend/src/plugins/ModActions/events/CreateBanCaseOnManualBanEvt.ts b/backend/src/plugins/ModActions/events/CreateBanCaseOnManualBanEvt.ts index 8e2ffd450..a2b22b58c 100644 --- a/backend/src/plugins/ModActions/events/CreateBanCaseOnManualBanEvt.ts +++ b/backend/src/plugins/ModActions/events/CreateBanCaseOnManualBanEvt.ts @@ -39,7 +39,7 @@ export const CreateBanCaseOnManualBanEvt = modActionsEvt({ const modId = relevantAuditLogEntry.executor!.id; const auditLogId = relevantAuditLogEntry.id; - mod = await resolveUser(pluginData.client, modId); + mod = await resolveUser(pluginData.client, modId, "ModActions:CreateBanCaseOnManualBanEvt"); const config = mod instanceof UnknownUser ? pluginData.config.get() : await pluginData.config.getForUser(mod); diff --git a/backend/src/plugins/ModActions/events/CreateKickCaseOnManualKickEvt.ts b/backend/src/plugins/ModActions/events/CreateKickCaseOnManualKickEvt.ts index 2d698426f..25728d7ae 100644 --- a/backend/src/plugins/ModActions/events/CreateKickCaseOnManualKickEvt.ts +++ b/backend/src/plugins/ModActions/events/CreateKickCaseOnManualKickEvt.ts @@ -36,7 +36,7 @@ export const CreateKickCaseOnManualKickEvt = modActionsEvt({ `Tried to create duplicate case for audit log entry ${kickAuditLogEntry.id}, existing case id ${createdCase.id}`, ); } else { - mod = await resolveUser(pluginData.client, kickAuditLogEntry.executor!.id); + mod = await resolveUser(pluginData.client, kickAuditLogEntry.executor!.id, "ModActions:CreateKickCaseOnManualKickEvt"); const config = mod instanceof UnknownUser ? pluginData.config.get() : await pluginData.config.getForUser(mod); diff --git a/backend/src/plugins/ModActions/events/CreateUnbanCaseOnManualUnbanEvt.ts b/backend/src/plugins/ModActions/events/CreateUnbanCaseOnManualUnbanEvt.ts index 2ccf03989..6cbbb532b 100644 --- a/backend/src/plugins/ModActions/events/CreateUnbanCaseOnManualUnbanEvt.ts +++ b/backend/src/plugins/ModActions/events/CreateUnbanCaseOnManualUnbanEvt.ts @@ -37,7 +37,7 @@ export const CreateUnbanCaseOnManualUnbanEvt = modActionsEvt({ const modId = relevantAuditLogEntry.executor!.id; const auditLogId = relevantAuditLogEntry.id; - mod = await resolveUser(pluginData.client, modId); + mod = await resolveUser(pluginData.client, modId, "ModActions:CreateUnbanCaseOnManualUnbanEvt"); const config = mod instanceof UnknownUser ? pluginData.config.get() : await pluginData.config.getForUser(mod); diff --git a/backend/src/plugins/ModActions/functions/attachmentLinkReaction.ts b/backend/src/plugins/ModActions/functions/attachmentLinkReaction.ts index 97d5c8a50..2c7c234c6 100644 --- a/backend/src/plugins/ModActions/functions/attachmentLinkReaction.ts +++ b/backend/src/plugins/ModActions/functions/attachmentLinkReaction.ts @@ -1,10 +1,9 @@ -import { ChatInputCommandInteraction, Message, TextBasedChannel } from "discord.js"; -import { AnyPluginData, GuildPluginData } from "knub"; +import { ChatInputCommandInteraction, Message, SendableChannels } from "discord.js"; +import { GuildPluginData } from "vety"; import { ModActionsPluginType } from "../types.js"; export function shouldReactToAttachmentLink(pluginData: GuildPluginData) { const config = pluginData.config.get(); - return !config.attachment_link_reaction || config.attachment_link_reaction !== "none"; } @@ -16,9 +15,9 @@ export function detectAttachmentLink(reason: string | null | undefined) { return reason && /https:\/\/(cdn|media)\.discordapp\.(com|net)\/(ephemeral-)?attachments/gu.test(reason); } -export function sendAttachmentLinkDetectionErrorMessage( - pluginData: AnyPluginData, - context: TextBasedChannel | Message | ChatInputCommandInteraction, +function sendAttachmentLinkDetectionErrorMessage( + pluginData: GuildPluginData, + context: SendableChannels | Message | ChatInputCommandInteraction, restricted = false, ) { const emoji = pluginData.state.common.getErrorEmoji(); @@ -33,7 +32,7 @@ export function sendAttachmentLinkDetectionErrorMessage( export async function handleAttachmentLinkDetectionAndGetRestriction( pluginData: GuildPluginData, - context: TextBasedChannel | Message | ChatInputCommandInteraction, + context: SendableChannels | Message | ChatInputCommandInteraction, reason: string | null | undefined, ) { if (!shouldReactToAttachmentLink(pluginData) || !detectAttachmentLink(reason)) { diff --git a/backend/src/plugins/ModActions/functions/banUserId.ts b/backend/src/plugins/ModActions/functions/banUserId.ts index 7250fa1dc..a1bc14656 100644 --- a/backend/src/plugins/ModActions/functions/banUserId.ts +++ b/backend/src/plugins/ModActions/functions/banUserId.ts @@ -1,5 +1,5 @@ import { DiscordAPIError, Snowflake } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { CaseTypes } from "../../../data/CaseTypes.js"; import { LogType } from "../../../data/LogType.js"; import { registerExpiringTempban } from "../../../data/loops/expiringTempbansLoop.js"; @@ -35,7 +35,7 @@ export async function banUserId( banTime?: number, ): Promise { const config = pluginData.config.get(); - const user = await resolveUser(pluginData.client, userId); + const user = await resolveUser(pluginData.client, userId, "ModActions:banUserId"); if (!user.id) { return { status: "failed", @@ -61,7 +61,7 @@ export async function banUserId( guildName: pluginData.guild.name, reason: reasonWithAttachments, moderator: banOptions.caseArgs?.modId - ? userToTemplateSafeUser(await resolveUser(pluginData.client, banOptions.caseArgs.modId)) + ? userToTemplateSafeUser(await resolveUser(pluginData.client, banOptions.caseArgs.modId, "ModActions:banUserId")) : null, }), ); @@ -85,7 +85,7 @@ export async function banUserId( guildName: pluginData.guild.name, reason: reasonWithAttachments, moderator: banOptions.caseArgs?.modId - ? userToTemplateSafeUser(await resolveUser(pluginData.client, banOptions.caseArgs.modId)) + ? userToTemplateSafeUser(await resolveUser(pluginData.client, banOptions.caseArgs.modId, "ModActions:banUserId")) : null, banTime: humanizeDuration(banTime), }), @@ -165,7 +165,7 @@ export async function banUserId( }); // Log the action - const mod = await resolveUser(pluginData.client, modId); + const mod = await resolveUser(pluginData.client, modId, "ModActions:banUserId"); if (banTime) { pluginData.getPlugin(LogsPlugin).logMemberTimedBan({ diff --git a/backend/src/plugins/ModActions/functions/clearIgnoredEvents.ts b/backend/src/plugins/ModActions/functions/clearIgnoredEvents.ts index 561d2cc1a..b4432306d 100644 --- a/backend/src/plugins/ModActions/functions/clearIgnoredEvents.ts +++ b/backend/src/plugins/ModActions/functions/clearIgnoredEvents.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { IgnoredEventType, ModActionsPluginType } from "../types.js"; export function clearIgnoredEvents( diff --git a/backend/src/plugins/ModActions/functions/clearTempban.ts b/backend/src/plugins/ModActions/functions/clearTempban.ts index 96d607708..d5fd1778c 100644 --- a/backend/src/plugins/ModActions/functions/clearTempban.ts +++ b/backend/src/plugins/ModActions/functions/clearTempban.ts @@ -1,5 +1,5 @@ import { Snowflake } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import moment from "moment-timezone"; import { CaseTypes } from "../../../data/CaseTypes.js"; import { LogType } from "../../../data/LogType.js"; @@ -48,7 +48,7 @@ export async function clearTempban(pluginData: GuildPluginData( diff --git a/backend/src/plugins/ModActions/functions/onModActionsEvent.ts b/backend/src/plugins/ModActions/functions/onModActionsEvent.ts index 7bd5c5480..6dce1a5dd 100644 --- a/backend/src/plugins/ModActions/functions/onModActionsEvent.ts +++ b/backend/src/plugins/ModActions/functions/onModActionsEvent.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { ModActionsEvents, ModActionsPluginType } from "../types.js"; export function onModActionsEvent( diff --git a/backend/src/plugins/ModActions/functions/updateCase.ts b/backend/src/plugins/ModActions/functions/updateCase.ts index 6d78ce8b2..5ade25410 100644 --- a/backend/src/plugins/ModActions/functions/updateCase.ts +++ b/backend/src/plugins/ModActions/functions/updateCase.ts @@ -1,5 +1,5 @@ import { Attachment, ChatInputCommandInteraction, Message, User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { CaseTypes } from "../../../data/CaseTypes.js"; import { Case } from "../../../data/entities/Case.js"; import { CasesPlugin } from "../../Cases/CasesPlugin.js"; diff --git a/backend/src/plugins/ModActions/functions/warnMember.ts b/backend/src/plugins/ModActions/functions/warnMember.ts index 9ac737a61..2da25f0b3 100644 --- a/backend/src/plugins/ModActions/functions/warnMember.ts +++ b/backend/src/plugins/ModActions/functions/warnMember.ts @@ -1,5 +1,5 @@ import { GuildMember, Snowflake } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { CaseTypes } from "../../../data/CaseTypes.js"; import { TemplateParseError, TemplateSafeValueContainer, renderTemplate } from "../../../templateFormatter.js"; import { @@ -35,7 +35,7 @@ export async function warnMember( guildName: pluginData.guild.name, reason: reasonWithAttachments, moderator: warnOptions.caseArgs?.modId - ? userToTemplateSafeUser(await resolveUser(pluginData.client, warnOptions.caseArgs.modId)) + ? userToTemplateSafeUser(await resolveUser(pluginData.client, warnOptions.caseArgs.modId, "ModActions:warnMember")) : null, }), ); diff --git a/backend/src/plugins/ModActions/types.ts b/backend/src/plugins/ModActions/types.ts index 7f4c0aa69..fe8f712a9 100644 --- a/backend/src/plugins/ModActions/types.ts +++ b/backend/src/plugins/ModActions/types.ts @@ -7,8 +7,8 @@ import { guildPluginSlashCommand, guildPluginSlashGroup, pluginUtils, -} from "knub"; -import z from "zod/v4"; +} from "vety"; +import { z } from "zod"; import { Queue } from "../../Queue.js"; import { GuildCases } from "../../data/GuildCases.js"; import { GuildLogs } from "../../data/GuildLogs.js"; diff --git a/backend/src/plugins/Mutes/MutesPlugin.ts b/backend/src/plugins/Mutes/MutesPlugin.ts index 0a302ee2b..a33c69735 100644 --- a/backend/src/plugins/Mutes/MutesPlugin.ts +++ b/backend/src/plugins/Mutes/MutesPlugin.ts @@ -1,6 +1,6 @@ import { GuildMember, Snowflake } from "discord.js"; import { EventEmitter } from "events"; -import { guildPlugin } from "knub"; +import { guildPlugin } from "vety"; import { GuildArchives } from "../../data/GuildArchives.js"; import { GuildCases } from "../../data/GuildCases.js"; import { onGuildEvent } from "../../data/GuildEvents.js"; diff --git a/backend/src/plugins/Mutes/events/RegisterManualTimeoutsEvt.ts b/backend/src/plugins/Mutes/events/RegisterManualTimeoutsEvt.ts index f627d4797..96da4ffac 100644 --- a/backend/src/plugins/Mutes/events/RegisterManualTimeoutsEvt.ts +++ b/backend/src/plugins/Mutes/events/RegisterManualTimeoutsEvt.ts @@ -15,7 +15,7 @@ export const RegisterManualTimeoutsEvt = mutesEvt({ return; } - const target = await resolveUser(pluginData.client, auditLogEntry.targetId!); + const target = await resolveUser(pluginData.client, auditLogEntry.targetId!, "Mutes:RegisterManualTimeoutsEvt"); // Only act based on the last changes in this log let lastTimeoutChange: AuditLogChange | null = null; diff --git a/backend/src/plugins/Mutes/functions/clearMute.ts b/backend/src/plugins/Mutes/functions/clearMute.ts index 712788b8d..f5f84ce10 100644 --- a/backend/src/plugins/Mutes/functions/clearMute.ts +++ b/backend/src/plugins/Mutes/functions/clearMute.ts @@ -1,5 +1,5 @@ import { GuildMember } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { MuteTypes } from "../../../data/MuteTypes.js"; import { Mute } from "../../../data/entities/Mute.js"; import { clearExpiringMute } from "../../../data/loops/expiringMutesLoop.js"; diff --git a/backend/src/plugins/Mutes/functions/getDefaultMuteType.ts b/backend/src/plugins/Mutes/functions/getDefaultMuteType.ts index 3e72b37fa..3b40c0f9a 100644 --- a/backend/src/plugins/Mutes/functions/getDefaultMuteType.ts +++ b/backend/src/plugins/Mutes/functions/getDefaultMuteType.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { MuteTypes } from "../../../data/MuteTypes.js"; import { MutesPluginType } from "../types.js"; diff --git a/backend/src/plugins/Mutes/functions/memberHasMutedRole.ts b/backend/src/plugins/Mutes/functions/memberHasMutedRole.ts index d6f23cef4..7e720b9f4 100644 --- a/backend/src/plugins/Mutes/functions/memberHasMutedRole.ts +++ b/backend/src/plugins/Mutes/functions/memberHasMutedRole.ts @@ -1,5 +1,5 @@ import { GuildMember, Snowflake } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { MutesPluginType } from "../types.js"; export function memberHasMutedRole(pluginData: GuildPluginData, member: GuildMember): boolean { diff --git a/backend/src/plugins/Mutes/functions/muteUser.ts b/backend/src/plugins/Mutes/functions/muteUser.ts index fbb6497b7..b40aeefa1 100644 --- a/backend/src/plugins/Mutes/functions/muteUser.ts +++ b/backend/src/plugins/Mutes/functions/muteUser.ts @@ -1,5 +1,5 @@ import { Snowflake } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { ERRORS, RecoverablePluginError } from "../../../RecoverablePluginError.js"; import { CaseTypes } from "../../../data/CaseTypes.js"; import { AddMuteParams } from "../../../data/GuildMutes.js"; @@ -53,7 +53,7 @@ export async function muteUser( muteOptions.caseArgs.modId = pluginData.client.user!.id; } - const user = await resolveUser(pluginData.client, userId); + const user = await resolveUser(pluginData.client, userId, "Mutes:muteUser"); if (!user.id) { lock.unlock(); throw new RecoverablePluginError(ERRORS.INVALID_USER); @@ -186,8 +186,8 @@ export async function muteUser( const template = existingMute ? config.update_mute_message : muteTime - ? config.timed_mute_message - : config.mute_message; + ? config.timed_mute_message + : config.mute_message; let muteMessage: string | null = null; try { @@ -200,7 +200,7 @@ export async function muteUser( reason: reasonWithAttachments || "None", time: timeUntilUnmuteStr, moderator: muteOptions.caseArgs?.modId - ? userToTemplateSafeUser(await resolveUser(pluginData.client, muteOptions.caseArgs.modId)) + ? userToTemplateSafeUser(await resolveUser(pluginData.client, muteOptions.caseArgs.modId, "Mutes:muteUser")) : null, }), )); @@ -280,7 +280,7 @@ export async function muteUser( } // Log the action - const mod = await resolveUser(pluginData.client, muteOptions.caseArgs?.modId); + const mod = await resolveUser(pluginData.client, muteOptions.caseArgs?.modId, "Mutes:muteUser"); if (muteTime) { pluginData.getPlugin(LogsPlugin).logMemberTimedMute({ mod, diff --git a/backend/src/plugins/Mutes/functions/offMutesEvent.ts b/backend/src/plugins/Mutes/functions/offMutesEvent.ts index 232f1a658..8df6718ae 100644 --- a/backend/src/plugins/Mutes/functions/offMutesEvent.ts +++ b/backend/src/plugins/Mutes/functions/offMutesEvent.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { MutesEvents, MutesPluginType } from "../types.js"; export function offMutesEvent( diff --git a/backend/src/plugins/Mutes/functions/onMutesEvent.ts b/backend/src/plugins/Mutes/functions/onMutesEvent.ts index 8c41f1940..48667881f 100644 --- a/backend/src/plugins/Mutes/functions/onMutesEvent.ts +++ b/backend/src/plugins/Mutes/functions/onMutesEvent.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { MutesEvents, MutesPluginType } from "../types.js"; export function onMutesEvent( diff --git a/backend/src/plugins/Mutes/functions/renewTimeoutMute.ts b/backend/src/plugins/Mutes/functions/renewTimeoutMute.ts index fa5855132..f2a1164ee 100644 --- a/backend/src/plugins/Mutes/functions/renewTimeoutMute.ts +++ b/backend/src/plugins/Mutes/functions/renewTimeoutMute.ts @@ -1,5 +1,5 @@ import { PermissionFlagsBits } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import moment from "moment-timezone"; import { MAX_TIMEOUT_DURATION } from "../../../data/Mutes.js"; import { Mute } from "../../../data/entities/Mute.js"; diff --git a/backend/src/plugins/Mutes/functions/unmuteUser.ts b/backend/src/plugins/Mutes/functions/unmuteUser.ts index b9d4c2b2c..016084b7b 100644 --- a/backend/src/plugins/Mutes/functions/unmuteUser.ts +++ b/backend/src/plugins/Mutes/functions/unmuteUser.ts @@ -1,5 +1,5 @@ import { Snowflake } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { CaseTypes } from "../../../data/CaseTypes.js"; import { AddMuteParams } from "../../../data/GuildMutes.js"; import { MuteTypes } from "../../../data/MuteTypes.js"; @@ -22,7 +22,7 @@ export async function unmuteUser( caseArgs: Partial = {}, ): Promise { const existingMute = await pluginData.state.mutes.findExistingMuteForUserId(userId); - const user = await resolveUser(pluginData.client, userId); + const user = await resolveUser(pluginData.client, userId, "Mutes:unmuteUser"); const member = await resolveMember(pluginData.client, pluginData.guild, userId, true); // Grab the fresh member so we don't have stale role info const modId = caseArgs.modId || pluginData.client.user!.id; diff --git a/backend/src/plugins/Mutes/types.ts b/backend/src/plugins/Mutes/types.ts index b133134c7..89e9f8df6 100644 --- a/backend/src/plugins/Mutes/types.ts +++ b/backend/src/plugins/Mutes/types.ts @@ -1,7 +1,7 @@ import { GuildMember } from "discord.js"; import { EventEmitter } from "events"; -import { BasePluginType, guildPluginEventListener, guildPluginMessageCommand, pluginUtils } from "knub"; -import z from "zod/v4"; +import { BasePluginType, guildPluginEventListener, guildPluginMessageCommand, pluginUtils } from "vety"; +import { z } from "zod"; import { GuildArchives } from "../../data/GuildArchives.js"; import { GuildCases } from "../../data/GuildCases.js"; import { GuildLogs } from "../../data/GuildLogs.js"; diff --git a/backend/src/plugins/NameHistory/NameHistoryPlugin.ts b/backend/src/plugins/NameHistory/NameHistoryPlugin.ts index 57d729222..d36b8888b 100644 --- a/backend/src/plugins/NameHistory/NameHistoryPlugin.ts +++ b/backend/src/plugins/NameHistory/NameHistoryPlugin.ts @@ -1,4 +1,4 @@ -import { guildPlugin } from "knub"; +import { guildPlugin } from "vety"; import { Queue } from "../../Queue.js"; import { GuildNicknameHistory } from "../../data/GuildNicknameHistory.js"; import { UsernameHistory } from "../../data/UsernameHistory.js"; diff --git a/backend/src/plugins/NameHistory/commands/NamesCmd.ts b/backend/src/plugins/NameHistory/commands/NamesCmd.ts index f7e27ce4c..b6206befb 100644 --- a/backend/src/plugins/NameHistory/commands/NamesCmd.ts +++ b/backend/src/plugins/NameHistory/commands/NamesCmd.ts @@ -1,5 +1,5 @@ import { Snowflake } from "discord.js"; -import { createChunkedMessage, disableCodeBlocks } from "knub/helpers"; +import { createChunkedMessage, disableCodeBlocks } from "vety/helpers"; import { commandTypeHelpers as ct } from "../../../commandTypes.js"; import { MAX_NICKNAME_ENTRIES_PER_USER } from "../../../data/GuildNicknameHistory.js"; import { MAX_USERNAME_ENTRIES_PER_USER } from "../../../data/UsernameHistory.js"; diff --git a/backend/src/plugins/NameHistory/types.ts b/backend/src/plugins/NameHistory/types.ts index 84e9b968d..31ed1b0d6 100644 --- a/backend/src/plugins/NameHistory/types.ts +++ b/backend/src/plugins/NameHistory/types.ts @@ -1,5 +1,5 @@ -import { BasePluginType, guildPluginEventListener, guildPluginMessageCommand, pluginUtils } from "knub"; -import z from "zod/v4"; +import { BasePluginType, guildPluginEventListener, guildPluginMessageCommand, pluginUtils } from "vety"; +import { z } from "zod"; import { Queue } from "../../Queue.js"; import { GuildNicknameHistory } from "../../data/GuildNicknameHistory.js"; import { UsernameHistory } from "../../data/UsernameHistory.js"; diff --git a/backend/src/plugins/NameHistory/updateNickname.ts b/backend/src/plugins/NameHistory/updateNickname.ts index 2eebad1e3..4d86398d8 100644 --- a/backend/src/plugins/NameHistory/updateNickname.ts +++ b/backend/src/plugins/NameHistory/updateNickname.ts @@ -1,5 +1,5 @@ import { GuildMember } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { NameHistoryPluginType } from "./types.js"; export async function updateNickname(pluginData: GuildPluginData, member: GuildMember) { diff --git a/backend/src/plugins/Persist/PersistPlugin.ts b/backend/src/plugins/Persist/PersistPlugin.ts index 400083736..6c57c4f09 100644 --- a/backend/src/plugins/Persist/PersistPlugin.ts +++ b/backend/src/plugins/Persist/PersistPlugin.ts @@ -1,4 +1,4 @@ -import { guildPlugin } from "knub"; +import { guildPlugin } from "vety"; import { GuildLogs } from "../../data/GuildLogs.js"; import { GuildPersistedData } from "../../data/GuildPersistedData.js"; import { LogsPlugin } from "../Logs/LogsPlugin.js"; diff --git a/backend/src/plugins/Persist/events/LoadDataEvt.ts b/backend/src/plugins/Persist/events/LoadDataEvt.ts index dcde2b976..9ef9a8183 100644 --- a/backend/src/plugins/Persist/events/LoadDataEvt.ts +++ b/backend/src/plugins/Persist/events/LoadDataEvt.ts @@ -1,5 +1,5 @@ import { GuildMember, PermissionFlagsBits } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { intersection } from "lodash-es"; import { PersistedData } from "../../../data/entities/PersistedData.js"; import { SECONDS } from "../../../utils.js"; diff --git a/backend/src/plugins/Persist/types.ts b/backend/src/plugins/Persist/types.ts index bb48a1fdf..c08409442 100644 --- a/backend/src/plugins/Persist/types.ts +++ b/backend/src/plugins/Persist/types.ts @@ -1,5 +1,5 @@ -import { BasePluginType, guildPluginEventListener } from "knub"; -import z from "zod/v4"; +import { BasePluginType, guildPluginEventListener } from "vety"; +import { z } from "zod"; import { GuildLogs } from "../../data/GuildLogs.js"; import { GuildPersistedData } from "../../data/GuildPersistedData.js"; import { zSnowflake } from "../../utils.js"; diff --git a/backend/src/plugins/Phisherman/PhishermanPlugin.ts b/backend/src/plugins/Phisherman/PhishermanPlugin.ts index 610787766..b09fe6587 100644 --- a/backend/src/plugins/Phisherman/PhishermanPlugin.ts +++ b/backend/src/plugins/Phisherman/PhishermanPlugin.ts @@ -1,4 +1,4 @@ -import { guildPlugin } from "knub"; +import { guildPlugin } from "vety"; import { PhishermanPluginType, zPhishermanConfig } from "./types.js"; export const PhishermanPlugin = guildPlugin()({ diff --git a/backend/src/plugins/Phisherman/types.ts b/backend/src/plugins/Phisherman/types.ts index b483cc924..c04c09689 100644 --- a/backend/src/plugins/Phisherman/types.ts +++ b/backend/src/plugins/Phisherman/types.ts @@ -1,5 +1,5 @@ -import { BasePluginType } from "knub"; -import z from "zod/v4"; +import { BasePluginType } from "vety"; +import { z } from "zod"; export const zPhishermanConfig = z.strictObject({ api_key: z.string().max(255).nullable().default(null), @@ -7,5 +7,6 @@ export const zPhishermanConfig = z.strictObject({ export interface PhishermanPluginType extends BasePluginType { configSchema: typeof zPhishermanConfig; + // eslint-disable-next-line @typescript-eslint/ban-types state: {}; } diff --git a/backend/src/plugins/PingableRoles/PingableRolesPlugin.ts b/backend/src/plugins/PingableRoles/PingableRolesPlugin.ts index 2790dc5be..2b4cf0739 100644 --- a/backend/src/plugins/PingableRoles/PingableRolesPlugin.ts +++ b/backend/src/plugins/PingableRoles/PingableRolesPlugin.ts @@ -1,4 +1,4 @@ -import { guildPlugin } from "knub"; +import { guildPlugin } from "vety"; import { GuildPingableRoles } from "../../data/GuildPingableRoles.js"; import { CommonPlugin } from "../Common/CommonPlugin.js"; import { PingableRoleDisableCmd } from "./commands/PingableRoleDisableCmd.js"; diff --git a/backend/src/plugins/PingableRoles/types.ts b/backend/src/plugins/PingableRoles/types.ts index 58f3c6362..788fb0561 100644 --- a/backend/src/plugins/PingableRoles/types.ts +++ b/backend/src/plugins/PingableRoles/types.ts @@ -1,5 +1,5 @@ -import { BasePluginType, guildPluginEventListener, guildPluginMessageCommand, pluginUtils } from "knub"; -import z from "zod/v4"; +import { BasePluginType, guildPluginEventListener, guildPluginMessageCommand, pluginUtils } from "vety"; +import { z } from "zod"; import { GuildPingableRoles } from "../../data/GuildPingableRoles.js"; import { PingableRole } from "../../data/entities/PingableRole.js"; import { CommonPlugin } from "../Common/CommonPlugin.js"; diff --git a/backend/src/plugins/PingableRoles/utils/disablePingableRoles.ts b/backend/src/plugins/PingableRoles/utils/disablePingableRoles.ts index a4ea15d52..f078b8a44 100644 --- a/backend/src/plugins/PingableRoles/utils/disablePingableRoles.ts +++ b/backend/src/plugins/PingableRoles/utils/disablePingableRoles.ts @@ -1,5 +1,5 @@ import { Snowflake } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { PingableRole } from "../../../data/entities/PingableRole.js"; import { PingableRolesPluginType } from "../types.js"; diff --git a/backend/src/plugins/PingableRoles/utils/enablePingableRoles.ts b/backend/src/plugins/PingableRoles/utils/enablePingableRoles.ts index a4dc26348..5f4c87daf 100644 --- a/backend/src/plugins/PingableRoles/utils/enablePingableRoles.ts +++ b/backend/src/plugins/PingableRoles/utils/enablePingableRoles.ts @@ -1,5 +1,5 @@ import { Snowflake } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { PingableRole } from "../../../data/entities/PingableRole.js"; import { PingableRolesPluginType } from "../types.js"; diff --git a/backend/src/plugins/PingableRoles/utils/getPingableRolesForChannel.ts b/backend/src/plugins/PingableRoles/utils/getPingableRolesForChannel.ts index 6949edf1c..ce2704720 100644 --- a/backend/src/plugins/PingableRoles/utils/getPingableRolesForChannel.ts +++ b/backend/src/plugins/PingableRoles/utils/getPingableRolesForChannel.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { PingableRole } from "../../../data/entities/PingableRole.js"; import { PingableRolesPluginType } from "../types.js"; diff --git a/backend/src/plugins/Post/PostPlugin.ts b/backend/src/plugins/Post/PostPlugin.ts index 47c9e62c6..8b2c7e4cb 100644 --- a/backend/src/plugins/Post/PostPlugin.ts +++ b/backend/src/plugins/Post/PostPlugin.ts @@ -1,4 +1,4 @@ -import { guildPlugin } from "knub"; +import { guildPlugin } from "vety"; import { onGuildEvent } from "../../data/GuildEvents.js"; import { GuildLogs } from "../../data/GuildLogs.js"; import { GuildSavedMessages } from "../../data/GuildSavedMessages.js"; diff --git a/backend/src/plugins/Post/types.ts b/backend/src/plugins/Post/types.ts index 0f9add610..d0edd97d4 100644 --- a/backend/src/plugins/Post/types.ts +++ b/backend/src/plugins/Post/types.ts @@ -1,5 +1,5 @@ -import { BasePluginType, guildPluginMessageCommand, pluginUtils } from "knub"; -import z from "zod/v4"; +import { BasePluginType, guildPluginMessageCommand, pluginUtils } from "vety"; +import { z } from "zod"; import { GuildLogs } from "../../data/GuildLogs.js"; import { GuildSavedMessages } from "../../data/GuildSavedMessages.js"; import { GuildScheduledPosts } from "../../data/GuildScheduledPosts.js"; diff --git a/backend/src/plugins/Post/util/actualPostCmd.ts b/backend/src/plugins/Post/util/actualPostCmd.ts index 04c6def06..782fc1844 100644 --- a/backend/src/plugins/Post/util/actualPostCmd.ts +++ b/backend/src/plugins/Post/util/actualPostCmd.ts @@ -1,5 +1,5 @@ import { GuildTextBasedChannel, Message } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import moment from "moment-timezone"; import { registerUpcomingScheduledPost } from "../../../data/loops/upcomingScheduledPostsLoop.js"; import { humanizeDuration } from "../../../humanizeDuration.js"; diff --git a/backend/src/plugins/Post/util/parseScheduleTime.ts b/backend/src/plugins/Post/util/parseScheduleTime.ts index 8ac87fa1c..794e08c1d 100644 --- a/backend/src/plugins/Post/util/parseScheduleTime.ts +++ b/backend/src/plugins/Post/util/parseScheduleTime.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import moment, { Moment } from "moment-timezone"; import { convertDelayStringToMS } from "../../../utils.js"; import { TimeAndDatePlugin } from "../../TimeAndDate/TimeAndDatePlugin.js"; diff --git a/backend/src/plugins/Post/util/postMessage.ts b/backend/src/plugins/Post/util/postMessage.ts index 673aa833c..0be14fcac 100644 --- a/backend/src/plugins/Post/util/postMessage.ts +++ b/backend/src/plugins/Post/util/postMessage.ts @@ -1,6 +1,6 @@ import { Attachment, GuildTextBasedChannel, Message, MessageCreateOptions } from "discord.js"; import fs from "fs"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { downloadFile } from "../../../utils.js"; import { PostPluginType } from "../types.js"; import { formatContent } from "./formatContent.js"; diff --git a/backend/src/plugins/Post/util/postScheduledPost.ts b/backend/src/plugins/Post/util/postScheduledPost.ts index 7ffe62f31..228c599c1 100644 --- a/backend/src/plugins/Post/util/postScheduledPost.ts +++ b/backend/src/plugins/Post/util/postScheduledPost.ts @@ -1,5 +1,5 @@ import { Snowflake, User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import moment from "moment-timezone"; import { ScheduledPost } from "../../../data/entities/ScheduledPost.js"; import { registerUpcomingScheduledPost } from "../../../data/loops/upcomingScheduledPostsLoop.js"; diff --git a/backend/src/plugins/ReactionRoles/ReactionRolesPlugin.ts b/backend/src/plugins/ReactionRoles/ReactionRolesPlugin.ts index 7c8e2ef7c..006ca85f9 100644 --- a/backend/src/plugins/ReactionRoles/ReactionRolesPlugin.ts +++ b/backend/src/plugins/ReactionRoles/ReactionRolesPlugin.ts @@ -1,4 +1,4 @@ -import { guildPlugin } from "knub"; +import { guildPlugin } from "vety"; import { Queue } from "../../Queue.js"; import { GuildReactionRoles } from "../../data/GuildReactionRoles.js"; import { GuildSavedMessages } from "../../data/GuildSavedMessages.js"; diff --git a/backend/src/plugins/ReactionRoles/events/AddReactionRoleEvt.ts b/backend/src/plugins/ReactionRoles/events/AddReactionRoleEvt.ts index 155fffb2e..a38574155 100644 --- a/backend/src/plugins/ReactionRoles/events/AddReactionRoleEvt.ts +++ b/backend/src/plugins/ReactionRoles/events/AddReactionRoleEvt.ts @@ -16,7 +16,7 @@ export const AddReactionRoleEvt = reactionRolesEvt({ if (userId === pluginData.client.user!.id) { // Don't act on own reactions - // FIXME: This may not be needed? Knub currently requires the *member* to be found for the user to be resolved as well. Need to look into it more. + // FIXME: This may not be needed? Vety currently requires the *member* to be found for the user to be resolved as well. Need to look into it more. return; } diff --git a/backend/src/plugins/ReactionRoles/types.ts b/backend/src/plugins/ReactionRoles/types.ts index b22a4856b..a7c11f3e6 100644 --- a/backend/src/plugins/ReactionRoles/types.ts +++ b/backend/src/plugins/ReactionRoles/types.ts @@ -1,5 +1,5 @@ -import { BasePluginType, guildPluginEventListener, guildPluginMessageCommand, pluginUtils } from "knub"; -import z from "zod/v4"; +import { BasePluginType, guildPluginEventListener, guildPluginMessageCommand, pluginUtils } from "vety"; +import { z } from "zod"; import { Queue } from "../../Queue.js"; import { GuildReactionRoles } from "../../data/GuildReactionRoles.js"; import { GuildSavedMessages } from "../../data/GuildSavedMessages.js"; diff --git a/backend/src/plugins/ReactionRoles/util/addMemberPendingRoleChange.ts b/backend/src/plugins/ReactionRoles/util/addMemberPendingRoleChange.ts index d239f7d78..2d6bd4185 100644 --- a/backend/src/plugins/ReactionRoles/util/addMemberPendingRoleChange.ts +++ b/backend/src/plugins/ReactionRoles/util/addMemberPendingRoleChange.ts @@ -1,5 +1,5 @@ import { Snowflake } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { logger } from "../../../logger.js"; import { renderUsername, resolveMember } from "../../../utils.js"; import { memberRolesLock } from "../../../utils/lockNameHelpers.js"; diff --git a/backend/src/plugins/ReactionRoles/util/applyReactionRoleReactionsToMessage.ts b/backend/src/plugins/ReactionRoles/util/applyReactionRoleReactionsToMessage.ts index 9c5094ed0..ff1aa7878 100644 --- a/backend/src/plugins/ReactionRoles/util/applyReactionRoleReactionsToMessage.ts +++ b/backend/src/plugins/ReactionRoles/util/applyReactionRoleReactionsToMessage.ts @@ -1,7 +1,7 @@ import { Snowflake } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { ReactionRole } from "../../../data/entities/ReactionRole.js"; -import { isDiscordAPIError, sleep } from "../../../utils.js"; +import { isDiscordAPIError, isDiscordJsTypeError, sleep } from "../../../utils.js"; import { LogsPlugin } from "../../Logs/LogsPlugin.js"; import { ReactionRolesPluginType } from "../types.js"; @@ -72,7 +72,12 @@ export async function applyReactionRoleReactionsToMessage( await targetMessage.react(rawEmoji); await sleep(750); // Make sure we don't hit rate limits } catch (e) { - if (isDiscordAPIError(e)) { + if (isDiscordJsTypeError(e)) { + errors.push(e.message); + logs.logBotAlert({ + body: `Error ${e.code} while applying reaction role reactions to ${channelId}/${messageId}: ${e.message}.`, + }); + } else if (isDiscordAPIError(e)) { if (e.code === 10014) { pluginData.state.reactionRoles.removeFromMessage(messageId, rawEmoji); errors.push(`Unknown emoji: ${rawEmoji}`); diff --git a/backend/src/plugins/ReactionRoles/util/autoRefreshLoop.ts b/backend/src/plugins/ReactionRoles/util/autoRefreshLoop.ts index f28cb5f38..dad31a40e 100644 --- a/backend/src/plugins/ReactionRoles/util/autoRefreshLoop.ts +++ b/backend/src/plugins/ReactionRoles/util/autoRefreshLoop.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { ReactionRolesPluginType } from "../types.js"; import { runAutoRefresh } from "./runAutoRefresh.js"; diff --git a/backend/src/plugins/ReactionRoles/util/refreshReactionRoles.ts b/backend/src/plugins/ReactionRoles/util/refreshReactionRoles.ts index de61e85ac..507281aa5 100644 --- a/backend/src/plugins/ReactionRoles/util/refreshReactionRoles.ts +++ b/backend/src/plugins/ReactionRoles/util/refreshReactionRoles.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { ReactionRolesPluginType } from "../types.js"; import { applyReactionRoleReactionsToMessage } from "./applyReactionRoleReactionsToMessage.js"; diff --git a/backend/src/plugins/ReactionRoles/util/runAutoRefresh.ts b/backend/src/plugins/ReactionRoles/util/runAutoRefresh.ts index 9a6dc4463..ab3504a66 100644 --- a/backend/src/plugins/ReactionRoles/util/runAutoRefresh.ts +++ b/backend/src/plugins/ReactionRoles/util/runAutoRefresh.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { ReactionRolesPluginType } from "../types.js"; import { refreshReactionRoles } from "./refreshReactionRoles.js"; diff --git a/backend/src/plugins/Reminders/RemindersPlugin.ts b/backend/src/plugins/Reminders/RemindersPlugin.ts index 5a7792884..9daf7c96b 100644 --- a/backend/src/plugins/Reminders/RemindersPlugin.ts +++ b/backend/src/plugins/Reminders/RemindersPlugin.ts @@ -1,4 +1,4 @@ -import { guildPlugin } from "knub"; +import { guildPlugin } from "vety"; import { onGuildEvent } from "../../data/GuildEvents.js"; import { GuildReminders } from "../../data/GuildReminders.js"; import { CommonPlugin } from "../Common/CommonPlugin.js"; diff --git a/backend/src/plugins/Reminders/functions/postReminder.ts b/backend/src/plugins/Reminders/functions/postReminder.ts index 6726b5d44..2f8997161 100644 --- a/backend/src/plugins/Reminders/functions/postReminder.ts +++ b/backend/src/plugins/Reminders/functions/postReminder.ts @@ -1,6 +1,6 @@ import { HTTPError, Snowflake } from "discord.js"; -import { GuildPluginData } from "knub"; -import { disableLinkPreviews } from "knub/helpers"; +import { GuildPluginData } from "vety"; +import { disableLinkPreviews } from "vety/helpers"; import moment from "moment-timezone"; import { Reminder } from "../../../data/entities/Reminder.js"; import { DBDateFormat } from "../../../utils.js"; diff --git a/backend/src/plugins/Reminders/types.ts b/backend/src/plugins/Reminders/types.ts index 66fd8438c..81b422fb8 100644 --- a/backend/src/plugins/Reminders/types.ts +++ b/backend/src/plugins/Reminders/types.ts @@ -1,5 +1,5 @@ -import { BasePluginType, guildPluginMessageCommand, pluginUtils } from "knub"; -import z from "zod/v4"; +import { BasePluginType, guildPluginMessageCommand, pluginUtils } from "vety"; +import { z } from "zod"; import { GuildReminders } from "../../data/GuildReminders.js"; import { CommonPlugin } from "../Common/CommonPlugin.js"; diff --git a/backend/src/plugins/RoleButtons/RoleButtonsPlugin.ts b/backend/src/plugins/RoleButtons/RoleButtonsPlugin.ts index 6826fdcbd..032aa5072 100644 --- a/backend/src/plugins/RoleButtons/RoleButtonsPlugin.ts +++ b/backend/src/plugins/RoleButtons/RoleButtonsPlugin.ts @@ -1,4 +1,4 @@ -import { guildPlugin } from "knub"; +import { guildPlugin } from "vety"; import { GuildRoleButtons } from "../../data/GuildRoleButtons.js"; import { CommonPlugin } from "../Common/CommonPlugin.js"; import { LogsPlugin } from "../Logs/LogsPlugin.js"; diff --git a/backend/src/plugins/RoleButtons/commands/resetButtons.ts b/backend/src/plugins/RoleButtons/commands/resetButtons.ts index 6213e4d56..45de2cf97 100644 --- a/backend/src/plugins/RoleButtons/commands/resetButtons.ts +++ b/backend/src/plugins/RoleButtons/commands/resetButtons.ts @@ -1,4 +1,4 @@ -import { guildPluginMessageCommand } from "knub"; +import { guildPluginMessageCommand } from "vety"; import { commandTypeHelpers as ct } from "../../../commandTypes.js"; import { applyAllRoleButtons } from "../functions/applyAllRoleButtons.js"; import { RoleButtonsPluginType } from "../types.js"; diff --git a/backend/src/plugins/RoleButtons/events/buttonInteraction.ts b/backend/src/plugins/RoleButtons/events/buttonInteraction.ts index f8973d051..a16ea3ca2 100644 --- a/backend/src/plugins/RoleButtons/events/buttonInteraction.ts +++ b/backend/src/plugins/RoleButtons/events/buttonInteraction.ts @@ -1,10 +1,13 @@ import { GuildMember } from "discord.js"; -import { guildPluginEventListener } from "knub"; +import { guildPluginEventListener } from "vety"; import { SECONDS } from "../../../utils.js"; +import { renderRecursively } from "../../../utils.js"; import { parseCustomId } from "../../../utils/parseCustomId.js"; import { RoleManagerPlugin } from "../../RoleManager/RoleManagerPlugin.js"; import { getAllRolesInButtons } from "../functions/getAllRolesInButtons.js"; import { RoleButtonsPluginType, TRoleButtonOption } from "../types.js"; +import { renderTemplate, TemplateSafeValueContainer } from "../../../templateFormatter.js"; +import { memberToTemplateSafeMember, roleToTemplateSafeRole, userToTemplateSafeUser } from "../../../utils/templateSafeObjects.js"; const ROLE_BUTTON_CD = 5 * SECONDS; @@ -31,7 +34,6 @@ export const onButtonInteraction = guildPluginEventListener console.trace(err.message)); return; } @@ -53,14 +55,25 @@ export const onButtonInteraction = guildPluginEventListener + renderTemplate( + str, + new TemplateSafeValueContainer({ + user: member ? memberToTemplateSafeMember(member) : userToTemplateSafeUser(args.interaction.user), + role: role ? roleToTemplateSafeRole(role) : new TemplateSafeValueContainer({ name: roleName, id: option.role_id }), + }), + ); + if (member.roles.cache.has(option.role_id)) { rolesToRemove.push(option.role_id); + + const messageTemplate = config.buttons[name].remove_message || `The role **${roleName}** will be removed shortly!`; + const formatted = typeof messageTemplate === "string" + ? await renderTemplateText(messageTemplate) + : await renderRecursively(messageTemplate, renderTemplateText); + args.interaction - .reply({ - ephemeral: true, - content: `The role **${roleName}** will be removed shortly!`, - }) - // tslint:disable-next-line no-console + .reply({ ephemeral: true, ...(typeof formatted === "string" ? { content: formatted } : formatted) }) .catch((err) => console.trace(err.message)); } else { rolesToAdd.push(option.role_id); @@ -73,12 +86,13 @@ export const onButtonInteraction = guildPluginEventListener console.trace(err.message)); } @@ -89,4 +103,4 @@ export const onButtonInteraction = guildPluginEventListener) { diff --git a/backend/src/plugins/TimeAndDate/functions/getMemberTz.ts b/backend/src/plugins/TimeAndDate/functions/getMemberTz.ts index 9363a1a2a..b4d534cc5 100644 --- a/backend/src/plugins/TimeAndDate/functions/getMemberTz.ts +++ b/backend/src/plugins/TimeAndDate/functions/getMemberTz.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { TimeAndDatePluginType } from "../types.js"; import { getGuildTz } from "./getGuildTz.js"; diff --git a/backend/src/plugins/TimeAndDate/functions/inGuildTz.ts b/backend/src/plugins/TimeAndDate/functions/inGuildTz.ts index 1b17fba11..25b7f32b7 100644 --- a/backend/src/plugins/TimeAndDate/functions/inGuildTz.ts +++ b/backend/src/plugins/TimeAndDate/functions/inGuildTz.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import moment from "moment-timezone"; import { TimeAndDatePluginType } from "../types.js"; import { getGuildTz } from "./getGuildTz.js"; diff --git a/backend/src/plugins/TimeAndDate/functions/inMemberTz.ts b/backend/src/plugins/TimeAndDate/functions/inMemberTz.ts index 16682ef54..53f6ac064 100644 --- a/backend/src/plugins/TimeAndDate/functions/inMemberTz.ts +++ b/backend/src/plugins/TimeAndDate/functions/inMemberTz.ts @@ -1,4 +1,4 @@ -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import moment from "moment-timezone"; import { TimeAndDatePluginType } from "../types.js"; import { getMemberTz } from "./getMemberTz.js"; diff --git a/backend/src/plugins/TimeAndDate/types.ts b/backend/src/plugins/TimeAndDate/types.ts index 24e1eb3de..3f94572f1 100644 --- a/backend/src/plugins/TimeAndDate/types.ts +++ b/backend/src/plugins/TimeAndDate/types.ts @@ -1,18 +1,18 @@ -import { BasePluginType, guildPluginMessageCommand, pluginUtils } from "knub"; -import { U } from "ts-toolbelt"; -import z from "zod/v4"; +import { BasePluginType, guildPluginMessageCommand, pluginUtils } from "vety"; +import { z } from "zod"; import { GuildMemberTimezones } from "../../data/GuildMemberTimezones.js"; import { keys } from "../../utils.js"; import { zValidTimezone } from "../../utils/zValidTimezone.js"; import { CommonPlugin } from "../Common/CommonPlugin.js"; import { defaultDateFormats } from "./defaultDateFormats.js"; -const zDateFormatKeys = z.enum(keys(defaultDateFormats) as U.ListOf); - -const dateFormatTypeMap = keys(defaultDateFormats).reduce((map, key) => { - map[key] = z.string().default(defaultDateFormats[key]); - return map; -}, {} as Record>); +const dateFormatTypeMap = keys(defaultDateFormats).reduce( + (map, key) => { + map[key] = z.string().default(defaultDateFormats[key]); + return map; + }, + {} as Record>, +); export const zTimeAndDateConfig = z.strictObject({ timezone: zValidTimezone(z.string()).default("Etc/UTC"), diff --git a/backend/src/plugins/UsernameSaver/UsernameSaverPlugin.ts b/backend/src/plugins/UsernameSaver/UsernameSaverPlugin.ts index 5008d0a75..911403ada 100644 --- a/backend/src/plugins/UsernameSaver/UsernameSaverPlugin.ts +++ b/backend/src/plugins/UsernameSaver/UsernameSaverPlugin.ts @@ -1,4 +1,4 @@ -import { guildPlugin } from "knub"; +import { guildPlugin } from "vety"; import { Queue } from "../../Queue.js"; import { UsernameHistory } from "../../data/UsernameHistory.js"; import { MessageCreateUpdateUsernameEvt, VoiceChannelJoinUpdateUsernameEvt } from "./events/UpdateUsernameEvts.js"; diff --git a/backend/src/plugins/UsernameSaver/types.ts b/backend/src/plugins/UsernameSaver/types.ts index 2bbd93bdb..ae1e73661 100644 --- a/backend/src/plugins/UsernameSaver/types.ts +++ b/backend/src/plugins/UsernameSaver/types.ts @@ -1,5 +1,5 @@ -import { BasePluginType, guildPluginEventListener } from "knub"; -import z from "zod/v4"; +import { BasePluginType, guildPluginEventListener } from "vety"; +import { z } from "zod"; import { Queue } from "../../Queue.js"; import { UsernameHistory } from "../../data/UsernameHistory.js"; diff --git a/backend/src/plugins/UsernameSaver/updateUsername.ts b/backend/src/plugins/UsernameSaver/updateUsername.ts index f067f1689..c9e057b01 100644 --- a/backend/src/plugins/UsernameSaver/updateUsername.ts +++ b/backend/src/plugins/UsernameSaver/updateUsername.ts @@ -1,5 +1,5 @@ import { User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { renderUsername } from "../../utils.js"; import { UsernameSaverPluginType } from "./types.js"; diff --git a/backend/src/plugins/Utility/UtilityPlugin.ts b/backend/src/plugins/Utility/UtilityPlugin.ts index 0ad9bde0c..fb260979a 100644 --- a/backend/src/plugins/Utility/UtilityPlugin.ts +++ b/backend/src/plugins/Utility/UtilityPlugin.ts @@ -1,5 +1,5 @@ import { Snowflake } from "discord.js"; -import { guildPlugin } from "knub"; +import { guildPlugin } from "vety"; import { GuildArchives } from "../../data/GuildArchives.js"; import { GuildCases } from "../../data/GuildCases.js"; import { GuildLogs } from "../../data/GuildLogs.js"; diff --git a/backend/src/plugins/Utility/commands/AboutCmd.ts b/backend/src/plugins/Utility/commands/AboutCmd.ts index 44380ed92..853579ab2 100644 --- a/backend/src/plugins/Utility/commands/AboutCmd.ts +++ b/backend/src/plugins/Utility/commands/AboutCmd.ts @@ -1,14 +1,25 @@ import { APIEmbed, GuildChannel } from "discord.js"; -import LCL from "last-commit-log"; -import shuffle from "lodash/shuffle.js"; +import { shuffle } from "lodash-es"; import moment from "moment-timezone"; -import { humanizeDuration } from "../../../humanizeDuration.js"; +import { accessSync, readFileSync } from "node:fs"; import { rootDir } from "../../../paths.js"; -import { getCurrentUptime } from "../../../uptime.js"; +import { getBotStartTime } from "../../../uptime.js"; import { resolveMember, sorter } from "../../../utils.js"; import { TimeAndDatePlugin } from "../../TimeAndDate/TimeAndDatePlugin.js"; import { utilityCmd } from "../types.js"; +let commitHash: string | null = null; +try { + accessSync(`${rootDir}/.commit-hash`); + commitHash = readFileSync(`${rootDir}/.commit-hash`, "utf-8").trim(); +} catch {} + +let buildTime: string | null = null; +try { + accessSync(`${rootDir}/.build-time`); + buildTime = readFileSync(`${rootDir}/.build-time`, "utf-8").trim(); +} catch {} + export const AboutCmd = utilityCmd({ trigger: "about", description: "Show information about Zeppelin's status on the server", @@ -17,45 +28,20 @@ export const AboutCmd = utilityCmd({ async run({ message: msg, pluginData }) { const timeAndDate = pluginData.getPlugin(TimeAndDatePlugin); - const uptime = getCurrentUptime(); - const prettyUptime = humanizeDuration(uptime, { largest: 2, round: true }); - - let lastCommit; - - try { - const lcl = new LCL(rootDir); - lastCommit = await lcl.getLastCommit(); - } catch {} // eslint-disable-line no-empty - - let lastUpdate; - let version; - - if (lastCommit) { - lastUpdate = timeAndDate - .inGuildTz(moment.utc(lastCommit.committer.date, "X")) - .format(pluginData.getPlugin(TimeAndDatePlugin).getDateFormat("pretty_datetime")); - version = lastCommit.shortHash; - } else { - lastUpdate = "?"; - version = "?"; - } - - const lastReload = humanizeDuration(Date.now() - pluginData.state.lastReload, { - largest: 2, - round: true, - }); + const botStartTime = getBotStartTime(); + const buildTimeMoment = buildTime ? moment.utc(buildTime, "YYYY-MM-DDTHH:mm:ss[Z]") : null; const basicInfoRows = [ - ["Uptime", prettyUptime], - ["Last config reload", `${lastReload} ago`], - ["Last bot update", lastUpdate], - ["Version", version], + ["Bot start time", ``], + ["Last config reload", ``], + ["Last bot update", buildTimeMoment ? `` : "Unknown"], + ["Version", commitHash?.slice(0, 7) || "Unknown"], ["API latency", `${pluginData.client.ws.ping}ms`], ["Server timezone", timeAndDate.getGuildTz()], ]; const loadedPlugins = Array.from( - pluginData.getKnubInstance().getLoadedGuild(pluginData.guild.id)!.loadedPlugins.keys(), + pluginData.getVetyInstance().getLoadedGuild(pluginData.guild.id)!.loadedPlugins.keys(), ); loadedPlugins.sort(); diff --git a/backend/src/plugins/Utility/commands/HelpCmd.ts b/backend/src/plugins/Utility/commands/HelpCmd.ts index 4c103e198..1d2fe9ded 100644 --- a/backend/src/plugins/Utility/commands/HelpCmd.ts +++ b/backend/src/plugins/Utility/commands/HelpCmd.ts @@ -1,4 +1,4 @@ -import { LoadedGuildPlugin, PluginCommandDefinition } from "knub"; +import { LoadedGuildPlugin, PluginCommandDefinition } from "vety"; import { commandTypeHelpers as ct } from "../../../commandTypes.js"; import { env } from "../../../env.js"; import { createChunkedMessage } from "../../../utils.js"; @@ -22,7 +22,7 @@ export const HelpCmd = utilityCmd({ command: PluginCommandDefinition; }> = []; - const guildData = pluginData.getKnubInstance().getLoadedGuild(pluginData.guild.id)!; + const guildData = pluginData.getVetyInstance().getLoadedGuild(pluginData.guild.id)!; for (const plugin of guildData.loadedPlugins.values()) { const registeredCommands = plugin.pluginData.messageCommands.getAll(); for (const registeredCommand of registeredCommands) { diff --git a/backend/src/plugins/Utility/commands/InfoCmd.ts b/backend/src/plugins/Utility/commands/InfoCmd.ts index 8c92e7863..0610ef5e6 100644 --- a/backend/src/plugins/Utility/commands/InfoCmd.ts +++ b/backend/src/plugins/Utility/commands/InfoCmd.ts @@ -1,5 +1,5 @@ import { Snowflake } from "discord.js"; -import { getChannelId, getRoleId } from "knub/helpers"; +import { getChannelId, getRoleId } from "vety/helpers"; import { commandTypeHelpers as ct } from "../../../commandTypes.js"; import { resolveMessageMember } from "../../../pluginUtils.js"; import { isValidSnowflake, noop, parseInviteCodeInput, resolveInvite, resolveUser } from "../../../utils.js"; @@ -64,7 +64,7 @@ export const InfoCmd = utilityCmd({ // 3. User if (userCfg.can_userinfo) { - const user = await resolveUser(pluginData.client, value); + const user = await resolveUser(pluginData.client, value, "Utility:InfoCmd"); if (user && userCfg.can_userinfo) { const embed = await getUserInfoEmbed(pluginData, user.id, Boolean(args.compact)); if (embed) { diff --git a/backend/src/plugins/Utility/commands/LevelCmd.ts b/backend/src/plugins/Utility/commands/LevelCmd.ts index 9542dd8b1..4ab5bf066 100644 --- a/backend/src/plugins/Utility/commands/LevelCmd.ts +++ b/backend/src/plugins/Utility/commands/LevelCmd.ts @@ -1,4 +1,4 @@ -import { helpers } from "knub"; +import { helpers } from "vety"; import { commandTypeHelpers as ct } from "../../../commandTypes.js"; import { renderUsername } from "../../../utils.js"; import { utilityCmd } from "../types.js"; diff --git a/backend/src/plugins/Utility/commands/ReloadGuildCmd.ts b/backend/src/plugins/Utility/commands/ReloadGuildCmd.ts index 3c00eda70..cd8da424c 100644 --- a/backend/src/plugins/Utility/commands/ReloadGuildCmd.ts +++ b/backend/src/plugins/Utility/commands/ReloadGuildCmd.ts @@ -12,6 +12,6 @@ export const ReloadGuildCmd = utilityCmd({ activeReloads.set(pluginData.guild.id, msg.channel as TextChannel); msg.channel.send("Reloading..."); - pluginData.getKnubInstance().reloadGuild(pluginData.guild.id); + pluginData.getVetyInstance().reloadGuild(pluginData.guild.id); }, }); diff --git a/backend/src/plugins/Utility/functions/cleanMessages.ts b/backend/src/plugins/Utility/functions/cleanMessages.ts index be707984c..29574035b 100644 --- a/backend/src/plugins/Utility/functions/cleanMessages.ts +++ b/backend/src/plugins/Utility/functions/cleanMessages.ts @@ -1,5 +1,5 @@ import { GuildBasedChannel, Snowflake, TextBasedChannel, User } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { SavedMessage } from "../../../data/entities/SavedMessage.js"; import { LogType } from "../../../data/LogType.js"; import { getBaseUrl } from "../../../pluginUtils.js"; diff --git a/backend/src/plugins/Utility/functions/fetchChannelMessagesToClean.ts b/backend/src/plugins/Utility/functions/fetchChannelMessagesToClean.ts index 6aed5e56e..39e6f7470 100644 --- a/backend/src/plugins/Utility/functions/fetchChannelMessagesToClean.ts +++ b/backend/src/plugins/Utility/functions/fetchChannelMessagesToClean.ts @@ -1,5 +1,5 @@ import { GuildBasedChannel, Message, OmitPartialGroupDMChannel, Snowflake, TextBasedChannel } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { SavedMessage } from "../../../data/entities/SavedMessage.js"; import { humanizeDurationShort } from "../../../humanizeDuration.js"; import { allowTimeout } from "../../../RegExpRunner.js"; @@ -55,7 +55,7 @@ export async function fetchChannelMessagesToClean( pinIds = new Set((await targetChannel.messages.fetchPinned()).keys()); } - let rawMessagesToClean: Array>> = []; + const rawMessagesToClean: Array>> = []; let beforeId = opts.beforeId; let requests = 0; while (rawMessagesToClean.length < opts.count) { @@ -112,12 +112,14 @@ export async function fetchChannelMessagesToClean( } // Discord messages -> SavedMessages - const existingStored = await pluginData.state.savedMessages.getMultiple(rawMessagesToClean.map((m) => m.id)); - const alreadyStored = existingStored.map((stored) => stored.id); - const messagesToStore = rawMessagesToClean.filter((potentialMsg) => !alreadyStored.includes(potentialMsg.id)); - await pluginData.state.savedMessages.createFromMessages(messagesToStore); + if (rawMessagesToClean.length > 0) { + const existingStored = await pluginData.state.savedMessages.getMultiple(rawMessagesToClean.map((m) => m.id)); + const alreadyStored = existingStored.map((stored) => stored.id); + const messagesToStore = rawMessagesToClean.filter((potentialMsg) => !alreadyStored.includes(potentialMsg.id)); + await pluginData.state.savedMessages.createFromMessages(messagesToStore); - result.messages = await pluginData.state.savedMessages.getMultiple(rawMessagesToClean.map((m) => m.id)); + result.messages = await pluginData.state.savedMessages.getMultiple(rawMessagesToClean.map((m) => m.id)); + } return result; } diff --git a/backend/src/plugins/Utility/functions/getChannelInfoEmbed.ts b/backend/src/plugins/Utility/functions/getChannelInfoEmbed.ts index 401ff39f7..cc6a6d6fc 100644 --- a/backend/src/plugins/Utility/functions/getChannelInfoEmbed.ts +++ b/backend/src/plugins/Utility/functions/getChannelInfoEmbed.ts @@ -1,5 +1,5 @@ import { APIEmbed, ChannelType, Snowflake, StageChannel, VoiceChannel } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { humanizeDuration } from "../../../humanizeDuration.js"; import { EmbedWith, MINUTES, formatNumber, preEmbedPadding, trimLines, verboseUserMention } from "../../../utils.js"; import { UtilityPluginType } from "../types.js"; diff --git a/backend/src/plugins/Utility/functions/getEmojiInfoEmbed.ts b/backend/src/plugins/Utility/functions/getEmojiInfoEmbed.ts index b4e68404d..963af3105 100644 --- a/backend/src/plugins/Utility/functions/getEmojiInfoEmbed.ts +++ b/backend/src/plugins/Utility/functions/getEmojiInfoEmbed.ts @@ -1,5 +1,5 @@ import { APIEmbed } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { EmbedWith, preEmbedPadding, trimLines } from "../../../utils.js"; import { UtilityPluginType } from "../types.js"; diff --git a/backend/src/plugins/Utility/functions/getInviteInfoEmbed.ts b/backend/src/plugins/Utility/functions/getInviteInfoEmbed.ts index 72a14a33f..7e2ff4f91 100644 --- a/backend/src/plugins/Utility/functions/getInviteInfoEmbed.ts +++ b/backend/src/plugins/Utility/functions/getInviteInfoEmbed.ts @@ -1,5 +1,5 @@ import { APIEmbed, ChannelType } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { EmbedWith, formatNumber, @@ -18,7 +18,7 @@ export async function getInviteInfoEmbed( pluginData: GuildPluginData, inviteCode: string, ): Promise { - let invite = await resolveInvite(pluginData.client, inviteCode, true); + const invite = await resolveInvite(pluginData.client, inviteCode, true); if (!invite) { return null; } diff --git a/backend/src/plugins/Utility/functions/getMessageInfoEmbed.ts b/backend/src/plugins/Utility/functions/getMessageInfoEmbed.ts index f003080f3..49a6b3c42 100644 --- a/backend/src/plugins/Utility/functions/getMessageInfoEmbed.ts +++ b/backend/src/plugins/Utility/functions/getMessageInfoEmbed.ts @@ -1,5 +1,5 @@ import { APIEmbed, MessageType, Snowflake, TextChannel } from "discord.js"; -import { GuildPluginData, getDefaultMessageCommandPrefix } from "knub"; +import { GuildPluginData, getDefaultMessageCommandPrefix } from "vety"; import { EmbedWith, chunkMessageLines, diff --git a/backend/src/plugins/Utility/functions/getRoleInfoEmbed.ts b/backend/src/plugins/Utility/functions/getRoleInfoEmbed.ts index 9c27cefe1..ebfc4c418 100644 --- a/backend/src/plugins/Utility/functions/getRoleInfoEmbed.ts +++ b/backend/src/plugins/Utility/functions/getRoleInfoEmbed.ts @@ -1,5 +1,5 @@ import { APIEmbed, PermissionFlagsBits, Role } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { EmbedWith, preEmbedPadding, trimLines } from "../../../utils.js"; import { PERMISSION_NAMES } from "../../../utils/permissionNames.js"; import { UtilityPluginType } from "../types.js"; diff --git a/backend/src/plugins/Utility/functions/getServerInfoEmbed.ts b/backend/src/plugins/Utility/functions/getServerInfoEmbed.ts index f223563d0..48b5b0e76 100644 --- a/backend/src/plugins/Utility/functions/getServerInfoEmbed.ts +++ b/backend/src/plugins/Utility/functions/getServerInfoEmbed.ts @@ -1,5 +1,5 @@ import { APIEmbed, ChannelType, GuildPremiumTier, Snowflake } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { EmbedWith, MINUTES, @@ -59,7 +59,7 @@ export async function getServerInfoEmbed( basicInformation.push(`Created: ****`); if (thisServer) { - const owner = await resolveUser(pluginData.client, thisServer.ownerId); + const owner = await resolveUser(pluginData.client, thisServer.ownerId, "Utility:getServerInfoEmbed"); const ownerName = renderUsername(owner.username, owner.discriminator); basicInformation.push(`Owner: **${ownerName}** (\`${thisServer.ownerId}\`)`); diff --git a/backend/src/plugins/Utility/functions/getUserInfoEmbed.ts b/backend/src/plugins/Utility/functions/getUserInfoEmbed.ts index 30f95ee52..480715d1f 100644 --- a/backend/src/plugins/Utility/functions/getUserInfoEmbed.ts +++ b/backend/src/plugins/Utility/functions/getUserInfoEmbed.ts @@ -1,5 +1,5 @@ import { APIEmbed } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { CaseTypes } from "../../../data/CaseTypes.js"; import { EmbedWith, @@ -27,7 +27,7 @@ export async function getUserInfoEmbed( userId: string, compact = false, ): Promise { - const user = await resolveUser(pluginData.client, userId); + const user = await resolveUser(pluginData.client, userId, "Utility:getUserInfoEmbed"); if (!user || user instanceof UnknownUser) { return null; } diff --git a/backend/src/plugins/Utility/functions/hasPermission.ts b/backend/src/plugins/Utility/functions/hasPermission.ts index ebefe2036..dc1f25d4b 100644 --- a/backend/src/plugins/Utility/functions/hasPermission.ts +++ b/backend/src/plugins/Utility/functions/hasPermission.ts @@ -1,5 +1,5 @@ import { GuildMember, Snowflake } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { UtilityPluginType } from "../types.js"; export async function hasPermission( diff --git a/backend/src/plugins/Utility/search.ts b/backend/src/plugins/Utility/search.ts index 73981b422..1460e5915 100644 --- a/backend/src/plugins/Utility/search.ts +++ b/backend/src/plugins/Utility/search.ts @@ -11,7 +11,7 @@ import { User, } from "discord.js"; import escapeStringRegexp from "escape-string-regexp"; -import { ArgsFromSignatureOrArray, GuildPluginData } from "knub"; +import { ArgsFromSignatureOrArray, GuildPluginData } from "vety"; import moment from "moment-timezone"; import { RegExpRunner, allowTimeout } from "../../RegExpRunner.js"; import { getBaseUrl } from "../../pluginUtils.js"; diff --git a/backend/src/plugins/Utility/types.ts b/backend/src/plugins/Utility/types.ts index 4f181b2bd..3d2448037 100644 --- a/backend/src/plugins/Utility/types.ts +++ b/backend/src/plugins/Utility/types.ts @@ -1,5 +1,5 @@ -import { BasePluginType, guildPluginEventListener, guildPluginMessageCommand, pluginUtils } from "knub"; -import z from "zod/v4"; +import { BasePluginType, guildPluginEventListener, guildPluginMessageCommand, pluginUtils } from "vety"; +import { z } from "zod"; import { RegExpRunner } from "../../RegExpRunner.js"; import { GuildArchives } from "../../data/GuildArchives.js"; import { GuildCases } from "../../data/GuildCases.js"; diff --git a/backend/src/plugins/WelcomeMessage/WelcomeMessagePlugin.ts b/backend/src/plugins/WelcomeMessage/WelcomeMessagePlugin.ts index b566ce41f..c0f032867 100644 --- a/backend/src/plugins/WelcomeMessage/WelcomeMessagePlugin.ts +++ b/backend/src/plugins/WelcomeMessage/WelcomeMessagePlugin.ts @@ -1,4 +1,4 @@ -import { guildPlugin } from "knub"; +import { guildPlugin } from "vety"; import { GuildLogs } from "../../data/GuildLogs.js"; import { LogsPlugin } from "../Logs/LogsPlugin.js"; import { SendWelcomeMessageEvt } from "./events/SendWelcomeMessageEvt.js"; diff --git a/backend/src/plugins/WelcomeMessage/events/SendWelcomeMessageEvt.ts b/backend/src/plugins/WelcomeMessage/events/SendWelcomeMessageEvt.ts index df983f0e1..f0f14a01e 100644 --- a/backend/src/plugins/WelcomeMessage/events/SendWelcomeMessageEvt.ts +++ b/backend/src/plugins/WelcomeMessage/events/SendWelcomeMessageEvt.ts @@ -1,6 +1,13 @@ -import { Snowflake, TextChannel } from "discord.js"; +import { PermissionsBitField, Snowflake, TextChannel } from "discord.js"; import { TemplateParseError, TemplateSafeValueContainer, renderTemplate } from "../../../templateFormatter.js"; -import { createChunkedMessage, verboseChannelMention, verboseUserMention } from "../../../utils.js"; +import { + createChunkedMessage, + renderRecursively, + verboseChannelMention, + verboseUserMention +} from "../../../utils.js"; +import { MessageContent } from "../../../utils.js"; +import { hasDiscordPermissions } from "../../../utils/hasDiscordPermissions.js"; import { sendDM } from "../../../utils/sendDM.js"; import { guildToTemplateSafeGuild, @@ -28,17 +35,20 @@ export const SendWelcomeMessageEvt = welcomeMessageEvt({ pluginData.state.sentWelcomeMessages.add(member.id); - let formatted; + const templateValues = new TemplateSafeValueContainer({ + member: memberToTemplateSafeMember(member), + user: userToTemplateSafeUser(member.user), + guild: guildToTemplateSafeGuild(member.guild), + }); + + const renderMessageText = (str: string) => renderTemplate(str, templateValues); + + let formatted: MessageContent; try { - formatted = await renderTemplate( - config.message, - new TemplateSafeValueContainer({ - member: memberToTemplateSafeMember(member), - user: userToTemplateSafeUser(member.user), - guild: guildToTemplateSafeGuild(member.guild), - }), - ); + formatted = typeof config.message === "string" + ? await renderMessageText(config.message) + : ((await renderRecursively(config.message, renderMessageText)) as MessageContent); } catch (e) { if (e instanceof TemplateParseError) { pluginData.getPlugin(LogsPlugin).logBotAlert({ @@ -46,7 +56,6 @@ export const SendWelcomeMessageEvt = welcomeMessageEvt({ }); return; } - throw e; } @@ -65,17 +74,49 @@ export const SendWelcomeMessageEvt = welcomeMessageEvt({ const channel = meta.args.member.guild.channels.cache.get(config.send_to_channel as Snowflake); if (!channel || !(channel instanceof TextChannel)) return; - try { - await createChunkedMessage(channel, formatted, { - parse: ["users"], + if ( + !hasDiscordPermissions( + channel.permissionsFor(pluginData.client.user!.id), + PermissionsBitField.Flags.SendMessages | PermissionsBitField.Flags.ViewChannel, + ) + ) { + pluginData.getPlugin(LogsPlugin).logBotAlert({ + body: `Missing permissions to send welcome message in ${verboseChannelMention(channel)}`, }); + return; + } + + if ( + typeof formatted === "object" && formatted.embeds && formatted.embeds.length > 0 && + !hasDiscordPermissions( + channel.permissionsFor(pluginData.client.user!.id), + PermissionsBitField.Flags.EmbedLinks, + ) + ) { + pluginData.getPlugin(LogsPlugin).logBotAlert({ + body: `Missing permissions to send welcome message **with embeds** in ${verboseChannelMention(channel)}`, + }); + return; + } + + try { + if (typeof formatted === "string") { + await createChunkedMessage(channel, formatted, { + parse: ["users"], + }); + } else { + await channel.send({ + ...formatted, + allowedMentions: { + parse: ["users"], + }, + }); + } } catch { pluginData.getPlugin(LogsPlugin).logBotAlert({ - body: `Failed send a welcome message for ${verboseUserMention(member.user)} to ${verboseChannelMention( - channel, - )}`, + body: `Failed to send welcome message for ${verboseUserMention(member.user)} to ${verboseChannelMention(channel)}`, }); } } }, -}); +}); \ No newline at end of file diff --git a/backend/src/plugins/WelcomeMessage/types.ts b/backend/src/plugins/WelcomeMessage/types.ts index a75062e57..61f1424c7 100644 --- a/backend/src/plugins/WelcomeMessage/types.ts +++ b/backend/src/plugins/WelcomeMessage/types.ts @@ -1,11 +1,12 @@ -import { BasePluginType, guildPluginEventListener } from "knub"; -import z from "zod/v4"; +import { BasePluginType, guildPluginEventListener } from "vety"; +import { z } from "zod"; import { GuildLogs } from "../../data/GuildLogs.js"; +import { zMessageContent } from "../../utils.js"; export const zWelcomeMessageConfig = z.strictObject({ send_dm: z.boolean().default(false), send_to_channel: z.string().nullable().default(null), - message: z.string().nullable().default(null), + message: zMessageContent.nullable().default(null), }); export interface WelcomeMessagePluginType extends BasePluginType { diff --git a/backend/src/plugins/availablePlugins.ts b/backend/src/plugins/availablePlugins.ts index 46653ce8f..d326fd394 100644 --- a/backend/src/plugins/availablePlugins.ts +++ b/backend/src/plugins/availablePlugins.ts @@ -77,6 +77,8 @@ import { UtilityPlugin } from "./Utility/UtilityPlugin.js"; import { utilityPluginDocs } from "./Utility/docs.js"; import { WelcomeMessagePlugin } from "./WelcomeMessage/WelcomeMessagePlugin.js"; import { welcomeMessagePluginDocs } from "./WelcomeMessage/docs.js"; +import { CommandAliasesPlugin } from "./CommandAliases/CommandAliasesPlugin.js"; +import { commandAliasesPluginDocs } from "./CommandAliases/docs.js"; export const availableGuildPlugins: ZeppelinGuildPluginInfo[] = [ { @@ -100,6 +102,10 @@ export const availableGuildPlugins: ZeppelinGuildPluginInfo[] = [ plugin: CensorPlugin, docs: censorPluginDocs, }, + { + plugin: CommandAliasesPlugin, + docs: commandAliasesPluginDocs, + }, { plugin: CompanionChannelsPlugin, docs: companionChannelsPluginDocs, diff --git a/backend/src/profiler.ts b/backend/src/profiler.ts index 088a9644e..9b01402c5 100644 --- a/backend/src/profiler.ts +++ b/backend/src/profiler.ts @@ -1,6 +1,6 @@ -import type { Knub } from "knub"; +import type { Vety } from "vety"; -type Profiler = Knub["profiler"]; +type Profiler = Vety["profiler"]; let profiler: Profiler | null = null; export function getProfiler(): Profiler | null { diff --git a/backend/src/types.ts b/backend/src/types.ts index 35142f4cb..8006b43e2 100644 --- a/backend/src/types.ts +++ b/backend/src/types.ts @@ -1,5 +1,5 @@ -import { GlobalPluginBlueprint, GuildPluginBlueprint, Knub } from "knub"; -import z from "zod/v4"; +import { GlobalPluginBlueprint, GuildPluginBlueprint } from "vety"; +import { z } from "zod"; import { zSnowflake } from "./utils.js"; export const zZeppelinGuildConfig = z.strictObject({ @@ -9,8 +9,6 @@ export const zZeppelinGuildConfig = z.strictObject({ plugins: z.record(z.string(), z.unknown()).optional(), }); -export type TZeppelinKnub = Knub; - /** * Wrapper for the string type that indicates the text will be parsed as Markdown later */ diff --git a/backend/src/uptime.ts b/backend/src/uptime.ts index c47dbcfdb..d58c86294 100644 --- a/backend/src/uptime.ts +++ b/backend/src/uptime.ts @@ -7,3 +7,7 @@ export function startUptimeCounter() { export function getCurrentUptime() { return Date.now() - start; } + +export function getBotStartTime() { + return start; +} diff --git a/backend/src/utils.test.ts b/backend/src/utils.test.ts index 3fd7b0548..f50aa3317 100644 --- a/backend/src/utils.test.ts +++ b/backend/src/utils.test.ts @@ -1,5 +1,5 @@ import test from "ava"; -import z from "zod/v4"; +import { z } from "zod"; import { convertDelayStringToMS, convertMSToDelayString, getUrlsInString, zAllowedMentions } from "./utils.js"; import { ErisAllowedMentionFormat } from "./utils/erisAllowedMentionsToDjsMentionOptions.js"; diff --git a/backend/src/utils.ts b/backend/src/utils.ts index a6c949edf..96f550caa 100644 --- a/backend/src/utils.ts +++ b/backend/src/utils.ts @@ -1,9 +1,11 @@ import { + ActionRowBuilder, APIEmbed, + ButtonBuilder, ChannelType, - ChatInputCommandInteraction, Client, DiscordAPIError, + DiscordjsTypeError, EmbedData, EmbedType, Emoji, @@ -18,27 +20,25 @@ import { InviteType, LimitedCollection, Message, + MessageActionRowComponentBuilder, MessageCreateOptions, MessageMentionOptions, - PartialChannelData, PartialGroupDMChannel, PartialMessage, - PartialUser, RoleResolvable, SendableChannels, Sticker, - TextBasedChannel, User, } from "discord.js"; import emojiRegex from "emoji-regex"; import fs from "fs"; import https from "https"; -import isEqual from "lodash/isEqual.js"; +import { isEqual } from "lodash-es"; import { performance } from "perf_hooks"; import tlds from "tlds" with { type: "json" }; import tmp from "tmp"; import { URL } from "url"; -import { z, ZodError, ZodPipe, ZodRecord, ZodString, ZodTransform } from "zod/v4"; +import { z, ZodError, ZodPipe, ZodRecord, ZodString, ZodTransform } from "zod"; import { ISavedMessageAttachmentData, SavedMessage } from "./data/entities/SavedMessage.js"; import { delayStringMultipliers, humanizeDuration } from "./humanizeDuration.js"; import { getProfiler } from "./profiler.js"; @@ -47,6 +47,8 @@ import { sendDM } from "./utils/sendDM.js"; import { Brand } from "./utils/typeUtils.js"; import { waitForButtonConfirm } from "./utils/waitForInteraction.js"; import { GenericCommandSource } from "./pluginUtils.js"; +import { getOrFetchUser } from "./utils/getOrFetchUser.js"; +import { incrementDebugCounter } from "./debugCounters.js"; const fsp = fs.promises; @@ -85,6 +87,10 @@ export function isDiscordAPIError(err: Error | string): err is DiscordAPIError { return err instanceof DiscordAPIError; } +export function isDiscordJsTypeError(err: unknown): err is DiscordjsTypeError { + return err instanceof DiscordjsTypeError; +} + // null | undefined -> undefined export function zNullishToUndefined( type: T, @@ -197,94 +203,99 @@ export function zRegex(zStr: T) { }); } -export const zEmbedInput = z.strictObject({ - title: z.string().optional(), - description: z.string().optional(), - url: z.string().optional(), - timestamp: z.string().optional(), - color: z.number().optional(), - - footer: z.optional( - z.object({ - text: z.string(), - icon_url: z.string().optional(), - }), - ), - - image: z.optional( - z.object({ - url: z.string().optional(), - width: z.number().optional(), - height: z.number().optional(), - }), - ), - - thumbnail: z.optional( - z.object({ - url: z.string().optional(), - width: z.number().optional(), - height: z.number().optional(), - }), - ), +export const zEmbedInput = z + .strictObject({ + title: z.string().optional(), + description: z.string().optional(), + url: z.string().optional(), + timestamp: z.string().optional(), + color: z.number().optional(), - video: z.optional( - z.object({ - url: z.string().optional(), - width: z.number().optional(), - height: z.number().optional(), - }), - ), + footer: z.optional( + z.object({ + text: z.string(), + icon_url: z.string().optional(), + }), + ), - provider: z.optional( - z.object({ - name: z.string(), - url: z.string().optional(), - }), - ), + image: z.optional( + z.object({ + url: z.string().optional(), + width: z.number().optional(), + height: z.number().optional(), + }), + ), - fields: z.optional( - z.array( + thumbnail: z.optional( z.object({ - name: z.string().optional(), - value: z.string().optional(), - inline: z.boolean().optional(), + url: z.string().optional(), + width: z.number().optional(), + height: z.number().optional(), }), ), - ), - author: z - .optional( + video: z.optional( z.object({ - name: z.string(), url: z.string().optional(), width: z.number().optional(), height: z.number().optional(), }), - ) - .nullable(), -}).meta({ - id: "embedInput", -}); + ), + + provider: z.optional( + z.object({ + name: z.string(), + url: z.string().optional(), + }), + ), + + fields: z.optional( + z.array( + z.object({ + name: z.string().optional(), + value: z.string().optional(), + inline: z.boolean().optional(), + }), + ), + ), + + author: z + .optional( + z.object({ + name: z.string(), + url: z.string().optional(), + width: z.number().optional(), + height: z.number().optional(), + }), + ) + .nullable(), + }) + .meta({ + id: "embedInput", + }); export type EmbedWith = APIEmbed & Pick, T>; -export const zStrictMessageContent = z.strictObject({ - content: z.string().optional(), - tts: z.boolean().optional(), - embeds: z.union([z.array(zEmbedInput), zEmbedInput]).optional(), - embed: zEmbedInput.optional(), -}).transform((data) => { - if (data.embed) { - data.embeds = [data.embed]; - delete data.embed; - } - if (data.embeds && !Array.isArray(data.embeds)) { - data.embeds = [data.embeds]; - } - return data as StrictMessageContent; -}).meta({ - id: "strictMessageContent", -}); +export const zStrictMessageContent = z + .strictObject({ + content: z.string().optional(), + tts: z.boolean().optional(), + embeds: z.union([z.array(zEmbedInput), zEmbedInput]).optional(), + embed: zEmbedInput.optional(), + }) + .transform((data) => { + if (data.embed) { + data.embeds = [data.embed]; + delete data.embed; + } + if (data.embeds && !Array.isArray(data.embeds)) { + data.embeds = [data.embeds]; + } + return data as StrictMessageContent; + }) + .meta({ + id: "strictMessageContent", + }); export type ZStrictMessageContent = z.infer; @@ -295,10 +306,7 @@ export type StrictMessageContent = { }; export type MessageContent = string | StrictMessageContent; -export const zMessageContent = z.union([ - zBoundedCharacters(0, 4000), - zStrictMessageContent, -]); +export const zMessageContent = z.union([zBoundedCharacters(0, 4000), zStrictMessageContent]); export function validateAndParseMessageContent(input: unknown): StrictMessageContent { if (input == null) { @@ -1160,9 +1168,7 @@ export function getUser(client: Client, userResolvable: string): User | UnknownU * Resolves a User from the passed string. The passed string can be a user id, a user mention, a full username (with discrim), etc. * If the user is not found in the cache, it's fetched from the API. */ -export async function resolveUser(bot: Client, value: string): Promise; -export async function resolveUser(bot: Client, value: Not): Promise; -export async function resolveUser(bot, value) { +export async function resolveUser(bot: Client, value: unknown, context?: string): Promise { if (typeof value !== "string") { return new UnknownUser(); } @@ -1172,26 +1178,8 @@ export async function resolveUser(bot, value) { return new UnknownUser(); } - // If we have the user cached, return that directly - if (bot.users.cache.has(userId)) { - return bot.users.fetch(userId); - } - - // We don't want to spam the API by trying to fetch unknown users again and again, - // so we cache the fact that they're "unknown" for a while - if (unknownUsers.has(userId)) { - return new UnknownUser({ id: userId }); - } - - const freshUser = await bot.users.fetch(userId, true, true).catch(noop); - if (freshUser) { - return freshUser; - } - - unknownUsers.add(userId); - setTimeout(() => unknownUsers.delete(userId), 15 * MINUTES); - - return new UnknownUser({ id: userId }); + incrementDebugCounter(`resolveUser:${context ?? "unknown"}`); + return (await getOrFetchUser(bot, userId)) ?? new UnknownUser(); } /** @@ -1321,6 +1309,20 @@ export async function confirm( return waitForButtonConfirm(context, content, { restrictToId: userId }); } +export function createDisabledButtonRow( + row: ActionRowBuilder +): ActionRowBuilder { + const newRow = new ActionRowBuilder(); + for (const component of row.components) { + if (component instanceof ButtonBuilder) { + newRow.addComponents( + ButtonBuilder.from(component).setDisabled(true) + ); + } + } + return newRow; +} + export function messageSummary(msg: SavedMessage) { // Regular text content let result = "```\n" + (msg.data.content ? escapeCodeBlock(msg.data.content) : "") + "```"; @@ -1494,7 +1496,7 @@ export function isGroupDMInvite(invite: Invite): invite is GroupDMInvite { return invite.type === InviteType.GroupDM; } -export function inviteHasCounts(invite: Invite): invite is Invite { +export function inviteHasCounts(invite: Invite): invite is Invite & { memberCount: number; presenceCount: number } { return invite.memberCount != null; } diff --git a/backend/src/utils/easyProfiler.ts b/backend/src/utils/easyProfiler.ts index d34e25710..955d09562 100644 --- a/backend/src/utils/easyProfiler.ts +++ b/backend/src/utils/easyProfiler.ts @@ -1,8 +1,8 @@ -import type { Knub } from "knub"; +import type { Vety } from "vety"; import { performance } from "perf_hooks"; import { noop, SECONDS } from "../utils.js"; -type Profiler = Knub["profiler"]; +type Profiler = Vety["profiler"]; let _profilingEnabled = false; diff --git a/backend/src/utils/formatZodIssue.ts b/backend/src/utils/formatZodIssue.ts index a27a863f0..93932f663 100644 --- a/backend/src/utils/formatZodIssue.ts +++ b/backend/src/utils/formatZodIssue.ts @@ -1,4 +1,4 @@ -import { ZodIssue } from "zod/v4"; +import { ZodIssue } from "zod"; export function formatZodIssue(issue: ZodIssue): string { const path = issue.path.join("/"); diff --git a/backend/src/utils/getGuildPrefix.ts b/backend/src/utils/getGuildPrefix.ts index 8623dc092..d24f58b4d 100644 --- a/backend/src/utils/getGuildPrefix.ts +++ b/backend/src/utils/getGuildPrefix.ts @@ -1,4 +1,4 @@ -import { getDefaultMessageCommandPrefix, GuildPluginData } from "knub"; +import { getDefaultMessageCommandPrefix, GuildPluginData } from "vety"; export function getGuildPrefix(pluginData: GuildPluginData) { return pluginData.fullConfig.prefix || getDefaultMessageCommandPrefix(pluginData.client); diff --git a/backend/src/utils/getOrFetchGuildMember.ts b/backend/src/utils/getOrFetchGuildMember.ts index f5f480163..d17ff621c 100644 --- a/backend/src/utils/getOrFetchGuildMember.ts +++ b/backend/src/utils/getOrFetchGuildMember.ts @@ -15,7 +15,8 @@ export async function getOrFetchGuildMember(guild: Guild, memberId: string): Pro if (!getOrFetchGuildMemberPromises.has(key)) { getOrFetchGuildMemberPromises.set( key, - guild.members.fetch(memberId) + guild.members + .fetch(memberId) .catch(() => undefined) .finally(() => { getOrFetchGuildMemberPromises.delete(key); diff --git a/backend/src/utils/getOrFetchUser.ts b/backend/src/utils/getOrFetchUser.ts index 49adc71e3..a4c95d405 100644 --- a/backend/src/utils/getOrFetchUser.ts +++ b/backend/src/utils/getOrFetchUser.ts @@ -1,22 +1,64 @@ import { Client, User } from "discord.js"; +import { redis } from "../data/redis.js"; +import { incrementDebugCounter } from "../debugCounters.js"; const getOrFetchUserPromises: Map> = new Map(); +const UNKNOWN_KEY = "__UNKNOWN__"; + +const baseCacheTimeSeconds = 60 * 60; // 1 hour +const cacheTimeJitterSeconds = 5 * 60; // 5 minutes + +// Use jitter on cache time to avoid tons of keys expiring at the same time +const generateCacheTime = () => { + const jitter = Math.floor(Math.random() * cacheTimeJitterSeconds); + return baseCacheTimeSeconds + jitter; +}; + /** * Gets a user from cache or fetches it from the API if not cached. * Concurrent requests are merged. */ export async function getOrFetchUser(bot: Client, userId: string): Promise { + // 1. Check Discord.js cache const cachedUser = bot.users.cache.get(userId); if (cachedUser) { + incrementDebugCounter("getOrFetchUser:djsCache"); return cachedUser; } + // 2. Check Redis + const redisCacheKey = `cache:user:${userId}`; + const userData = await redis.get(redisCacheKey); + if (userData) { + if (userData === UNKNOWN_KEY) { + incrementDebugCounter("getOrFetchUser:redisCache:unknown"); + return undefined; + } + incrementDebugCounter("getOrFetchUser:redisCache:hit"); + // @ts-expect-error Replace with a proper solution once that exists + return new User(bot, JSON.parse(userData)); + } + if (!getOrFetchUserPromises.has(userId)) { + incrementDebugCounter("getOrFetchUser:fresh"); getOrFetchUserPromises.set( userId, - bot.users.fetch(userId) - .catch(() => undefined) + bot.users + .fetch(userId) + .catch(async () => { + return undefined; + }) + .then(async (user) => { + const cacheValue = user ? JSON.stringify(user.toJSON()) : UNKNOWN_KEY; + await redis.set(redisCacheKey, cacheValue, { + expiration: { + type: "EX", + value: generateCacheTime(), + }, + }); + return user; + }) .finally(() => { getOrFetchUserPromises.delete(userId); }), diff --git a/backend/src/utils/multipleSlashOptions.ts b/backend/src/utils/multipleSlashOptions.ts index 9cdd2ecaa..02c1626dc 100644 --- a/backend/src/utils/multipleSlashOptions.ts +++ b/backend/src/utils/multipleSlashOptions.ts @@ -1,4 +1,4 @@ -import { AttachmentSlashCommandOption, slashOptions } from "knub"; +import { AttachmentSlashCommandOption, slashOptions } from "vety"; type AttachmentSlashOptions = Omit; diff --git a/backend/src/utils/permissionNames.ts b/backend/src/utils/permissionNames.ts index 801f512fb..530ac7257 100644 --- a/backend/src/utils/permissionNames.ts +++ b/backend/src/utils/permissionNames.ts @@ -52,4 +52,5 @@ export const PERMISSION_NAMES = { CreateEvents: "Create Events", SendPolls: "Send Polls", UseExternalApps: "Use External Apps", + PinMessages: "Pin Messages", } as const satisfies Record; diff --git a/backend/src/utils/resolveMessageTarget.ts b/backend/src/utils/resolveMessageTarget.ts index cb9dccfec..4703d94cc 100644 --- a/backend/src/utils/resolveMessageTarget.ts +++ b/backend/src/utils/resolveMessageTarget.ts @@ -1,5 +1,5 @@ import { GuildTextBasedChannel, Snowflake } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { getChannelIdFromMessageId } from "../data/getChannelIdFromMessageId.js"; import { isSnowflake } from "../utils.js"; diff --git a/backend/src/utils/sendDM.ts b/backend/src/utils/sendDM.ts index f1ca6fc61..c4c5d2ff8 100644 --- a/backend/src/utils/sendDM.ts +++ b/backend/src/utils/sendDM.ts @@ -1,6 +1,7 @@ -import { MessagePayload, User } from "discord.js"; +import { User } from "discord.js"; import { logger } from "../logger.js"; import { HOURS, createChunkedMessage, isDiscordAPIError } from "../utils.js"; +import { MessageContent } from "../utils.js"; import Timeout = NodeJS.Timeout; let dmsDisabled = false; @@ -16,7 +17,11 @@ export class DMError extends Error {} const error20026 = "The bot cannot currently send DMs"; -export async function sendDM(user: User, content: string | MessagePayload, source: string) { +export async function sendDM( + user: User, + content: MessageContent, + source: string, +) { if (dmsDisabled) { throw new DMError(error20026); } @@ -36,7 +41,6 @@ export async function sendDM(user: User, content: string | MessagePayload, sourc disableDMs(1 * HOURS); throw new DMError(error20026); } - throw e; } -} +} \ No newline at end of file diff --git a/backend/src/utils/templateSafeObjects.ts b/backend/src/utils/templateSafeObjects.ts index 196593f3a..5bff90092 100644 --- a/backend/src/utils/templateSafeObjects.ts +++ b/backend/src/utils/templateSafeObjects.ts @@ -13,7 +13,7 @@ import { StickerFormatType, User, } from "discord.js"; -import { GuildPluginData } from "knub"; +import { GuildPluginData } from "vety"; import { Case } from "../data/entities/Case.js"; import { ISavedMessageAttachmentData, @@ -191,6 +191,7 @@ export class TemplateSafeSavedMessageData extends TemplateSafeValueContainer { embeds?: Array>; stickers?: Array>; timestamp: number; + reference?: TypedTemplateSafeValueContainer; constructor(data: InputProps) { super(); @@ -445,6 +446,14 @@ export function savedMessageToTemplateSafeSavedMessage(savedMessage: SavedMessag ), timestamp: savedMessage.data.timestamp, + + reference: savedMessage.data.reference + ? (new TemplateSafeValueContainer({ + messageId: savedMessage.data.reference.messageId ?? null, + channelId: savedMessage.data.reference.channelId ?? null, + guildId: savedMessage.data.reference.guildId ?? null, + }) as TypedTemplateSafeValueContainer) + : undefined, }), }); } diff --git a/backend/src/utils/waitForInteraction.ts b/backend/src/utils/waitForInteraction.ts index d0eec4d27..5d3964db5 100644 --- a/backend/src/utils/waitForInteraction.ts +++ b/backend/src/utils/waitForInteraction.ts @@ -6,10 +6,10 @@ import { MessageComponentInteraction, MessageCreateOptions, } from "discord.js"; -import moment from "moment"; +import moment from "moment-timezone"; import { v4 as uuidv4 } from "uuid"; import { GenericCommandSource, isContextInteraction, sendContextResponse } from "../pluginUtils.js"; -import { noop } from "../utils.js"; +import { noop, createDisabledButtonRow } from "../utils.js"; export async function waitForButtonConfirm( context: GenericCommandSource, @@ -24,34 +24,42 @@ export async function waitForButtonConfirm( .setStyle(ButtonStyle.Success) .setLabel(options?.confirmText || "Confirm") .setCustomId(`confirmButton:${idMod}:${uuidv4()}`), - new ButtonBuilder() .setStyle(ButtonStyle.Danger) .setLabel(options?.cancelText || "Cancel") .setCustomId(`cancelButton:${idMod}:${uuidv4()}`), ]); const message = await sendContextResponse(context, { ...toPost, components: [row] }, true); - const collector = message.createMessageComponentCollector({ time: 10000 }); collector.on("collect", (interaction: MessageComponentInteraction) => { if (options?.restrictToId && options.restrictToId !== interaction.user.id) { interaction .reply({ content: `You are not permitted to use these buttons.`, ephemeral: true }) - // tslint:disable-next-line no-console - .catch((err) => console.trace(err.message)); - } else { - if (interaction.customId.startsWith(`confirmButton:${idMod}:`)) { - if (!contextIsInteraction) message.delete(); - resolve(true); - } else if (interaction.customId.startsWith(`cancelButton:${idMod}:`)) { - if (!contextIsInteraction) message.delete(); - resolve(false); + .catch(noop); + } else if (interaction.customId.startsWith(`confirmButton:${idMod}:`)) { + if (!contextIsInteraction) { + message.delete().catch(noop); + } else { + interaction.update({ components: [createDisabledButtonRow(row)] }).catch(noop); + } + resolve(true); + } else if (interaction.customId.startsWith(`cancelButton:${idMod}:`)) { + if (!contextIsInteraction) { + message.delete().catch(noop); + } else { + interaction.update({ components: [createDisabledButtonRow(row)] }).catch(noop); } + resolve(false); } }); + collector.on("end", () => { - if (!contextIsInteraction && message.deletable) message.delete().catch(noop); + if (!contextIsInteraction) { + if (message.deletable) message.delete().catch(noop); + } else { + message.edit({ components: [createDisabledButtonRow(row)] }).catch(noop); + } resolve(false); }); }); diff --git a/backend/src/utils/zColor.ts b/backend/src/utils/zColor.ts index ab2563131..8f26f482d 100644 --- a/backend/src/utils/zColor.ts +++ b/backend/src/utils/zColor.ts @@ -1,4 +1,4 @@ -import z from "zod/v4"; +import { z } from "zod"; import { parseColor } from "./parseColor.js"; import { rgbToInt } from "./rgbToInt.js"; diff --git a/backend/src/utils/zValidTimezone.ts b/backend/src/utils/zValidTimezone.ts index b0b065562..7757de058 100644 --- a/backend/src/utils/zValidTimezone.ts +++ b/backend/src/utils/zValidTimezone.ts @@ -1,4 +1,4 @@ -import { ZodString } from "zod/v4"; +import { ZodString } from "zod"; import { isValidTimezone } from "./isValidTimezone.js"; export function zValidTimezone(z: Z) { diff --git a/backend/src/utils/zodDeepPartial.ts b/backend/src/utils/zodDeepPartial.ts index c054be941..cd8e2dff4 100644 --- a/backend/src/utils/zodDeepPartial.ts +++ b/backend/src/utils/zodDeepPartial.ts @@ -17,7 +17,7 @@ limitations under the License. */ -import { z } from "zod/v4"; +import { z } from "zod"; import { $ZodRecordKey, $ZodType } from "zod/v4/core"; const RESOLVING = Symbol("mapOnSchema/resolving"); diff --git a/backend/start-dev.js b/backend/start-dev.js index 186f3e95a..ff92bb94f 100644 --- a/backend/start-dev.js +++ b/backend/start-dev.js @@ -5,12 +5,10 @@ import childProcess from "node:child_process"; -const cmd = process.platform === "win32" ? "npm.cmd" : "npm"; - -childProcess.spawn(cmd, ["run", "start-bot-dev"], { +childProcess.spawn("pnpm", ["run", "start-bot-dev"], { stdio: [process.stdin, process.stdout, process.stderr], }); -childProcess.spawn(cmd, ["run", "start-api-dev"], { +childProcess.spawn("pnpm", ["run", "start-api-dev"], { stdio: [process.stdin, process.stdout, process.stderr], }); diff --git a/build-image.sh b/build-image.sh index ca1cedda5..a3a32207c 100755 --- a/build-image.sh +++ b/build-image.sh @@ -1 +1,5 @@ -docker build -t dragory/zeppelin . +docker build \ + -t dragory/zeppelin \ + --build-arg COMMIT_HASH=$(git rev-parse HEAD) \ + --build-arg BUILD_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ") \ + . diff --git a/config-checker/public/config-schema.json b/config-checker/public/config-schema.json index 65769ff5c..dc00139f9 100644 --- a/config-checker/public/config-schema.json +++ b/config-checker/public/config-schema.json @@ -9210,7 +9210,7 @@ ] }, "MESSAGE_DELETE": { - "default": "{timestamp} 🗑 Message (`{message.id}`) from {userMention(user)} deleted in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}", + "default": "{timestamp} 🗑 Message (`{message.id}`) from {userMention(user)} deleted in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}{replyInfo}", "anyOf": [ { "type": "string" @@ -9650,7 +9650,7 @@ ] }, "MESSAGE_DELETE_AUTO": { - "default": "{timestamp} 🗑 Auto-deleted message (`{message.id}`) from {userMention(user)} in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}", + "default": "{timestamp} 🗑 Auto-deleted message (`{message.id}`) from {userMention(user)} in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}{replyInfo}", "anyOf": [ { "type": "string" @@ -10037,7 +10037,7 @@ ] }, "MESSAGE_DELETE": { - "default": "{timestamp} 🗑 Message (`{message.id}`) from {userMention(user)} deleted in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}", + "default": "{timestamp} 🗑 Message (`{message.id}`) from {userMention(user)} deleted in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}{replyInfo}", "anyOf": [ { "type": "string" @@ -10477,7 +10477,7 @@ ] }, "MESSAGE_DELETE_AUTO": { - "default": "{timestamp} 🗑 Auto-deleted message (`{message.id}`) from {userMention(user)} in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}", + "default": "{timestamp} 🗑 Auto-deleted message (`{message.id}`) from {userMention(user)} in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}{replyInfo}", "anyOf": [ { "type": "string" @@ -11153,7 +11153,7 @@ ] }, "MESSAGE_DELETE": { - "default": "{timestamp} 🗑 Message (`{message.id}`) from {userMention(user)} deleted in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}", + "default": "{timestamp} 🗑 Message (`{message.id}`) from {userMention(user)} deleted in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}{replyInfo}", "anyOf": [ { "type": "string" @@ -11593,7 +11593,7 @@ ] }, "MESSAGE_DELETE_AUTO": { - "default": "{timestamp} 🗑 Auto-deleted message (`{message.id}`) from {userMention(user)} in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}", + "default": "{timestamp} 🗑 Auto-deleted message (`{message.id}`) from {userMention(user)} in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}{replyInfo}", "anyOf": [ { "type": "string" @@ -11980,7 +11980,7 @@ ] }, "MESSAGE_DELETE": { - "default": "{timestamp} 🗑 Message (`{message.id}`) from {userMention(user)} deleted in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}", + "default": "{timestamp} 🗑 Message (`{message.id}`) from {userMention(user)} deleted in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}{replyInfo}", "anyOf": [ { "type": "string" @@ -12420,7 +12420,7 @@ ] }, "MESSAGE_DELETE_AUTO": { - "default": "{timestamp} 🗑 Auto-deleted message (`{message.id}`) from {userMention(user)} in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}", + "default": "{timestamp} 🗑 Auto-deleted message (`{message.id}`) from {userMention(user)} in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}{replyInfo}", "anyOf": [ { "type": "string" @@ -20882,4 +20882,4 @@ } }, "$schema": "https://json-schema.org/draft-2020-12/schema" -} \ No newline at end of file +} diff --git a/dashboard/.eslintrc.js b/dashboard/.eslintrc.js deleted file mode 100644 index 49370f9ac..000000000 --- a/dashboard/.eslintrc.js +++ /dev/null @@ -1,9 +0,0 @@ -module.exports = { - extends: ["../.eslintrc.js"], - rules: { - "@typescript-eslint/no-unused-vars": 0, - "no-self-assign": 0, - "no-empty": 0, - "@typescript-eslint/no-var-requires": 0, - }, -}; diff --git a/dashboard/.eslintrc.json b/dashboard/.eslintrc.json new file mode 100644 index 000000000..a269db3ca --- /dev/null +++ b/dashboard/.eslintrc.json @@ -0,0 +1,9 @@ +{ + "extends": ["../.eslintrc.js"], + "rules": { + "@typescript-eslint/no-unused-vars": 0, + "no-self-assign": 0, + "no-empty": 0, + "@typescript-eslint/no-var-requires": 0 + } +} diff --git a/dashboard/index.html b/dashboard/index.html index f7448266a..4ab7bf218 100644 --- a/dashboard/index.html +++ b/dashboard/index.html @@ -1,4 +1,4 @@ - + diff --git a/dashboard/package.json b/dashboard/package.json index 832e1b3f0..5a76cdf2b 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -13,6 +13,7 @@ "@tailwindcss/vite": "^4.1.8", "@vitejs/plugin-vue": "^5.2.4", "@vue/tsconfig": "^0.7.0", + "@zeppelinbot/shared": "workspace:*", "cross-env": "^7.0.3", "highlight.js": "^11.8.0", "humanize-duration": "^3.27.0", @@ -32,6 +33,7 @@ }, "dependencies": { "@fastify/static": "^7.0.1", + "ace-builds": "1.43.4", "fastify": "^4.26.2" }, "browserslist": [ diff --git a/dashboard/src/style/base.css b/dashboard/src/style/base.css index 62560244e..f3f0a9694 100644 --- a/dashboard/src/style/base.css +++ b/dashboard/src/style/base.css @@ -1,4 +1,13 @@ body { font: normal 18px/1.5 sans-serif; - font-family: system, -apple-system, ".SFNSText-Regular", "San Francisco", "Roboto", "Segoe UI", "Helvetica Neue", "Lucida Grande", sans-serif; + font-family: + system, + -apple-system, + ".SFNSText-Regular", + "San Francisco", + "Roboto", + "Segoe UI", + "Helvetica Neue", + "Lucida Grande", + sans-serif; } diff --git a/dashboard/src/style/docs.css b/dashboard/src/style/docs.css index e2e11dd36..dc4548be9 100644 --- a/dashboard/src/style/docs.css +++ b/dashboard/src/style/docs.css @@ -6,6 +6,6 @@ @media (width < theme(--breakpoint-lg)) { .docs-sidebar.closed:not(:focus-within) { - @apply sr-only; + @apply sr-only; } } diff --git a/dashboard/src/style/splash.css b/dashboard/src/style/splash.css index 0ef4fb92a..d502512f6 100644 --- a/dashboard/src/style/splash.css +++ b/dashboard/src/style/splash.css @@ -121,7 +121,7 @@ & li:not(:first-child)::before { display: block; - content: ' '; + content: " "; width: 4px; height: 4px; border-radius: 50%; diff --git a/dashboard/src/vite-env.d.ts b/dashboard/src/vite-env.d.ts index ead6f8ec3..c8504cdfa 100644 --- a/dashboard/src/vite-env.d.ts +++ b/dashboard/src/vite-env.d.ts @@ -1,6 +1,6 @@ /// -declare module '*.html' { +declare module "*.html" { const value: string; export default value; } diff --git a/docker-compose.development.yml b/docker-compose.development.yml index 47bf38ffc..1aade5b2e 100644 --- a/docker-compose.development.yml +++ b/docker-compose.development.yml @@ -2,6 +2,7 @@ name: zeppelin-dev volumes: home: {} mysql-data: {} + redis-data: {} services: nginx: build: @@ -27,6 +28,11 @@ services: # - ./docker/production/data/mysql:/var/lib/mysql command: --authentication-policy=mysql_native_password + redis: + image: redis:8.2.3 + volumes: + - redis-data:/data + devenv: build: context: ./docker/development/devenv diff --git a/docker-compose.standalone.yml b/docker-compose.standalone.yml index b4e328b3f..4c8579f99 100644 --- a/docker-compose.standalone.yml +++ b/docker-compose.standalone.yml @@ -1,7 +1,8 @@ version: '3' name: zeppelin-prod volumes: - mysql-data: + mysql-data: {} + redis-data: {} services: mysql: image: mysql:8.0 @@ -25,6 +26,11 @@ services: timeout: 5s retries: 60 + redis: + image: redis:8.2.3 + volumes: + - redis-data:/data + nginx: build: context: . diff --git a/docker/development/devenv/Dockerfile b/docker/development/devenv/Dockerfile index 8304b54ae..3baadd01c 100644 --- a/docker/development/devenv/Dockerfile +++ b/docker/development/devenv/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 ARG DEVELOPMENT_UID ARG DEVELOPMENT_SSH_PASSWORD @@ -15,11 +15,14 @@ RUN add-apt-repository ppa:git-core/ppa && apt-get update && apt-get install -y # Set up SSH access RUN apt-get install -y openssh-server iptables RUN mkdir /var/run/sshd -RUN useradd -rm -d /home/ubuntu -s /bin/bash -g root -G sudo -u $DEVELOPMENT_UID ubuntu +RUN usermod -G sudo -u $DEVELOPMENT_UID ubuntu RUN echo "ubuntu:${DEVELOPMENT_SSH_PASSWORD}" | chpasswd -# Install Node.js 22 and packages needed to build native packages -RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - +# Install Node.js 24 and packages needed to build native packages +RUN curl -fsSL https://deb.nodesource.com/setup_24.x | bash - RUN apt-get install -y nodejs gcc g++ make python3 +# Install pnpm +RUN npm install -g pnpm@10.19.0 + CMD ["/usr/sbin/sshd", "-D", "-e"] diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index a34049f13..2bb710356 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -58,17 +58,17 @@ These commands are run inside the dev container. You should be able to open a te ### 1. Install dependencies -1. `npm ci` +1. `pnpm install` ### Starting the backend (bot + api) 1. `cd ~/zeppelin/backend` -2. `npm run watch` +2. `pnpm run watch` ### Starting the dashboard 1. `cd ~/zeppelin/dashboard` -2. `npm run watch` +2. `pnpm run watch` ### Opening the dashboard Browse to https://localhost:3300 to view the dashboard diff --git a/docs/PRODUCTION.md b/docs/PRODUCTION.md index 324344a2e..e92e7b0cf 100644 --- a/docs/PRODUCTION.md +++ b/docs/PRODUCTION.md @@ -29,8 +29,9 @@ Zeppelin's production environment uses Docker. There are a few different ways to ### Updating the bot 1. Shut the bot down 2. Update the files (e.g. `git pull`) -3. Rebuild: `docker compose -f docker-compose.standalone.yml build` -4. Run the bot again +3. Update images: `docker compose -f docker-compose.standalone.yml pull` +4. Rebuild: `docker compose -f docker-compose.standalone.yml build` +5. Run the bot again ### Viewing logs `docker compose -f docker-compose.standalone.yml logs -t -f` @@ -51,8 +52,9 @@ Zeppelin's production environment uses Docker. There are a few different ways to ### Updating the bot 1. Shut the bot down 2. Update the files (e.g. `git pull`) -3. Rebuild: `docker compose -f docker-compose.lightweight.yml build` -4. Run the bot again +3. Update images: `docker compose -f docker-compose.standalone.yml pull` +4. Rebuild: `docker compose -f docker-compose.lightweight.yml build` +5. Run the bot again ### Viewing logs `docker compose -f docker-compose.lightweight.yml logs -t -f` @@ -60,12 +62,12 @@ Zeppelin's production environment uses Docker. There are a few different ways to ## Manual 1. Build the Zeppelin image: `docker build --tag 'zeppelin' .` 2. Run the service: - * Bot: `docker run zeppelin npm run start-bot` - * API: `docker run zeppelin npm run start-api` - * Dashboard: `docker run zeppelin npm run start-dashboard` + * Bot: `docker run zeppelin pnpm run start-bot` + * API: `docker run zeppelin pnpm run start-api` + * Dashboard: `docker run zeppelin pnpm run start-dashboard` If you're using an application platform such as Railway, you can simply point it to Zeppelin's repository and it should pick up the Dockerfile from there. -For the start command, you can use the same commands as above: `npm run start-bot`, `npm run start-api`, `npm run start-dashboard`. +For the start command, you can use the same commands as above: `pnpm run start-bot`, `pnpm run start-api`, `pnpm run start-dashboard`. Make sure to also run migrations when you update the bot. ### Environment variables diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index adfb7e702..000000000 --- a/package-lock.json +++ /dev/null @@ -1,12848 +0,0 @@ -{ - "name": "@zeppelinbot/zeppelin", - "version": "0.0.1", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@zeppelinbot/zeppelin", - "version": "0.0.1", - "workspaces": [ - "shared", - "backend", - "dashboard" - ], - "dependencies": { - "dotenv": "^16.5.0" - }, - "devDependencies": { - "@types/node": "^22.15.18", - "@typescript-eslint/eslint-plugin": "^5.59.5", - "@typescript-eslint/parser": "^5.59.5", - "eslint": "^8.40.0", - "eslint-config-prettier": "^8.8.0", - "prettier": "^2.8.4", - "prettier-plugin-organize-imports": "^3.2.2", - "ts-toolbelt": "^9.6.0", - "tsc-watch": "^6.0.4", - "typescript": "^5.8.3" - } - }, - "backend": { - "name": "@zeppelinbot/backend", - "version": "0.0.1", - "dependencies": { - "@silvia-odwyer/photon-node": "^0.3.1", - "bufferutil": "^4.0.3", - "clinic": "^13.0.0", - "cors": "^2.8.5", - "cross-env": "^7.0.3", - "deep-diff": "^1.0.2", - "discord.js": "^14.19.3", - "emoji-regex": "^8.0.0", - "escape-string-regexp": "^1.0.5", - "express": "^4.20.0", - "fp-ts": "^2.0.1", - "humanize-duration": "^3.15.0", - "js-yaml": "^4.1.0", - "knub": "^32.0.0-next.25", - "knub-command-manager": "^9.1.0", - "last-commit-log": "^2.1.0", - "lodash-es": "^4.17.21", - "moment-timezone": "^0.5.21", - "multer": "^1.4.5-lts.1", - "mysql2": "^3.9.8", - "parse-color": "^1.0.0", - "passport": "^0.6.0", - "passport-custom": "^1.0.5", - "passport-oauth2": "^1.6.1", - "pkg-up": "^3.1.0", - "reflect-metadata": "^0.1.12", - "regexp-worker": "^1.1.0", - "safe-regex": "^2.0.2", - "seedrandom": "^3.0.1", - "strip-combining-marks": "^1.0.0", - "threads": "^1.7.0", - "tlds": "^1.221.1", - "tmp": "0.0.33", - "tsconfig-paths": "^3.9.0", - "twemoji": "^12.1.4", - "typeorm": "^0.3.17", - "utf-8-validate": "^5.0.5", - "uuid": "^9.0.0", - "yawn-yaml": "github:dragory/yawn-yaml#string-number-fix-build", - "zod": "^3.25.17" - }, - "devDependencies": { - "@types/cors": "^2.8.5", - "@types/express": "^4.16.1", - "@types/jest": "^24.0.15", - "@types/js-yaml": "^3.12.1", - "@types/lodash-es": "^4.17.12", - "@types/moment-timezone": "^0.5.6", - "@types/multer": "^1.4.7", - "@types/passport": "^1.0.0", - "@types/passport-oauth2": "^1.4.8", - "@types/passport-strategy": "^0.2.35", - "@types/safe-regex": "^1.1.2", - "@types/tmp": "0.0.33", - "@types/twemoji": "^12.1.0", - "@types/uuid": "^9.0.2", - "ava": "^5.3.1", - "rimraf": "^2.6.2", - "source-map-support": "^0.5.16", - "zod-to-json-schema": "^3.22.3" - } - }, - "backend/node_modules/escape-string-regexp": { - "version": "1.0.5", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "backend/node_modules/rimraf": { - "version": "2.7.1", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "dashboard": { - "name": "@zeppelinbot/dashboard", - "version": "1.0.0", - "dependencies": { - "@fastify/static": "^7.0.1", - "fastify": "^4.26.2" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.1.8", - "@vitejs/plugin-vue": "^5.2.4", - "@vue/tsconfig": "^0.7.0", - "cross-env": "^7.0.3", - "highlight.js": "^11.8.0", - "humanize-duration": "^3.27.0", - "js-yaml": "^4.1.0", - "marked": "^5.1.0", - "moment": "^2.29.4", - "postcss-nesting": "^13.0.1", - "tailwindcss": "^4.1.8", - "vite": "npm:rolldown-vite@latest", - "vue": "^3.5.13", - "vue-material-design-icons": "^5.3.1", - "vue-router": "^4.5.0", - "vue-tsc": "^2.2.10", - "vue3-ace-editor": "^2.2.4", - "vue3-highlightjs": "^1.0.5", - "vuex": "^4.1.0" - } - }, - "dashboard/node_modules/fdir": { - "version": "6.4.5", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.5.tgz", - "integrity": "sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "dashboard/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "dashboard/node_modules/vite": { - "name": "rolldown-vite", - "version": "6.3.15", - "resolved": "https://registry.npmjs.org/rolldown-vite/-/rolldown-vite-6.3.15.tgz", - "integrity": "sha512-wMQIg51pb9R2buqYtxmYSL6AIVfyLaVdP28X8Lxo88CDME1QgYcZlfBs7pnJ4DxxMVeoUYNjYSHK/GYjA0YUUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@oxc-project/runtime": "0.72.1", - "fdir": "^6.4.4", - "lightningcss": "^1.30.0", - "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rolldown": "1.0.0-beta.10-commit.2c4c2a8", - "tinyglobby": "^0.2.13" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "esbuild": "^0.25.0", - "jiti": ">=1.21.0", - "less": "*", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@assemblyscript/loader": { - "version": "0.19.23", - "license": "Apache-2.0" - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.27.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.3" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/types": { - "version": "7.27.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@clinic/bubbleprof": { - "version": "10.0.0", - "license": "MIT", - "dependencies": { - "@clinic/clinic-common": "^7.0.0", - "@clinic/node-trace-log-join": "^2.0.0", - "@clinic/trace-events-parser": "^2.0.0", - "array-flatten": "^3.0.0", - "async": "^3.0.1", - "d3-axis": "^1.0.8", - "d3-color": "^1.4.0", - "d3-drag": "^1.2.3", - "d3-ease": "^1.0.3", - "d3-format": "^1.3.0", - "d3-interpolate": "^1.2.0", - "d3-scale": "^3.0.0", - "d3-selection": "^1.3.0", - "d3-shape": "^1.2.0", - "d3-time": "^1.0.8", - "d3-time-format": "^2.1.1", - "d3-transition": "^1.1.1", - "endpoint": "^0.4.5", - "lodash": "^4.14.0", - "minify-stream": "^2.0.1", - "mkdirp": "^1.0.0", - "on-net-listen": "^1.0.0", - "protocol-buffers": "^4.0.4", - "pump": "^3.0.0" - } - }, - "node_modules/@clinic/clinic-common": { - "version": "7.1.0", - "license": "MIT", - "dependencies": { - "brfs": "^2.0.1", - "browserify": "^17.0.0", - "chalk": "^4.1.0", - "lodash.debounce": "^4.0.8", - "loose-envify": "^1.4.0", - "postcss": "^8.1.10", - "postcss-import": "^13.0.0", - "stream-template": "0.0.10", - "webfontloader": "^1.6.28" - }, - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/@clinic/clinic-common/node_modules/postcss-import": { - "version": "13.0.0", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/@clinic/doctor": { - "version": "11.0.0", - "license": "MIT", - "dependencies": { - "@clinic/clinic-common": "^7.0.0", - "@clinic/node-trace-log-join": "^2.0.0", - "@clinic/trace-events-parser": "^2.0.0", - "@tensorflow/tfjs-backend-cpu": "^3.13.0", - "@tensorflow/tfjs-core": "^3.13.0", - "async": "^3.0.1", - "clipboard-copy": "^4.0.1", - "d3-array": "^2.0.0", - "d3-axis": "^1.0.8", - "d3-scale": "^3.0.0", - "d3-selection": "^1.1.0", - "d3-shape": "^1.2.0", - "d3-time-format": "^2.1.0", - "debug": "^4.3.1", - "distributions": "^2.0.0", - "endpoint": "^0.4.5", - "hidden-markov-model-tf": "^4.0.0", - "minify-stream": "^2.0.1", - "mkdirp": "^1.0.0", - "on-net-listen": "^1.0.0", - "protocol-buffers": "^4.0.4", - "pump": "^3.0.0", - "pumpify": "^2.0.0", - "semver": "^7.0.0", - "showdown": "^1.7.6", - "stream-template": "0.0.10", - "streaming-json-stringify": "^3.1.0", - "summary": "^2.1.0", - "ttest": "^3.0.0" - } - }, - "node_modules/@clinic/flame": { - "version": "13.0.0", - "license": "MIT", - "dependencies": { - "@clinic/clinic-common": "^7.0.0", - "0x": "^5.0.0", - "copy-to-clipboard": "^3.0.8", - "d3-array": "^2.0.2", - "d3-fg": "^6.13.1", - "d3-selection": "^1.3.2", - "flame-gradient": "^1.0.0", - "lodash.debounce": "^4.0.8", - "pump": "^3.0.0", - "querystringify": "^2.1.0", - "rimraf": "^3.0.2" - } - }, - "node_modules/@clinic/heap-profiler": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "@clinic/clinic-common": "^7.0.0", - "@nearform/heap-profiler": "^2.0.0", - "abort-controller": "^3.0.0", - "copy-to-clipboard": "^3.0.8", - "d3-array": "^2.0.2", - "d3-fg": "^6.13.1", - "d3-selection": "^1.3.2", - "fs-extra": "^11.0.0", - "lodash.debounce": "^4.0.8", - "on-net-listen": "1.1.2", - "pump": "^3.0.0", - "querystringify": "^2.1.0", - "sinusoidal-decimal": "^1.0.0" - } - }, - "node_modules/@clinic/node-trace-log-join": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "@clinic/trace-events-parser": "^2.0.0", - "multistream": "^2.1.0", - "pump": "^3.0.0", - "through2": "^2.0.3" - }, - "bin": { - "node-trace-log-join": "bin.js" - } - }, - "node_modules/@clinic/trace-events-parser": { - "version": "2.0.0", - "license": "Apache-2.0", - "dependencies": { - "turbo-json-parse": "^2.2.0" - } - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@csstools/selector-resolve-nested": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.0.0.tgz", - "integrity": "sha512-ZoK24Yku6VJU1gS79a5PFmC8yn3wIapiKmPgun0hZgEI5AOqgH2kiPRsPz1qkGv4HL+wuDLH83yQyk6inMYrJQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/@csstools/selector-specificity": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/@discordjs/builders": { - "version": "1.11.2", - "license": "Apache-2.0", - "dependencies": { - "@discordjs/formatters": "^0.6.1", - "@discordjs/util": "^1.1.1", - "@sapphire/shapeshift": "^4.0.0", - "discord-api-types": "^0.38.1", - "fast-deep-equal": "^3.1.3", - "ts-mixer": "^6.0.4", - "tslib": "^2.6.3" - }, - "engines": { - "node": ">=16.11.0" - }, - "funding": { - "url": "https://github.com/discordjs/discord.js?sponsor" - } - }, - "node_modules/@discordjs/builders/node_modules/tslib": { - "version": "2.8.1", - "license": "0BSD" - }, - "node_modules/@discordjs/collection": { - "version": "1.5.3", - "license": "Apache-2.0", - "engines": { - "node": ">=16.11.0" - } - }, - "node_modules/@discordjs/formatters": { - "version": "0.6.1", - "license": "Apache-2.0", - "dependencies": { - "discord-api-types": "^0.38.1" - }, - "engines": { - "node": ">=16.11.0" - }, - "funding": { - "url": "https://github.com/discordjs/discord.js?sponsor" - } - }, - "node_modules/@discordjs/rest": { - "version": "2.5.0", - "license": "Apache-2.0", - "dependencies": { - "@discordjs/collection": "^2.1.1", - "@discordjs/util": "^1.1.1", - "@sapphire/async-queue": "^1.5.3", - "@sapphire/snowflake": "^3.5.3", - "@vladfrangu/async_event_emitter": "^2.4.6", - "discord-api-types": "^0.38.1", - "magic-bytes.js": "^1.10.0", - "tslib": "^2.6.3", - "undici": "6.21.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/discordjs/discord.js?sponsor" - } - }, - "node_modules/@discordjs/rest/node_modules/@discordjs/collection": { - "version": "2.1.1", - "license": "Apache-2.0", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/discordjs/discord.js?sponsor" - } - }, - "node_modules/@discordjs/rest/node_modules/tslib": { - "version": "2.8.1", - "license": "0BSD" - }, - "node_modules/@discordjs/util": { - "version": "1.1.1", - "license": "Apache-2.0", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/discordjs/discord.js?sponsor" - } - }, - "node_modules/@discordjs/ws": { - "version": "1.2.2", - "license": "Apache-2.0", - "dependencies": { - "@discordjs/collection": "^2.1.0", - "@discordjs/rest": "^2.5.0", - "@discordjs/util": "^1.1.0", - "@sapphire/async-queue": "^1.5.2", - "@types/ws": "^8.5.10", - "@vladfrangu/async_event_emitter": "^2.2.4", - "discord-api-types": "^0.38.1", - "tslib": "^2.6.2", - "ws": "^8.17.0" - }, - "engines": { - "node": ">=16.11.0" - }, - "funding": { - "url": "https://github.com/discordjs/discord.js?sponsor" - } - }, - "node_modules/@discordjs/ws/node_modules/@discordjs/collection": { - "version": "2.1.1", - "license": "Apache-2.0", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/discordjs/discord.js?sponsor" - } - }, - "node_modules/@discordjs/ws/node_modules/tslib": { - "version": "2.8.1", - "license": "0BSD" - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.5", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.5.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.5.2", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "8.43.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@fastify/accept-negotiator": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/@fastify/ajv-compiler": { - "version": "3.5.0", - "license": "MIT", - "dependencies": { - "ajv": "^8.11.0", - "ajv-formats": "^2.1.1", - "fast-uri": "^2.0.0" - } - }, - "node_modules/@fastify/ajv-compiler/node_modules/ajv": { - "version": "8.12.0", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@fastify/ajv-compiler/node_modules/json-schema-traverse": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/@fastify/error": { - "version": "3.4.1", - "license": "MIT" - }, - "node_modules/@fastify/fast-json-stringify-compiler": { - "version": "4.3.0", - "license": "MIT", - "dependencies": { - "fast-json-stringify": "^5.7.0" - } - }, - "node_modules/@fastify/merge-json-schemas": { - "version": "0.1.1", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - } - }, - "node_modules/@fastify/send": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "@lukeed/ms": "^2.0.1", - "escape-html": "~1.0.3", - "fast-decode-uri-component": "^1.0.1", - "http-errors": "2.0.0", - "mime": "^3.0.0" - } - }, - "node_modules/@fastify/send/node_modules/mime": { - "version": "3.0.0", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@fastify/static": { - "version": "7.0.1", - "license": "MIT", - "dependencies": { - "@fastify/accept-negotiator": "^1.0.0", - "@fastify/send": "^2.0.0", - "content-disposition": "^0.5.3", - "fastify-plugin": "^4.0.0", - "fastq": "^1.17.0", - "glob": "^10.3.4" - } - }, - "node_modules/@fastify/static/node_modules/brace-expansion": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@fastify/static/node_modules/glob": { - "version": "10.3.10", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@fastify/static/node_modules/minimatch": { - "version": "9.0.3", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.10", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "24.9.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@lukeed/ms": { - "version": "2.0.2", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@nearform/heap-profiler": { - "version": "2.0.0", - "license": "Apache-2.0", - "dependencies": { - "abort-controller": "^3.0.0", - "sonic-boom": "^1.0.1" - }, - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@oxc-project/runtime": { - "version": "0.72.1", - "resolved": "https://registry.npmjs.org/@oxc-project/runtime/-/runtime-0.72.1.tgz", - "integrity": "sha512-8nU/WPeJWF6QJrT8HtEEIojz26bXn677deDX8BDVpjcz97CVKORVAvFhE2/lfjnBYE0+aqmjFeD17YnJQpCyqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@oxc-project/types": { - "version": "0.72.1", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.72.1.tgz", - "integrity": "sha512-qlvcDuCjISt4W7Izw0i5+GS3zCKJLXkoNDEc+E4ploage35SlZqxahpdKbHDX8uD70KDVNYWtupsHoNETy5kPQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.0.0-beta.10-commit.2c4c2a8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-beta.10-commit.2c4c2a8.tgz", - "integrity": "sha512-9b61bQSY0MP0raMfPd6xpXz+j6LOM7/v2aT+prDvqkdrjQhhQ6ZPmEl7cf6+YzRBwrxNfmXI7X3fujDbnvfRBQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.0.0-beta.10-commit.2c4c2a8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-beta.10-commit.2c4c2a8.tgz", - "integrity": "sha512-Kv2IZE30z+GYJJvx0De6FMzRPF+QwKz41LEO6avhXmDmQAasnMtLaFbJNhqEF1Zs1bxbn8XHkc2Z+8h9eo/vJw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.0.0-beta.10-commit.2c4c2a8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-beta.10-commit.2c4c2a8.tgz", - "integrity": "sha512-AIiPcML4+BMT+voQXBfArgqGz3f+ClTpkT9A02SExABYo/zzTtF/sHo9XjHFsic/0/MJap4hJBwgcriPZtNP/g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.0.0-beta.10-commit.2c4c2a8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-beta.10-commit.2c4c2a8.tgz", - "integrity": "sha512-MXjq1leGhNW1pWe7dfklIAgGLBVCK42dKBmyV2b+p8KYY3+bLs9+cXN0Bwui7QuQzoG92CpcU4XHUr3BlX4iAw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.0.0-beta.10-commit.2c4c2a8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-beta.10-commit.2c4c2a8.tgz", - "integrity": "sha512-T4sugrGpjcyfKKs5YFjisko0Q+gTmNi2DJWDQJxPDS1QvV1HTZb/b/5ABjE1bfsPFzqdn9WgQLJoEDGxsMZ9lA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.0.0-beta.10-commit.2c4c2a8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-beta.10-commit.2c4c2a8.tgz", - "integrity": "sha512-rW0eLXXcjEHsT/IijdWMBeXuW1KAjLzCuyWR/Zc0FRf3VbXO/cjZhNmLQtZWMbgCny5KvBMC7GEvLBgpOMZzsw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.0.0-beta.10-commit.2c4c2a8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-beta.10-commit.2c4c2a8.tgz", - "integrity": "sha512-BtVQgmSFdNhehso4pP/q64YPKiIKF6CcELFedFR8JV7bEF+yc6EUDkdYvt75ufBrg3L1XTrMlSKiJJBVtsKi7Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.0.0-beta.10-commit.2c4c2a8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-beta.10-commit.2c4c2a8.tgz", - "integrity": "sha512-oXHNnSdmd6f1/kPAhy49XguPlI6Fs+1KIIfGo+LQj0UQo/GgstmPK+xg4qAQDAwS1RctYbZHOa2gxZhJQVB87A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.0.0-beta.10-commit.2c4c2a8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-beta.10-commit.2c4c2a8.tgz", - "integrity": "sha512-Gku8OoTModeRMjUMuQxBd+rMYnbZx5SwbvKaNNyPKlOXSgdkV8aBfO4SxuJgL1ADfUVD1X0MpIx+toSnQxSEwQ==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.0.0-beta.10-commit.2c4c2a8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-beta.10-commit.2c4c2a8.tgz", - "integrity": "sha512-kzqUGK/SG1XONAgOrzSIFV0pFxPt8WPYlPHx/sNDLEbQaXj+W8QSvtoqihoN02rSiIqIGWF/JttXFLpLRCIwVw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rolldown/binding-win32-ia32-msvc": { - "version": "1.0.0-beta.10-commit.2c4c2a8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.0.0-beta.10-commit.2c4c2a8.tgz", - "integrity": "sha512-HHGN/xceH5l3Esx1hZZQfYGvMQec4F3jimlUz7/Np60kE2Lw8PAD2ULic0Rj8Iw0lQjSk+ZPByhrgX4CsOZEZg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.0.0-beta.10-commit.2c4c2a8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-beta.10-commit.2c4c2a8.tgz", - "integrity": "sha512-9Rauja4HPoZEV8OeQjCR2FSoAssdzIWMar16GCXZlKYfgrCx69jJDODwIkKa+01m+GApieEuSgqXANf8ZGclug==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.10-commit.2c4c2a8", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.10-commit.2c4c2a8.tgz", - "integrity": "sha512-07gXfcVwxs0tAw0+PI4ziRoEpebDli+Hr5pG7rq3Sc/Ny3fKki0aiQfSH4AnUAUOshTe5l3fVFvvCWVck1tLTQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.41.1", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.41.1", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@sapphire/async-queue": { - "version": "1.5.5", - "license": "MIT", - "engines": { - "node": ">=v14.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@sapphire/shapeshift": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "lodash": "^4.17.21" - }, - "engines": { - "node": ">=v16" - } - }, - "node_modules/@sapphire/snowflake": { - "version": "3.5.3", - "license": "MIT", - "engines": { - "node": ">=v14.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@silvia-odwyer/photon-node": { - "version": "0.3.3", - "license": "Apache-2.0" - }, - "node_modules/@sindresorhus/is": { - "version": "0.14.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@sqltools/formatter": { - "version": "1.2.5", - "license": "MIT" - }, - "node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "license": "MIT", - "dependencies": { - "defer-to-connect": "^1.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@tailwindcss/node": { - "version": "4.1.8", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.3.0", - "enhanced-resolve": "^5.18.1", - "jiti": "^2.4.2", - "lightningcss": "1.30.1", - "magic-string": "^0.30.17", - "source-map-js": "^1.2.1", - "tailwindcss": "4.1.8" - } - }, - "node_modules/@tailwindcss/node/node_modules/magic-string": { - "version": "0.30.17", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/@tailwindcss/oxide": { - "version": "4.1.8", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "detect-libc": "^2.0.4", - "tar": "^7.4.3" - }, - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.1.8", - "@tailwindcss/oxide-darwin-arm64": "4.1.8", - "@tailwindcss/oxide-darwin-x64": "4.1.8", - "@tailwindcss/oxide-freebsd-x64": "4.1.8", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.8", - "@tailwindcss/oxide-linux-arm64-gnu": "4.1.8", - "@tailwindcss/oxide-linux-arm64-musl": "4.1.8", - "@tailwindcss/oxide-linux-x64-gnu": "4.1.8", - "@tailwindcss/oxide-linux-x64-musl": "4.1.8", - "@tailwindcss/oxide-wasm32-wasi": "4.1.8", - "@tailwindcss/oxide-win32-arm64-msvc": "4.1.8", - "@tailwindcss/oxide-win32-x64-msvc": "4.1.8" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.1.8", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/vite": { - "version": "4.1.8", - "dev": true, - "license": "MIT", - "dependencies": { - "@tailwindcss/node": "4.1.8", - "@tailwindcss/oxide": "4.1.8", - "tailwindcss": "4.1.8" - }, - "peerDependencies": { - "vite": "^5.2.0 || ^6" - } - }, - "node_modules/@tensorflow/tfjs-backend-cpu": { - "version": "3.21.0", - "license": "Apache-2.0", - "dependencies": { - "@types/seedrandom": "^2.4.28", - "seedrandom": "^3.0.5" - }, - "engines": { - "yarn": ">= 1.3.2" - }, - "peerDependencies": { - "@tensorflow/tfjs-core": "3.21.0" - } - }, - "node_modules/@tensorflow/tfjs-core": { - "version": "3.21.0", - "license": "Apache-2.0", - "dependencies": { - "@types/long": "^4.0.1", - "@types/offscreencanvas": "~2019.3.0", - "@types/seedrandom": "^2.4.28", - "@types/webgl-ext": "0.0.30", - "@webgpu/types": "0.1.16", - "long": "4.0.0", - "node-fetch": "~2.6.1", - "seedrandom": "^3.0.5" - }, - "engines": { - "yarn": ">= 1.3.2" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/cors": { - "version": "2.8.17", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.7", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@types/express": { - "version": "4.17.21", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.42", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "24.9.1", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-diff": "^24.3.0" - } - }, - "node_modules/@types/js-yaml": { - "version": "3.12.10", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "license": "MIT" - }, - "node_modules/@types/lodash": { - "version": "4.17.13", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/lodash-es": { - "version": "4.17.12", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/lodash": "*" - } - }, - "node_modules/@types/long": { - "version": "4.0.2", - "license": "MIT" - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/moment-timezone": { - "version": "0.5.30", - "dev": true, - "license": "MIT", - "dependencies": { - "moment-timezone": "*" - } - }, - "node_modules/@types/multer": { - "version": "1.4.11", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/node": { - "version": "22.15.18", - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/oauth": { - "version": "0.9.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/offscreencanvas": { - "version": "2019.3.0", - "license": "MIT" - }, - "node_modules/@types/passport": { - "version": "1.0.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/passport-oauth2": { - "version": "1.4.15", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*", - "@types/oauth": "*", - "@types/passport": "*" - } - }, - "node_modules/@types/passport-strategy": { - "version": "0.2.38", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*", - "@types/passport": "*" - } - }, - "node_modules/@types/qs": { - "version": "6.9.11", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/safe-regex": { - "version": "1.1.6", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/seedrandom": { - "version": "2.4.34", - "license": "MIT" - }, - "node_modules/@types/semver": { - "version": "7.5.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/send": { - "version": "0.17.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@types/tmp": { - "version": "0.0.33", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/twemoji": { - "version": "12.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/uuid": { - "version": "9.0.8", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/webgl-ext": { - "version": "0.0.30", - "license": "MIT" - }, - "node_modules/@types/ws": { - "version": "8.18.1", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "13.0.12", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.60.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.60.0", - "@typescript-eslint/type-utils": "5.60.0", - "@typescript-eslint/utils": "5.60.0", - "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.60.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "5.60.0", - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/typescript-estree": "5.60.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.60.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/visitor-keys": "5.60.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.60.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "5.60.0", - "@typescript-eslint/utils": "5.60.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.60.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.60.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/visitor-keys": "5.60.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.60.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.60.0", - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/typescript-estree": "5.60.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.60.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "5.60.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@vitejs/plugin-vue": { - "version": "5.2.4", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0", - "vue": "^3.2.25" - } - }, - "node_modules/@vladfrangu/async_event_emitter": { - "version": "2.4.6", - "license": "MIT", - "engines": { - "node": ">=v14.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@volar/language-core": { - "version": "2.4.14", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/source-map": "2.4.14" - } - }, - "node_modules/@volar/source-map": { - "version": "2.4.14", - "dev": true, - "license": "MIT" - }, - "node_modules/@volar/typescript": { - "version": "2.4.14", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/language-core": "2.4.14", - "path-browserify": "^1.0.1", - "vscode-uri": "^3.0.8" - } - }, - "node_modules/@vue/compiler-core": { - "version": "3.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.27.2", - "@vue/shared": "3.5.16", - "entities": "^4.5.0", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.1" - } - }, - "node_modules/@vue/compiler-dom": { - "version": "3.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-core": "3.5.16", - "@vue/shared": "3.5.16" - } - }, - "node_modules/@vue/compiler-sfc": { - "version": "3.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.27.2", - "@vue/compiler-core": "3.5.16", - "@vue/compiler-dom": "3.5.16", - "@vue/compiler-ssr": "3.5.16", - "@vue/shared": "3.5.16", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.17", - "postcss": "^8.5.3", - "source-map-js": "^1.2.1" - } - }, - "node_modules/@vue/compiler-sfc/node_modules/magic-string": { - "version": "0.30.17", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/@vue/compiler-ssr": { - "version": "3.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.5.16", - "@vue/shared": "3.5.16" - } - }, - "node_modules/@vue/compiler-vue2": { - "version": "2.7.16", - "dev": true, - "license": "MIT", - "dependencies": { - "de-indent": "^1.0.2", - "he": "^1.2.0" - } - }, - "node_modules/@vue/devtools-api": { - "version": "6.6.4", - "dev": true, - "license": "MIT" - }, - "node_modules/@vue/language-core": { - "version": "2.2.10", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/language-core": "~2.4.11", - "@vue/compiler-dom": "^3.5.0", - "@vue/compiler-vue2": "^2.7.16", - "@vue/shared": "^3.5.0", - "alien-signals": "^1.0.3", - "minimatch": "^9.0.3", - "muggle-string": "^0.4.1", - "path-browserify": "^1.0.1" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@vue/language-core/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@vue/language-core/node_modules/minimatch": { - "version": "9.0.5", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@vue/reactivity": { - "version": "3.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/shared": "3.5.16" - } - }, - "node_modules/@vue/runtime-core": { - "version": "3.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/reactivity": "3.5.16", - "@vue/shared": "3.5.16" - } - }, - "node_modules/@vue/runtime-dom": { - "version": "3.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/reactivity": "3.5.16", - "@vue/runtime-core": "3.5.16", - "@vue/shared": "3.5.16", - "csstype": "^3.1.3" - } - }, - "node_modules/@vue/server-renderer": { - "version": "3.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-ssr": "3.5.16", - "@vue/shared": "3.5.16" - }, - "peerDependencies": { - "vue": "3.5.16" - } - }, - "node_modules/@vue/shared": { - "version": "3.5.16", - "dev": true, - "license": "MIT" - }, - "node_modules/@vue/tsconfig": { - "version": "0.7.0", - "dev": true, - "license": "MIT", - "peerDependencies": { - "typescript": "5.x", - "vue": "^3.4.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - }, - "vue": { - "optional": true - } - } - }, - "node_modules/@webgpu/types": { - "version": "0.1.16", - "license": "BSD-3-Clause" - }, - "node_modules/@zeppelinbot/backend": { - "resolved": "backend", - "link": true - }, - "node_modules/@zeppelinbot/dashboard": { - "resolved": "dashboard", - "link": true - }, - "node_modules/@zeppelinbot/shared": { - "resolved": "shared", - "link": true - }, - "node_modules/0x": { - "version": "5.7.0", - "license": "MIT", - "dependencies": { - "ajv": "^8.8.2", - "browserify": "^17.0.0", - "concat-stream": "^2.0.0", - "d3-fg": "^6.14.0", - "debounce": "^1.2.0", - "debug": "^4.1.1", - "end-of-stream": "^1.1.0", - "env-string": "^1.0.0", - "escape-string-regexp": "^4.0.0", - "execspawn": "^1.0.1", - "fs-extra": "^10.1.0", - "has-unicode": "^2.0.1", - "hsl-to-rgb-for-reals": "^1.1.0", - "jsonstream2": "^3.0.0", - "make-dir": "^3.1.0", - "minimist": "^1.2.0", - "morphdom": "^2.3.3", - "nanohtml": "^1.4.0", - "on-net-listen": "^1.1.0", - "opn": "^5.4.0", - "pump": "^3.0.0", - "pumpify": "^2.0.1", - "semver": "^7.3.5", - "single-line-log": "^1.0.1", - "split2": "^4.0.0", - "tachyons": "^4.9.1", - "through2": "^4.0.0", - "which": "^2.0.2" - }, - "bin": { - "0x": "cmd.js" - }, - "engines": { - "node": ">=8.5.0" - } - }, - "node_modules/0x/node_modules/ajv": { - "version": "8.12.0", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/0x/node_modules/fs-extra": { - "version": "10.1.0", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/0x/node_modules/json-schema-traverse": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/0x/node_modules/readable-stream": { - "version": "3.6.2", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/0x/node_modules/through2": { - "version": "4.0.2", - "license": "MIT", - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/abstract-logging": { - "version": "2.0.1", - "license": "MIT" - }, - "node_modules/accepts": { - "version": "1.3.8", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ace-builds": { - "version": "1.41.0", - "dev": true, - "license": "BSD-3-Clause", - "peer": true - }, - "node_modules/acorn": { - "version": "8.14.1", - "devOptional": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-node": { - "version": "1.8.2", - "license": "Apache-2.0", - "dependencies": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - } - }, - "node_modules/acorn-node/node_modules/acorn": { - "version": "7.4.1", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-node/node_modules/acorn-walk": { - "version": "7.2.0", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.2", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/alien-signals": { - "version": "1.0.13", - "dev": true, - "license": "MIT" - }, - "node_modules/ansi-align": { - "version": "3.0.1", - "license": "ISC", - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-align/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-align/node_modules/string-width": { - "version": "4.2.3", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-escapes": { - "version": "3.2.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ansis": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.1.0.tgz", - "integrity": "sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "license": "MIT" - }, - "node_modules/any-shell-escape": { - "version": "0.1.1", - "license": "MIT" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/app-root-path": { - "version": "3.1.0", - "license": "MIT", - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/append-field": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/archy": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/arg": { - "version": "4.1.3", - "devOptional": true, - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "license": "Python-2.0" - }, - "node_modules/array-find-index": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-flatten": { - "version": "3.0.0", - "license": "MIT" - }, - "node_modules/array-from": { - "version": "2.1.1", - "license": "MIT" - }, - "node_modules/array-union": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/arrgv": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/arrify": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/asn1": { - "version": "0.2.6", - "license": "MIT", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/asn1.js": { - "version": "5.4.1", - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.0", - "license": "MIT" - }, - "node_modules/assert": { - "version": "1.5.1", - "license": "MIT", - "dependencies": { - "object.assign": "^4.1.4", - "util": "^0.10.4" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/assert/node_modules/inherits": { - "version": "2.0.3", - "license": "ISC" - }, - "node_modules/assert/node_modules/util": { - "version": "0.10.4", - "license": "MIT", - "dependencies": { - "inherits": "2.0.3" - } - }, - "node_modules/async": { - "version": "3.2.5", - "license": "MIT" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "license": "MIT" - }, - "node_modules/atomic-sleep": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/atomically": { - "version": "1.7.0", - "license": "MIT", - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/autocannon": { - "version": "7.14.0", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "char-spinner": "^1.0.1", - "cli-table3": "^0.6.0", - "color-support": "^1.1.1", - "cross-argv": "^2.0.0", - "form-data": "^4.0.0", - "has-async-hooks": "^1.0.0", - "hdr-histogram-js": "^3.0.0", - "hdr-histogram-percentiles-obj": "^3.0.0", - "http-parser-js": "^0.5.2", - "hyperid": "^3.0.0", - "lodash.chunk": "^4.2.0", - "lodash.clonedeep": "^4.5.0", - "lodash.flatten": "^4.4.0", - "manage-path": "^2.0.0", - "on-net-listen": "^1.1.1", - "pretty-bytes": "^5.4.1", - "progress": "^2.0.3", - "reinterval": "^1.1.0", - "retimer": "^3.0.0", - "semver": "^7.3.2", - "subarg": "^1.0.0", - "timestring": "^6.0.0" - }, - "bin": { - "autocannon": "autocannon.js" - } - }, - "node_modules/autocannon/node_modules/cross-argv": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/ava": { - "version": "5.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.8.2", - "acorn-walk": "^8.2.0", - "ansi-styles": "^6.2.1", - "arrgv": "^1.0.2", - "arrify": "^3.0.0", - "callsites": "^4.0.0", - "cbor": "^8.1.0", - "chalk": "^5.2.0", - "chokidar": "^3.5.3", - "chunkd": "^2.0.1", - "ci-info": "^3.8.0", - "ci-parallel-vars": "^1.0.1", - "clean-yaml-object": "^0.1.0", - "cli-truncate": "^3.1.0", - "code-excerpt": "^4.0.0", - "common-path-prefix": "^3.0.0", - "concordance": "^5.0.4", - "currently-unhandled": "^0.4.1", - "debug": "^4.3.4", - "emittery": "^1.0.1", - "figures": "^5.0.0", - "globby": "^13.1.4", - "ignore-by-default": "^2.1.0", - "indent-string": "^5.0.0", - "is-error": "^2.2.2", - "is-plain-object": "^5.0.0", - "is-promise": "^4.0.0", - "matcher": "^5.0.0", - "mem": "^9.0.2", - "ms": "^2.1.3", - "p-event": "^5.0.1", - "p-map": "^5.5.0", - "picomatch": "^2.3.1", - "pkg-conf": "^4.0.0", - "plur": "^5.1.0", - "pretty-ms": "^8.0.0", - "resolve-cwd": "^3.0.0", - "stack-utils": "^2.0.6", - "strip-ansi": "^7.0.1", - "supertap": "^3.0.1", - "temp-dir": "^3.0.0", - "write-file-atomic": "^5.0.1", - "yargs": "^17.7.2" - }, - "bin": { - "ava": "entrypoints/cli.mjs" - }, - "engines": { - "node": ">=14.19 <15 || >=16.15 <17 || >=18" - }, - "peerDependencies": { - "@ava/typescript": "*" - }, - "peerDependenciesMeta": { - "@ava/typescript": { - "optional": true - } - } - }, - "node_modules/ava/node_modules/aggregate-error": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^4.0.0", - "indent-string": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ava/node_modules/ansi-regex": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ava/node_modules/ansi-styles": { - "version": "6.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ava/node_modules/callsites": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ava/node_modules/chalk": { - "version": "5.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/ava/node_modules/ci-info": { - "version": "3.9.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ava/node_modules/clean-stack": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ava/node_modules/cli-truncate": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ava/node_modules/emoji-regex": { - "version": "9.2.2", - "dev": true, - "license": "MIT" - }, - "node_modules/ava/node_modules/escape-string-regexp": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ava/node_modules/figures": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^5.0.0", - "is-unicode-supported": "^1.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ava/node_modules/globby": { - "version": "13.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ava/node_modules/indent-string": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ava/node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ava/node_modules/is-promise": { - "version": "4.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ava/node_modules/is-unicode-supported": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ava/node_modules/ms": { - "version": "2.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/ava/node_modules/p-map": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ava/node_modules/slash": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ava/node_modules/slice-ansi": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/ava/node_modules/string-width": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ava/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.6", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/avvio": { - "version": "8.3.0", - "license": "MIT", - "dependencies": { - "@fastify/error": "^3.3.0", - "archy": "^1.0.0", - "debug": "^4.0.0", - "fastq": "^1.17.1" - } - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.12.0", - "license": "MIT" - }, - "node_modules/b4a": { - "version": "1.6.4", - "license": "ISC" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/base64url": { - "version": "3.0.1", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "license": "BSD-3-Clause", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/bit-twiddle": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/bl": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/buffer": { - "version": "5.7.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/blueimp-md5": { - "version": "2.19.0", - "dev": true, - "license": "MIT" - }, - "node_modules/bn.js": { - "version": "5.2.1", - "license": "MIT" - }, - "node_modules/body-parser": { - "version": "1.20.3", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/boxen": { - "version": "5.1.2", - "license": "MIT", - "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen/node_modules/string-width": { - "version": "4.2.3", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen/node_modules/wrap-ansi": { - "version": "7.0.0", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/brfs": { - "version": "2.0.2", - "license": "MIT", - "dependencies": { - "quote-stream": "^1.0.1", - "resolve": "^1.1.5", - "static-module": "^3.0.2", - "through2": "^2.0.0" - }, - "bin": { - "brfs": "bin/cmd.js" - } - }, - "node_modules/brorand": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/browser-pack": { - "version": "6.1.0", - "license": "MIT", - "dependencies": { - "combine-source-map": "~0.8.0", - "defined": "^1.0.0", - "JSONStream": "^1.0.3", - "safe-buffer": "^5.1.1", - "through2": "^2.0.0", - "umd": "^3.0.0" - }, - "bin": { - "browser-pack": "bin/cmd.js" - } - }, - "node_modules/browser-process-hrtime": { - "version": "0.1.3", - "license": "BSD-2-Clause" - }, - "node_modules/browser-resolve": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "resolve": "^1.17.0" - } - }, - "node_modules/browserify": { - "version": "17.0.0", - "license": "MIT", - "dependencies": { - "assert": "^1.4.0", - "browser-pack": "^6.0.1", - "browser-resolve": "^2.0.0", - "browserify-zlib": "~0.2.0", - "buffer": "~5.2.1", - "cached-path-relative": "^1.0.0", - "concat-stream": "^1.6.0", - "console-browserify": "^1.1.0", - "constants-browserify": "~1.0.0", - "crypto-browserify": "^3.0.0", - "defined": "^1.0.0", - "deps-sort": "^2.0.1", - "domain-browser": "^1.2.0", - "duplexer2": "~0.1.2", - "events": "^3.0.0", - "glob": "^7.1.0", - "has": "^1.0.0", - "htmlescape": "^1.1.0", - "https-browserify": "^1.0.0", - "inherits": "~2.0.1", - "insert-module-globals": "^7.2.1", - "JSONStream": "^1.0.3", - "labeled-stream-splicer": "^2.0.0", - "mkdirp-classic": "^0.5.2", - "module-deps": "^6.2.3", - "os-browserify": "~0.3.0", - "parents": "^1.0.1", - "path-browserify": "^1.0.0", - "process": "~0.11.0", - "punycode": "^1.3.2", - "querystring-es3": "~0.2.0", - "read-only-stream": "^2.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.1.4", - "shasum-object": "^1.0.0", - "shell-quote": "^1.6.1", - "stream-browserify": "^3.0.0", - "stream-http": "^3.0.0", - "string_decoder": "^1.1.1", - "subarg": "^1.0.0", - "syntax-error": "^1.1.1", - "through2": "^2.0.0", - "timers-browserify": "^1.0.1", - "tty-browserify": "0.0.1", - "url": "~0.11.0", - "util": "~0.12.0", - "vm-browserify": "^1.0.0", - "xtend": "^4.0.0" - }, - "bin": { - "browserify": "bin/cmd.js" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/browserify-des": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/browserify-rsa": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "node_modules/browserify-sign": { - "version": "4.2.2", - "license": "ISC", - "dependencies": { - "bn.js": "^5.2.1", - "browserify-rsa": "^4.1.0", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.4", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.6", - "readable-stream": "^3.6.2", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/browserify-sign/node_modules/readable-stream": { - "version": "3.6.2", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/browserify-zlib": { - "version": "0.2.0", - "license": "MIT", - "dependencies": { - "pako": "~1.0.5" - } - }, - "node_modules/browserify/node_modules/concat-stream": { - "version": "1.6.2", - "engines": [ - "node >= 0.8" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/browserify/node_modules/punycode": { - "version": "1.4.1", - "license": "MIT" - }, - "node_modules/buffer": { - "version": "5.2.1", - "license": "MIT", - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "node_modules/buffer-equal": { - "version": "0.0.1", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "license": "MIT" - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/bufferutil": { - "version": "4.0.8", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, - "node_modules/builtin-status-codes": { - "version": "3.0.0", - "license": "MIT" - }, - "node_modules/busboy": { - "version": "1.6.0", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacheable-request": { - "version": "6.1.0", - "license": "MIT", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/normalize-url": { - "version": "4.5.1", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cached-path-relative": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/call-bind": { - "version": "1.0.5", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caseless": { - "version": "0.12.0", - "license": "Apache-2.0" - }, - "node_modules/cbor": { - "version": "8.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "nofilter": "^3.1.0" - }, - "engines": { - "node": ">=12.19" - } - }, - "node_modules/cephes": { - "version": "1.2.0", - "license": "BSD-3-Clause" - }, - "node_modules/chalk": { - "version": "4.1.2", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/char-spinner": { - "version": "1.0.1", - "license": "ISC" - }, - "node_modules/chardet": { - "version": "0.7.0", - "license": "MIT" - }, - "node_modules/chokidar": { - "version": "3.5.3", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chownr": { - "version": "3.0.0", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/chunkd": { - "version": "2.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ci-info": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/ci-parallel-vars": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/cipher-base": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/clean-yaml-object": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cli-boxes": { - "version": "2.2.1", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-cursor": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "restore-cursor": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-highlight": { - "version": "2.1.11", - "license": "ISC", - "dependencies": { - "chalk": "^4.0.0", - "highlight.js": "^10.7.1", - "mz": "^2.4.0", - "parse5": "^5.1.1", - "parse5-htmlparser2-tree-adapter": "^6.0.0", - "yargs": "^16.0.0" - }, - "bin": { - "highlight": "bin/highlight" - }, - "engines": { - "node": ">=8.0.0", - "npm": ">=5.0.0" - } - }, - "node_modules/cli-highlight/node_modules/cliui": { - "version": "7.0.4", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/cli-highlight/node_modules/highlight.js": { - "version": "10.7.3", - "license": "BSD-3-Clause", - "engines": { - "node": "*" - } - }, - "node_modules/cli-highlight/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-highlight/node_modules/parse5": { - "version": "5.1.1", - "license": "MIT" - }, - "node_modules/cli-highlight/node_modules/string-width": { - "version": "4.2.3", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-highlight/node_modules/wrap-ansi": { - "version": "7.0.0", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/cli-highlight/node_modules/yargs": { - "version": "16.2.0", - "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cli-highlight/node_modules/yargs-parser": { - "version": "20.2.9", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-table3": { - "version": "0.6.3", - "license": "MIT", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/cli-table3/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-table3/node_modules/string-width": { - "version": "4.2.3", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-width": { - "version": "2.2.1", - "license": "ISC" - }, - "node_modules/clinic": { - "version": "13.0.0", - "license": "MIT", - "dependencies": { - "@clinic/bubbleprof": "^10.0.0", - "@clinic/doctor": "^11.0.0", - "@clinic/flame": "^13.0.0", - "@clinic/heap-profiler": "^5.0.0", - "any-shell-escape": "^0.1.1", - "async": "^3.0.1", - "autocannon": "^7.5.0", - "commist": "^1.0.0", - "cross-argv": "^1.0.0", - "dargs": "^7.0.0", - "env-string": "^1.0.1", - "execspawn": "^1.0.1", - "insight": "^0.11.1", - "minimist": "^1.2.0", - "open": "^7.3.0", - "ora": "^5.1.0", - "rimraf": "^3.0.0", - "stream-collector": "^1.0.1", - "subarg": "^1.0.0", - "update-notifier": "^5.0.1" - }, - "bin": { - "clinic": "bin.js" - } - }, - "node_modules/clipboard-copy": { - "version": "4.0.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/cliui": { - "version": "8.0.1", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-response": { - "version": "1.0.3", - "license": "MIT", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/code-excerpt": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "convert-to-spaces": "^2.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/code-point-at": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "license": "MIT" - }, - "node_modules/color-support": { - "version": "1.1.3", - "license": "ISC", - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/combine-source-map": { - "version": "0.8.0", - "license": "MIT", - "dependencies": { - "convert-source-map": "~1.1.0", - "inline-source-map": "~0.6.0", - "lodash.memoize": "~3.0.3", - "source-map": "~0.5.3" - } - }, - "node_modules/combine-source-map/node_modules/convert-source-map": { - "version": "1.1.3", - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "2.20.3", - "license": "MIT" - }, - "node_modules/commist": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "leven": "^2.1.0", - "minimist": "^1.1.0" - } - }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "license": "MIT" - }, - "node_modules/concat-stream": { - "version": "2.0.0", - "engines": [ - "node >= 6.0" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/concat-stream/node_modules/readable-stream": { - "version": "3.6.2", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/concordance": { - "version": "5.0.4", - "dev": true, - "license": "ISC", - "dependencies": { - "date-time": "^3.1.0", - "esutils": "^2.0.3", - "fast-diff": "^1.2.0", - "js-string-escape": "^1.0.1", - "lodash": "^4.17.15", - "md5-hex": "^3.0.1", - "semver": "^7.3.2", - "well-known-symbols": "^2.0.0" - }, - "engines": { - "node": ">=10.18.0 <11 || >=12.14.0 <13 || >=14" - } - }, - "node_modules/conf": { - "version": "10.2.0", - "license": "MIT", - "dependencies": { - "ajv": "^8.6.3", - "ajv-formats": "^2.1.1", - "atomically": "^1.7.0", - "debounce-fn": "^4.0.0", - "dot-prop": "^6.0.1", - "env-paths": "^2.2.1", - "json-schema-typed": "^7.0.3", - "onetime": "^5.1.2", - "pkg-up": "^3.1.0", - "semver": "^7.3.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/conf/node_modules/ajv": { - "version": "8.12.0", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/conf/node_modules/json-schema-traverse": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/conf/node_modules/mimic-fn": { - "version": "2.1.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/conf/node_modules/onetime": { - "version": "5.1.2", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/configstore": { - "version": "5.0.1", - "license": "BSD-2-Clause", - "dependencies": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/configstore/node_modules/dot-prop": { - "version": "5.3.0", - "license": "MIT", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/configstore/node_modules/is-obj": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/configstore/node_modules/write-file-atomic": { - "version": "3.0.3", - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/console-browserify": { - "version": "1.2.0" - }, - "node_modules/constants-browserify": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-to-spaces": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/cookie": { - "version": "0.6.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "license": "MIT" - }, - "node_modules/copy-to-clipboard": { - "version": "3.3.3", - "license": "MIT", - "dependencies": { - "toggle-selection": "^1.0.6" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/cors": { - "version": "2.8.5", - "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/create-ecdh": { - "version": "4.0.4", - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.0", - "license": "MIT" - }, - "node_modules/create-hash": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "devOptional": true, - "license": "MIT" - }, - "node_modules/cross-argv": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/cross-env": { - "version": "7.0.3", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "bin": { - "cross-env": "src/bin/cross-env.js", - "cross-env-shell": "src/bin/cross-env-shell.js" - }, - "engines": { - "node": ">=10.14", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-browserify": { - "version": "3.12.0", - "license": "MIT", - "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, - "engines": { - "node": "*" - } - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/currently-unhandled": { - "version": "0.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "array-find-index": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cwise-compiler": { - "version": "1.1.3", - "license": "MIT", - "dependencies": { - "uniq": "^1.0.0" - } - }, - "node_modules/d": { - "version": "1.0.1", - "license": "ISC", - "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "node_modules/d3-array": { - "version": "2.12.1", - "license": "BSD-3-Clause", - "dependencies": { - "internmap": "^1.0.0" - } - }, - "node_modules/d3-axis": { - "version": "1.0.12", - "license": "BSD-3-Clause" - }, - "node_modules/d3-color": { - "version": "1.4.1", - "license": "BSD-3-Clause" - }, - "node_modules/d3-dispatch": { - "version": "1.0.6", - "license": "BSD-3-Clause" - }, - "node_modules/d3-drag": { - "version": "1.2.5", - "license": "BSD-3-Clause", - "dependencies": { - "d3-dispatch": "1", - "d3-selection": "1" - } - }, - "node_modules/d3-ease": { - "version": "1.0.7", - "license": "BSD-3-Clause" - }, - "node_modules/d3-fg": { - "version": "6.14.0", - "license": "Apache-2.0", - "dependencies": { - "d3-array": "^2.2.0", - "d3-dispatch": "^1.0.5", - "d3-ease": "^1.0.5", - "d3-hierarchy": "^1.1.8", - "d3-scale": "^3.0.0", - "d3-selection": "^1.4.0", - "d3-zoom": "^1.7.3", - "escape-string-regexp": "^1.0.5", - "hsl-to-rgb-for-reals": "^1.1.0" - } - }, - "node_modules/d3-fg/node_modules/escape-string-regexp": { - "version": "1.0.5", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/d3-format": { - "version": "1.4.5", - "license": "BSD-3-Clause" - }, - "node_modules/d3-hierarchy": { - "version": "1.1.9", - "license": "BSD-3-Clause" - }, - "node_modules/d3-interpolate": { - "version": "1.4.0", - "license": "BSD-3-Clause", - "dependencies": { - "d3-color": "1" - } - }, - "node_modules/d3-path": { - "version": "1.0.9", - "license": "BSD-3-Clause" - }, - "node_modules/d3-scale": { - "version": "3.3.0", - "license": "BSD-3-Clause", - "dependencies": { - "d3-array": "^2.3.0", - "d3-format": "1 - 2", - "d3-interpolate": "1.2.0 - 2", - "d3-time": "^2.1.1", - "d3-time-format": "2 - 3" - } - }, - "node_modules/d3-scale/node_modules/d3-time": { - "version": "2.1.1", - "license": "BSD-3-Clause", - "dependencies": { - "d3-array": "2" - } - }, - "node_modules/d3-selection": { - "version": "1.4.2", - "license": "BSD-3-Clause" - }, - "node_modules/d3-shape": { - "version": "1.3.7", - "license": "BSD-3-Clause", - "dependencies": { - "d3-path": "1" - } - }, - "node_modules/d3-time": { - "version": "1.1.0", - "license": "BSD-3-Clause" - }, - "node_modules/d3-time-format": { - "version": "2.3.0", - "license": "BSD-3-Clause", - "dependencies": { - "d3-time": "1" - } - }, - "node_modules/d3-timer": { - "version": "1.0.10", - "license": "BSD-3-Clause" - }, - "node_modules/d3-transition": { - "version": "1.3.2", - "license": "BSD-3-Clause", - "dependencies": { - "d3-color": "1", - "d3-dispatch": "1", - "d3-ease": "1", - "d3-interpolate": "1", - "d3-selection": "^1.1.0", - "d3-timer": "1" - } - }, - "node_modules/d3-zoom": { - "version": "1.8.3", - "license": "BSD-3-Clause", - "dependencies": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" - } - }, - "node_modules/dargs": { - "version": "7.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/dash-ast": { - "version": "2.0.1", - "license": "Apache-2.0" - }, - "node_modules/dashdash": { - "version": "1.14.1", - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/date-time": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "time-zone": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dayjs": { - "version": "1.11.10", - "license": "MIT" - }, - "node_modules/de-indent": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/debounce": { - "version": "1.2.1", - "license": "MIT" - }, - "node_modules/debounce-fn": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "mimic-fn": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/debounce-fn/node_modules/mimic-fn": { - "version": "3.1.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decompress-response": { - "version": "3.3.0", - "license": "MIT", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/deep-diff": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "license": "MIT" - }, - "node_modules/defaults": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/defer-to-connect": { - "version": "1.1.3", - "license": "MIT" - }, - "node_modules/define-data-property": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/defined": { - "version": "1.0.1", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/denque": { - "version": "2.1.0", - "license": "Apache-2.0", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/deps-sort": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "JSONStream": "^1.0.3", - "shasum-object": "^1.0.0", - "subarg": "^1.0.0", - "through2": "^2.0.0" - }, - "bin": { - "deps-sort": "bin/cmd.js" - } - }, - "node_modules/des.js": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-libc": { - "version": "2.0.4", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/detective": { - "version": "5.2.1", - "license": "MIT", - "dependencies": { - "acorn-node": "^1.8.2", - "defined": "^1.0.0", - "minimist": "^1.2.6" - }, - "bin": { - "detective": "bin/detective.js" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "devOptional": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diff-sequences": { - "version": "24.9.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.0", - "license": "MIT" - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/discord-api-types": { - "version": "0.38.8", - "license": "MIT", - "workspaces": [ - "scripts/actions/documentation" - ] - }, - "node_modules/discord.js": { - "version": "14.19.3", - "license": "Apache-2.0", - "dependencies": { - "@discordjs/builders": "^1.11.2", - "@discordjs/collection": "1.5.3", - "@discordjs/formatters": "^0.6.1", - "@discordjs/rest": "^2.5.0", - "@discordjs/util": "^1.1.1", - "@discordjs/ws": "^1.2.2", - "@sapphire/snowflake": "3.5.3", - "discord-api-types": "^0.38.1", - "fast-deep-equal": "3.1.3", - "lodash.snakecase": "4.1.1", - "magic-bytes.js": "^1.10.0", - "tslib": "^2.6.3", - "undici": "6.21.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/discordjs/discord.js?sponsor" - } - }, - "node_modules/discord.js/node_modules/tslib": { - "version": "2.8.1", - "license": "0BSD" - }, - "node_modules/distributions": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "cephes": "^1.1.2" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/domain-browser": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">=0.4", - "npm": ">=1.2" - } - }, - "node_modules/dot-prop": { - "version": "6.0.1", - "license": "MIT", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dot-prop/node_modules/is-obj": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/dotenv": { - "version": "16.5.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", - "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dotgitconfig": { - "version": "1.1.2", - "license": "MIT", - "dependencies": { - "ini": "^1.3.5" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/dup": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/duplexer": { - "version": "0.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/duplexer2": { - "version": "0.1.4", - "license": "BSD-3-Clause", - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/duplexer3": { - "version": "0.1.5", - "license": "BSD-3-Clause" - }, - "node_modules/duplexify": { - "version": "4.1.2", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.4.1", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1", - "stream-shift": "^1.0.0" - } - }, - "node_modules/duplexify/node_modules/readable-stream": { - "version": "3.6.2", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "license": "MIT" - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "license": "MIT", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "license": "MIT" - }, - "node_modules/elliptic": { - "version": "6.5.4", - "license": "MIT", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "license": "MIT" - }, - "node_modules/emittery": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/endpoint": { - "version": "0.4.5", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.18.1", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/env-string": { - "version": "1.0.1", - "license": "MIT" - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es5-ext": { - "version": "0.10.64", - "hasInstallScript": true, - "license": "ISC", - "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "esniff": "^2.0.1", - "next-tick": "^1.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "license": "MIT", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-map": { - "version": "0.1.5", - "license": "MIT", - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-set": "~0.1.5", - "es6-symbol": "~3.1.1", - "event-emitter": "~0.3.5" - } - }, - "node_modules/es6-set": { - "version": "0.1.6", - "license": "ISC", - "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.62", - "es6-iterator": "~2.0.3", - "es6-symbol": "^3.1.3", - "event-emitter": "^0.3.5", - "type": "^2.7.2" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/es6-set/node_modules/type": { - "version": "2.7.2", - "license": "ISC" - }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "license": "ISC", - "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "node_modules/esbuild": { - "version": "0.25.5", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "peer": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.5", - "@esbuild/android-arm": "0.25.5", - "@esbuild/android-arm64": "0.25.5", - "@esbuild/android-x64": "0.25.5", - "@esbuild/darwin-arm64": "0.25.5", - "@esbuild/darwin-x64": "0.25.5", - "@esbuild/freebsd-arm64": "0.25.5", - "@esbuild/freebsd-x64": "0.25.5", - "@esbuild/linux-arm": "0.25.5", - "@esbuild/linux-arm64": "0.25.5", - "@esbuild/linux-ia32": "0.25.5", - "@esbuild/linux-loong64": "0.25.5", - "@esbuild/linux-mips64el": "0.25.5", - "@esbuild/linux-ppc64": "0.25.5", - "@esbuild/linux-riscv64": "0.25.5", - "@esbuild/linux-s390x": "0.25.5", - "@esbuild/linux-x64": "0.25.5", - "@esbuild/netbsd-arm64": "0.25.5", - "@esbuild/netbsd-x64": "0.25.5", - "@esbuild/openbsd-arm64": "0.25.5", - "@esbuild/openbsd-x64": "0.25.5", - "@esbuild/sunos-x64": "0.25.5", - "@esbuild/win32-arm64": "0.25.5", - "@esbuild/win32-ia32": "0.25.5", - "@esbuild/win32-x64": "0.25.5" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-goat": { - "version": "2.1.1", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "1.14.3", - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/levn": { - "version": "0.3.0", - "license": "MIT", - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/optionator": { - "version": "0.8.3", - "license": "MIT", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/prelude-ls": { - "version": "1.1.2", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.6.1", - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/escodegen/node_modules/type-check": { - "version": "0.3.2", - "license": "MIT", - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/eslint": { - "version": "8.43.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.43.0", - "@humanwhocodes/config-array": "^0.11.10", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-prettier": { - "version": "8.8.0", - "dev": true, - "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.1", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esm": { - "version": "3.2.25", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/esniff": { - "version": "2.0.1", - "license": "ISC", - "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.62", - "event-emitter": "^0.3.5", - "type": "^2.7.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esniff/node_modules/type": { - "version": "2.7.3", - "license": "ISC" - }, - "node_modules/espree": { - "version": "9.5.2", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-is-function": { - "version": "1.0.0", - "license": "Apache-2.0" - }, - "node_modules/estree-is-member-expression": { - "version": "1.0.0", - "license": "Apache-2.0" - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/esutils": { - "version": "2.0.3", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-emitter": { - "version": "0.3.5", - "license": "MIT", - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "node_modules/event-stream": { - "version": "3.3.4", - "dev": true, - "license": "MIT", - "dependencies": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.1.0", - "pause-stream": "0.0.11", - "split": "0.3", - "stream-combiner": "~0.0.4", - "through": "~2.3.1" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/events": { - "version": "3.3.0", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "license": "MIT", - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/execspawn": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "util-extend": "^1.0.1" - } - }, - "node_modules/express": { - "version": "4.21.2", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/array-flatten": { - "version": "1.1.1", - "license": "MIT" - }, - "node_modules/express/node_modules/cookie": { - "version": "0.7.1", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/ext": { - "version": "1.7.0", - "license": "ISC", - "dependencies": { - "type": "^2.7.2" - } - }, - "node_modules/ext/node_modules/type": { - "version": "2.7.2", - "license": "ISC" - }, - "node_modules/extend": { - "version": "3.0.2", - "license": "MIT" - }, - "node_modules/external-editor": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "engines": [ - "node >=0.6.0" - ], - "license": "MIT" - }, - "node_modules/fast-content-type-parse": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/fast-decode-uri-component": { - "version": "1.0.1", - "license": "MIT" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "license": "MIT" - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "license": "MIT" - }, - "node_modules/fast-json-stringify": { - "version": "5.13.0", - "license": "MIT", - "dependencies": { - "@fastify/merge-json-schemas": "^0.1.0", - "ajv": "^8.10.0", - "ajv-formats": "^2.1.1", - "fast-deep-equal": "^3.1.3", - "fast-uri": "^2.1.0", - "json-schema-ref-resolver": "^1.0.1", - "rfdc": "^1.2.0" - } - }, - "node_modules/fast-json-stringify/node_modules/ajv": { - "version": "8.12.0", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/fast-json-stringify/node_modules/json-schema-traverse": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "license": "MIT" - }, - "node_modules/fast-querystring": { - "version": "1.1.2", - "license": "MIT", - "dependencies": { - "fast-decode-uri-component": "^1.0.1" - } - }, - "node_modules/fast-redact": { - "version": "3.4.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/fast-safe-stringify": { - "version": "2.1.1", - "license": "MIT" - }, - "node_modules/fast-uri": { - "version": "2.3.0", - "license": "MIT" - }, - "node_modules/fastify": { - "version": "4.26.2", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT", - "dependencies": { - "@fastify/ajv-compiler": "^3.5.0", - "@fastify/error": "^3.4.0", - "@fastify/fast-json-stringify-compiler": "^4.3.0", - "abstract-logging": "^2.0.1", - "avvio": "^8.3.0", - "fast-content-type-parse": "^1.1.0", - "fast-json-stringify": "^5.8.0", - "find-my-way": "^8.0.0", - "light-my-request": "^5.11.0", - "pino": "^8.17.0", - "process-warning": "^3.0.0", - "proxy-addr": "^2.0.7", - "rfdc": "^1.3.0", - "secure-json-parse": "^2.7.0", - "semver": "^7.5.4", - "toad-cache": "^3.3.0" - } - }, - "node_modules/fastify-plugin": { - "version": "4.5.1", - "license": "MIT" - }, - "node_modules/fastq": { - "version": "1.17.1", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.3.1", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/find-my-way": { - "version": "8.1.0", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-querystring": "^1.0.0", - "safe-regex2": "^2.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flame-gradient": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "sinusoidal-decimal": "^1.0.0" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatstr": { - "version": "1.0.12", - "license": "MIT" - }, - "node_modules/flatted": { - "version": "3.2.7", - "dev": true, - "license": "ISC" - }, - "node_modules/for-each": { - "version": "0.3.3", - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/foreground-child": { - "version": "3.1.1", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fp-ts": { - "version": "2.16.2", - "license": "MIT" - }, - "node_modules/fresh": { - "version": "0.5.2", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/from": { - "version": "0.1.7", - "dev": true, - "license": "MIT" - }, - "node_modules/from2": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "node_modules/from2-string": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "from2": "^2.0.3" - } - }, - "node_modules/fs-extra": { - "version": "11.2.0", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/generate-function": { - "version": "2.3.1", - "license": "MIT", - "dependencies": { - "is-property": "^1.0.2" - } - }, - "node_modules/generate-object-property": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "is-property": "^1.0.0" - } - }, - "node_modules/get-assigned-identifiers": { - "version": "1.2.0", - "license": "Apache-2.0" - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-stream": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/global-dirs": { - "version": "3.0.1", - "license": "MIT", - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/global-dirs/node_modules/ini": { - "version": "2.0.0", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/globals": { - "version": "13.20.0", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "9.6.0", - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "license": "ISC" - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "dev": true, - "license": "MIT" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/har-schema": { - "version": "2.0.0", - "license": "ISC", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "license": "MIT", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/has": { - "version": "1.0.3", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-ansi": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-ansi/node_modules/ansi-regex": { - "version": "2.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-async-hooks": { - "version": "1.0.0", - "license": "Apache-2.0" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "license": "ISC" - }, - "node_modules/has-yarn": { - "version": "2.1.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/hash-base": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hash-base/node_modules/readable-stream": { - "version": "3.6.2", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/hash.js": { - "version": "1.1.7", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hdr-histogram-js": { - "version": "3.0.0", - "license": "BSD", - "dependencies": { - "@assemblyscript/loader": "^0.19.21", - "base64-js": "^1.2.0", - "pako": "^1.0.3" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/hdr-histogram-percentiles-obj": { - "version": "3.0.0", - "license": "MIT" - }, - "node_modules/he": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "node_modules/hidden-markov-model-tf": { - "version": "4.0.0", - "license": "Apache-2.0", - "dependencies": { - "ml-kmeans": "^4.0.1", - "ndarray": "^1.0.18", - "ndarray-cholesky-factorization": "^1.0.2", - "ndarray-determinant": "^1.0.0", - "ndarray-inv": "^0.2.0", - "seedrandom": "^3.0.1", - "semver": "^6.1.1" - }, - "peerDependencies": { - "@tensorflow/tfjs-core": "^3.13.0" - } - }, - "node_modules/hidden-markov-model-tf/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/highlight.js": { - "version": "11.9.0", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/hsl-to-rgb-for-reals": { - "version": "1.1.1", - "license": "ISC" - }, - "node_modules/htmlescape": { - "version": "1.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "license": "BSD-2-Clause" - }, - "node_modules/http-errors": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "license": "MIT" - }, - "node_modules/http-signature": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/https-browserify": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/humanize-duration": { - "version": "3.31.0", - "license": "Unlicense" - }, - "node_modules/hyperid": { - "version": "3.2.0", - "license": "MIT", - "dependencies": { - "buffer": "^5.2.1", - "uuid": "^8.3.2", - "uuid-parse": "^1.1.0" - } - }, - "node_modules/hyperid/node_modules/uuid": { - "version": "8.3.2", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/hyperscript-attribute-to-property": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/hyperx": { - "version": "2.5.4", - "license": "BSD", - "dependencies": { - "hyperscript-attribute-to-property": "^1.0.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/ignore": { - "version": "5.2.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/ignore-by-default": { - "version": "2.1.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10 <11 || >=12 <13 || >=14" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-lazy": { - "version": "2.1.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", - "license": "ISC" - }, - "node_modules/inline-source-map": { - "version": "0.6.2", - "license": "MIT", - "dependencies": { - "source-map": "~0.5.3" - } - }, - "node_modules/inquirer": { - "version": "6.5.2", - "license": "MIT", - "dependencies": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/inquirer/node_modules/ansi-regex": { - "version": "4.1.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/inquirer/node_modules/ansi-styles": { - "version": "3.2.1", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/chalk": { - "version": "2.4.2", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/color-convert": { - "version": "1.9.3", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/inquirer/node_modules/color-name": { - "version": "1.1.3", - "license": "MIT" - }, - "node_modules/inquirer/node_modules/escape-string-regexp": { - "version": "1.0.5", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/inquirer/node_modules/figures": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/has-flag": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/string-width": { - "version": "2.1.1", - "license": "MIT", - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/string-width/node_modules/ansi-regex": { - "version": "3.0.1", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/string-width/node_modules/strip-ansi": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/strip-ansi": { - "version": "5.2.0", - "license": "MIT", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/inquirer/node_modules/supports-color": { - "version": "5.5.0", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/insert-module-globals": { - "version": "7.2.1", - "license": "MIT", - "dependencies": { - "acorn-node": "^1.5.2", - "combine-source-map": "^0.8.0", - "concat-stream": "^1.6.1", - "is-buffer": "^1.1.0", - "JSONStream": "^1.0.3", - "path-is-absolute": "^1.0.1", - "process": "~0.11.0", - "through2": "^2.0.0", - "undeclared-identifiers": "^1.1.2", - "xtend": "^4.0.0" - }, - "bin": { - "insert-module-globals": "bin/cmd.js" - } - }, - "node_modules/insert-module-globals/node_modules/concat-stream": { - "version": "1.6.2", - "engines": [ - "node >= 0.8" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/insight": { - "version": "0.11.1", - "license": "BSD-2-Clause", - "dependencies": { - "async": "^2.6.2", - "chalk": "^4.1.1", - "conf": "^10.0.1", - "inquirer": "^6.3.1", - "lodash.debounce": "^4.0.8", - "os-name": "^4.0.1", - "request": "^2.88.0", - "tough-cookie": "^4.0.0", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">=12.20" - } - }, - "node_modules/insight/node_modules/async": { - "version": "2.6.4", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/insight/node_modules/uuid": { - "version": "8.3.2", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/internmap": { - "version": "1.0.1", - "license": "ISC" - }, - "node_modules/iota-array": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/irregular-plurals": { - "version": "3.5.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-any-array": { - "version": "2.0.1", - "license": "MIT" - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-attribute": { - "version": "0.0.1", - "license": "MIT" - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "license": "MIT" - }, - "node_modules/is-callable": { - "version": "1.2.7", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-ci": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.12.1", - "license": "MIT", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-error": { - "version": "2.2.2", - "dev": true, - "license": "MIT" - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "license": "MIT", - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-npm": { - "version": "5.0.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-property": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-yarn-global": { - "version": "0.3.0", - "license": "MIT" - }, - "node_modules/isarray": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "license": "ISC" - }, - "node_modules/isstream": { - "version": "0.1.2", - "license": "MIT" - }, - "node_modules/jackspeak": { - "version": "2.3.6", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jest-diff": { - "version": "24.9.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^2.0.1", - "diff-sequences": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/jest-diff/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/jest-diff/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/jest-diff/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/jest-diff/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-diff/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/jest-diff/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/jest-diff/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/jest-get-type": { - "version": "24.9.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/jiti": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/js-string-escape": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "0.1.1", - "license": "MIT" - }, - "node_modules/json-buffer": { - "version": "3.0.0", - "license": "MIT" - }, - "node_modules/json-schema": { - "version": "0.4.0", - "license": "(AFL-2.1 OR BSD-3-Clause)" - }, - "node_modules/json-schema-ref-resolver": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - } - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "license": "MIT" - }, - "node_modules/json-schema-typed": { - "version": "7.0.3", - "license": "BSD-2-Clause" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "license": "ISC" - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "engines": [ - "node >= 0.2.0" - ], - "license": "MIT" - }, - "node_modules/JSONStream": { - "version": "1.3.5", - "license": "(MIT OR Apache-2.0)", - "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/jsonstream2": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "jsonparse": "1.3.1", - "through2": "^3.0.1", - "type-component": "0.0.1" - }, - "bin": { - "jsonstream": "bin/jsonstream.js" - }, - "engines": { - "node": ">=5.10.0" - } - }, - "node_modules/jsonstream2/node_modules/through2": { - "version": "3.0.2", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "2 || 3" - } - }, - "node_modules/jsprim": { - "version": "1.4.2", - "license": "MIT", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/keyv": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.0" - } - }, - "node_modules/knub": { - "version": "32.0.0-next.25", - "license": "MIT", - "dependencies": { - "discord-api-types": "^0.38.8", - "discord.js": "^14.19.3", - "knub-command-manager": "^9.1.0", - "ts-essentials": "^10.0.4", - "zod": "^3.25.17" - }, - "engines": { - "node": ">=22" - } - }, - "node_modules/knub-command-manager": { - "version": "9.1.0", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - } - }, - "node_modules/knub-command-manager/node_modules/escape-string-regexp": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/labeled-stream-splicer": { - "version": "2.0.2", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "stream-splicer": "^2.0.0" - } - }, - "node_modules/last-commit-log": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "dotgitconfig": "^1.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/latest-version": { - "version": "5.1.0", - "license": "MIT", - "dependencies": { - "package-json": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/leven": { - "version": "2.1.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/light-my-request": { - "version": "5.12.0", - "license": "BSD-3-Clause", - "dependencies": { - "cookie": "^0.6.0", - "process-warning": "^3.0.0", - "set-cookie-parser": "^2.4.1" - } - }, - "node_modules/lightningcss": { - "version": "1.30.1", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-darwin-arm64": "1.30.1", - "lightningcss-darwin-x64": "1.30.1", - "lightningcss-freebsd-x64": "1.30.1", - "lightningcss-linux-arm-gnueabihf": "1.30.1", - "lightningcss-linux-arm64-gnu": "1.30.1", - "lightningcss-linux-arm64-musl": "1.30.1", - "lightningcss-linux-x64-gnu": "1.30.1", - "lightningcss-linux-x64-musl": "1.30.1", - "lightningcss-win32-arm64-msvc": "1.30.1", - "lightningcss-win32-x64-msvc": "1.30.1" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.30.1", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/load-json-file": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "license": "MIT" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "license": "MIT" - }, - "node_modules/lodash.chunk": { - "version": "4.2.0", - "license": "MIT" - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "license": "MIT" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "license": "MIT" - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "license": "MIT" - }, - "node_modules/lodash.memoize": { - "version": "3.0.4", - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.snakecase": { - "version": "4.1.1", - "license": "MIT" - }, - "node_modules/long": { - "version": "4.0.0", - "license": "Apache-2.0" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lowercase-keys": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/macos-release": { - "version": "2.5.1", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/magic-bytes.js": { - "version": "1.12.1", - "license": "MIT" - }, - "node_modules/magic-string": { - "version": "0.25.1", - "license": "MIT", - "dependencies": { - "sourcemap-codec": "^1.4.1" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "devOptional": true, - "license": "ISC" - }, - "node_modules/manage-path": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/map-age-cleaner": { - "version": "0.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "p-defer": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/map-stream": { - "version": "0.1.0", - "dev": true - }, - "node_modules/marked": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 16" - } - }, - "node_modules/matcher": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/matcher/node_modules/escape-string-regexp": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/md5-hex": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "blueimp-md5": "^2.10.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/md5.js": { - "version": "1.3.5", - "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mem": { - "version": "9.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "map-age-cleaner": "^0.1.3", - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sindresorhus/mem?sponsor=1" - } - }, - "node_modules/mem/node_modules/mimic-fn": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-source-map": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "source-map": "^0.5.6" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.0", - "license": "MIT" - }, - "node_modules/mime": { - "version": "1.6.0", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/minify-stream": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "concat-stream": "^2.0.0", - "convert-source-map": "^1.5.0", - "duplexify": "^4.1.1", - "from2-string": "^1.1.0", - "terser": "^4.7.0", - "xtend": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/minify-stream/node_modules/convert-source-map": { - "version": "1.9.0", - "license": "MIT" - }, - "node_modules/minify-stream/node_modules/source-map": { - "version": "0.6.1", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/minify-stream/node_modules/terser": { - "version": "4.8.1", - "license": "BSD-2-Clause", - "dependencies": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "license": "ISC" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "license": "MIT" - }, - "node_modules/minimatch": { - "version": "3.1.2", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minizlib": { - "version": "3.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^7.1.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "license": "MIT" - }, - "node_modules/ml-array-max": { - "version": "1.2.4", - "license": "MIT", - "dependencies": { - "is-any-array": "^2.0.0" - } - }, - "node_modules/ml-array-min": { - "version": "1.2.3", - "license": "MIT", - "dependencies": { - "is-any-array": "^2.0.0" - } - }, - "node_modules/ml-array-rescale": { - "version": "1.3.7", - "license": "MIT", - "dependencies": { - "is-any-array": "^2.0.0", - "ml-array-max": "^1.2.4", - "ml-array-min": "^1.2.3" - } - }, - "node_modules/ml-distance-euclidean": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/ml-kmeans": { - "version": "4.2.1", - "license": "MIT", - "dependencies": { - "ml-distance-euclidean": "^2.0.0", - "ml-matrix": "^5.1.1", - "ml-nearest-vector": "^2.0.1", - "ml-random": "^0.5.0" - } - }, - "node_modules/ml-matrix": { - "version": "5.3.0", - "license": "MIT", - "dependencies": { - "ml-array-max": "^1.1.1", - "ml-array-rescale": "^1.2.1" - } - }, - "node_modules/ml-nearest-vector": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "ml-distance-euclidean": "^2.0.0" - } - }, - "node_modules/ml-random": { - "version": "0.5.0", - "license": "MIT", - "dependencies": { - "ml-xsadd": "^2.0.0" - } - }, - "node_modules/ml-xsadd": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/module-deps": { - "version": "6.2.3", - "license": "MIT", - "dependencies": { - "browser-resolve": "^2.0.0", - "cached-path-relative": "^1.0.2", - "concat-stream": "~1.6.0", - "defined": "^1.0.0", - "detective": "^5.2.0", - "duplexer2": "^0.1.2", - "inherits": "^2.0.1", - "JSONStream": "^1.0.3", - "parents": "^1.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.4.0", - "stream-combiner2": "^1.1.1", - "subarg": "^1.0.0", - "through2": "^2.0.0", - "xtend": "^4.0.0" - }, - "bin": { - "module-deps": "bin/cmd.js" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/module-deps/node_modules/concat-stream": { - "version": "1.6.2", - "engines": [ - "node >= 0.8" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/moment": { - "version": "2.30.1", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/moment-timezone": { - "version": "0.5.44", - "license": "MIT", - "dependencies": { - "moment": "^2.29.4" - }, - "engines": { - "node": "*" - } - }, - "node_modules/morphdom": { - "version": "2.7.2", - "license": "MIT" - }, - "node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/muggle-string": { - "version": "0.4.1", - "dev": true, - "license": "MIT" - }, - "node_modules/multer": { - "version": "1.4.5-lts.1", - "license": "MIT", - "dependencies": { - "append-field": "^1.0.0", - "busboy": "^1.0.0", - "concat-stream": "^1.5.2", - "mkdirp": "^0.5.4", - "object-assign": "^4.1.1", - "type-is": "^1.6.4", - "xtend": "^4.0.0" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/multer/node_modules/concat-stream": { - "version": "1.6.2", - "engines": [ - "node >= 0.8" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/multer/node_modules/mkdirp": { - "version": "0.5.6", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/multistream": { - "version": "2.1.1", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.5" - } - }, - "node_modules/mute-stream": { - "version": "0.0.7", - "license": "ISC" - }, - "node_modules/mutexify": { - "version": "1.4.0", - "license": "MIT", - "dependencies": { - "queue-tick": "^1.0.0" - } - }, - "node_modules/mysql2": { - "version": "3.9.8", - "license": "MIT", - "dependencies": { - "denque": "^2.1.0", - "generate-function": "^2.3.1", - "iconv-lite": "^0.6.3", - "long": "^5.2.1", - "lru-cache": "^8.0.0", - "named-placeholders": "^1.1.3", - "seq-queue": "^0.0.5", - "sqlstring": "^2.3.2" - }, - "engines": { - "node": ">= 8.0" - } - }, - "node_modules/mysql2/node_modules/iconv-lite": { - "version": "0.6.3", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mysql2/node_modules/long": { - "version": "5.2.3", - "license": "Apache-2.0" - }, - "node_modules/mysql2/node_modules/lru-cache": { - "version": "8.0.5", - "license": "ISC", - "engines": { - "node": ">=16.14" - } - }, - "node_modules/mz": { - "version": "2.7.0", - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/named-placeholders": { - "version": "1.1.3", - "license": "MIT", - "dependencies": { - "lru-cache": "^7.14.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/named-placeholders/node_modules/lru-cache": { - "version": "7.18.3", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/nanoassert": { - "version": "1.1.0", - "license": "ISC" - }, - "node_modules/nanobench": { - "version": "2.1.1", - "license": "MIT", - "dependencies": { - "browser-process-hrtime": "^0.1.2", - "chalk": "^1.1.3", - "mutexify": "^1.1.0", - "pretty-hrtime": "^1.0.2" - }, - "bin": { - "nanobench": "run.js", - "nanobench-compare": "compare.js" - } - }, - "node_modules/nanobench/node_modules/ansi-regex": { - "version": "2.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanobench/node_modules/ansi-styles": { - "version": "2.2.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanobench/node_modules/chalk": { - "version": "1.1.3", - "license": "MIT", - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanobench/node_modules/escape-string-regexp": { - "version": "1.0.5", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/nanobench/node_modules/strip-ansi": { - "version": "3.0.1", - "license": "MIT", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanobench/node_modules/supports-color": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/nanohtml": { - "version": "1.10.0", - "license": "MIT", - "dependencies": { - "acorn-node": "^1.8.2", - "camel-case": "^3.0.0", - "convert-source-map": "^1.5.1", - "estree-is-member-expression": "^1.0.0", - "hyperx": "^2.5.0", - "is-boolean-attribute": "0.0.1", - "nanoassert": "^1.1.0", - "nanobench": "^2.1.0", - "normalize-html-whitespace": "^0.2.0", - "through2": "^2.0.3", - "transform-ast": "^2.4.0" - } - }, - "node_modules/nanohtml/node_modules/camel-case": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, - "node_modules/nanohtml/node_modules/convert-source-map": { - "version": "1.9.0", - "license": "MIT" - }, - "node_modules/nanohtml/node_modules/lower-case": { - "version": "1.1.4", - "license": "MIT" - }, - "node_modules/nanohtml/node_modules/no-case": { - "version": "2.3.2", - "license": "MIT", - "dependencies": { - "lower-case": "^1.1.1" - } - }, - "node_modules/nanoid": { - "version": "3.3.11", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ndarray": { - "version": "1.0.19", - "license": "MIT", - "dependencies": { - "iota-array": "^1.0.0", - "is-buffer": "^1.0.2" - } - }, - "node_modules/ndarray-blas-level1": { - "version": "1.1.3", - "license": "MIT" - }, - "node_modules/ndarray-cholesky-factorization": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "ndarray": "^1.0.16", - "ndarray-blas-level1": "^1.0.2", - "ndarray-scratch": "^1.1.1" - } - }, - "node_modules/ndarray-crout-decomposition": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/ndarray-determinant": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "ndarray-crout-decomposition": "^1.1.0", - "ndarray-diagonal": "^1.0.0", - "ndarray-ops": "^1.2.2", - "ndarray-scratch": "^1.1.1" - } - }, - "node_modules/ndarray-diagonal": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "ndarray": "^1.0.15" - } - }, - "node_modules/ndarray-inv": { - "version": "0.2.0", - "license": "MIT", - "dependencies": { - "ndarray": "^1.0.18", - "ndarray-scratch": "^1.2.0" - } - }, - "node_modules/ndarray-ops": { - "version": "1.2.2", - "license": "MIT", - "dependencies": { - "cwise-compiler": "^1.0.0" - } - }, - "node_modules/ndarray-scratch": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "ndarray": "^1.0.14", - "ndarray-ops": "^1.2.1", - "typedarray-pool": "^1.0.2" - } - }, - "node_modules/negotiator": { - "version": "0.6.3", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/next-tick": { - "version": "1.1.0", - "license": "ISC" - }, - "node_modules/node-cleanup": { - "version": "2.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/node-fetch": { - "version": "2.6.13", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-gyp-build": { - "version": "4.8.0", - "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/nofilter": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.19" - } - }, - "node_modules/normalize-html-whitespace": { - "version": "0.2.0", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/oauth": { - "version": "0.10.0", - "license": "MIT" - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/observable-fns": { - "version": "0.6.1", - "license": "MIT" - }, - "node_modules/on-exit-leak-free": { - "version": "2.1.2", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-net-listen": { - "version": "1.1.2", - "license": "MIT", - "engines": { - "node": ">=9.4.0 || ^8.9.4" - } - }, - "node_modules/once": { - "version": "1.4.0", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "mimic-fn": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/open": { - "version": "7.4.2", - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/opn": { - "version": "5.5.0", - "license": "MIT", - "dependencies": { - "is-wsl": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/opn/node_modules/is-wsl": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ora": { - "version": "5.4.1", - "license": "MIT", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/cli-cursor": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ora/node_modules/log-symbols": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/mimic-fn": { - "version": "2.1.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/ora/node_modules/onetime": { - "version": "5.1.2", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/restore-cursor": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/os-browserify": { - "version": "0.3.0", - "license": "MIT" - }, - "node_modules/os-name": { - "version": "4.0.1", - "license": "MIT", - "dependencies": { - "macos-release": "^2.5.0", - "windows-release": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-cancelable": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/p-defer": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/p-event": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "p-timeout": "^5.0.2" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-timeout": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json": { - "version": "6.5.0", - "license": "MIT", - "dependencies": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "license": "(MIT AND Zlib)" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parents": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "path-platform": "~0.11.15" - } - }, - "node_modules/parse-asn1": { - "version": "5.1.6", - "license": "ISC", - "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/parse-color": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "color-convert": "~0.5.0" - } - }, - "node_modules/parse-color/node_modules/color-convert": { - "version": "0.5.3" - }, - "node_modules/parse-ms": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "license": "MIT", - "dependencies": { - "parse5": "^6.0.1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { - "version": "6.0.1", - "license": "MIT" - }, - "node_modules/parseurl": { - "version": "1.3.3", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/passport": { - "version": "0.6.0", - "license": "MIT", - "dependencies": { - "passport-strategy": "1.x.x", - "pause": "0.0.1", - "utils-merge": "^1.0.1" - }, - "engines": { - "node": ">= 0.4.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/jaredhanson" - } - }, - "node_modules/passport-custom": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "passport-strategy": "1.x.x" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/passport-oauth2": { - "version": "1.8.0", - "license": "MIT", - "dependencies": { - "base64url": "3.x.x", - "oauth": "0.10.x", - "passport-strategy": "1.x.x", - "uid2": "0.0.x", - "utils-merge": "1.x.x" - }, - "engines": { - "node": ">= 0.4.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/jaredhanson" - } - }, - "node_modules/passport-strategy": { - "version": "1.0.0", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "license": "MIT" - }, - "node_modules/path-exists": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "license": "MIT" - }, - "node_modules/path-platform": { - "version": "0.11.15", - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/path-scurry": { - "version": "1.10.1", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.0", - "license": "ISC", - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.12", - "license": "MIT" - }, - "node_modules/path-type": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/pause": { - "version": "0.0.1" - }, - "node_modules/pause-stream": { - "version": "0.0.11", - "dev": true, - "license": [ - "MIT", - "Apache2" - ], - "dependencies": { - "through": "~2.3" - } - }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "license": "MIT", - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/performance-now": { - "version": "2.1.0", - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pino": { - "version": "8.19.0", - "license": "MIT", - "dependencies": { - "atomic-sleep": "^1.0.0", - "fast-redact": "^3.1.1", - "on-exit-leak-free": "^2.1.0", - "pino-abstract-transport": "v1.1.0", - "pino-std-serializers": "^6.0.0", - "process-warning": "^3.0.0", - "quick-format-unescaped": "^4.0.3", - "real-require": "^0.2.0", - "safe-stable-stringify": "^2.3.1", - "sonic-boom": "^3.7.0", - "thread-stream": "^2.0.0" - }, - "bin": { - "pino": "bin.js" - } - }, - "node_modules/pino-abstract-transport": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "readable-stream": "^4.0.0", - "split2": "^4.0.0" - } - }, - "node_modules/pino-abstract-transport/node_modules/buffer": { - "version": "6.0.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/pino-abstract-transport/node_modules/readable-stream": { - "version": "4.5.2", - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/pino-std-serializers": { - "version": "6.2.2", - "license": "MIT" - }, - "node_modules/pino/node_modules/sonic-boom": { - "version": "3.8.0", - "license": "MIT", - "dependencies": { - "atomic-sleep": "^1.0.0" - } - }, - "node_modules/pkg-conf": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^6.0.0", - "load-json-file": "^7.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-conf/node_modules/find-up": { - "version": "6.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-conf/node_modules/locate-path": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-conf/node_modules/p-limit": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-conf/node_modules/p-locate": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-conf/node_modules/path-exists": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/pkg-conf/node_modules/yocto-queue": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-up": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/plur": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "irregular-plurals": "^3.3.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/postcss": { - "version": "8.5.4", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-nesting": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.1.tgz", - "integrity": "sha512-VbqqHkOBOt4Uu3G8Dm8n6lU5+9cJFxiuty9+4rcoyRPO9zZS1JIs6td49VIoix3qYqELHlJIn46Oih9SAKo+yQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/selector-resolve-nested": "^3.0.0", - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "license": "MIT" - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prepend-http": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/prettier": { - "version": "2.8.8", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-plugin-organize-imports": { - "version": "3.2.2", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@volar/vue-language-plugin-pug": "^1.0.4", - "@volar/vue-typescript": "^1.0.4", - "prettier": ">=2.0", - "typescript": ">=2.9" - }, - "peerDependenciesMeta": { - "@volar/vue-language-plugin-pug": { - "optional": true - }, - "@volar/vue-typescript": { - "optional": true - } - } - }, - "node_modules/pretty-bytes": { - "version": "5.6.0", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pretty-format": { - "version": "24.9.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pretty-format/node_modules/ansi-regex": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pretty-format/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/pretty-format/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/pretty-hrtime": { - "version": "1.0.3", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pretty-ms": { - "version": "8.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "parse-ms": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/process": { - "version": "0.11.10", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "license": "MIT" - }, - "node_modules/process-warning": { - "version": "3.0.0", - "license": "MIT" - }, - "node_modules/progress": { - "version": "2.0.3", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/protocol-buffers": { - "version": "4.2.0", - "license": "MIT", - "dependencies": { - "generate-function": "^2.0.0", - "generate-object-property": "^1.2.0", - "protocol-buffers-encodings": "^1.1.0", - "protocol-buffers-schema": "^3.1.1", - "signed-varint": "^2.0.0", - "varint": "^5.0.0" - }, - "bin": { - "protocol-buffers": "bin.js" - } - }, - "node_modules/protocol-buffers-encodings": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "b4a": "^1.6.0", - "signed-varint": "^2.0.1", - "varint": "5.0.0" - } - }, - "node_modules/protocol-buffers-encodings/node_modules/varint": { - "version": "5.0.0", - "license": "MIT" - }, - "node_modules/protocol-buffers-schema": { - "version": "3.6.0", - "license": "MIT" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/ps-tree": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "event-stream": "=3.3.4" - }, - "bin": { - "ps-tree": "bin/ps-tree.js" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/psl": { - "version": "1.9.0", - "license": "MIT" - }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.0", - "license": "MIT" - }, - "node_modules/pump": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/pumpify": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "duplexify": "^4.1.1", - "inherits": "^2.0.3", - "pump": "^3.0.0" - } - }, - "node_modules/punycode": { - "version": "2.3.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pupa": { - "version": "2.1.1", - "license": "MIT", - "dependencies": { - "escape-goat": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/qs": { - "version": "6.13.0", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/querystring-es3": { - "version": "0.2.1", - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "license": "MIT" - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/queue-tick": { - "version": "1.0.1", - "license": "MIT" - }, - "node_modules/quick-format-unescaped": { - "version": "4.0.4", - "license": "MIT" - }, - "node_modules/quote-stream": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "buffer-equal": "0.0.1", - "minimist": "^1.1.3", - "through2": "^2.0.0" - }, - "bin": { - "quote-stream": "bin/cmd.js" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/randomfill": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "dev": true, - "license": "MIT" - }, - "node_modules/read-cache": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/read-only-stream": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/readable-stream": { - "version": "2.3.8", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "license": "MIT" - }, - "node_modules/readable-stream/node_modules/string_decoder": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/real-require": { - "version": "0.2.0", - "license": "MIT", - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/reflect-metadata": { - "version": "0.1.14", - "license": "Apache-2.0" - }, - "node_modules/regexp-tree": { - "version": "0.1.27", - "license": "MIT", - "bin": { - "regexp-tree": "bin/regexp-tree" - } - }, - "node_modules/regexp-worker": { - "version": "1.1.1", - "license": "MIT", - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/registry-auth-token": { - "version": "4.2.2", - "license": "MIT", - "dependencies": { - "rc": "1.2.8" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/registry-url": { - "version": "5.1.0", - "license": "MIT", - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/reinterval": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/request": { - "version": "2.88.2", - "license": "Apache-2.0", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/request/node_modules/qs": { - "version": "6.5.3", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/request/node_modules/tough-cookie": { - "version": "2.5.0", - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "license": "MIT", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "license": "ISC" - }, - "node_modules/requires-port": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/resize-observer-polyfill": { - "version": "1.5.1", - "dev": true, - "license": "MIT" - }, - "node_modules/resolve": { - "version": "1.22.2", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/responselike": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "lowercase-keys": "^1.0.0" - } - }, - "node_modules/restore-cursor": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ret": { - "version": "0.2.2", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/retimer": { - "version": "3.0.0", - "license": "MIT" - }, - "node_modules/reusify": { - "version": "1.0.4", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rfdc": { - "version": "1.3.1", - "license": "MIT" - }, - "node_modules/rimraf": { - "version": "3.0.2", - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ripemd160": { - "version": "2.0.2", - "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/rolldown": { - "version": "1.0.0-beta.10-commit.2c4c2a8", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-beta.10-commit.2c4c2a8.tgz", - "integrity": "sha512-LgDyMT17kXkcYMLWLsA+7jHIqUEi2p3+y2hQocGkfFEKP+4Kk9rgCApZ3qWI7tT/a2eq4n3bnfJoF0heGXk2LQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@oxc-project/runtime": "0.72.1", - "@oxc-project/types": "0.72.1", - "@rolldown/pluginutils": "1.0.0-beta.10-commit.2c4c2a8", - "ansis": "^4.0.0" - }, - "bin": { - "rolldown": "bin/cli.mjs" - }, - "optionalDependencies": { - "@rolldown/binding-darwin-arm64": "1.0.0-beta.10-commit.2c4c2a8", - "@rolldown/binding-darwin-x64": "1.0.0-beta.10-commit.2c4c2a8", - "@rolldown/binding-freebsd-x64": "1.0.0-beta.10-commit.2c4c2a8", - "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.10-commit.2c4c2a8", - "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.10-commit.2c4c2a8", - "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.10-commit.2c4c2a8", - "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.10-commit.2c4c2a8", - "@rolldown/binding-linux-x64-musl": "1.0.0-beta.10-commit.2c4c2a8", - "@rolldown/binding-wasm32-wasi": "1.0.0-beta.10-commit.2c4c2a8", - "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.10-commit.2c4c2a8", - "@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.10-commit.2c4c2a8", - "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.10-commit.2c4c2a8" - } - }, - "node_modules/rollup": { - "version": "4.41.1", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/estree": "1.0.7" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.41.1", - "@rollup/rollup-android-arm64": "4.41.1", - "@rollup/rollup-darwin-arm64": "4.41.1", - "@rollup/rollup-darwin-x64": "4.41.1", - "@rollup/rollup-freebsd-arm64": "4.41.1", - "@rollup/rollup-freebsd-x64": "4.41.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.41.1", - "@rollup/rollup-linux-arm-musleabihf": "4.41.1", - "@rollup/rollup-linux-arm64-gnu": "4.41.1", - "@rollup/rollup-linux-arm64-musl": "4.41.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.41.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.41.1", - "@rollup/rollup-linux-riscv64-gnu": "4.41.1", - "@rollup/rollup-linux-riscv64-musl": "4.41.1", - "@rollup/rollup-linux-s390x-gnu": "4.41.1", - "@rollup/rollup-linux-x64-gnu": "4.41.1", - "@rollup/rollup-linux-x64-musl": "4.41.1", - "@rollup/rollup-win32-arm64-msvc": "4.41.1", - "@rollup/rollup-win32-ia32-msvc": "4.41.1", - "@rollup/rollup-win32-x64-msvc": "4.41.1", - "fsevents": "~2.3.2" - } - }, - "node_modules/run-async": { - "version": "2.4.1", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "6.6.7", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safe-regex": { - "version": "2.1.1", - "license": "MIT", - "dependencies": { - "regexp-tree": "~0.1.1" - } - }, - "node_modules/safe-regex2": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "ret": "~0.2.0" - } - }, - "node_modules/safe-stable-stringify": { - "version": "2.4.3", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/scope-analyzer": { - "version": "2.1.2", - "license": "Apache-2.0", - "dependencies": { - "array-from": "^2.1.1", - "dash-ast": "^2.0.1", - "es6-map": "^0.1.5", - "es6-set": "^0.1.5", - "es6-symbol": "^3.1.1", - "estree-is-function": "^1.0.0", - "get-assigned-identifiers": "^1.1.0" - } - }, - "node_modules/secure-json-parse": { - "version": "2.7.0", - "license": "BSD-3-Clause" - }, - "node_modules/seedrandom": { - "version": "3.0.5", - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.5.4", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-diff": { - "version": "3.1.1", - "license": "MIT", - "dependencies": { - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/semver-diff/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/send": { - "version": "0.19.0", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "license": "MIT" - }, - "node_modules/seq-queue": { - "version": "0.0.5" - }, - "node_modules/serialize-error": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.13.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/serialize-error/node_modules/type-fest": { - "version": "0.13.1", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/serve-static": { - "version": "1.16.2", - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "license": "ISC" - }, - "node_modules/set-cookie-parser": { - "version": "2.6.0", - "license": "MIT" - }, - "node_modules/set-function-length": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.1", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.2", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "license": "ISC" - }, - "node_modules/sha.js": { - "version": "2.4.11", - "license": "(MIT AND BSD-3-Clause)", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, - "node_modules/shallow-copy": { - "version": "0.0.1", - "license": "MIT" - }, - "node_modules/shasum-object": { - "version": "1.0.0", - "license": "Apache-2.0", - "dependencies": { - "fast-safe-stringify": "^2.0.7" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.1", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/showdown": { - "version": "1.9.1", - "license": "BSD-3-Clause", - "dependencies": { - "yargs": "^14.2" - }, - "bin": { - "showdown": "bin/showdown.js" - } - }, - "node_modules/showdown/node_modules/ansi-regex": { - "version": "4.1.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/showdown/node_modules/ansi-styles": { - "version": "3.2.1", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/showdown/node_modules/camelcase": { - "version": "5.3.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/showdown/node_modules/cliui": { - "version": "5.0.0", - "license": "ISC", - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/showdown/node_modules/color-convert": { - "version": "1.9.3", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/showdown/node_modules/color-name": { - "version": "1.1.3", - "license": "MIT" - }, - "node_modules/showdown/node_modules/emoji-regex": { - "version": "7.0.3", - "license": "MIT" - }, - "node_modules/showdown/node_modules/find-up": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/showdown/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/showdown/node_modules/locate-path": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/showdown/node_modules/p-limit": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/showdown/node_modules/p-locate": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/showdown/node_modules/path-exists": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/showdown/node_modules/string-width": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/showdown/node_modules/strip-ansi": { - "version": "5.2.0", - "license": "MIT", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/showdown/node_modules/wrap-ansi": { - "version": "5.1.0", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/showdown/node_modules/y18n": { - "version": "4.0.3", - "license": "ISC" - }, - "node_modules/showdown/node_modules/yargs": { - "version": "14.2.3", - "license": "MIT", - "dependencies": { - "cliui": "^5.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^15.0.1" - } - }, - "node_modules/showdown/node_modules/yargs-parser": { - "version": "15.0.3", - "license": "ISC", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "license": "ISC" - }, - "node_modules/signed-varint": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "varint": "~5.0.0" - } - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/single-line-log": { - "version": "1.1.2", - "license": "MIT", - "dependencies": { - "string-width": "^1.0.1" - } - }, - "node_modules/sinusoidal-decimal": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/slash": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/sonic-boom": { - "version": "1.4.1", - "license": "MIT", - "dependencies": { - "atomic-sleep": "^1.0.0", - "flatstr": "^1.0.12" - } - }, - "node_modules/source-map": { - "version": "0.5.7", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "license": "MIT" - }, - "node_modules/split": { - "version": "0.3.3", - "dev": true, - "license": "MIT", - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/split2": { - "version": "4.2.0", - "license": "ISC", - "engines": { - "node": ">= 10.x" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "license": "BSD-3-Clause" - }, - "node_modules/sqlstring": { - "version": "2.3.3", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/sshpk": { - "version": "1.18.0", - "license": "MIT", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/static-eval": { - "version": "2.1.1", - "license": "MIT", - "dependencies": { - "escodegen": "^2.1.0" - } - }, - "node_modules/static-eval/node_modules/escodegen": { - "version": "2.1.0", - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/static-eval/node_modules/estraverse": { - "version": "5.3.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/static-eval/node_modules/source-map": { - "version": "0.6.1", - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-module": { - "version": "3.0.4", - "license": "MIT", - "dependencies": { - "acorn-node": "^1.3.0", - "concat-stream": "~1.6.0", - "convert-source-map": "^1.5.1", - "duplexer2": "~0.1.4", - "escodegen": "^1.11.1", - "has": "^1.0.1", - "magic-string": "0.25.1", - "merge-source-map": "1.0.4", - "object-inspect": "^1.6.0", - "readable-stream": "~2.3.3", - "scope-analyzer": "^2.0.1", - "shallow-copy": "~0.0.1", - "static-eval": "^2.0.5", - "through2": "~2.0.3" - } - }, - "node_modules/static-module/node_modules/concat-stream": { - "version": "1.6.2", - "engines": [ - "node >= 0.8" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/static-module/node_modules/convert-source-map": { - "version": "1.9.0", - "license": "MIT" - }, - "node_modules/statuses": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/stream-browserify": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, - "node_modules/stream-browserify/node_modules/readable-stream": { - "version": "3.6.2", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/stream-collector": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "once": "^1.3.1" - } - }, - "node_modules/stream-combiner": { - "version": "0.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "duplexer": "~0.1.1" - } - }, - "node_modules/stream-combiner2": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, - "node_modules/stream-http": { - "version": "3.2.0", - "license": "MIT", - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "xtend": "^4.0.2" - } - }, - "node_modules/stream-http/node_modules/readable-stream": { - "version": "3.6.2", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/stream-shift": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/stream-splicer": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" - } - }, - "node_modules/stream-template": { - "version": "0.0.10", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.4.1", - "readable-stream": "^2.3.6" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/streaming-json-stringify": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "json-stringify-safe": "5", - "readable-stream": "2" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-argv": { - "version": "0.3.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.19" - } - }, - "node_modules/string-width": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "2.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "3.0.1", - "license": "MIT", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-combining-marks": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/subarg": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "minimist": "^1.1.0" - } - }, - "node_modules/summary": { - "version": "2.1.0", - "license": "MIT" - }, - "node_modules/supertap": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "indent-string": "^5.0.0", - "js-yaml": "^3.14.1", - "serialize-error": "^7.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/supertap/node_modules/ansi-regex": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/supertap/node_modules/argparse": { - "version": "1.0.10", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/supertap/node_modules/indent-string": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supertap/node_modules/js-yaml": { - "version": "3.14.1", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/supertap/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/syntax-error": { - "version": "1.4.0", - "license": "MIT", - "dependencies": { - "acorn-node": "^1.2.0" - } - }, - "node_modules/tachyons": { - "version": "4.12.0", - "license": "MIT" - }, - "node_modules/tailwindcss": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.8.tgz", - "integrity": "sha512-kjeW8gjdxasbmFKpVGrGd5T4i40mV5J2Rasw48QARfYeQ8YS9x02ON9SFWax3Qf616rt4Cp3nVNIj6Hd1mP3og==", - "dev": true, - "license": "MIT" - }, - "node_modules/tapable": { - "version": "2.2.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/tar": { - "version": "7.4.3", - "dev": true, - "license": "ISC", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/tar/node_modules/mkdirp": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "5.0.0", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/temp-dir": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/thenify": { - "version": "3.3.1", - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/thread-stream": { - "version": "2.4.1", - "license": "MIT", - "dependencies": { - "real-require": "^0.2.0" - } - }, - "node_modules/threads": { - "version": "1.7.0", - "license": "MIT", - "dependencies": { - "callsites": "^3.1.0", - "debug": "^4.2.0", - "is-observable": "^2.1.0", - "observable-fns": "^0.6.1" - }, - "funding": { - "url": "https://github.com/andywer/threads.js?sponsor=1" - }, - "optionalDependencies": { - "tiny-worker": ">= 2" - } - }, - "node_modules/threads/node_modules/is-observable": { - "version": "2.1.0", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/through": { - "version": "2.3.8", - "license": "MIT" - }, - "node_modules/through2": { - "version": "2.0.5", - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/time-zone": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/timers-browserify": { - "version": "1.4.2", - "dependencies": { - "process": "~0.11.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/timestring": { - "version": "6.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/tiny-worker": { - "version": "2.3.0", - "license": "BSD-3-Clause", - "optional": true, - "dependencies": { - "esm": "^3.2.25" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.14", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.5", - "dev": true, - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/tlds": { - "version": "1.249.0", - "license": "MIT", - "bin": { - "tlds": "bin.js" - } - }, - "node_modules/tmp": { - "version": "0.0.33", - "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-readable-stream": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toad-cache": { - "version": "3.7.0", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/toggle-selection": { - "version": "1.0.6", - "license": "MIT" - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tough-cookie": { - "version": "4.1.3", - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.2.0", - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "license": "MIT" - }, - "node_modules/transform-ast": { - "version": "2.4.4", - "license": "MIT", - "dependencies": { - "acorn-node": "^1.3.0", - "convert-source-map": "^1.5.1", - "dash-ast": "^1.0.0", - "is-buffer": "^2.0.0", - "magic-string": "^0.23.2", - "merge-source-map": "1.0.4", - "nanobench": "^2.1.1" - } - }, - "node_modules/transform-ast/node_modules/convert-source-map": { - "version": "1.9.0", - "license": "MIT" - }, - "node_modules/transform-ast/node_modules/dash-ast": { - "version": "1.0.0", - "license": "Apache-2.0" - }, - "node_modules/transform-ast/node_modules/is-buffer": { - "version": "2.0.5", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/transform-ast/node_modules/magic-string": { - "version": "0.23.2", - "license": "MIT", - "dependencies": { - "sourcemap-codec": "^1.4.1" - } - }, - "node_modules/ts-essentials": { - "version": "10.0.4", - "license": "MIT", - "peerDependencies": { - "typescript": ">=4.5.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/ts-mixer": { - "version": "6.0.4", - "license": "MIT" - }, - "node_modules/ts-node": { - "version": "10.9.2", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-toolbelt": { - "version": "9.6.0", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/tsc-watch": { - "version": "6.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "node-cleanup": "^2.1.2", - "ps-tree": "^1.2.0", - "string-argv": "^0.3.1" - }, - "bin": { - "tsc-watch": "dist/lib/tsc-watch.js" - }, - "engines": { - "node": ">=12.12.0" - }, - "peerDependencies": { - "typescript": "*" - } - }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "license": "MIT", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tslib": { - "version": "1.14.1", - "license": "0BSD" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/ttest": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "distributions": "^2.1.0", - "summary": "^2.0.0" - } - }, - "node_modules/tty-browserify": { - "version": "0.0.1", - "license": "MIT" - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/turbo-json-parse": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "generate-function": "^2.3.1" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "license": "Unlicense" - }, - "node_modules/twemoji": { - "version": "12.1.6", - "license": [ - "MIT", - "CC-BY-4.0" - ], - "dependencies": { - "fs-extra": "^8.0.1", - "jsonfile": "^5.0.0", - "twemoji-parser": "12.1.3", - "universalify": "^0.1.2" - } - }, - "node_modules/twemoji-parser": { - "version": "12.1.3", - "license": "MIT" - }, - "node_modules/twemoji/node_modules/fs-extra": { - "version": "8.1.0", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/twemoji/node_modules/fs-extra/node_modules/jsonfile": { - "version": "4.0.0", - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/twemoji/node_modules/jsonfile": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "universalify": "^0.1.2" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/twemoji/node_modules/universalify": { - "version": "0.1.2", - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/type": { - "version": "1.2.0", - "license": "ISC" - }, - "node_modules/type-check": { - "version": "0.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-component": { - "version": "0.0.1" - }, - "node_modules/type-fest": { - "version": "0.20.2", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "license": "MIT" - }, - "node_modules/typedarray-pool": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "bit-twiddle": "^1.0.0", - "dup": "^1.0.0" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "license": "MIT", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typeorm": { - "version": "0.3.20", - "license": "MIT", - "dependencies": { - "@sqltools/formatter": "^1.2.5", - "app-root-path": "^3.1.0", - "buffer": "^6.0.3", - "chalk": "^4.1.2", - "cli-highlight": "^2.1.11", - "dayjs": "^1.11.9", - "debug": "^4.3.4", - "dotenv": "^16.0.3", - "glob": "^10.3.10", - "mkdirp": "^2.1.3", - "reflect-metadata": "^0.2.1", - "sha.js": "^2.4.11", - "tslib": "^2.5.0", - "uuid": "^9.0.0", - "yargs": "^17.6.2" - }, - "bin": { - "typeorm": "cli.js", - "typeorm-ts-node-commonjs": "cli-ts-node-commonjs.js", - "typeorm-ts-node-esm": "cli-ts-node-esm.js" - }, - "engines": { - "node": ">=16.13.0" - }, - "funding": { - "url": "https://opencollective.com/typeorm" - }, - "peerDependencies": { - "@google-cloud/spanner": "^5.18.0", - "@sap/hana-client": "^2.12.25", - "better-sqlite3": "^7.1.2 || ^8.0.0 || ^9.0.0", - "hdb-pool": "^0.1.6", - "ioredis": "^5.0.4", - "mongodb": "^5.8.0", - "mssql": "^9.1.1 || ^10.0.1", - "mysql2": "^2.2.5 || ^3.0.1", - "oracledb": "^6.3.0", - "pg": "^8.5.1", - "pg-native": "^3.0.0", - "pg-query-stream": "^4.0.0", - "redis": "^3.1.1 || ^4.0.0", - "sql.js": "^1.4.0", - "sqlite3": "^5.0.3", - "ts-node": "^10.7.0", - "typeorm-aurora-data-api-driver": "^2.0.0" - }, - "peerDependenciesMeta": { - "@google-cloud/spanner": { - "optional": true - }, - "@sap/hana-client": { - "optional": true - }, - "better-sqlite3": { - "optional": true - }, - "hdb-pool": { - "optional": true - }, - "ioredis": { - "optional": true - }, - "mongodb": { - "optional": true - }, - "mssql": { - "optional": true - }, - "mysql2": { - "optional": true - }, - "oracledb": { - "optional": true - }, - "pg": { - "optional": true - }, - "pg-native": { - "optional": true - }, - "pg-query-stream": { - "optional": true - }, - "redis": { - "optional": true - }, - "sql.js": { - "optional": true - }, - "sqlite3": { - "optional": true - }, - "ts-node": { - "optional": true - }, - "typeorm-aurora-data-api-driver": { - "optional": true - } - } - }, - "node_modules/typeorm/node_modules/brace-expansion": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/typeorm/node_modules/buffer": { - "version": "6.0.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/typeorm/node_modules/glob": { - "version": "10.3.10", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/typeorm/node_modules/minimatch": { - "version": "9.0.3", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/typeorm/node_modules/mkdirp": { - "version": "2.1.6", - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/typeorm/node_modules/reflect-metadata": { - "version": "0.2.1", - "license": "Apache-2.0" - }, - "node_modules/typeorm/node_modules/tslib": { - "version": "2.6.2", - "license": "0BSD" - }, - "node_modules/typescript": { - "version": "5.8.3", - "devOptional": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/uid2": { - "version": "0.0.4", - "license": "MIT" - }, - "node_modules/umd": { - "version": "3.0.3", - "license": "MIT", - "bin": { - "umd": "bin/cli.js" - } - }, - "node_modules/undeclared-identifiers": { - "version": "1.1.3", - "license": "Apache-2.0", - "dependencies": { - "acorn-node": "^1.3.0", - "dash-ast": "^1.0.0", - "get-assigned-identifiers": "^1.2.0", - "simple-concat": "^1.0.0", - "xtend": "^4.0.1" - }, - "bin": { - "undeclared-identifiers": "bin.js" - } - }, - "node_modules/undeclared-identifiers/node_modules/dash-ast": { - "version": "1.0.0", - "license": "Apache-2.0" - }, - "node_modules/undici": { - "version": "6.21.1", - "license": "MIT", - "engines": { - "node": ">=18.17" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "license": "MIT" - }, - "node_modules/uniq": { - "version": "1.0.1", - "license": "MIT" - }, - "node_modules/unique-string": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-notifier": { - "version": "5.1.0", - "license": "BSD-2-Clause", - "dependencies": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/upper-case": { - "version": "1.1.3", - "license": "MIT" - }, - "node_modules/uri-js": { - "version": "4.4.1", - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url": { - "version": "0.11.3", - "license": "MIT", - "dependencies": { - "punycode": "^1.4.1", - "qs": "^6.11.2" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/url-parse-lax": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "prepend-http": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/url/node_modules/punycode": { - "version": "1.4.1", - "license": "MIT" - }, - "node_modules/utf-8-validate": { - "version": "5.0.10", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, - "node_modules/util": { - "version": "0.12.5", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/util-extend": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "9.0.1", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/uuid-parse": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "devOptional": true, - "license": "MIT" - }, - "node_modules/varint": { - "version": "5.0.2", - "license": "MIT" - }, - "node_modules/vary": { - "version": "1.1.2", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "engines": [ - "node >=0.6.0" - ], - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/verror/node_modules/core-util-is": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/vite": { - "version": "6.3.5", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.4.4", - "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rollup": "^4.34.9", - "tinyglobby": "^0.2.13" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/fdir": { - "version": "6.4.5", - "dev": true, - "license": "MIT", - "peer": true, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/picomatch": { - "version": "4.0.2", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/vm-browserify": { - "version": "1.1.2", - "license": "MIT" - }, - "node_modules/vscode-uri": { - "version": "3.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/vue": { - "version": "3.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.5.16", - "@vue/compiler-sfc": "3.5.16", - "@vue/runtime-dom": "3.5.16", - "@vue/server-renderer": "3.5.16", - "@vue/shared": "3.5.16" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/vue-material-design-icons": { - "version": "5.3.1", - "dev": true, - "license": "MIT" - }, - "node_modules/vue-router": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.1.tgz", - "integrity": "sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/devtools-api": "^6.6.4" - }, - "funding": { - "url": "https://github.com/sponsors/posva" - }, - "peerDependencies": { - "vue": "^3.2.0" - } - }, - "node_modules/vue-tsc": { - "version": "2.2.10", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/typescript": "~2.4.11", - "@vue/language-core": "2.2.10" - }, - "bin": { - "vue-tsc": "bin/vue-tsc.js" - }, - "peerDependencies": { - "typescript": ">=5.0.0" - } - }, - "node_modules/vue3-ace-editor": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/vue3-ace-editor/-/vue3-ace-editor-2.2.4.tgz", - "integrity": "sha512-FZkEyfpbH068BwjhMyNROxfEI8135Sc+x8ouxkMdCNkuj/Tuw83VP/gStFQqZHqljyX9/VfMTCdTqtOnJZGN8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "resize-observer-polyfill": "^1.5.1" - }, - "peerDependencies": { - "ace-builds": "*", - "vue": "^3" - } - }, - "node_modules/vue3-highlightjs": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/vue3-highlightjs/-/vue3-highlightjs-1.0.5.tgz", - "integrity": "sha512-Q4YNPXu0X5VMBnwPVOk+IQf1Ohp9jFdMitEAmzaz8qVVefcQpN6Dx4BnDGKxja3TLDVF+EgL136wC8YzmoCX9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "highlight.js": "^10.3.2" - }, - "peerDependencies": { - "vue": "^3.0.0" - } - }, - "node_modules/vue3-highlightjs/node_modules/highlight.js": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", - "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": "*" - } - }, - "node_modules/vuex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/vuex/-/vuex-4.1.0.tgz", - "integrity": "sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/devtools-api": "^6.0.0-beta.11" - }, - "peerDependencies": { - "vue": "^3.2.0" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/webfontloader": { - "version": "1.6.28", - "license": "Apache-2.0" - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "license": "BSD-2-Clause" - }, - "node_modules/well-known-symbols": { - "version": "2.0.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=6" - } - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-module": { - "version": "2.0.1", - "license": "ISC" - }, - "node_modules/which-typed-array": { - "version": "1.1.14", - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.6", - "call-bind": "^1.0.5", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/widest-line": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/widest-line/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/widest-line/node_modules/string-width": { - "version": "4.2.3", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/windows-release": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "execa": "^4.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/windows-release/node_modules/execa": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/windows-release/node_modules/get-stream": { - "version": "5.2.0", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/windows-release/node_modules/human-signals": { - "version": "1.1.1", - "license": "Apache-2.0", - "engines": { - "node": ">=8.12.0" - } - }, - "node_modules/windows-release/node_modules/is-stream": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/windows-release/node_modules/mimic-fn": { - "version": "2.1.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/windows-release/node_modules/npm-run-path": { - "version": "4.0.1", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/windows-release/node_modules/onetime": { - "version": "5.1.2", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "5.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/write-file-atomic/node_modules/signal-exit": { - "version": "4.1.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ws": { - "version": "8.18.2", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xdg-basedir": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "license": "ISC" - }, - "node_modules/yaml-js": { - "version": "0.2.3", - "license": "WTFPL" - }, - "node_modules/yargs": { - "version": "17.7.2", - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yawn-yaml": { - "version": "1.5.0", - "resolved": "git+ssh://git@github.com/dragory/yawn-yaml.git#77ab3870ca53c4693002c4a41336e7476e7934ed", - "license": "MIT", - "dependencies": { - "js-yaml": "^3.4.2", - "lodash": "^4.17.11", - "yaml-js": "^0.2.3" - } - }, - "node_modules/yawn-yaml/node_modules/argparse": { - "version": "1.0.10", - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/yawn-yaml/node_modules/js-yaml": { - "version": "3.14.1", - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "3.25.17", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zod-to-json-schema": { - "version": "3.22.4", - "dev": true, - "license": "ISC", - "peerDependencies": { - "zod": "^3.22.4" - } - }, - "shared": { - "name": "@zeppelinbot/shared", - "version": "0.0.1", - "devDependencies": { - "ava": "^5.3.1", - "ts-node": "^10.9.1" - } - } - } -} diff --git a/package.json b/package.json index 21a8f2010..682ee9dc2 100644 --- a/package.json +++ b/package.json @@ -7,8 +7,8 @@ "format": "prettier --write \"./backend/src/**/*.{css,html,js,json,ts,tsx}\" \"./dashboard/src/**/*.{css,html,js,json,ts,tsx}\"", "lint": "eslint \"./backend/src/**/*.{js,ts,tsx}\" \"./dashboard/src/**/*.{js,ts,tsx}\"", "codestyle-check": "prettier --check \"./backend/src/**/*.{css,html,js,json,ts,tsx}\" \"./dashboard/src/**/*.{css,html,js,json,ts,tsx}\"", - "start-bot": "cd backend && npm run start-bot-prod", - "start-api": "cd backend && npm run start-api-prod", + "start-bot": "cd backend && pnpm run start-bot-prod", + "start-api": "cd backend && pnpm run start-api-prod", "start-dashboard": "cd dashboard && node serve.js" }, "devDependencies": { @@ -17,18 +17,16 @@ "@typescript-eslint/parser": "^5.59.5", "eslint": "^8.40.0", "eslint-config-prettier": "^8.8.0", - "prettier": "^2.8.4", + "prettier": "^3.5.3", "prettier-plugin-organize-imports": "^3.2.2", "ts-toolbelt": "^9.6.0", "tsc-watch": "^6.0.4", - "typescript": "^5.8.3" + "typescript": "=5.9.3" }, - "workspaces": [ - "shared", - "backend", - "dashboard" - ], "dependencies": { "dotenv": "^16.5.0" + }, + "engines": { + "node": ">=24" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 000000000..fe008aba2 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,5789 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +overrides: + discord.js: 14.23.2 + discord-api-types: 0.38.30 + +importers: + + .: + dependencies: + dotenv: + specifier: ^16.5.0 + version: 16.6.1 + devDependencies: + '@types/node': + specifier: ^22.15.18 + version: 22.18.12 + '@typescript-eslint/eslint-plugin': + specifier: ^5.59.5 + version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': + specifier: ^5.59.5 + version: 5.62.0(eslint@8.57.1)(typescript@5.9.3) + eslint: + specifier: ^8.40.0 + version: 8.57.1 + eslint-config-prettier: + specifier: ^8.8.0 + version: 8.10.2(eslint@8.57.1) + prettier: + specifier: ^3.5.3 + version: 3.6.2 + prettier-plugin-organize-imports: + specifier: ^3.2.2 + version: 3.2.4(prettier@3.6.2)(typescript@5.9.3) + ts-toolbelt: + specifier: ^9.6.0 + version: 9.6.0 + tsc-watch: + specifier: ^6.0.4 + version: 6.3.1(typescript@5.9.3) + typescript: + specifier: '=5.9.3' + version: 5.9.3 + + backend: + dependencies: + '@silvia-odwyer/photon-node': + specifier: ^0.3.1 + version: 0.3.4 + '@zeppelinbot/shared': + specifier: workspace:* + version: link:../shared + bufferutil: + specifier: ^4.0.3 + version: 4.0.9 + cors: + specifier: ^2.8.5 + version: 2.8.5 + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + deep-diff: + specifier: ^1.0.2 + version: 1.0.2 + discord.js: + specifier: 14.23.2 + version: 14.23.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + emoji-regex: + specifier: ^8.0.0 + version: 8.0.0 + escape-string-regexp: + specifier: ^1.0.5 + version: 1.0.5 + express: + specifier: ^4.20.0 + version: 4.21.2 + fp-ts: + specifier: ^2.0.1 + version: 2.16.11 + humanize-duration: + specifier: ^3.15.0 + version: 3.33.1 + js-yaml: + specifier: ^4.1.0 + version: 4.1.0 + knub-command-manager: + specifier: ^9.1.0 + version: 9.1.0 + lodash-es: + specifier: ^4.17.21 + version: 4.17.21 + moment-timezone: + specifier: ^0.5.21 + version: 0.5.48 + multer: + specifier: ^2.0.2 + version: 2.0.2 + mysql2: + specifier: ^3.9.8 + version: 3.15.3 + parse-color: + specifier: ^1.0.0 + version: 1.0.0 + passport: + specifier: ^0.6.0 + version: 0.6.0 + passport-custom: + specifier: ^1.0.5 + version: 1.1.1 + passport-oauth2: + specifier: ^1.6.1 + version: 1.8.0 + pkg-up: + specifier: ^3.1.0 + version: 3.1.0 + redis: + specifier: ^5.9.0 + version: 5.9.0 + reflect-metadata: + specifier: ^0.1.12 + version: 0.1.14 + regexp-worker: + specifier: ^1.1.0 + version: 1.1.1 + safe-regex: + specifier: ^2.0.2 + version: 2.1.1 + seedrandom: + specifier: ^3.0.1 + version: 3.0.5 + strip-combining-marks: + specifier: ^1.0.0 + version: 1.0.0 + threads: + specifier: ^1.7.0 + version: 1.7.0 + tlds: + specifier: ^1.221.1 + version: 1.261.0 + tmp: + specifier: 0.2.5 + version: 0.2.5 + tsconfig-paths: + specifier: ^3.9.0 + version: 3.15.0 + twemoji: + specifier: ^12.1.4 + version: 12.1.6 + typeorm: + specifier: ^0.3.27 + version: 0.3.27(mysql2@3.15.3)(redis@5.9.0)(reflect-metadata@0.1.14)(ts-node@10.9.2(@types/node@22.18.13)(typescript@5.9.3)) + utf-8-validate: + specifier: ^5.0.5 + version: 5.0.10 + uuid: + specifier: ^9.0.0 + version: 9.0.1 + vety: + specifier: 1.0.0-rc2 + version: 1.0.0-rc2(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) + zod: + specifier: ^4.1.12 + version: 4.1.12 + devDependencies: + '@types/cors': + specifier: ^2.8.5 + version: 2.8.19 + '@types/express': + specifier: ^4.16.1 + version: 4.17.24 + '@types/js-yaml': + specifier: ^3.12.1 + version: 3.12.10 + '@types/lodash-es': + specifier: ^4.17.12 + version: 4.17.12 + '@types/multer': + specifier: ^1.4.7 + version: 1.4.13 + '@types/passport': + specifier: ^1.0.0 + version: 1.0.17 + '@types/passport-oauth2': + specifier: ^1.4.8 + version: 1.8.0 + '@types/passport-strategy': + specifier: ^0.2.35 + version: 0.2.38 + '@types/safe-regex': + specifier: ^1.1.2 + version: 1.1.6 + '@types/tmp': + specifier: 0.0.33 + version: 0.0.33 + '@types/twemoji': + specifier: ^12.1.0 + version: 12.1.2 + '@types/uuid': + specifier: ^9.0.2 + version: 9.0.8 + ava: + specifier: ^5.3.1 + version: 5.3.1 + source-map-support: + specifier: ^0.5.16 + version: 0.5.21 + + dashboard: + dependencies: + '@fastify/static': + specifier: ^7.0.1 + version: 7.0.4 + ace-builds: + specifier: 1.43.4 + version: 1.43.4 + fastify: + specifier: ^4.26.2 + version: 4.29.1 + devDependencies: + '@tailwindcss/vite': + specifier: ^4.1.8 + version: 4.1.16(rolldown-vite@7.1.20(@types/node@22.18.13)(jiti@2.6.1)) + '@vitejs/plugin-vue': + specifier: ^5.2.4 + version: 5.2.4(rolldown-vite@7.1.20(@types/node@22.18.13)(jiti@2.6.1))(vue@3.5.22(typescript@5.9.3)) + '@vue/tsconfig': + specifier: ^0.7.0 + version: 0.7.0(typescript@5.9.3)(vue@3.5.22(typescript@5.9.3)) + '@zeppelinbot/shared': + specifier: workspace:* + version: link:../shared + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + highlight.js: + specifier: ^11.8.0 + version: 11.11.1 + humanize-duration: + specifier: ^3.27.0 + version: 3.33.1 + js-yaml: + specifier: ^4.1.0 + version: 4.1.0 + marked: + specifier: ^5.1.0 + version: 5.1.2 + moment: + specifier: ^2.29.4 + version: 2.30.1 + postcss-nesting: + specifier: ^13.0.1 + version: 13.0.2(postcss@8.5.6) + tailwindcss: + specifier: ^4.1.8 + version: 4.1.16 + vite: + specifier: npm:rolldown-vite@latest + version: rolldown-vite@7.1.20(@types/node@22.18.13)(jiti@2.6.1) + vue: + specifier: ^3.5.13 + version: 3.5.22(typescript@5.9.3) + vue-material-design-icons: + specifier: ^5.3.1 + version: 5.3.1 + vue-router: + specifier: ^4.5.0 + version: 4.6.3(vue@3.5.22(typescript@5.9.3)) + vue-tsc: + specifier: ^2.2.10 + version: 2.2.12(typescript@5.9.3) + vue3-ace-editor: + specifier: ^2.2.4 + version: 2.2.4(ace-builds@1.43.4)(vue@3.5.22(typescript@5.9.3)) + vue3-highlightjs: + specifier: ^1.0.5 + version: 1.0.5(vue@3.5.22(typescript@5.9.3)) + vuex: + specifier: ^4.1.0 + version: 4.1.0(vue@3.5.22(typescript@5.9.3)) + + shared: + devDependencies: + ava: + specifier: ^5.3.1 + version: 5.3.1 + ts-node: + specifier: ^10.9.1 + version: 10.9.2(@types/node@22.18.13)(typescript@5.9.3) + +packages: + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + engines: {node: '>=6.9.0'} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@csstools/selector-resolve-nested@3.1.0': + resolution: {integrity: sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==} + engines: {node: '>=18'} + peerDependencies: + postcss-selector-parser: ^7.0.0 + + '@csstools/selector-specificity@5.0.0': + resolution: {integrity: sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==} + engines: {node: '>=18'} + peerDependencies: + postcss-selector-parser: ^7.0.0 + + '@discordjs/builders@1.13.0': + resolution: {integrity: sha512-COK0uU6ZaJI+LA67H/rp8IbEkYwlZf3mAoBI5wtPh5G5cbEQGNhVpzINg2f/6+q/YipnNIKy6fJDg6kMUKUw4Q==} + engines: {node: '>=16.11.0'} + + '@discordjs/collection@1.5.3': + resolution: {integrity: sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ==} + engines: {node: '>=16.11.0'} + + '@discordjs/collection@2.1.1': + resolution: {integrity: sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==} + engines: {node: '>=18'} + + '@discordjs/formatters@0.6.1': + resolution: {integrity: sha512-5cnX+tASiPCqCWtFcFslxBVUaCetB0thvM/JyavhbXInP1HJIEU+Qv/zMrnuwSsX3yWH2lVXNJZeDK3EiP4HHg==} + engines: {node: '>=16.11.0'} + + '@discordjs/rest@2.6.0': + resolution: {integrity: sha512-RDYrhmpB7mTvmCKcpj+pc5k7POKszS4E2O9TYc+U+Y4iaCP+r910QdO43qmpOja8LRr1RJ0b3U+CqVsnPqzf4w==} + engines: {node: '>=18'} + + '@discordjs/util@1.1.1': + resolution: {integrity: sha512-eddz6UnOBEB1oITPinyrB2Pttej49M9FZQY8NxgEvc3tq6ZICZ19m70RsmzRdDHk80O9NoYN/25AqJl8vPVf/g==} + engines: {node: '>=18'} + + '@discordjs/ws@1.2.3': + resolution: {integrity: sha512-wPlQDxEmlDg5IxhJPuxXr3Vy9AjYq5xCvFWGJyD7w7Np8ZGu+Mc+97LCoEc/+AYCo2IDpKioiH0/c/mj5ZR9Uw==} + engines: {node: '>=16.11.0'} + + '@emnapi/core@1.6.0': + resolution: {integrity: sha512-zq/ay+9fNIJJtJiZxdTnXS20PllcYMX3OE23ESc4HK/bdYu3cOWYVhsOhVnXALfU/uqJIxn5NBPd9z4v+SfoSg==} + + '@emnapi/runtime@1.6.0': + resolution: {integrity: sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==} + + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + + '@eslint-community/eslint-utils@4.9.0': + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.1': + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@fastify/accept-negotiator@1.1.0': + resolution: {integrity: sha512-OIHZrb2ImZ7XG85HXOONLcJWGosv7sIvM2ifAPQVhg9Lv7qdmMBNVaai4QTdyuaqbKM5eO6sLSQOYI7wEQeCJQ==} + engines: {node: '>=14'} + + '@fastify/ajv-compiler@3.6.0': + resolution: {integrity: sha512-LwdXQJjmMD+GwLOkP7TVC68qa+pSSogeWWmznRJ/coyTcfe9qA05AHFSe1eZFwK6q+xVRpChnvFUkf1iYaSZsQ==} + + '@fastify/error@3.4.1': + resolution: {integrity: sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==} + + '@fastify/fast-json-stringify-compiler@4.3.0': + resolution: {integrity: sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==} + + '@fastify/merge-json-schemas@0.1.1': + resolution: {integrity: sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==} + + '@fastify/send@2.1.0': + resolution: {integrity: sha512-yNYiY6sDkexoJR0D8IDy3aRP3+L4wdqCpvx5WP+VtEU58sn7USmKynBzDQex5X42Zzvw2gNzzYgP90UfWShLFA==} + + '@fastify/static@7.0.4': + resolution: {integrity: sha512-p2uKtaf8BMOZWLs6wu+Ihg7bWNBdjNgCwDza4MJtTqg+5ovKmcbgbR9Xs5/smZ1YISfzKOCNYmZV8LaCj+eJ1Q==} + + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@lukeed/ms@2.0.2': + resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} + engines: {node: '>=8'} + + '@napi-rs/wasm-runtime@1.0.7': + resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@oxc-project/runtime@0.95.0': + resolution: {integrity: sha512-qJS5pNepwMGnafO9ayKGz7rfPQgUBuunHpnP1//9Qa0zK3oT3t1EhT+I+pV9MUA+ZKez//OFqxCxf1vijCKb2Q==} + engines: {node: ^20.19.0 || >=22.12.0} + + '@oxc-project/types@0.95.0': + resolution: {integrity: sha512-vACy7vhpMPhjEJhULNxrdR0D943TkA/MigMpJCHmBHvMXxRStRi/dPtTlfQ3uDwWSzRpT8z+7ImjZVf8JWBocQ==} + + '@pinojs/redact@0.4.0': + resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@redis/bloom@5.9.0': + resolution: {integrity: sha512-W9D8yfKTWl4tP8lkC3MRYkMz4OfbuzE/W8iObe0jFgoRmgMfkBV+Vj38gvIqZPImtY0WB34YZkX3amYuQebvRQ==} + engines: {node: '>= 18'} + peerDependencies: + '@redis/client': ^5.9.0 + + '@redis/client@5.9.0': + resolution: {integrity: sha512-EI0Ti5pojD2p7TmcS7RRa+AJVahdQvP/urpcSbK/K9Rlk6+dwMJTQ354pCNGCwfke8x4yKr5+iH85wcERSkwLQ==} + engines: {node: '>= 18'} + + '@redis/json@5.9.0': + resolution: {integrity: sha512-Bm2jjLYaXdUWPb9RaEywxnjmzw7dWKDZI4MS79mTWPV16R982jVWBj6lY2ZGelJbwxHtEVg4/FSVgYDkuO/MxA==} + engines: {node: '>= 18'} + peerDependencies: + '@redis/client': ^5.9.0 + + '@redis/search@5.9.0': + resolution: {integrity: sha512-jdk2csmJ29DlpvCIb2ySjix2co14/0iwIT3C0I+7ZaToXgPbgBMB+zfEilSuncI2F9JcVxHki0YtLA0xX3VdpA==} + engines: {node: '>= 18'} + peerDependencies: + '@redis/client': ^5.9.0 + + '@redis/time-series@5.9.0': + resolution: {integrity: sha512-W6ILxcyOqhnI7ELKjJXOktIg3w4+aBHugDbVpgVLPZ+YDjObis1M0v7ZzwlpXhlpwsfePfipeSK+KWNuymk52w==} + engines: {node: '>= 18'} + peerDependencies: + '@redis/client': ^5.9.0 + + '@rolldown/binding-android-arm64@1.0.0-beta.45': + resolution: {integrity: sha512-bfgKYhFiXJALeA/riil908+2vlyWGdwa7Ju5S+JgWZYdR4jtiPOGdM6WLfso1dojCh+4ZWeiTwPeV9IKQEX+4g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-beta.45': + resolution: {integrity: sha512-xjCv4CRVsSnnIxTuyH1RDJl5OEQ1c9JYOwfDAHddjJDxCw46ZX9q80+xq7Eok7KC4bRSZudMJllkvOKv0T9SeA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-beta.45': + resolution: {integrity: sha512-ddcO9TD3D/CLUa/l8GO8LHzBOaZqWg5ClMy3jICoxwCuoz47h9dtqPsIeTiB6yR501LQTeDsjA4lIFd7u3Ljfw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-beta.45': + resolution: {integrity: sha512-MBTWdrzW9w+UMYDUvnEuh0pQvLENkl2Sis15fHTfHVW7ClbGuez+RWopZudIDEGkpZXdeI4CkRXk+vdIIebrmg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.45': + resolution: {integrity: sha512-4YgoCFiki1HR6oSg+GxxfzfnVCesQxLF1LEnw9uXS/MpBmuog0EOO2rYfy69rWP4tFZL9IWp6KEfGZLrZ7aUog==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.45': + resolution: {integrity: sha512-LE1gjAwQRrbCOorJJ7LFr10s5vqYf5a00V5Ea9wXcT2+56n5YosJkcp8eQ12FxRBv2YX8dsdQJb+ZTtYJwb6XQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.45': + resolution: {integrity: sha512-tdy8ThO/fPp40B81v0YK3QC+KODOmzJzSUOO37DinQxzlTJ026gqUSOM8tzlVixRbQJltgVDCTYF8HNPRErQTA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.45': + resolution: {integrity: sha512-lS082ROBWdmOyVY/0YB3JmsiClaWoxvC+dA8/rbhyB9VLkvVEaihLEOr4CYmrMse151C4+S6hCw6oa1iewox7g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.45': + resolution: {integrity: sha512-Hi73aYY0cBkr1/SvNQqH8Cd+rSV6S9RB5izCv0ySBcRnd/Wfn5plguUoGYwBnhHgFbh6cPw9m2dUVBR6BG1gxA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.45': + resolution: {integrity: sha512-fljEqbO7RHHogNDxYtTzr+GNjlfOx21RUyGmF+NrkebZ8emYYiIqzPxsaMZuRx0rgZmVmliOzEp86/CQFDKhJQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.45': + resolution: {integrity: sha512-ZJDB7lkuZE9XUnWQSYrBObZxczut+8FZ5pdanm8nNS1DAo8zsrPuvGwn+U3fwU98WaiFsNrA4XHngesCGr8tEQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.45': + resolution: {integrity: sha512-zyzAjItHPUmxg6Z8SyRhLdXlJn3/D9KL5b9mObUrBHhWS/GwRH4665xCiFqeuktAhhWutqfc+rOV2LjK4VYQGQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.45': + resolution: {integrity: sha512-wODcGzlfxqS6D7BR0srkJk3drPwXYLu7jPHN27ce2c4PUnVVmJnp9mJzUQGT4LpmHmmVdMZ+P6hKvyTGBzc1CA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.45': + resolution: {integrity: sha512-wiU40G1nQo9rtfvF9jLbl79lUgjfaD/LTyUEw2Wg/gdF5OhjzpKMVugZQngO+RNdwYaNj+Fs+kWBWfp4VXPMHA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0-beta.45': + resolution: {integrity: sha512-Le9ulGCrD8ggInzWw/k2J8QcbPz7eGIOWqfJ2L+1R0Opm7n6J37s2hiDWlh6LJN0Lk9L5sUzMvRHKW7UxBZsQA==} + + '@sapphire/async-queue@1.5.5': + resolution: {integrity: sha512-cvGzxbba6sav2zZkH8GPf2oGk9yYoD5qrNWdu9fRehifgnFZJMV+nuy2nON2roRO4yQQ+v7MK/Pktl/HgfsUXg==} + engines: {node: '>=v14.0.0', npm: '>=7.0.0'} + + '@sapphire/shapeshift@4.0.0': + resolution: {integrity: sha512-d9dUmWVA7MMiKobL3VpLF8P2aeanRTu6ypG2OIaEv/ZHH/SUQ2iHOVyi5wAPjQ+HmnMuL0whK9ez8I/raWbtIg==} + engines: {node: '>=v16'} + + '@sapphire/snowflake@3.5.3': + resolution: {integrity: sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ==} + engines: {node: '>=v14.0.0', npm: '>=7.0.0'} + + '@silvia-odwyer/photon-node@0.3.4': + resolution: {integrity: sha512-bnly4BKB3KDTFxrUIcgCLbaeVVS8lrAkri1pEzskpmxu9MdfGQTy8b8EgcD83ywD3RPMsIulY8xJH5Awa+t9fA==} + + '@sqltools/formatter@1.2.5': + resolution: {integrity: sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==} + + '@tailwindcss/node@4.1.16': + resolution: {integrity: sha512-BX5iaSsloNuvKNHRN3k2RcCuTEgASTo77mofW0vmeHkfrDWaoFAFvNHpEgtu0eqyypcyiBkDWzSMxJhp3AUVcw==} + + '@tailwindcss/oxide-android-arm64@4.1.16': + resolution: {integrity: sha512-8+ctzkjHgwDJ5caq9IqRSgsP70xhdhJvm+oueS/yhD5ixLhqTw9fSL1OurzMUhBwE5zK26FXLCz2f/RtkISqHA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.1.16': + resolution: {integrity: sha512-C3oZy5042v2FOALBZtY0JTDnGNdS6w7DxL/odvSny17ORUnaRKhyTse8xYi3yKGyfnTUOdavRCdmc8QqJYwFKA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.1.16': + resolution: {integrity: sha512-vjrl/1Ub9+JwU6BP0emgipGjowzYZMjbWCDqwA2Z4vCa+HBSpP4v6U2ddejcHsolsYxwL5r4bPNoamlV0xDdLg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.1.16': + resolution: {integrity: sha512-TSMpPYpQLm+aR1wW5rKuUuEruc/oOX3C7H0BTnPDn7W/eMw8W+MRMpiypKMkXZfwH8wqPIRKppuZoedTtNj2tg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.16': + resolution: {integrity: sha512-p0GGfRg/w0sdsFKBjMYvvKIiKy/LNWLWgV/plR4lUgrsxFAoQBFrXkZ4C0w8IOXfslB9vHK/JGASWD2IefIpvw==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.16': + resolution: {integrity: sha512-DoixyMmTNO19rwRPdqviTrG1rYzpxgyYJl8RgQvdAQUzxC1ToLRqtNJpU/ATURSKgIg6uerPw2feW0aS8SNr/w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-arm64-musl@4.1.16': + resolution: {integrity: sha512-H81UXMa9hJhWhaAUca6bU2wm5RRFpuHImrwXBUvPbYb+3jo32I9VIwpOX6hms0fPmA6f2pGVlybO6qU8pF4fzQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-linux-x64-gnu@4.1.16': + resolution: {integrity: sha512-ZGHQxDtFC2/ruo7t99Qo2TTIvOERULPl5l0K1g0oK6b5PGqjYMga+FcY1wIUnrUxY56h28FxybtDEla+ICOyew==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-x64-musl@4.1.16': + resolution: {integrity: sha512-Oi1tAaa0rcKf1Og9MzKeINZzMLPbhxvm7rno5/zuP1WYmpiG0bEHq4AcRUiG2165/WUzvxkW4XDYCscZWbTLZw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-wasm32-wasi@4.1.16': + resolution: {integrity: sha512-B01u/b8LteGRwucIBmCQ07FVXLzImWESAIMcUU6nvFt/tYsQ6IHz8DmZ5KtvmwxD+iTYBtM1xwoGXswnlu9v0Q==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.16': + resolution: {integrity: sha512-zX+Q8sSkGj6HKRTMJXuPvOcP8XfYON24zJBRPlszcH1Np7xuHXhWn8qfFjIujVzvH3BHU+16jBXwgpl20i+v9A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.1.16': + resolution: {integrity: sha512-m5dDFJUEejbFqP+UXVstd4W/wnxA4F61q8SoL+mqTypId2T2ZpuxosNSgowiCnLp2+Z+rivdU0AqpfgiD7yCBg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.1.16': + resolution: {integrity: sha512-2OSv52FRuhdlgyOQqgtQHuCgXnS8nFSYRp2tJ+4WZXKgTxqPy7SMSls8c3mPT5pkZ17SBToGM5LHEJBO7miEdg==} + engines: {node: '>= 10'} + + '@tailwindcss/vite@4.1.16': + resolution: {integrity: sha512-bbguNBcDxsRmi9nnlWJxhfDWamY3lmcyACHcdO1crxfzuLpOhHLLtEIN/nCbbAtj5rchUgQD17QVAKi1f7IsKg==} + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 + + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/cors@2.8.19': + resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} + + '@types/express-serve-static-core@4.19.7': + resolution: {integrity: sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==} + + '@types/express@4.17.24': + resolution: {integrity: sha512-Mbrt4SRlXSTWryOnHAh2d4UQ/E7n9lZyGSi6KgX+4hkuL9soYbLOVXVhnk/ODp12YsGc95f4pOvqywJ6kngUwg==} + + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} + + '@types/js-yaml@3.12.10': + resolution: {integrity: sha512-/Mtaq/wf+HxXpvhzFYzrzCqNRcA958sW++7JOFC8nPrZcvfi/TrzOaaGbvt27ltJB2NQbHVAg5a1wUCsyMH7NA==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/lodash-es@4.17.12': + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + + '@types/lodash@4.17.20': + resolution: {integrity: sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/multer@1.4.13': + resolution: {integrity: sha512-bhhdtPw7JqCiEfC9Jimx5LqX9BDIPJEh2q/fQ4bqbBPtyEZYr3cvF22NwG0DmPZNYA0CAf2CnqDB4KIGGpJcaw==} + + '@types/node@22.18.12': + resolution: {integrity: sha512-BICHQ67iqxQGFSzfCFTT7MRQ5XcBjG5aeKh5Ok38UBbPe5fxTyE+aHFxwVrGyr8GNlqFMLKD1D3P2K/1ks8tog==} + + '@types/node@22.18.13': + resolution: {integrity: sha512-Bo45YKIjnmFtv6I1TuC8AaHBbqXtIo+Om5fE4QiU1Tj8QR/qt+8O3BAtOimG5IFmwaWiPmB3Mv3jtYzBA4Us2A==} + + '@types/oauth@0.9.6': + resolution: {integrity: sha512-H9TRCVKBNOhZZmyHLqFt9drPM9l+ShWiqqJijU1B8P3DX3ub84NjxDuy+Hjrz+fEca5Kwip3qPMKNyiLgNJtIA==} + + '@types/passport-oauth2@1.8.0': + resolution: {integrity: sha512-6//z+4orIOy/g3zx17HyQ71GSRK4bs7Sb+zFasRoc2xzlv7ZCJ+vkDBYFci8U6HY+or6Zy7ajf4mz4rK7nsWJQ==} + + '@types/passport-strategy@0.2.38': + resolution: {integrity: sha512-GC6eMqqojOooq993Tmnmp7AUTbbQSgilyvpCYQjT+H6JfG/g6RGc7nXEniZlp0zyKJ0WUdOiZWLBZft9Yug1uA==} + + '@types/passport@1.0.17': + resolution: {integrity: sha512-aciLyx+wDwT2t2/kJGJR2AEeBz0nJU4WuRX04Wu9Dqc5lSUtwu0WERPHYsLhF9PtseiAMPBGNUOtFjxZ56prsg==} + + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/safe-regex@1.1.6': + resolution: {integrity: sha512-CQ/uPB9fLOPKwDsrTeVbNIkwfUthTWOx0l6uIGwVFjZxv7e68pCW5gtTYFzdJi3EBJp8h8zYhJbTasAbX7gEMQ==} + + '@types/semver@7.7.1': + resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} + + '@types/send@0.17.6': + resolution: {integrity: sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==} + + '@types/send@1.2.1': + resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} + + '@types/serve-static@1.15.10': + resolution: {integrity: sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==} + + '@types/tmp@0.0.33': + resolution: {integrity: sha512-gVC1InwyVrO326wbBZw+AO3u2vRXz/iRWq9jYhpG4W8LXyIgDv3ZmcLQ5Q4Gs+gFMyqx+viFoFT+l3p61QFCmQ==} + + '@types/twemoji@12.1.2': + resolution: {integrity: sha512-3eMyKenMi0R1CeKzBYtk/Z2JIHsTMQrIrTah0q54o45pHTpWVNofU2oHx0jS8tqsDRhis2TbB6238WP9oh2l2w==} + + '@types/uuid@9.0.8': + resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} + + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + + '@typescript-eslint/eslint-plugin@5.62.0': + resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@5.62.0': + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@5.62.0': + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/type-utils@5.62.0': + resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@5.62.0': + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/typescript-estree@5.62.0': + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@5.62.0': + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + + '@typescript-eslint/visitor-keys@5.62.0': + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@vitejs/plugin-vue@5.2.4': + resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 + vue: ^3.2.25 + + '@vladfrangu/async_event_emitter@2.4.7': + resolution: {integrity: sha512-Xfe6rpCTxSxfbswi/W/Pz7zp1WWSNn4A0eW4mLkQUewCrXXtMj31lCg+iQyTkh/CkusZSq9eDflu7tjEDXUY6g==} + engines: {node: '>=v14.0.0', npm: '>=7.0.0'} + + '@volar/language-core@2.4.15': + resolution: {integrity: sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==} + + '@volar/source-map@2.4.15': + resolution: {integrity: sha512-CPbMWlUN6hVZJYGcU/GSoHu4EnCHiLaXI9n8c9la6RaI9W5JHX+NqG+GSQcB0JdC2FIBLdZJwGsfKyBB71VlTg==} + + '@volar/typescript@2.4.15': + resolution: {integrity: sha512-2aZ8i0cqPGjXb4BhkMsPYDkkuc2ZQ6yOpqwAuNwUoncELqoy5fRgOQtLR9gB0g902iS0NAkvpIzs27geVyVdPg==} + + '@vue/compiler-core@3.5.22': + resolution: {integrity: sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==} + + '@vue/compiler-dom@3.5.22': + resolution: {integrity: sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA==} + + '@vue/compiler-sfc@3.5.22': + resolution: {integrity: sha512-tbTR1zKGce4Lj+JLzFXDq36K4vcSZbJ1RBu8FxcDv1IGRz//Dh2EBqksyGVypz3kXpshIfWKGOCcqpSbyGWRJQ==} + + '@vue/compiler-ssr@3.5.22': + resolution: {integrity: sha512-GdgyLvg4R+7T8Nk2Mlighx7XGxq/fJf9jaVofc3IL0EPesTE86cP/8DD1lT3h1JeZr2ySBvyqKQJgbS54IX1Ww==} + + '@vue/compiler-vue2@2.7.16': + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + + '@vue/devtools-api@6.6.4': + resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + + '@vue/language-core@2.2.12': + resolution: {integrity: sha512-IsGljWbKGU1MZpBPN+BvPAdr55YPkj2nB/TBNGNC32Vy2qLG25DYu/NBN2vNtZqdRbTRjaoYrahLrToim2NanA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/reactivity@3.5.22': + resolution: {integrity: sha512-f2Wux4v/Z2pqc9+4SmgZC1p73Z53fyD90NFWXiX9AKVnVBEvLFOWCEgJD3GdGnlxPZt01PSlfmLqbLYzY/Fw4A==} + + '@vue/runtime-core@3.5.22': + resolution: {integrity: sha512-EHo4W/eiYeAzRTN5PCextDUZ0dMs9I8mQ2Fy+OkzvRPUYQEyK9yAjbasrMCXbLNhF7P0OUyivLjIy0yc6VrLJQ==} + + '@vue/runtime-dom@3.5.22': + resolution: {integrity: sha512-Av60jsryAkI023PlN7LsqrfPvwfxOd2yAwtReCjeuugTJTkgrksYJJstg1e12qle0NarkfhfFu1ox2D+cQotww==} + + '@vue/server-renderer@3.5.22': + resolution: {integrity: sha512-gXjo+ao0oHYTSswF+a3KRHZ1WszxIqO7u6XwNHqcqb9JfyIL/pbWrrh/xLv7jeDqla9u+LK7yfZKHih1e1RKAQ==} + peerDependencies: + vue: 3.5.22 + + '@vue/shared@3.5.22': + resolution: {integrity: sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==} + + '@vue/tsconfig@0.7.0': + resolution: {integrity: sha512-ku2uNz5MaZ9IerPPUyOHzyjhXoX2kVJaVf7hL315DC17vS6IiZRmmCPfggNbU16QTvM80+uYYy3eYJB59WCtvg==} + peerDependencies: + typescript: 5.x + vue: ^3.4.0 + peerDependenciesMeta: + typescript: + optional: true + vue: + optional: true + + abstract-logging@2.0.1: + resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + ace-builds@1.43.4: + resolution: {integrity: sha512-8hAxVfo2ImICd69BWlZwZlxe9rxDGDjuUhh+WeWgGDvfBCE+r3lkynkQvIovDz4jcMi8O7bsEaFygaDT+h9sBA==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + aggregate-error@4.0.1: + resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} + engines: {node: '>=12'} + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + alien-signals@1.0.13: + resolution: {integrity: sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + ansis@3.17.0: + resolution: {integrity: sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==} + engines: {node: '>=14'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + app-root-path@3.1.0: + resolution: {integrity: sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==} + engines: {node: '>= 6.0.0'} + + append-field@1.0.0: + resolution: {integrity: sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==} + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-find-index@1.0.2: + resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} + engines: {node: '>=0.10.0'} + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + arrgv@1.0.2: + resolution: {integrity: sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw==} + engines: {node: '>=8.0.0'} + + arrify@3.0.0: + resolution: {integrity: sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==} + engines: {node: '>=12'} + + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + + ava@5.3.1: + resolution: {integrity: sha512-Scv9a4gMOXB6+ni4toLuhAm9KYWEjsgBglJl+kMGI5+IVDt120CCDZyB5HNU9DjmLI2t4I0GbnxGLmmRfGTJGg==} + engines: {node: '>=14.19 <15 || >=16.15 <17 || >=18'} + hasBin: true + peerDependencies: + '@ava/typescript': '*' + peerDependenciesMeta: + '@ava/typescript': + optional: true + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + avvio@8.4.0: + resolution: {integrity: sha512-CDSwaxINFy59iNwhYnkvALBwZiTydGkOecZyPkqBpABYR1KqGEsET0VOOYDwtleZSUIdeY36DC2bSZ24CO1igA==} + + aws-ssl-profiles@1.1.2: + resolution: {integrity: sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==} + engines: {node: '>= 6.0.0'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + base64url@3.0.1: + resolution: {integrity: sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==} + engines: {node: '>=6.0.0'} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + blueimp-md5@2.19.0: + resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} + + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + bufferutil@4.0.9: + resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} + engines: {node: '>=6.14.2'} + + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + callsites@4.2.0: + resolution: {integrity: sha512-kfzR4zzQtAE9PC7CzZsjl3aBNbXWuXiSeOCdLcPpBfGW8YuCqQHcRPFDbr/BPVmd3EEPVpuFzLyuT/cUhPr4OQ==} + engines: {node: '>=12.20'} + + cbor@8.1.0: + resolution: {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==} + engines: {node: '>=12.19'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chunkd@2.0.1: + resolution: {integrity: sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ==} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + ci-parallel-vars@1.0.1: + resolution: {integrity: sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg==} + + clean-stack@4.2.0: + resolution: {integrity: sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==} + engines: {node: '>=12'} + + clean-yaml-object@0.1.0: + resolution: {integrity: sha512-3yONmlN9CSAkzNwnRCiJQ7Q2xK5mWuEfL3PuTZcAUzhObbXsfsnMptJzXwz93nc5zn9V9TwCVMmV7w4xsm43dw==} + engines: {node: '>=0.10.0'} + + cli-truncate@3.1.0: + resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + cluster-key-slot@1.1.2: + resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} + engines: {node: '>=0.10.0'} + + code-excerpt@4.0.0: + resolution: {integrity: sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + color-convert@0.5.3: + resolution: {integrity: sha512-RwBeO/B/vZR3dfKL1ye/vx8MHZ40ugzpyfeVG5GsiuGnrlMWe2o8wxBbLCpw9CsxV+wHuzYlCiWnybrIA0ling==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + common-path-prefix@3.0.0: + resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + + concordance@5.0.4: + resolution: {integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==} + engines: {node: '>=10.18.0 <11 || >=12.14.0 <13 || >=14'} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + convert-to-spaces@2.0.1: + resolution: {integrity: sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + cookie@0.7.1: + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} + engines: {node: '>= 0.6'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + currently-unhandled@0.4.1: + resolution: {integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==} + engines: {node: '>=0.10.0'} + + date-time@3.1.0: + resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} + engines: {node: '>=6'} + + dayjs@1.11.18: + resolution: {integrity: sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==} + + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + dedent@1.7.0: + resolution: {integrity: sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deep-diff@1.0.2: + resolution: {integrity: sha512-aWS3UIVH+NPGCD1kki+DCU9Dua032iSsO43LqQpcs4R3+dVv7tX0qBGjiVHJHjplsoUM2XRO/KB92glqc68awg==} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + discord-api-types@0.38.30: + resolution: {integrity: sha512-KhAqlBrg+rVK+Ob7INMF5o63yW4/GUzRatG/AjyVsIO8lgcLyR8qCl2HokIVzWwmzkJYG0CEPXsKMOqau3E8NA==} + + discord.js@14.23.2: + resolution: {integrity: sha512-tU2NFr823X3TXEc8KyR/4m296KLxPai4nirN3q9kHCpY4TKj96n9lHZnyLzRNMui8EbL07jg9hgH2PWWfKMGIg==} + engines: {node: '>=18'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + emittery@1.2.0: + resolution: {integrity: sha512-KxdRyyFcS85pH3dnU8Y5yFUm2YJdaHwcBZWrfG8o89ZY9a13/f9itbN+YG3ELbBo9Pg5zvIozstmuV8bX13q6g==} + engines: {node: '>=14.16'} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + enhanced-resolve@5.18.3: + resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} + engines: {node: '>=10.13.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + eslint-config-prettier@8.10.2: + resolution: {integrity: sha512-/IGJ6+Dka158JnP5n5YFMOszjDWrXggGz1LaK/guZq9vZTmniaKlHcsscvkAhn9y4U+BU3JuUdYvtAMcv30y4A==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + + esm@3.2.25: + resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} + engines: {node: '>=6'} + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + event-stream@3.3.4: + resolution: {integrity: sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==} + + express@4.21.2: + resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} + engines: {node: '>= 0.10.0'} + + fast-content-type-parse@1.1.0: + resolution: {integrity: sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==} + + fast-decode-uri-component@1.0.1: + resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-json-stringify@5.16.1: + resolution: {integrity: sha512-KAdnLvy1yu/XrRtP+LJnxbBGrhN+xXu+gt3EUvZhYGKCr3lFHq/7UFJHHFgmJKoqlh6B40bZLEv7w46B0mqn1g==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-querystring@1.1.2: + resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} + + fast-uri@2.4.0: + resolution: {integrity: sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==} + + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + + fastify-plugin@4.5.1: + resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==} + + fastify@4.29.1: + resolution: {integrity: sha512-m2kMNHIG92tSNWv+Z3UeTR9AWLLuo7KctC7mlFPtMEVrfjIhmQhkQnT9v15qA/BfVq3vvj134Y0jl9SBje3jXQ==} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + figures@5.0.0: + resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==} + engines: {node: '>=14'} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} + engines: {node: '>= 0.8'} + + find-my-way@8.2.2: + resolution: {integrity: sha512-Dobi7gcTEq8yszimcfp/R7+owiT4WncAJ7VTTgFH1jYJ5GaG1FbhjwDG820hptN0QDFvzVY3RfCzdInvGPGzjA==} + engines: {node: '>=14'} + + find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fp-ts@2.16.11: + resolution: {integrity: sha512-LaI+KaX2NFkfn1ZGHoKCmcfv7yrZsC3b8NtWsTVQeHkq4F27vI5igUuO53sxqDEa2gNQMHFPmpojDw/1zmUK7w==} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + from@0.1.7: + resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + generate-function@2.3.1: + resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + globby@13.2.2: + resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + highlight.js@10.7.3: + resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + + highlight.js@11.11.1: + resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} + engines: {node: '>=12.0.0'} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + humanize-duration@3.33.1: + resolution: {integrity: sha512-hwzSCymnRdFx9YdRkQQ0OYequXiVAV6ZGQA2uzocwB0F4309Ke6pO8dg0P8LHhRQJyVjGteRTAA/zNfEcpXn8A==} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.7.0: + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore-by-default@2.1.0: + resolution: {integrity: sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw==} + engines: {node: '>=10 <11 || >=12 <13 || >=14'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + irregular-plurals@3.5.0: + resolution: {integrity: sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==} + engines: {node: '>=8'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-error@2.2.2: + resolution: {integrity: sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg==} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-observable@2.1.0: + resolution: {integrity: sha512-DailKdLb0WU+xX8K5w7VsJhapwHLZ9jjmazqCJq4X12CTgqq73TKnbRcnSLuXYPOoLQgV5IrD7ePiX/h1vnkBw==} + engines: {node: '>=8'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + is-property@1.0.2: + resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + + js-string-escape@1.0.1: + resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} + engines: {node: '>= 0.8'} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-ref-resolver@1.0.1: + resolution: {integrity: sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonfile@5.0.0: + resolution: {integrity: sha512-NQRZ5CRo74MhMMC3/3r5g2k4fjodJ/wh8MxjFbCViWKFjxrnudWSY5vomh+23ZaXzAS7J3fBZIR2dV6WbmfM0w==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + knub-command-manager@9.1.0: + resolution: {integrity: sha512-pEtpWElbBoTRSL8kWSPRrTIuTIdvYGkP/wzOn77cieumC02adfwEt1Cc09HFvVT4ib35nf1y31oul36csaG7Vg==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + light-my-request@5.14.0: + resolution: {integrity: sha512-aORPWntbpH5esaYpGOOmri0OHDOe3wC5M2MQxZ9dvMLZm6DnaAn0kJlcbU9hwsQgLzmZyReKwFwwPkR+nHu5kA==} + + lightningcss-android-arm64@1.30.2: + resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.30.2: + resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.30.2: + resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.30.2: + resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.30.2: + resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.30.2: + resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.30.2: + resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.30.2: + resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.30.2: + resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.30.2: + resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.30.2: + resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.30.2: + resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} + engines: {node: '>= 12.0.0'} + + load-json-file@7.0.1: + resolution: {integrity: sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.snakecase@4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + + lru.min@1.1.2: + resolution: {integrity: sha512-Nv9KddBcQSlQopmBHXSsZVY5xsdlZkdH/Iey0BlcBYggMd4two7cZnKOK9vmy3nY0O5RGH99z1PCeTpPqszUYg==} + engines: {bun: '>=1.0.0', deno: '>=1.30.0', node: '>=8.0.0'} + + magic-bytes.js@1.12.1: + resolution: {integrity: sha512-ThQLOhN86ZkJ7qemtVRGYM+gRgR8GEXNli9H/PMvpnZsE44Xfh3wx9kGJaldg314v85m+bFW6WBMaVHJc/c3zA==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + map-age-cleaner@0.1.3: + resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==} + engines: {node: '>=6'} + + map-stream@0.1.0: + resolution: {integrity: sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==} + + marked@5.1.2: + resolution: {integrity: sha512-ahRPGXJpjMjwSOlBoTMZAK7ATXkli5qCPxZ21TG44rx1KEo44bii4ekgTDQPNRQ4Kh7JMb9Ub1PVk1NxRSsorg==} + engines: {node: '>= 16'} + hasBin: true + + matcher@5.0.0: + resolution: {integrity: sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + md5-hex@3.0.1: + resolution: {integrity: sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==} + engines: {node: '>=8'} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + mem@9.0.2: + resolution: {integrity: sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A==} + engines: {node: '>=12.20'} + + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + moment-timezone@0.5.48: + resolution: {integrity: sha512-f22b8LV1gbTO2ms2j2z13MuPogNoh5UzxL3nzNAYKGraILnbGc9NEE6dyiiiLv46DGRb8A4kg8UKWLjPthxBHw==} + + moment@2.30.1: + resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + + multer@2.0.2: + resolution: {integrity: sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==} + engines: {node: '>= 10.16.0'} + + mysql2@3.15.3: + resolution: {integrity: sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==} + engines: {node: '>= 8.0'} + + named-placeholders@1.1.3: + resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==} + engines: {node: '>=12.0.0'} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + node-cleanup@2.1.2: + resolution: {integrity: sha512-qN8v/s2PAJwGUtr1/hYTpNKlD6Y9rc4p8KSmJXyGdYGZsDGKXrGThikLFP9OCHFeLeEpQzPwiAtdIvBLqm//Hw==} + + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + + nofilter@3.1.0: + resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} + engines: {node: '>=12.19'} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + oauth@0.10.2: + resolution: {integrity: sha512-JtFnB+8nxDEXgNyniwz573xxbKSOu3R8D40xQKqcjwJ2CDkYqUDI53o6IuzDJBx60Z8VKCm271+t8iFjakrl8Q==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + observable-fns@0.6.1: + resolution: {integrity: sha512-9gRK4+sRWzeN6AOewNBTLXir7Zl/i3GB6Yl26gK4flxz8BXVpD3kt8amREmWNb0mxYOGDotvE5a4N+PtGGKdkg==} + + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-defer@1.0.0: + resolution: {integrity: sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==} + engines: {node: '>=4'} + + p-event@5.0.1: + resolution: {integrity: sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-map@5.5.0: + resolution: {integrity: sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==} + engines: {node: '>=12'} + + p-timeout@5.1.0: + resolution: {integrity: sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==} + engines: {node: '>=12'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-color@1.0.0: + resolution: {integrity: sha512-fuDHYgFHJGbpGMgw9skY/bj3HL/Jrn4l/5rSspy00DoT4RyLnDcRvPxdZ+r6OFwIsgAuhDh4I09tAId4mI12bw==} + + parse-ms@3.0.0: + resolution: {integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==} + engines: {node: '>=12'} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + passport-custom@1.1.1: + resolution: {integrity: sha512-/2m7jUGxmCYvoqenLB9UrmkCgPt64h8ZtV+UtuQklZ/Tn1NpKBeOorCYkB/8lMRoiZ5hUrCoMmDtxCS/d38mlg==} + engines: {node: '>= 0.10.0'} + + passport-oauth2@1.8.0: + resolution: {integrity: sha512-cjsQbOrXIDE4P8nNb3FQRCCmJJ/utnFKEz2NX209f7KOHPoX18gF7gBzBbLLsj2/je4KrgiwLLGjf0lm9rtTBA==} + engines: {node: '>= 0.4.0'} + + passport-strategy@1.0.0: + resolution: {integrity: sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==} + engines: {node: '>= 0.4.0'} + + passport@0.6.0: + resolution: {integrity: sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==} + engines: {node: '>= 0.4.0'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pause-stream@0.0.11: + resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==} + + pause@0.0.1: + resolution: {integrity: sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pino-abstract-transport@2.0.0: + resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} + + pino-std-serializers@7.0.0: + resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} + + pino@9.14.0: + resolution: {integrity: sha512-8OEwKp5juEvb/MjpIc4hjqfgCNysrS94RIOMXYvpYCdm/jglrKEiAYmiumbmGhCvs+IcInsphYDFwqrjr7398w==} + hasBin: true + + pkg-conf@4.0.0: + resolution: {integrity: sha512-7dmgi4UY4qk+4mj5Cd8v/GExPo0K+SlY+hulOSdfZ/T6jVH6//y7NtzZo5WrfhDBxuQ0jCa7fLZmNaNh7EWL/w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + pkg-up@3.1.0: + resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} + engines: {node: '>=8'} + + plur@5.1.0: + resolution: {integrity: sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + postcss-nesting@13.0.2: + resolution: {integrity: sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-selector-parser@7.1.0: + resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} + engines: {node: '>=4'} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-plugin-organize-imports@3.2.4: + resolution: {integrity: sha512-6m8WBhIp0dfwu0SkgfOxJqh+HpdyfqSSLfKKRZSFbDuEQXDDndb8fTpRWkUrX/uBenkex3MgnVk0J3b3Y5byog==} + peerDependencies: + '@volar/vue-language-plugin-pug': ^1.0.4 + '@volar/vue-typescript': ^1.0.4 + prettier: '>=2.0' + typescript: '>=2.9' + peerDependenciesMeta: + '@volar/vue-language-plugin-pug': + optional: true + '@volar/vue-typescript': + optional: true + + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + engines: {node: '>=14'} + hasBin: true + + pretty-ms@8.0.0: + resolution: {integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==} + engines: {node: '>=14.16'} + + process-warning@3.0.0: + resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} + + process-warning@5.0.0: + resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + ps-tree@1.2.0: + resolution: {integrity: sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==} + engines: {node: '>= 0.10'} + hasBin: true + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + + redis@5.9.0: + resolution: {integrity: sha512-E8dQVLSyH6UE/C9darFuwq4usOPrqfZ1864kI4RFbr5Oj9ioB9qPF0oJMwX7s8mf6sPYrz84x/Dx1PGF3/0EaQ==} + engines: {node: '>= 18'} + + reflect-metadata@0.1.14: + resolution: {integrity: sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==} + + regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} + hasBin: true + + regexp-worker@1.1.1: + resolution: {integrity: sha512-FpHJ2gdS6VI0LF+HkksqkugJqlPZwxXW8xRRCWBrx/wh2MQnYsST0WUHCe36WqGk/KpLo9DEaLVzjl3CvxPDEw==} + engines: {node: '>= 12.0.0'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resize-observer-polyfill@1.5.1: + resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + ret@0.4.3: + resolution: {integrity: sha512-0f4Memo5QP7WQyUEAYUO3esD/XjOc3Zjjg5CPsAq1p8sIu0XPeMbHJemKA0BO7tV0X7+A0FoEpbmHXWxPyD3wQ==} + engines: {node: '>=10'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rolldown-vite@7.1.20: + resolution: {integrity: sha512-iXo6JzhBnNl+MY5Wky2Qr4RnB1gLJ3798YUMC3uBXSjCDM/bV+ALcnm5M23eOy9Nldi18aUioLpTB/PtqvwSZQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + esbuild: ^0.25.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + rolldown@1.0.0-beta.45: + resolution: {integrity: sha512-iMmuD72XXLf26Tqrv1cryNYLX6NNPLhZ3AmNkSf8+xda0H+yijjGJ+wVT9UdBUHOpKzq9RjKtQKRCWoEKQQBZQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex2@3.1.0: + resolution: {integrity: sha512-RAAZAGbap2kBfbVhvmnTFv73NWLMvDGOITFYTZBAaY8eR+Ir4ef7Up/e7amo+y1+AH+3PtLkrt9mvcTsG9LXug==} + + safe-regex@2.1.1: + resolution: {integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==} + + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + + seedrandom@3.0.5: + resolution: {integrity: sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==} + + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + engines: {node: '>= 0.8.0'} + + seq-queue@0.0.5: + resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} + + serialize-error@7.0.1: + resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} + engines: {node: '>=10'} + + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + engines: {node: '>= 0.8.0'} + + set-cookie-parser@2.7.1: + resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + sha.js@2.4.12: + resolution: {integrity: sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==} + engines: {node: '>= 0.10'} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + + slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + + sonic-boom@4.2.0: + resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + split@0.3.3: + resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + sql-highlight@6.1.0: + resolution: {integrity: sha512-ed7OK4e9ywpE7pgRMkMQmZDPKSVdm0oX5IEtZiKnFucSF0zu6c80GZBe38UqHuVhTWJ9xsKgSMjCG2bml86KvA==} + engines: {node: '>=14'} + + sqlstring@2.3.3: + resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} + engines: {node: '>= 0.6'} + + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + stream-combiner@0.0.4: + resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==} + + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-combining-marks@1.0.0: + resolution: {integrity: sha512-8YrtmJKxvDmMIoJMOyvh/s3Oe8TxolM5ThgZPmE39vvkfXVuOHAUyiZ1yOZUxDg/kb1QLRyZ0CfQQqeTISAeTA==} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + supertap@3.0.1: + resolution: {integrity: sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + tailwindcss@4.1.16: + resolution: {integrity: sha512-pONL5awpaQX4LN5eiv7moSiSPd/DLDzKVRJz8Q9PgzmAdd1R4307GQS2ZpfiN7ZmekdQrfhZZiSE5jkLR4WNaA==} + + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + engines: {node: '>=6'} + + temp-dir@3.0.0: + resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} + engines: {node: '>=14.16'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + thread-stream@3.1.0: + resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} + + threads@1.7.0: + resolution: {integrity: sha512-Mx5NBSHX3sQYR6iI9VYbgHKBLisyB+xROCBGjjWm1O9wb9vfLxdaGtmT/KCjUqMsSNW6nERzCW3T6H43LqjDZQ==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + time-zone@1.0.0: + resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==} + engines: {node: '>=4'} + + tiny-worker@2.3.0: + resolution: {integrity: sha512-pJ70wq5EAqTAEl9IkGzA+fN0836rycEuz2Cn6yeZ6FRzlVS5IDOkFHpIoEsksPRQV34GDqXm65+OlnZqUSyK2g==} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + tlds@1.261.0: + resolution: {integrity: sha512-QXqwfEl9ddlGBaRFXIvNKK6OhipSiLXuRuLJX5DErz0o0Q0rYxulWLdFryTkV5PkdZct5iMInwYEGe/eR++1AA==} + hasBin: true + + tmp@0.2.5: + resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} + engines: {node: '>=14.14'} + + to-buffer@1.2.2: + resolution: {integrity: sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==} + engines: {node: '>= 0.4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toad-cache@3.7.0: + resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==} + engines: {node: '>=12'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + ts-essentials@10.1.1: + resolution: {integrity: sha512-4aTB7KLHKmUvkjNj8V+EdnmuVTiECzn3K+zIbRthumvHu+j44x3w63xpfs0JL3NGIzGXqoQ7AV591xHO+XrOTw==} + peerDependencies: + typescript: '>=4.5.0' + peerDependenciesMeta: + typescript: + optional: true + + ts-mixer@6.0.4: + resolution: {integrity: sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==} + + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + ts-toolbelt@9.6.0: + resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==} + + tsc-watch@6.3.1: + resolution: {integrity: sha512-x1hNJ/m1Cln2OvNJJLPsnWI1pObm+Jq9jF6kyz0flEy/ym7Y9TvU9edg6lXLuGVkhDClwBWi8aWAFE0qgzEkzw==} + engines: {node: '>=12.12.0'} + hasBin: true + peerDependencies: + typescript: '*' + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsutils@3.21.0: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + + twemoji-parser@12.1.3: + resolution: {integrity: sha512-ND4LZXF4X92/PFrzSgGkq6KPPg8swy/U0yRw1k/+izWRVmq1HYi3khPwV3XIB6FRudgVICAaBhJfW8e8G3HC7Q==} + + twemoji@12.1.6: + resolution: {integrity: sha512-FIKi9Jne5IiDGDWekoANJ1a8ltUKVbJLEIR8XUpbFRDMqIPgLWnYgjeWZ1KOrdiTztRCAa9x4v+5w5OuiJOGVw==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + + typeorm@0.3.27: + resolution: {integrity: sha512-pNV1bn+1n8qEe8tUNsNdD8ejuPcMAg47u2lUGnbsajiNUr3p2Js1XLKQjBMH0yMRMDfdX8T+fIRejFmIwy9x4A==} + engines: {node: '>=16.13.0'} + hasBin: true + peerDependencies: + '@google-cloud/spanner': ^5.18.0 || ^6.0.0 || ^7.0.0 + '@sap/hana-client': ^2.14.22 + better-sqlite3: ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0 + ioredis: ^5.0.4 + mongodb: ^5.8.0 || ^6.0.0 + mssql: ^9.1.1 || ^10.0.1 || ^11.0.1 + mysql2: ^2.2.5 || ^3.0.1 + oracledb: ^6.3.0 + pg: ^8.5.1 + pg-native: ^3.0.0 + pg-query-stream: ^4.0.0 + redis: ^3.1.1 || ^4.0.0 || ^5.0.14 + reflect-metadata: ^0.1.14 || ^0.2.0 + sql.js: ^1.4.0 + sqlite3: ^5.0.3 + ts-node: ^10.7.0 + typeorm-aurora-data-api-driver: ^2.0.0 || ^3.0.0 + peerDependenciesMeta: + '@google-cloud/spanner': + optional: true + '@sap/hana-client': + optional: true + better-sqlite3: + optional: true + ioredis: + optional: true + mongodb: + optional: true + mssql: + optional: true + mysql2: + optional: true + oracledb: + optional: true + pg: + optional: true + pg-native: + optional: true + pg-query-stream: + optional: true + redis: + optional: true + sql.js: + optional: true + sqlite3: + optional: true + ts-node: + optional: true + typeorm-aurora-data-api-driver: + optional: true + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + uid2@0.0.4: + resolution: {integrity: sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA==} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + undici@6.21.3: + resolution: {integrity: sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==} + engines: {node: '>=18.17'} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + utf-8-validate@5.0.10: + resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} + engines: {node: '>=6.14.2'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + uuid@11.1.0: + resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + hasBin: true + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vety@1.0.0-rc2: + resolution: {integrity: sha512-mpV+nrZtnOgS+A8+b+iT4hc1R0nYx+ufNBnYQWZuBjcgMwtdymENHWiUbiqlcKA1rQF3rK9wk5+zj0+XeCiPyQ==} + engines: {node: '>=22'} + + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + + vue-material-design-icons@5.3.1: + resolution: {integrity: sha512-6UNEyhlTzlCeT8ZeX5WbpUGFTTPSbOoTQeoASTv7X4Ylh0pe8vltj+36VMK56KM0gG8EQVoMK/Qw/6evalg8lA==} + + vue-router@4.6.3: + resolution: {integrity: sha512-ARBedLm9YlbvQomnmq91Os7ck6efydTSpRP3nuOKCvgJOHNrhRoJDSKtee8kcL1Vf7nz6U+PMBL+hTvR3bTVQg==} + peerDependencies: + vue: ^3.5.0 + + vue-tsc@2.2.12: + resolution: {integrity: sha512-P7OP77b2h/Pmk+lZdJ0YWs+5tJ6J2+uOQPo7tlBnY44QqQSPYvS0qVT4wqDJgwrZaLe47etJLLQRFia71GYITw==} + hasBin: true + peerDependencies: + typescript: '>=5.0.0' + + vue3-ace-editor@2.2.4: + resolution: {integrity: sha512-FZkEyfpbH068BwjhMyNROxfEI8135Sc+x8ouxkMdCNkuj/Tuw83VP/gStFQqZHqljyX9/VfMTCdTqtOnJZGN8g==} + peerDependencies: + ace-builds: '*' + vue: ^3 + + vue3-highlightjs@1.0.5: + resolution: {integrity: sha512-Q4YNPXu0X5VMBnwPVOk+IQf1Ohp9jFdMitEAmzaz8qVVefcQpN6Dx4BnDGKxja3TLDVF+EgL136wC8YzmoCX9w==} + peerDependencies: + vue: ^3.0.0 + + vue@3.5.22: + resolution: {integrity: sha512-toaZjQ3a/G/mYaLSbV+QsQhIdMo9x5rrqIpYRObsJ6T/J+RyCSFwN2LHNVH9v8uIcljDNa3QzPVdv3Y6b9hAJQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + vuex@4.1.0: + resolution: {integrity: sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ==} + peerDependencies: + vue: ^3.2.0 + + well-known-symbols@2.0.0: + resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} + engines: {node: '>=6'} + + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.2.1: + resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} + engines: {node: '>=12.20'} + + zod@4.1.12: + resolution: {integrity: sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==} + +snapshots: + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/parser@7.28.5': + dependencies: + '@babel/types': 7.28.5 + + '@babel/types@7.28.5': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@csstools/selector-resolve-nested@3.1.0(postcss-selector-parser@7.1.0)': + dependencies: + postcss-selector-parser: 7.1.0 + + '@csstools/selector-specificity@5.0.0(postcss-selector-parser@7.1.0)': + dependencies: + postcss-selector-parser: 7.1.0 + + '@discordjs/builders@1.13.0': + dependencies: + '@discordjs/formatters': 0.6.1 + '@discordjs/util': 1.1.1 + '@sapphire/shapeshift': 4.0.0 + discord-api-types: 0.38.30 + fast-deep-equal: 3.1.3 + ts-mixer: 6.0.4 + tslib: 2.8.1 + + '@discordjs/collection@1.5.3': {} + + '@discordjs/collection@2.1.1': {} + + '@discordjs/formatters@0.6.1': + dependencies: + discord-api-types: 0.38.30 + + '@discordjs/rest@2.6.0': + dependencies: + '@discordjs/collection': 2.1.1 + '@discordjs/util': 1.1.1 + '@sapphire/async-queue': 1.5.5 + '@sapphire/snowflake': 3.5.3 + '@vladfrangu/async_event_emitter': 2.4.7 + discord-api-types: 0.38.30 + magic-bytes.js: 1.12.1 + tslib: 2.8.1 + undici: 6.21.3 + + '@discordjs/util@1.1.1': {} + + '@discordjs/ws@1.2.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + dependencies: + '@discordjs/collection': 2.1.1 + '@discordjs/rest': 2.6.0 + '@discordjs/util': 1.1.1 + '@sapphire/async-queue': 1.5.5 + '@types/ws': 8.18.1 + '@vladfrangu/async_event_emitter': 2.4.7 + discord-api-types: 0.38.30 + tslib: 2.8.1 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@emnapi/core@1.6.0': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.6.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@eslint-community/eslint-utils@4.9.0(eslint@8.57.1)': + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.4.3 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.1': {} + + '@fastify/accept-negotiator@1.1.0': {} + + '@fastify/ajv-compiler@3.6.0': + dependencies: + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + fast-uri: 2.4.0 + + '@fastify/error@3.4.1': {} + + '@fastify/fast-json-stringify-compiler@4.3.0': + dependencies: + fast-json-stringify: 5.16.1 + + '@fastify/merge-json-schemas@0.1.1': + dependencies: + fast-deep-equal: 3.1.3 + + '@fastify/send@2.1.0': + dependencies: + '@lukeed/ms': 2.0.2 + escape-html: 1.0.3 + fast-decode-uri-component: 1.0.1 + http-errors: 2.0.0 + mime: 3.0.0 + + '@fastify/static@7.0.4': + dependencies: + '@fastify/accept-negotiator': 1.1.0 + '@fastify/send': 2.1.0 + content-disposition: 0.5.4 + fastify-plugin: 4.5.1 + fastq: 1.19.1 + glob: 10.4.5 + + '@humanwhocodes/config-array@0.13.0': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.3 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.2 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@lukeed/ms@2.0.2': {} + + '@napi-rs/wasm-runtime@1.0.7': + dependencies: + '@emnapi/core': 1.6.0 + '@emnapi/runtime': 1.6.0 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@oxc-project/runtime@0.95.0': {} + + '@oxc-project/types@0.95.0': {} + + '@pinojs/redact@0.4.0': {} + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@redis/bloom@5.9.0(@redis/client@5.9.0)': + dependencies: + '@redis/client': 5.9.0 + + '@redis/client@5.9.0': + dependencies: + cluster-key-slot: 1.1.2 + + '@redis/json@5.9.0(@redis/client@5.9.0)': + dependencies: + '@redis/client': 5.9.0 + + '@redis/search@5.9.0(@redis/client@5.9.0)': + dependencies: + '@redis/client': 5.9.0 + + '@redis/time-series@5.9.0(@redis/client@5.9.0)': + dependencies: + '@redis/client': 5.9.0 + + '@rolldown/binding-android-arm64@1.0.0-beta.45': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-beta.45': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-beta.45': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-beta.45': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.45': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.45': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.45': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.45': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.45': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.45': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.45': + dependencies: + '@napi-rs/wasm-runtime': 1.0.7 + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.45': + optional: true + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.45': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.45': + optional: true + + '@rolldown/pluginutils@1.0.0-beta.45': {} + + '@sapphire/async-queue@1.5.5': {} + + '@sapphire/shapeshift@4.0.0': + dependencies: + fast-deep-equal: 3.1.3 + lodash: 4.17.21 + + '@sapphire/snowflake@3.5.3': {} + + '@silvia-odwyer/photon-node@0.3.4': {} + + '@sqltools/formatter@1.2.5': {} + + '@tailwindcss/node@4.1.16': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.18.3 + jiti: 2.6.1 + lightningcss: 1.30.2 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.1.16 + + '@tailwindcss/oxide-android-arm64@4.1.16': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.1.16': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.1.16': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.1.16': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.16': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.16': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.1.16': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.1.16': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.1.16': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.1.16': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.16': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.1.16': + optional: true + + '@tailwindcss/oxide@4.1.16': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.16 + '@tailwindcss/oxide-darwin-arm64': 4.1.16 + '@tailwindcss/oxide-darwin-x64': 4.1.16 + '@tailwindcss/oxide-freebsd-x64': 4.1.16 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.16 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.16 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.16 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.16 + '@tailwindcss/oxide-linux-x64-musl': 4.1.16 + '@tailwindcss/oxide-wasm32-wasi': 4.1.16 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.16 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.16 + + '@tailwindcss/vite@4.1.16(rolldown-vite@7.1.20(@types/node@22.18.13)(jiti@2.6.1))': + dependencies: + '@tailwindcss/node': 4.1.16 + '@tailwindcss/oxide': 4.1.16 + tailwindcss: 4.1.16 + vite: rolldown-vite@7.1.20(@types/node@22.18.13)(jiti@2.6.1) + + '@tsconfig/node10@1.0.11': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/body-parser@1.19.6': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 22.18.12 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 22.18.12 + + '@types/cors@2.8.19': + dependencies: + '@types/node': 22.18.12 + + '@types/express-serve-static-core@4.19.7': + dependencies: + '@types/node': 22.18.12 + '@types/qs': 6.14.0 + '@types/range-parser': 1.2.7 + '@types/send': 1.2.1 + + '@types/express@4.17.24': + dependencies: + '@types/body-parser': 1.19.6 + '@types/express-serve-static-core': 4.19.7 + '@types/qs': 6.14.0 + '@types/serve-static': 1.15.10 + + '@types/http-errors@2.0.5': {} + + '@types/js-yaml@3.12.10': {} + + '@types/json-schema@7.0.15': {} + + '@types/json5@0.0.29': {} + + '@types/lodash-es@4.17.12': + dependencies: + '@types/lodash': 4.17.20 + + '@types/lodash@4.17.20': {} + + '@types/mime@1.3.5': {} + + '@types/multer@1.4.13': + dependencies: + '@types/express': 4.17.24 + + '@types/node@22.18.12': + dependencies: + undici-types: 6.21.0 + + '@types/node@22.18.13': + dependencies: + undici-types: 6.21.0 + + '@types/oauth@0.9.6': + dependencies: + '@types/node': 22.18.12 + + '@types/passport-oauth2@1.8.0': + dependencies: + '@types/express': 4.17.24 + '@types/oauth': 0.9.6 + '@types/passport': 1.0.17 + + '@types/passport-strategy@0.2.38': + dependencies: + '@types/express': 4.17.24 + '@types/passport': 1.0.17 + + '@types/passport@1.0.17': + dependencies: + '@types/express': 4.17.24 + + '@types/qs@6.14.0': {} + + '@types/range-parser@1.2.7': {} + + '@types/safe-regex@1.1.6': {} + + '@types/semver@7.7.1': {} + + '@types/send@0.17.6': + dependencies: + '@types/mime': 1.3.5 + '@types/node': 22.18.12 + + '@types/send@1.2.1': + dependencies: + '@types/node': 22.18.12 + + '@types/serve-static@1.15.10': + dependencies: + '@types/http-errors': 2.0.5 + '@types/node': 22.18.12 + '@types/send': 0.17.6 + + '@types/tmp@0.0.33': {} + + '@types/twemoji@12.1.2': {} + + '@types/uuid@9.0.8': {} + + '@types/ws@8.18.1': + dependencies: + '@types/node': 22.18.12 + + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.9.3) + debug: 4.4.3 + eslint: 8.57.1 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare-lite: 1.4.0 + semver: 7.7.3 + tsutils: 3.21.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.9.3) + debug: 4.4.3 + eslint: 8.57.1 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + + '@typescript-eslint/type-utils@5.62.0(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.9.3) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.9.3) + debug: 4.4.3 + eslint: 8.57.1 + tsutils: 3.21.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@5.62.0': {} + + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.4.3 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.7.3 + tsutils: 3.21.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@5.62.0(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) + '@types/json-schema': 7.0.15 + '@types/semver': 7.7.1 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.9.3) + eslint: 8.57.1 + eslint-scope: 5.1.1 + semver: 7.7.3 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + + '@ungap/structured-clone@1.3.0': {} + + '@vitejs/plugin-vue@5.2.4(rolldown-vite@7.1.20(@types/node@22.18.13)(jiti@2.6.1))(vue@3.5.22(typescript@5.9.3))': + dependencies: + vite: rolldown-vite@7.1.20(@types/node@22.18.13)(jiti@2.6.1) + vue: 3.5.22(typescript@5.9.3) + + '@vladfrangu/async_event_emitter@2.4.7': {} + + '@volar/language-core@2.4.15': + dependencies: + '@volar/source-map': 2.4.15 + + '@volar/source-map@2.4.15': {} + + '@volar/typescript@2.4.15': + dependencies: + '@volar/language-core': 2.4.15 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + + '@vue/compiler-core@3.5.22': + dependencies: + '@babel/parser': 7.28.5 + '@vue/shared': 3.5.22 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.22': + dependencies: + '@vue/compiler-core': 3.5.22 + '@vue/shared': 3.5.22 + + '@vue/compiler-sfc@3.5.22': + dependencies: + '@babel/parser': 7.28.5 + '@vue/compiler-core': 3.5.22 + '@vue/compiler-dom': 3.5.22 + '@vue/compiler-ssr': 3.5.22 + '@vue/shared': 3.5.22 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.6 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.22': + dependencies: + '@vue/compiler-dom': 3.5.22 + '@vue/shared': 3.5.22 + + '@vue/compiler-vue2@2.7.16': + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + + '@vue/devtools-api@6.6.4': {} + + '@vue/language-core@2.2.12(typescript@5.9.3)': + dependencies: + '@volar/language-core': 2.4.15 + '@vue/compiler-dom': 3.5.22 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.5.22 + alien-signals: 1.0.13 + minimatch: 9.0.5 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + optionalDependencies: + typescript: 5.9.3 + + '@vue/reactivity@3.5.22': + dependencies: + '@vue/shared': 3.5.22 + + '@vue/runtime-core@3.5.22': + dependencies: + '@vue/reactivity': 3.5.22 + '@vue/shared': 3.5.22 + + '@vue/runtime-dom@3.5.22': + dependencies: + '@vue/reactivity': 3.5.22 + '@vue/runtime-core': 3.5.22 + '@vue/shared': 3.5.22 + csstype: 3.1.3 + + '@vue/server-renderer@3.5.22(vue@3.5.22(typescript@5.9.3))': + dependencies: + '@vue/compiler-ssr': 3.5.22 + '@vue/shared': 3.5.22 + vue: 3.5.22(typescript@5.9.3) + + '@vue/shared@3.5.22': {} + + '@vue/tsconfig@0.7.0(typescript@5.9.3)(vue@3.5.22(typescript@5.9.3))': + optionalDependencies: + typescript: 5.9.3 + vue: 3.5.22(typescript@5.9.3) + + abstract-logging@2.0.1: {} + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + ace-builds@1.43.4: {} + + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn-walk@8.3.4: + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + aggregate-error@4.0.1: + dependencies: + clean-stack: 4.2.0 + indent-string: 5.0.0 + + ajv-formats@2.1.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv-formats@3.0.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + alien-signals@1.0.13: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.3: {} + + ansis@3.17.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + app-root-path@3.1.0: {} + + append-field@1.0.0: {} + + arg@4.1.3: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + array-find-index@1.0.2: {} + + array-flatten@1.1.1: {} + + array-union@2.1.0: {} + + arrgv@1.0.2: {} + + arrify@3.0.0: {} + + atomic-sleep@1.0.0: {} + + ava@5.3.1: + dependencies: + acorn: 8.15.0 + acorn-walk: 8.3.4 + ansi-styles: 6.2.3 + arrgv: 1.0.2 + arrify: 3.0.0 + callsites: 4.2.0 + cbor: 8.1.0 + chalk: 5.6.2 + chokidar: 3.6.0 + chunkd: 2.0.1 + ci-info: 3.9.0 + ci-parallel-vars: 1.0.1 + clean-yaml-object: 0.1.0 + cli-truncate: 3.1.0 + code-excerpt: 4.0.0 + common-path-prefix: 3.0.0 + concordance: 5.0.4 + currently-unhandled: 0.4.1 + debug: 4.4.3 + emittery: 1.2.0 + figures: 5.0.0 + globby: 13.2.2 + ignore-by-default: 2.1.0 + indent-string: 5.0.0 + is-error: 2.2.2 + is-plain-object: 5.0.0 + is-promise: 4.0.0 + matcher: 5.0.0 + mem: 9.0.2 + ms: 2.1.3 + p-event: 5.0.1 + p-map: 5.5.0 + picomatch: 2.3.1 + pkg-conf: 4.0.0 + plur: 5.1.0 + pretty-ms: 8.0.0 + resolve-cwd: 3.0.0 + stack-utils: 2.0.6 + strip-ansi: 7.1.2 + supertap: 3.0.1 + temp-dir: 3.0.0 + write-file-atomic: 5.0.1 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + avvio@8.4.0: + dependencies: + '@fastify/error': 3.4.1 + fastq: 1.19.1 + + aws-ssl-profiles@1.1.2: {} + + balanced-match@1.0.2: {} + + base64-js@1.5.1: {} + + base64url@3.0.1: {} + + binary-extensions@2.3.0: {} + + blueimp-md5@2.19.0: {} + + body-parser@1.20.3: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.13.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + buffer-from@1.1.2: {} + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bufferutil@4.0.9: + dependencies: + node-gyp-build: 4.8.4 + + busboy@1.6.0: + dependencies: + streamsearch: 1.1.0 + + bytes@3.1.2: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + callsites@4.2.0: {} + + cbor@8.1.0: + dependencies: + nofilter: 3.1.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.6.2: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chunkd@2.0.1: {} + + ci-info@3.9.0: {} + + ci-parallel-vars@1.0.1: {} + + clean-stack@4.2.0: + dependencies: + escape-string-regexp: 5.0.0 + + clean-yaml-object@0.1.0: {} + + cli-truncate@3.1.0: + dependencies: + slice-ansi: 5.0.0 + string-width: 5.1.2 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + cluster-key-slot@1.1.2: {} + + code-excerpt@4.0.0: + dependencies: + convert-to-spaces: 2.0.1 + + color-convert@0.5.3: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + common-path-prefix@3.0.0: {} + + concat-map@0.0.1: {} + + concat-stream@2.0.0: + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + typedarray: 0.0.6 + + concordance@5.0.4: + dependencies: + date-time: 3.1.0 + esutils: 2.0.3 + fast-diff: 1.3.0 + js-string-escape: 1.0.1 + lodash: 4.17.21 + md5-hex: 3.0.1 + semver: 7.7.3 + well-known-symbols: 2.0.0 + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + convert-to-spaces@2.0.1: {} + + cookie-signature@1.0.6: {} + + cookie@0.7.1: {} + + cookie@0.7.2: {} + + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + create-require@1.1.1: {} + + cross-env@7.0.3: + dependencies: + cross-spawn: 7.0.6 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + cssesc@3.0.0: {} + + csstype@3.1.3: {} + + currently-unhandled@0.4.1: + dependencies: + array-find-index: 1.0.2 + + date-time@3.1.0: + dependencies: + time-zone: 1.0.0 + + dayjs@1.11.18: {} + + de-indent@1.0.2: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + dedent@1.7.0: {} + + deep-diff@1.0.2: {} + + deep-is@0.1.4: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + denque@2.1.0: {} + + depd@2.0.0: {} + + destroy@1.2.0: {} + + detect-libc@2.1.2: {} + + diff@4.0.2: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + discord-api-types@0.38.30: {} + + discord.js@14.23.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): + dependencies: + '@discordjs/builders': 1.13.0 + '@discordjs/collection': 1.5.3 + '@discordjs/formatters': 0.6.1 + '@discordjs/rest': 2.6.0 + '@discordjs/util': 1.1.1 + '@discordjs/ws': 1.2.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@sapphire/snowflake': 3.5.3 + discord-api-types: 0.38.30 + fast-deep-equal: 3.1.3 + lodash.snakecase: 4.1.1 + magic-bytes.js: 1.12.1 + tslib: 2.8.1 + undici: 6.21.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dotenv@16.6.1: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + duplexer@0.1.2: {} + + eastasianwidth@0.2.0: {} + + ee-first@1.1.1: {} + + emittery@1.2.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + encodeurl@1.0.2: {} + + encodeurl@2.0.0: {} + + enhanced-resolve@5.18.3: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.0 + + entities@4.5.0: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@2.0.0: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + eslint-config-prettier@8.10.2(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.1: + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.2 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.3.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + esm@3.2.25: + optional: true + + espree@9.6.1: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 3.4.3 + + esprima@4.0.1: {} + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + esutils@2.0.3: {} + + etag@1.8.1: {} + + event-stream@3.3.4: + dependencies: + duplexer: 0.1.2 + from: 0.1.7 + map-stream: 0.1.0 + pause-stream: 0.0.11 + split: 0.3.3 + stream-combiner: 0.0.4 + through: 2.3.8 + + express@4.21.2: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.3 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.7.1 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.3.1 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.3 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.12 + proxy-addr: 2.0.7 + qs: 6.13.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.19.0 + serve-static: 1.16.2 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + fast-content-type-parse@1.1.0: {} + + fast-decode-uri-component@1.0.1: {} + + fast-deep-equal@3.1.3: {} + + fast-diff@1.3.0: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-json-stringify@5.16.1: + dependencies: + '@fastify/merge-json-schemas': 0.1.1 + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + fast-deep-equal: 3.1.3 + fast-uri: 2.4.0 + json-schema-ref-resolver: 1.0.1 + rfdc: 1.4.1 + + fast-levenshtein@2.0.6: {} + + fast-querystring@1.1.2: + dependencies: + fast-decode-uri-component: 1.0.1 + + fast-uri@2.4.0: {} + + fast-uri@3.1.0: {} + + fastify-plugin@4.5.1: {} + + fastify@4.29.1: + dependencies: + '@fastify/ajv-compiler': 3.6.0 + '@fastify/error': 3.4.1 + '@fastify/fast-json-stringify-compiler': 4.3.0 + abstract-logging: 2.0.1 + avvio: 8.4.0 + fast-content-type-parse: 1.1.0 + fast-json-stringify: 5.16.1 + find-my-way: 8.2.2 + light-my-request: 5.14.0 + pino: 9.14.0 + process-warning: 3.0.0 + proxy-addr: 2.0.7 + rfdc: 1.4.1 + secure-json-parse: 2.7.0 + semver: 7.7.3 + toad-cache: 3.7.0 + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + figures@5.0.0: + dependencies: + escape-string-regexp: 5.0.0 + is-unicode-supported: 1.3.0 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@1.3.1: + dependencies: + debug: 2.6.9 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + find-my-way@8.2.2: + dependencies: + fast-deep-equal: 3.1.3 + fast-querystring: 1.1.2 + safe-regex2: 3.1.0 + + find-up@3.0.0: + dependencies: + locate-path: 3.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + find-up@6.3.0: + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + rimraf: 3.0.2 + + flatted@3.3.3: {} + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + forwarded@0.2.0: {} + + fp-ts@2.16.11: {} + + fresh@0.5.2: {} + + from@0.1.7: {} + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + generate-function@2.3.1: + dependencies: + is-property: 1.0.2 + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + globby@13.2.2: + dependencies: + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 4.0.0 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + highlight.js@10.7.3: {} + + highlight.js@11.11.1: {} + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + humanize-duration@3.33.1: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + iconv-lite@0.7.0: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + ignore-by-default@2.1.0: {} + + ignore@5.3.2: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + indent-string@5.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ipaddr.js@1.9.1: {} + + irregular-plurals@3.5.0: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-callable@1.2.7: {} + + is-error@2.2.2: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-fullwidth-code-point@4.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-observable@2.1.0: {} + + is-path-inside@3.0.3: {} + + is-plain-object@5.0.0: {} + + is-promise@4.0.0: {} + + is-property@1.0.2: {} + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.19 + + is-unicode-supported@1.3.0: {} + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jiti@2.6.1: {} + + js-string-escape@1.0.1: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + json-buffer@3.0.1: {} + + json-schema-ref-resolver@1.0.1: + dependencies: + fast-deep-equal: 3.1.3 + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + jsonfile@5.0.0: + dependencies: + universalify: 0.1.2 + optionalDependencies: + graceful-fs: 4.2.11 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + knub-command-manager@9.1.0: + dependencies: + escape-string-regexp: 2.0.0 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + light-my-request@5.14.0: + dependencies: + cookie: 0.7.2 + process-warning: 3.0.0 + set-cookie-parser: 2.7.1 + + lightningcss-android-arm64@1.30.2: + optional: true + + lightningcss-darwin-arm64@1.30.2: + optional: true + + lightningcss-darwin-x64@1.30.2: + optional: true + + lightningcss-freebsd-x64@1.30.2: + optional: true + + lightningcss-linux-arm-gnueabihf@1.30.2: + optional: true + + lightningcss-linux-arm64-gnu@1.30.2: + optional: true + + lightningcss-linux-arm64-musl@1.30.2: + optional: true + + lightningcss-linux-x64-gnu@1.30.2: + optional: true + + lightningcss-linux-x64-musl@1.30.2: + optional: true + + lightningcss-win32-arm64-msvc@1.30.2: + optional: true + + lightningcss-win32-x64-msvc@1.30.2: + optional: true + + lightningcss@1.30.2: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.30.2 + lightningcss-darwin-arm64: 1.30.2 + lightningcss-darwin-x64: 1.30.2 + lightningcss-freebsd-x64: 1.30.2 + lightningcss-linux-arm-gnueabihf: 1.30.2 + lightningcss-linux-arm64-gnu: 1.30.2 + lightningcss-linux-arm64-musl: 1.30.2 + lightningcss-linux-x64-gnu: 1.30.2 + lightningcss-linux-x64-musl: 1.30.2 + lightningcss-win32-arm64-msvc: 1.30.2 + lightningcss-win32-x64-msvc: 1.30.2 + + load-json-file@7.0.1: {} + + locate-path@3.0.0: + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + locate-path@7.2.0: + dependencies: + p-locate: 6.0.0 + + lodash-es@4.17.21: {} + + lodash.merge@4.6.2: {} + + lodash.snakecase@4.1.1: {} + + lodash@4.17.21: {} + + long@5.3.2: {} + + lru-cache@10.4.3: {} + + lru-cache@7.18.3: {} + + lru.min@1.1.2: {} + + magic-bytes.js@1.12.1: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + make-error@1.3.6: {} + + map-age-cleaner@0.1.3: + dependencies: + p-defer: 1.0.0 + + map-stream@0.1.0: {} + + marked@5.1.2: {} + + matcher@5.0.0: + dependencies: + escape-string-regexp: 5.0.0 + + math-intrinsics@1.1.0: {} + + md5-hex@3.0.1: + dependencies: + blueimp-md5: 2.19.0 + + media-typer@0.3.0: {} + + mem@9.0.2: + dependencies: + map-age-cleaner: 0.1.3 + mimic-fn: 4.0.0 + + merge-descriptors@1.0.3: {} + + merge2@1.4.1: {} + + methods@1.1.2: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: {} + + mime@3.0.0: {} + + mimic-fn@4.0.0: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + mkdirp@0.5.6: + dependencies: + minimist: 1.2.8 + + moment-timezone@0.5.48: + dependencies: + moment: 2.30.1 + + moment@2.30.1: {} + + ms@2.0.0: {} + + ms@2.1.3: {} + + muggle-string@0.4.1: {} + + multer@2.0.2: + dependencies: + append-field: 1.0.0 + busboy: 1.6.0 + concat-stream: 2.0.0 + mkdirp: 0.5.6 + object-assign: 4.1.1 + type-is: 1.6.18 + xtend: 4.0.2 + + mysql2@3.15.3: + dependencies: + aws-ssl-profiles: 1.1.2 + denque: 2.1.0 + generate-function: 2.3.1 + iconv-lite: 0.7.0 + long: 5.3.2 + lru.min: 1.1.2 + named-placeholders: 1.1.3 + seq-queue: 0.0.5 + sqlstring: 2.3.3 + + named-placeholders@1.1.3: + dependencies: + lru-cache: 7.18.3 + + nanoid@3.3.11: {} + + natural-compare-lite@1.4.0: {} + + natural-compare@1.4.0: {} + + negotiator@0.6.3: {} + + node-cleanup@2.1.2: {} + + node-gyp-build@4.8.4: {} + + nofilter@3.1.0: {} + + normalize-path@3.0.0: {} + + oauth@0.10.2: {} + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + observable-fns@0.6.1: {} + + on-exit-leak-free@2.1.2: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-defer@1.0.0: {} + + p-event@5.0.1: + dependencies: + p-timeout: 5.1.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-limit@4.0.0: + dependencies: + yocto-queue: 1.2.1 + + p-locate@3.0.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-locate@6.0.0: + dependencies: + p-limit: 4.0.0 + + p-map@5.5.0: + dependencies: + aggregate-error: 4.0.1 + + p-timeout@5.1.0: {} + + p-try@2.2.0: {} + + package-json-from-dist@1.0.1: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-color@1.0.0: + dependencies: + color-convert: 0.5.3 + + parse-ms@3.0.0: {} + + parseurl@1.3.3: {} + + passport-custom@1.1.1: + dependencies: + passport-strategy: 1.0.0 + + passport-oauth2@1.8.0: + dependencies: + base64url: 3.0.1 + oauth: 0.10.2 + passport-strategy: 1.0.0 + uid2: 0.0.4 + utils-merge: 1.0.1 + + passport-strategy@1.0.0: {} + + passport@0.6.0: + dependencies: + passport-strategy: 1.0.0 + pause: 0.0.1 + utils-merge: 1.0.1 + + path-browserify@1.0.1: {} + + path-exists@3.0.0: {} + + path-exists@4.0.0: {} + + path-exists@5.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-to-regexp@0.1.12: {} + + path-type@4.0.0: {} + + pause-stream@0.0.11: + dependencies: + through: 2.3.8 + + pause@0.0.1: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.3: {} + + pino-abstract-transport@2.0.0: + dependencies: + split2: 4.2.0 + + pino-std-serializers@7.0.0: {} + + pino@9.14.0: + dependencies: + '@pinojs/redact': 0.4.0 + atomic-sleep: 1.0.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 2.0.0 + pino-std-serializers: 7.0.0 + process-warning: 5.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 4.2.0 + thread-stream: 3.1.0 + + pkg-conf@4.0.0: + dependencies: + find-up: 6.3.0 + load-json-file: 7.0.1 + + pkg-up@3.1.0: + dependencies: + find-up: 3.0.0 + + plur@5.1.0: + dependencies: + irregular-plurals: 3.5.0 + + possible-typed-array-names@1.1.0: {} + + postcss-nesting@13.0.2(postcss@8.5.6): + dependencies: + '@csstools/selector-resolve-nested': 3.1.0(postcss-selector-parser@7.1.0) + '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.0) + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + postcss-selector-parser@7.1.0: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + prettier-plugin-organize-imports@3.2.4(prettier@3.6.2)(typescript@5.9.3): + dependencies: + prettier: 3.6.2 + typescript: 5.9.3 + + prettier@3.6.2: {} + + pretty-ms@8.0.0: + dependencies: + parse-ms: 3.0.0 + + process-warning@3.0.0: {} + + process-warning@5.0.0: {} + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + ps-tree@1.2.0: + dependencies: + event-stream: 3.3.4 + + punycode@2.3.1: {} + + qs@6.13.0: + dependencies: + side-channel: 1.1.0 + + queue-microtask@1.2.3: {} + + quick-format-unescaped@4.0.4: {} + + range-parser@1.2.1: {} + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + real-require@0.2.0: {} + + redis@5.9.0: + dependencies: + '@redis/bloom': 5.9.0(@redis/client@5.9.0) + '@redis/client': 5.9.0 + '@redis/json': 5.9.0(@redis/client@5.9.0) + '@redis/search': 5.9.0(@redis/client@5.9.0) + '@redis/time-series': 5.9.0(@redis/client@5.9.0) + + reflect-metadata@0.1.14: {} + + regexp-tree@0.1.27: {} + + regexp-worker@1.1.1: {} + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + resize-observer-polyfill@1.5.1: {} + + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + ret@0.4.3: {} + + reusify@1.1.0: {} + + rfdc@1.4.1: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + rolldown-vite@7.1.20(@types/node@22.18.13)(jiti@2.6.1): + dependencies: + '@oxc-project/runtime': 0.95.0 + fdir: 6.5.0(picomatch@4.0.3) + lightningcss: 1.30.2 + picomatch: 4.0.3 + postcss: 8.5.6 + rolldown: 1.0.0-beta.45 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 22.18.13 + fsevents: 2.3.3 + jiti: 2.6.1 + + rolldown@1.0.0-beta.45: + dependencies: + '@oxc-project/types': 0.95.0 + '@rolldown/pluginutils': 1.0.0-beta.45 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-beta.45 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.45 + '@rolldown/binding-darwin-x64': 1.0.0-beta.45 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.45 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.45 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.45 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.45 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.45 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.45 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.45 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.45 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.45 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.45 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.45 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-regex2@3.1.0: + dependencies: + ret: 0.4.3 + + safe-regex@2.1.1: + dependencies: + regexp-tree: 0.1.27 + + safe-stable-stringify@2.5.0: {} + + safer-buffer@2.1.2: {} + + secure-json-parse@2.7.0: {} + + seedrandom@3.0.5: {} + + semver@7.7.3: {} + + send@0.19.0: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + seq-queue@0.0.5: {} + + serialize-error@7.0.1: + dependencies: + type-fest: 0.13.1 + + serve-static@1.16.2: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.0 + transitivePeerDependencies: + - supports-color + + set-cookie-parser@2.7.1: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + setprototypeof@1.2.0: {} + + sha.js@2.4.12: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + to-buffer: 1.2.2 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@4.1.0: {} + + slash@3.0.0: {} + + slash@4.0.0: {} + + slice-ansi@5.0.0: + dependencies: + ansi-styles: 6.2.3 + is-fullwidth-code-point: 4.0.0 + + sonic-boom@4.2.0: + dependencies: + atomic-sleep: 1.0.0 + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + split2@4.2.0: {} + + split@0.3.3: + dependencies: + through: 2.3.8 + + sprintf-js@1.0.3: {} + + sql-highlight@6.1.0: {} + + sqlstring@2.3.3: {} + + stack-utils@2.0.6: + dependencies: + escape-string-regexp: 2.0.0 + + statuses@2.0.1: {} + + stream-combiner@0.0.4: + dependencies: + duplexer: 0.1.2 + + streamsearch@1.1.0: {} + + string-argv@0.3.2: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.2 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + + strip-bom@3.0.0: {} + + strip-combining-marks@1.0.0: {} + + strip-json-comments@3.1.1: {} + + supertap@3.0.1: + dependencies: + indent-string: 5.0.0 + js-yaml: 3.14.1 + serialize-error: 7.0.1 + strip-ansi: 7.1.2 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + tailwindcss@4.1.16: {} + + tapable@2.3.0: {} + + temp-dir@3.0.0: {} + + text-table@0.2.0: {} + + thread-stream@3.1.0: + dependencies: + real-require: 0.2.0 + + threads@1.7.0: + dependencies: + callsites: 3.1.0 + debug: 4.4.3 + is-observable: 2.1.0 + observable-fns: 0.6.1 + optionalDependencies: + tiny-worker: 2.3.0 + transitivePeerDependencies: + - supports-color + + through@2.3.8: {} + + time-zone@1.0.0: {} + + tiny-worker@2.3.0: + dependencies: + esm: 3.2.25 + optional: true + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tlds@1.261.0: {} + + tmp@0.2.5: {} + + to-buffer@1.2.2: + dependencies: + isarray: 2.0.5 + safe-buffer: 5.2.1 + typed-array-buffer: 1.0.3 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toad-cache@3.7.0: {} + + toidentifier@1.0.1: {} + + ts-essentials@10.1.1(typescript@5.9.3): + optionalDependencies: + typescript: 5.9.3 + + ts-mixer@6.0.4: {} + + ts-node@10.9.2(@types/node@22.18.13)(typescript@5.9.3): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 22.18.13 + acorn: 8.15.0 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.9.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + ts-toolbelt@9.6.0: {} + + tsc-watch@6.3.1(typescript@5.9.3): + dependencies: + cross-spawn: 7.0.6 + node-cleanup: 2.1.2 + ps-tree: 1.2.0 + string-argv: 0.3.2 + typescript: 5.9.3 + + tsconfig-paths@3.15.0: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tslib@1.14.1: {} + + tslib@2.8.1: {} + + tsutils@3.21.0(typescript@5.9.3): + dependencies: + tslib: 1.14.1 + typescript: 5.9.3 + + twemoji-parser@12.1.3: {} + + twemoji@12.1.6: + dependencies: + fs-extra: 8.1.0 + jsonfile: 5.0.0 + twemoji-parser: 12.1.3 + universalify: 0.1.2 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.13.1: {} + + type-fest@0.20.2: {} + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typedarray@0.0.6: {} + + typeorm@0.3.27(mysql2@3.15.3)(redis@5.9.0)(reflect-metadata@0.1.14)(ts-node@10.9.2(@types/node@22.18.13)(typescript@5.9.3)): + dependencies: + '@sqltools/formatter': 1.2.5 + ansis: 3.17.0 + app-root-path: 3.1.0 + buffer: 6.0.3 + dayjs: 1.11.18 + debug: 4.4.3 + dedent: 1.7.0 + dotenv: 16.6.1 + glob: 10.4.5 + reflect-metadata: 0.1.14 + sha.js: 2.4.12 + sql-highlight: 6.1.0 + tslib: 2.8.1 + uuid: 11.1.0 + yargs: 17.7.2 + optionalDependencies: + mysql2: 3.15.3 + redis: 5.9.0 + ts-node: 10.9.2(@types/node@22.18.13)(typescript@5.9.3) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + typescript@5.9.3: {} + + uid2@0.0.4: {} + + undici-types@6.21.0: {} + + undici@6.21.3: {} + + universalify@0.1.2: {} + + unpipe@1.0.0: {} + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + utf-8-validate@5.0.10: + dependencies: + node-gyp-build: 4.8.4 + + util-deprecate@1.0.2: {} + + utils-merge@1.0.1: {} + + uuid@11.1.0: {} + + uuid@9.0.1: {} + + v8-compile-cache-lib@3.0.1: {} + + vary@1.1.2: {} + + vety@1.0.0-rc2(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10): + dependencies: + discord.js: 14.23.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + knub-command-manager: 9.1.0 + ts-essentials: 10.1.1(typescript@5.9.3) + zod: 4.1.12 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + + vscode-uri@3.1.0: {} + + vue-material-design-icons@5.3.1: {} + + vue-router@4.6.3(vue@3.5.22(typescript@5.9.3)): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.22(typescript@5.9.3) + + vue-tsc@2.2.12(typescript@5.9.3): + dependencies: + '@volar/typescript': 2.4.15 + '@vue/language-core': 2.2.12(typescript@5.9.3) + typescript: 5.9.3 + + vue3-ace-editor@2.2.4(ace-builds@1.43.4)(vue@3.5.22(typescript@5.9.3)): + dependencies: + ace-builds: 1.43.4 + resize-observer-polyfill: 1.5.1 + vue: 3.5.22(typescript@5.9.3) + + vue3-highlightjs@1.0.5(vue@3.5.22(typescript@5.9.3)): + dependencies: + highlight.js: 10.7.3 + vue: 3.5.22(typescript@5.9.3) + + vue@3.5.22(typescript@5.9.3): + dependencies: + '@vue/compiler-dom': 3.5.22 + '@vue/compiler-sfc': 3.5.22 + '@vue/runtime-dom': 3.5.22 + '@vue/server-renderer': 3.5.22(vue@3.5.22(typescript@5.9.3)) + '@vue/shared': 3.5.22 + optionalDependencies: + typescript: 5.9.3 + + vuex@4.1.0(vue@3.5.22(typescript@5.9.3)): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.22(typescript@5.9.3) + + well-known-symbols@2.0.0: {} + + which-typed-array@1.1.19: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.1.2 + + wrappy@1.0.2: {} + + write-file-atomic@5.0.1: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + + ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 + + xtend@4.0.2: {} + + y18n@5.0.8: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yn@3.1.1: {} + + yocto-queue@0.1.0: {} + + yocto-queue@1.2.1: {} + + zod@4.1.12: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 000000000..cd8208117 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,14 @@ +packages: + - 'backend' + - 'shared' + - 'dashboard' + +minimumReleaseAge: 20160 # in minutes (2 weeks) +minimumReleaseAgeExclude: + - 'vety' + - 'knub-command-manager' + +overrides: + # Keep in sync with Vety's discord.js version + discord.js: "14.23.2" + discord-api-types: "0.38.30"