From 56dde4126b0ce686937f879ecc46442c870009d0 Mon Sep 17 00:00:00 2001 From: Jarvis Date: Sun, 5 Apr 2026 16:38:37 -0500 Subject: [PATCH] fix: bootstrap DTO class erasure + wizard failure + port prefill + Pi SDK copy (IUV-M01, #436) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Bug 1 [CRITICAL]: drop `import type` on BootstrapSetupDto in bootstrap.controller.ts so NestJS preserves the class reference for design:paramtypes; ValidationPipe now correctly validates the DTO instead of 400ing on every field. Add e2e integration test (bootstrap.e2e.spec.ts) via @nestjs/testing + supertest that exercises the real DI/Fastify binding path to guard against regressions. Configure vitest to use unplugin-swc with decoratorMetadata:true. - Bug 2: remove `&& headlessRun` guard in wizard.ts so bootstrap failure (completed:false) aborts with process.exit(1) in both interactive and headless modes — no more silent '✔ Wizard complete' after a 400. - Bug 3: add `initialValue` to WizardPrompter.text() interface, ClackPrompter, and HeadlessPrompter; use it in gateway-config.ts promptPort() so 14242 prefills the input buffer and users can press Enter to accept. Apply same pattern to other gateway config prompts (databaseUrl, valkeyUrl, corsOrigin). - Bug 4: add Pi SDK to the 'What is Mosaic?' intro copy in welcome.ts. - Bump @mosaicstack/mosaic 0.0.25 → 0.0.26. Co-Authored-By: Claude Sonnet 4.6 --- apps/gateway/package.json | 6 + .../gateway/src/admin/bootstrap.controller.ts | 3 +- apps/gateway/src/admin/bootstrap.e2e.spec.ts | 190 +++++++++ apps/gateway/tsconfig.json | 2 +- apps/gateway/vitest.config.ts | 19 + packages/mosaic/package.json | 2 +- .../mosaic/src/prompter/clack-prompter.ts | 2 + .../mosaic/src/prompter/headless-prompter.ts | 9 +- packages/mosaic/src/prompter/interface.ts | 2 + packages/mosaic/src/stages/gateway-config.ts | 7 + packages/mosaic/src/stages/welcome.ts | 2 +- packages/mosaic/src/wizard.ts | 4 +- pnpm-lock.yaml | 377 +++++++++++++++++- 13 files changed, 608 insertions(+), 17 deletions(-) create mode 100644 apps/gateway/src/admin/bootstrap.e2e.spec.ts diff --git a/apps/gateway/package.json b/apps/gateway/package.json index 616ce68..0264e32 100644 --- a/apps/gateway/package.json +++ b/apps/gateway/package.json @@ -72,11 +72,17 @@ "zod": "^4.3.6" }, "devDependencies": { + "@nestjs/testing": "^11.1.18", + "@swc/core": "^1.15.24", + "@swc/helpers": "^0.5.21", "@types/node": "^22.0.0", "@types/node-cron": "^3.0.11", + "@types/supertest": "^7.2.0", "@types/uuid": "^10.0.0", + "supertest": "^7.2.2", "tsx": "^4.0.0", "typescript": "^5.8.0", + "unplugin-swc": "^1.5.9", "vitest": "^2.0.0" } } diff --git a/apps/gateway/src/admin/bootstrap.controller.ts b/apps/gateway/src/admin/bootstrap.controller.ts index 3d8b1a9..a5bf36d 100644 --- a/apps/gateway/src/admin/bootstrap.controller.ts +++ b/apps/gateway/src/admin/bootstrap.controller.ts @@ -13,7 +13,8 @@ import type { Auth } from '@mosaicstack/auth'; import { v4 as uuid } from 'uuid'; import { AUTH } from '../auth/auth.tokens.js'; import { DB } from '../database/database.module.js'; -import type { BootstrapSetupDto, BootstrapStatusDto, BootstrapResultDto } from './bootstrap.dto.js'; +import { BootstrapSetupDto } from './bootstrap.dto.js'; +import type { BootstrapStatusDto, BootstrapResultDto } from './bootstrap.dto.js'; @Controller('api/bootstrap') export class BootstrapController { diff --git a/apps/gateway/src/admin/bootstrap.e2e.spec.ts b/apps/gateway/src/admin/bootstrap.e2e.spec.ts new file mode 100644 index 0000000..cbfb14e --- /dev/null +++ b/apps/gateway/src/admin/bootstrap.e2e.spec.ts @@ -0,0 +1,190 @@ +/** + * E2E integration test — POST /api/bootstrap/setup + * + * Regression guard for the `import type { BootstrapSetupDto }` class-erasure + * bug (IUV-M01, issue #436). + * + * When `BootstrapSetupDto` is imported with `import type`, TypeScript erases + * the class at compile time. NestJS then sees `Object` as the `@Body()` + * metatype, and ValidationPipe with `whitelist:true + forbidNonWhitelisted:true` + * treats every property as non-whitelisted, returning: + * + * 400 { message: ["property email should not exist", "property password should not exist"] } + * + * The fix is a plain value import (`import { BootstrapSetupDto }`), which + * preserves the class reference so Nest can read the class-validator decorators. + * + * This test MUST fail if `import type` is re-introduced on `BootstrapSetupDto`. + * A controller unit test that constructs ValidationPipe manually won't catch + * this — only the real DI binding path exercises the metatype lookup. + */ + +import 'reflect-metadata'; +import { describe, it, expect, afterAll, beforeAll } from 'vitest'; +import { Test } from '@nestjs/testing'; +import { ValidationPipe, type INestApplication } from '@nestjs/common'; +import { FastifyAdapter, type NestFastifyApplication } from '@nestjs/platform-fastify'; +import request from 'supertest'; +import { BootstrapController } from './bootstrap.controller.js'; +import type { BootstrapResultDto } from './bootstrap.dto.js'; + +// ─── Minimal mock dependencies ─────────────────────────────────────────────── + +/** + * We use explicit `@Inject(AUTH)` / `@Inject(DB)` in the controller so we + * can provide mock values by token without spinning up the real DB or Auth. + */ +import { AUTH } from '../auth/auth.tokens.js'; +import { DB } from '../database/database.module.js'; + +const MOCK_USER_ID = 'mock-user-id-001'; + +const mockAuth = { + api: { + createUser: () => + Promise.resolve({ + user: { + id: MOCK_USER_ID, + name: 'Admin', + email: 'admin@example.com', + }, + }), + }, +}; + +// Override db.select() so the second query (verify user exists) returns a user. +// The bootstrap controller calls select().from() twice: +// 1. count() to check zero users → returns [{total: 0}] +// 2. select().where().limit() → returns [the created user] +let selectCallCount = 0; +const mockDbWithUser = { + select: () => { + selectCallCount++; + return { + from: () => { + if (selectCallCount === 1) { + // First call: count — zero users + return Promise.resolve([{ total: 0 }]); + } + // Subsequent calls: return a mock user row + return { + where: () => ({ + limit: () => + Promise.resolve([ + { + id: MOCK_USER_ID, + name: 'Admin', + email: 'admin@example.com', + role: 'admin', + }, + ]), + }), + }; + }, + }; + }, + update: () => ({ + set: () => ({ + where: () => Promise.resolve([]), + }), + }), + insert: () => ({ + values: () => ({ + returning: () => + Promise.resolve([ + { + id: 'token-id-001', + label: 'Initial setup token', + }, + ]), + }), + }), +}; + +// ─── Test suite ─────────────────────────────────────────────────────────────── + +describe('POST /api/bootstrap/setup — ValidationPipe DTO binding', () => { + let app: INestApplication; + + beforeAll(async () => { + selectCallCount = 0; + + const moduleRef = await Test.createTestingModule({ + controllers: [BootstrapController], + providers: [ + { provide: AUTH, useValue: mockAuth }, + { provide: DB, useValue: mockDbWithUser }, + ], + }).compile(); + + app = moduleRef.createNestApplication(new FastifyAdapter()); + + // Mirror main.ts configuration exactly — this is what reproduced the 400. + app.useGlobalPipes( + new ValidationPipe({ + whitelist: true, + forbidNonWhitelisted: true, + transform: true, + }), + ); + + await app.init(); + // Fastify requires waiting for the adapter to be ready + await app.getHttpAdapter().getInstance().ready(); + }); + + afterAll(async () => { + await app.close(); + }); + + it('returns 201 (not 400) when a valid {name, email, password} body is sent', async () => { + const res = await request(app.getHttpServer()) + .post('/api/bootstrap/setup') + .send({ name: 'Admin', email: 'admin@example.com', password: 'password123' }) + .set('Content-Type', 'application/json'); + + // Before the fix (import type), Nest ValidationPipe returned 400 with + // "property email should not exist" / "property password should not exist" + // because the DTO class was erased and every field looked non-whitelisted. + expect(res.status).not.toBe(400); + expect(res.status).toBe(201); + const body = res.body as BootstrapResultDto; + expect(body.user).toBeDefined(); + expect(body.user.email).toBe('admin@example.com'); + expect(body.token).toBeDefined(); + expect(body.token.plaintext).toBeDefined(); + }); + + it('returns 400 when extra forbidden properties are sent', async () => { + // This proves ValidationPipe IS active and working (forbidNonWhitelisted). + const res = await request(app.getHttpServer()) + .post('/api/bootstrap/setup') + .send({ + name: 'Admin', + email: 'admin@example.com', + password: 'password123', + extraField: 'should-be-rejected', + }) + .set('Content-Type', 'application/json'); + + expect(res.status).toBe(400); + }); + + it('returns 400 when email is invalid', async () => { + const res = await request(app.getHttpServer()) + .post('/api/bootstrap/setup') + .send({ name: 'Admin', email: 'not-an-email', password: 'password123' }) + .set('Content-Type', 'application/json'); + + expect(res.status).toBe(400); + }); + + it('returns 400 when password is too short', async () => { + const res = await request(app.getHttpServer()) + .post('/api/bootstrap/setup') + .send({ name: 'Admin', email: 'admin@example.com', password: 'short' }) + .set('Content-Type', 'application/json'); + + expect(res.status).toBe(400); + }); +}); diff --git a/apps/gateway/tsconfig.json b/apps/gateway/tsconfig.json index b6f1494..135e768 100644 --- a/apps/gateway/tsconfig.json +++ b/apps/gateway/tsconfig.json @@ -8,6 +8,6 @@ "module": "NodeNext", "moduleResolution": "NodeNext" }, - "include": ["src/**/*"], + "include": ["src/**/*", "vitest.config.ts"], "exclude": ["node_modules", "dist"] } diff --git a/apps/gateway/vitest.config.ts b/apps/gateway/vitest.config.ts index 8e730d5..c1b852d 100644 --- a/apps/gateway/vitest.config.ts +++ b/apps/gateway/vitest.config.ts @@ -1,3 +1,4 @@ +import swc from 'unplugin-swc'; import { defineConfig } from 'vitest/config'; export default defineConfig({ @@ -5,4 +6,22 @@ export default defineConfig({ globals: true, environment: 'node', }, + plugins: [ + swc.vite({ + jsc: { + parser: { + syntax: 'typescript', + decorators: true, + }, + transform: { + decoratorMetadata: true, + legacyDecorator: true, + }, + target: 'es2022', + }, + module: { + type: 'nodenext', + }, + }), + ], }); diff --git a/packages/mosaic/package.json b/packages/mosaic/package.json index 8aa442c..59a3134 100644 --- a/packages/mosaic/package.json +++ b/packages/mosaic/package.json @@ -1,6 +1,6 @@ { "name": "@mosaicstack/mosaic", - "version": "0.0.25", + "version": "0.0.26", "repository": { "type": "git", "url": "https://git.mosaicstack.dev/mosaicstack/mosaic-stack.git", diff --git a/packages/mosaic/src/prompter/clack-prompter.ts b/packages/mosaic/src/prompter/clack-prompter.ts index cefce6a..f05c940 100644 --- a/packages/mosaic/src/prompter/clack-prompter.ts +++ b/packages/mosaic/src/prompter/clack-prompter.ts @@ -39,6 +39,7 @@ export class ClackPrompter implements WizardPrompter { message: string; placeholder?: string; defaultValue?: string; + initialValue?: string; validate?: (value: string) => string | void; }): Promise { const validate = opts.validate @@ -51,6 +52,7 @@ export class ClackPrompter implements WizardPrompter { message: opts.message, placeholder: opts.placeholder, defaultValue: opts.defaultValue, + initialValue: opts.initialValue, validate, }); return guardCancel(result); diff --git a/packages/mosaic/src/prompter/headless-prompter.ts b/packages/mosaic/src/prompter/headless-prompter.ts index 1241ecb..de50027 100644 --- a/packages/mosaic/src/prompter/headless-prompter.ts +++ b/packages/mosaic/src/prompter/headless-prompter.ts @@ -35,15 +35,18 @@ export class HeadlessPrompter implements WizardPrompter { message: string; placeholder?: string; defaultValue?: string; + initialValue?: string; validate?: (value: string) => string | void; }): Promise { const answer = this.answers.get(opts.message); const value = typeof answer === 'string' ? answer - : opts.defaultValue !== undefined - ? opts.defaultValue - : undefined; + : opts.initialValue !== undefined + ? opts.initialValue + : opts.defaultValue !== undefined + ? opts.defaultValue + : undefined; if (value === undefined) { throw new Error(`HeadlessPrompter: no answer for "${opts.message}"`); diff --git a/packages/mosaic/src/prompter/interface.ts b/packages/mosaic/src/prompter/interface.ts index 211c437..1ba0d14 100644 --- a/packages/mosaic/src/prompter/interface.ts +++ b/packages/mosaic/src/prompter/interface.ts @@ -24,6 +24,8 @@ export interface WizardPrompter { message: string; placeholder?: string; defaultValue?: string; + /** Prefills the input buffer so the user sees the value and can press Enter to accept. */ + initialValue?: string; validate?: (value: string) => string | void; }): Promise; diff --git a/packages/mosaic/src/stages/gateway-config.ts b/packages/mosaic/src/stages/gateway-config.ts index 88b1fd0..0af2159 100644 --- a/packages/mosaic/src/stages/gateway-config.ts +++ b/packages/mosaic/src/stages/gateway-config.ts @@ -77,6 +77,10 @@ async function promptTier(p: WizardPrompter): Promise { async function promptPort(p: WizardPrompter, defaultPort: number): Promise { const raw = await p.text({ message: 'Gateway port', + // initialValue prefills the input buffer so the user sees 14242 and can + // press Enter to accept it. defaultValue is only used when the user submits + // an empty string, which never shows in the field. + initialValue: defaultPort.toString(), defaultValue: defaultPort.toString(), validate: (v) => { const n = parseInt(v, 10); @@ -423,10 +427,12 @@ async function collectAndWriteConfig( if (tier === 'team') { databaseUrl = await p.text({ message: 'DATABASE_URL', + initialValue: 'postgresql://mosaic:mosaic@localhost:5433/mosaic', defaultValue: 'postgresql://mosaic:mosaic@localhost:5433/mosaic', }); valkeyUrl = await p.text({ message: 'VALKEY_URL', + initialValue: 'redis://localhost:6380', defaultValue: 'redis://localhost:6380', }); } @@ -438,6 +444,7 @@ async function collectAndWriteConfig( corsOrigin = await p.text({ message: 'CORS origin', + initialValue: 'http://localhost:3000', defaultValue: 'http://localhost:3000', }); } diff --git a/packages/mosaic/src/stages/welcome.ts b/packages/mosaic/src/stages/welcome.ts index de0f1d0..4a8d3ed 100644 --- a/packages/mosaic/src/stages/welcome.ts +++ b/packages/mosaic/src/stages/welcome.ts @@ -7,7 +7,7 @@ export async function welcomeStage(p: WizardPrompter, _state: WizardState): Prom p.note( `Mosaic is an agent framework that gives AI coding assistants\n` + `a persistent identity, shared skills, and structured workflows.\n\n` + - `It works with Claude Code, Codex, and OpenCode.\n\n` + + `It works with Claude Code, Codex, OpenCode, and Pi SDK.\n\n` + `All config is stored locally in ~/.config/mosaic/.\n` + `No data is sent anywhere. No accounts required.`, 'What is Mosaic?', diff --git a/packages/mosaic/src/wizard.ts b/packages/mosaic/src/wizard.ts index 2f5e640..ed4ac90 100644 --- a/packages/mosaic/src/wizard.ts +++ b/packages/mosaic/src/wizard.ts @@ -144,8 +144,8 @@ export async function runWizard(options: WizardOptions): Promise { host: configResult.host, port: configResult.port, }); - if (!bootstrapResult.completed && headlessRun) { - prompter.warn('Admin bootstrap failed in headless mode — aborting wizard.'); + if (!bootstrapResult.completed) { + prompter.warn('Admin bootstrap failed — aborting wizard.'); process.exit(1); } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ba52099..15eb594 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -174,21 +174,39 @@ importers: specifier: ^4.3.6 version: 4.3.6 devDependencies: + '@nestjs/testing': + specifier: ^11.1.18 + version: 11.1.18(@nestjs/common@11.1.16(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.16) + '@swc/core': + specifier: ^1.15.24 + version: 1.15.24(@swc/helpers@0.5.21) + '@swc/helpers': + specifier: ^0.5.21 + version: 0.5.21 '@types/node': specifier: ^22.0.0 version: 22.19.15 '@types/node-cron': specifier: ^3.0.11 version: 3.0.11 + '@types/supertest': + specifier: ^7.2.0 + version: 7.2.0 '@types/uuid': specifier: ^10.0.0 version: 10.0.0 + supertest: + specifier: ^7.2.2 + version: 7.2.2 tsx: specifier: ^4.0.0 version: 4.21.0 typescript: specifier: ^5.8.0 version: 5.9.3 + unplugin-swc: + specifier: ^1.5.9 + version: 1.5.9(@swc/core@1.15.24(@swc/helpers@0.5.21))(rollup@4.59.0) vitest: specifier: ^2.0.0 version: 2.1.9(@types/node@22.19.15)(jsdom@29.0.0(@noble/hashes@2.0.1))(lightningcss@1.31.1) @@ -2309,6 +2327,19 @@ packages: '@nestjs/websockets': ^11.0.0 rxjs: ^7.1.0 + '@nestjs/testing@11.1.18': + resolution: {integrity: sha512-frzwNlpBgtAzI3hp/qo57DZoRO4RMTH1wST3QUYEhRTHyfPkLpzkWz3jV/mhApXjD0yT56Ptlzn6zuYPLh87Lw==} + peerDependencies: + '@nestjs/common': ^11.0.0 + '@nestjs/core': ^11.0.0 + '@nestjs/microservices': ^11.0.0 + '@nestjs/platform-express': ^11.0.0 + peerDependenciesMeta: + '@nestjs/microservices': + optional: true + '@nestjs/platform-express': + optional: true + '@nestjs/throttler@6.5.0': resolution: {integrity: sha512-9j0ZRfH0QE1qyrj9JjIRDz5gQLPqq9yVC2nHsrosDVAfI5HHw08/aUAWx9DZLSdQf4HDkmhTTEGLrRFHENvchQ==} peerDependencies: @@ -2383,6 +2414,10 @@ packages: resolution: {integrity: sha512-bysYuiVfhxNJuldNXlFEitTVdNnYUc+XNJZd7Qm2a5j1vZHgY+fazadNFWFaMK/2vye0JVlxV3gHmC0WDfAOQw==} engines: {node: '>= 20.19.0'} + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} + '@noble/hashes@2.0.1': resolution: {integrity: sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==} engines: {node: '>= 20.19.0'} @@ -3007,6 +3042,9 @@ packages: peerDependencies: '@opentelemetry/api': ^1.1.0 + '@paralleldrive/cuid2@2.3.1': + resolution: {integrity: sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==} + '@pinojs/redact@0.4.0': resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} @@ -3049,6 +3087,15 @@ packages: '@protobufjs/utf8@1.1.0': resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + '@rollup/rollup-android-arm-eabi@4.59.0': resolution: {integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==} cpu: [arm] @@ -3390,9 +3437,99 @@ packages: '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@swc/core-darwin-arm64@1.15.24': + resolution: {integrity: sha512-uM5ZGfFXjtvtJ+fe448PVBEbn/CSxS3UAyLj3O9xOqKIWy3S6hPTXSPbszxkSsGDYKi+YFhzAsR4r/eXLxEQ0g==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-x64@1.15.24': + resolution: {integrity: sha512-fMIb/Zfn929pw25VMBhV7Ji2Dl+lCWtUPNdYJQYOke+00E5fcQ9ynxtP8+qhUo/HZc+mYQb1gJxwHM9vty+lXg==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-linux-arm-gnueabihf@1.15.24': + resolution: {integrity: sha512-vOkjsyjjxnoYx3hMEWcGxQrMgnNrRm6WAegBXrN8foHtDAR+zpdhpGF5a4lj1bNPgXAvmysjui8cM1ov/Clkaw==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.15.24': + resolution: {integrity: sha512-h/oNu+upkXJ6Cicnq7YGVj9PkdfarLCdQa8l/FlHYvfv8CEiMaeeTnpLU7gSBH/rGxosM6Qkfa/J9mThGF9CLA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-arm64-musl@1.15.24': + resolution: {integrity: sha512-ZpF/pRe1guk6sKzQI9D1jAORtjTdNlyeXn9GDz8ophof/w2WhojRblvSDJaGe7rJjcPN8AaOkhwdRUh7q8oYIg==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-ppc64-gnu@1.15.24': + resolution: {integrity: sha512-QZEsZfisHTSJlmyChgDFNmKPb3W6Lhbfo/O76HhIngfEdnQNmukS38/VSe1feho+xkV5A5hETyCbx3sALBZKAQ==} + engines: {node: '>=10'} + cpu: [ppc64] + os: [linux] + + '@swc/core-linux-s390x-gnu@1.15.24': + resolution: {integrity: sha512-DLdJKVsJgglqQrJBuoUYNmzm3leI7kUZhLbZGHv42onfKsGf6JDS3+bzCUQfte/XOqDjh/tmmn1DR/CF/tCJFw==} + engines: {node: '>=10'} + cpu: [s390x] + os: [linux] + + '@swc/core-linux-x64-gnu@1.15.24': + resolution: {integrity: sha512-IpLYfposPA/XLxYOKpRfeccl1p5dDa3+okZDHHTchBkXEaVCnq5MADPmIWwIYj1tudt7hORsEHccG5no6IUQRw==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-linux-x64-musl@1.15.24': + resolution: {integrity: sha512-JHy3fMSc0t/EPWgo74+OK5TGr51aElnzqfUPaiRf2qJ/BfX5CUCfMiWVBuhI7qmVMBnk1jTRnL/xZnOSHDPLYg==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-win32-arm64-msvc@1.15.24': + resolution: {integrity: sha512-Txj+qUH1z2bUd1P3JvwByfjKFti3cptlAxhWgmunBUUxy/IW3CXLZ6l6Gk4liANadKkU71nIU1X30Z5vpMT3BA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.15.24': + resolution: {integrity: sha512-15D/nl3XwrhFpMv+MADFOiVwv3FvH9j8c6Rf8EXBT3Q5LoMh8YnDnSgPYqw1JzPnksvsBX6QPXLiPqmcR/Z4qQ==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-x64-msvc@1.15.24': + resolution: {integrity: sha512-PR0PlTlPra2JbaDphrOAzm6s0v9rA0F17YzB+XbWD95B4g2cWcZY9LAeTa4xll70VLw9Jr7xBrlohqlQmelMFQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core@1.15.24': + resolution: {integrity: sha512-5Hj8aNasue7yusUt8LGCUe/AjM7RMAce8ZoyDyiFwx7Al+GbYKL+yE7g4sJk8vEr1dKIkTRARkNIJENc4CjkBQ==} + engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': '>=0.5.17' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + '@swc/helpers@0.5.21': + resolution: {integrity: sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg==} + + '@swc/types@0.1.26': + resolution: {integrity: sha512-lyMwd7WGgG79RS7EERZV3T8wMdmPq3xwyg+1nmAM64kIhx5yl+juO2PYIHb7vTiPgPCj8LYjsNV2T5wiQHUEaw==} + '@tailwindcss/node@4.2.1': resolution: {integrity: sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg==} @@ -3506,6 +3643,9 @@ packages: '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + '@types/cookiejar@2.1.5': + resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} + '@types/cors@2.8.19': resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} @@ -3536,6 +3676,9 @@ packages: '@types/memcached@2.2.10': resolution: {integrity: sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg==} + '@types/methods@1.1.4': + resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} + '@types/mime-types@2.1.4': resolution: {integrity: sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==} @@ -3580,6 +3723,12 @@ packages: '@types/retry@0.12.0': resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} + '@types/superagent@8.1.9': + resolution: {integrity: sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==} + + '@types/supertest@7.2.0': + resolution: {integrity: sha512-uh2Lv57xvggst6lCqNdFAmDSvoMG7M/HDtX4iUCquxQ5EGPtaPM5PL5Hmi7LCvOG8db7YaCPNJEeoI8s/WzIQw==} + '@types/tedious@4.0.14': resolution: {integrity: sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==} @@ -3788,6 +3937,9 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -4129,6 +4281,9 @@ packages: resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} engines: {node: '>=20'} + component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -4160,6 +4315,9 @@ packages: resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} engines: {node: '>=18'} + cookiejar@2.1.4: + resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} + core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -4268,6 +4426,9 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dezalgo@1.0.4: + resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} + diff@8.0.3: resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==} engines: {node: '>=0.3.1'} @@ -4573,6 +4734,9 @@ packages: estree-util-is-identifier-name@3.0.0: resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} @@ -4751,6 +4915,10 @@ packages: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} + formidable@3.5.4: + resolution: {integrity: sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==} + engines: {node: '>=14.0.0'} + forwarded-parse@2.1.2: resolution: {integrity: sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==} @@ -5324,6 +5492,10 @@ packages: resolution: {integrity: sha512-v5xlu8eHD1+6r8EHTg6hfmO97LN8ugKtiXcy5e6oN72iD2r6u0RPfLl6fxM+7Wnh2ZRq15o0russMst44WauPA==} engines: {node: '>=13.2.0'} + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -5462,6 +5634,10 @@ packages: merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + micromark-core-commonmark@2.0.3: resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} @@ -5545,6 +5721,11 @@ packages: resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} engines: {node: '>=18'} + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -6502,6 +6683,14 @@ packages: babel-plugin-macros: optional: true + superagent@10.3.0: + resolution: {integrity: sha512-B+4Ik7ROgVKrQsXTV0Jwp2u+PXYLSlqtDAhYnkkD+zn3yg8s/zjA2MeGayPoY/KICrbitwneDHrjSotxKL+0XQ==} + engines: {node: '>=14.18.0'} + + supertest@7.2.2: + resolution: {integrity: sha512-oK8WG9diS3DlhdUkcFn4tkNIiIbBx9lI2ClF8K+b2/m8Eyv47LSawxUzZQSNKUrVb2KsqeTDCcjAAVPYaSLVTA==} + engines: {node: '>=14.18.0'} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -6758,6 +6947,15 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} + unplugin-swc@1.5.9: + resolution: {integrity: sha512-RKwK3yf0M+MN17xZfF14bdKqfx0zMXYdtOdxLiE6jHAoidupKq3jGdJYANyIM1X/VmABhh1WpdO+/f4+Ol89+g==} + peerDependencies: + '@swc/core': ^1.2.108 + + unplugin@2.3.11: + resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} + engines: {node: '>=18.12.0'} + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -6870,6 +7068,9 @@ packages: resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} engines: {node: '>=20'} + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + whatwg-mimetype@5.0.0: resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} engines: {node: '>=20'} @@ -8762,6 +8963,12 @@ snapshots: - supports-color - utf-8-validate + '@nestjs/testing@11.1.18(@nestjs/common@11.1.16(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.16)': + dependencies: + '@nestjs/common': 11.1.16(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 11.1.16(@nestjs/common@11.1.16(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/websockets@11.1.16)(reflect-metadata@0.2.2)(rxjs@7.8.2) + tslib: 2.8.1 + '@nestjs/throttler@6.5.0(@nestjs/common@11.1.16(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.16)(reflect-metadata@0.2.2)': dependencies: '@nestjs/common': 11.1.16(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2) @@ -8808,6 +9015,8 @@ snapshots: '@noble/ciphers@2.1.1': {} + '@noble/hashes@1.8.0': {} + '@noble/hashes@2.0.1': {} '@nuxt/opencollective@0.4.1': @@ -9722,6 +9931,10 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@paralleldrive/cuid2@2.3.1': + dependencies: + '@noble/hashes': 1.8.0 + '@pinojs/redact@0.4.0': {} '@pkgjs/parseargs@0.11.0': @@ -9754,6 +9967,14 @@ snapshots: '@protobufjs/utf8@1.1.0': {} + '@rollup/pluginutils@5.3.0(rollup@4.59.0)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.59.0 + '@rollup/rollup-android-arm-eabi@4.59.0': optional: true @@ -10151,10 +10372,75 @@ snapshots: '@standard-schema/spec@1.1.0': {} + '@swc/core-darwin-arm64@1.15.24': + optional: true + + '@swc/core-darwin-x64@1.15.24': + optional: true + + '@swc/core-linux-arm-gnueabihf@1.15.24': + optional: true + + '@swc/core-linux-arm64-gnu@1.15.24': + optional: true + + '@swc/core-linux-arm64-musl@1.15.24': + optional: true + + '@swc/core-linux-ppc64-gnu@1.15.24': + optional: true + + '@swc/core-linux-s390x-gnu@1.15.24': + optional: true + + '@swc/core-linux-x64-gnu@1.15.24': + optional: true + + '@swc/core-linux-x64-musl@1.15.24': + optional: true + + '@swc/core-win32-arm64-msvc@1.15.24': + optional: true + + '@swc/core-win32-ia32-msvc@1.15.24': + optional: true + + '@swc/core-win32-x64-msvc@1.15.24': + optional: true + + '@swc/core@1.15.24(@swc/helpers@0.5.21)': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.26 + optionalDependencies: + '@swc/core-darwin-arm64': 1.15.24 + '@swc/core-darwin-x64': 1.15.24 + '@swc/core-linux-arm-gnueabihf': 1.15.24 + '@swc/core-linux-arm64-gnu': 1.15.24 + '@swc/core-linux-arm64-musl': 1.15.24 + '@swc/core-linux-ppc64-gnu': 1.15.24 + '@swc/core-linux-s390x-gnu': 1.15.24 + '@swc/core-linux-x64-gnu': 1.15.24 + '@swc/core-linux-x64-musl': 1.15.24 + '@swc/core-win32-arm64-msvc': 1.15.24 + '@swc/core-win32-ia32-msvc': 1.15.24 + '@swc/core-win32-x64-msvc': 1.15.24 + '@swc/helpers': 0.5.21 + + '@swc/counter@0.1.3': {} + '@swc/helpers@0.5.15': dependencies: tslib: 2.8.1 + '@swc/helpers@0.5.21': + dependencies: + tslib: 2.8.1 + + '@swc/types@0.1.26': + dependencies: + '@swc/counter': 0.1.3 + '@tailwindcss/node@4.2.1': dependencies: '@jridgewell/remapping': 2.3.5 @@ -10252,6 +10538,8 @@ snapshots: dependencies: '@types/node': 22.19.15 + '@types/cookiejar@2.1.5': {} + '@types/cors@2.8.19': dependencies: '@types/node': 22.19.15 @@ -10284,6 +10572,8 @@ snapshots: dependencies: '@types/node': 22.19.15 + '@types/methods@1.1.4': {} + '@types/mime-types@2.1.4': {} '@types/ms@2.1.0': {} @@ -10333,6 +10623,18 @@ snapshots: '@types/retry@0.12.0': {} + '@types/superagent@8.1.9': + dependencies: + '@types/cookiejar': 2.1.5 + '@types/methods': 1.1.4 + '@types/node': 22.19.15 + form-data: 4.0.5 + + '@types/supertest@7.2.0': + dependencies: + '@types/methods': 1.1.4 + '@types/superagent': 8.1.9 + '@types/tedious@4.0.14': dependencies: '@types/node': 22.19.15 @@ -10587,14 +10889,15 @@ snapshots: argparse@2.0.1: {} + asap@2.0.6: {} + assertion-error@2.0.1: {} ast-types@0.13.4: dependencies: tslib: 2.8.1 - asynckit@0.4.0: - optional: true + asynckit@0.4.0: {} atomic-sleep@1.0.0: {} @@ -10891,7 +11194,6 @@ snapshots: combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 - optional: true comma-separated-tokens@2.0.3: {} @@ -10899,6 +11201,8 @@ snapshots: commander@14.0.3: {} + component-emitter@1.3.1: {} + concat-map@0.0.1: {} consola@3.4.2: {} @@ -10915,6 +11219,8 @@ snapshots: cookie@1.1.1: {} + cookiejar@2.1.4: {} + core-util-is@1.0.3: {} cors@2.8.6: @@ -10994,8 +11300,7 @@ snapshots: escodegen: 2.1.0 esprima: 4.0.1 - delayed-stream@1.0.0: - optional: true + delayed-stream@1.0.0: {} denque@2.1.0: {} @@ -11009,6 +11314,11 @@ snapshots: dependencies: dequal: 2.0.3 + dezalgo@1.0.4: + dependencies: + asap: 2.0.6 + wrappy: 1.0.2 + diff@8.0.3: {} discord-api-types@0.38.42: {} @@ -11160,7 +11470,6 @@ snapshots: get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 hasown: 2.0.2 - optional: true es-toolkit@1.45.1: {} @@ -11368,6 +11677,8 @@ snapshots: estree-util-is-identifier-name@3.0.0: {} + estree-walker@2.0.2: {} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.8 @@ -11618,12 +11929,17 @@ snapshots: es-set-tostringtag: 2.1.0 hasown: 2.0.2 mime-types: 2.1.35 - optional: true formdata-polyfill@4.0.10: dependencies: fetch-blob: 3.2.0 + formidable@3.5.4: + dependencies: + '@paralleldrive/cuid2': 2.3.1 + dezalgo: 1.0.4 + once: 1.4.0 + forwarded-parse@2.1.2: {} forwarded@0.2.0: {} @@ -11796,7 +12112,6 @@ snapshots: has-tostringtag@1.0.2: dependencies: has-symbols: 1.1.0 - optional: true hasown@2.0.2: dependencies: @@ -12268,6 +12583,8 @@ snapshots: load-esm@1.0.3: {} + load-tsconfig@0.2.5: {} + locate-path@6.0.0: dependencies: p-locate: 5.0.0 @@ -12466,6 +12783,8 @@ snapshots: merge-stream@2.0.0: {} + methods@1.1.2: {} + micromark-core-commonmark@2.0.3: dependencies: decode-named-character-reference: 1.3.0 @@ -12616,6 +12935,8 @@ snapshots: dependencies: mime-db: 1.54.0 + mime@2.6.0: {} + mimic-fn@2.1.0: {} mimic-fn@4.0.0: {} @@ -13696,6 +14017,28 @@ snapshots: client-only: 0.0.1 react: 19.2.4 + superagent@10.3.0: + dependencies: + component-emitter: 1.3.1 + cookiejar: 2.1.4 + debug: 4.4.3 + fast-safe-stringify: 2.1.1 + form-data: 4.0.5 + formidable: 3.5.4 + methods: 1.1.2 + mime: 2.6.0 + qs: 6.15.0 + transitivePeerDependencies: + - supports-color + + supertest@7.2.2: + dependencies: + cookie-signature: 1.2.2 + methods: 1.1.2 + superagent: 10.3.0 + transitivePeerDependencies: + - supports-color + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -13951,6 +14294,22 @@ snapshots: unpipe@1.0.0: {} + unplugin-swc@1.5.9(@swc/core@1.15.24(@swc/helpers@0.5.21))(rollup@4.59.0): + dependencies: + '@rollup/pluginutils': 5.3.0(rollup@4.59.0) + '@swc/core': 1.15.24(@swc/helpers@0.5.21) + load-tsconfig: 0.2.5 + unplugin: 2.3.11 + transitivePeerDependencies: + - rollup + + unplugin@2.3.11: + dependencies: + '@jridgewell/remapping': 2.3.5 + acorn: 8.16.0 + picomatch: 4.0.3 + webpack-virtual-modules: 0.6.2 + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -14117,6 +14476,8 @@ snapshots: webidl-conversions@8.0.1: {} + webpack-virtual-modules@0.6.2: {} + whatwg-mimetype@5.0.0: {} whatwg-url@14.2.0: -- 2.49.1