diff --git a/.env.example b/.env.example index 6a605fe..41957a5 100644 --- a/.env.example +++ b/.env.example @@ -25,6 +25,12 @@ API_PORT=8200 AUTH_JWT_SECRET=replace-with-a-random-secret-of-at-least-32-characters # Separate HMAC secret used to pseudonymize IP/email values in Redis rate-limit keys. AUTH_RATE_LIMIT_KEY_SECRET=replace-with-a-different-random-secret-of-at-least-32-characters +# AES-GCM 密钥材料,用来加密门店 API Key;只保存在服务端,轮换时变更版本号但保留旧密钥解密能力。 +STORE_SECRET_ENCRYPTION_KEY=replace-with-a-random-secret-of-at-least-32-characters +# 当前门店密钥使用的加密密钥版本,会随密钥轮换递增。 +STORE_SECRET_ENCRYPTION_KEY_VERSION=v1 +# 对幂等请求内容生成 HMAC 摘要的独立密钥,避免数据库保存原始请求体或 API Key。 +IDEMPOTENCY_KEY_SECRET=replace-with-a-different-random-secret-of-at-least-32-characters # Server-side minimum password length. The browser must not weaken this rule. AUTH_PASSWORD_MIN_LENGTH=12 # Maximum JSON or URL-encoded request size in bytes. Media files must use object-storage direct upload. diff --git a/apps/api/package.json b/apps/api/package.json index 8b3fc44..e1016f8 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -5,9 +5,10 @@ "type": "module", "scripts": { "build": "tsc -p tsconfig.json", - "dev": "tsx watch src/main.ts", + "dev": "node scripts/dev.mjs", "start": "node dist/main.js", - "typecheck": "tsc -p tsconfig.json --noEmit" + "typecheck": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.test.json --noEmit", + "test": "vitest run" }, "dependencies": { "@atlas/contracts": "workspace:*", @@ -24,9 +25,11 @@ "zod": "4.5.4" }, "devDependencies": { + "@nestjs/testing": "12.0.1", "@types/express": "5.0.6", "@types/node": "26.3.0", "tsx": "4.23.13", - "typescript": "7.0.2" + "typescript": "7.0.2", + "vitest": "^4.1.11" } } diff --git a/apps/api/scripts/dev.mjs b/apps/api/scripts/dev.mjs new file mode 100644 index 0000000..1c3f8ac --- /dev/null +++ b/apps/api/scripts/dev.mjs @@ -0,0 +1,72 @@ +import { spawn } from 'node:child_process'; +import { existsSync, readFileSync } from 'node:fs'; +import { dirname, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const scriptDirectory = dirname(fileURLToPath(import.meta.url)); +const repositoryRoot = resolve(scriptDirectory, '../../..'); +const environmentFile = resolve(repositoryRoot, '.env'); +const localEnvironment = existsSync(environmentFile) + ? parseEnvironment(readFileSync(environmentFile, 'utf8')) + : {}; +const apiPort = process.env.API_PORT ?? localEnvironment.API_PORT ?? '8200'; +const swaggerEnabled = + (process.env.SWAGGER_ENABLED ?? + localEnvironment.SWAGGER_ENABLED ?? + 'true') === 'true'; +const nodeEnvironment = + process.env.NODE_ENV ?? localEnvironment.NODE_ENV ?? 'development'; +const swaggerUrl = `http://localhost:${apiPort}/api-docs`; +const tsxCommand = process.platform === 'win32' ? 'tsx.cmd' : 'tsx'; +const apiProcess = spawn(tsxCommand, ['watch', 'src/main.ts'], { + shell: process.platform === 'win32', + stdio: 'inherit', +}); + +if ( + process.platform === 'darwin' && + nodeEnvironment === 'development' && + swaggerEnabled +) { + void openSwaggerAfterApiIsReady(); +} + +for (const signal of ['SIGINT', 'SIGTERM']) { + process.on(signal, () => apiProcess.kill(signal)); +} + +apiProcess.on('exit', (code, signal) => { + if (signal) process.exitCode = 1; + else process.exitCode = code ?? 0; +}); + +function parseEnvironment(content) { + return Object.fromEntries( + content + .split(/\r?\n/) + .map((line) => line.match(/^([A-Za-z_][A-Za-z0-9_]*)=(.*)$/)) + .filter(Boolean) + .map((match) => [match[1], match[2]]), + ); +} + +async function openSwaggerAfterApiIsReady() { + const deadline = Date.now() + 30_000; + while (Date.now() < deadline) { + try { + const response = await fetch(`http://localhost:${apiPort}/health`); + if (response.ok) { + // 开发启动器进程不会随 tsx watch 的热重启重建,因此只会打开一次。 + spawn('open', [swaggerUrl], { + detached: true, + stdio: 'ignore', + }).unref(); + return; + } + } catch { + // API 仍在启动或热重启,继续等待到超时为止。 + } + await new Promise((resolveDelay) => setTimeout(resolveDelay, 250)); + } + console.warn(`Swagger 未在 30 秒内就绪:${swaggerUrl}`); +} diff --git a/apps/api/src/app.module.ts b/apps/api/src/app.module.ts index ab85830..baba1bf 100644 --- a/apps/api/src/app.module.ts +++ b/apps/api/src/app.module.ts @@ -2,20 +2,24 @@ import { Controller, Get, Inject, Module } from '@nestjs/common'; import type { Database } from '@atlas/database'; import { AuthModule } from './auth/auth.module.js'; import { ApiError } from './common/api-error.js'; +import { Public } from './common/public.decorator.js'; import { AppConfigModule } from './config/app-config.module.js'; import { DATABASE, DatabaseModule } from './database/database.module.js'; import { SecurityModule } from './security/security.module.js'; +import { StoresModule } from './stores/stores.module.js'; @Controller() class HealthController { public constructor(@Inject(DATABASE) private readonly database: Database) {} @Get('health') + @Public() check() { return { status: 'ok', service: 'api' }; } @Get('ready') + @Public() async ready() { try { await this.database.query('SELECT 1'); @@ -31,7 +35,13 @@ class HealthController { } @Module({ - imports: [AppConfigModule, DatabaseModule, SecurityModule, AuthModule], + imports: [ + AppConfigModule, + DatabaseModule, + SecurityModule, + AuthModule, + StoresModule, + ], controllers: [HealthController], }) export class AppModule {} diff --git a/apps/api/src/auth/auth.controller.ts b/apps/api/src/auth/auth.controller.ts index 65ab4da..78899ee 100644 --- a/apps/api/src/auth/auth.controller.ts +++ b/apps/api/src/auth/auth.controller.ts @@ -3,10 +3,10 @@ import { Controller, Get, HttpCode, + Inject, Post, Req, Res, - UseGuards, } from '@nestjs/common'; import { ApiBearerAuth, @@ -18,12 +18,19 @@ import { ApiUnauthorizedResponse, } from '@nestjs/swagger'; import { createHash } from 'node:crypto'; -import { loginRequestSchema, registerRequestSchema } from '@atlas/contracts'; +import { + loginRequestSchema, + registerRequestSchema, + type Workspace, +} from '@atlas/contracts'; import { ApiError } from '../common/api-error.js'; -import { AccessTokenGuard, type AuthenticatedRequest } from './auth.guard.js'; +import { Public } from '../common/public.decorator.js'; +import type { AuthenticatedRequest } from './auth.guard.js'; import { AuthService, type RequestMetadata } from './auth.service.js'; +import { CurrentWorkspace } from '../workspace/current-workspace.decorator.js'; const refreshCookie = 'atlas_refresh'; +// 控制器只负责 HTTP 边界;账户、会话与工作空间的一致性由 AuthService 的事务保证。 type HttpRequest = { header: (name: string) => string | undefined; ip?: string; @@ -40,9 +47,12 @@ type HttpResponse = { @ApiTags('Authentication') @Controller('auth') export class AuthController { - public constructor(private readonly authService: AuthService) {} + public constructor( + @Inject(AuthService) private readonly authService: AuthService, + ) {} @Post('register') + @Public() @ApiOperation({ summary: '注册账户并创建个人工作空间' }) @ApiBody({ schema: { @@ -68,6 +78,8 @@ export class AuthController { } @Post('login') + @Public() + @HttpCode(200) @ApiOperation({ summary: '使用邮箱和密码登录' }) @ApiBody({ schema: { @@ -91,12 +103,15 @@ export class AuthController { } @Post('refresh') + @Public() + @HttpCode(200) @ApiOperation({ summary: '轮换 refresh cookie 并获取新的 access token' }) public async refresh( @Req() request: HttpRequest, @Res({ passthrough: true }) response: HttpResponse, ) { try { + // refresh token 不进入 JSON body,仅从浏览器自动发送的 HttpOnly cookie 读取。 const result = await this.authService.refresh( readCookie(request.header('cookie'), refreshCookie), metadata(request), @@ -117,7 +132,6 @@ export class AuthController { @Post('logout') @HttpCode(204) - @UseGuards(AccessTokenGuard) @ApiBearerAuth('access-token') @ApiOperation({ summary: '撤销当前登录会话' }) @ApiNoContentResponse({ description: '会话已撤销' }) @@ -131,13 +145,17 @@ export class AuthController { } @Get('me') - @UseGuards(AccessTokenGuard) @ApiBearerAuth('access-token') @ApiOperation({ summary: '获取当前用户、工作空间和页头初始上下文' }) @ApiOkResponse({ description: '当前身份和工作空间' }) @ApiUnauthorizedResponse({ description: 'access token 无效或已过期' }) - public async me(@Req() request: AuthenticatedRequest) { - return { data: await this.authService.me(request.auth.userId) }; + public async me( + @Req() request: AuthenticatedRequest, + @CurrentWorkspace() workspace: Workspace, + ) { + return { + data: await this.authService.me(request.auth.userId, workspace), + }; } } @@ -178,6 +196,7 @@ function metadata(request: HttpRequest): RequestMetadata { }; } function cookieOptions() { + // cookie 路径限制在认证接口,避免无关请求携带长期会话凭证。 return { httpOnly: true, secure: process.env.NODE_ENV === 'production', @@ -198,6 +217,7 @@ function clearRefreshCookie(response: HttpResponse) { }); } function readCookie(header: string | undefined, name: string) { + // 只解析本服务需要的单个 cookie,避免引入与认证无关的 cookie 状态。 return header ?.split(';') .map((part) => part.trim()) diff --git a/apps/api/src/auth/auth.crypto.ts b/apps/api/src/auth/auth.crypto.ts index bf3735a..cfb998f 100644 --- a/apps/api/src/auth/auth.crypto.ts +++ b/apps/api/src/auth/auth.crypto.ts @@ -13,10 +13,11 @@ const scrypt = promisify(scryptCallback) as ( keyLength: number, options: { N: number; r: number; p: number; maxmem: number }, ) => Promise; +// 使用较高成本的 scrypt 参数,控制离线破解密码哈希时的时间与内存成本。 const scryptOptions = { N: 16_384, r: 8, p: 1, maxmem: 32 * 1024 * 1024 }; export async function hashPassword(password: string): Promise { - // The random salt and expensive KDF keep a database leak from exposing passwords directly. + // 每个密码使用独立随机盐,数据库泄露时不能直接复用预计算结果。 const salt = randomBytes(16).toString('base64url'); const derived = (await scrypt(password, salt, 64, scryptOptions)) as Buffer; return `scrypt$${salt}$${derived.toString('base64url')}`; @@ -40,6 +41,7 @@ export function createOpaqueToken(): string { return randomBytes(48).toString('base64url'); } export function tokenHash(token: string): string { + // refresh token 只以摘要形式存库;服务端无需保存可直接用于登录的原文。 return createHash('sha256').update(token).digest('base64url'); } @@ -53,7 +55,7 @@ export function signAccessToken( claims: AccessTokenClaims, secret: string, ): string { - // Access tokens are short-lived; refresh sessions remain revocable in PostgreSQL. + // access token 是短期自包含凭证;真正可撤销的会话状态仍以 PostgreSQL 为准。 const header = Buffer.from( JSON.stringify({ alg: 'HS256', typ: 'JWT' }), ).toString('base64url'); @@ -73,6 +75,7 @@ export function verifyAccessToken( .update(`${header}.${payload}`) .digest(); const actual = Buffer.from(signature, 'base64url'); + // 恒定时间比较可避免根据签名比对耗时推测正确前缀。 if (actual.length !== expected.length || !timingSafeEqual(actual, expected)) return null; try { diff --git a/apps/api/src/auth/auth.guard.ts b/apps/api/src/auth/auth.guard.ts index 7cb5f29..0007b15 100644 --- a/apps/api/src/auth/auth.guard.ts +++ b/apps/api/src/auth/auth.guard.ts @@ -1,18 +1,43 @@ -import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common'; +import { + CanActivate, + ExecutionContext, + Inject, + Injectable, +} from '@nestjs/common'; +import { Reflector } from '@nestjs/core'; +import type { Workspace } from '@atlas/contracts'; +import { IS_PUBLIC_ENDPOINT } from '../common/public.decorator.js'; import { AuthService } from './auth.service.js'; export type AuthenticatedRequest = { header: (name: string) => string | undefined; - auth: { userId: string; sessionId: string }; + auth: { + userId: string; + sessionId: string; + workspace?: Workspace; + }; }; @Injectable() export class AccessTokenGuard implements CanActivate { - public constructor(private readonly authService: AuthService) {} + public constructor( + @Inject(Reflector) private readonly reflector: Reflector, + @Inject(AuthService) private readonly authService: AuthService, + ) {} public async canActivate(context: ExecutionContext) { + // 公开端点必须显式声明,避免新路由因忘记添加守卫而意外暴露。 + if ( + this.reflector.getAllAndOverride(IS_PUBLIC_ENDPOINT, [ + context.getHandler(), + context.getClass(), + ]) + ) { + return true; + } const request = context .switchToHttp() .getRequest(); + // 只在此处解析 Authorization,后续守卫和控制器共享已验证的会话身份。 request.auth = await this.authService.authenticate( request.header('authorization'), ); diff --git a/apps/api/src/auth/auth.module.ts b/apps/api/src/auth/auth.module.ts index 183cdef..60cfd35 100644 --- a/apps/api/src/auth/auth.module.ts +++ b/apps/api/src/auth/auth.module.ts @@ -1,10 +1,18 @@ import { Module } from '@nestjs/common'; +import { APP_GUARD } from '@nestjs/core'; import { AuthController } from './auth.controller.js'; import { AccessTokenGuard } from './auth.guard.js'; import { AuthService } from './auth.service.js'; +import { WorkspaceContextGuard } from '../workspace/workspace-context.guard.js'; @Module({ controllers: [AuthController], - providers: [AuthService, AccessTokenGuard], + providers: [ + AuthService, + AccessTokenGuard, + WorkspaceContextGuard, + { provide: APP_GUARD, useExisting: AccessTokenGuard }, + { provide: APP_GUARD, useExisting: WorkspaceContextGuard }, + ], }) export class AuthModule {} diff --git a/apps/api/src/auth/auth.service.ts b/apps/api/src/auth/auth.service.ts index 98d9d31..828b8e4 100644 --- a/apps/api/src/auth/auth.service.ts +++ b/apps/api/src/auth/auth.service.ts @@ -33,12 +33,14 @@ type WorkspaceRow = { id: string; name: string; role: Workspace['role'] }; @Injectable() export class AuthService { + // access token 短期存在于浏览器内存;refresh session 的有效期更长且可服务端撤销。 private readonly accessTtlSeconds = 900; private readonly refreshTtlDays = 30; public constructor( @Inject(DATABASE) private readonly database: Database, @Inject(APP_CONFIG) private readonly config: AppConfig, + @Inject(AuthRateLimiter) private readonly rateLimiter: AuthRateLimiter, ) {} @@ -56,12 +58,12 @@ export class AuthService { `密码至少需要 ${this.config.AUTH_PASSWORD_MIN_LENGTH} 个字符`, ); const email = input.email.trim().toLowerCase(); - // Apply the shared limiter before spending CPU on password hashing or querying account existence. + // 限流必须早于密码哈希和用户查询,避免攻击者消耗 CPU 或探测账户状态。 await this.rateLimiter.consume('register', { ip: metadata.ip, email }); const passwordHash = await hashPassword(input.password); try { return await this.database.transaction(async (transaction) => { - // A user must never exist without its initial tenant and owner membership. + // 用户、个人工作空间和 owner membership 必须原子创建,不能留下半成品租户。 const user = await insertUser( transaction, email, @@ -100,7 +102,7 @@ export class AuthService { public async login(input: LoginRequest, metadata: RequestMetadata) { const email = input.email.trim().toLowerCase(); - // Use the same normalized value for the limiter and citext account lookup. + // 限流与 citext 查询使用同一规范化邮箱,避免大小写绕过限流桶。 await this.rateLimiter.consume('login', { ip: metadata.ip, email }); const result = await this.database.query( 'SELECT id, email, display_name, email_verified_at, created_at, status, password_hash FROM atlas.users WHERE email = $1', @@ -133,7 +135,7 @@ export class AuthService { refreshToken: string | undefined, metadata: RequestMetadata, ) { - // Refresh has no trusted email until its opaque token is validated, so it is IP-scoped only. + // refresh token 验证前没有可信邮箱,只能按 IP 维度限流。 await this.rateLimiter.consume('refresh', { ip: metadata.ip }); if (!refreshToken) throw new ApiError(401, 'SESSION_EXPIRED', '登录会话已过期'); @@ -149,7 +151,7 @@ export class AuthService { const user = sessions.rows[0]; if (!user || user.status !== 'active') throw new ApiError(401, 'SESSION_EXPIRED', '登录会话已过期'); - // Row locking makes a refresh token single-use even when two browser requests arrive together. + // 行锁保证并发 refresh 时旧 token 只能成功使用一次。 await transaction.query( 'UPDATE atlas.user_sessions SET revoked_at = now() WHERE id = $1', [user.session_id], @@ -180,6 +182,7 @@ export class AuthService { ? verifyAccessToken(token, this.config.AUTH_JWT_SECRET) : null; if (!claims) throw new UnauthorizedException(); + // JWT 签名有效仍不足够;必须确认对应 session 未撤销且未过期。 const active = await this.database.query( 'SELECT 1 FROM atlas.user_sessions WHERE id = $1 AND user_id = $2 AND revoked_at IS NULL AND expires_at > now()', [claims.sid, claims.sub], @@ -188,8 +191,8 @@ export class AuthService { return { userId: claims.sub, sessionId: claims.sid }; } - public async me(userId: string) { - const workspace = await this.findWorkspace(userId); + public async me(userId: string, workspace: Workspace) { + // workspace 由全局守卫解析,避免控制器或服务各自选择租户造成边界不一致。 const users = await this.database.query( 'SELECT id, email, display_name, email_verified_at, created_at, status, password_hash FROM atlas.users WHERE id = $1', [userId], @@ -233,6 +236,7 @@ export class AuthService { workspace: WorkspaceRow, metadata: RequestMetadata, ) { + // refresh token 仅通过 HttpOnly cookie 交给浏览器,响应体只暴露短期 access token。 const refreshToken = createOpaqueToken(); const session = await transaction.query<{ id: string }>( `INSERT INTO atlas.user_sessions (user_id, refresh_token_hash, expires_at, ip_hash, user_agent) @@ -284,6 +288,7 @@ function isUniqueViolation(error: unknown): error is { code: string } { ); } function publicUser(user: UserRow): AuthUser { + // 白名单映射防止 password_hash 等内部字段随查询结果泄露给客户端。 return { id: user.id, email: user.email, @@ -298,6 +303,7 @@ async function insertUser( passwordHash: string, displayName: string | null, ) { + // slug 使用用户 UUID,显示名称变化不会影响个人工作空间的稳定标识。 const result = await transaction.query( 'INSERT INTO atlas.users (email, password_hash, display_name) VALUES ($1, $2, $3) RETURNING id, email, display_name, email_verified_at, created_at, status, password_hash', [email, passwordHash, displayName], diff --git a/apps/api/src/common/api-error.filter.ts b/apps/api/src/common/api-error.filter.ts index 4cc29e4..02e2192 100644 --- a/apps/api/src/common/api-error.filter.ts +++ b/apps/api/src/common/api-error.filter.ts @@ -25,6 +25,7 @@ export class ApiErrorFilter implements ExceptionFilter { }>(); const requestId = request.requestId ?? `req_${randomUUID()}`; if (exception instanceof ApiError) { + // 已知业务错误保留其稳定 code 与 details,方便前端精确处理。 const body = exception.getResponse() as { error: Record; }; @@ -33,6 +34,7 @@ export class ApiErrorFilter implements ExceptionFilter { .json({ error: { ...body.error, request_id: requestId } }); } if (exception instanceof HttpException) { + // Nest 内部异常不泄露原始 message,避免暴露认证或解析实现细节。 return response.status(exception.getStatus()).json({ error: { code: 'HTTP_ERROR', @@ -50,6 +52,7 @@ export class ApiErrorFilter implements ExceptionFilter { path: request.originalUrl, }, ); + // 未预期异常只返回通用信息,request_id 用于从结构化日志定位根因。 return response.status(500).json({ error: { code: 'INTERNAL_ERROR', diff --git a/apps/api/src/common/api-error.ts b/apps/api/src/common/api-error.ts index 69db470..f48df0c 100644 --- a/apps/api/src/common/api-error.ts +++ b/apps/api/src/common/api-error.ts @@ -1,6 +1,7 @@ import { HttpException, HttpStatus } from '@nestjs/common'; export class ApiError extends HttpException { + // 业务代码只能通过此类型抛出可预期错误,最终由全局过滤器统一封装为 error 信封。 public constructor( status: HttpStatus, code: string, diff --git a/apps/api/src/common/idempotency.service.ts b/apps/api/src/common/idempotency.service.ts new file mode 100644 index 0000000..2e83141 --- /dev/null +++ b/apps/api/src/common/idempotency.service.ts @@ -0,0 +1,133 @@ +import { createHmac } from 'node:crypto'; +import { Inject, Injectable } from '@nestjs/common'; +import type { Database, DatabaseTransaction } from '@atlas/database'; +import { APP_CONFIG, type AppConfig } from '../config/app-config.module.js'; +import { DATABASE } from '../database/database.module.js'; +import { ApiError } from './api-error.js'; + +type IdempotentResponse = { status: number; body: unknown }; +type IdempotencyInput = { + workspaceId: string; + userId: string; + method: 'POST' | 'PUT' | 'PATCH' | 'DELETE'; + path: string; + key: string; + request: unknown; +}; +type IdempotencyRow = { + request_fingerprint: string; + status: 'in_progress' | 'completed'; + response_status: number | null; + response_body: unknown; +}; + +@Injectable() +export class IdempotencyService { + public constructor( + @Inject(DATABASE) private readonly database: Database, + @Inject(APP_CONFIG) private readonly config: AppConfig, + ) {} + + /** + * 幂等记录与业务写入共用同一个工作空间事务。只有两者都提交,重试才会得到可靠的历史响应。 + */ + public async run( + input: IdempotencyInput, + work: (transaction: DatabaseTransaction) => Promise, + ): Promise { + const fingerprint = createHmac( + 'sha256', + this.config.IDEMPOTENCY_KEY_SECRET, + ) + .update(canonicalize(input.request)) + .digest('base64url'); + + return this.database.workspaceTransaction( + input.workspaceId, + async (transaction) => { + const inserted = await transaction.query( + `INSERT INTO atlas.idempotency_requests + (workspace_id, user_id, http_method, request_path, idempotency_key, request_fingerprint) + VALUES ($1, $2, $3, $4, $5, $6) + ON CONFLICT (workspace_id, user_id, http_method, request_path, idempotency_key) DO NOTHING + RETURNING request_fingerprint, status, response_status, response_body`, + [ + input.workspaceId, + input.userId, + input.method, + input.path, + input.key, + fingerprint, + ], + ); + if (!inserted.rows[0]) { + // 冲突插入会等待首个事务结束;随后行锁确保只能读取完整的持久化结果。 + const existing = await transaction.query( + `SELECT request_fingerprint, status, response_status, response_body + FROM atlas.idempotency_requests + WHERE workspace_id = $1 AND user_id = $2 AND http_method = $3 + AND request_path = $4 AND idempotency_key = $5 + FOR UPDATE`, + [ + input.workspaceId, + input.userId, + input.method, + input.path, + input.key, + ], + ); + const row = existing.rows[0]; + if (!row || row.request_fingerprint !== fingerprint) { + throw new ApiError( + 409, + 'IDEMPOTENCY_KEY_REUSED', + '幂等键已用于不同请求', + ); + } + if (row.status !== 'completed' || !row.response_status) { + throw new ApiError( + 409, + 'IDEMPOTENCY_REQUEST_IN_PROGRESS', + '相同请求仍在处理中', + ); + } + return { + status: row.response_status, + body: row.response_body, + }; + } + + const response = await work(transaction); + await transaction.query( + `UPDATE atlas.idempotency_requests + SET status = 'completed', response_status = $1, response_body = $2, + completed_at = now() + WHERE workspace_id = $3 AND user_id = $4 AND http_method = $5 + AND request_path = $6 AND idempotency_key = $7`, + [ + response.status, + response.body, + input.workspaceId, + input.userId, + input.method, + input.path, + input.key, + ], + ); + return response; + }, + ); + } +} + +/** 规范化排序后再签名,使 JSON 字段顺序不会改变同一请求的身份。 */ +function canonicalize(value: unknown): string { + if (value === null || typeof value !== 'object') + return JSON.stringify(value); + if (Array.isArray(value)) return `[${value.map(canonicalize).join(',')}]`; + const record = value as Record; + return `{${Object.keys(record) + .sort() + .map((key) => `${JSON.stringify(key)}:${canonicalize(record[key])}`) + .join(',')}}`; +} diff --git a/apps/api/src/common/public.decorator.ts b/apps/api/src/common/public.decorator.ts new file mode 100644 index 0000000..b5e8502 --- /dev/null +++ b/apps/api/src/common/public.decorator.ts @@ -0,0 +1,6 @@ +import { SetMetadata } from '@nestjs/common'; + +export const IS_PUBLIC_ENDPOINT = 'atlas:is-public-endpoint'; + +// 全局认证守卫只跳过显式标记的端点,避免新接口因遗漏守卫而意外公开。 +export const Public = () => SetMetadata(IS_PUBLIC_ENDPOINT, true); diff --git a/apps/api/src/config/app-config.module.ts b/apps/api/src/config/app-config.module.ts index 92dc6f5..52134da 100644 --- a/apps/api/src/config/app-config.module.ts +++ b/apps/api/src/config/app-config.module.ts @@ -19,8 +19,7 @@ function findEnvironmentFile(): string { return environmentFile ?? resolve(process.cwd(), '.env'); } -// This schema is the only supported source for API runtime settings. Defaults are -// intentionally limited to non-secret local-development values. +// 此 schema 是 API 运行配置的唯一来源;默认值只允许用于不含秘密的本地开发场景。 const environmentSchema = z.object({ NODE_ENV: z .enum(['development', 'test', 'production']) @@ -31,6 +30,13 @@ const environmentSchema = z.object({ REDIS_URL: z.url(), AUTH_JWT_SECRET: z.string().min(32), AUTH_RATE_LIMIT_KEY_SECRET: z.string().min(32), + STORE_SECRET_ENCRYPTION_KEY: z.string().min(32), + STORE_SECRET_ENCRYPTION_KEY_VERSION: z + .string() + .min(1) + .max(64) + .default('v1'), + IDEMPOTENCY_KEY_SECRET: z.string().min(32), AUTH_PASSWORD_MIN_LENGTH: z.coerce .number() .int() @@ -83,7 +89,7 @@ function validateEnvironment( ): Environment { const result = environmentSchema.safeParse(environment); if (result.success) return result.data; - // Fail before Nest opens a listener; a half-configured API is unsafe to run. + // 在 Nest 开始监听前失败,避免半配置 API 对外提供不安全服务。 throw new Error( `Invalid environment configuration: ${result.error.issues.map((issue) => issue.path.join('.')).join(', ')}`, ); @@ -92,7 +98,7 @@ function validateEnvironment( function createAppConfig(environment: Environment): AppConfig { return { ...environment, - // Express only trusts forwarding headers when this explicit allowlist is non-empty. + // 只有显式给出代理网段时才信任转发头,避免客户端伪造来源 IP。 trustedProxyCidrs: environment.TRUSTED_PROXY_CIDRS.split(',') .map((value) => value.trim()) .filter(Boolean), @@ -106,15 +112,14 @@ function createAppConfig(environment: Environment): AppConfig { ConfigModule.forRoot({ isGlobal: true, cache: true, - // Turbo runs this workspace's scripts from apps/api, while the - // shared development environment lives at the repository root. + // Turbo 从 apps/api 运行脚本,但共享开发环境文件位于仓库根目录。 envFilePath: findEnvironmentFile(), }), ], providers: [ { provide: APP_CONFIG, - // Export a normalized immutable config object so services never read process.env directly. + // 导出规范化配置,业务服务不得散落读取 process.env。 useFactory: (): AppConfig => createAppConfig(validateEnvironment(process.env)), }, diff --git a/apps/api/src/database/database.module.ts b/apps/api/src/database/database.module.ts index ea5adec..1978a8f 100644 --- a/apps/api/src/database/database.module.ts +++ b/apps/api/src/database/database.module.ts @@ -10,6 +10,7 @@ export const DATABASE = Symbol('DATABASE'); { provide: DATABASE, inject: [APP_CONFIG], + // 业务代码只能拿到受限应用连接,迁移连接串绝不注入 API 容器。 useFactory: (config: AppConfig): Database => createApplicationDatabase(config.DATABASE_URL), }, @@ -19,6 +20,7 @@ export const DATABASE = Symbol('DATABASE'); export class DatabaseModule implements OnModuleDestroy { public constructor(@Inject(DATABASE) private readonly database: Database) {} public async onModuleDestroy() { + // Nest 关闭时主动释放连接池,避免测试和热重启遗留连接。 await this.database.close(); } } diff --git a/apps/api/src/logging/app-logger.ts b/apps/api/src/logging/app-logger.ts index 28efb20..e669619 100644 --- a/apps/api/src/logging/app-logger.ts +++ b/apps/api/src/logging/app-logger.ts @@ -7,6 +7,7 @@ const severity: Record = { log: 2, debug: 3, }; +// 按字段名递归脱敏,日志中不得出现会话、密码、密钥或授权头原文。 const sensitiveKeys = /authorization|cookie|password|secret|token|api[_-]?key/i; export class AppLogger implements LoggerService { @@ -40,6 +41,7 @@ export class AppLogger implements LoggerService { message: typeof message === 'string' ? message : sanitize(message), context: sanitize(context), }; + // 每行独立 JSON,方便日志采集系统按字段索引 request_id、状态码等上下文。 const output = JSON.stringify(entry); if (level === 'error') console.error(output); else console.log(output); diff --git a/apps/api/src/main.ts b/apps/api/src/main.ts index f443d3e..d10dd1a 100644 --- a/apps/api/src/main.ts +++ b/apps/api/src/main.ts @@ -1,6 +1,7 @@ import 'reflect-metadata'; -import { execFile } from 'node:child_process'; import { randomUUID } from 'node:crypto'; +import { resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; import { NestFactory } from '@nestjs/core'; import { NestExpressApplication } from '@nestjs/platform-express'; import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; @@ -16,31 +17,10 @@ type RequestWithId = Request & { requestId?: string; }; -function openSwaggerInDevelopment(config: AppConfig, logger: AppLogger): void { - if ( - config.NODE_ENV !== 'development' || - !config.swaggerEnabled || - process.platform !== 'darwin' - ) { - return; - } - - const swaggerUrl = `http://localhost:${config.API_PORT}/api-docs`; - // 只在本机开发时打开浏览器,生产环境和非 macOS 主机不执行外部进程。 - execFile('open', [swaggerUrl], (error) => { - if (error) { - logger.warn('swagger_auto_open_failed', { - error: error.message, - url: swaggerUrl, - }); - } - }); -} - -async function bootstrap() { +export async function createApplication() { const app = await NestFactory.create(AppModule, { bodyParser: false, - // Keep Nest's bootstrap errors visible until AppLogger is installed below. + // 自定义日志器安装前保留 Nest 启动日志,避免配置错误没有可见诊断。 logger: ['error', 'warn', 'log'], }); const config = app.get(APP_CONFIG); @@ -48,7 +28,7 @@ async function bootstrap() { app.useLogger(logger); if (config.trustedProxyCidrs.length > 0) { - // Never trust forwarded headers unless the deployment names its proxy networks explicitly. + // 仅在部署明确声明代理网段时信任转发头,避免伪造客户端 IP。 app.getHttpAdapter() .getInstance() .set('trust proxy', config.trustedProxyCidrs); @@ -68,6 +48,7 @@ async function bootstrap() { ], exposedHeaders: ['X-Request-Id'], }); + // Helmet、body 限制、请求 ID 与全局错误过滤器必须在业务路由前注册。 app.use(helmet({ contentSecurityPolicy: false })); app.useBodyParser('json', { limit: config.API_BODY_LIMIT_BYTES }); app.useBodyParser('urlencoded', { @@ -79,6 +60,7 @@ async function bootstrap() { const typedRequest = request; const typedResponse = response; const suppliedId = typedRequest.headers['x-request-id']; + // 合法调用方提供的 request ID 可贯穿上游链路;其他情况由服务端生成。 const requestId = typeof suppliedId === 'string' && /^[A-Za-z0-9_-]{8,128}$/.test(suppliedId) @@ -104,6 +86,7 @@ async function bootstrap() { app.enableShutdownHooks(); if (config.swaggerEnabled) { + // Swagger 仅描述运行时已注册路由;冻结接口契约仍以 docs/api 为准。 const swaggerConfig = new DocumentBuilder() .setTitle('Atlas Seller Kit API') .setDescription('Atlas 卖家工作台 HTTP API 文档') @@ -122,30 +105,40 @@ async function bootstrap() { }); } + return { app, config, logger }; +} + +export async function bootstrap() { + const { app, config, logger } = await createApplication(); await app.listen(config.API_PORT); logger.log('api_started', { port: config.API_PORT, swagger_enabled: config.swaggerEnabled, }); - openSwaggerInDevelopment(config, logger); } -void bootstrap().catch((error: unknown) => { - const details = - error instanceof Error - ? { - name: error.name, - message: error.message, - stack: error.stack, - } - : error; - console.error( - JSON.stringify({ - timestamp: new Date().toISOString(), - level: 'error', - message: 'api_startup_failed', - error: details, - }), - ); - process.exitCode = 1; -}); +// 测试复用应用工厂时不自动监听固定端口,只有直接运行入口才启动服务。 +if ( + process.argv[1] && + resolve(process.argv[1]) === fileURLToPath(import.meta.url) +) { + void bootstrap().catch((error: unknown) => { + const details = + error instanceof Error + ? { + name: error.name, + message: error.message, + stack: error.stack, + } + : error; + console.error( + JSON.stringify({ + timestamp: new Date().toISOString(), + level: 'error', + message: 'api_startup_failed', + error: details, + }), + ); + process.exitCode = 1; + }); +} diff --git a/apps/api/src/security/auth-rate-limiter.service.ts b/apps/api/src/security/auth-rate-limiter.service.ts index 43b85de..b0f5995 100644 --- a/apps/api/src/security/auth-rate-limiter.service.ts +++ b/apps/api/src/security/auth-rate-limiter.service.ts @@ -1,4 +1,9 @@ -import { Inject, Injectable, OnModuleDestroy } from '@nestjs/common'; +import { + Inject, + Injectable, + OnModuleDestroy, + OnModuleInit, +} from '@nestjs/common'; import { createHmac } from 'node:crypto'; import { Redis } from 'ioredis'; import { ApiError } from '../common/api-error.js'; @@ -8,17 +13,23 @@ type AuthAction = 'login' | 'register' | 'refresh'; type Limit = { ip: number; email?: number }; @Injectable() -export class AuthRateLimiter implements OnModuleDestroy { +export class AuthRateLimiter implements OnModuleInit, OnModuleDestroy { private readonly redis: Redis; public constructor(@Inject(APP_CONFIG) private readonly config: AppConfig) { - // Redis makes counters shared across API processes instead of resetting per instance. + // Redis 让限流计数在多个 API 实例间共享,不会随单个实例重启清零。 this.redis = new Redis(config.REDIS_URL, { enableOfflineQueue: false, + lazyConnect: true, maxRetriesPerRequest: 1, }); } + public async onModuleInit(): Promise { + // 在开始接收认证请求前完成连接,避免首个请求命中 Redis 连接竞态而被误判为 503。 + await this.redis.connect(); + } + public async consume( action: AuthAction, identifiers: { ip: string | null; email?: string }, @@ -41,6 +52,10 @@ export class AuthRateLimiter implements OnModuleDestroy { } public async onModuleDestroy(): Promise { + if (this.redis.status !== 'ready') { + this.redis.disconnect(); + return; + } await this.redis.quit(); } @@ -56,10 +71,10 @@ export class AuthRateLimiter implements OnModuleDestroy { ) .update(identifier) .digest('base64url'); - // The raw IP/email never becomes part of a Redis key or a loggable identifier. + // Redis key 只保存 IP/邮箱的 HMAC,不暴露可被日志或运维工具读取的原文。 const key = `atlas:auth-rate-limit:${action}:${dimension}:${digest}`; try { - // INCR + first-write EXPIRE must be atomic or concurrent requests could leave a key unexpired. + // INCR 与首次 EXPIRE 必须原子执行,避免并发下产生永不过期的限流 key。 const count = await this.redis.eval( "local value = redis.call('INCR', KEYS[1]); if value == 1 then redis.call('EXPIRE', KEYS[1], ARGV[1]); end; return value;", 1, @@ -75,7 +90,7 @@ export class AuthRateLimiter implements OnModuleDestroy { } } catch (error) { if (error instanceof ApiError) throw error; - // Authentication fails closed: silently bypassing a broken shared limiter enables brute-force attacks. + // 认证限流故障时必须拒绝请求;静默跳过会扩大暴力破解风险。 throw new ApiError( 503, 'AUTH_RATE_LIMIT_UNAVAILABLE', diff --git a/apps/api/src/stores/platforms.service.ts b/apps/api/src/stores/platforms.service.ts new file mode 100644 index 0000000..6fde9df --- /dev/null +++ b/apps/api/src/stores/platforms.service.ts @@ -0,0 +1,125 @@ +import { Inject, Injectable } from '@nestjs/common'; +import type { Database, DatabaseTransaction } from '@atlas/database'; +import { ApiError } from '../common/api-error.js'; +import { DATABASE } from '../database/database.module.js'; + +type PlatformRow = { + id: string; + code: string; + name: string; + capabilities: Record; + supported_currencies: string[]; +}; + +@Injectable() +export class PlatformsService { + public constructor(@Inject(DATABASE) private readonly database: Database) {} + + public async list() { + const rows = await this.database.query( + `SELECT p.id, p.code, p.name, p.capabilities, + coalesce(array_agg(pcs.currency_code ORDER BY pcs.currency_code) + FILTER (WHERE pcs.is_enabled AND c.is_enabled), ARRAY[]::char(3)[]) AS supported_currencies + FROM atlas.platforms p + LEFT JOIN atlas.platform_currency_support pcs ON pcs.platform_id = p.id + LEFT JOIN atlas.currencies c ON c.code = pcs.currency_code + WHERE p.status = 'active' + GROUP BY p.id + ORDER BY CASE WHEN p.code = 'OZON' THEN 0 ELSE 1 END, p.name`, + ); + return rows.rows.map((platform) => ({ + id: platform.id, + code: platform.code, + name: platform.name, + supported_currencies: platform.supported_currencies, + // 能力未配置时使用 null,而不是把 Ozon 的市场或语言假设扩散到通用模型。 + default_market_code: stringCapability( + platform.capabilities, + 'default_market_code', + ), + default_locale: stringCapability( + platform.capabilities, + 'default_locale', + ), + })); + } + + public async context(workspaceId: string, platformId: string) { + return this.database.workspaceTransaction( + workspaceId, + async (transaction) => { + const platform = await this.requireActivePlatform( + transaction, + platformId, + ); + const stores = await transaction.query<{ + id: string; + name: string; + status: string; + credential_status: string; + count: string; + }>( + `SELECT s.id, s.name, s.status, s.credential_status, + count(*) OVER ()::text AS count + FROM atlas.stores s + WHERE s.platform_id = $1 AND s.deleted_at IS NULL AND s.is_default + LIMIT 1`, + [platformId], + ); + // 默认门店不存在时仍要正确返回总数,不能用默认行的窗口函数猜测。 + const count = await transaction.query<{ count: string }>( + `SELECT count(*)::text AS count FROM atlas.stores + WHERE platform_id = $1 AND deleted_at IS NULL`, + [platformId], + ); + const defaultStore = stores.rows[0]; + return { + platform: { + id: platform.id, + code: platform.code, + name: platform.name, + }, + default_store: defaultStore + ? { + id: defaultStore.id, + name: defaultStore.name, + status: defaultStore.status, + credential_status: defaultStore.credential_status, + } + : null, + store_count: Number(count.rows[0]?.count ?? 0), + }; + }, + ); + } + + private async requireActivePlatform( + transaction: DatabaseTransaction, + platformId: string, + ) { + const rows = await transaction.query<{ + id: string; + code: string; + name: string; + }>( + `SELECT id, code, name FROM atlas.platforms WHERE id = $1 AND status = 'active'`, + [platformId], + ); + if (!rows.rows[0]) { + throw new ApiError( + 422, + 'PLATFORM_UNAVAILABLE', + '平台不存在或已停用', + ); + } + return rows.rows[0]; + } +} + +function stringCapability( + capabilities: Record, + key: string, +): string | null { + const value = capabilities[key]; + return typeof value === 'string' ? value : null; +} diff --git a/apps/api/src/stores/store-secret.crypto.ts b/apps/api/src/stores/store-secret.crypto.ts new file mode 100644 index 0000000..f442a51 --- /dev/null +++ b/apps/api/src/stores/store-secret.crypto.ts @@ -0,0 +1,37 @@ +import { + createCipheriv, + createHash, + createHmac, + randomBytes, +} from 'node:crypto'; + +export type EncryptedStoreSecret = { + ciphertext: Buffer; + nonce: Buffer; + fingerprint: string; +}; + +/** + * 密钥只在此边界短暂以明文存在。数据库保存 AES-GCM 密文和随机 nonce, + * fingerprint 是不可逆 HMAC,仅用于安全地识别同一份密钥。 + */ +export function encryptStoreSecret( + plaintext: string, + keyMaterial: string, +): EncryptedStoreSecret { + const key = createHash('sha256').update(keyMaterial).digest(); + const nonce = randomBytes(12); + const cipher = createCipheriv('aes-256-gcm', key, nonce); + const ciphertext = Buffer.concat([ + cipher.update(plaintext, 'utf8'), + cipher.final(), + cipher.getAuthTag(), + ]); + return { + ciphertext, + nonce, + fingerprint: createHmac('sha256', key) + .update(plaintext) + .digest('base64url'), + }; +} diff --git a/apps/api/src/stores/stores.controller.ts b/apps/api/src/stores/stores.controller.ts new file mode 100644 index 0000000..4879f5e --- /dev/null +++ b/apps/api/src/stores/stores.controller.ts @@ -0,0 +1,331 @@ +import { + Body, + Controller, + Delete, + Get, + Headers, + HttpCode, + Param, + Patch, + Post, + Query, + Req, + Res, +} from '@nestjs/common'; +import { + ApiAcceptedResponse, + ApiBearerAuth, + ApiNoContentResponse, + ApiOkResponse, + ApiOperation, + ApiTags, +} from '@nestjs/swagger'; +import { + createStoreRequestSchema, + listStoresQuerySchema, + updateStoreRequestSchema, +} from '@atlas/contracts'; +import { z } from 'zod'; +import { ApiError } from '../common/api-error.js'; +import type { AuthenticatedRequest } from '../auth/auth.guard.js'; +import { CurrentWorkspace } from '../workspace/current-workspace.decorator.js'; +import type { Workspace } from '@atlas/contracts'; +import { PlatformsService } from './platforms.service.js'; +import { StoresService } from './stores.service.js'; + +type HttpResponse = { status: (status: number) => HttpResponse }; + +@ApiTags('Platforms') +@ApiBearerAuth('access-token') +@Controller() +export class PlatformsController { + public constructor(private readonly platformsService: PlatformsService) {} + + @Get('platforms') + @ApiOperation({ summary: '获取已启用的平台及非敏感能力目录' }) + @ApiOkResponse({ description: '平台目录' }) + public async list() { + return { data: await this.platformsService.list() }; + } + + @Get('platform-context') + @ApiOperation({ summary: '获取页头所选平台的默认门店上下文' }) + @ApiOkResponse({ description: '平台、默认门店和门店总数' }) + public async context( + @Headers('x-atlas-platform-id') platformId: string | undefined, + @CurrentWorkspace() workspace: Workspace, + ) { + if (!platformId) { + throw new ApiError( + 400, + 'PLATFORM_CONTEXT_REQUIRED', + '请求缺少 X-Atlas-Platform-Id', + ); + } + return { + data: await this.platformsService.context( + workspace.id, + requireUuid('X-Atlas-Platform-Id', platformId), + ), + }; + } +} + +@ApiTags('Stores') +@ApiBearerAuth('access-token') +@Controller('stores') +export class StoresController { + public constructor(private readonly storesService: StoresService) {} + + @Get() + @ApiOperation({ summary: '按平台分页列出当前工作空间的门店' }) + @ApiOkResponse({ description: '门店列表与不透明游标' }) + public async list( + @Query() query: unknown, + @Headers('x-atlas-platform-id') platformHeader: string | undefined, + @CurrentWorkspace() workspace: Workspace, + ) { + if (platformHeader) { + throw new ApiError( + 400, + 'PLATFORM_CONTEXT_CONFLICT', + '门店管理列表不能同时使用平台 header 和 platform_id 查询参数', + ); + } + return this.storesService.list( + workspace.id, + parse(listStoresQuerySchema, query), + ); + } + + @Get(':storeId') + @ApiOperation({ summary: '读取单个门店' }) + public async get( + @Param('storeId') storeId: string, + @CurrentWorkspace() workspace: Workspace, + ) { + return { + data: await this.storesService.get( + workspace.id, + requireUuid('store_id', storeId), + ), + }; + } + + @Post() + @ApiOperation({ summary: '创建门店连接,并请求异步凭据验证' }) + @ApiAcceptedResponse({ description: '已加密保存凭据,并创建验证操作' }) + public async create( + @Body() body: unknown, + @Headers('idempotency-key') idempotencyKey: string | undefined, + @Req() request: AuthenticatedRequest, + @CurrentWorkspace() workspace: Workspace, + @Res({ passthrough: true }) response: HttpResponse, + ) { + return withStatus( + response, + await this.storesService.create( + workspace.id, + request.auth.userId, + requireIdempotencyKey(idempotencyKey), + parse(createStoreRequestSchema, body), + ), + ); + } + + @Patch(':storeId') + @ApiOperation({ summary: '按版本编辑门店;更新密钥会重新请求验证' }) + @ApiOkResponse({ description: '普通字段已更新' }) + @ApiAcceptedResponse({ description: '新密钥已保存,并创建验证操作' }) + public async update( + @Param('storeId') storeId: string, + @Body() body: unknown, + @Headers('idempotency-key') idempotencyKey: string | undefined, + @Headers('if-match') ifMatch: string | undefined, + @Req() request: AuthenticatedRequest, + @CurrentWorkspace() workspace: Workspace, + @Res({ passthrough: true }) response: HttpResponse, + ) { + return withStatus( + response, + await this.storesService.update( + workspace.id, + request.auth.userId, + requireUuid('store_id', storeId), + requireIdempotencyKey(idempotencyKey), + parseRevision(ifMatch), + parse(updateStoreRequestSchema, body), + ), + ); + } + + @Post(':storeId/set-default') + @ApiOperation({ summary: '设为当前平台默认门店' }) + public async setDefault( + @Param('storeId') storeId: string, + @Headers('idempotency-key') idempotencyKey: string | undefined, + @Req() request: AuthenticatedRequest, + @CurrentWorkspace() workspace: Workspace, + @Res({ passthrough: true }) response: HttpResponse, + ) { + return withStatus( + response, + await this.storesService.setDefault( + workspace.id, + request.auth.userId, + requireUuid('store_id', storeId), + requireIdempotencyKey(idempotencyKey), + ), + ); + } + + @Post(':storeId/credential-verifications') + @ApiOperation({ summary: '手动请求重新验证门店凭据' }) + @ApiAcceptedResponse({ description: '凭据验证操作已入队' }) + public async credentialVerification( + @Param('storeId') storeId: string, + @Headers('idempotency-key') idempotencyKey: string | undefined, + @Req() request: AuthenticatedRequest, + @CurrentWorkspace() workspace: Workspace, + @Res({ passthrough: true }) response: HttpResponse, + ) { + return withStatus( + response, + await this.storesService.requestCredentialVerification( + workspace.id, + request.auth.userId, + requireUuid('store_id', storeId), + requireIdempotencyKey(idempotencyKey), + ), + ); + } + + @Post(':storeId/warehouse-syncs') + @ApiOperation({ summary: '请求异步同步门店仓库' }) + @ApiAcceptedResponse({ description: '仓库同步操作已入队' }) + public async warehouseSync( + @Param('storeId') storeId: string, + @Headers('idempotency-key') idempotencyKey: string | undefined, + @Req() request: AuthenticatedRequest, + @CurrentWorkspace() workspace: Workspace, + @Res({ passthrough: true }) response: HttpResponse, + ) { + return withStatus( + response, + await this.storesService.requestWarehouseSync( + workspace.id, + request.auth.userId, + requireUuid('store_id', storeId), + requireIdempotencyKey(idempotencyKey), + ), + ); + } + + @Get(':storeId/warehouses') + @ApiOperation({ summary: '读取最近成功同步的仓库摘要' }) + public async warehouses( + @Param('storeId') storeId: string, + @CurrentWorkspace() workspace: Workspace, + ) { + return this.storesService.warehouses( + workspace.id, + requireUuid('store_id', storeId), + ); + } + + @Delete(':storeId') + @HttpCode(204) + @ApiOperation({ summary: '软删除门店连接并撤销当前密钥' }) + @ApiNoContentResponse({ description: '门店已删除' }) + public async remove( + @Param('storeId') storeId: string, + @Headers('idempotency-key') idempotencyKey: string | undefined, + @Req() request: AuthenticatedRequest, + @CurrentWorkspace() workspace: Workspace, + @Res({ passthrough: true }) response: HttpResponse, + ) { + return withStatus( + response, + await this.storesService.remove( + workspace.id, + request.auth.userId, + requireUuid('store_id', storeId), + requireIdempotencyKey(idempotencyKey), + ), + ); + } +} + +@ApiTags('Operations') +@ApiBearerAuth('access-token') +@Controller('operations') +export class OperationsController { + public constructor(private readonly storesService: StoresService) {} + + @Get(':operationId') + @ApiOperation({ summary: '读取当前工作空间的异步操作状态' }) + public async get( + @Param('operationId') operationId: string, + @CurrentWorkspace() workspace: Workspace, + ) { + return { + data: await this.storesService.operation( + workspace.id, + requireUuid('operation_id', operationId), + ), + }; + } +} + +function withStatus( + response: HttpResponse, + result: { status: number; body: unknown }, +) { + response.status(result.status); + return result.body; +} + +function requireIdempotencyKey(value: string | undefined): string { + if (!value) { + throw new ApiError( + 400, + 'IDEMPOTENCY_KEY_REQUIRED', + '请求缺少 Idempotency-Key', + ); + } + return requireUuid('Idempotency-Key', value); +} + +function requireUuid(field: string, value: string): string { + if (z.uuid().safeParse(value).success) return value; + throw new ApiError(422, 'VALIDATION_FAILED', '请求参数不符合要求', [ + { field, code: 'INVALID_FIELD', message: `${field} 必须是 UUID` }, + ]); +} + +function parseRevision(value: string | undefined): number { + const match = value?.match(/^"([1-9]\d*)"$/); + if (!match) { + throw new ApiError( + 400, + 'IF_MATCH_REQUIRED', + '请求必须携带形如 "1" 的 If-Match', + ); + } + return Number(match[1]); +} + +function parse(schema: z.ZodType, value: unknown): T { + const result = schema.safeParse(value); + if (result.success) return result.data; + throw new ApiError( + 422, + 'VALIDATION_FAILED', + '请求参数不符合要求', + result.error.issues.map((issue) => ({ + field: issue.path.join('.'), + code: 'INVALID_FIELD', + message: issue.message, + })), + ); +} diff --git a/apps/api/src/stores/stores.module.ts b/apps/api/src/stores/stores.module.ts new file mode 100644 index 0000000..c771910 --- /dev/null +++ b/apps/api/src/stores/stores.module.ts @@ -0,0 +1,15 @@ +import { Module } from '@nestjs/common'; +import { IdempotencyService } from '../common/idempotency.service.js'; +import { + OperationsController, + PlatformsController, + StoresController, +} from './stores.controller.js'; +import { PlatformsService } from './platforms.service.js'; +import { StoresService } from './stores.service.js'; + +@Module({ + controllers: [PlatformsController, StoresController, OperationsController], + providers: [IdempotencyService, PlatformsService, StoresService], +}) +export class StoresModule {} diff --git a/apps/api/src/stores/stores.service.ts b/apps/api/src/stores/stores.service.ts new file mode 100644 index 0000000..7aa5ead --- /dev/null +++ b/apps/api/src/stores/stores.service.ts @@ -0,0 +1,729 @@ +import { Inject, Injectable } from '@nestjs/common'; +import type { + CreateStoreRequest, + ListStoresQuery, + Operation, + Store, + UpdateStoreRequest, +} from '@atlas/contracts'; +import type { Database, DatabaseTransaction } from '@atlas/database'; +import { ApiError } from '../common/api-error.js'; +import { IdempotencyService } from '../common/idempotency.service.js'; +import { APP_CONFIG, type AppConfig } from '../config/app-config.module.js'; +import { DATABASE } from '../database/database.module.js'; +import { encryptStoreSecret } from './store-secret.crypto.js'; + +type StoreRow = Omit & { + credential_checked_at: Date | string | null; + api_key_expires_at: Date | string | null; + product_limit_checked_at: Date | string | null; + warehouses_synced_at: Date | string | null; + created_at: Date | string; + updated_at: Date | string; +}; +type StoreLockRow = { + id: string; + platform_id: string; + revision: number; + is_default: boolean; + status: string; +}; +type OperationRow = { + id: string; + kind: string; + status: string; + created_at: Date | string; + completed_at: Date | string | null; + error_code: string | null; + error_message: string | null; +}; +type WarehouseRow = { + id: string; + platform_warehouse_id: string; + name: string; + fulfillment: string; + is_rfbs: boolean | null; + status: string; + synced_at: Date | string; +}; + +@Injectable() +export class StoresService { + public constructor( + private readonly idempotency: IdempotencyService, + @Inject(DATABASE) private readonly database: Database, + @Inject(APP_CONFIG) private readonly config: AppConfig, + ) {} + + public async list(workspaceId: string, query: ListStoresQuery) { + const cursor = query.cursor ? decodeCursor(query.cursor) : null; + return this.database.workspaceTransaction( + workspaceId, + async (transaction: DatabaseTransaction) => { + const rows = await transaction.query( + `${storeSelect} + WHERE s.platform_id = $1 AND s.deleted_at IS NULL + AND ($2::timestamptz IS NULL OR (s.created_at, s.id) < ($2::timestamptz, $3::uuid)) + GROUP BY s.id, binding.value + ORDER BY s.created_at DESC, s.id DESC + LIMIT $4`, + [ + query.platform_id, + cursor?.createdAt ?? null, + cursor?.id ?? null, + query.limit + 1, + ], + ); + const hasMore = rows.rows.length > query.limit; + const items = rows.rows.slice(0, query.limit).map(toStore); + const last = items.at(-1); + return { + data: items, + meta: { + next_cursor: + hasMore && last + ? encodeCursor(last.created_at, last.id) + : null, + has_more: hasMore, + }, + }; + }, + ); + } + + public async get(workspaceId: string, storeId: string): Promise { + return this.database.workspaceTransaction( + workspaceId, + async (transaction: DatabaseTransaction) => + this.requireStore(transaction, storeId), + ); + } + + public async create( + workspaceId: string, + userId: string, + idempotencyKey: string, + input: CreateStoreRequest, + ) { + return this.idempotency.run( + { + workspaceId, + userId, + method: 'POST', + path: '/api/stores', + key: idempotencyKey, + request: input, + }, + async (transaction) => { + await this.assertPlatformCurrency( + transaction, + input.platform_id, + input.currency_code, + ); + // 同一平台的默认店铺修改串行化,避免两个并发创建都错误地判断自己是首店。 + await lockPlatform(transaction, workspaceId, input.platform_id); + const existing = await transaction.query<{ id: string }>( + `SELECT id FROM atlas.stores + WHERE platform_id = $1 AND platform_client_id = $2 + LIMIT 1`, + [input.platform_id, input.client_id], + ); + if (existing.rows[0]) { + throw new ApiError( + 409, + 'STORE_CONNECTION_ALREADY_EXISTS', + '该平台账户已绑定为门店', + ); + } + const currentStores = await transaction.query<{ + count: string; + }>( + `SELECT count(*)::text AS count FROM atlas.stores + WHERE platform_id = $1 AND deleted_at IS NULL`, + [input.platform_id], + ); + const becomesDefault = + Number(currentStores.rows[0]?.count ?? 0) === 0 || + input.is_default; + if (becomesDefault) { + await transaction.query( + `UPDATE atlas.stores SET is_default = false, revision = revision + 1, updated_at = now() + WHERE platform_id = $1 AND is_default AND deleted_at IS NULL`, + [input.platform_id], + ); + } + const created = await transaction.query<{ id: string }>( + `INSERT INTO atlas.stores + (workspace_id, platform_id, name, platform_client_id, currency_code, is_default, note) + VALUES (current_setting('app.workspace_id')::uuid, $1, $2, $3, $4, $5, $6) + RETURNING id`, + [ + input.platform_id, + input.name, + input.client_id, + input.currency_code, + becomesDefault, + input.note ?? null, + ], + ); + const storeId = created.rows[0].id; + await this.replaceApiKey(transaction, storeId, input.api_key); + const operation = await this.createOperation( + transaction, + userId, + storeId, + 'store_credential_verification', + ); + return { + status: 202, + body: { + data: { + store: await this.requireStore( + transaction, + storeId, + ), + operation, + }, + }, + }; + }, + ); + } + + public async update( + workspaceId: string, + userId: string, + storeId: string, + idempotencyKey: string, + revision: number, + input: UpdateStoreRequest, + ) { + return this.idempotency.run( + { + workspaceId, + userId, + method: 'PATCH', + path: `/api/stores/${storeId}`, + key: idempotencyKey, + request: { if_match: revision, ...input }, + }, + async (transaction) => { + const current = await this.lockStore(transaction, storeId); + this.assertRevision(current, revision); + if (input.currency_code) { + await this.assertPlatformCurrency( + transaction, + current.platform_id, + input.currency_code, + ); + } + const replacingKey = input.api_key !== undefined; + await transaction.query( + `UPDATE atlas.stores + SET name = COALESCE($1, name), currency_code = COALESCE($2, currency_code), + note = CASE WHEN $3 THEN $4 ELSE note END, + status = CASE WHEN $5 THEN 'verifying'::atlas.store_status ELSE status END, + credential_status = CASE WHEN $5 THEN 'unknown'::atlas.credential_status ELSE credential_status END, + last_error_code = CASE WHEN $5 THEN NULL ELSE last_error_code END, + last_error_message = CASE WHEN $5 THEN NULL ELSE last_error_message END, + last_error_at = CASE WHEN $5 THEN NULL ELSE last_error_at END, + revision = revision + 1, updated_at = now() + WHERE id = $6`, + [ + input.name ?? null, + input.currency_code ?? null, + Object.hasOwn(input, 'note'), + input.note ?? null, + replacingKey, + storeId, + ], + ); + if (input.api_key !== undefined) { + await this.replaceApiKey( + transaction, + storeId, + input.api_key, + ); + const operation = await this.createOperation( + transaction, + userId, + storeId, + 'store_credential_verification', + ); + return { + status: 202, + body: { + data: { + store: await this.requireStore( + transaction, + storeId, + ), + operation, + }, + }, + }; + } + return { + status: 200, + body: { + data: await this.requireStore(transaction, storeId), + }, + }; + }, + ); + } + + public async setDefault( + workspaceId: string, + userId: string, + storeId: string, + idempotencyKey: string, + ) { + return this.idempotency.run( + { + workspaceId, + userId, + method: 'POST', + path: `/api/stores/${storeId}/set-default`, + key: idempotencyKey, + request: {}, + }, + async (transaction) => { + const current = await this.lockStore(transaction, storeId); + await lockPlatform( + transaction, + workspaceId, + current.platform_id, + ); + await transaction.query( + `UPDATE atlas.stores SET is_default = false, revision = revision + 1, updated_at = now() + WHERE platform_id = $1 AND is_default AND deleted_at IS NULL AND id <> $2`, + [current.platform_id, storeId], + ); + if (!current.is_default) { + await transaction.query( + `UPDATE atlas.stores SET is_default = true, revision = revision + 1, updated_at = now() + WHERE id = $1`, + [storeId], + ); + } + return { + status: 200, + body: { + data: await this.requireStore(transaction, storeId), + }, + }; + }, + ); + } + + public async requestCredentialVerification( + workspaceId: string, + userId: string, + storeId: string, + idempotencyKey: string, + ) { + return this.requestOperation( + workspaceId, + userId, + storeId, + idempotencyKey, + 'credential-verifications', + 'store_credential_verification', + false, + ); + } + + public async requestWarehouseSync( + workspaceId: string, + userId: string, + storeId: string, + idempotencyKey: string, + ) { + return this.requestOperation( + workspaceId, + userId, + storeId, + idempotencyKey, + 'warehouse-syncs', + 'store_warehouse_sync', + true, + ); + } + + public async remove( + workspaceId: string, + userId: string, + storeId: string, + idempotencyKey: string, + ) { + return this.idempotency.run( + { + workspaceId, + userId, + method: 'DELETE', + path: `/api/stores/${storeId}`, + key: idempotencyKey, + request: {}, + }, + async (transaction) => { + const current = await this.lockStore(transaction, storeId); + if (current.is_default) { + const replacement = await transaction.query<{ id: string }>( + `SELECT id FROM atlas.stores + WHERE platform_id = $1 AND id <> $2 AND deleted_at IS NULL LIMIT 1`, + [current.platform_id, storeId], + ); + if (replacement.rows[0]) { + throw new ApiError( + 422, + 'DEFAULT_STORE_REPLACEMENT_REQUIRED', + '删除默认门店前必须先选择同平台的其他默认门店', + ); + } + } + await transaction.query( + `UPDATE atlas.stores + SET deleted_at = now(), status = 'deleted', is_default = false, + revision = revision + 1, updated_at = now() + WHERE id = $1`, + [storeId], + ); + // 删除连接后立刻撤销可用密钥,避免后台任务或未来恢复流程继续使用它。 + await transaction.query( + `UPDATE atlas.store_secrets SET revoked_at = now(), updated_at = now() + WHERE store_id = $1 AND revoked_at IS NULL`, + [storeId], + ); + return { status: 204, body: null }; + }, + ); + } + + public async warehouses(workspaceId: string, storeId: string) { + return this.database.workspaceTransaction( + workspaceId, + async (transaction: DatabaseTransaction) => { + const store = await this.requireStore(transaction, storeId); + const rows = await transaction.query( + `SELECT id, platform_warehouse_id, name, fulfillment, is_rfbs, status, synced_at + FROM atlas.store_warehouses WHERE store_id = $1 ORDER BY name, id`, + [storeId], + ); + return { + data: rows.rows.map((row) => ({ + ...row, + synced_at: toIso(row.synced_at), + })), + meta: { warehouses_synced_at: store.warehouses_synced_at }, + }; + }, + ); + } + + public async operation(workspaceId: string, operationId: string) { + return this.database.workspaceTransaction( + workspaceId, + async (transaction: DatabaseTransaction) => { + const rows = await transaction.query( + `SELECT id, kind, status, created_at, completed_at, error_code, error_message + FROM atlas.operations WHERE id = $1`, + [operationId], + ); + if (!rows.rows[0]) throw notFound('操作'); + return toOperation(rows.rows[0]); + }, + ); + } + + private async requestOperation( + workspaceId: string, + userId: string, + storeId: string, + idempotencyKey: string, + pathSuffix: string, + kind: string, + requiresValidCredential: boolean, + ) { + return this.idempotency.run( + { + workspaceId, + userId, + method: 'POST', + path: `/api/stores/${storeId}/${pathSuffix}`, + key: idempotencyKey, + request: {}, + }, + async (transaction) => { + const store = await this.requireStore(transaction, storeId); + if (store.status === 'disabled') { + throw new ApiError(422, 'STORE_DISABLED', '门店已停用'); + } + if ( + requiresValidCredential && + store.credential_status !== 'valid' + ) { + throw new ApiError( + 422, + 'STORE_CREDENTIAL_UNAVAILABLE', + '门店凭据尚未验证通过,无法同步仓库', + ); + } + const operation = await this.createOperation( + transaction, + userId, + storeId, + kind, + ); + return { status: 202, body: { data: { operation } } }; + }, + ); + } + + private async assertPlatformCurrency( + transaction: DatabaseTransaction, + platformId: string, + currencyCode: string, + ) { + const platform = await transaction.query<{ id: string }>( + `SELECT id FROM atlas.platforms WHERE id = $1 AND status = 'active'`, + [platformId], + ); + if (!platform.rows[0]) { + throw new ApiError( + 422, + 'PLATFORM_UNAVAILABLE', + '平台不存在或已停用', + ); + } + const supported = await transaction.query<{ currency_code: string }>( + `SELECT pcs.currency_code FROM atlas.platform_currency_support pcs + JOIN atlas.currencies c ON c.code = pcs.currency_code + WHERE pcs.platform_id = $1 AND pcs.currency_code = $2 + AND pcs.is_enabled AND c.is_enabled`, + [platformId, currencyCode], + ); + if (!supported.rows[0]) { + throw new ApiError( + 422, + 'PLATFORM_CURRENCY_UNSUPPORTED', + '该平台不支持此默认计价币种', + ); + } + } + + private async lockStore(transaction: DatabaseTransaction, storeId: string) { + const rows = await transaction.query( + `SELECT id, platform_id, revision, is_default, status + FROM atlas.stores WHERE id = $1 AND deleted_at IS NULL FOR UPDATE`, + [storeId], + ); + if (!rows.rows[0]) throw notFound('门店'); + return rows.rows[0]; + } + + private assertRevision(current: StoreLockRow, expected: number) { + if (current.revision !== expected) { + throw new ApiError( + 409, + 'VERSION_CONFLICT', + '门店已被其他操作更新', + [ + { + field: 'If-Match', + code: 'VERSION_CONFLICT', + message: `当前版本为 ${current.revision}`, + current_revision: current.revision, + }, + ], + ); + } + } + + private async replaceApiKey( + transaction: DatabaseTransaction, + storeId: string, + apiKey: string, + ) { + const secret = encryptStoreSecret( + apiKey, + this.config.STORE_SECRET_ENCRYPTION_KEY, + ); + const existing = await transaction.query<{ id: string }>( + `SELECT id FROM atlas.store_secrets + WHERE store_id = $1 AND kind = 'seller_api_key' AND fingerprint = $2 + FOR UPDATE`, + [storeId, secret.fingerprint], + ); + await transaction.query( + `UPDATE atlas.store_secrets SET revoked_at = now(), updated_at = now() + WHERE store_id = $1 AND kind = 'seller_api_key' AND revoked_at IS NULL`, + [storeId], + ); + if (existing.rows[0]) { + // 同一密钥可被重新提交用于验证;恢复历史行避免违反防重指纹唯一约束。 + await transaction.query( + `UPDATE atlas.store_secrets + SET secret_ciphertext = $1, secret_nonce = $2, encryption_key_version = $3, + status = 'unknown', revoked_at = NULL, updated_at = now() + WHERE id = $4`, + [ + secret.ciphertext, + secret.nonce, + this.config.STORE_SECRET_ENCRYPTION_KEY_VERSION, + existing.rows[0].id, + ], + ); + return; + } + await transaction.query( + `INSERT INTO atlas.store_secrets + (workspace_id, store_id, kind, secret_ciphertext, secret_nonce, encryption_key_version, fingerprint) + VALUES (current_setting('app.workspace_id')::uuid, $1, 'seller_api_key', $2, $3, $4, $5)`, + [ + storeId, + secret.ciphertext, + secret.nonce, + this.config.STORE_SECRET_ENCRYPTION_KEY_VERSION, + secret.fingerprint, + ], + ); + } + + private async createOperation( + transaction: DatabaseTransaction, + userId: string, + storeId: string, + kind: string, + ): Promise { + const created = await transaction.query( + `INSERT INTO atlas.operations + (workspace_id, kind, resource_type, resource_id, created_by_user_id) + VALUES (current_setting('app.workspace_id')::uuid, $1, 'store', $2, $3) + RETURNING id, kind, status, created_at, completed_at, error_code, error_message`, + [kind, storeId, userId], + ); + const operation = toOperation(created.rows[0]); + await transaction.query( + `INSERT INTO atlas.outbox_events + (workspace_id, aggregate_type, aggregate_id, event_type, event_payload, deduplication_key) + VALUES (current_setting('app.workspace_id')::uuid, 'store', $1, $2, $3, $4)`, + [ + storeId, + `${kind}.requested`, + { store_id: storeId, operation_id: operation.id }, + operation.id, + ], + ); + return operation; + } + + private async requireStore( + transaction: DatabaseTransaction, + storeId: string, + ): Promise { + const rows = await transaction.query( + `${storeSelect} + WHERE s.id = $1 AND s.deleted_at IS NULL + GROUP BY s.id, binding.value`, + [storeId], + ); + if (!rows.rows[0]) throw notFound('门店'); + return toStore(rows.rows[0]); + } +} + +const storeSelect = ` + SELECT s.id, s.platform_id, s.name, s.platform_client_id, s.currency_code, + s.is_default, s.note, s.status, s.credential_status, s.credential_checked_at, + CASE WHEN s.last_error_code IS NULL THEN NULL + ELSE jsonb_build_object('code', s.last_error_code, 'message', s.last_error_message, 'at', s.last_error_at) + END AS last_error, + s.api_key_expires_at, s.product_limit, s.product_limit_checked_at, + count(sw.id)::integer AS warehouse_count, max(sw.synced_at) AS warehouses_synced_at, + binding.value AS watermark_template, s.created_at, s.updated_at, s.revision + FROM atlas.stores s + LEFT JOIN atlas.store_warehouses sw ON sw.store_id = s.id + LEFT JOIN LATERAL ( + SELECT jsonb_build_object('id', wt.id, 'name', wt.name) AS value + FROM atlas.store_watermark_bindings wb + JOIN atlas.watermark_templates wt ON wt.id = wb.template_id + WHERE wb.store_id = s.id AND wb.unbound_at IS NULL + LIMIT 1 + ) binding ON true`; + +function toStore(row: StoreRow): Store { + return { + ...row, + credential_checked_at: toIso(row.credential_checked_at), + api_key_expires_at: toIso(row.api_key_expires_at), + product_limit_checked_at: toIso(row.product_limit_checked_at), + warehouses_synced_at: toIso(row.warehouses_synced_at), + created_at: toRequiredIso(row.created_at), + updated_at: toRequiredIso(row.updated_at), + cookie_status: null, + }; +} + +function toOperation(row: OperationRow): Operation { + return { + id: row.id, + kind: row.kind, + status: row.status, + created_at: toRequiredIso(row.created_at), + completed_at: toIso(row.completed_at), + error: + row.error_code && row.error_message + ? { code: row.error_code, message: row.error_message } + : null, + }; +} + +function toIso(value: Date | string | null): string | null { + if (value === null) return null; + return value instanceof Date ? value.toISOString() : value; +} + +function toRequiredIso(value: Date | string): string { + return value instanceof Date ? value.toISOString() : value; +} + +function notFound(resource: string) { + return new ApiError(404, 'RESOURCE_NOT_FOUND', `${resource}不存在`); +} + +async function lockPlatform( + transaction: DatabaseTransaction, + workspaceId: string, + platformId: string, +) { + await transaction.query( + `SELECT pg_advisory_xact_lock(hashtextextended($1, 0))`, + [`${workspaceId}:${platformId}`], + ); +} + +function encodeCursor(createdAt: string, id: string): string { + return Buffer.from(JSON.stringify({ createdAt, id })).toString('base64url'); +} + +function decodeCursor(cursor: string): { createdAt: string; id: string } { + try { + const value = JSON.parse( + Buffer.from(cursor, 'base64url').toString('utf8'), + ) as { createdAt?: unknown; id?: unknown }; + if ( + typeof value.createdAt !== 'string' || + Number.isNaN(Date.parse(value.createdAt)) || + typeof value.id !== 'string' || + !/^[0-9a-f]{8}-[0-9a-f-]{27}$/i.test(value.id) + ) { + throw new Error('invalid cursor'); + } + return { createdAt: value.createdAt, id: value.id }; + } catch { + throw new ApiError(422, 'VALIDATION_FAILED', '分页游标无效', [ + { field: 'cursor', code: 'INVALID_FIELD', message: '分页游标无效' }, + ]); + } +} diff --git a/apps/api/src/workspace/current-workspace.decorator.ts b/apps/api/src/workspace/current-workspace.decorator.ts new file mode 100644 index 0000000..83f7cfe --- /dev/null +++ b/apps/api/src/workspace/current-workspace.decorator.ts @@ -0,0 +1,13 @@ +import { createParamDecorator, type ExecutionContext } from '@nestjs/common'; +import type { Workspace } from '@atlas/contracts'; +import type { WorkspaceAuthenticatedRequest } from './workspace-context.guard.js'; + +// 受保护接口经全局工作空间守卫验证后,只能从这里读取当前工作空间。 +export const CurrentWorkspace = createParamDecorator( + (_data: unknown, context: ExecutionContext): Workspace => { + const request = context + .switchToHttp() + .getRequest(); + return request.auth.workspace; + }, +); diff --git a/apps/api/src/workspace/workspace-context.guard.ts b/apps/api/src/workspace/workspace-context.guard.ts new file mode 100644 index 0000000..1fd66c7 --- /dev/null +++ b/apps/api/src/workspace/workspace-context.guard.ts @@ -0,0 +1,63 @@ +import { + CanActivate, + ExecutionContext, + Inject, + Injectable, +} from '@nestjs/common'; +import type { Workspace } from '@atlas/contracts'; +import type { Database } from '@atlas/database'; +import { Reflector } from '@nestjs/core'; +import { ApiError } from '../common/api-error.js'; +import { IS_PUBLIC_ENDPOINT } from '../common/public.decorator.js'; +import { DATABASE } from '../database/database.module.js'; +import type { AuthenticatedRequest } from '../auth/auth.guard.js'; + +export type WorkspaceAuthenticatedRequest = AuthenticatedRequest & { + auth: AuthenticatedRequest['auth'] & { workspace: Workspace }; +}; + +@Injectable() +export class WorkspaceContextGuard implements CanActivate { + public constructor( + @Inject(Reflector) private readonly reflector: Reflector, + @Inject(DATABASE) private readonly database: Database, + ) {} + + public async canActivate(context: ExecutionContext): Promise { + if ( + this.reflector.getAllAndOverride(IS_PUBLIC_ENDPOINT, [ + context.getHandler(), + context.getClass(), + ]) + ) { + return true; + } + + const request = context + .switchToHttp() + .getRequest(); + // 当前一期每位用户只有一个个人工作空间;后续多人协作时此处将按显式选择的工作空间校验 membership。 + const workspace = await this.findCurrentWorkspace(request.auth.userId); + if (!workspace) { + throw new ApiError( + 403, + 'WORKSPACE_MEMBERSHIP_REQUIRED', + '当前账户没有可用工作空间', + ); + } + // 后续控制器和服务只使用此处验证过的上下文,绝不相信客户端传入 workspace_id。 + request.auth.workspace = workspace; + return true; + } + + private async findCurrentWorkspace( + userId: string, + ): Promise { + // 排序规则是首期“唯一有效工作空间”的临时选择策略,不是未来的工作空间切换协议。 + const result = await this.database.query( + `SELECT w.id, w.name, m.role FROM atlas.workspace_memberships m JOIN atlas.workspaces w ON w.id = m.workspace_id WHERE m.user_id = $1 AND w.status = 'active' ORDER BY m.joined_at LIMIT 1`, + [userId], + ); + return result.rows[0] ?? null; + } +} diff --git a/apps/api/test/auth.e2e.test.ts b/apps/api/test/auth.e2e.test.ts new file mode 100644 index 0000000..8e47f5f --- /dev/null +++ b/apps/api/test/auth.e2e.test.ts @@ -0,0 +1,276 @@ +import assert from 'node:assert/strict'; +import { randomUUID } from 'node:crypto'; +import type { AddressInfo } from 'node:net'; +import type { Database } from '@atlas/database'; +import type { NestExpressApplication } from '@nestjs/platform-express'; +import { afterAll, beforeAll, describe, it } from 'vitest'; +import { DATABASE } from '../src/database/database.module.js'; +import { createApplication } from '../src/main.js'; + +type SuccessResponse = { data: T }; +type ErrorResponse = { + error: { + code: string; + message: string; + request_id: string; + details?: Array<{ field: string; code: string; message: string }>; + }; +}; +type SessionPayload = { + access_token: string; + access_token_expires_in: number; + user: { id: string; email: string }; + workspace: { id: string; name: string; role: string }; +}; + +const password = 'correct-horse-battery-staple-123'; +const testUsers: Array<{ userId: string; workspaceId: string }> = []; +let app: NestExpressApplication; +let database: Database; +let baseUrl: string; + +function email(label: string): string { + return `${label}-${randomUUID()}@example.test`; +} + +async function request( + path: string, + init: RequestInit = {}, +): Promise<{ response: Response; body: unknown }> { + const response = await fetch(`${baseUrl}${path}`, { + ...init, + headers: { + 'Content-Type': 'application/json', + ...init.headers, + }, + }); + return { + response, + body: response.status === 204 ? undefined : await response.json(), + }; +} + +function expectSuccess(body: unknown): SuccessResponse { + assert.ok(body && typeof body === 'object' && 'data' in body); + return body as SuccessResponse; +} + +function expectError(body: unknown): ErrorResponse { + assert.ok(body && typeof body === 'object' && 'error' in body); + return body as ErrorResponse; +} + +function refreshCookie(response: Response): string { + const cookie = response.headers.get('set-cookie'); + assert.ok(cookie, '认证成功响应必须写入 refresh cookie'); + assert.match(cookie, /HttpOnly/i); + const match = cookie.match(/atlas_refresh=[^;]+/); + assert.ok(match, '响应必须包含 atlas_refresh cookie'); + return match[0]; +} + +describe('认证 HTTP 集成测试', () => { + beforeAll(async () => { + Object.assign(process.env, { + NODE_ENV: 'test', + SWAGGER_ENABLED: 'false', + AUTH_LOGIN_IP_LIMIT: '100', + AUTH_LOGIN_EMAIL_LIMIT: '2', + AUTH_REGISTER_IP_LIMIT: '100', + AUTH_REGISTER_EMAIL_LIMIT: '100', + AUTH_REFRESH_IP_LIMIT: '100', + }); + const application = await createApplication(); + app = application.app; + database = app.get(DATABASE); + await app.listen(0, '127.0.0.1'); + const address = app.getHttpServer().address() as AddressInfo; + baseUrl = `http://127.0.0.1:${address.port}`; + }); + + afterAll(async () => { + for (const user of testUsers) { + await database.query( + 'DELETE FROM atlas.workspace_memberships WHERE user_id = $1', + [user.userId], + ); + await database.query('DELETE FROM atlas.workspaces WHERE id = $1', [ + user.workspaceId, + ]); + await database.query('DELETE FROM atlas.users WHERE id = $1', [ + user.userId, + ]); + } + await app.close(); + }); + + it('健康与 readiness 端点保持公开', async () => { + const health = await request('/health'); + assert.equal(health.response.status, 200); + assert.deepEqual(health.body, { status: 'ok', service: 'api' }); + + const readiness = await request('/ready'); + assert.equal(readiness.response.status, 200); + assert.deepEqual(readiness.body, { status: 'ready', service: 'api' }); + }); + + it('注册、重复邮箱和参数校验遵守响应契约', async () => { + const registrationEmail = email('register'); + const registration = await request('/api/auth/register', { + method: 'POST', + body: JSON.stringify({ + email: registrationEmail, + password, + password_confirmation: password, + display_name: '集成测试用户', + }), + }); + assert.equal(registration.response.status, 201); + const payload = expectSuccess(registration.body).data; + assert.equal(payload.user.email, registrationEmail); + assert.equal(payload.workspace.role, 'owner'); + assert.ok(payload.access_token); + assert.ok(payload.access_token_expires_in > 0); + refreshCookie(registration.response); + testUsers.push({ + userId: payload.user.id, + workspaceId: payload.workspace.id, + }); + + const duplicate = await request('/api/auth/register', { + method: 'POST', + body: JSON.stringify({ + email: registrationEmail, + password, + password_confirmation: password, + }), + }); + assert.equal(duplicate.response.status, 409); + assert.equal( + expectError(duplicate.body).error.code, + 'EMAIL_ALREADY_REGISTERED', + ); + + const invalid = await request('/api/auth/register', { + method: 'POST', + body: JSON.stringify({ + email: 'not-an-email', + password, + password_confirmation: password, + }), + }); + assert.equal(invalid.response.status, 422); + assert.equal(expectError(invalid.body).error.code, 'VALIDATION_FAILED'); + }); + + it('登录、刷新、退出和当前用户读取可形成完整会话闭环', async () => { + const accountEmail = email('session'); + const registration = await request('/api/auth/register', { + method: 'POST', + body: JSON.stringify({ + email: accountEmail, + password, + password_confirmation: password, + }), + }); + const registered = expectSuccess( + registration.body, + ).data; + testUsers.push({ + userId: registered.user.id, + workspaceId: registered.workspace.id, + }); + + const login = await request('/api/auth/login', { + method: 'POST', + body: JSON.stringify({ email: accountEmail, password }), + }); + assert.equal(login.response.status, 200); + const loggedIn = expectSuccess(login.body).data; + const loginRefreshCookie = refreshCookie(login.response); + + const currentUser = await request('/api/auth/me', { + headers: { Authorization: `Bearer ${loggedIn.access_token}` }, + }); + assert.equal(currentUser.response.status, 200); + const me = expectSuccess<{ + user: { id: string }; + workspace: { id: string }; + }>(currentUser.body).data; + assert.equal(me.user.id, registered.user.id); + assert.equal(me.workspace.id, registered.workspace.id); + + const refresh = await request('/api/auth/refresh', { + method: 'POST', + headers: { Cookie: loginRefreshCookie }, + }); + assert.equal(refresh.response.status, 200); + const refreshed = expectSuccess<{ + access_token: string; + access_token_expires_in: number; + }>(refresh.body).data; + assert.ok(refreshed.access_token); + const refreshedCookie = refreshCookie(refresh.response); + + const reusedRefresh = await request('/api/auth/refresh', { + method: 'POST', + headers: { Cookie: loginRefreshCookie }, + }); + assert.equal(reusedRefresh.response.status, 401); + assert.equal( + expectError(reusedRefresh.body).error.code, + 'SESSION_EXPIRED', + ); + + const logout = await request('/api/auth/logout', { + method: 'POST', + headers: { + Authorization: `Bearer ${refreshed.access_token}`, + Cookie: refreshedCookie, + }, + }); + assert.equal(logout.response.status, 204); + assert.equal(logout.body, undefined); + + const revoked = await request('/api/auth/me', { + headers: { Authorization: `Bearer ${refreshed.access_token}` }, + }); + assert.equal(revoked.response.status, 401); + }); + + it('拒绝错误密码、无效访问令牌和超过邮箱限额的登录请求', async () => { + const accountEmail = email('rejected'); + const wrongPassword = await request('/api/auth/login', { + method: 'POST', + body: JSON.stringify({ email: accountEmail, password }), + }); + assert.equal(wrongPassword.response.status, 401); + const wrongPasswordError = expectError(wrongPassword.body).error; + assert.equal(wrongPasswordError.code, 'INVALID_CREDENTIALS'); + assert.equal( + wrongPasswordError.request_id, + wrongPassword.response.headers.get('x-request-id'), + ); + + const invalidToken = await request('/api/auth/me', { + headers: { Authorization: 'Bearer invalid-access-token' }, + }); + assert.equal(invalidToken.response.status, 401); + assert.equal(expectError(invalidToken.body).error.code, 'HTTP_ERROR'); + + const rateLimitedEmail = email('rate-limit'); + for (const expectedStatus of [401, 401, 429]) { + const response = await request('/api/auth/login', { + method: 'POST', + body: JSON.stringify({ email: rateLimitedEmail, password }), + }); + assert.equal(response.response.status, expectedStatus); + if (expectedStatus === 429) { + assert.equal( + expectError(response.body).error.code, + 'AUTH_RATE_LIMITED', + ); + } + } + }); +}); diff --git a/apps/api/test/stores.e2e.test.ts b/apps/api/test/stores.e2e.test.ts new file mode 100644 index 0000000..07a91e5 --- /dev/null +++ b/apps/api/test/stores.e2e.test.ts @@ -0,0 +1,311 @@ +import assert from 'node:assert/strict'; +import { randomUUID } from 'node:crypto'; +import type { AddressInfo } from 'node:net'; +import type { Database } from '@atlas/database'; +import type { NestExpressApplication } from '@nestjs/platform-express'; +import { afterAll, beforeAll, describe, it } from 'vitest'; +import { DATABASE } from '../src/database/database.module.js'; +import { createApplication } from '../src/main.js'; + +type SuccessResponse = { data: T }; +type ErrorResponse = { error: { code: string } }; +type Session = { + access_token: string; + user: { id: string }; + workspace: { id: string }; +}; +type Store = { + id: string; + name: string; + is_default: boolean; + status: string; + credential_status: string; + revision: number; +}; + +const password = 'correct-horse-battery-staple-123'; +const testUsers: Array<{ userId: string; workspaceId: string }> = []; +let app: NestExpressApplication; +let database: Database; +let baseUrl: string; + +function email(label: string) { + return `${label}-${randomUUID()}@example.test`; +} + +async function request(path: string, init: RequestInit = {}) { + const response = await fetch(`${baseUrl}${path}`, { + ...init, + headers: { 'Content-Type': 'application/json', ...init.headers }, + }); + return { + response, + body: response.status === 204 ? undefined : await response.json(), + }; +} + +function success(body: unknown): SuccessResponse { + assert.ok(body && typeof body === 'object' && 'data' in body); + return body as SuccessResponse; +} + +function error(body: unknown): ErrorResponse { + assert.ok(body && typeof body === 'object' && 'error' in body); + return body as ErrorResponse; +} + +async function register(label: string): Promise { + const result = await request('/api/auth/register', { + method: 'POST', + body: JSON.stringify({ + email: email(label), + password, + password_confirmation: password, + }), + }); + assert.equal(result.response.status, 201); + const session = success(result.body).data; + testUsers.push({ + userId: session.user.id, + workspaceId: session.workspace.id, + }); + return session; +} + +function headers(session: Session, idempotencyKey?: string) { + return { + Authorization: `Bearer ${session.access_token}`, + ...(idempotencyKey ? { 'Idempotency-Key': idempotencyKey } : {}), + }; +} + +describe('门店 HTTP 集成测试', () => { + beforeAll(async () => { + Object.assign(process.env, { + NODE_ENV: 'test', + SWAGGER_ENABLED: 'false', + AUTH_LOGIN_IP_LIMIT: '100', + AUTH_LOGIN_EMAIL_LIMIT: '100', + AUTH_REGISTER_IP_LIMIT: '100', + AUTH_REGISTER_EMAIL_LIMIT: '100', + AUTH_REFRESH_IP_LIMIT: '100', + }); + const application = await createApplication(); + app = application.app; + database = app.get(DATABASE); + await app.listen(0, '127.0.0.1'); + const address = app.getHttpServer().address() as AddressInfo; + baseUrl = `http://127.0.0.1:${address.port}`; + }); + + afterAll(async () => { + for (const user of testUsers) { + // 门店测试会创建操作和 Outbox;先在工作空间事务内清理这些受 RLS 保护的记录。 + await database.workspaceTransaction( + user.workspaceId, + async (tx) => { + await tx.query( + 'DELETE FROM atlas.idempotency_requests WHERE workspace_id = $1', + [user.workspaceId], + ); + await tx.query( + 'DELETE FROM atlas.outbox_events WHERE workspace_id = $1', + [user.workspaceId], + ); + await tx.query( + 'DELETE FROM atlas.operations WHERE workspace_id = $1', + [user.workspaceId], + ); + await tx.query( + 'DELETE FROM atlas.stores WHERE workspace_id = $1', + [user.workspaceId], + ); + }, + ); + await database.query( + 'DELETE FROM atlas.workspace_memberships WHERE user_id = $1', + [user.userId], + ); + await database.query('DELETE FROM atlas.workspaces WHERE id = $1', [ + user.workspaceId, + ]); + await database.query('DELETE FROM atlas.users WHERE id = $1', [ + user.userId, + ]); + } + await app.close(); + }); + + it('创建门店时加密保存凭据、创建操作,并能安全重放相同请求', async () => { + const owner = await register('stores-owner'); + const platforms = await request('/api/platforms', { + headers: headers(owner), + }); + assert.equal(platforms.response.status, 200); + const platform = success< + Array<{ + id: string; + code: string; + default_market_code: string | null; + default_locale: string | null; + }> + >(platforms.body).data.find((item) => item.code === 'OZON'); + assert.ok(platform); + assert.equal(platform.default_market_code, 'RU'); + assert.equal(platform.default_locale, 'ru-RU'); + + const idempotencyKey = randomUUID(); + const createBody = { + platform_id: platform.id, + name: '测试 Ozon 主店', + client_id: `client-${randomUUID()}`, + api_key: 'secret-only-in-request', + currency_code: 'RUB', + is_default: false, + note: '首家门店仍应成为默认门店', + }; + const created = await request('/api/stores', { + method: 'POST', + headers: headers(owner, idempotencyKey), + body: JSON.stringify(createBody), + }); + assert.equal(created.response.status, 202); + const createdData = success<{ + store: Store & { platform_client_id: string }; + operation: { id: string; status: string }; + }>(created.body).data; + assert.equal(createdData.store.is_default, true); + assert.equal(createdData.store.status, 'verifying'); + assert.equal(createdData.store.credential_status, 'unknown'); + assert.equal( + createdData.store.platform_client_id, + createBody.client_id, + ); + assert.equal(createdData.operation.status, 'queued'); + assert.equal( + JSON.stringify(created.body).includes(createBody.api_key), + false, + ); + + const replay = await request('/api/stores', { + method: 'POST', + headers: headers(owner, idempotencyKey), + body: JSON.stringify(createBody), + }); + assert.equal(replay.response.status, 202); + assert.deepEqual(replay.body, created.body); + + const mismatchedReplay = await request('/api/stores', { + method: 'POST', + headers: headers(owner, idempotencyKey), + body: JSON.stringify({ ...createBody, name: '不同请求' }), + }); + assert.equal(mismatchedReplay.response.status, 409); + assert.equal( + error(mismatchedReplay.body).error.code, + 'IDEMPOTENCY_KEY_REUSED', + ); + + const context = await request('/api/platform-context', { + headers: { + ...headers(owner), + 'X-Atlas-Platform-Id': platform.id, + }, + }); + assert.equal(context.response.status, 200); + assert.equal( + success<{ store_count: number; default_store: { id: string } }>( + context.body, + ).data.store_count, + 1, + ); + + const operation = await request( + `/api/operations/${createdData.operation.id}`, + { headers: headers(owner) }, + ); + assert.equal(operation.response.status, 200); + assert.equal( + success<{ status: string }>(operation.body).data.status, + 'queued', + ); + }); + + it('更新版本、切换默认门店、删除和工作空间隔离都遵守契约', async () => { + const owner = await register('stores-lifecycle'); + const otherOwner = await register('stores-isolation'); + const platforms = await request('/api/platforms', { + headers: headers(owner), + }); + const platform = success>( + platforms.body, + ).data.find((item) => item.code === 'OZON'); + assert.ok(platform); + + const first = await createStore(owner, platform.id, '第一家门店'); + const updated = await request(`/api/stores/${first.id}`, { + method: 'PATCH', + headers: { + ...headers(owner, randomUUID()), + 'If-Match': `"${first.revision}"`, + }, + body: JSON.stringify({ name: '第一家门店(已修改)' }), + }); + assert.equal(updated.response.status, 200); + const updatedStore = success(updated.body).data; + assert.equal(updatedStore.revision, first.revision + 1); + + const stale = await request(`/api/stores/${first.id}`, { + method: 'PATCH', + headers: { + ...headers(owner, randomUUID()), + 'If-Match': `"${first.revision}"`, + }, + body: JSON.stringify({ name: '过期修改' }), + }); + assert.equal(stale.response.status, 409); + assert.equal(error(stale.body).error.code, 'VERSION_CONFLICT'); + + const second = await createStore(owner, platform.id, '第二家门店'); + const makeDefault = await request( + `/api/stores/${second.id}/set-default`, + { + method: 'POST', + headers: headers(owner, randomUUID()), + }, + ); + assert.equal(makeDefault.response.status, 200); + assert.equal(success(makeDefault.body).data.is_default, true); + + const foreignRead = await request(`/api/stores/${first.id}`, { + headers: headers(otherOwner), + }); + assert.equal(foreignRead.response.status, 404); + + const deleted = await request(`/api/stores/${first.id}`, { + method: 'DELETE', + headers: headers(owner, randomUUID()), + }); + assert.equal(deleted.response.status, 204); + const absent = await request(`/api/stores/${first.id}`, { + headers: headers(owner), + }); + assert.equal(absent.response.status, 404); + }); +}); + +async function createStore(owner: Session, platformId: string, name: string) { + const result = await request('/api/stores', { + method: 'POST', + headers: headers(owner, randomUUID()), + body: JSON.stringify({ + platform_id: platformId, + name, + client_id: `client-${randomUUID()}`, + api_key: `key-${randomUUID()}`, + currency_code: 'RUB', + }), + }); + assert.equal(result.response.status, 202); + return success<{ store: Store }>(result.body).data.store; +} diff --git a/apps/api/tsconfig.test.json b/apps/api/tsconfig.test.json new file mode 100644 index 0000000..7c54ada --- /dev/null +++ b/apps/api/tsconfig.test.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "rootDir": ".", + "noEmit": true + }, + "include": ["src/**/*.ts", "test/**/*.ts", "vitest.config.ts"] +} diff --git a/apps/api/vitest.config.ts b/apps/api/vitest.config.ts new file mode 100644 index 0000000..8d1eeb3 --- /dev/null +++ b/apps/api/vitest.config.ts @@ -0,0 +1,9 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + include: ['test/**/*.test.ts'], + fileParallelism: false, + testTimeout: 30_000, + }, +}); diff --git a/docs/api/README.md b/docs/api/README.md index 0ffeac1..a89e891 100644 --- a/docs/api/README.md +++ b/docs/api/README.md @@ -1,6 +1,6 @@ # Atlas HTTP API 设计 -> 状态:第一批可评审契约。本文档描述预期的 NestJS HTTP API,不代表接口已经实现。接口统一以前缀 `/api` 提供,JSON 字段使用 `snake_case`,时间使用 ISO 8601 UTC 字符串,ID 使用 UUID。 +> 状态:第一批契约已冻结。认证、平台目录/上下文、门店基础管理和操作查询已实现;其余模块仍是设计契约。接口统一以前缀 `/api` 提供,JSON 字段使用 `snake_case`,时间使用 ISO 8601 UTC 字符串,ID 使用 UUID。 API 启动后会在 `/api-docs` 提供 Swagger UI,并在其 OpenAPI 文档中标记已实现的接口。Swagger 是运行时参考,不替代本目录的冻结契约。 @@ -10,9 +10,9 @@ API 启动后会在 `/api-docs` 提供 Swagger UI,并在其 OpenAPI 文档中 | 文档 | 状态 | 范围 | |---|---|---| -| [`conventions.md`](./conventions.md) | 已设计 | 鉴权、全局上下文、响应、分页、错误、并发与异步任务。 | -| [`auth.md`](./auth.md) | 已设计 | 邮箱注册、登录、刷新会话、退出、当前用户。 | -| [`stores-and-platforms.md`](./stores-and-platforms.md) | 已设计 | 平台目录、页头上下文、店铺授权、凭据校验、仓库、默认店铺。 | +| [`conventions.md`](./conventions.md) | 部分已实现 | 鉴权、全局上下文、响应、分页、错误、并发与异步任务。 | +| [`auth.md`](./auth.md) | 已实现 | 邮箱注册、登录、刷新会话、退出、当前用户。 | +| [`stores-and-platforms.md`](./stores-and-platforms.md) | 部分已实现 | 平台目录、页头上下文、店铺授权、门店 CRUD、默认店铺、操作查询与仓库读取;平台实际验证与同步 Worker 待实现。 | | [`watermarks-and-assets.md`](./watermarks-and-assets.md) | 已设计 | 素材直传、短时访问、水印模板、字体、店铺推荐水印。 | | [`pricing.md`](./pricing.md) | 已设计 | 汇率、物流价卡、即时试算、定价方案、报价快照衔接。 | | [`collection-and-extension.md`](./collection-and-extension.md) | 已设计 | 插件授权、采集写入、采集箱查询、素材转存与状态。 | diff --git a/docs/api/auth.md b/docs/api/auth.md index fe3d1d3..ec8c5ad 100644 --- a/docs/api/auth.md +++ b/docs/api/auth.md @@ -68,11 +68,13 @@ 成功响应与注册相同,刷新 token 写入新的 `HttpOnly` cookie。失败统一返回 `401 INVALID_CREDENTIALS`;禁用账户返回 `403 ACCOUNT_DISABLED`。接口应按 IP 与邮箱摘要双维度限流,但不保存明文密码或将其记入日志。 +成功返回 `200 OK`、`Set-Cookie` refresh token 及上述响应体。 + ## 4. 刷新与退出 `POST /api/auth/refresh` -请求不需要 body,浏览器自动携带 refresh cookie。服务端轮换 refresh token、撤销旧 session 并返回新的短期 access token: +请求不需要 body,浏览器自动携带 refresh cookie。服务端轮换 refresh token、撤销旧 session 并以 `200 OK` 返回新的短期 access token: ```json { "data": { "access_token": "eyJ…", "access_token_expires_in": 900 } } diff --git a/docs/api/conventions.md b/docs/api/conventions.md index 295d4c5..34f7d77 100644 --- a/docs/api/conventions.md +++ b/docs/api/conventions.md @@ -8,7 +8,9 @@ Authorization: Bearer ``` -访问令牌只携带用户会话标识,不以客户端传入的 `workspace_id` 判定数据归属。服务端解析用户、选择首期唯一的有效工作空间、验证成员关系后,在每一个数据库事务中执行 `SET LOCAL app.workspace_id`。RLS 仅是第二道防线,业务层仍须验证资源归属。 +访问令牌只携带用户会话标识,不以客户端传入的 `workspace_id` 判定数据归属。全局认证守卫先验证 session,全局工作空间守卫再解析首期唯一的有效工作空间并验证成员关系;受保护处理器从 `request.auth.workspace` 或 `@CurrentWorkspace()` 取得已验证的 `workspaceId` 与角色。业务 SQL 必须将该 `workspaceId` 传给短生命周期的 `workspaceTransaction`,由其在每一个数据库事务中执行 `SET LOCAL app.workspace_id`。RLS 仅是第二道防线,业务层仍须验证资源归属。 + +`/health`、`/ready`、注册、登录与 refresh 是显式标记的公开端点。新接口默认受上述两个全局守卫保护;不得因便利而自行跳过,除非先在契约中说明公开理由。 Web 登录后的 refresh token 放在 `HttpOnly`、`Secure`(生产)、`SameSite=Lax` 的 cookie 中,永不出现在 JSON、日志或前端持久化存储。access token 由前端仅在内存中短暂持有;插件使用独立授权码流程,留待采集插件接口文档定义。 diff --git a/docs/project/HANDOFF.md b/docs/project/HANDOFF.md index 0dc8974..684626e 100644 --- a/docs/project/HANDOFF.md +++ b/docs/project/HANDOFF.md @@ -6,7 +6,7 @@ 这是一个全新的云端产品,不是 `ozon-seller-kit` 的本地版重构。目标用户可拥有多个门店,每个门店只能绑定一个平台;平台自身可支持多个市场、国家、语言和币种。因此语言、币种、类目和发布规则不能写死为 Ozon 或中文/俄文。 -当前已完成 pnpm monorepo 初始化:包含 Web、NestJS API、BullMQ Worker、WXT 浏览器扩展、共享 API 契约、数据库包、本地基础设施 Compose 与依赖锁文件。API 仅实现健康检查;Web 已具备完整前端框架(布局、路由、主题)和登录/注册页面,业务页面均为占位;Worker 与扩展为可运行骨架。尚未实现业务模块、迁移执行器、数据库 schema、鉴权或实际部署。不要从旧项目复制 SQLite 模型、无鉴权 API、旧 `/trial/:id` 或商品编辑页组件。可选择性复用已经验证过的纯计价公式、采集扩展思路和 AI 任务经验,但必须先适配多租户和云端边界。 +当前已完成 pnpm monorepo 初始化:包含 Web、NestJS API、BullMQ Worker、WXT 浏览器扩展、共享 API 契约、数据库包、本地基础设施 Compose 与依赖锁文件。API 已实现健康/readiness、集中配置与安全基础、认证、个人工作空间上下文、平台目录/上下文、门店基础管理和操作查询;真实平台验证与同步 Worker 尚未接入。Web 已具备完整前端框架(布局、路由、主题)和登录/注册页面,业务页面均为占位;Worker 与扩展为可运行骨架。不要从旧项目复制 SQLite 模型、无鉴权 API、旧 `/trial/:id` 或商品编辑页组件。可选择性复用已经验证过的纯计价公式、采集扩展思路和 AI 任务经验,但必须先适配多租户和云端边界。 当前运行时基线:Node 24.20.0、pnpm 11.25.0、PostgreSQL 18.6、Redis 7.4.11、MinIO `RELEASE.2025-09-07T16-13-09Z`;Web 默认端口为 `8100`,API 默认端口为 `8200`,扩展 dev server 默认端口为 `8110`(仅本地开发用),Worker 无 HTTP 端口。完整目录、依赖边界与版本表见 [`architecture/project-structure.md`](../architecture/project-structure.md) 和 [`architecture/technology-and-deployment.md`](../architecture/technology-and-deployment.md)。 @@ -82,26 +82,25 @@ User → Workspace → Membership / Role ## 5. 已冻结的第一阶段 API 契约 -第一阶段 HTTP API 的接口范围已讨论完成,当前状态为**设计冻结、业务接口尚未实现**。仓库已有 NestJS API 启动骨架及 `GET /health`,它不构成任何已实现的业务契约。后续编码以 [`docs/api/`](../api/README.md) 为唯一 HTTP 契约来源;旧 [`product/api.md`](../product/api.md) 仅作历史背景,不能作为实现依据。 +第一阶段 HTTP API 的接口范围已讨论完成,当前状态为**设计冻结、部分业务接口已实现**。认证、平台目录/上下文、创建/查询/编辑/默认/删除门店、异步操作读取及仓库摘要读取已有实现与集成测试;门店凭据验证、仓库同步的实际平台调用仍待 Worker 消费 Outbox 后完成。后续编码以 [`docs/api/`](../api/README.md) 为唯一 HTTP 契约来源;旧 [`product/api.md`](../product/api.md) 仅作历史背景,不能作为实现依据。 - 覆盖账户认证、平台/门店、水印与素材、定价、浏览器采集/采集箱、商品编辑/首次发布、在线商品读取与同步。 - 所有接口遵循统一鉴权、工作空间隔离、页头平台上下文、金额字符串、错误格式、`Idempotency-Key`、`If-Match` 和异步 `operation` 约定。 - **响应信封是强制契约:** 成功单资源或同步动作返回 `{ "data": T }`,列表返回 `{ "data": T[], "meta": PaginationMeta }`,失败返回 `{ "error": ApiError }`,`204 No Content` 不返回响应体。项目不采用完整 JSON:API;任何调用方不得自行增加嵌套 `data` 或以 `data: null` 表示错误。完整规则见 [`api/conventions.md`](../api/conventions.md)。 - 关键异步动作必须在同一事务写入业务记录、`operations`(如需用户可见进度)和 `outbox_events`;Dispatcher 至少一次投递 BullMQ,Worker 必须幂等。 -- DDL 已通过临时隔离 PostgreSQL 实例执行验证;API 契约已完成文档评审。这不表示 NestJS 模块、迁移执行器或 Worker 已实现。 +- DDL 已通过本地隔离 PostgreSQL 执行验证;迁移执行器、认证/工作空间基础、首个幂等与 Outbox 写入闭环以及上述门店 HTTP 模块已实现。Outbox Dispatcher 与平台 Worker 仍未实现。 仍需在对应模块开始编码前完成的 P1/P2 决策和数据模型补丁,集中记录在 [`reviews/implementation-readiness-open-items.md`](../reviews/implementation-readiness-open-items.md)。 ## 6. 下一步建议 -项目初始化已完成;下一步进入实现准备,而不是继续扩大 API 范围: +当前优先完成门店纵向闭环,而不是继续扩展商品接口: -1. 以 `001_foundation.sql`、`002_product-domain.sql` 建立可重复执行的迁移执行器,并按数据库角色/RLS 约束验证本地环境。 -2. 在 API 建立配置校验、认证、工作空间上下文和事务包装器;任何工作空间查询前固定 `SET LOCAL app.workspace_id`。 -3. 建立 `operations`、幂等请求和 Outbox Dispatcher 的第一个集成测试闭环。 -4. 在开始商品编辑/在线同步模块前,关闭评审文档中的 P1 事项:同商品归属约束、未映射属性持久化、乐观锁 Repository 规则、平台能力 Schema;并确认在线商品归档策略和 Client ID 编辑边界。 -5. 优先实现账户、平台上下文、门店、素材上传的纵向最小闭环,再接入采集箱和商品编辑;浏览器扩展仅在采集 API 稳定后实现实际解析器。 -6. Web 侧:认证 API 就绪后把登录/注册接入真实 `/api/auth/*`,补主布局路由守卫与刷新后的会话恢复,auth 类型迁移至 `@atlas/contracts`。 +1. 实现 Outbox Dispatcher 与 Worker 的首个消费链路:将 `store_credential_verification` 投递到 Worker,解密密钥后调用平台适配器,回写门店/密钥状态;失败信息必须脱敏。 +2. 在凭据验证通过后实现仓库同步 Worker、幂等 upsert 和状态回写,并补充失败重试、死信与集成测试。 +3. Web 接入真实认证和门店管理 API:登录/注册、会话刷新、平台上下文、门店列表/创建/编辑/默认切换;前端不得保存 API Key 或 refresh token。 +4. 接着实现素材直传和水印管理,再开始采集箱与商品编辑;浏览器扩展仅在采集 API 稳定后实现实际解析器。 +5. 在开始商品编辑/在线同步模块前,关闭评审文档中的 P1 事项:同商品归属约束、未映射属性持久化、乐观锁 Repository 规则、平台能力 Schema;并确认在线商品归档策略和 Client ID 编辑边界。 ## 7. 文档导航 diff --git a/package.json b/package.json index ea20912..2037cb6 100644 --- a/package.json +++ b/package.json @@ -1,28 +1,29 @@ { - "name": "atlas-seller-kit", - "version": "0.1.0", - "private": true, - "packageManager": "pnpm@11.25.0", - "engines": { - "node": ">=24.20.0 <25", - "pnpm": ">=11.25.0 <12" - }, - "scripts": { - "build": "turbo run build", - "dev": "turbo run dev", - "dev:backend": "turbo run dev --filter=@atlas/api --filter=@atlas/worker", - "dev:frontend": "turbo run dev --filter=@atlas/web", - "lint": "turbo run lint", - "typecheck": "turbo run typecheck", - "test": "turbo run test", - "format": "prettier --config ./prettier.config.mjs --write .", - "format:check": "prettier --config ./prettier.config.mjs --check .", - "infra:up": "docker compose --env-file .env -f infra/compose.yaml up -d postgres redis minio", - "infra:down": "docker compose --env-file .env -f infra/compose.yaml down" - }, - "devDependencies": { - "prettier": "3.9.6", - "turbo": "2.10.12", - "typescript": "7.0.2" - } + "name": "atlas-seller-kit", + "version": "0.1.0", + "private": true, + "packageManager": "pnpm@11.25.0", + "engines": { + "node": ">=24.20.0 <25", + "pnpm": ">=11.25.0 <12" + }, + "scripts": { + "build": "turbo run build", + "dev": "turbo run dev", + "dev:backend": "turbo run dev --filter=@atlas/api --filter=@atlas/worker", + "dev:frontend": "turbo run dev --filter=@atlas/web", + "lint": "turbo run lint", + "typecheck": "turbo run typecheck", + "test": "turbo run test", + "test:api": "pnpm --filter @atlas/api test", + "format": "prettier --write .", + "format:check": "prettier --check .", + "infra:up": "docker compose --env-file .env -f infra/compose.yaml up -d postgres redis minio", + "infra:down": "docker compose --env-file .env -f infra/compose.yaml down" + }, + "devDependencies": { + "prettier": "3.9.6", + "turbo": "2.10.12", + "typescript": "7.0.2" + } } diff --git a/packages/contracts/src/index.ts b/packages/contracts/src/index.ts index 470e292..7ca3857 100644 --- a/packages/contracts/src/index.ts +++ b/packages/contracts/src/index.ts @@ -1,2 +1,3 @@ export * from './collection'; export * from './auth'; +export * from './stores'; diff --git a/packages/contracts/src/stores.ts b/packages/contracts/src/stores.ts new file mode 100644 index 0000000..bf5e127 --- /dev/null +++ b/packages/contracts/src/stores.ts @@ -0,0 +1,77 @@ +import { z } from 'zod'; + +const uuidSchema = z.uuid(); +const currencyCodeSchema = z + .string() + .regex(/^[A-Z]{3}$/, '必须是 ISO 4217 大写币种代码'); + +/** 创建门店时唯一允许提交明文 API Key 的请求契约。 */ +export const createStoreRequestSchema = z + .object({ + platform_id: uuidSchema, + name: z.string().trim().min(1).max(120), + client_id: z.string().trim().min(1).max(120), + api_key: z.string().min(1).max(8_192), + currency_code: currencyCodeSchema, + is_default: z.boolean().default(false), + note: z.string().trim().max(2_000).nullable().optional(), + }) + .strict(); + +/** 修改门店不允许变更平台或平台账户,避免授权连接身份被悄然替换。 */ +export const updateStoreRequestSchema = z + .object({ + name: z.string().trim().min(1).max(120).optional(), + currency_code: currencyCodeSchema.optional(), + note: z.string().trim().max(2_000).nullable().optional(), + api_key: z.string().min(1).max(8_192).optional(), + }) + .strict() + .refine((value) => Object.keys(value).length > 0, { + message: '至少需要提交一个可修改字段', + }); + +export const listStoresQuerySchema = z + .object({ + platform_id: uuidSchema, + cursor: z.string().min(1).optional(), + limit: z.coerce.number().int().min(1).max(100).default(20), + }) + .strict(); + +export type CreateStoreRequest = z.infer; +export type UpdateStoreRequest = z.infer; +export type ListStoresQuery = z.infer; + +export type Store = { + id: string; + platform_id: string; + name: string; + platform_client_id: string; + currency_code: string; + is_default: boolean; + note: string | null; + status: string; + credential_status: string; + credential_checked_at: string | null; + last_error: { code: string; message: string; at: string } | null; + api_key_expires_at: string | null; + product_limit: number | null; + product_limit_checked_at: string | null; + warehouse_count: number; + warehouses_synced_at: string | null; + cookie_status: null; + watermark_template: { id: string; name: string } | null; + created_at: string; + updated_at: string; + revision: number; +}; + +export type Operation = { + id: string; + kind: string; + status: string; + created_at: string; + completed_at: string | null; + error: { code: string; message: string } | null; +}; diff --git a/packages/database/migrations/003_platform_capabilities.sql b/packages/database/migrations/003_platform_capabilities.sql new file mode 100644 index 0000000..0fa9d5d --- /dev/null +++ b/packages/database/migrations/003_platform_capabilities.sql @@ -0,0 +1,10 @@ +-- 平台默认上下文属于平台能力,不属于门店;此迁移同时修正已初始化的本地数据库。 +SET search_path TO atlas, public; + +UPDATE platforms +SET capabilities = capabilities || jsonb_build_object( + 'default_market_code', 'RU', + 'default_locale', 'ru-RU' + ), + updated_at = now() +WHERE code = 'OZON'; diff --git a/packages/database/src/migrate.ts b/packages/database/src/migrate.ts index 5a40c09..03fed2e 100644 --- a/packages/database/src/migrate.ts +++ b/packages/database/src/migrate.ts @@ -8,6 +8,7 @@ const migrationsDirectory = join( dirname(fileURLToPath(import.meta.url)), '../migrations', ); +// 迁移只能使用拥有 schema/table 的专用角色,绝不允许复用 API 的最小权限连接。 const connectionString = process.env.MIGRATOR_DATABASE_URL; if (!connectionString) { @@ -24,6 +25,7 @@ async function migrate() { .sort(); const client = await pool.connect(); try { + // 迁移账本与业务 DDL 同库保存,用于阻止已应用 migration 被悄悄改写。 await client.query('CREATE SCHEMA IF NOT EXISTS atlas'); await client.query(`CREATE TABLE IF NOT EXISTS atlas.schema_migrations ( filename TEXT PRIMARY KEY, @@ -41,6 +43,7 @@ async function migrate() { [filename], ); if (applied.rowCount) { + // 已应用文件的内容变化意味着历史与当前 schema 可能不一致,必须人工处理。 if (applied.rows[0].checksum !== checksum) throw new Error( `Applied migration was modified: ${filename}`, @@ -49,6 +52,7 @@ async function migrate() { } await client.query('BEGIN'); try { + // 单个文件原子提交;失败时不会留下半份 DDL 或 migration 账本记录。 await client.query(sql); await client.query( 'INSERT INTO atlas.schema_migrations (filename, checksum) VALUES ($1, $2)', diff --git a/packages/database/src/pool.ts b/packages/database/src/pool.ts index d7685a1..e542787 100644 --- a/packages/database/src/pool.ts +++ b/packages/database/src/pool.ts @@ -11,7 +11,7 @@ export class Database { const client = await this.pool.connect(); try { await client.query('BEGIN'); - // atlas_app_login is NOINHERIT by design; application DML always uses the least-privileged group role. + // atlas_app_login 是 NOINHERIT 登录角色;应用 DML 必须降为最小权限的 atlas_app。 await client.query('SET LOCAL ROLE atlas_app'); const result = await work(client); await client.query('COMMIT'); @@ -24,13 +24,13 @@ export class Database { } } - /** Every tenant-scoped query must run through this method. */ + /** 每个带工作空间边界的业务读写都必须通过此方法执行。 */ public async workspaceTransaction( workspaceId: string, work: (transaction: DatabaseTransaction) => Promise, ): Promise { return this.transaction(async (transaction) => { - // SET LOCAL is scoped to this transaction and cannot leak a tenant id through the pool. + // SET LOCAL 仅作用于当前事务,连接归还池后不会泄漏租户 ID。 await transaction.query( "SELECT set_config('app.workspace_id', $1, true)", [workspaceId], @@ -43,7 +43,7 @@ export class Database { text: string, values?: unknown[], ) { - // Even non-tenant reads use the restricted role; callers cannot accidentally use the login role's privileges. + // 即使不带租户上下文的查询也使用受限角色,调用方不会误用登录角色权限。 return this.transaction((transaction) => transaction.query(text, values), ); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c6c1225..3534cf3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,5924 +1,4805 @@ lockfileVersion: '9.0' settings: - autoInstallPeers: true - excludeLinksFromLockfile: false + autoInstallPeers: true + excludeLinksFromLockfile: false importers: - .: - devDependencies: - prettier: - specifier: 3.9.6 - version: 3.9.6 - turbo: - specifier: 2.10.12 - version: 2.10.12 - typescript: - specifier: 7.0.2 - version: 7.0.2 - apps/api: - dependencies: - '@atlas/contracts': - specifier: workspace:* - version: link:../../packages/contracts - '@atlas/database': - specifier: workspace:* - version: link:../../packages/database - '@nestjs/common': - specifier: 12.0.1 - version: 12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/config': - specifier: 12.0.0 - version: 12.0.0(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2))(rxjs@7.8.2) - '@nestjs/core': - specifier: 12.0.1 - version: 12.0.1(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@12.0.1)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/platform-express': - specifier: 12.0.1 - version: 12.0.1(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@12.0.1) - '@nestjs/swagger': - specifier: 12.0.1 - version: 12.0.1(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@12.0.1)(reflect-metadata@0.2.2) - helmet: - specifier: 8.3.0 - version: 8.3.0 - ioredis: - specifier: 6.0.0 - version: 6.0.0 - reflect-metadata: - specifier: 0.2.2 - version: 0.2.2 - rxjs: - specifier: 7.8.2 - version: 7.8.2 - zod: - specifier: 4.5.4 - version: 4.5.4 - devDependencies: - '@types/express': - specifier: 5.0.6 - version: 5.0.6 - '@types/node': - specifier: 26.3.0 - version: 26.3.0 - tsx: - specifier: 4.23.13 - version: 4.23.13 - typescript: - specifier: 7.0.2 - version: 7.0.2 + .: + devDependencies: + prettier: + specifier: 3.9.6 + version: 3.9.6 + turbo: + specifier: 2.10.12 + version: 2.10.12 + typescript: + specifier: 7.0.2 + version: 7.0.2 - apps/extension: - dependencies: - '@atlas/contracts': - specifier: workspace:* - version: link:../../packages/contracts - '@wxt-dev/module-react': - specifier: 1.2.2 - version: 1.2.2(vite@8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13))(wxt@0.21.4(esbuild@0.28.2)(rolldown@1.2.6)(typescript@7.0.2)(vite@8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13))) - react: - specifier: 19.2.8 - version: 19.2.8 - react-dom: - specifier: 19.2.8 - version: 19.2.8(react@19.2.8) - devDependencies: - '@types/react': - specifier: 19.2.18 - version: 19.2.18 - '@types/react-dom': - specifier: 19.2.5 - version: 19.2.5(@types/react@19.2.18) - typescript: - specifier: 7.0.2 - version: 7.0.2 - wxt: - specifier: 0.21.4 - version: 0.21.4(esbuild@0.28.2)(rolldown@1.2.6)(typescript@7.0.2)(vite@8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)) + apps/api: + dependencies: + '@atlas/contracts': + specifier: workspace:* + version: link:../../packages/contracts + '@atlas/database': + specifier: workspace:* + version: link:../../packages/database + '@nestjs/common': + specifier: 12.0.1 + version: 12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/config': + specifier: 12.0.0 + version: 12.0.0(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2))(rxjs@7.8.2) + '@nestjs/core': + specifier: 12.0.1 + version: 12.0.1(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@12.0.1)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/platform-express': + specifier: 12.0.1 + version: 12.0.1(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@12.0.1) + '@nestjs/swagger': + specifier: 12.0.1 + version: 12.0.1(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@12.0.1)(reflect-metadata@0.2.2) + helmet: + specifier: 8.3.0 + version: 8.3.0 + ioredis: + specifier: 6.0.0 + version: 6.0.0 + reflect-metadata: + specifier: 0.2.2 + version: 0.2.2 + rxjs: + specifier: 7.8.2 + version: 7.8.2 + zod: + specifier: 4.5.4 + version: 4.5.4 + devDependencies: + '@nestjs/testing': + specifier: 12.0.1 + version: 12.0.1(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@12.0.1)(@nestjs/platform-express@12.0.1) + '@types/express': + specifier: 5.0.6 + version: 5.0.6 + '@types/node': + specifier: 26.3.0 + version: 26.3.0 + tsx: + specifier: 4.23.13 + version: 4.23.13 + typescript: + specifier: 7.0.2 + version: 7.0.2 + vitest: + specifier: ^4.1.11 + version: 4.1.11(@types/node@26.3.0)(vite@8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)) - apps/web: - dependencies: - '@ant-design/icons': - specifier: 6.3.4 - version: 6.3.4(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - antd: - specifier: 6.6.2 - version: 6.6.2(luxon@3.7.2)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - axios: - specifier: 1.20.0 - version: 1.20.0(debug@4.4.3) - react: - specifier: 19.2.8 - version: 19.2.8 - react-dom: - specifier: 19.2.8 - version: 19.2.8(react@19.2.8) - react-router-dom: - specifier: 7.18.3 - version: 7.18.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - devDependencies: - '@types/node': - specifier: 26.3.0 - version: 26.3.0 - '@types/react': - specifier: 19.2.18 - version: 19.2.18 - '@types/react-dom': - specifier: 19.2.5 - version: 19.2.5(@types/react@19.2.18) - '@vitejs/plugin-react': - specifier: 6.1.1 - version: 6.1.1(vite@8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)) - typescript: - specifier: 7.0.2 - version: 7.0.2 - vite: - specifier: 8.2.2 - version: 8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13) + apps/extension: + dependencies: + '@atlas/contracts': + specifier: workspace:* + version: link:../../packages/contracts + '@wxt-dev/module-react': + specifier: 1.2.2 + version: 1.2.2(vite@8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13))(wxt@0.21.4(esbuild@0.28.2)(rolldown@1.2.6)(typescript@7.0.2)(vite@8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13))) + react: + specifier: 19.2.8 + version: 19.2.8 + react-dom: + specifier: 19.2.8 + version: 19.2.8(react@19.2.8) + devDependencies: + '@types/react': + specifier: 19.2.18 + version: 19.2.18 + '@types/react-dom': + specifier: 19.2.5 + version: 19.2.5(@types/react@19.2.18) + typescript: + specifier: 7.0.2 + version: 7.0.2 + wxt: + specifier: 0.21.4 + version: 0.21.4(esbuild@0.28.2)(rolldown@1.2.6)(typescript@7.0.2)(vite@8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)) - apps/worker: - dependencies: - '@atlas/contracts': - specifier: workspace:* - version: link:../../packages/contracts - bullmq: - specifier: 6.3.4 - version: 6.3.4(ioredis@6.0.0)(pg@8.23.0) - ioredis: - specifier: 6.0.0 - version: 6.0.0 - devDependencies: - '@types/node': - specifier: 26.3.0 - version: 26.3.0 - tsx: - specifier: 4.23.13 - version: 4.23.13 - typescript: - specifier: 7.0.2 - version: 7.0.2 + apps/web: + dependencies: + '@ant-design/icons': + specifier: 6.3.4 + version: 6.3.4(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + antd: + specifier: 6.6.2 + version: 6.6.2(luxon@3.7.2)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + axios: + specifier: 1.20.0 + version: 1.20.0(debug@4.4.3) + react: + specifier: 19.2.8 + version: 19.2.8 + react-dom: + specifier: 19.2.8 + version: 19.2.8(react@19.2.8) + react-router-dom: + specifier: 7.18.3 + version: 7.18.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + devDependencies: + '@types/node': + specifier: 26.3.0 + version: 26.3.0 + '@types/react': + specifier: 19.2.18 + version: 19.2.18 + '@types/react-dom': + specifier: 19.2.5 + version: 19.2.5(@types/react@19.2.18) + '@vitejs/plugin-react': + specifier: 6.1.1 + version: 6.1.1(vite@8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)) + typescript: + specifier: 7.0.2 + version: 7.0.2 + vite: + specifier: 8.2.2 + version: 8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13) - packages/contracts: - dependencies: - zod: - specifier: 4.5.4 - version: 4.5.4 - devDependencies: - typescript: - specifier: 7.0.2 - version: 7.0.2 + apps/worker: + dependencies: + '@atlas/contracts': + specifier: workspace:* + version: link:../../packages/contracts + bullmq: + specifier: 6.3.4 + version: 6.3.4(ioredis@6.0.0)(pg@8.23.0) + ioredis: + specifier: 6.0.0 + version: 6.0.0 + devDependencies: + '@types/node': + specifier: 26.3.0 + version: 26.3.0 + tsx: + specifier: 4.23.13 + version: 4.23.13 + typescript: + specifier: 7.0.2 + version: 7.0.2 - packages/database: - dependencies: - pg: - specifier: 8.23.0 - version: 8.23.0 - devDependencies: - '@types/node': - specifier: 26.3.0 - version: 26.3.0 - '@types/pg': - specifier: 8.23.1 - version: 8.23.1 - tsx: - specifier: 4.23.13 - version: 4.23.13 - typescript: - specifier: 7.0.2 - version: 7.0.2 + packages/contracts: + dependencies: + zod: + specifier: 4.5.4 + version: 4.5.4 + devDependencies: + typescript: + specifier: 7.0.2 + version: 7.0.2 + + packages/database: + dependencies: + pg: + specifier: 8.23.0 + version: 8.23.0 + devDependencies: + '@types/node': + specifier: 26.3.0 + version: 26.3.0 + '@types/pg': + specifier: 8.23.1 + version: 8.23.1 + tsx: + specifier: 4.23.13 + version: 4.23.13 + typescript: + specifier: 7.0.2 + version: 7.0.2 packages: - '@1natsu/wait-element@4.2.0': - resolution: - { - integrity: sha512-Om0Q+WE9mNrpY4AwMTvkFiYHv8VM7TML3PvOqXy+w6kAjLjKhGYHYX+305+a6J8RVpds9s7IF2Z5aOPYwULFNw==, - } - - '@aklinker1/rollup-plugin-visualizer@5.12.0': - resolution: - { - integrity: sha512-X24LvEGw6UFmy0lpGJDmXsMyBD58XmX1bbwsaMLhNoM+UMQfQ3b2RtC+nz4b/NoRK5r6QJSKJHBNVeUdwqybaQ==, - } - engines: { node: '>=14' } - hasBin: true - peerDependencies: - rollup: 2.x || 3.x || 4.x - peerDependenciesMeta: - rollup: - optional: true - - '@aklinker1/zero-zip@1.0.1': - resolution: - { - integrity: sha512-07a596Bd1QO0bi3tIyt2xruq6vKk7hCUt9enHBwggvipB0iiycoJ9/CqzN6UFawaKbOi6NBfMlUxUXzIOZ7Dsg==, - } - - '@ant-design/colors@8.0.1': - resolution: - { - integrity: sha512-foPVl0+SWIslGUtD/xBr1p9U4AKzPhNYEseXYRRo5QSzGACYZrQbe11AYJbYfAWnWSpGBx6JjBmSeugUsD9vqQ==, - } - - '@ant-design/cssinjs-utils@2.1.2': - resolution: - { - integrity: sha512-5fTHQ158jJJ5dC/ECeyIdZUzKxE/mpEMRZxthyG1sw/AKRHKgJBg00Yi6ACVXgycdje7KahRNvNET/uBccwCnA==, - } - peerDependencies: - react: '>=18' - react-dom: '>=18' - - '@ant-design/cssinjs@2.1.2': - resolution: - { - integrity: sha512-2Hy8BnCEH31xPeSLbhhB2ctCPXE2ZnASdi+KbSeS79BNbUhL9hAEe20SkUk+BR8aKTmqb6+FKFruk7w8z0VoRQ==, - } - peerDependencies: - react: '>=16.0.0' - react-dom: '>=16.0.0' - - '@ant-design/fast-color@3.0.1': - resolution: - { - integrity: sha512-esKJegpW4nckh0o6kV3Tkb7NPIZYbPnnFxmQDUmL08ukXZAvV85TZBr70eGuke/CIArLaP6aw8lt9KILjnWuOw==, - } - engines: { node: '>=8.x' } - - '@ant-design/icons-svg@4.6.0': - resolution: - { - integrity: sha512-PRomU725ABMf/lnQp5HiB7my1kjEbFY0D10N4lXYxK6TIB1gKjIVD5MRThpDaezLgw1D774J8eOeeDB0M6wHrQ==, - } - - '@ant-design/icons@6.3.4': - resolution: - { - integrity: sha512-kDoUlppczVyCUTFthF6cHmPzMBYqNZQhu9j6EyIX/YIdM9j9CZNZoJUjzVw7/1v1VO8WwVMmPp15r/uwIAS0AQ==, - } - engines: { node: '>=8' } - peerDependencies: - react: '>=16.0.0' - react-dom: '>=16.0.0' - - '@ant-design/react-slick@2.0.0': - resolution: - { - integrity: sha512-HMS9sRoEmZey8LsE/Yo6+klhlzU12PisjrVcydW3So7RdklyEd2qehyU6a7Yp+OYN72mgsYs3NFCyP2lCPFVqg==, - } - peerDependencies: - react: ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - - '@babel/helper-string-parser@7.29.7': - resolution: - { - integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==, - } - engines: { node: '>=6.9.0' } - - '@babel/helper-validator-identifier@7.29.7': - resolution: - { - integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==, - } - engines: { node: '>=6.9.0' } - - '@babel/parser@7.29.8': - resolution: - { - integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==, - } - engines: { node: '>=6.0.0' } - hasBin: true - - '@babel/runtime@7.29.7': - resolution: - { - integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==, - } - engines: { node: '>=6.9.0' } - - '@babel/runtime@8.0.0': - resolution: - { - integrity: sha512-sL6cvO2IfkSu/iU+zs2S/w01B7A8V7suXSIKEN4hPFFdZoiPGxrj5pAG0lCaqLWiEIrjKzdznIWuaLcxPR53qw==, - } - - '@babel/types@7.29.8': - resolution: - { - integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==, - } - engines: { node: '>=6.9.0' } - - '@borewit/text-codec@0.2.2': - resolution: - { - integrity: sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==, - } - - '@emotion/hash@0.8.0': - resolution: - { - integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==, - } - - '@emotion/unitless@0.7.5': - resolution: - { - integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==, - } - - '@esbuild/aix-ppc64@0.28.2': - resolution: - { - integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==, - } - engines: { node: '>=18' } - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.28.2': - resolution: - { - integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==, - } - engines: { node: '>=18' } - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.28.2': - resolution: - { - integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==, - } - engines: { node: '>=18' } - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.28.2': - resolution: - { - integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==, - } - engines: { node: '>=18' } - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.28.2': - resolution: - { - integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==, - } - engines: { node: '>=18' } - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.28.2': - resolution: - { - integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==, - } - engines: { node: '>=18' } - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.28.2': - resolution: - { - integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==, - } - engines: { node: '>=18' } - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.28.2': - resolution: - { - integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==, - } - engines: { node: '>=18' } - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.28.2': - resolution: - { - integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==, - } - engines: { node: '>=18' } - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.28.2': - resolution: - { - integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==, - } - engines: { node: '>=18' } - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.28.2': - resolution: - { - integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==, - } - engines: { node: '>=18' } - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.28.2': - resolution: - { - integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==, - } - engines: { node: '>=18' } - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.28.2': - resolution: - { - integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==, - } - engines: { node: '>=18' } - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.28.2': - resolution: - { - integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==, - } - engines: { node: '>=18' } - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.28.2': - resolution: - { - integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==, - } - engines: { node: '>=18' } - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.28.2': - resolution: - { - integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==, - } - engines: { node: '>=18' } - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.28.2': - resolution: - { - integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==, - } - engines: { node: '>=18' } - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-arm64@0.28.2': - resolution: - { - integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==, - } - engines: { node: '>=18' } - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.28.2': - resolution: - { - integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==, - } - engines: { node: '>=18' } - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.28.2': - resolution: - { - integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==, - } - engines: { node: '>=18' } - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.28.2': - resolution: - { - integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==, - } - engines: { node: '>=18' } - cpu: [x64] - os: [openbsd] - - '@esbuild/openharmony-arm64@0.28.2': - resolution: - { - integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==, - } - engines: { node: '>=18' } - cpu: [arm64] - os: [openharmony] - - '@esbuild/sunos-x64@0.28.2': - resolution: - { - integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==, - } - engines: { node: '>=18' } - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.28.2': - resolution: - { - integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==, - } - engines: { node: '>=18' } - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.28.2': - resolution: - { - integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==, - } - engines: { node: '>=18' } - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.28.2': - resolution: - { - integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==, - } - engines: { node: '>=18' } - cpu: [x64] - os: [win32] - - '@ioredis/commands@2.0.0': - resolution: - { - integrity: sha512-vrx0AE/T0h7cRZwfo1M39Cr+ZhZrkf0V8mQN75wucKCxCLD9l/VX6no3gFvrLqD1IlG/1LtzWovqEw3t0Vr9zg==, - } - - '@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.6.0': - resolution: - { - integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==, - } - - '@jridgewell/trace-mapping@0.3.31': - resolution: - { - integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==, - } - - '@lukeed/csprng@1.1.0': - resolution: - { - integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==, - } - engines: { node: '>=8' } - - '@microsoft/tsdoc@0.16.0': - resolution: - { - integrity: sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==, - } - - '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4': - resolution: - { - integrity: sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ==, - } - cpu: [arm64] - os: [darwin] - - '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.4': - resolution: - { - integrity: sha512-zExlW9zUJKZH/tOtVMttwjKa4Xm/3KcNjnE3dPN92uCktwavMxpgCA3MoJK/DOnTWsQgo224OaST27/mPNAf+w==, - } - cpu: [x64] - os: [darwin] - - '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.4': - resolution: - { - integrity: sha512-dgX0P/9wGPJeHFBG+ZmhgE6bmtMt7NP5CRBGyyktpopdk/mW4POnrpQsSLtKI1dwpc+pPLuXHDh6vvskyQE/sw==, - } - cpu: [arm64] - os: [linux] - - '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.4': - resolution: - { - integrity: sha512-Tg3yX65f5GbtXLkrYEHE5oibZG9epyYWas7FogTTEJeDEF9JlXJzKgXaNhT3UXlTOeA+AfZpYZYZ0uPj7Cfquw==, - } - cpu: [arm] - os: [linux] - - '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.4': - resolution: - { - integrity: sha512-8TNXMEjJc3QEy7R/x1INhgiU+XakDAFUzBhaz7+Rbrs8NH5UQeHQxxmzsSBJGyV6I1jW79undiQm8tOI+D+8FQ==, - } - cpu: [x64] - os: [linux] - - '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4': - resolution: - { - integrity: sha512-CmCXPQrkbwExx3j946/PtHWHbYJiCRBRDl4BlkRQcJB/YOwQxJRTpoo7aTsortjgoJ1x7opzTSxn7C+ASSLVjQ==, - } - cpu: [x64] - os: [win32] - - '@nestjs/common@12.0.1': - resolution: - { - integrity: sha512-v0zTaRCTV2K2xSnb3GnJoQKtaR6VxouJtm+P2gpr5w61dlXeWpXl1WVknCSzUqx2QwTV10tBkHETxvQvkf2Exg==, - } - peerDependencies: - class-transformer: '>=0.4.1' - class-validator: '>=0.13.2' - reflect-metadata: ^0.1.12 || ^0.2.0 - rxjs: ^7.1.0 - peerDependenciesMeta: - class-transformer: - optional: true - class-validator: - optional: true - - '@nestjs/config@12.0.0': - resolution: - { - integrity: sha512-pG5+fFfCo3cdgVkLJLvvhUGfxEjwzv9hIAQ1aJVHvHlHVniDWfwX5pR/utgoAkJzSikv2oTR1BmIF03FXdi42Q==, - } - peerDependencies: - '@nestjs/common': ^11.0.0 || ^12.0.0 - rxjs: ^7.1.0 - - '@nestjs/core@12.0.1': - resolution: - { - integrity: sha512-rU6tAi8vDdyzHgN0iW0J4UJvziroOqzHqzlqL7phOSPizaXVEePfv+OUOsdJEOh0Qd14mslc3udOheLrAEcZow==, - } - engines: { node: '>= 20' } - peerDependencies: - '@nestjs/common': ^12.0.0 - '@nestjs/microservices': ^12.0.0 - '@nestjs/platform-express': ^12.0.0 - '@nestjs/websockets': ^12.0.0 - reflect-metadata: ^0.1.12 || ^0.2.0 - rxjs: ^7.1.0 - peerDependenciesMeta: - '@nestjs/microservices': - optional: true - '@nestjs/platform-express': - optional: true - '@nestjs/websockets': - optional: true - - '@nestjs/mapped-types@12.0.0': - resolution: - { - integrity: sha512-aX7lxZcqXldtnSr0bgT2ZPQvpTpIwBMW1GMX29o4s3q02vmq6JoTYuPW0GwYXa8BiFMRX7WbGZVDA703pNqOMQ==, - } - engines: { node: '>=20.19.0' } - peerDependencies: - '@nestjs/common': ^10.0.0 || ^11.0.0 || ^12.0.0 - class-transformer: ^0.4.0 || ^0.5.0 - class-validator: ^0.13.0 || ^0.14.0 || ^0.15.0 - reflect-metadata: ^0.1.12 || ^0.2.0 - peerDependenciesMeta: - class-transformer: - optional: true - class-validator: - optional: true - - '@nestjs/platform-express@12.0.1': - resolution: - { - integrity: sha512-nF8bRgROptMyixYBfiJUAsjj2o9k13zxAjUKYaqHTPk8mTSd+gk7hXz6NykXNrfHWmMEYC9RttQlMUdMHNTbuA==, - } - peerDependencies: - '@nestjs/common': ^12.0.0 - '@nestjs/core': ^12.0.0 - - '@nestjs/swagger@12.0.1': - resolution: - { - integrity: sha512-fQ0WyutSSHedO9HzSkOFKFaRygYNGBno5EggcZljs+KL8tHzPPTO5oyJpaf3BoOKFGGsN/0B13EbIpH2pkPx8g==, - } - engines: { node: ^20.19.0 || >=22.12.0 } - peerDependencies: - '@fastify/static': ^8.0.0 || ^9.0.0 || ^10.0.0 - '@nestjs/common': ^12.0.0 - '@nestjs/core': ^12.0.0 - class-transformer: '*' - class-validator: '*' - reflect-metadata: ^0.1.12 || ^0.2.0 - peerDependenciesMeta: - '@fastify/static': - optional: true - class-transformer: - optional: true - class-validator: - optional: true - - '@oxc-project/types@0.147.0': - resolution: - { - integrity: sha512-IJ3s6ltHLp45S0bh7phkX+gJO7A1Wuz2EaqpAhb8WjqDwbzMiWKHhyyT42tskaWjEYXtHtVCPpnBJVT9+dcRLg==, - } - - '@rc-component/async-validator@6.0.0': - resolution: - { - integrity: sha512-D3AGQwdyE58gmvx6waVSXJ80JGO+IY5L2O8HDnSOex7JNlzB3GuN/4hyHNTdhy2qtOhkpbIjmeAN3tL993wKbA==, - } - engines: { node: '>=14.x' } - - '@rc-component/cascader@1.22.0': - resolution: - { - integrity: sha512-SffrA57aS9oub3VuI7ajPhJTPtaNxngSvtRhD40Rd8dwJ5vfWPSrVanWgeepdWFGBt7EHftIK5RUU0u3rCTwWw==, - } - peerDependencies: - react: '>=18.0.0' - react-dom: '>=18.0.0' - - '@rc-component/checkbox@2.0.0': - resolution: - { - integrity: sha512-3CXGPpAR9gsPKeO2N78HAPOzU30UdemD6HGJoWVJOpa6WleaGB5kzZj3v6bdTZab31YuWgY/RxV3VKPctn0DwQ==, - } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - '@rc-component/collapse@1.2.0': - resolution: - { - integrity: sha512-ZRYSKSS39qsFx93p26bde7JUZJshsUBEQRlRXPuJYlAiNX0vyYlF5TsAm8JZN3LcF8XvKikdzPbgAtXSbkLUkw==, - } - peerDependencies: - react: '>=18.0.0' - react-dom: '>=18.0.0' - - '@rc-component/color-picker@3.1.1': - resolution: - { - integrity: sha512-OHaCHLHszCegdXmIq2ZRIZBN/EtpT6Wm8SG/gpzLATHbVKc/avvuKi+zlOuk05FTWvgaMmpxAko44uRJ3M+2pg==, - } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - '@rc-component/context@2.0.2': - resolution: - { - integrity: sha512-uiGpAlblCNlziHPwj4S4Iy/oemeuz/hR03mbiEjTCXwsqOIN3BOzsRMyDwpyO5Fm0vIEEJRUf9ZtbRLbhksuTA==, - } - peerDependencies: - react: '>=18.0.0' - react-dom: '>=18.0.0' - - '@rc-component/dialog@1.10.0': - resolution: - { - integrity: sha512-eDukNlz9vNszAGv7i3zKXdxEd3wgVmNxuJijYt8zvTh17QwTu8KK/bdURRd/lU4qaMzhO1HKKmMrwOnkaw0BvQ==, - } - peerDependencies: - react: '>=18.0.0' - react-dom: '>=18.0.0' - - '@rc-component/drawer@1.4.2': - resolution: - { - integrity: sha512-1ib+fZEp6FBu+YvcIktm+nCQ+Q+qIpwpoaJH6opGr4ofh2QMq+qdr5DLC4oCf5qf3pcWX9lUWPYX652k4ini8Q==, - } - peerDependencies: - react: '>=18.0.0' - react-dom: '>=18.0.0' - - '@rc-component/dropdown@1.0.3': - resolution: - { - integrity: sha512-YTST/N6kpqpDz3IMuM/PSSZnrDpSOA6dgHv12gPA90ZTSLv2CoqkZ0+9NtwTY6BeO7dstPblSic2QJg7dSFy/g==, - } - peerDependencies: - react: '>=16.11.0' - react-dom: '>=16.11.0' - - '@rc-component/form@1.8.6': - resolution: - { - integrity: sha512-1EXVsSKPZC6kGrIqxVck7kAWM6T65b6et/n5wIcyiaIa41VrDshD0nVLHoBDEIZr2ATQsOP6icb4XQkNFMLBAw==, - } - engines: { node: '>=8.x' } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - '@rc-component/image@1.10.0': - resolution: - { - integrity: sha512-BjeZCRQ+hw+4WAhvrw8rJvy5fckA2xpf/X2XQEOABUHvLTNB9inB98X3Mp54jYQ7g10DfWERQWHXeC4ylxp1Uw==, - } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - '@rc-component/input-number@1.6.2': - resolution: - { - integrity: sha512-Gjcq7meZlCOiWN1t1xCC+7/s85humHVokTBI7PJgTfoyw5OWF74y3e6P8PHX104g9+b54jsodFIzyaj6p8LI9w==, - } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - '@rc-component/input@1.3.1': - resolution: - { - integrity: sha512-iFvTUT9W+JC/MSin2aGAk8NqsVlTzcExNC9DZariON1IWirju9NoNeEk47an4Q8iHazkoVI/y1LnDi88+CPcig==, - } - peerDependencies: - react: '>=16.0.0' - react-dom: '>=16.0.0' - - '@rc-component/listy@1.2.3': - resolution: - { - integrity: sha512-IXiMjV5s0rczLBlfh7G5nB4M3365mrEeedjwKtf5I+Ns3PqRUsebR2h5u8CeFarsVfLUPC2I5p0h09TNoOWyvQ==, - } - peerDependencies: - react: '>=18.0.0' - react-dom: '>=18.0.0' - - '@rc-component/mentions@1.12.0': - resolution: - { - integrity: sha512-v5MBx8zDcqCT+uybJgKpcx3Fgrvj0m3u+A/15RlSBaMx12lLoJZTTYggC3pbYYfohcKujWWUyBz6O6Gp2vGiNA==, - } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - '@rc-component/menu@1.5.0': - resolution: - { - integrity: sha512-RjvzPsZkwVEg3xu+/jDDqDeUCBJAnWylONFlGeQgg5enlNAnlpybqhaMGE/UPEIvr6hL90PGhjFBguJqj0Qb2Q==, - } - peerDependencies: - react: '>=18.0.0' - react-dom: '>=18.0.0' - - '@rc-component/mini-decimal@1.1.4': - resolution: - { - integrity: sha512-xiuXcaCwyOWpD8a8scdExFl+bntNphAW8XeenL1ig2en0AAZY0Pcp4pC0dI22qJ+NvxKn9RoNIoRdqYU3BLH4w==, - } - engines: { node: '>=8.x' } - - '@rc-component/motion@1.3.3': - resolution: - { - integrity: sha512-Xh3IszxvlSv3/PLYFyC2UZi9LNB83yOnkB/LNmRzaypZLvkhqUIPS7MQpGZcCMWrNsXV2p6YTSWbSGvFpEle9A==, - } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - '@rc-component/mutate-observer@2.0.1': - resolution: - { - integrity: sha512-AyarjoLU5YlxuValRi+w8JRH2Z84TBbFO2RoGWz9d8bSu0FqT8DtugH3xC3BV7mUwlmROFauyWuXFuq4IFbH+w==, - } - engines: { node: '>=8.x' } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - '@rc-component/notification@2.0.8': - resolution: - { - integrity: sha512-MTRA3b8eHE14gh5R9nlXzbWZEDEBFVkEHj/FI1VOXw2zrSnSxqbuuU3drsq+k53e6MHwtegoFay1tnNYhtl61Q==, - } - engines: { node: '>=8.x' } - peerDependencies: - react: '>=18.0.0' - react-dom: '>=18.0.0' - - '@rc-component/overflow@1.0.1': - resolution: - { - integrity: sha512-syfmgAABaHCnCDzPwHZ/2tuvIcpOO3jefYZMmfkN+pmo8HKTzsfhS57vxo4ksPdN0By+uWVJhJWNFozNBxi2eA==, - } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - '@rc-component/pagination@1.4.0': - resolution: - { - integrity: sha512-CW1g7P9V8u+e8JQdUsl2RWg+GCsoee0mtJjZUCCxn/vb3jzOwDKm6hAdwddHCVBfWJ58eGUBZz3IvnU8rRktjw==, - } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - '@rc-component/picker@1.12.0': - resolution: - { - integrity: sha512-0FZGgDiDZFMm2hcfGv4jyjm7yWIj2MiwfeTzLL0vWkO+8cCSKdiM9XhWpkn1aAsoI2EwUy48Oz2cGfvL8ZKrfw==, - } - engines: { node: '>=12.x' } - peerDependencies: - date-fns: '>= 2.x' - dayjs: '>= 1.x' - luxon: '>= 3.x' - moment: '>= 2.x' - react: '>=16.9.0' - react-dom: '>=16.9.0' - peerDependenciesMeta: - date-fns: - optional: true - dayjs: - optional: true - luxon: - optional: true - moment: - optional: true - - '@rc-component/portal@2.2.1': - resolution: - { - integrity: sha512-ck+r1kW/JSv0wxPji3KN2ss9K6Z0qqwusw/mf/0JobXhZ8hC2ejZwCJObW/SvDi0uhA0VzmCnx0CaCci95tcmA==, - } - engines: { node: '>=12.x' } - peerDependencies: - react: '>=18.0.0' - react-dom: '>=18.0.0' - - '@rc-component/progress@1.0.3': - resolution: - { - integrity: sha512-Q1nPLIvKr95el/q76yaBh5nv1hqCsWaHQb8U7vXEDMefEhHgM7n3CPoN+o4LHnTyANQHmMFgoS/naAT4Bhxuaw==, - } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - '@rc-component/qrcode@2.0.0': - resolution: - { - integrity: sha512-aAv3QhPP1xyafuTZOxub6a54pCeBnN3IwQkpETrBtthq4BL5IgxnCbuoBWPDpdLw1y1j6BgBUCAKV92+yX06Dw==, - } - engines: { node: '>=8.x' } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - '@rc-component/rate@1.0.1': - resolution: - { - integrity: sha512-bkXxeBqDpl5IOC7yL7GcSYjQx9G8H+6kLYQnNZWeBYq2OYIv1MONd6mqKTjnnJYpV0cQIU2z3atdW0j1kttpTw==, - } - engines: { node: '>=8.x' } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - '@rc-component/resize-observer@1.1.2': - resolution: - { - integrity: sha512-t/Bb0W8uvL4PYKAB3YcChC+DlHh0Wt5kM7q/J+0qpVEUMLe7Hk5zuvc9km0hMnTFPSx5Z7Wu/fzCLN6erVLE8Q==, - } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - '@rc-component/segmented@1.3.0': - resolution: - { - integrity: sha512-5J/bJ01mbDnoA6P/FW8SxUvKn+OgUSTZJPzCNnTBntG50tzoP7DydGhqxp7ggZXZls7me3mc2EQDXakU3iTVFg==, - } - peerDependencies: - react: '>=16.0.0' - react-dom: '>=16.0.0' - - '@rc-component/select@1.10.1': - resolution: - { - integrity: sha512-H+yQsl+qED9NilQ3g6zdpsMwUgwVjrcMTkNHAWRVU/MoNCYgTbDgU+MIMgZDK+rVdd2JUfI/MkysMcZZ0cyQKw==, - } - engines: { node: '>=8.x' } - peerDependencies: - react: '*' - react-dom: '*' - - '@rc-component/slider@1.1.1': - resolution: - { - integrity: sha512-LSzgWGYDgeCDgR4r1XlU29gbYws6HpLnvJd/uMhLeW/vQgxldeR+Wb4uzHDCHiYEbr1bnEHWdjkPxjJRHxuiig==, - } - engines: { node: '>=8.x' } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - '@rc-component/steps@1.2.3': - resolution: - { - integrity: sha512-/b9gHcvDGjTDWJZW7+1kKFvzs0jrEeQ8mFvvIgX+h7xNT0FsOYODJYKjyJR4fPbvMBCfCOEqaBK66HBxov5BQA==, - } - engines: { node: '>=8.x' } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - '@rc-component/switch@1.0.3': - resolution: - { - integrity: sha512-Jgi+EbOBquje/XNdofr7xbJQZPYJP+BlPfR0h+WN4zFkdtB2EWqEfvkXJWeipflwjWip0/17rNbxEAqs8hVHfw==, - } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - '@rc-component/table@1.11.1': - resolution: - { - integrity: sha512-OWdS6DMmeWb7bJBGqPxYZpQbzBlBiXZUu2sqo6Ii7Sjs9GeK1IsrXrWk26SL2c6KEseabswdxrRj7WUm9LdECw==, - } - engines: { node: '>=8.x' } - peerDependencies: - react: '>=18.0.0' - react-dom: '>=18.0.0' - - '@rc-component/tabs@1.13.0': - resolution: - { - integrity: sha512-3FXr+9ZII8tFLWuDWrgjRaxZd2mazkKJAGRFEfVmp4r1qnBglOlxQ78l54Td1aj6/iFaaEReKSAF2HToztU5uw==, - } - engines: { node: '>=8.x' } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - '@rc-component/tooltip@1.5.2': - resolution: - { - integrity: sha512-VLq4BclU3LgRe46g2hTr2bdsM8tFYs7dVwpuD88rPNNg4lCGe8mBSS4FiRzYzS+ffnZ46y4SI8KYKo9K7qBnhw==, - } - peerDependencies: - react: '>=18.0.0' - react-dom: '>=18.0.0' - - '@rc-component/tour@2.4.0': - resolution: - { - integrity: sha512-aui4r4TqmTzwaBgcQxHYep8kM8PTjZFufjokObpy35KfFeZ0k9ArquWFZqegQlH24P14t+F0qO0mGTgzlav1yg==, - } - engines: { node: '>=8.x' } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - '@rc-component/tree-select@1.16.1': - resolution: - { - integrity: sha512-a1Oi6EJhqAhdOxxupdJi6fP0RPHMKn5TcfkX2+llaQ4lF4nwfH7b6SCHcnsybaa2s+pk1yZYwVyeOYkDnEBRdg==, - } - peerDependencies: - react: '*' - react-dom: '*' - - '@rc-component/tree@1.4.0': - resolution: - { - integrity: sha512-dGsJGDJQedA0BqqVgj3F8BvHXTSZijyhTXdbAdkcx8lynzZkty/CV3Z3LOm/fxz+BCfl3dfGiAQpb7Q5XNvl0Q==, - } - engines: { node: '>=10.x' } - peerDependencies: - react: '*' - react-dom: '*' - - '@rc-component/trigger@3.10.1': - resolution: - { - integrity: sha512-mXlDN0IXdtV8Yqqm8195ECCyrbmfvvfKvwVvSlH0+qvKD6BUF8gRhEjSy0FOcD1+CcDRHgTiX99LoxfQrmh3Cw==, - } - engines: { node: '>=8.x' } - peerDependencies: - react: '>=18.0.0' - react-dom: '>=18.0.0' - - '@rc-component/upload@1.1.1': - resolution: - { - integrity: sha512-GvYWSKeaJTOxxC5p6+nOSadzfvXA1h8C/iHFPFZX+szH3JUXrvs+DLiW8YUTBgvMh8m63mJeHrlYlJzAlg+pDA==, - } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - '@rc-component/util@1.13.0': - resolution: - { - integrity: sha512-IXf2zBfZrbQGT+G8LxnoICDBGnMHIPIiq5HCRn3EDfKUx28x1rnbZBj46ULJf4sM8ImTG1SepqfNBdxZziqQ4w==, - } - peerDependencies: - react: '>=18.0.0' - react-dom: '>=18.0.0' - - '@rc-component/virtual-list@1.5.1': - resolution: - { - integrity: sha512-boqHxdtyWC88u8quYgEO49bcBy5fzRiOcnBge+N4nLzs2k8hUQ/yw7JE9dM6yCBE4jSm5YSHVCVMS+suBuJGKA==, - } - engines: { node: '>=8.x' } - peerDependencies: - react: '>=18.0.0' - react-dom: '>=18.0.0' - - '@rolldown/binding-android-arm-eabi@1.2.6': - resolution: - { - integrity: sha512-b+jTcARdTiFLI6jB4a5XjTm0RWd6KcRfQj/I2356fxUZemiho9zQLxo0RtCuMDAyKcLo6cEltkgbQp6d1+sjjQ==, - } - engines: { node: ^20.19.0 || >=22.12.0 } - cpu: [arm] - os: [android] - - '@rolldown/binding-android-arm64@1.2.6': - resolution: - { - integrity: sha512-lkWU8ZJaRk9q3CIEY1Tc7vIFALp3Xw5NfGJo2hQg5oIqNgxWi1zI+IiDEK3r70BF5Dzol1tcXsnzsRc8NLhG+Q==, - } - engines: { node: ^20.19.0 || >=22.12.0 } - cpu: [arm64] - os: [android] - - '@rolldown/binding-darwin-arm64@1.2.6': - resolution: - { - integrity: sha512-dgR56NYnvAszm7Ob1B2/Vn0e8bUQYZH2UjVaMMtMVOCKFSfjhfLmuA/9+O+F+ajUdG6B/bSssrKW6JJYASa8jA==, - } - engines: { node: ^20.19.0 || >=22.12.0 } - cpu: [arm64] - os: [darwin] - - '@rolldown/binding-darwin-x64@1.2.6': - resolution: - { - integrity: sha512-vpVxFvUCFioJqug7OTvqptkc4yb8UX0AwfDmJpaR/0sWz+BUmqSVAf7c8JkUgnN8YLspb4a/N6NhTyMAmdyQ7Q==, - } - engines: { node: ^20.19.0 || >=22.12.0 } - cpu: [x64] - os: [darwin] - - '@rolldown/binding-freebsd-x64@1.2.6': - resolution: - { - integrity: sha512-h1wG6Y6K3JlRswxsI64qQJqBAy4vrLuHgRbc8CZMGSWTOFRY6ghMApM1NKzB2I0n5xV1fjkE18SuVl2QpLeNpA==, - } - engines: { node: ^20.19.0 || >=22.12.0 } - cpu: [x64] - os: [freebsd] - - '@rolldown/binding-linux-arm-gnueabihf@1.2.6': - resolution: - { - integrity: sha512-tbCiqub0q2MVWJKgF5PoAlNWCtQydiOYSLIkd8sByqK/6MMYLJRcSXSYodqYtd0O+Fw7QaVmKKlS4oL94YRZ0w==, - } - engines: { node: ^20.19.0 || >=22.12.0 } - cpu: [arm] - os: [linux] - - '@rolldown/binding-linux-arm64-gnu@1.2.6': - resolution: - { - integrity: sha512-oxK9+baEBPhZG5HB4URY+uU04zJWeZlH6Tb9rB5DK4DF9XR1uXNLXt5Q5ZsugTKayNCNLhkcwz/ye74hRI98dg==, - } - engines: { node: ^20.19.0 || >=22.12.0 } - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@rolldown/binding-linux-arm64-musl@1.2.6': - resolution: - { - integrity: sha512-muWCk27FVBEZtv0MsK8gnfSmgczA8KQ0uRVJbTABKhkRfQc38aUrcb7fhi3BNiyseFmgcRsoMfQsSNJ+DbZdSw==, - } - engines: { node: ^20.19.0 || >=22.12.0 } - cpu: [arm64] - os: [linux] - libc: [musl] - - '@rolldown/binding-linux-ppc64-gnu@1.2.6': - resolution: - { - integrity: sha512-eWDoSfU7Co2qj3vgB3Dt4lj1mG6CoWbcJQkRMP3XJplyCMtuaq3LHvPFjS9QIPvMGWVadJC04Xiy0IdcVPtnwQ==, - } - engines: { node: ^20.19.0 || >=22.12.0 } - cpu: [ppc64] - os: [linux] - libc: [glibc] - - '@rolldown/binding-linux-s390x-gnu@1.2.6': - resolution: - { - integrity: sha512-2bWNjRSIayvupRKxXUY2tWG9fYdoUlTqWywHRvE8Eq3GvuQ+f2HeIkve697fIt+IQs/PV8yFsdWuhp1aJ1PdnA==, - } - engines: { node: ^20.19.0 || >=22.12.0 } - cpu: [s390x] - os: [linux] - libc: [glibc] - - '@rolldown/binding-linux-x64-gnu@1.2.6': - resolution: - { - integrity: sha512-KekI0gS0wLxe1UBSQSjenBVwou/JkcQPDzBPICGZjxUv9k3RteHDPBQaiOicZUFKRIH2wKEimGwVpnJsbPzu7w==, - } - engines: { node: ^20.19.0 || >=22.12.0 } - cpu: [x64] - os: [linux] - libc: [glibc] - - '@rolldown/binding-linux-x64-musl@1.2.6': - resolution: - { - integrity: sha512-TvtPnfVr+HtyGiDmPK4VWmlNm7QhNNAcK5Q9A7aOXsI8545yCyaoMaicXrFZ72JzeYjaUVk7yT243zT0jzjFKQ==, - } - engines: { node: ^20.19.0 || >=22.12.0 } - cpu: [x64] - os: [linux] - libc: [musl] - - '@rolldown/binding-openharmony-arm64@1.2.6': - resolution: - { - integrity: sha512-iOo0VEay2XFhaCcH0sps5XIimkSuOnNaZrf6+ZkoSOQBJPKNU48RkmJv0/lSpipexu5P+ouFgafe5IGr/DiQfg==, - } - engines: { node: ^20.19.0 || >=22.12.0 } - cpu: [arm64] - os: [openharmony] - - '@rolldown/binding-win32-arm64-msvc@1.2.6': - resolution: - { - integrity: sha512-y5NTmmasMS455JlOCO4ZM9krIchv3Mvm1crL1iUPGOPgEzSkves9n0SdC5Sjz6+qWDFhd8/JpfWMH8NSWNHe+A==, - } - engines: { node: ^20.19.0 || >=22.12.0 } - cpu: [arm64] - os: [win32] - - '@rolldown/binding-win32-x64-msvc@1.2.6': - resolution: - { - integrity: sha512-np8iZSLfXlAD4kWhiyq/u0Yt8oZDtRQ8lGhQaCXo2rl37KNjeU0GjJuwr4P3oeZ++ROfofsKNBqR5LTO8aXyWQ==, - } - engines: { node: ^20.19.0 || >=22.12.0 } - cpu: [x64] - os: [win32] - - '@rolldown/pluginutils@1.0.1': - resolution: - { - integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==, - } - - '@scarf/scarf@1.4.0': - resolution: - { - integrity: sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==, - } - - '@standard-schema/spec@1.1.0': - resolution: - { - integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==, - } - - '@tokenizer/inflate@0.4.1': - resolution: - { - integrity: sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==, - } - engines: { node: '>=18' } - - '@tokenizer/token@0.3.0': - resolution: - { - integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==, - } - - '@topcli/prompts@4.0.0': - resolution: - { - integrity: sha512-kkKYPb4k/6kRdnESt77B5vJrrYnYHIYczwv0P1c+tfN/IWEx3KZeKEHoUq7sImIyBEXWdA2uakIroD9pmRJziQ==, - } - engines: { node: '>=22.0.0' } - - '@turbo/darwin-64@2.10.12': - resolution: - { - integrity: sha512-9nKgKoF6ZOUsM+or0OtNf+TTJSfGvDNP7ZFv/ZGWVwOSCkumyctQiTeHwB4UNljHTnC41AqylgbunLDHoccNrA==, - } - cpu: [x64] - os: [darwin] - - '@turbo/darwin-arm64@2.10.12': - resolution: - { - integrity: sha512-H4Elb1jqTZVeIC9bbcNwjSzemZ6RegoTOVHeuV5Osirt2Z8UguTyisMEkvZjPVZgMeN9J4ERZBFad40tFnkb7w==, - } - cpu: [arm64] - os: [darwin] - - '@turbo/linux-64@2.10.12': - resolution: - { - integrity: sha512-lr7KIotukvjZwEXiFSYAeOH3BWzjFVBbSzTbv0fuGFsNukYyH0+g1hB5ecqnJkgkYU+KHEMG1edOhnjiKON1wQ==, - } - cpu: [x64] - os: [android, linux] - - '@turbo/linux-arm64@2.10.12': - resolution: - { - integrity: sha512-f0pZDTtvzB5SuNwuXBaKbZHUCMCukgc8nMlHEuvLmj91Fzec+MEbr3cAvGNor5htEDqZnO6Lxt9N/GPI/77oGA==, - } - cpu: [arm64] - os: [android, linux] - - '@turbo/windows-64@2.10.12': - resolution: - { - integrity: sha512-SDOueJRjS/QcykWf2KCRtTLmIl5YMKsLbXkXQGhDwcTXvKXZiS5ih5lBl/gkwZIpYFjqA/rAlfMzlAFcVHNe0g==, - } - cpu: [x64] - os: [win32] - - '@turbo/windows-arm64@2.10.12': - resolution: - { - integrity: sha512-0i0mVUa4kKk+/B3RwEwPMf9CB+T7ul56hn5FFHNA4VUNTOoLBEd6aNf3FaKfCatDNZ6cicCEf6if9QUTVyzzcA==, - } - cpu: [arm64] - os: [win32] - - '@types/body-parser@1.19.6': - resolution: - { - integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==, - } - - '@types/connect@3.4.38': - resolution: - { - integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==, - } - - '@types/estree@1.0.9': - resolution: - { - integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==, - } - - '@types/express-serve-static-core@5.1.3': - resolution: - { - integrity: sha512-dPfW8NFiOF4wOHc7+N/QSxlY9cfSsenewGbAz8C8U/MULPd/YZ27LvJUIlzaXie7e6Ove9YunJGgC9tbHD2cKw==, - } - - '@types/express@5.0.6': - resolution: - { - integrity: sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==, - } - - '@types/filesystem@0.0.36': - resolution: - { - integrity: sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA==, - } - - '@types/filewriter@0.0.33': - resolution: - { - integrity: sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g==, - } - - '@types/har-format@1.2.16': - resolution: - { - integrity: sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A==, - } - - '@types/http-errors@2.0.5': - resolution: - { - integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==, - } - - '@types/node@26.3.0': - resolution: - { - integrity: sha512-L3fgrnchriRC2ExBflb8j4uZZURHZfQsmQeyVzhjcHW4kkwVyo8/0h1B2MVzMTrYUJYu6G7EWs14hW/L9putqw==, - } - - '@types/pg@8.23.1': - resolution: - { - integrity: sha512-fKVHpikPdg4GKks3JuLEhvwSyvwzF23hnabPy6DD8ljVbC7+6J5dQzdv4arV6jqq57djnMgs1HKBxX4P8aBI3A==, - } - - '@types/qs@6.15.1': - resolution: - { - integrity: sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==, - } - - '@types/range-parser@1.2.7': - resolution: - { - integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==, - } - - '@types/react-dom@19.2.5': - resolution: - { - integrity: sha512-fMPwH9v7r/pp43yUd2/Mbiex5KouJwwR3dzHkhLREUC6764VyDsqxhAxv6OFEYR1RhjOyD1naqba8ECDBe7ZQg==, - } - peerDependencies: - '@types/react': ^19.2.0 - - '@types/react@19.2.18': - resolution: - { - integrity: sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==, - } - - '@types/send@1.2.1': - resolution: - { - integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==, - } - - '@types/serve-static@2.2.0': - resolution: - { - integrity: sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==, - } - - '@typescript/typescript-aix-ppc64@7.0.2': - resolution: - { - integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==, - } - engines: { node: '>=16.20.0' } - cpu: [ppc64] - os: [aix] - - '@typescript/typescript-darwin-arm64@7.0.2': - resolution: - { - integrity: sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==, - } - engines: { node: '>=16.20.0' } - cpu: [arm64] - os: [darwin] - - '@typescript/typescript-darwin-x64@7.0.2': - resolution: - { - integrity: sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==, - } - engines: { node: '>=16.20.0' } - cpu: [x64] - os: [darwin] - - '@typescript/typescript-freebsd-arm64@7.0.2': - resolution: - { - integrity: sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==, - } - engines: { node: '>=16.20.0' } - cpu: [arm64] - os: [freebsd] - - '@typescript/typescript-freebsd-x64@7.0.2': - resolution: - { - integrity: sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==, - } - engines: { node: '>=16.20.0' } - cpu: [x64] - os: [freebsd] - - '@typescript/typescript-linux-arm64@7.0.2': - resolution: - { - integrity: sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==, - } - engines: { node: '>=16.20.0' } - cpu: [arm64] - os: [linux] - - '@typescript/typescript-linux-arm@7.0.2': - resolution: - { - integrity: sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==, - } - engines: { node: '>=16.20.0' } - cpu: [arm] - os: [linux] - - '@typescript/typescript-linux-loong64@7.0.2': - resolution: - { - integrity: sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==, - } - engines: { node: '>=16.20.0' } - cpu: [loong64] - os: [linux] - - '@typescript/typescript-linux-mips64el@7.0.2': - resolution: - { - integrity: sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==, - } - engines: { node: '>=16.20.0' } - cpu: [mips64el] - os: [linux] - - '@typescript/typescript-linux-ppc64@7.0.2': - resolution: - { - integrity: sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==, - } - engines: { node: '>=16.20.0' } - cpu: [ppc64] - os: [linux] - - '@typescript/typescript-linux-riscv64@7.0.2': - resolution: - { - integrity: sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==, - } - engines: { node: '>=16.20.0' } - cpu: [riscv64] - os: [linux] - - '@typescript/typescript-linux-s390x@7.0.2': - resolution: - { - integrity: sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==, - } - engines: { node: '>=16.20.0' } - cpu: [s390x] - os: [linux] - - '@typescript/typescript-linux-x64@7.0.2': - resolution: - { - integrity: sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==, - } - engines: { node: '>=16.20.0' } - cpu: [x64] - os: [linux] - - '@typescript/typescript-netbsd-arm64@7.0.2': - resolution: - { - integrity: sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==, - } - engines: { node: '>=16.20.0' } - cpu: [arm64] - os: [netbsd] - - '@typescript/typescript-netbsd-x64@7.0.2': - resolution: - { - integrity: sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==, - } - engines: { node: '>=16.20.0' } - cpu: [x64] - os: [netbsd] - - '@typescript/typescript-openbsd-arm64@7.0.2': - resolution: - { - integrity: sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==, - } - engines: { node: '>=16.20.0' } - cpu: [arm64] - os: [openbsd] - - '@typescript/typescript-openbsd-x64@7.0.2': - resolution: - { - integrity: sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==, - } - engines: { node: '>=16.20.0' } - cpu: [x64] - os: [openbsd] - - '@typescript/typescript-sunos-x64@7.0.2': - resolution: - { - integrity: sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==, - } - engines: { node: '>=16.20.0' } - cpu: [x64] - os: [sunos] - - '@typescript/typescript-win32-arm64@7.0.2': - resolution: - { - integrity: sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==, - } - engines: { node: '>=16.20.0' } - cpu: [arm64] - os: [win32] - - '@typescript/typescript-win32-x64@7.0.2': - resolution: - { - integrity: sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==, - } - engines: { node: '>=16.20.0' } - cpu: [x64] - os: [win32] - - '@vitejs/plugin-react@6.1.1': - resolution: - { - integrity: sha512-yxLaQV9gkhS8ezJqCM6+ndU7mDY6gqAg75NQ+0IjwEI8IYOmQCgkRwHKVSfWXW076DsqMo0Dk+0FK1U+M5RgFw==, - } - engines: { node: ^20.19.0 || >=22.12.0 } - peerDependencies: - '@rolldown/plugin-babel': ^0.1.7 || ^0.2.0 - babel-plugin-react-compiler: ^1.0.0 - oxc-transform-react: ^0.145.0 - vite: ^8.0.0 - peerDependenciesMeta: - '@rolldown/plugin-babel': - optional: true - babel-plugin-react-compiler: - optional: true - oxc-transform-react: - optional: true - - '@webext-core/fake-browser@2.0.1': - resolution: - { - integrity: sha512-4x5z1z8F0KU8ShF4ForXJ8qnA8oZTy7HYjI91Mbpdzp3H3hU9HR6TNPUxfWtSpFz2FwgEircuJKQg0qFIn6RLg==, - } - - '@webext-core/isolated-element@3.0.0': - resolution: - { - integrity: sha512-PmSIBMSe+rFw6eXzpJoV+glc1HPO40clcT9FJ7rSfCQzNewK8/nQZoBYWen2cMqdXdBNM9to/IbNNu5mdQLaPg==, - } - - '@webext-core/match-patterns@2.0.0': - resolution: - { - integrity: sha512-EsyMMKfQuSE4rWCjP/TifwvUWlhC/OhiGn5OK3p9F0d57UmtLib0nzguzPKyxM1/kZV7SkE+jYXkE8gsdPRLmw==, - } - - '@wxt-dev/browser@0.2.7': - resolution: - { - integrity: sha512-Dr3h3qS25Wah4LjoCSw5uazD+547Q0dLnxaRjkkLauus008daHAulgNKTU4HkojaS9QBdo3xUlwUYPTBCQb+XQ==, - } - - '@wxt-dev/module-react@1.2.2': - resolution: - { - integrity: sha512-+lRLi1r9dAXpLySWSIWHLJ1h/nFzR20iQnx3RNrKyA6oJg4+ClOluVXozHjfPg9Okfy/umtffiOopGayASrg6w==, - } - peerDependencies: - vite: ^5.4.19 || ^6.3.4 || ^7.0.0 || ^8.0.0-0 - wxt: '>=0.19.16' - - '@wxt-dev/storage@1.2.9': - resolution: - { - integrity: sha512-dh9TJwvLBM2x4wyy9nE7eYE3wA8pgz1TXSyz7RbdjkJxLfFfWkbeIqiU7VkGy7Vx8sJBmQjoSpk9zSUb3Bjy0Q==, - } - - accepts@2.0.0: - resolution: - { - integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==, - } - engines: { node: '>= 0.6' } - - acorn@8.18.0: - resolution: - { - integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==, - } - engines: { node: '>=0.4.0' } - hasBin: true - - agent-base@6.0.2: - resolution: - { - integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==, - } - engines: { node: '>= 6.0.0' } - - ansi-regex@5.0.1: - resolution: - { - integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, - } - engines: { node: '>=8' } - - ansi-styles@4.3.0: - resolution: - { - integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, - } - engines: { node: '>=8' } - - antd@6.6.2: - resolution: - { - integrity: sha512-aTOPWXsqfWrlSiI0a1qR9UWR4jBCTJ8FNZfZmYQP9/aGGLJSrw9/c5uE+4vSVSt3riQlIPAwR3BcAgEHmE7GMg==, - } - peerDependencies: - react: '>=18.0.0' - react-dom: '>=18.0.0' - - append-field@1.0.0: - resolution: - { - integrity: sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==, - } - - argparse@2.0.1: - resolution: - { - integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, - } - - asynckit@0.4.0: - resolution: - { - integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, - } - - axios@1.20.0: - resolution: - { - integrity: sha512-r8aOh8j9cGKpgQAqpzrUHnSIc6a59Y3Xf/cv8sy1DrHCkZHzQGEuoq1tARk6qSyDdtQGSDgpb9kFlruzPvrgwg==, - } - - body-parser@2.3.0: - resolution: - { - integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==, - } - engines: { node: '>=18' } - - boolbase@2.0.0: - resolution: - { - integrity: sha512-DkVaaQHymRhpYEYo9x1oo7Q7B0Y6KJUsjm3c9eTyFDby4MHLBTwZ6ZDWBel5zrYxj1WsZgC5oLpiz+93MluXeA==, - } - engines: { node: '>=20.19.0' } - - buffer-from@1.1.2: - resolution: - { - integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, - } - - bullmq@6.3.4: - resolution: - { - integrity: sha512-DpilB5sayCB8huCp4YuzVhJjxB4ieHidzu+GPgbcjPi3kQv0gdLoLnk+I+mMACDQ88rTbSiT+B4crmhWFGL9GA==, - } - engines: { node: '>=14.17.0' } - peerDependencies: - bullmq-otel: '>=2.0.0' - ioredis: '>=5.0.0' - pg: '>=8.0.0' - redis: '>=5.0.0' - peerDependenciesMeta: - bullmq-otel: - optional: true - ioredis: - optional: true - pg: - optional: true - redis: - optional: true - - 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' } - - c12@3.3.4: - resolution: - { - integrity: sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA==, - } - peerDependencies: - magicast: '*' - peerDependenciesMeta: - magicast: - optional: true - - cac@7.0.0: - resolution: - { - integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==, - } - engines: { node: '>=20.19.0' } - - call-bind-apply-helpers@1.0.2: - resolution: - { - integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==, - } - engines: { node: '>= 0.4' } - - call-bound@1.0.4: - resolution: - { - integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==, - } - engines: { node: '>= 0.4' } - - chokidar@5.0.0: - resolution: - { - integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==, - } - engines: { node: '>= 20.19.0' } - - citty@0.2.2: - resolution: - { - integrity: sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==, - } - - cliui@8.0.1: - resolution: - { - integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==, - } - engines: { node: '>=12' } - - clsx@2.1.1: - resolution: - { - integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==, - } - engines: { node: '>=6' } - - cluster-key-slot@1.1.1: - resolution: - { - integrity: sha512-rwHwUfXL40Chm1r08yrhU3qpUvdVlgkKNeyeGPOxnW8/SyVDvgRaed/Uz54AqWNaTCAThlj6QAs3TZcKI0xDEw==, - } - engines: { node: '>=0.10.0' } - - 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==, - } - - combined-stream@1.0.8: - resolution: - { - integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, - } - engines: { node: '>= 0.8' } - - compute-scroll-into-view@3.1.1: - resolution: - { - integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==, - } - - concat-stream@2.0.0: - resolution: - { - integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==, - } - engines: { '0': node >= 6.0 } - - confbox@0.1.8: - resolution: - { - integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==, - } - - confbox@0.2.4: - resolution: - { - integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==, - } - - consola@3.4.2: - resolution: - { - integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==, - } - engines: { node: ^14.18.0 || >=16.10.0 } - - content-disposition@1.1.0: - resolution: - { - integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==, - } - engines: { node: '>=18' } - - content-type@1.0.5: - resolution: - { - integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==, - } - engines: { node: '>= 0.6' } - - content-type@2.1.0: - resolution: - { - integrity: sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==, - } - engines: { node: '>=18' } - - cookie-signature@1.2.2: - resolution: - { - integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==, - } - engines: { node: '>=6.6.0' } - - cookie@0.7.2: - resolution: - { - integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==, - } - engines: { node: '>= 0.6' } - - cookie@1.1.1: - resolution: - { - integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==, - } - engines: { node: '>=18' } - - cors@2.8.6: - resolution: - { - integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==, - } - engines: { node: '>= 0.10' } - - cron-parser@5.10.0: - resolution: - { - integrity: sha512-izNAxJyRWUP8ljBoDSub5WyrVOUlT4SLGShswE7eoRBpp6QUsSycYxLBMJlbshgPBMcPT/nrfgjNY2918ayv2A==, - } - engines: { node: '>=18' } - - css-select@7.0.0: - resolution: - { - integrity: sha512-snmjEVXy+1LnwXdxhYvTMj1d9tOh4HxkA1YmoayVBeeyR2C14Pum7fcxJIm4SswYspVy866eYNwlH6xC3/VH5g==, - } - engines: { node: '>=20.19.0' } - - css-what@8.0.0: - resolution: - { - integrity: sha512-DH0Bqq3DNp5tdOReuNyAA+Ev4Y2GS5FMbZpeTLP6C4CDi0h5nL0BmUPChXw3o/qbHLDWHl49sbNqQVY7bMSDdw==, - } - engines: { node: '>=20.19.0' } - - cssom@0.5.0: - resolution: - { - integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==, - } - - csstype@3.2.3: - resolution: - { - integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==, - } - - dayjs@1.11.23: - resolution: - { - integrity: sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ==, - } - - debug@4.4.3: - resolution: - { - integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==, - } - engines: { node: '>=6.0' } - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - define-lazy-prop@2.0.0: - resolution: - { - integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==, - } - engines: { node: '>=8' } - - defu@6.1.7: - resolution: - { - integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==, - } - - delayed-stream@1.0.0: - resolution: - { - integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, - } - engines: { node: '>=0.4.0' } - - 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' } - - destr@2.0.5: - resolution: - { - integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==, - } - - detect-libc@2.1.2: - resolution: - { - integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==, - } - engines: { node: '>=8' } - - dom-serializer@2.0.0: - resolution: - { - integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==, - } - - dom-serializer@3.1.1: - resolution: - { - integrity: sha512-4MEa38/QexBob6gFNwu+EGdWvhJ1OKuNwdYY3Y3NyeWDQfnGeDYQUDfIRzWu5B5gsv03so2Uxd28YC6zrsx3Lw==, - } - engines: { node: '>=20.19.0' } - - domelementtype@2.3.0: - resolution: - { - integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==, - } - - domelementtype@3.0.0: - resolution: - { - integrity: sha512-umCQid3jKbDmVjx8jGaW7uUykm4DEUeyV21hPxNMo2nV955DhUThwqyOIDtreepP31hl84X7G5U9ZfsWvIB3Pg==, - } - engines: { node: '>=20.19.0' } - - domhandler@5.0.3: - resolution: - { - integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==, - } - engines: { node: '>= 4' } - - domhandler@6.0.1: - resolution: - { - integrity: sha512-gYzvtM72ZtxQO0T048kd6HWSbbGCNOUwcnfQ01cqIJ4X2IYKFFHZ5mKvrQETcFXxsRObZulDaKmy//R7TPtsBg==, - } - engines: { node: '>=20.19.0' } - - domutils@3.2.2: - resolution: - { - integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==, - } - - domutils@4.0.2: - resolution: - { - integrity: sha512-qI4JLRKnSzqFqr7hAlS5xQDusBCjKSEG4t4+7aNrIQMHBcsC2TGEhuyABJdYkgSewL57PNLYEiibY2iPKhKpaA==, - } - engines: { node: '>=20.19.0' } - - dotenv-expand@13.0.0: - resolution: - { - integrity: sha512-aBfBS8eYIeXmpHI9ThIlA7/WLq+SLt18iXUZhb52rW89QLKQFoIpPG1bPeewoPZsTyjSSO3T7234FBVUM1V2rA==, - } - engines: { node: '>=12' } - - dotenv@17.4.2: - resolution: - { - integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==, - } - engines: { node: '>=12' } - - dunder-proto@1.0.1: - resolution: - { - integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==, - } - engines: { node: '>= 0.4' } - - ee-first@1.1.1: - resolution: - { - integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==, - } - - emoji-regex@8.0.0: - resolution: - { - integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, - } - - encodeurl@2.0.0: - resolution: - { - integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==, - } - engines: { node: '>= 0.8' } - - entities@4.5.0: - resolution: - { - integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, - } - engines: { node: '>=0.12' } - - entities@7.0.1: - resolution: - { - integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==, - } - engines: { node: '>=0.12' } - - entities@8.0.0: - resolution: - { - integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==, - } - engines: { node: '>=20.19.0' } - - 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.2: - resolution: - { - integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==, - } - engines: { node: '>= 0.4' } - - es-set-tostringtag@2.1.0: - resolution: - { - integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==, - } - engines: { node: '>= 0.4' } - - es-toolkit@1.51.0: - resolution: - { - integrity: sha512-zC2lQGkM7QX+Gm6iM3+WIdZJzthsEd14LvRNJneSO2hzyz/zNBENR8+YXWo1cKxgPBtV6ksPYHELbcwBRzmdCw==, - } - - esbuild@0.28.2: - resolution: - { - integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==, - } - engines: { node: '>=18' } - hasBin: true - - 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@5.0.0: - resolution: - { - integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==, - } - engines: { node: '>=12' } - - estree-walker@3.0.3: - resolution: - { - integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==, - } - - etag@1.8.1: - resolution: - { - integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==, - } - engines: { node: '>= 0.6' } - - express@5.2.1: - resolution: - { - integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==, - } - engines: { node: '>= 18' } - - exsolve@1.1.1: - resolution: - { - integrity: sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==, - } - - fast-safe-stringify@2.1.1: - resolution: - { - integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==, - } - - fdir@6.5.0: - resolution: - { - integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==, - } - engines: { node: '>=12.0.0' } - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - - file-type@22.0.2: - resolution: - { - integrity: sha512-0H8TsCUGBLx+V5adH3EY52hTAcyLKbV1D4gq5cIOJ6DnQAHeV9Z2Hhuc5CoBX4YmvB2oL+JIC84z0qO7JsCoNw==, - } - engines: { node: '>=22' } - - filesize@11.0.22: - resolution: - { - integrity: sha512-RlCVs9CY+oSsRnNZn95J9vDXjNjOwddKyTFjOYtA4yxYVIxBnwiVVGJX+TFhsmu3uUf81JDGyijtYL9xgawlTw==, - } - engines: { node: '>= 10.8.0' } - - finalhandler@2.1.1: - resolution: - { - integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==, - } - engines: { node: '>= 18.0.0' } - - follow-redirects@1.16.0: - resolution: - { - integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==, - } - engines: { node: '>=4.0' } - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - - form-data@4.0.6: - resolution: - { - integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==, - } - engines: { node: '>= 6' } - - forwarded@0.2.0: - resolution: - { - integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==, - } - engines: { node: '>= 0.6' } - - fresh@2.0.0: - resolution: - { - integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==, - } - engines: { node: '>= 0.8' } - - 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==, - } - - 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' } - - giget@3.3.1: - resolution: - { - integrity: sha512-r+mvuDjrjMpsdw46Kmeydb8bdHm7wOKw8wNBtTndkjbPjgAp5oUJUxRE76wZFknxIPokfWvep2qSXK37aXE6zg==, - } - hasBin: true - - gopd@1.2.0: - resolution: - { - integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==, - } - engines: { node: '>= 0.4' } - - 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.4: - resolution: - { - integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==, - } - engines: { node: '>= 0.4' } - - helmet@8.3.0: - resolution: - { - integrity: sha512-Qgpiaws3Sm30Av8Eah6sjMCZZwjlBu+E68rhpCWBshY1lb09HtLwj5GviX0OyQIn+ulUS0iX0AxN5n3tLZzz1w==, - } - engines: { node: '>=18.0.0' } - - hookable@6.1.1: - resolution: - { - integrity: sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==, - } - - html-escaper@3.0.3: - resolution: - { - integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==, - } - - htmlparser2@10.1.0: - resolution: - { - integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==, - } - - http-errors@2.0.1: - resolution: - { - integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==, - } - engines: { node: '>= 0.8' } - - https-proxy-agent@5.0.1: - resolution: - { - integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==, - } - engines: { node: '>= 6' } - - iconv-lite@0.7.3: - resolution: - { - integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==, - } - engines: { node: '>=0.10.0' } - - ieee754@1.2.1: - resolution: - { - integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, - } - - inherits@2.0.4: - resolution: - { - integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, - } - - ioredis@6.0.0: - resolution: - { - integrity: sha512-f+Dtubxfpf6KYFq7WVXJoOLn0bk4TJrMrN9SzeE+jrWrCWj7XX3fA6vkryafhADX+GMymRxgDJDOI33COkJc0w==, - } - engines: { node: '>=20.0.0' } - - ipaddr.js@1.9.1: - resolution: - { - integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==, - } - engines: { node: '>= 0.10' } - - is-docker@2.2.1: - resolution: - { - integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==, - } - engines: { node: '>=8' } - hasBin: true - - is-fullwidth-code-point@3.0.0: - resolution: - { - integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, - } - engines: { node: '>=8' } - - is-mobile@5.0.0: - resolution: - { - integrity: sha512-Tz/yndySvLAEXh+Uk8liFCxOwVH6YutuR74utvOcu7I9Di+DwM0mtdPVZNaVvvBUM2OXxne/NhOs1zAO7riusQ==, - } - - is-potential-custom-element-name@1.0.1: - resolution: - { - integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==, - } - - is-promise@4.0.0: - resolution: - { - integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==, - } - - is-wsl@2.2.0: - resolution: - { - integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==, - } - engines: { node: '>=8' } - - iterare@1.2.1: - resolution: - { - integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==, - } - engines: { node: '>=6' } - - jiti@2.7.0: - resolution: - { - integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==, - } - hasBin: true - - js-tokens@10.0.0: - resolution: - { - integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==, - } - - js-yaml@5.4.1: - resolution: - { - integrity: sha512-28R/k+NAjeuf7+CKlTxWZVExJGwVVLwY06DgEnOMz2gEpfNkDcD7QvyiVPT0xy0XXhU8vHsd4Ot42OOPdJG7dQ==, - } - hasBin: true - - json2mq@0.2.0: - resolution: - { - integrity: sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==, - } - - json5@2.2.3: - resolution: - { - integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, - } - engines: { node: '>=6' } - hasBin: true - - lightningcss-android-arm64@1.33.0: - resolution: - { - integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==, - } - engines: { node: '>= 12.0.0' } - cpu: [arm64] - os: [android] - - lightningcss-darwin-arm64@1.33.0: - resolution: - { - integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==, - } - engines: { node: '>= 12.0.0' } - cpu: [arm64] - os: [darwin] - - lightningcss-darwin-x64@1.33.0: - resolution: - { - integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==, - } - engines: { node: '>= 12.0.0' } - cpu: [x64] - os: [darwin] - - lightningcss-freebsd-x64@1.33.0: - resolution: - { - integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==, - } - engines: { node: '>= 12.0.0' } - cpu: [x64] - os: [freebsd] - - lightningcss-linux-arm-gnueabihf@1.33.0: - resolution: - { - integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==, - } - engines: { node: '>= 12.0.0' } - cpu: [arm] - os: [linux] - - lightningcss-linux-arm64-gnu@1.33.0: - resolution: - { - integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==, - } - engines: { node: '>= 12.0.0' } - cpu: [arm64] - os: [linux] - libc: [glibc] - - lightningcss-linux-arm64-musl@1.33.0: - resolution: - { - integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==, - } - engines: { node: '>= 12.0.0' } - cpu: [arm64] - os: [linux] - libc: [musl] - - lightningcss-linux-x64-gnu@1.33.0: - resolution: - { - integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==, - } - engines: { node: '>= 12.0.0' } - cpu: [x64] - os: [linux] - libc: [glibc] - - lightningcss-linux-x64-musl@1.33.0: - resolution: - { - integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==, - } - engines: { node: '>= 12.0.0' } - cpu: [x64] - os: [linux] - libc: [musl] - - lightningcss-win32-arm64-msvc@1.33.0: - resolution: - { - integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==, - } - engines: { node: '>= 12.0.0' } - cpu: [arm64] - os: [win32] - - lightningcss-win32-x64-msvc@1.33.0: - resolution: - { - integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==, - } - engines: { node: '>= 12.0.0' } - cpu: [x64] - os: [win32] - - lightningcss@1.33.0: - resolution: - { - integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==, - } - engines: { node: '>= 12.0.0' } - - linkedom@0.18.13: - resolution: - { - integrity: sha512-ES/o9qotMpzpN2MHs+Iq/JcVoOj8Fa5wiQYrTdFpvAnwXL0g66XHHUc9WUMk6nAlBtGsFQ24ne+SYnvnaQ2FSw==, - } - engines: { node: '>=16' } - peerDependencies: - canvas: '>= 2' - peerDependenciesMeta: - canvas: - optional: true - - load-esm@1.0.3: - resolution: - { - integrity: sha512-v5xlu8eHD1+6r8EHTg6hfmO97LN8ugKtiXcy5e6oN72iD2r6u0RPfLl6fxM+7Wnh2ZRq15o0russMst44WauPA==, - } - engines: { node: '>=13.2.0' } - - local-pkg@1.2.1: - resolution: - { - integrity: sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==, - } - engines: { node: '>=14' } - - lodash.merge@4.6.2: - resolution: - { - integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, - } - - luxon@3.7.2: - resolution: - { - integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==, - } - engines: { node: '>=12' } - - magic-string@1.2.3: - resolution: - { - integrity: sha512-Bpb0W2TbLKOZ7vJnOUnVRGq3WL2p+ISV29M6hYPL1AFCpyKZpdr5ytiXoTSSxRVhg8YW7f65+6gbG8WG6PCa/g==, - } - - magicast@0.5.4: - resolution: - { - integrity: sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w==, - } - - many-keys-map@3.0.3: - resolution: - { - integrity: sha512-1DiZmDHPXMBgMRjeUtHy1q1VYmeJscHxhIAexX9z/zjRMP80+0ETuPfssi8z+kMY4DwUgsKuHqpjxgmeA9gBNA==, - } - engines: { node: '>=18' } - - math-intrinsics@1.1.0: - resolution: - { - integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==, - } - engines: { node: '>= 0.4' } - - media-typer@0.3.0: - resolution: - { - integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==, - } - engines: { node: '>= 0.6' } - - media-typer@1.1.1: - resolution: - { - integrity: sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==, - } - engines: { node: '>= 0.8' } - - merge-descriptors@2.0.0: - resolution: - { - integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==, - } - engines: { node: '>=18' } - - mime-db@1.52.0: - resolution: - { - integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, - } - engines: { node: '>= 0.6' } - - mime-db@1.54.0: - resolution: - { - integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==, - } - engines: { node: '>= 0.6' } - - mime-types@2.1.35: - resolution: - { - integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, - } - engines: { node: '>= 0.6' } - - mime-types@3.0.2: - resolution: - { - integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==, - } - engines: { node: '>=18' } - - mlly@1.8.2: - resolution: - { - integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==, - } - - ms@2.1.3: - resolution: - { - integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, - } - - msgpackr-extract@3.0.4: - resolution: - { - integrity: sha512-4kmO/MdyUIkLIvTPr8VHLil4AtoKIoniWPIEk5+CDy0xnWC84azhSFmuJ7PxZdsYtiP5kEeQsORAVIeMgxT+Hw==, - } - hasBin: true - - msgpackr@2.1.0: - resolution: - { - integrity: sha512-p/pBCVO63CsvvpkomUnNNag6+n38rULuDA6HHe70o2gtC8ODI52foF/4ko2qQcp6OiErJXTmrZeXmsGGHsIQNQ==, - } - - multer@2.2.0: - resolution: - { - integrity: sha512-6rdyFg2kLrMh9Jee7/BMPuV9lEAd7lLW2YUpF9/YxR7njyoUwwQ0ZPh3TaIY50Sw6vlyD2HW3wGOkTS4P79xrQ==, - } - engines: { node: '>= 10.16.0' } - - nanoid@3.3.18: - resolution: - { - integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==, - } - engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } - hasBin: true - - negotiator@1.1.0: - resolution: - { - integrity: sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==, - } - engines: { node: '>=18' } - - node-abort-controller@3.1.1: - resolution: - { - integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==, - } - - node-gyp-build-optional-packages@5.2.2: - resolution: - { - integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==, - } - hasBin: true - - nth-check@3.0.1: - resolution: - { - integrity: sha512-GX0gsdbGVCgnRgbeGaubfjpBXyYRWOOCVeYh08bSQvDZqxz5ndXs1OTfAt/h36G1xvI94YIspsI0sVFqAV9+RQ==, - } - engines: { node: '>=20.19.0' } - - nypm@0.6.9: - resolution: - { - integrity: sha512-zxlE2yvSWZWmHcNdT3+5zV2lrCogeE9YOklHrR3dFjqutq5wO7GFDYLFDRXLsYnJzwvy/im9fYoxePvS0VTW0w==, - } - engines: { node: '>=18' } - hasBin: true - - 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' } - - ohash@2.0.12: - resolution: - { - integrity: sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==, - } - - 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==, - } - - open@8.4.2: - resolution: - { - integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==, - } - engines: { node: '>=12' } - - parseurl@1.3.3: - resolution: - { - integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==, - } - engines: { node: '>= 0.8' } - - path-to-regexp@8.4.2: - resolution: - { - integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==, - } - - pathe@2.0.3: - resolution: - { - integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==, - } - - perfect-debounce@2.1.0: - resolution: - { - integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==, - } - - pg-cloudflare@1.4.0: - resolution: - { - integrity: sha512-Vo7z/6rrQYxpNRylp4Tlob2elzbh+N/MOQbxFVWCxS7oEx6jF53GTJFxK2WWpKuBRkmiin4Mt+xofFDjx09R0A==, - } - - pg-connection-string@2.14.0: - resolution: - { - integrity: sha512-XwWDGcLRGCXAR8F/AM5bG7Q+A3Wm2s6QeEjlOKZLlH3UYcguiqCWKyWXVag5TLTIjR7oOJUY8kcADaZgWPyLeg==, - } - - pg-int8@1.0.1: - resolution: - { - integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==, - } - engines: { node: '>=4.0.0' } - - pg-pool@3.14.0: - resolution: - { - integrity: sha512-gKtPkFdQPU3DksooVLi9LsjZxrsBUZIpa+7aVx+LV5pNh0KzP4Zleud2po+ConrxbuXGBJ6Hfer6hdgpIBpBaw==, - } - peerDependencies: - pg: '>=8.0' - - pg-protocol@1.16.0: - resolution: - { - integrity: sha512-sILXutLVjCLjcDuOmvhX5e2Z4cS5qG/6Bu3VkpFwdf/633ElGLpEh9bgmuI5I4sqKqkifQiGyiCcx1HdtrK7tg==, - } - - pg-types@2.2.0: - resolution: - { - integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==, - } - engines: { node: '>=4' } - - pg@8.23.0: - resolution: - { - integrity: sha512-Ip2EQCngowJLGOfCwkFhPXU7/ljlhn6Rxlmy4XYfL2Y+vyRM59+8uR2xqRWKdYmbXmxCFOAmKxBuSUCdF34qLg==, - } - engines: { node: '>= 16.0.0' } - peerDependencies: - pg-native: '>=3.0.1' - peerDependenciesMeta: - pg-native: - optional: true - - pgpass@1.0.5: - resolution: - { - integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==, - } - - picocolors@1.1.1: - resolution: - { - integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, - } - - picomatch@2.3.2: - resolution: - { - integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==, - } - engines: { node: '>=8.6' } - - picomatch@4.0.7: - resolution: - { - integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==, - } - engines: { node: '>=12' } - - pkg-types@1.3.1: - resolution: - { - integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==, - } - - pkg-types@2.3.1: - resolution: - { - integrity: sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==, - } - - postcss@8.5.26: - resolution: - { - integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==, - } - engines: { node: ^10 || ^12 || >=14 } - - postgres-array@2.0.0: - resolution: - { - integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==, - } - engines: { node: '>=4' } - - postgres-bytea@1.0.1: - resolution: - { - integrity: sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==, - } - engines: { node: '>=0.10.0' } - - postgres-date@1.0.7: - resolution: - { - integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==, - } - engines: { node: '>=0.10.0' } - - postgres-interval@1.2.0: - resolution: - { - integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==, - } - engines: { node: '>=0.10.0' } - - prettier@3.9.6: - resolution: - { - integrity: sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==, - } - engines: { node: '>=14' } - hasBin: true - - proxy-addr@2.0.7: - resolution: - { - integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==, - } - engines: { node: '>= 0.10' } - - proxy-from-env@2.1.0: - resolution: - { - integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==, - } - engines: { node: '>=10' } - - publish-browser-extension@6.1.1: - resolution: - { - integrity: sha512-ovfBOz+cZIOBHZ+oxTfpv1kSGU7ruzy8CXoFGvhXsUbJuty45srGzf1ufEePs69virOWXfFbhZRoNQUdgPvwXA==, - } - engines: { node: '>=22.0.0' } - hasBin: true - - qs@6.16.0: - resolution: - { - integrity: sha512-h6fhOIaRrID2CbEY2fqs+7t+UXZo+MLAnU5gRIq85uFtdiUPCdsApMlHhXogKVM4HM2DVbIjGNTTYH2OcmP1vA==, - } - engines: { node: '>=0.6' } - - quansync@0.2.11: - resolution: - { - integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==, - } - - range-parser@1.3.0: - resolution: - { - integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==, - } - engines: { node: '>= 0.6' } - - raw-body@3.0.2: - resolution: - { - integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==, - } - engines: { node: '>= 0.10' } - - rc9@3.0.1: - resolution: - { - integrity: sha512-gMDyleLWVE+i6Sgtc0QbbY6pEKqYs97NGi6isHQPqYlLemPoO8dxQ3uGi0f4NiP98c+jMW6cG1Kx9dDwfvqARQ==, - } - - react-dom@19.2.8: - resolution: - { - integrity: sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==, - } - peerDependencies: - react: ^19.2.8 - - react-is@19.2.8: - resolution: - { - integrity: sha512-s5un28nYxKJw5gvUHyW5PCC28CvBqLu9r3cWgzHT4Vo/5fqqkFcdRYsGcKf50WMPpjjFZS5d76fn3YCo2njKwQ==, - } - - react-router-dom@7.18.3: - resolution: - { - integrity: sha512-ytVbyBBM7vMfRCam25r0WMhSVSom909A8p+8m0/f1w853dz/xfFu6etAT2SEbVoSnI+ZoPRDqIsQXVT89gp7kg==, - } - engines: { node: '>=20.0.0' } - peerDependencies: - react: '>=18' - react-dom: '>=18' - - react-router@7.18.3: - resolution: - { - integrity: sha512-gyXgtdr5uACJ5b1Q4udzjVV+tb/rlHIMJKuJ0e89R4Kzgz47z/rgP0dIKxktqIEUhDHluGTPJJH/wRha7CyqsA==, - } - engines: { node: '>=20.0.0' } - peerDependencies: - react: '>=18' - react-dom: '>=18' - peerDependenciesMeta: - react-dom: - optional: true - - react@19.2.8: - resolution: - { - integrity: sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==, - } - engines: { node: '>=0.10.0' } - - readable-stream@3.6.2: - resolution: - { - integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, - } - engines: { node: '>= 6' } - - readdirp@5.1.1: - resolution: - { - integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==, - } - engines: { node: '>= 20.19.0' } - - redis-errors@1.2.0: - resolution: - { - integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==, - } - engines: { node: '>=4' } - - reflect-metadata@0.2.2: - resolution: - { - integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==, - } - - require-directory@2.1.1: - resolution: - { - integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, - } - engines: { node: '>=0.10.0' } - - rolldown@1.2.6: - resolution: - { - integrity: sha512-vMM4q3aixf46GiF1Kok8jDPFsEpXgFWGjUHXNkNHNm+Y2adXAG2dbX91jkti3i0ZRsOlcmbuzAz1poObSHCmUA==, - } - engines: { node: ^20.19.0 || >=22.12.0 } - hasBin: true - - router@2.2.0: - resolution: - { - integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==, - } - engines: { node: '>= 18' } - - rxjs@7.8.2: - resolution: - { - integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==, - } - - safe-buffer@5.2.1: - resolution: - { - integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, - } - - safer-buffer@2.1.2: - resolution: - { - integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, - } - - scheduler@0.27.0: - resolution: - { - integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==, - } - - scroll-into-view-if-needed@3.1.0: - resolution: - { - integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==, - } - - scule@1.3.0: - resolution: - { - integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==, - } - - semver@7.8.5: - resolution: - { - integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==, - } - engines: { node: '>=10' } - hasBin: true - - send@1.2.1: - resolution: - { - integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==, - } - engines: { node: '>= 18' } - - serve-static@2.2.1: - resolution: - { - integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==, - } - engines: { node: '>= 18' } - - set-cookie-parser@2.7.2: - resolution: - { - integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==, - } - - setprototypeof@1.2.0: - resolution: - { - integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==, - } - - side-channel-list@1.0.1: - resolution: - { - integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==, - } - 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.1: - resolution: - { - integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==, - } - engines: { node: '>= 0.4' } - - source-map-js@1.2.1: - resolution: - { - integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==, - } - engines: { node: '>=0.10.0' } - - source-map@0.7.6: - resolution: - { - integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==, - } - engines: { node: '>= 12' } - - split2@4.2.0: - resolution: - { - integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==, - } - engines: { node: '>= 10.x' } - - standard-as-callback@2.1.0: - resolution: - { - integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==, - } - - statuses@2.0.2: - resolution: - { - integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==, - } - engines: { node: '>= 0.8' } - - streamsearch@1.1.0: - resolution: - { - integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==, - } - engines: { node: '>=10.0.0' } - - string-convert@0.2.1: - resolution: - { - integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==, - } - - string-width@4.2.3: - resolution: - { - integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, - } - engines: { node: '>=8' } - - string_decoder@1.3.0: - resolution: - { - integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, - } - - strip-ansi@6.0.1: - resolution: - { - integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, - } - engines: { node: '>=8' } - - strip-literal@4.0.0: - resolution: - { - integrity: sha512-PaqAvfUZKBwc/SLmNZtHmzK+v19Z4O4eS3cKPeGvbIv/U3pnyEq4Tuw3/4v/FwfM8VQaEawsyCcOQ0P+kpwWWw==, - } - - strtok3@10.3.5: - resolution: - { - integrity: sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==, - } - engines: { node: '>=18' } - - stylis@4.4.0: - resolution: - { - integrity: sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==, - } - - superlock@1.3.5: - resolution: - { - integrity: sha512-XpWNthvezZnWp0u7/UL8rBbBOnq2Qx39fw+0RNMC/+eotOd81glzsmIWVH0ejarhTeDQihxOKSbjm2XXFo5a8w==, - } - engines: { node: '>= 14' } - - swagger-ui-dist@5.32.14: - resolution: - { - integrity: sha512-nOA2pSQhcmODMUQZpJHYKNuwniDUqcOWGNaSCOoZv12FdOSJ9JxV95HtyRGNMqEBj6h6lCNTy20TgZDYTSuUIg==, - } - - tasuku@2.3.0: - resolution: - { - integrity: sha512-9Jtk+XAnttslCw4i9RceSZGr2PT5TLn0vUyWnoP2SdlSYzkiYRY6kB5qnPi5IQ/Em8e4oBow1rpaA39iijTIrA==, - } - - throttle-debounce@5.0.2: - resolution: - { - integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==, - } - engines: { node: '>=12.22' } - - tiny-open@1.3.0: - resolution: - { - integrity: sha512-GUFS8yjJZq0oWqCKCJVHcBgMpmi2WEGXY1le3E5ncR0DsgTII5uUyxtfk8/vGyDDGBE42UYHR6Ocvlk8mkXSRg==, - } - - tinyexec@1.3.0: - resolution: - { - integrity: sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==, - } - engines: { node: '>=18' } - - tinyglobby@0.2.17: - resolution: - { - integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==, - } - engines: { node: '>=12.0.0' } - - toidentifier@1.0.1: - resolution: - { - integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==, - } - engines: { node: '>=0.6' } - - token-types@6.1.2: - resolution: - { - integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==, - } - engines: { node: '>=14.16' } - - tslib@2.8.1: - resolution: - { - integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==, - } - - tsx@4.23.13: - resolution: - { - integrity: sha512-BL5MGkRln6aDYhb0xbQlEAGw743BaZYWdbWtdJOBriYJboKgUUYCadFp2/FpBBZquBC/ezNBn7wMMPx7FDZUDw==, - } - engines: { node: '>=18.0.0' } - hasBin: true - - turbo@2.10.12: - resolution: - { - integrity: sha512-AswgMPnpOoaVZHrrSBejETzEbuIA69OVGwfkHwfrY0A23VjWXBANzgq9+OymWOHAIArB7D1+1z498WY8fGg1Jw==, - } - hasBin: true - - type-is@1.6.18: - resolution: - { - integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==, - } - engines: { node: '>= 0.6' } - - type-is@2.1.0: - resolution: - { - integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==, - } - engines: { node: '>= 18' } - - typedarray@0.0.6: - resolution: - { - integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==, - } - - typescript@7.0.2: - resolution: - { - integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==, - } - engines: { node: '>=16.20.0' } - hasBin: true - - ufo@1.6.4: - resolution: - { - integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==, - } - - uhyphen@0.2.0: - resolution: - { - integrity: sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA==, - } - - uid@2.0.2: - resolution: - { - integrity: sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==, - } - engines: { node: '>=8' } - - uint8array-extras@1.5.0: - resolution: - { - integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==, - } - engines: { node: '>=18' } - - undici-types@8.3.0: - resolution: - { - integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==, - } - - unimport@6.4.0: - resolution: - { - integrity: sha512-JJOOuNMFq8b4ZPBKwQUxEcba4MplskDzYI1Lvrf8rJfWphZTWvPNXWa493qsPngHUmub89w6C7j+SeLWTE/UIQ==, - } - engines: { node: '>=18.12.0' } - peerDependencies: - oxc-parser: '*' - rolldown: ^1.0.0 - peerDependenciesMeta: - oxc-parser: - optional: true - rolldown: - optional: true - - unpipe@1.0.0: - resolution: - { - integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==, - } - engines: { node: '>= 0.8' } - - unplugin-utils@0.3.2: - resolution: - { - integrity: sha512-xVToRh2CTmLk2HnEG7ac4rl1MJTT3RFkpS8B++/SnB0kXvuaavD+n3m/vrzyWQOdJNSZQACnbz01pnppbwV5BA==, - } - engines: { node: '>=20.19.0' } - - unplugin@3.3.0: - resolution: - { - integrity: sha512-qa66K+crbfyE6JK10GjvbJeRrOsuC/JpbnHctfyp/i4oBTxWOzJfRZyDiOk1PtErMFRu8JhsU/wPvOdBNWe5Rg==, - } - engines: { node: ^20.19.0 || >=22.12.0 } - peerDependencies: - '@farmfe/core': '*' - '@rspack/core': '*' - bun-types-no-globals: '*' - esbuild: '*' - rolldown: '*' - rollup: '*' - unloader: '*' - vite: '*' - webpack: '*' - peerDependenciesMeta: - '@farmfe/core': - optional: true - '@rspack/core': - optional: true - bun-types-no-globals: - optional: true - esbuild: - optional: true - rolldown: - optional: true - rollup: - optional: true - unloader: - optional: true - vite: - optional: true - webpack: - optional: true - - util-deprecate@1.0.2: - resolution: - { - integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, - } - - vary@1.1.2: - resolution: - { - integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==, - } - engines: { node: '>= 0.8' } - - vite@8.2.2: - resolution: - { - integrity: sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==, - } - engines: { node: ^20.19.0 || >=22.12.0 } - hasBin: true - peerDependencies: - '@types/node': ^20.19.0 || >=22.12.0 - '@vitejs/devtools': ^0.4.0 || ^0.5.0 - esbuild: ^0.27.0 || ^0.28.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 - '@vitejs/devtools': - 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 - - webpack-virtual-modules@0.6.2: - resolution: - { - integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==, - } - - wrap-ansi@7.0.0: - resolution: - { - integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, - } - engines: { node: '>=10' } - - wrappy@1.0.2: - resolution: - { - integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, - } - - wxt@0.21.4: - resolution: - { - integrity: sha512-iyVMTXb37BQAbsPHCuPzrK3ZxnO9pZmvbKl7VJWIHe3RG40On2NyP2FOjArtOITO96plEYnh3o+iUlRp9qE90w==, - } - engines: { bun: '>=1.2.0', node: '>=22' } - hasBin: true - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=5.4' - vite: ^6.3.4 || ^7.0.0 || ^8.0.0-0 - web-ext: '>=9.2.0' - peerDependenciesMeta: - eslint: - optional: true - typescript: - optional: true - web-ext: - 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.3: - resolution: - { - integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==, - } - engines: { node: '>=12' } - - zod@4.5.4: - resolution: - { - integrity: sha512-sC95tT5iHHH9gtpj6A81kh+NEaRAUFN+qlUPDUbRfOMvNf5QCBqsb3WgvnpVtK5Y+4UfA6KqufotuTvMGiTlsA==, - } + + '@1natsu/wait-element@4.2.0': + resolution: {integrity: sha512-Om0Q+WE9mNrpY4AwMTvkFiYHv8VM7TML3PvOqXy+w6kAjLjKhGYHYX+305+a6J8RVpds9s7IF2Z5aOPYwULFNw==} + + '@aklinker1/rollup-plugin-visualizer@5.12.0': + resolution: {integrity: sha512-X24LvEGw6UFmy0lpGJDmXsMyBD58XmX1bbwsaMLhNoM+UMQfQ3b2RtC+nz4b/NoRK5r6QJSKJHBNVeUdwqybaQ==} + engines: {node: '>=14'} + hasBin: true + peerDependencies: + rollup: 2.x || 3.x || 4.x + peerDependenciesMeta: + rollup: + optional: true + + '@aklinker1/zero-zip@1.0.1': + resolution: {integrity: sha512-07a596Bd1QO0bi3tIyt2xruq6vKk7hCUt9enHBwggvipB0iiycoJ9/CqzN6UFawaKbOi6NBfMlUxUXzIOZ7Dsg==} + + '@ant-design/colors@8.0.1': + resolution: {integrity: sha512-foPVl0+SWIslGUtD/xBr1p9U4AKzPhNYEseXYRRo5QSzGACYZrQbe11AYJbYfAWnWSpGBx6JjBmSeugUsD9vqQ==} + + '@ant-design/cssinjs-utils@2.1.2': + resolution: {integrity: sha512-5fTHQ158jJJ5dC/ECeyIdZUzKxE/mpEMRZxthyG1sw/AKRHKgJBg00Yi6ACVXgycdje7KahRNvNET/uBccwCnA==} + peerDependencies: + react: '>=18' + react-dom: '>=18' + + '@ant-design/cssinjs@2.1.2': + resolution: {integrity: sha512-2Hy8BnCEH31xPeSLbhhB2ctCPXE2ZnASdi+KbSeS79BNbUhL9hAEe20SkUk+BR8aKTmqb6+FKFruk7w8z0VoRQ==} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + + '@ant-design/fast-color@3.0.1': + resolution: {integrity: sha512-esKJegpW4nckh0o6kV3Tkb7NPIZYbPnnFxmQDUmL08ukXZAvV85TZBr70eGuke/CIArLaP6aw8lt9KILjnWuOw==} + engines: {node: '>=8.x'} + + '@ant-design/icons-svg@4.6.0': + resolution: {integrity: sha512-PRomU725ABMf/lnQp5HiB7my1kjEbFY0D10N4lXYxK6TIB1gKjIVD5MRThpDaezLgw1D774J8eOeeDB0M6wHrQ==} + + '@ant-design/icons@6.3.4': + resolution: {integrity: sha512-kDoUlppczVyCUTFthF6cHmPzMBYqNZQhu9j6EyIX/YIdM9j9CZNZoJUjzVw7/1v1VO8WwVMmPp15r/uwIAS0AQ==} + engines: {node: '>=8'} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + + '@ant-design/react-slick@2.0.0': + resolution: {integrity: sha512-HMS9sRoEmZey8LsE/Yo6+klhlzU12PisjrVcydW3So7RdklyEd2qehyU6a7Yp+OYN72mgsYs3NFCyP2lCPFVqg==} + peerDependencies: + react: ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.8': + resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/runtime@7.29.7': + resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@8.0.0': + resolution: {integrity: sha512-sL6cvO2IfkSu/iU+zs2S/w01B7A8V7suXSIKEN4hPFFdZoiPGxrj5pAG0lCaqLWiEIrjKzdznIWuaLcxPR53qw==} + + '@babel/types@7.29.8': + resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} + engines: {node: '>=6.9.0'} + + '@borewit/text-codec@0.2.2': + resolution: {integrity: sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==} + + '@emotion/hash@0.8.0': + resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} + + '@emotion/unitless@0.7.5': + resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} + + '@esbuild/aix-ppc64@0.28.2': + resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.28.2': + resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.28.2': + resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.28.2': + resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.28.2': + resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.28.2': + resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.28.2': + resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.28.2': + resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.28.2': + resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.28.2': + resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.28.2': + resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.28.2': + resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.28.2': + resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.28.2': + resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.28.2': + resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.28.2': + resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.28.2': + resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.28.2': + resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.28.2': + resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.28.2': + resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.28.2': + resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.28.2': + resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.28.2': + resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.28.2': + resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.28.2': + resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.28.2': + resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@ioredis/commands@2.0.0': + resolution: {integrity: sha512-vrx0AE/T0h7cRZwfo1M39Cr+ZhZrkf0V8mQN75wucKCxCLD9l/VX6no3gFvrLqD1IlG/1LtzWovqEw3t0Vr9zg==} + + '@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.6.0': + resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@lukeed/csprng@1.1.0': + resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} + engines: {node: '>=8'} + + '@microsoft/tsdoc@0.16.0': + resolution: {integrity: sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==} + + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4': + resolution: {integrity: sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ==} + cpu: [arm64] + os: [darwin] + + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.4': + resolution: {integrity: sha512-zExlW9zUJKZH/tOtVMttwjKa4Xm/3KcNjnE3dPN92uCktwavMxpgCA3MoJK/DOnTWsQgo224OaST27/mPNAf+w==} + cpu: [x64] + os: [darwin] + + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.4': + resolution: {integrity: sha512-dgX0P/9wGPJeHFBG+ZmhgE6bmtMt7NP5CRBGyyktpopdk/mW4POnrpQsSLtKI1dwpc+pPLuXHDh6vvskyQE/sw==} + cpu: [arm64] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.4': + resolution: {integrity: sha512-Tg3yX65f5GbtXLkrYEHE5oibZG9epyYWas7FogTTEJeDEF9JlXJzKgXaNhT3UXlTOeA+AfZpYZYZ0uPj7Cfquw==} + cpu: [arm] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.4': + resolution: {integrity: sha512-8TNXMEjJc3QEy7R/x1INhgiU+XakDAFUzBhaz7+Rbrs8NH5UQeHQxxmzsSBJGyV6I1jW79undiQm8tOI+D+8FQ==} + cpu: [x64] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4': + resolution: {integrity: sha512-CmCXPQrkbwExx3j946/PtHWHbYJiCRBRDl4BlkRQcJB/YOwQxJRTpoo7aTsortjgoJ1x7opzTSxn7C+ASSLVjQ==} + cpu: [x64] + os: [win32] + + '@nestjs/common@12.0.1': + resolution: {integrity: sha512-v0zTaRCTV2K2xSnb3GnJoQKtaR6VxouJtm+P2gpr5w61dlXeWpXl1WVknCSzUqx2QwTV10tBkHETxvQvkf2Exg==} + peerDependencies: + class-transformer: '>=0.4.1' + class-validator: '>=0.13.2' + reflect-metadata: ^0.1.12 || ^0.2.0 + rxjs: ^7.1.0 + peerDependenciesMeta: + class-transformer: + optional: true + class-validator: + optional: true + + '@nestjs/config@12.0.0': + resolution: {integrity: sha512-pG5+fFfCo3cdgVkLJLvvhUGfxEjwzv9hIAQ1aJVHvHlHVniDWfwX5pR/utgoAkJzSikv2oTR1BmIF03FXdi42Q==} + peerDependencies: + '@nestjs/common': ^11.0.0 || ^12.0.0 + rxjs: ^7.1.0 + + '@nestjs/core@12.0.1': + resolution: {integrity: sha512-rU6tAi8vDdyzHgN0iW0J4UJvziroOqzHqzlqL7phOSPizaXVEePfv+OUOsdJEOh0Qd14mslc3udOheLrAEcZow==} + engines: {node: '>= 20'} + peerDependencies: + '@nestjs/common': ^12.0.0 + '@nestjs/microservices': ^12.0.0 + '@nestjs/platform-express': ^12.0.0 + '@nestjs/websockets': ^12.0.0 + reflect-metadata: ^0.1.12 || ^0.2.0 + rxjs: ^7.1.0 + peerDependenciesMeta: + '@nestjs/microservices': + optional: true + '@nestjs/platform-express': + optional: true + '@nestjs/websockets': + optional: true + + '@nestjs/mapped-types@12.0.0': + resolution: {integrity: sha512-aX7lxZcqXldtnSr0bgT2ZPQvpTpIwBMW1GMX29o4s3q02vmq6JoTYuPW0GwYXa8BiFMRX7WbGZVDA703pNqOMQ==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@nestjs/common': ^10.0.0 || ^11.0.0 || ^12.0.0 + class-transformer: ^0.4.0 || ^0.5.0 + class-validator: ^0.13.0 || ^0.14.0 || ^0.15.0 + reflect-metadata: ^0.1.12 || ^0.2.0 + peerDependenciesMeta: + class-transformer: + optional: true + class-validator: + optional: true + + '@nestjs/platform-express@12.0.1': + resolution: {integrity: sha512-nF8bRgROptMyixYBfiJUAsjj2o9k13zxAjUKYaqHTPk8mTSd+gk7hXz6NykXNrfHWmMEYC9RttQlMUdMHNTbuA==} + peerDependencies: + '@nestjs/common': ^12.0.0 + '@nestjs/core': ^12.0.0 + + '@nestjs/swagger@12.0.1': + resolution: {integrity: sha512-fQ0WyutSSHedO9HzSkOFKFaRygYNGBno5EggcZljs+KL8tHzPPTO5oyJpaf3BoOKFGGsN/0B13EbIpH2pkPx8g==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + '@fastify/static': ^8.0.0 || ^9.0.0 || ^10.0.0 + '@nestjs/common': ^12.0.0 + '@nestjs/core': ^12.0.0 + class-transformer: '*' + class-validator: '*' + reflect-metadata: ^0.1.12 || ^0.2.0 + peerDependenciesMeta: + '@fastify/static': + optional: true + class-transformer: + optional: true + class-validator: + optional: true + + '@nestjs/testing@12.0.1': + resolution: {integrity: sha512-prf3fsUaoKS6t04XcQt5aSTp68Po1GxUcbEBPv+3iqAef07hKQEO15r0jmmwA+rWZfONYT1UcV3YIylR++/tCg==} + peerDependencies: + '@nestjs/common': ^12.0.0 + '@nestjs/core': ^12.0.0 + '@nestjs/microservices': ^12.0.0 + '@nestjs/platform-express': ^12.0.0 + peerDependenciesMeta: + '@nestjs/microservices': + optional: true + '@nestjs/platform-express': + optional: true + + '@oxc-project/types@0.147.0': + resolution: {integrity: sha512-IJ3s6ltHLp45S0bh7phkX+gJO7A1Wuz2EaqpAhb8WjqDwbzMiWKHhyyT42tskaWjEYXtHtVCPpnBJVT9+dcRLg==} + + '@rc-component/async-validator@6.0.0': + resolution: {integrity: sha512-D3AGQwdyE58gmvx6waVSXJ80JGO+IY5L2O8HDnSOex7JNlzB3GuN/4hyHNTdhy2qtOhkpbIjmeAN3tL993wKbA==} + engines: {node: '>=14.x'} + + '@rc-component/cascader@1.22.0': + resolution: {integrity: sha512-SffrA57aS9oub3VuI7ajPhJTPtaNxngSvtRhD40Rd8dwJ5vfWPSrVanWgeepdWFGBt7EHftIK5RUU0u3rCTwWw==} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@rc-component/checkbox@2.0.0': + resolution: {integrity: sha512-3CXGPpAR9gsPKeO2N78HAPOzU30UdemD6HGJoWVJOpa6WleaGB5kzZj3v6bdTZab31YuWgY/RxV3VKPctn0DwQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/collapse@1.2.0': + resolution: {integrity: sha512-ZRYSKSS39qsFx93p26bde7JUZJshsUBEQRlRXPuJYlAiNX0vyYlF5TsAm8JZN3LcF8XvKikdzPbgAtXSbkLUkw==} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@rc-component/color-picker@3.1.1': + resolution: {integrity: sha512-OHaCHLHszCegdXmIq2ZRIZBN/EtpT6Wm8SG/gpzLATHbVKc/avvuKi+zlOuk05FTWvgaMmpxAko44uRJ3M+2pg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/context@2.0.2': + resolution: {integrity: sha512-uiGpAlblCNlziHPwj4S4Iy/oemeuz/hR03mbiEjTCXwsqOIN3BOzsRMyDwpyO5Fm0vIEEJRUf9ZtbRLbhksuTA==} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@rc-component/dialog@1.10.0': + resolution: {integrity: sha512-eDukNlz9vNszAGv7i3zKXdxEd3wgVmNxuJijYt8zvTh17QwTu8KK/bdURRd/lU4qaMzhO1HKKmMrwOnkaw0BvQ==} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@rc-component/drawer@1.4.2': + resolution: {integrity: sha512-1ib+fZEp6FBu+YvcIktm+nCQ+Q+qIpwpoaJH6opGr4ofh2QMq+qdr5DLC4oCf5qf3pcWX9lUWPYX652k4ini8Q==} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@rc-component/dropdown@1.0.3': + resolution: {integrity: sha512-YTST/N6kpqpDz3IMuM/PSSZnrDpSOA6dgHv12gPA90ZTSLv2CoqkZ0+9NtwTY6BeO7dstPblSic2QJg7dSFy/g==} + peerDependencies: + react: '>=16.11.0' + react-dom: '>=16.11.0' + + '@rc-component/form@1.8.6': + resolution: {integrity: sha512-1EXVsSKPZC6kGrIqxVck7kAWM6T65b6et/n5wIcyiaIa41VrDshD0nVLHoBDEIZr2ATQsOP6icb4XQkNFMLBAw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/image@1.10.0': + resolution: {integrity: sha512-BjeZCRQ+hw+4WAhvrw8rJvy5fckA2xpf/X2XQEOABUHvLTNB9inB98X3Mp54jYQ7g10DfWERQWHXeC4ylxp1Uw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/input-number@1.6.2': + resolution: {integrity: sha512-Gjcq7meZlCOiWN1t1xCC+7/s85humHVokTBI7PJgTfoyw5OWF74y3e6P8PHX104g9+b54jsodFIzyaj6p8LI9w==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/input@1.3.1': + resolution: {integrity: sha512-iFvTUT9W+JC/MSin2aGAk8NqsVlTzcExNC9DZariON1IWirju9NoNeEk47an4Q8iHazkoVI/y1LnDi88+CPcig==} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + + '@rc-component/listy@1.2.3': + resolution: {integrity: sha512-IXiMjV5s0rczLBlfh7G5nB4M3365mrEeedjwKtf5I+Ns3PqRUsebR2h5u8CeFarsVfLUPC2I5p0h09TNoOWyvQ==} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@rc-component/mentions@1.12.0': + resolution: {integrity: sha512-v5MBx8zDcqCT+uybJgKpcx3Fgrvj0m3u+A/15RlSBaMx12lLoJZTTYggC3pbYYfohcKujWWUyBz6O6Gp2vGiNA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/menu@1.5.0': + resolution: {integrity: sha512-RjvzPsZkwVEg3xu+/jDDqDeUCBJAnWylONFlGeQgg5enlNAnlpybqhaMGE/UPEIvr6hL90PGhjFBguJqj0Qb2Q==} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@rc-component/mini-decimal@1.1.4': + resolution: {integrity: sha512-xiuXcaCwyOWpD8a8scdExFl+bntNphAW8XeenL1ig2en0AAZY0Pcp4pC0dI22qJ+NvxKn9RoNIoRdqYU3BLH4w==} + engines: {node: '>=8.x'} + + '@rc-component/motion@1.3.3': + resolution: {integrity: sha512-Xh3IszxvlSv3/PLYFyC2UZi9LNB83yOnkB/LNmRzaypZLvkhqUIPS7MQpGZcCMWrNsXV2p6YTSWbSGvFpEle9A==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/mutate-observer@2.0.1': + resolution: {integrity: sha512-AyarjoLU5YlxuValRi+w8JRH2Z84TBbFO2RoGWz9d8bSu0FqT8DtugH3xC3BV7mUwlmROFauyWuXFuq4IFbH+w==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/notification@2.0.8': + resolution: {integrity: sha512-MTRA3b8eHE14gh5R9nlXzbWZEDEBFVkEHj/FI1VOXw2zrSnSxqbuuU3drsq+k53e6MHwtegoFay1tnNYhtl61Q==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@rc-component/overflow@1.0.1': + resolution: {integrity: sha512-syfmgAABaHCnCDzPwHZ/2tuvIcpOO3jefYZMmfkN+pmo8HKTzsfhS57vxo4ksPdN0By+uWVJhJWNFozNBxi2eA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/pagination@1.4.0': + resolution: {integrity: sha512-CW1g7P9V8u+e8JQdUsl2RWg+GCsoee0mtJjZUCCxn/vb3jzOwDKm6hAdwddHCVBfWJ58eGUBZz3IvnU8rRktjw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/picker@1.12.0': + resolution: {integrity: sha512-0FZGgDiDZFMm2hcfGv4jyjm7yWIj2MiwfeTzLL0vWkO+8cCSKdiM9XhWpkn1aAsoI2EwUy48Oz2cGfvL8ZKrfw==} + engines: {node: '>=12.x'} + peerDependencies: + date-fns: '>= 2.x' + dayjs: '>= 1.x' + luxon: '>= 3.x' + moment: '>= 2.x' + react: '>=16.9.0' + react-dom: '>=16.9.0' + peerDependenciesMeta: + date-fns: + optional: true + dayjs: + optional: true + luxon: + optional: true + moment: + optional: true + + '@rc-component/portal@2.2.1': + resolution: {integrity: sha512-ck+r1kW/JSv0wxPji3KN2ss9K6Z0qqwusw/mf/0JobXhZ8hC2ejZwCJObW/SvDi0uhA0VzmCnx0CaCci95tcmA==} + engines: {node: '>=12.x'} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@rc-component/progress@1.0.3': + resolution: {integrity: sha512-Q1nPLIvKr95el/q76yaBh5nv1hqCsWaHQb8U7vXEDMefEhHgM7n3CPoN+o4LHnTyANQHmMFgoS/naAT4Bhxuaw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/qrcode@2.0.0': + resolution: {integrity: sha512-aAv3QhPP1xyafuTZOxub6a54pCeBnN3IwQkpETrBtthq4BL5IgxnCbuoBWPDpdLw1y1j6BgBUCAKV92+yX06Dw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/rate@1.0.1': + resolution: {integrity: sha512-bkXxeBqDpl5IOC7yL7GcSYjQx9G8H+6kLYQnNZWeBYq2OYIv1MONd6mqKTjnnJYpV0cQIU2z3atdW0j1kttpTw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/resize-observer@1.1.2': + resolution: {integrity: sha512-t/Bb0W8uvL4PYKAB3YcChC+DlHh0Wt5kM7q/J+0qpVEUMLe7Hk5zuvc9km0hMnTFPSx5Z7Wu/fzCLN6erVLE8Q==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/segmented@1.3.0': + resolution: {integrity: sha512-5J/bJ01mbDnoA6P/FW8SxUvKn+OgUSTZJPzCNnTBntG50tzoP7DydGhqxp7ggZXZls7me3mc2EQDXakU3iTVFg==} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + + '@rc-component/select@1.10.1': + resolution: {integrity: sha512-H+yQsl+qED9NilQ3g6zdpsMwUgwVjrcMTkNHAWRVU/MoNCYgTbDgU+MIMgZDK+rVdd2JUfI/MkysMcZZ0cyQKw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '*' + react-dom: '*' + + '@rc-component/slider@1.1.1': + resolution: {integrity: sha512-LSzgWGYDgeCDgR4r1XlU29gbYws6HpLnvJd/uMhLeW/vQgxldeR+Wb4uzHDCHiYEbr1bnEHWdjkPxjJRHxuiig==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/steps@1.2.3': + resolution: {integrity: sha512-/b9gHcvDGjTDWJZW7+1kKFvzs0jrEeQ8mFvvIgX+h7xNT0FsOYODJYKjyJR4fPbvMBCfCOEqaBK66HBxov5BQA==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/switch@1.0.3': + resolution: {integrity: sha512-Jgi+EbOBquje/XNdofr7xbJQZPYJP+BlPfR0h+WN4zFkdtB2EWqEfvkXJWeipflwjWip0/17rNbxEAqs8hVHfw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/table@1.11.1': + resolution: {integrity: sha512-OWdS6DMmeWb7bJBGqPxYZpQbzBlBiXZUu2sqo6Ii7Sjs9GeK1IsrXrWk26SL2c6KEseabswdxrRj7WUm9LdECw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@rc-component/tabs@1.13.0': + resolution: {integrity: sha512-3FXr+9ZII8tFLWuDWrgjRaxZd2mazkKJAGRFEfVmp4r1qnBglOlxQ78l54Td1aj6/iFaaEReKSAF2HToztU5uw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/tooltip@1.5.2': + resolution: {integrity: sha512-VLq4BclU3LgRe46g2hTr2bdsM8tFYs7dVwpuD88rPNNg4lCGe8mBSS4FiRzYzS+ffnZ46y4SI8KYKo9K7qBnhw==} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@rc-component/tour@2.4.0': + resolution: {integrity: sha512-aui4r4TqmTzwaBgcQxHYep8kM8PTjZFufjokObpy35KfFeZ0k9ArquWFZqegQlH24P14t+F0qO0mGTgzlav1yg==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/tree-select@1.16.1': + resolution: {integrity: sha512-a1Oi6EJhqAhdOxxupdJi6fP0RPHMKn5TcfkX2+llaQ4lF4nwfH7b6SCHcnsybaa2s+pk1yZYwVyeOYkDnEBRdg==} + peerDependencies: + react: '*' + react-dom: '*' + + '@rc-component/tree@1.4.0': + resolution: {integrity: sha512-dGsJGDJQedA0BqqVgj3F8BvHXTSZijyhTXdbAdkcx8lynzZkty/CV3Z3LOm/fxz+BCfl3dfGiAQpb7Q5XNvl0Q==} + engines: {node: '>=10.x'} + peerDependencies: + react: '*' + react-dom: '*' + + '@rc-component/trigger@3.10.1': + resolution: {integrity: sha512-mXlDN0IXdtV8Yqqm8195ECCyrbmfvvfKvwVvSlH0+qvKD6BUF8gRhEjSy0FOcD1+CcDRHgTiX99LoxfQrmh3Cw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@rc-component/upload@1.1.1': + resolution: {integrity: sha512-GvYWSKeaJTOxxC5p6+nOSadzfvXA1h8C/iHFPFZX+szH3JUXrvs+DLiW8YUTBgvMh8m63mJeHrlYlJzAlg+pDA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/util@1.13.0': + resolution: {integrity: sha512-IXf2zBfZrbQGT+G8LxnoICDBGnMHIPIiq5HCRn3EDfKUx28x1rnbZBj46ULJf4sM8ImTG1SepqfNBdxZziqQ4w==} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@rc-component/virtual-list@1.5.1': + resolution: {integrity: sha512-boqHxdtyWC88u8quYgEO49bcBy5fzRiOcnBge+N4nLzs2k8hUQ/yw7JE9dM6yCBE4jSm5YSHVCVMS+suBuJGKA==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@rolldown/binding-android-arm-eabi@1.2.6': + resolution: {integrity: sha512-b+jTcARdTiFLI6jB4a5XjTm0RWd6KcRfQj/I2356fxUZemiho9zQLxo0RtCuMDAyKcLo6cEltkgbQp6d1+sjjQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@rolldown/binding-android-arm64@1.2.6': + resolution: {integrity: sha512-lkWU8ZJaRk9q3CIEY1Tc7vIFALp3Xw5NfGJo2hQg5oIqNgxWi1zI+IiDEK3r70BF5Dzol1tcXsnzsRc8NLhG+Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.2.6': + resolution: {integrity: sha512-dgR56NYnvAszm7Ob1B2/Vn0e8bUQYZH2UjVaMMtMVOCKFSfjhfLmuA/9+O+F+ajUdG6B/bSssrKW6JJYASa8jA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.2.6': + resolution: {integrity: sha512-vpVxFvUCFioJqug7OTvqptkc4yb8UX0AwfDmJpaR/0sWz+BUmqSVAf7c8JkUgnN8YLspb4a/N6NhTyMAmdyQ7Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.2.6': + resolution: {integrity: sha512-h1wG6Y6K3JlRswxsI64qQJqBAy4vrLuHgRbc8CZMGSWTOFRY6ghMApM1NKzB2I0n5xV1fjkE18SuVl2QpLeNpA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.2.6': + resolution: {integrity: sha512-tbCiqub0q2MVWJKgF5PoAlNWCtQydiOYSLIkd8sByqK/6MMYLJRcSXSYodqYtd0O+Fw7QaVmKKlS4oL94YRZ0w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.2.6': + resolution: {integrity: sha512-oxK9+baEBPhZG5HB4URY+uU04zJWeZlH6Tb9rB5DK4DF9XR1uXNLXt5Q5ZsugTKayNCNLhkcwz/ye74hRI98dg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-musl@1.2.6': + resolution: {integrity: sha512-muWCk27FVBEZtv0MsK8gnfSmgczA8KQ0uRVJbTABKhkRfQc38aUrcb7fhi3BNiyseFmgcRsoMfQsSNJ+DbZdSw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-ppc64-gnu@1.2.6': + resolution: {integrity: sha512-eWDoSfU7Co2qj3vgB3Dt4lj1mG6CoWbcJQkRMP3XJplyCMtuaq3LHvPFjS9QIPvMGWVadJC04Xiy0IdcVPtnwQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-s390x-gnu@1.2.6': + resolution: {integrity: sha512-2bWNjRSIayvupRKxXUY2tWG9fYdoUlTqWywHRvE8Eq3GvuQ+f2HeIkve697fIt+IQs/PV8yFsdWuhp1aJ1PdnA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.2.6': + resolution: {integrity: sha512-KekI0gS0wLxe1UBSQSjenBVwou/JkcQPDzBPICGZjxUv9k3RteHDPBQaiOicZUFKRIH2wKEimGwVpnJsbPzu7w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.2.6': + resolution: {integrity: sha512-TvtPnfVr+HtyGiDmPK4VWmlNm7QhNNAcK5Q9A7aOXsI8545yCyaoMaicXrFZ72JzeYjaUVk7yT243zT0jzjFKQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-openharmony-arm64@1.2.6': + resolution: {integrity: sha512-iOo0VEay2XFhaCcH0sps5XIimkSuOnNaZrf6+ZkoSOQBJPKNU48RkmJv0/lSpipexu5P+ouFgafe5IGr/DiQfg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-win32-arm64-msvc@1.2.6': + resolution: {integrity: sha512-y5NTmmasMS455JlOCO4ZM9krIchv3Mvm1crL1iUPGOPgEzSkves9n0SdC5Sjz6+qWDFhd8/JpfWMH8NSWNHe+A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.2.6': + resolution: {integrity: sha512-np8iZSLfXlAD4kWhiyq/u0Yt8oZDtRQ8lGhQaCXo2rl37KNjeU0GjJuwr4P3oeZ++ROfofsKNBqR5LTO8aXyWQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + + '@scarf/scarf@1.4.0': + resolution: {integrity: sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==} + + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + + '@tokenizer/inflate@0.4.1': + resolution: {integrity: sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==} + engines: {node: '>=18'} + + '@tokenizer/token@0.3.0': + resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} + + '@topcli/prompts@4.0.0': + resolution: {integrity: sha512-kkKYPb4k/6kRdnESt77B5vJrrYnYHIYczwv0P1c+tfN/IWEx3KZeKEHoUq7sImIyBEXWdA2uakIroD9pmRJziQ==} + engines: {node: '>=22.0.0'} + + '@turbo/darwin-64@2.10.12': + resolution: {integrity: sha512-9nKgKoF6ZOUsM+or0OtNf+TTJSfGvDNP7ZFv/ZGWVwOSCkumyctQiTeHwB4UNljHTnC41AqylgbunLDHoccNrA==} + cpu: [x64] + os: [darwin] + + '@turbo/darwin-arm64@2.10.12': + resolution: {integrity: sha512-H4Elb1jqTZVeIC9bbcNwjSzemZ6RegoTOVHeuV5Osirt2Z8UguTyisMEkvZjPVZgMeN9J4ERZBFad40tFnkb7w==} + cpu: [arm64] + os: [darwin] + + '@turbo/linux-64@2.10.12': + resolution: {integrity: sha512-lr7KIotukvjZwEXiFSYAeOH3BWzjFVBbSzTbv0fuGFsNukYyH0+g1hB5ecqnJkgkYU+KHEMG1edOhnjiKON1wQ==} + cpu: [x64] + os: [android, linux] + + '@turbo/linux-arm64@2.10.12': + resolution: {integrity: sha512-f0pZDTtvzB5SuNwuXBaKbZHUCMCukgc8nMlHEuvLmj91Fzec+MEbr3cAvGNor5htEDqZnO6Lxt9N/GPI/77oGA==} + cpu: [arm64] + os: [android, linux] + + '@turbo/windows-64@2.10.12': + resolution: {integrity: sha512-SDOueJRjS/QcykWf2KCRtTLmIl5YMKsLbXkXQGhDwcTXvKXZiS5ih5lBl/gkwZIpYFjqA/rAlfMzlAFcVHNe0g==} + cpu: [x64] + os: [win32] + + '@turbo/windows-arm64@2.10.12': + resolution: {integrity: sha512-0i0mVUa4kKk+/B3RwEwPMf9CB+T7ul56hn5FFHNA4VUNTOoLBEd6aNf3FaKfCatDNZ6cicCEf6if9QUTVyzzcA==} + cpu: [arm64] + os: [win32] + + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} + + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/express-serve-static-core@5.1.3': + resolution: {integrity: sha512-dPfW8NFiOF4wOHc7+N/QSxlY9cfSsenewGbAz8C8U/MULPd/YZ27LvJUIlzaXie7e6Ove9YunJGgC9tbHD2cKw==} + + '@types/express@5.0.6': + resolution: {integrity: sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==} + + '@types/filesystem@0.0.36': + resolution: {integrity: sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA==} + + '@types/filewriter@0.0.33': + resolution: {integrity: sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g==} + + '@types/har-format@1.2.16': + resolution: {integrity: sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A==} + + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} + + '@types/node@26.3.0': + resolution: {integrity: sha512-L3fgrnchriRC2ExBflb8j4uZZURHZfQsmQeyVzhjcHW4kkwVyo8/0h1B2MVzMTrYUJYu6G7EWs14hW/L9putqw==} + + '@types/pg@8.23.1': + resolution: {integrity: sha512-fKVHpikPdg4GKks3JuLEhvwSyvwzF23hnabPy6DD8ljVbC7+6J5dQzdv4arV6jqq57djnMgs1HKBxX4P8aBI3A==} + + '@types/qs@6.15.1': + resolution: {integrity: sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/react-dom@19.2.5': + resolution: {integrity: sha512-fMPwH9v7r/pp43yUd2/Mbiex5KouJwwR3dzHkhLREUC6764VyDsqxhAxv6OFEYR1RhjOyD1naqba8ECDBe7ZQg==} + peerDependencies: + '@types/react': ^19.2.0 + + '@types/react@19.2.18': + resolution: {integrity: sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==} + + '@types/send@1.2.1': + resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} + + '@types/serve-static@2.2.0': + resolution: {integrity: sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==} + + '@typescript/typescript-aix-ppc64@7.0.2': + resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [aix] + + '@typescript/typescript-darwin-arm64@7.0.2': + resolution: {integrity: sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [darwin] + + '@typescript/typescript-darwin-x64@7.0.2': + resolution: {integrity: sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [darwin] + + '@typescript/typescript-freebsd-arm64@7.0.2': + resolution: {integrity: sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [freebsd] + + '@typescript/typescript-freebsd-x64@7.0.2': + resolution: {integrity: sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [freebsd] + + '@typescript/typescript-linux-arm64@7.0.2': + resolution: {integrity: sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [linux] + + '@typescript/typescript-linux-arm@7.0.2': + resolution: {integrity: sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==} + engines: {node: '>=16.20.0'} + cpu: [arm] + os: [linux] + + '@typescript/typescript-linux-loong64@7.0.2': + resolution: {integrity: sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==} + engines: {node: '>=16.20.0'} + cpu: [loong64] + os: [linux] + + '@typescript/typescript-linux-mips64el@7.0.2': + resolution: {integrity: sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==} + engines: {node: '>=16.20.0'} + cpu: [mips64el] + os: [linux] + + '@typescript/typescript-linux-ppc64@7.0.2': + resolution: {integrity: sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [linux] + + '@typescript/typescript-linux-riscv64@7.0.2': + resolution: {integrity: sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==} + engines: {node: '>=16.20.0'} + cpu: [riscv64] + os: [linux] + + '@typescript/typescript-linux-s390x@7.0.2': + resolution: {integrity: sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==} + engines: {node: '>=16.20.0'} + cpu: [s390x] + os: [linux] + + '@typescript/typescript-linux-x64@7.0.2': + resolution: {integrity: sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [linux] + + '@typescript/typescript-netbsd-arm64@7.0.2': + resolution: {integrity: sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [netbsd] + + '@typescript/typescript-netbsd-x64@7.0.2': + resolution: {integrity: sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [netbsd] + + '@typescript/typescript-openbsd-arm64@7.0.2': + resolution: {integrity: sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [openbsd] + + '@typescript/typescript-openbsd-x64@7.0.2': + resolution: {integrity: sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [openbsd] + + '@typescript/typescript-sunos-x64@7.0.2': + resolution: {integrity: sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [sunos] + + '@typescript/typescript-win32-arm64@7.0.2': + resolution: {integrity: sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [win32] + + '@typescript/typescript-win32-x64@7.0.2': + resolution: {integrity: sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [win32] + + '@vitejs/plugin-react@6.1.1': + resolution: {integrity: sha512-yxLaQV9gkhS8ezJqCM6+ndU7mDY6gqAg75NQ+0IjwEI8IYOmQCgkRwHKVSfWXW076DsqMo0Dk+0FK1U+M5RgFw==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + '@rolldown/plugin-babel': ^0.1.7 || ^0.2.0 + babel-plugin-react-compiler: ^1.0.0 + oxc-transform-react: ^0.145.0 + vite: ^8.0.0 + peerDependenciesMeta: + '@rolldown/plugin-babel': + optional: true + babel-plugin-react-compiler: + optional: true + oxc-transform-react: + optional: true + + '@vitest/expect@4.1.11': + resolution: {integrity: sha512-VX2x5vNJXET47KAFzwERI+KRMtTTCSWTfSMKsW7JsUsXV4psq++e3DvZpuTDOpHcxytiDs6p2nhVb2tVDiiUYw==} + + '@vitest/mocker@4.1.11': + resolution: {integrity: sha512-2XJVD55d1o5AZous5CCGKS74g/riOj9odEt2bQpCVZeblHyHdnMeFl4jl0XjU21stf4mbjUkew2eXQZt65g5CQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@4.1.11': + resolution: {integrity: sha512-yiZzPbGTS9Sr/JpFl8zHrcIkAofNbFV6k21vIgQN/cY/oxZeXhJv5sc/MBJ5jFKWmWs+oJHw0UXLZjmf931+Vw==} + + '@vitest/runner@4.1.11': + resolution: {integrity: sha512-LztvUgdwMNJMIkj3hQnnxiC2Xy1zNxq928W/xhjCLaNCzqTZOudjwbQf6v9IntZGPw132i2Lq2rgTRZHD3JHNw==} + + '@vitest/snapshot@4.1.11': + resolution: {integrity: sha512-pN7ikn1ON7h8ee4gIAp4AzyK+zBtJPzVbqOgu5LCEh4VaJVbPQcgYQYJIMGQPXVeJJq1fnfazis7a5pFNPahog==} + + '@vitest/spy@4.1.11': + resolution: {integrity: sha512-apNa/prQy2qCeywhnixOHPRCgGNhvg7T4Dapfl1GahLp/R+uhBm5cPyFoNVyqsNd2h1nJxL6BqqdIjiABL60YA==} + + '@vitest/utils@4.1.11': + resolution: {integrity: sha512-zTCVGpyFsGWBhllOyKlTw/vnr6D9qxsfSDyfbyZmTyjHw5N/VuvzHpHoQjm2ZJzn4RJgx5w4r7V0er69CmLgPQ==} + + '@webext-core/fake-browser@2.0.1': + resolution: {integrity: sha512-4x5z1z8F0KU8ShF4ForXJ8qnA8oZTy7HYjI91Mbpdzp3H3hU9HR6TNPUxfWtSpFz2FwgEircuJKQg0qFIn6RLg==} + + '@webext-core/isolated-element@3.0.0': + resolution: {integrity: sha512-PmSIBMSe+rFw6eXzpJoV+glc1HPO40clcT9FJ7rSfCQzNewK8/nQZoBYWen2cMqdXdBNM9to/IbNNu5mdQLaPg==} + + '@webext-core/match-patterns@2.0.0': + resolution: {integrity: sha512-EsyMMKfQuSE4rWCjP/TifwvUWlhC/OhiGn5OK3p9F0d57UmtLib0nzguzPKyxM1/kZV7SkE+jYXkE8gsdPRLmw==} + + '@wxt-dev/browser@0.2.7': + resolution: {integrity: sha512-Dr3h3qS25Wah4LjoCSw5uazD+547Q0dLnxaRjkkLauus008daHAulgNKTU4HkojaS9QBdo3xUlwUYPTBCQb+XQ==} + + '@wxt-dev/module-react@1.2.2': + resolution: {integrity: sha512-+lRLi1r9dAXpLySWSIWHLJ1h/nFzR20iQnx3RNrKyA6oJg4+ClOluVXozHjfPg9Okfy/umtffiOopGayASrg6w==} + peerDependencies: + vite: ^5.4.19 || ^6.3.4 || ^7.0.0 || ^8.0.0-0 + wxt: '>=0.19.16' + + '@wxt-dev/storage@1.2.9': + resolution: {integrity: sha512-dh9TJwvLBM2x4wyy9nE7eYE3wA8pgz1TXSyz7RbdjkJxLfFfWkbeIqiU7VkGy7Vx8sJBmQjoSpk9zSUb3Bjy0Q==} + + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + + acorn@8.18.0: + resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + antd@6.6.2: + resolution: {integrity: sha512-aTOPWXsqfWrlSiI0a1qR9UWR4jBCTJ8FNZfZmYQP9/aGGLJSrw9/c5uE+4vSVSt3riQlIPAwR3BcAgEHmE7GMg==} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + append-field@1.0.0: + resolution: {integrity: sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios@1.20.0: + resolution: {integrity: sha512-r8aOh8j9cGKpgQAqpzrUHnSIc6a59Y3Xf/cv8sy1DrHCkZHzQGEuoq1tARk6qSyDdtQGSDgpb9kFlruzPvrgwg==} + + body-parser@2.3.0: + resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==} + engines: {node: '>=18'} + + boolbase@2.0.0: + resolution: {integrity: sha512-DkVaaQHymRhpYEYo9x1oo7Q7B0Y6KJUsjm3c9eTyFDby4MHLBTwZ6ZDWBel5zrYxj1WsZgC5oLpiz+93MluXeA==} + engines: {node: '>=20.19.0'} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + bullmq@6.3.4: + resolution: {integrity: sha512-DpilB5sayCB8huCp4YuzVhJjxB4ieHidzu+GPgbcjPi3kQv0gdLoLnk+I+mMACDQ88rTbSiT+B4crmhWFGL9GA==} + engines: {node: '>=14.17.0'} + peerDependencies: + bullmq-otel: '>=2.0.0' + ioredis: '>=5.0.0' + pg: '>=8.0.0' + redis: '>=5.0.0' + peerDependenciesMeta: + bullmq-otel: + optional: true + ioredis: + optional: true + pg: + optional: true + redis: + optional: true + + 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'} + + c12@3.3.4: + resolution: {integrity: sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA==} + peerDependencies: + magicast: '*' + peerDependenciesMeta: + magicast: + optional: true + + cac@7.0.0: + resolution: {integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==} + engines: {node: '>=20.19.0'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + engines: {node: '>=18'} + + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + + citty@0.2.2: + resolution: {integrity: sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + cluster-key-slot@1.1.1: + resolution: {integrity: sha512-rwHwUfXL40Chm1r08yrhU3qpUvdVlgkKNeyeGPOxnW8/SyVDvgRaed/Uz54AqWNaTCAThlj6QAs3TZcKI0xDEw==} + engines: {node: '>=0.10.0'} + + 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==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + compute-scroll-into-view@3.1.1: + resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==} + + concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.2.4: + resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} + + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + + content-disposition@1.1.0: + resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} + engines: {node: '>=18'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + content-type@2.1.0: + resolution: {integrity: sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==} + engines: {node: '>=18'} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + cookie@1.1.1: + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} + engines: {node: '>=18'} + + cors@2.8.6: + resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} + engines: {node: '>= 0.10'} + + cron-parser@5.10.0: + resolution: {integrity: sha512-izNAxJyRWUP8ljBoDSub5WyrVOUlT4SLGShswE7eoRBpp6QUsSycYxLBMJlbshgPBMcPT/nrfgjNY2918ayv2A==} + engines: {node: '>=18'} + + css-select@7.0.0: + resolution: {integrity: sha512-snmjEVXy+1LnwXdxhYvTMj1d9tOh4HxkA1YmoayVBeeyR2C14Pum7fcxJIm4SswYspVy866eYNwlH6xC3/VH5g==} + engines: {node: '>=20.19.0'} + + css-what@8.0.0: + resolution: {integrity: sha512-DH0Bqq3DNp5tdOReuNyAA+Ev4Y2GS5FMbZpeTLP6C4CDi0h5nL0BmUPChXw3o/qbHLDWHl49sbNqQVY7bMSDdw==} + engines: {node: '>=20.19.0'} + + cssom@0.5.0: + resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + dayjs@1.11.23: + resolution: {integrity: sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ==} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + 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'} + + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + dom-serializer@3.1.1: + resolution: {integrity: sha512-4MEa38/QexBob6gFNwu+EGdWvhJ1OKuNwdYY3Y3NyeWDQfnGeDYQUDfIRzWu5B5gsv03so2Uxd28YC6zrsx3Lw==} + engines: {node: '>=20.19.0'} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domelementtype@3.0.0: + resolution: {integrity: sha512-umCQid3jKbDmVjx8jGaW7uUykm4DEUeyV21hPxNMo2nV955DhUThwqyOIDtreepP31hl84X7G5U9ZfsWvIB3Pg==} + engines: {node: '>=20.19.0'} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domhandler@6.0.1: + resolution: {integrity: sha512-gYzvtM72ZtxQO0T048kd6HWSbbGCNOUwcnfQ01cqIJ4X2IYKFFHZ5mKvrQETcFXxsRObZulDaKmy//R7TPtsBg==} + engines: {node: '>=20.19.0'} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + domutils@4.0.2: + resolution: {integrity: sha512-qI4JLRKnSzqFqr7hAlS5xQDusBCjKSEG4t4+7aNrIQMHBcsC2TGEhuyABJdYkgSewL57PNLYEiibY2iPKhKpaA==} + engines: {node: '>=20.19.0'} + + dotenv-expand@13.0.0: + resolution: {integrity: sha512-aBfBS8eYIeXmpHI9ThIlA7/WLq+SLt18iXUZhb52rW89QLKQFoIpPG1bPeewoPZsTyjSSO3T7234FBVUM1V2rA==} + engines: {node: '>=12'} + + dotenv@17.4.2: + resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} + engines: {node: '>=12'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + + entities@8.0.0: + resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} + engines: {node: '>=20.19.0'} + + 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-module-lexer@2.3.2: + resolution: {integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==} + + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-toolkit@1.51.0: + resolution: {integrity: sha512-zC2lQGkM7QX+Gm6iM3+WIdZJzthsEd14LvRNJneSO2hzyz/zNBENR8+YXWo1cKxgPBtV6ksPYHELbcwBRzmdCw==} + + esbuild@0.28.2: + resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} + engines: {node: '>=18'} + hasBin: true + + 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@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + expect-type@1.4.0: + resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} + engines: {node: '>=12.0.0'} + + express@5.2.1: + resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} + engines: {node: '>= 18'} + + exsolve@1.1.1: + resolution: {integrity: sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-type@22.0.2: + resolution: {integrity: sha512-0H8TsCUGBLx+V5adH3EY52hTAcyLKbV1D4gq5cIOJ6DnQAHeV9Z2Hhuc5CoBX4YmvB2oL+JIC84z0qO7JsCoNw==} + engines: {node: '>=22'} + + filesize@11.0.22: + resolution: {integrity: sha512-RlCVs9CY+oSsRnNZn95J9vDXjNjOwddKyTFjOYtA4yxYVIxBnwiVVGJX+TFhsmu3uUf81JDGyijtYL9xgawlTw==} + engines: {node: '>= 10.8.0'} + + finalhandler@2.1.1: + resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} + engines: {node: '>= 18.0.0'} + + follow-redirects@1.16.0: + resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + form-data@4.0.6: + resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} + engines: {node: '>= 6'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + + 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==} + + 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'} + + giget@3.3.1: + resolution: {integrity: sha512-r+mvuDjrjMpsdw46Kmeydb8bdHm7wOKw8wNBtTndkjbPjgAp5oUJUxRE76wZFknxIPokfWvep2qSXK37aXE6zg==} + hasBin: true + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + 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.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + + helmet@8.3.0: + resolution: {integrity: sha512-Qgpiaws3Sm30Av8Eah6sjMCZZwjlBu+E68rhpCWBshY1lb09HtLwj5GviX0OyQIn+ulUS0iX0AxN5n3tLZzz1w==} + engines: {node: '>=18.0.0'} + + hookable@6.1.1: + resolution: {integrity: sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==} + + html-escaper@3.0.3: + resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} + + htmlparser2@10.1.0: + resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} + + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + iconv-lite@0.7.3: + resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ioredis@6.0.0: + resolution: {integrity: sha512-f+Dtubxfpf6KYFq7WVXJoOLn0bk4TJrMrN9SzeE+jrWrCWj7XX3fA6vkryafhADX+GMymRxgDJDOI33COkJc0w==} + engines: {node: '>=20.0.0'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-mobile@5.0.0: + resolution: {integrity: sha512-Tz/yndySvLAEXh+Uk8liFCxOwVH6YutuR74utvOcu7I9Di+DwM0mtdPVZNaVvvBUM2OXxne/NhOs1zAO7riusQ==} + + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + iterare@1.2.1: + resolution: {integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==} + engines: {node: '>=6'} + + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} + hasBin: true + + js-tokens@10.0.0: + resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} + + js-yaml@5.4.1: + resolution: {integrity: sha512-28R/k+NAjeuf7+CKlTxWZVExJGwVVLwY06DgEnOMz2gEpfNkDcD7QvyiVPT0xy0XXhU8vHsd4Ot42OOPdJG7dQ==} + hasBin: true + + json2mq@0.2.0: + resolution: {integrity: sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + lightningcss-android-arm64@1.33.0: + resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.33.0: + resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.33.0: + resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.33.0: + resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.33.0: + resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.33.0: + resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.33.0: + resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.33.0: + resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.33.0: + resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.33.0: + resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.33.0: + resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.33.0: + resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} + engines: {node: '>= 12.0.0'} + + linkedom@0.18.13: + resolution: {integrity: sha512-ES/o9qotMpzpN2MHs+Iq/JcVoOj8Fa5wiQYrTdFpvAnwXL0g66XHHUc9WUMk6nAlBtGsFQ24ne+SYnvnaQ2FSw==} + engines: {node: '>=16'} + peerDependencies: + canvas: '>= 2' + peerDependenciesMeta: + canvas: + optional: true + + load-esm@1.0.3: + resolution: {integrity: sha512-v5xlu8eHD1+6r8EHTg6hfmO97LN8ugKtiXcy5e6oN72iD2r6u0RPfLl6fxM+7Wnh2ZRq15o0russMst44WauPA==} + engines: {node: '>=13.2.0'} + + local-pkg@1.2.1: + resolution: {integrity: sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==} + engines: {node: '>=14'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + luxon@3.7.2: + resolution: {integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==} + engines: {node: '>=12'} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + magic-string@1.2.3: + resolution: {integrity: sha512-Bpb0W2TbLKOZ7vJnOUnVRGq3WL2p+ISV29M6hYPL1AFCpyKZpdr5ytiXoTSSxRVhg8YW7f65+6gbG8WG6PCa/g==} + + magicast@0.5.4: + resolution: {integrity: sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w==} + + many-keys-map@3.0.3: + resolution: {integrity: sha512-1DiZmDHPXMBgMRjeUtHy1q1VYmeJscHxhIAexX9z/zjRMP80+0ETuPfssi8z+kMY4DwUgsKuHqpjxgmeA9gBNA==} + engines: {node: '>=18'} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + media-typer@1.1.1: + resolution: {integrity: sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==} + engines: {node: '>= 0.8'} + + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} + + mlly@1.8.2: + resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + msgpackr-extract@3.0.4: + resolution: {integrity: sha512-4kmO/MdyUIkLIvTPr8VHLil4AtoKIoniWPIEk5+CDy0xnWC84azhSFmuJ7PxZdsYtiP5kEeQsORAVIeMgxT+Hw==} + hasBin: true + + msgpackr@2.1.0: + resolution: {integrity: sha512-p/pBCVO63CsvvpkomUnNNag6+n38rULuDA6HHe70o2gtC8ODI52foF/4ko2qQcp6OiErJXTmrZeXmsGGHsIQNQ==} + + multer@2.2.0: + resolution: {integrity: sha512-6rdyFg2kLrMh9Jee7/BMPuV9lEAd7lLW2YUpF9/YxR7njyoUwwQ0ZPh3TaIY50Sw6vlyD2HW3wGOkTS4P79xrQ==} + engines: {node: '>= 10.16.0'} + + nanoid@3.3.18: + resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + negotiator@1.1.0: + resolution: {integrity: sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==} + engines: {node: '>=18'} + + node-abort-controller@3.1.1: + resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + + node-gyp-build-optional-packages@5.2.2: + resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} + hasBin: true + + nth-check@3.0.1: + resolution: {integrity: sha512-GX0gsdbGVCgnRgbeGaubfjpBXyYRWOOCVeYh08bSQvDZqxz5ndXs1OTfAt/h36G1xvI94YIspsI0sVFqAV9+RQ==} + engines: {node: '>=20.19.0'} + + nypm@0.6.9: + resolution: {integrity: sha512-zxlE2yvSWZWmHcNdT3+5zV2lrCogeE9YOklHrR3dFjqutq5wO7GFDYLFDRXLsYnJzwvy/im9fYoxePvS0VTW0w==} + engines: {node: '>=18'} + hasBin: true + + 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'} + + obug@2.1.4: + resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==} + engines: {node: '>=12.20.0'} + + ohash@2.0.12: + resolution: {integrity: sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==} + + 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==} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-to-regexp@8.4.2: + resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + perfect-debounce@2.1.0: + resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==} + + pg-cloudflare@1.4.0: + resolution: {integrity: sha512-Vo7z/6rrQYxpNRylp4Tlob2elzbh+N/MOQbxFVWCxS7oEx6jF53GTJFxK2WWpKuBRkmiin4Mt+xofFDjx09R0A==} + + pg-connection-string@2.14.0: + resolution: {integrity: sha512-XwWDGcLRGCXAR8F/AM5bG7Q+A3Wm2s6QeEjlOKZLlH3UYcguiqCWKyWXVag5TLTIjR7oOJUY8kcADaZgWPyLeg==} + + pg-int8@1.0.1: + resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} + engines: {node: '>=4.0.0'} + + pg-pool@3.14.0: + resolution: {integrity: sha512-gKtPkFdQPU3DksooVLi9LsjZxrsBUZIpa+7aVx+LV5pNh0KzP4Zleud2po+ConrxbuXGBJ6Hfer6hdgpIBpBaw==} + peerDependencies: + pg: '>=8.0' + + pg-protocol@1.16.0: + resolution: {integrity: sha512-sILXutLVjCLjcDuOmvhX5e2Z4cS5qG/6Bu3VkpFwdf/633ElGLpEh9bgmuI5I4sqKqkifQiGyiCcx1HdtrK7tg==} + + pg-types@2.2.0: + resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} + engines: {node: '>=4'} + + pg@8.23.0: + resolution: {integrity: sha512-Ip2EQCngowJLGOfCwkFhPXU7/ljlhn6Rxlmy4XYfL2Y+vyRM59+8uR2xqRWKdYmbXmxCFOAmKxBuSUCdF34qLg==} + engines: {node: '>= 16.0.0'} + peerDependencies: + pg-native: '>=3.0.1' + peerDependenciesMeta: + pg-native: + optional: true + + pgpass@1.0.5: + resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} + engines: {node: '>=12'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.3.1: + resolution: {integrity: sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==} + + postcss@8.5.26: + resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==} + engines: {node: ^10 || ^12 || >=14} + + postgres-array@2.0.0: + resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} + engines: {node: '>=4'} + + postgres-bytea@1.0.1: + resolution: {integrity: sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==} + engines: {node: '>=0.10.0'} + + postgres-date@1.0.7: + resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} + engines: {node: '>=0.10.0'} + + postgres-interval@1.2.0: + resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} + engines: {node: '>=0.10.0'} + + prettier@3.9.6: + resolution: {integrity: sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==} + engines: {node: '>=14'} + hasBin: true + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + proxy-from-env@2.1.0: + resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} + engines: {node: '>=10'} + + publish-browser-extension@6.1.1: + resolution: {integrity: sha512-ovfBOz+cZIOBHZ+oxTfpv1kSGU7ruzy8CXoFGvhXsUbJuty45srGzf1ufEePs69virOWXfFbhZRoNQUdgPvwXA==} + engines: {node: '>=22.0.0'} + hasBin: true + + qs@6.16.0: + resolution: {integrity: sha512-h6fhOIaRrID2CbEY2fqs+7t+UXZo+MLAnU5gRIq85uFtdiUPCdsApMlHhXogKVM4HM2DVbIjGNTTYH2OcmP1vA==} + engines: {node: '>=0.6'} + + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + + range-parser@1.3.0: + resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==} + engines: {node: '>= 0.6'} + + raw-body@3.0.2: + resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} + engines: {node: '>= 0.10'} + + rc9@3.0.1: + resolution: {integrity: sha512-gMDyleLWVE+i6Sgtc0QbbY6pEKqYs97NGi6isHQPqYlLemPoO8dxQ3uGi0f4NiP98c+jMW6cG1Kx9dDwfvqARQ==} + + react-dom@19.2.8: + resolution: {integrity: sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==} + peerDependencies: + react: ^19.2.8 + + react-is@19.2.8: + resolution: {integrity: sha512-s5un28nYxKJw5gvUHyW5PCC28CvBqLu9r3cWgzHT4Vo/5fqqkFcdRYsGcKf50WMPpjjFZS5d76fn3YCo2njKwQ==} + + react-router-dom@7.18.3: + resolution: {integrity: sha512-ytVbyBBM7vMfRCam25r0WMhSVSom909A8p+8m0/f1w853dz/xfFu6etAT2SEbVoSnI+ZoPRDqIsQXVT89gp7kg==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: '>=18' + react-dom: '>=18' + + react-router@7.18.3: + resolution: {integrity: sha512-gyXgtdr5uACJ5b1Q4udzjVV+tb/rlHIMJKuJ0e89R4Kzgz47z/rgP0dIKxktqIEUhDHluGTPJJH/wRha7CyqsA==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: '>=18' + react-dom: '>=18' + peerDependenciesMeta: + react-dom: + optional: true + + react@19.2.8: + resolution: {integrity: sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==} + engines: {node: '>=0.10.0'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@5.1.1: + resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==} + engines: {node: '>= 20.19.0'} + + redis-errors@1.2.0: + resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} + engines: {node: '>=4'} + + reflect-metadata@0.2.2: + resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + rolldown@1.2.6: + resolution: {integrity: sha512-vMM4q3aixf46GiF1Kok8jDPFsEpXgFWGjUHXNkNHNm+Y2adXAG2dbX91jkti3i0ZRsOlcmbuzAz1poObSHCmUA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + + scroll-into-view-if-needed@3.1.0: + resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} + + scule@1.3.0: + resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + + send@1.2.1: + resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} + engines: {node: '>= 18'} + + serve-static@2.2.1: + resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} + engines: {node: '>= 18'} + + set-cookie-parser@2.7.2: + resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + 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.1: + resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} + engines: {node: '>= 0.4'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + standard-as-callback@2.1.0: + resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + std-env@4.2.0: + resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==} + + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + + string-convert@0.2.1: + resolution: {integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-literal@4.0.0: + resolution: {integrity: sha512-PaqAvfUZKBwc/SLmNZtHmzK+v19Z4O4eS3cKPeGvbIv/U3pnyEq4Tuw3/4v/FwfM8VQaEawsyCcOQ0P+kpwWWw==} + + strtok3@10.3.5: + resolution: {integrity: sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==} + engines: {node: '>=18'} + + stylis@4.4.0: + resolution: {integrity: sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==} + + superlock@1.3.5: + resolution: {integrity: sha512-XpWNthvezZnWp0u7/UL8rBbBOnq2Qx39fw+0RNMC/+eotOd81glzsmIWVH0ejarhTeDQihxOKSbjm2XXFo5a8w==} + engines: {node: '>= 14'} + + swagger-ui-dist@5.32.14: + resolution: {integrity: sha512-nOA2pSQhcmODMUQZpJHYKNuwniDUqcOWGNaSCOoZv12FdOSJ9JxV95HtyRGNMqEBj6h6lCNTy20TgZDYTSuUIg==} + + tasuku@2.3.0: + resolution: {integrity: sha512-9Jtk+XAnttslCw4i9RceSZGr2PT5TLn0vUyWnoP2SdlSYzkiYRY6kB5qnPi5IQ/Em8e4oBow1rpaA39iijTIrA==} + + throttle-debounce@5.0.2: + resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==} + engines: {node: '>=12.22'} + + tiny-open@1.3.0: + resolution: {integrity: sha512-GUFS8yjJZq0oWqCKCJVHcBgMpmi2WEGXY1le3E5ncR0DsgTII5uUyxtfk8/vGyDDGBE42UYHR6Ocvlk8mkXSRg==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@1.3.0: + resolution: {integrity: sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==} + engines: {node: '>=18'} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + tinyrainbow@3.1.1: + resolution: {integrity: sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==} + engines: {node: '>=14.0.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + token-types@6.1.2: + resolution: {integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==} + engines: {node: '>=14.16'} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsx@4.23.13: + resolution: {integrity: sha512-BL5MGkRln6aDYhb0xbQlEAGw743BaZYWdbWtdJOBriYJboKgUUYCadFp2/FpBBZquBC/ezNBn7wMMPx7FDZUDw==} + engines: {node: '>=18.0.0'} + hasBin: true + + turbo@2.10.12: + resolution: {integrity: sha512-AswgMPnpOoaVZHrrSBejETzEbuIA69OVGwfkHwfrY0A23VjWXBANzgq9+OymWOHAIArB7D1+1z498WY8fGg1Jw==} + hasBin: true + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + type-is@2.1.0: + resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} + engines: {node: '>= 18'} + + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + + typescript@7.0.2: + resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==} + engines: {node: '>=16.20.0'} + hasBin: true + + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + + uhyphen@0.2.0: + resolution: {integrity: sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA==} + + uid@2.0.2: + resolution: {integrity: sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==} + engines: {node: '>=8'} + + uint8array-extras@1.5.0: + resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} + engines: {node: '>=18'} + + undici-types@8.3.0: + resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} + + unimport@6.4.0: + resolution: {integrity: sha512-JJOOuNMFq8b4ZPBKwQUxEcba4MplskDzYI1Lvrf8rJfWphZTWvPNXWa493qsPngHUmub89w6C7j+SeLWTE/UIQ==} + engines: {node: '>=18.12.0'} + peerDependencies: + oxc-parser: '*' + rolldown: ^1.0.0 + peerDependenciesMeta: + oxc-parser: + optional: true + rolldown: + optional: true + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + unplugin-utils@0.3.2: + resolution: {integrity: sha512-xVToRh2CTmLk2HnEG7ac4rl1MJTT3RFkpS8B++/SnB0kXvuaavD+n3m/vrzyWQOdJNSZQACnbz01pnppbwV5BA==} + engines: {node: '>=20.19.0'} + + unplugin@3.3.0: + resolution: {integrity: sha512-qa66K+crbfyE6JK10GjvbJeRrOsuC/JpbnHctfyp/i4oBTxWOzJfRZyDiOk1PtErMFRu8JhsU/wPvOdBNWe5Rg==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + '@farmfe/core': '*' + '@rspack/core': '*' + bun-types-no-globals: '*' + esbuild: '*' + rolldown: '*' + rollup: '*' + unloader: '*' + vite: '*' + webpack: '*' + peerDependenciesMeta: + '@farmfe/core': + optional: true + '@rspack/core': + optional: true + bun-types-no-globals: + optional: true + esbuild: + optional: true + rolldown: + optional: true + rollup: + optional: true + unloader: + optional: true + vite: + optional: true + webpack: + optional: true + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vite@8.2.2: + resolution: {integrity: sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.4.0 || ^0.5.0 + esbuild: ^0.27.0 || ^0.28.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 + '@vitejs/devtools': + 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 + + vitest@4.1.11: + resolution: {integrity: sha512-fhACrNXUidIbGSBr5FlbuBkO7VWC1ZyLl0DO4CU2DrQoAPxX84Ysxs+HeGQpii5lZWV1Q4gBZTTu49mF+A6Edw==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.1.11 + '@vitest/browser-preview': 4.1.11 + '@vitest/browser-webdriverio': 4.1.11 + '@vitest/coverage-istanbul': 4.1.11 + '@vitest/coverage-v8': 4.1.11 + '@vitest/ui': 4.1.11 + happy-dom: '*' + jsdom: '*' + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@opentelemetry/api': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + wxt@0.21.4: + resolution: {integrity: sha512-iyVMTXb37BQAbsPHCuPzrK3ZxnO9pZmvbKl7VJWIHe3RG40On2NyP2FOjArtOITO96plEYnh3o+iUlRp9qE90w==} + engines: {bun: '>=1.2.0', node: '>=22'} + hasBin: true + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=5.4' + vite: ^6.3.4 || ^7.0.0 || ^8.0.0-0 + web-ext: '>=9.2.0' + peerDependenciesMeta: + eslint: + optional: true + typescript: + optional: true + web-ext: + 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.3: + resolution: {integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==} + engines: {node: '>=12'} + + zod@4.5.4: + resolution: {integrity: sha512-sC95tT5iHHH9gtpj6A81kh+NEaRAUFN+qlUPDUbRfOMvNf5QCBqsb3WgvnpVtK5Y+4UfA6KqufotuTvMGiTlsA==} snapshots: - '@1natsu/wait-element@4.2.0': - dependencies: - defu: 6.1.7 - many-keys-map: 3.0.3 - '@aklinker1/rollup-plugin-visualizer@5.12.0': - dependencies: - open: 8.4.2 - picomatch: 2.3.2 - source-map: 0.7.6 - yargs: 17.7.3 + '@1natsu/wait-element@4.2.0': + dependencies: + defu: 6.1.7 + many-keys-map: 3.0.3 - '@aklinker1/zero-zip@1.0.1': {} + '@aklinker1/rollup-plugin-visualizer@5.12.0': + dependencies: + open: 8.4.2 + picomatch: 2.3.2 + source-map: 0.7.6 + yargs: 17.7.3 - '@ant-design/colors@8.0.1': - dependencies: - '@ant-design/fast-color': 3.0.1 + '@aklinker1/zero-zip@1.0.1': {} - '@ant-design/cssinjs-utils@2.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@ant-design/cssinjs': 2.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@babel/runtime': 7.29.7 - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@ant-design/colors@8.0.1': + dependencies: + '@ant-design/fast-color': 3.0.1 - '@ant-design/cssinjs@2.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@babel/runtime': 7.29.7 - '@emotion/hash': 0.8.0 - '@emotion/unitless': 0.7.5 - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - csstype: 3.2.3 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - stylis: 4.4.0 + '@ant-design/cssinjs-utils@2.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@ant-design/cssinjs': 2.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@babel/runtime': 7.29.7 + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) - '@ant-design/fast-color@3.0.1': {} + '@ant-design/cssinjs@2.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@babel/runtime': 7.29.7 + '@emotion/hash': 0.8.0 + '@emotion/unitless': 0.7.5 + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + csstype: 3.2.3 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + stylis: 4.4.0 - '@ant-design/icons-svg@4.6.0': {} + '@ant-design/fast-color@3.0.1': {} - '@ant-design/icons@6.3.4(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@ant-design/colors': 8.0.1 - '@ant-design/icons-svg': 4.6.0 - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@ant-design/icons-svg@4.6.0': {} - '@ant-design/react-slick@2.0.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@babel/runtime': 7.29.7 - clsx: 2.1.1 - json2mq: 0.2.0 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - throttle-debounce: 5.0.2 + '@ant-design/icons@6.3.4(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@ant-design/colors': 8.0.1 + '@ant-design/icons-svg': 4.6.0 + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) - '@babel/helper-string-parser@7.29.7': {} + '@ant-design/react-slick@2.0.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@babel/runtime': 7.29.7 + clsx: 2.1.1 + json2mq: 0.2.0 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + throttle-debounce: 5.0.2 - '@babel/helper-validator-identifier@7.29.7': {} + '@babel/helper-string-parser@7.29.7': {} - '@babel/parser@7.29.8': - dependencies: - '@babel/types': 7.29.8 + '@babel/helper-validator-identifier@7.29.7': {} - '@babel/runtime@7.29.7': {} + '@babel/parser@7.29.8': + dependencies: + '@babel/types': 7.29.8 - '@babel/runtime@8.0.0': {} + '@babel/runtime@7.29.7': {} - '@babel/types@7.29.8': - dependencies: - '@babel/helper-string-parser': 7.29.7 - '@babel/helper-validator-identifier': 7.29.7 + '@babel/runtime@8.0.0': {} - '@borewit/text-codec@0.2.2': {} + '@babel/types@7.29.8': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 - '@emotion/hash@0.8.0': {} + '@borewit/text-codec@0.2.2': {} - '@emotion/unitless@0.7.5': {} + '@emotion/hash@0.8.0': {} - '@esbuild/aix-ppc64@0.28.2': - optional: true + '@emotion/unitless@0.7.5': {} - '@esbuild/android-arm64@0.28.2': - optional: true + '@esbuild/aix-ppc64@0.28.2': + optional: true - '@esbuild/android-arm@0.28.2': - optional: true + '@esbuild/android-arm64@0.28.2': + optional: true - '@esbuild/android-x64@0.28.2': - optional: true + '@esbuild/android-arm@0.28.2': + optional: true - '@esbuild/darwin-arm64@0.28.2': - optional: true + '@esbuild/android-x64@0.28.2': + optional: true - '@esbuild/darwin-x64@0.28.2': - optional: true + '@esbuild/darwin-arm64@0.28.2': + optional: true - '@esbuild/freebsd-arm64@0.28.2': - optional: true + '@esbuild/darwin-x64@0.28.2': + optional: true - '@esbuild/freebsd-x64@0.28.2': - optional: true + '@esbuild/freebsd-arm64@0.28.2': + optional: true - '@esbuild/linux-arm64@0.28.2': - optional: true + '@esbuild/freebsd-x64@0.28.2': + optional: true - '@esbuild/linux-arm@0.28.2': - optional: true + '@esbuild/linux-arm64@0.28.2': + optional: true - '@esbuild/linux-ia32@0.28.2': - optional: true + '@esbuild/linux-arm@0.28.2': + optional: true - '@esbuild/linux-loong64@0.28.2': - optional: true + '@esbuild/linux-ia32@0.28.2': + optional: true - '@esbuild/linux-mips64el@0.28.2': - optional: true + '@esbuild/linux-loong64@0.28.2': + optional: true - '@esbuild/linux-ppc64@0.28.2': - optional: true + '@esbuild/linux-mips64el@0.28.2': + optional: true - '@esbuild/linux-riscv64@0.28.2': - optional: true + '@esbuild/linux-ppc64@0.28.2': + optional: true - '@esbuild/linux-s390x@0.28.2': - optional: true + '@esbuild/linux-riscv64@0.28.2': + optional: true - '@esbuild/linux-x64@0.28.2': - optional: true + '@esbuild/linux-s390x@0.28.2': + optional: true - '@esbuild/netbsd-arm64@0.28.2': - optional: true + '@esbuild/linux-x64@0.28.2': + optional: true - '@esbuild/netbsd-x64@0.28.2': - optional: true + '@esbuild/netbsd-arm64@0.28.2': + optional: true - '@esbuild/openbsd-arm64@0.28.2': - optional: true + '@esbuild/netbsd-x64@0.28.2': + optional: true - '@esbuild/openbsd-x64@0.28.2': - optional: true + '@esbuild/openbsd-arm64@0.28.2': + optional: true - '@esbuild/openharmony-arm64@0.28.2': - optional: true + '@esbuild/openbsd-x64@0.28.2': + optional: true - '@esbuild/sunos-x64@0.28.2': - optional: true + '@esbuild/openharmony-arm64@0.28.2': + optional: true - '@esbuild/win32-arm64@0.28.2': - optional: true + '@esbuild/sunos-x64@0.28.2': + optional: true - '@esbuild/win32-ia32@0.28.2': - optional: true + '@esbuild/win32-arm64@0.28.2': + optional: true - '@esbuild/win32-x64@0.28.2': - optional: true + '@esbuild/win32-ia32@0.28.2': + optional: true - '@ioredis/commands@2.0.0': {} + '@esbuild/win32-x64@0.28.2': + optional: true - '@jridgewell/gen-mapping@0.3.13': - dependencies: - '@jridgewell/sourcemap-codec': 1.6.0 - '@jridgewell/trace-mapping': 0.3.31 + '@ioredis/commands@2.0.0': {} - '@jridgewell/remapping@2.3.5': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 + '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/resolve-uri@3.1.2': {} + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/sourcemap-codec@1.6.0': {} + '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/trace-mapping@0.3.31': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.6.0 - - '@lukeed/csprng@1.1.0': {} - - '@microsoft/tsdoc@0.16.0': {} - - '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4': - optional: true - - '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.4': - optional: true - - '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.4': - optional: true - - '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.4': - optional: true - - '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.4': - optional: true - - '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4': - optional: true - - '@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2)': - dependencies: - '@standard-schema/spec': 1.1.0 - file-type: 22.0.2 - iterare: 1.2.1 - load-esm: 1.0.3 - reflect-metadata: 0.2.2 - rxjs: 7.8.2 - tslib: 2.8.1 - uid: 2.0.2 - transitivePeerDependencies: - - supports-color - - '@nestjs/config@12.0.0(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2))(rxjs@7.8.2)': - dependencies: - '@nestjs/common': 12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@standard-schema/spec': 1.1.0 - dotenv: 17.4.2 - dotenv-expand: 13.0.0 - es-toolkit: 1.51.0 - rxjs: 7.8.2 - - '@nestjs/core@12.0.1(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@12.0.1)(reflect-metadata@0.2.2)(rxjs@7.8.2)': - dependencies: - '@nestjs/common': 12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2) - fast-safe-stringify: 2.1.1 - iterare: 1.2.1 - path-to-regexp: 8.4.2 - reflect-metadata: 0.2.2 - rxjs: 7.8.2 - tslib: 2.8.1 - uid: 2.0.2 - optionalDependencies: - '@nestjs/platform-express': 12.0.1(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@12.0.1) - - '@nestjs/mapped-types@12.0.0(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2))(reflect-metadata@0.2.2)': - dependencies: - '@nestjs/common': 12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2) - reflect-metadata: 0.2.2 - - '@nestjs/platform-express@12.0.1(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@12.0.1)': - dependencies: - '@nestjs/common': 12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/core': 12.0.1(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@12.0.1)(reflect-metadata@0.2.2)(rxjs@7.8.2) - cors: 2.8.6 - express: 5.2.1 - multer: 2.2.0 - path-to-regexp: 8.4.2 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - - '@nestjs/swagger@12.0.1(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@12.0.1)(reflect-metadata@0.2.2)': - dependencies: - '@microsoft/tsdoc': 0.16.0 - '@nestjs/common': 12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/core': 12.0.1(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@12.0.1)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/mapped-types': 12.0.0(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2))(reflect-metadata@0.2.2) - '@standard-schema/spec': 1.1.0 - es-toolkit: 1.51.0 - js-yaml: 5.4.1 - path-to-regexp: 8.4.2 - reflect-metadata: 0.2.2 - swagger-ui-dist: 5.32.14 - - '@oxc-project/types@0.147.0': {} - - '@rc-component/async-validator@6.0.0': - dependencies: - '@babel/runtime': 7.29.7 - - '@rc-component/cascader@1.22.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@rc-component/select': 1.10.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/tree': 1.4.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/checkbox@2.0.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/collapse@1.2.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@babel/runtime': 7.29.7 - '@rc-component/motion': 1.3.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/color-picker@3.1.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@ant-design/fast-color': 3.0.1 - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/context@2.0.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/dialog@1.10.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@rc-component/motion': 1.3.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/portal': 2.2.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/drawer@1.4.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@rc-component/motion': 1.3.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/portal': 2.2.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/dropdown@1.0.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@rc-component/trigger': 3.10.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/form@1.8.6(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@rc-component/async-validator': 6.0.0 - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/image@1.10.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@rc-component/motion': 1.3.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/portal': 2.2.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/input-number@1.6.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@rc-component/mini-decimal': 1.1.4 - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/input@1.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@rc-component/resize-observer': 1.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/listy@1.2.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@rc-component/motion': 1.3.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/portal': 2.2.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/resize-observer': 1.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/virtual-list': 1.5.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/mentions@1.12.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@rc-component/input': 1.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/menu': 1.5.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/trigger': 3.10.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/menu@1.5.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@rc-component/motion': 1.3.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/overflow': 1.0.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/trigger': 3.10.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/mini-decimal@1.1.4': - dependencies: - '@babel/runtime': 7.29.7 - - '@rc-component/motion@1.3.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/mutate-observer@2.0.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/notification@2.0.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@rc-component/motion': 1.3.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/overflow@1.0.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@babel/runtime': 7.29.7 - '@rc-component/resize-observer': 1.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/pagination@1.4.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/picker@1.12.0(dayjs@1.11.23)(luxon@3.7.2)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@rc-component/overflow': 1.0.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/resize-observer': 1.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/trigger': 3.10.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - optionalDependencies: - dayjs: 1.11.23 - luxon: 3.7.2 - - '@rc-component/portal@2.2.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/progress@1.0.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/qrcode@2.0.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@babel/runtime': 7.29.7 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/rate@1.0.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/resize-observer@1.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/segmented@1.3.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@babel/runtime': 7.29.7 - '@rc-component/motion': 1.3.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/select@1.10.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@rc-component/overflow': 1.0.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/trigger': 3.10.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/virtual-list': 1.5.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/slider@1.1.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/steps@1.2.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/switch@1.0.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/table@1.11.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@rc-component/context': 2.0.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/resize-observer': 1.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/virtual-list': 1.5.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/tabs@1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@rc-component/dropdown': 1.0.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/menu': 1.5.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/motion': 1.3.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/resize-observer': 1.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/tooltip@1.5.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@rc-component/trigger': 3.10.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/tour@2.4.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@rc-component/portal': 2.2.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/trigger': 3.10.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/tree-select@1.16.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@rc-component/select': 1.10.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/tree': 1.4.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/tree@1.4.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@rc-component/motion': 1.3.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/virtual-list': 1.5.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/trigger@3.10.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@rc-component/motion': 1.3.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/portal': 2.2.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/resize-observer': 1.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/upload@1.1.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rc-component/util@1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - is-mobile: 5.0.0 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - react-is: 19.2.8 - - '@rc-component/virtual-list@1.5.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@babel/runtime': 8.0.0 - '@rc-component/resize-observer': 1.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@rolldown/binding-android-arm-eabi@1.2.6': - optional: true - - '@rolldown/binding-android-arm64@1.2.6': - optional: true - - '@rolldown/binding-darwin-arm64@1.2.6': - optional: true - - '@rolldown/binding-darwin-x64@1.2.6': - optional: true - - '@rolldown/binding-freebsd-x64@1.2.6': - optional: true - - '@rolldown/binding-linux-arm-gnueabihf@1.2.6': - optional: true - - '@rolldown/binding-linux-arm64-gnu@1.2.6': - optional: true - - '@rolldown/binding-linux-arm64-musl@1.2.6': - optional: true - - '@rolldown/binding-linux-ppc64-gnu@1.2.6': - optional: true - - '@rolldown/binding-linux-s390x-gnu@1.2.6': - optional: true - - '@rolldown/binding-linux-x64-gnu@1.2.6': - optional: true - - '@rolldown/binding-linux-x64-musl@1.2.6': - optional: true + '@jridgewell/sourcemap-codec@1.6.0': {} - '@rolldown/binding-openharmony-arm64@1.2.6': - optional: true + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.6.0 + + '@lukeed/csprng@1.1.0': {} + + '@microsoft/tsdoc@0.16.0': {} + + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4': + optional: true + + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.4': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.4': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.4': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.4': + optional: true + + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4': + optional: true + + '@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2)': + dependencies: + '@standard-schema/spec': 1.1.0 + file-type: 22.0.2 + iterare: 1.2.1 + load-esm: 1.0.3 + reflect-metadata: 0.2.2 + rxjs: 7.8.2 + tslib: 2.8.1 + uid: 2.0.2 + transitivePeerDependencies: + - supports-color + + '@nestjs/config@12.0.0(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2))(rxjs@7.8.2)': + dependencies: + '@nestjs/common': 12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@standard-schema/spec': 1.1.0 + dotenv: 17.4.2 + dotenv-expand: 13.0.0 + es-toolkit: 1.51.0 + rxjs: 7.8.2 + + '@nestjs/core@12.0.1(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@12.0.1)(reflect-metadata@0.2.2)(rxjs@7.8.2)': + dependencies: + '@nestjs/common': 12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2) + fast-safe-stringify: 2.1.1 + iterare: 1.2.1 + path-to-regexp: 8.4.2 + reflect-metadata: 0.2.2 + rxjs: 7.8.2 + tslib: 2.8.1 + uid: 2.0.2 + optionalDependencies: + '@nestjs/platform-express': 12.0.1(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@12.0.1) + + '@nestjs/mapped-types@12.0.0(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2))(reflect-metadata@0.2.2)': + dependencies: + '@nestjs/common': 12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2) + reflect-metadata: 0.2.2 + + '@nestjs/platform-express@12.0.1(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@12.0.1)': + dependencies: + '@nestjs/common': 12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 12.0.1(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@12.0.1)(reflect-metadata@0.2.2)(rxjs@7.8.2) + cors: 2.8.6 + express: 5.2.1 + multer: 2.2.0 + path-to-regexp: 8.4.2 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@nestjs/swagger@12.0.1(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@12.0.1)(reflect-metadata@0.2.2)': + dependencies: + '@microsoft/tsdoc': 0.16.0 + '@nestjs/common': 12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 12.0.1(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@12.0.1)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/mapped-types': 12.0.0(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2))(reflect-metadata@0.2.2) + '@standard-schema/spec': 1.1.0 + es-toolkit: 1.51.0 + js-yaml: 5.4.1 + path-to-regexp: 8.4.2 + reflect-metadata: 0.2.2 + swagger-ui-dist: 5.32.14 + + '@nestjs/testing@12.0.1(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@12.0.1)(@nestjs/platform-express@12.0.1)': + dependencies: + '@nestjs/common': 12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 12.0.1(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@12.0.1)(reflect-metadata@0.2.2)(rxjs@7.8.2) + tslib: 2.8.1 + optionalDependencies: + '@nestjs/platform-express': 12.0.1(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@12.0.1) + + '@oxc-project/types@0.147.0': {} + + '@rc-component/async-validator@6.0.0': + dependencies: + '@babel/runtime': 7.29.7 + + '@rc-component/cascader@1.22.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@rc-component/select': 1.10.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/tree': 1.4.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/checkbox@2.0.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/collapse@1.2.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@babel/runtime': 7.29.7 + '@rc-component/motion': 1.3.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/color-picker@3.1.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@ant-design/fast-color': 3.0.1 + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/context@2.0.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/dialog@1.10.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@rc-component/motion': 1.3.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/portal': 2.2.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/drawer@1.4.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@rc-component/motion': 1.3.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/portal': 2.2.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/dropdown@1.0.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@rc-component/trigger': 3.10.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/form@1.8.6(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@rc-component/async-validator': 6.0.0 + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/image@1.10.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@rc-component/motion': 1.3.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/portal': 2.2.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/input-number@1.6.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@rc-component/mini-decimal': 1.1.4 + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/input@1.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@rc-component/resize-observer': 1.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/listy@1.2.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@rc-component/motion': 1.3.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/portal': 2.2.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/resize-observer': 1.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/virtual-list': 1.5.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/mentions@1.12.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@rc-component/input': 1.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/menu': 1.5.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/trigger': 3.10.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/menu@1.5.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@rc-component/motion': 1.3.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/overflow': 1.0.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/trigger': 3.10.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/mini-decimal@1.1.4': + dependencies: + '@babel/runtime': 7.29.7 + + '@rc-component/motion@1.3.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/mutate-observer@2.0.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/notification@2.0.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@rc-component/motion': 1.3.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/overflow@1.0.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@babel/runtime': 7.29.7 + '@rc-component/resize-observer': 1.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/pagination@1.4.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/picker@1.12.0(dayjs@1.11.23)(luxon@3.7.2)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@rc-component/overflow': 1.0.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/resize-observer': 1.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/trigger': 3.10.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + optionalDependencies: + dayjs: 1.11.23 + luxon: 3.7.2 + + '@rc-component/portal@2.2.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/progress@1.0.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/qrcode@2.0.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@babel/runtime': 7.29.7 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/rate@1.0.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/resize-observer@1.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/segmented@1.3.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@babel/runtime': 7.29.7 + '@rc-component/motion': 1.3.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/select@1.10.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@rc-component/overflow': 1.0.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/trigger': 3.10.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/virtual-list': 1.5.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/slider@1.1.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/steps@1.2.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/switch@1.0.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/table@1.11.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@rc-component/context': 2.0.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/resize-observer': 1.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/virtual-list': 1.5.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/tabs@1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@rc-component/dropdown': 1.0.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/menu': 1.5.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/motion': 1.3.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/resize-observer': 1.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/tooltip@1.5.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@rc-component/trigger': 3.10.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/tour@2.4.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@rc-component/portal': 2.2.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/trigger': 3.10.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/tree-select@1.16.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@rc-component/select': 1.10.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/tree': 1.4.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/tree@1.4.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@rc-component/motion': 1.3.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/virtual-list': 1.5.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/trigger@3.10.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@rc-component/motion': 1.3.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/portal': 2.2.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/resize-observer': 1.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/upload@1.1.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rc-component/util@1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + is-mobile: 5.0.0 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + react-is: 19.2.8 + + '@rc-component/virtual-list@1.5.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@babel/runtime': 8.0.0 + '@rc-component/resize-observer': 1.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@rolldown/binding-android-arm-eabi@1.2.6': + optional: true + + '@rolldown/binding-android-arm64@1.2.6': + optional: true + + '@rolldown/binding-darwin-arm64@1.2.6': + optional: true + + '@rolldown/binding-darwin-x64@1.2.6': + optional: true + + '@rolldown/binding-freebsd-x64@1.2.6': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.2.6': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.2.6': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.2.6': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.2.6': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.2.6': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.2.6': + optional: true + + '@rolldown/binding-linux-x64-musl@1.2.6': + optional: true - '@rolldown/binding-win32-arm64-msvc@1.2.6': - optional: true + '@rolldown/binding-openharmony-arm64@1.2.6': + optional: true - '@rolldown/binding-win32-x64-msvc@1.2.6': - optional: true + '@rolldown/binding-win32-arm64-msvc@1.2.6': + optional: true - '@rolldown/pluginutils@1.0.1': {} + '@rolldown/binding-win32-x64-msvc@1.2.6': + optional: true - '@scarf/scarf@1.4.0': {} + '@rolldown/pluginutils@1.0.1': {} - '@standard-schema/spec@1.1.0': {} + '@scarf/scarf@1.4.0': {} - '@tokenizer/inflate@0.4.1': - dependencies: - debug: 4.4.3 - token-types: 6.1.2 - transitivePeerDependencies: - - supports-color + '@standard-schema/spec@1.1.0': {} - '@tokenizer/token@0.3.0': {} + '@tokenizer/inflate@0.4.1': + dependencies: + debug: 4.4.3 + token-types: 6.1.2 + transitivePeerDependencies: + - supports-color - '@topcli/prompts@4.0.0': {} + '@tokenizer/token@0.3.0': {} - '@turbo/darwin-64@2.10.12': - optional: true + '@topcli/prompts@4.0.0': {} - '@turbo/darwin-arm64@2.10.12': - optional: true + '@turbo/darwin-64@2.10.12': + optional: true - '@turbo/linux-64@2.10.12': - optional: true + '@turbo/darwin-arm64@2.10.12': + optional: true - '@turbo/linux-arm64@2.10.12': - optional: true + '@turbo/linux-64@2.10.12': + optional: true - '@turbo/windows-64@2.10.12': - optional: true + '@turbo/linux-arm64@2.10.12': + optional: true - '@turbo/windows-arm64@2.10.12': - optional: true + '@turbo/windows-64@2.10.12': + optional: true - '@types/body-parser@1.19.6': - dependencies: - '@types/connect': 3.4.38 - '@types/node': 26.3.0 + '@turbo/windows-arm64@2.10.12': + optional: true - '@types/connect@3.4.38': - dependencies: - '@types/node': 26.3.0 + '@types/body-parser@1.19.6': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 26.3.0 - '@types/estree@1.0.9': {} + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 - '@types/express-serve-static-core@5.1.3': - dependencies: - '@types/node': 26.3.0 - '@types/qs': 6.15.1 - '@types/range-parser': 1.2.7 - '@types/send': 1.2.1 + '@types/connect@3.4.38': + dependencies: + '@types/node': 26.3.0 - '@types/express@5.0.6': - dependencies: - '@types/body-parser': 1.19.6 - '@types/express-serve-static-core': 5.1.3 - '@types/serve-static': 2.2.0 + '@types/deep-eql@4.0.2': {} - '@types/filesystem@0.0.36': - dependencies: - '@types/filewriter': 0.0.33 + '@types/estree@1.0.9': {} - '@types/filewriter@0.0.33': {} + '@types/express-serve-static-core@5.1.3': + dependencies: + '@types/node': 26.3.0 + '@types/qs': 6.15.1 + '@types/range-parser': 1.2.7 + '@types/send': 1.2.1 - '@types/har-format@1.2.16': {} + '@types/express@5.0.6': + dependencies: + '@types/body-parser': 1.19.6 + '@types/express-serve-static-core': 5.1.3 + '@types/serve-static': 2.2.0 - '@types/http-errors@2.0.5': {} + '@types/filesystem@0.0.36': + dependencies: + '@types/filewriter': 0.0.33 - '@types/node@26.3.0': - dependencies: - undici-types: 8.3.0 + '@types/filewriter@0.0.33': {} - '@types/pg@8.23.1': - dependencies: - '@types/node': 26.3.0 - pg-protocol: 1.16.0 - pg-types: 2.2.0 + '@types/har-format@1.2.16': {} - '@types/qs@6.15.1': {} + '@types/http-errors@2.0.5': {} - '@types/range-parser@1.2.7': {} + '@types/node@26.3.0': + dependencies: + undici-types: 8.3.0 - '@types/react-dom@19.2.5(@types/react@19.2.18)': - dependencies: - '@types/react': 19.2.18 + '@types/pg@8.23.1': + dependencies: + '@types/node': 26.3.0 + pg-protocol: 1.16.0 + pg-types: 2.2.0 - '@types/react@19.2.18': - dependencies: - csstype: 3.2.3 + '@types/qs@6.15.1': {} - '@types/send@1.2.1': - dependencies: - '@types/node': 26.3.0 + '@types/range-parser@1.2.7': {} - '@types/serve-static@2.2.0': - dependencies: - '@types/http-errors': 2.0.5 - '@types/node': 26.3.0 + '@types/react-dom@19.2.5(@types/react@19.2.18)': + dependencies: + '@types/react': 19.2.18 - '@typescript/typescript-aix-ppc64@7.0.2': - optional: true + '@types/react@19.2.18': + dependencies: + csstype: 3.2.3 - '@typescript/typescript-darwin-arm64@7.0.2': - optional: true + '@types/send@1.2.1': + dependencies: + '@types/node': 26.3.0 - '@typescript/typescript-darwin-x64@7.0.2': - optional: true + '@types/serve-static@2.2.0': + dependencies: + '@types/http-errors': 2.0.5 + '@types/node': 26.3.0 - '@typescript/typescript-freebsd-arm64@7.0.2': - optional: true + '@typescript/typescript-aix-ppc64@7.0.2': + optional: true - '@typescript/typescript-freebsd-x64@7.0.2': - optional: true + '@typescript/typescript-darwin-arm64@7.0.2': + optional: true - '@typescript/typescript-linux-arm64@7.0.2': - optional: true + '@typescript/typescript-darwin-x64@7.0.2': + optional: true - '@typescript/typescript-linux-arm@7.0.2': - optional: true + '@typescript/typescript-freebsd-arm64@7.0.2': + optional: true - '@typescript/typescript-linux-loong64@7.0.2': - optional: true + '@typescript/typescript-freebsd-x64@7.0.2': + optional: true - '@typescript/typescript-linux-mips64el@7.0.2': - optional: true + '@typescript/typescript-linux-arm64@7.0.2': + optional: true - '@typescript/typescript-linux-ppc64@7.0.2': - optional: true + '@typescript/typescript-linux-arm@7.0.2': + optional: true - '@typescript/typescript-linux-riscv64@7.0.2': - optional: true + '@typescript/typescript-linux-loong64@7.0.2': + optional: true - '@typescript/typescript-linux-s390x@7.0.2': - optional: true - - '@typescript/typescript-linux-x64@7.0.2': - optional: true - - '@typescript/typescript-netbsd-arm64@7.0.2': - optional: true - - '@typescript/typescript-netbsd-x64@7.0.2': - optional: true - - '@typescript/typescript-openbsd-arm64@7.0.2': - optional: true - - '@typescript/typescript-openbsd-x64@7.0.2': - optional: true - - '@typescript/typescript-sunos-x64@7.0.2': - optional: true - - '@typescript/typescript-win32-arm64@7.0.2': - optional: true - - '@typescript/typescript-win32-x64@7.0.2': - optional: true - - '@vitejs/plugin-react@6.1.1(vite@8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13))': - dependencies: - '@rolldown/pluginutils': 1.0.1 - vite: 8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13) - - '@webext-core/fake-browser@2.0.1': - dependencies: - '@wxt-dev/browser': 0.2.7 - lodash.merge: 4.6.2 - - '@webext-core/isolated-element@3.0.0': - dependencies: - is-potential-custom-element-name: 1.0.1 - - '@webext-core/match-patterns@2.0.0': {} - - '@wxt-dev/browser@0.2.7': - dependencies: - '@types/filesystem': 0.0.36 - '@types/har-format': 1.2.16 - - '@wxt-dev/module-react@1.2.2(vite@8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13))(wxt@0.21.4(esbuild@0.28.2)(rolldown@1.2.6)(typescript@7.0.2)(vite@8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)))': - dependencies: - '@vitejs/plugin-react': 6.1.1(vite@8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)) - vite: 8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13) - wxt: 0.21.4(esbuild@0.28.2)(rolldown@1.2.6)(typescript@7.0.2)(vite@8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)) - transitivePeerDependencies: - - '@rolldown/plugin-babel' - - babel-plugin-react-compiler - - oxc-transform-react - - '@wxt-dev/storage@1.2.9': - dependencies: - '@wxt-dev/browser': 0.2.7 - superlock: 1.3.5 - - accepts@2.0.0: - dependencies: - mime-types: 3.0.2 - negotiator: 1.1.0 - - acorn@8.18.0: {} - - agent-base@6.0.2: - dependencies: - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - antd@6.6.2(luxon@3.7.2)(react-dom@19.2.8(react@19.2.8))(react@19.2.8): - dependencies: - '@ant-design/colors': 8.0.1 - '@ant-design/cssinjs': 2.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@ant-design/cssinjs-utils': 2.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@ant-design/fast-color': 3.0.1 - '@ant-design/icons': 6.3.4(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@ant-design/react-slick': 2.0.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@babel/runtime': 7.29.7 - '@rc-component/cascader': 1.22.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/checkbox': 2.0.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/collapse': 1.2.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/color-picker': 3.1.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/dialog': 1.10.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/drawer': 1.4.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/dropdown': 1.0.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/form': 1.8.6(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/image': 1.10.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/input': 1.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/input-number': 1.6.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/listy': 1.2.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/mentions': 1.12.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/menu': 1.5.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/motion': 1.3.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/mutate-observer': 2.0.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/notification': 2.0.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/pagination': 1.4.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/picker': 1.12.0(dayjs@1.11.23)(luxon@3.7.2)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/progress': 1.0.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/qrcode': 2.0.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/rate': 1.0.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/resize-observer': 1.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/segmented': 1.3.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/select': 1.10.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/slider': 1.1.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/steps': 1.2.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/switch': 1.0.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/table': 1.11.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/tabs': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/tooltip': 1.5.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/tour': 2.4.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/tree': 1.4.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/tree-select': 1.16.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/trigger': 3.10.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/upload': 1.1.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - clsx: 2.1.1 - dayjs: 1.11.23 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - scroll-into-view-if-needed: 3.1.0 - throttle-debounce: 5.0.2 - transitivePeerDependencies: - - date-fns - - luxon - - moment - - append-field@1.0.0: {} - - argparse@2.0.1: {} - - asynckit@0.4.0: {} - - axios@1.20.0(debug@4.4.3): - dependencies: - follow-redirects: 1.16.0(debug@4.4.3) - form-data: 4.0.6 - https-proxy-agent: 5.0.1 - proxy-from-env: 2.1.0 - transitivePeerDependencies: - - debug - - supports-color - - body-parser@2.3.0: - dependencies: - bytes: 3.1.2 - content-type: 2.1.0 - debug: 4.4.3 - http-errors: 2.0.1 - iconv-lite: 0.7.3 - on-finished: 2.4.1 - qs: 6.16.0 - raw-body: 3.0.2 - type-is: 2.1.0 - transitivePeerDependencies: - - supports-color - - boolbase@2.0.0: {} - - buffer-from@1.1.2: {} - - bullmq@6.3.4(ioredis@6.0.0)(pg@8.23.0): - dependencies: - cron-parser: 5.10.0 - msgpackr: 2.1.0 - node-abort-controller: 3.1.1 - semver: 7.8.5 - tslib: 2.8.1 - optionalDependencies: - ioredis: 6.0.0 - pg: 8.23.0 - - busboy@1.6.0: - dependencies: - streamsearch: 1.1.0 - - bytes@3.1.2: {} - - c12@3.3.4(magicast@0.5.4): - dependencies: - chokidar: 5.0.0 - confbox: 0.2.4 - defu: 6.1.7 - dotenv: 17.4.2 - exsolve: 1.1.1 - giget: 3.3.1 - jiti: 2.7.0 - ohash: 2.0.12 - pathe: 2.0.3 - perfect-debounce: 2.1.0 - pkg-types: 2.3.1 - rc9: 3.0.1 - optionalDependencies: - magicast: 0.5.4 - - cac@7.0.0: {} - - call-bind-apply-helpers@1.0.2: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - - call-bound@1.0.4: - dependencies: - call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 - - chokidar@5.0.0: - dependencies: - readdirp: 5.1.1 + '@typescript/typescript-linux-mips64el@7.0.2': + optional: true - citty@0.2.2: {} + '@typescript/typescript-linux-ppc64@7.0.2': + optional: true - cliui@8.0.1: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 + '@typescript/typescript-linux-riscv64@7.0.2': + optional: true - clsx@2.1.1: {} + '@typescript/typescript-linux-s390x@7.0.2': + optional: true - cluster-key-slot@1.1.1: {} + '@typescript/typescript-linux-x64@7.0.2': + optional: true - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 + '@typescript/typescript-netbsd-arm64@7.0.2': + optional: true - color-name@1.1.4: {} + '@typescript/typescript-netbsd-x64@7.0.2': + optional: true - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 + '@typescript/typescript-openbsd-arm64@7.0.2': + optional: true - compute-scroll-into-view@3.1.1: {} + '@typescript/typescript-openbsd-x64@7.0.2': + optional: true - concat-stream@2.0.0: - dependencies: - buffer-from: 1.1.2 - inherits: 2.0.4 - readable-stream: 3.6.2 - typedarray: 0.0.6 + '@typescript/typescript-sunos-x64@7.0.2': + optional: true - confbox@0.1.8: {} + '@typescript/typescript-win32-arm64@7.0.2': + optional: true - confbox@0.2.4: {} + '@typescript/typescript-win32-x64@7.0.2': + optional: true - consola@3.4.2: {} + '@vitejs/plugin-react@6.1.1(vite@8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13))': + dependencies: + '@rolldown/pluginutils': 1.0.1 + vite: 8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13) - content-disposition@1.1.0: {} + '@vitest/expect@4.1.11': + dependencies: + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.1.11 + '@vitest/utils': 4.1.11 + chai: 6.2.2 + tinyrainbow: 3.1.1 + + '@vitest/mocker@4.1.11(vite@8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13))': + dependencies: + '@vitest/spy': 4.1.11 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13) + + '@vitest/pretty-format@4.1.11': + dependencies: + tinyrainbow: 3.1.1 + + '@vitest/runner@4.1.11': + dependencies: + '@vitest/utils': 4.1.11 + pathe: 2.0.3 + + '@vitest/snapshot@4.1.11': + dependencies: + '@vitest/pretty-format': 4.1.11 + '@vitest/utils': 4.1.11 + magic-string: 0.30.21 + pathe: 2.0.3 + + '@vitest/spy@4.1.11': {} + + '@vitest/utils@4.1.11': + dependencies: + '@vitest/pretty-format': 4.1.11 + convert-source-map: 2.0.0 + tinyrainbow: 3.1.1 + + '@webext-core/fake-browser@2.0.1': + dependencies: + '@wxt-dev/browser': 0.2.7 + lodash.merge: 4.6.2 + + '@webext-core/isolated-element@3.0.0': + dependencies: + is-potential-custom-element-name: 1.0.1 + + '@webext-core/match-patterns@2.0.0': {} + + '@wxt-dev/browser@0.2.7': + dependencies: + '@types/filesystem': 0.0.36 + '@types/har-format': 1.2.16 + + '@wxt-dev/module-react@1.2.2(vite@8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13))(wxt@0.21.4(esbuild@0.28.2)(rolldown@1.2.6)(typescript@7.0.2)(vite@8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)))': + dependencies: + '@vitejs/plugin-react': 6.1.1(vite@8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)) + vite: 8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13) + wxt: 0.21.4(esbuild@0.28.2)(rolldown@1.2.6)(typescript@7.0.2)(vite@8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)) + transitivePeerDependencies: + - '@rolldown/plugin-babel' + - babel-plugin-react-compiler + - oxc-transform-react + + '@wxt-dev/storage@1.2.9': + dependencies: + '@wxt-dev/browser': 0.2.7 + superlock: 1.3.5 + + accepts@2.0.0: + dependencies: + mime-types: 3.0.2 + negotiator: 1.1.0 + + acorn@8.18.0: {} + + agent-base@6.0.2: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + antd@6.6.2(luxon@3.7.2)(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + dependencies: + '@ant-design/colors': 8.0.1 + '@ant-design/cssinjs': 2.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@ant-design/cssinjs-utils': 2.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@ant-design/fast-color': 3.0.1 + '@ant-design/icons': 6.3.4(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@ant-design/react-slick': 2.0.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@babel/runtime': 7.29.7 + '@rc-component/cascader': 1.22.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/checkbox': 2.0.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/collapse': 1.2.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/color-picker': 3.1.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/dialog': 1.10.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/drawer': 1.4.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/dropdown': 1.0.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/form': 1.8.6(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/image': 1.10.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/input': 1.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/input-number': 1.6.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/listy': 1.2.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/mentions': 1.12.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/menu': 1.5.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/motion': 1.3.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/mutate-observer': 2.0.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/notification': 2.0.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/pagination': 1.4.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/picker': 1.12.0(dayjs@1.11.23)(luxon@3.7.2)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/progress': 1.0.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/qrcode': 2.0.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/rate': 1.0.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/resize-observer': 1.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/segmented': 1.3.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/select': 1.10.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/slider': 1.1.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/steps': 1.2.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/switch': 1.0.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/table': 1.11.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/tabs': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/tooltip': 1.5.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/tour': 2.4.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/tree': 1.4.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/tree-select': 1.16.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/trigger': 3.10.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/upload': 1.1.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@rc-component/util': 1.13.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + clsx: 2.1.1 + dayjs: 1.11.23 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + scroll-into-view-if-needed: 3.1.0 + throttle-debounce: 5.0.2 + transitivePeerDependencies: + - date-fns + - luxon + - moment + + append-field@1.0.0: {} + + argparse@2.0.1: {} + + assertion-error@2.0.1: {} + + asynckit@0.4.0: {} + + axios@1.20.0(debug@4.4.3): + dependencies: + follow-redirects: 1.16.0(debug@4.4.3) + form-data: 4.0.6 + https-proxy-agent: 5.0.1 + proxy-from-env: 2.1.0 + transitivePeerDependencies: + - debug + - supports-color + + body-parser@2.3.0: + dependencies: + bytes: 3.1.2 + content-type: 2.1.0 + debug: 4.4.3 + http-errors: 2.0.1 + iconv-lite: 0.7.3 + on-finished: 2.4.1 + qs: 6.16.0 + raw-body: 3.0.2 + type-is: 2.1.0 + transitivePeerDependencies: + - supports-color + + boolbase@2.0.0: {} + + buffer-from@1.1.2: {} + + bullmq@6.3.4(ioredis@6.0.0)(pg@8.23.0): + dependencies: + cron-parser: 5.10.0 + msgpackr: 2.1.0 + node-abort-controller: 3.1.1 + semver: 7.8.5 + tslib: 2.8.1 + optionalDependencies: + ioredis: 6.0.0 + pg: 8.23.0 + + busboy@1.6.0: + dependencies: + streamsearch: 1.1.0 + + bytes@3.1.2: {} + + c12@3.3.4(magicast@0.5.4): + dependencies: + chokidar: 5.0.0 + confbox: 0.2.4 + defu: 6.1.7 + dotenv: 17.4.2 + exsolve: 1.1.1 + giget: 3.3.1 + jiti: 2.7.0 + ohash: 2.0.12 + pathe: 2.0.3 + perfect-debounce: 2.1.0 + pkg-types: 2.3.1 + rc9: 3.0.1 + optionalDependencies: + magicast: 0.5.4 + + cac@7.0.0: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 - content-type@1.0.5: {} + chai@6.2.2: {} - content-type@2.1.0: {} + chokidar@5.0.0: + dependencies: + readdirp: 5.1.1 - cookie-signature@1.2.2: {} + citty@0.2.2: {} - cookie@0.7.2: {} + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 - cookie@1.1.1: {} + clsx@2.1.1: {} - cors@2.8.6: - dependencies: - object-assign: 4.1.1 - vary: 1.1.2 + cluster-key-slot@1.1.1: {} - cron-parser@5.10.0: - dependencies: - luxon: 3.7.2 + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 - css-select@7.0.0: - dependencies: - boolbase: 2.0.0 - css-what: 8.0.0 - domhandler: 6.0.1 - domutils: 4.0.2 - nth-check: 3.0.1 + color-name@1.1.4: {} - css-what@8.0.0: {} + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 - cssom@0.5.0: {} + compute-scroll-into-view@3.1.1: {} - csstype@3.2.3: {} + concat-stream@2.0.0: + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + typedarray: 0.0.6 - dayjs@1.11.23: {} + confbox@0.1.8: {} - debug@4.4.3: - dependencies: - ms: 2.1.3 + confbox@0.2.4: {} - define-lazy-prop@2.0.0: {} + consola@3.4.2: {} - defu@6.1.7: {} + content-disposition@1.1.0: {} - delayed-stream@1.0.0: {} + content-type@1.0.5: {} - denque@2.1.0: {} + content-type@2.1.0: {} - depd@2.0.0: {} + convert-source-map@2.0.0: {} - destr@2.0.5: {} + cookie-signature@1.2.2: {} - detect-libc@2.1.2: {} + cookie@0.7.2: {} - dom-serializer@2.0.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - entities: 4.5.0 + cookie@1.1.1: {} - dom-serializer@3.1.1: - dependencies: - domelementtype: 3.0.0 - domhandler: 6.0.1 - entities: 8.0.0 + cors@2.8.6: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 - domelementtype@2.3.0: {} + cron-parser@5.10.0: + dependencies: + luxon: 3.7.2 - domelementtype@3.0.0: {} + css-select@7.0.0: + dependencies: + boolbase: 2.0.0 + css-what: 8.0.0 + domhandler: 6.0.1 + domutils: 4.0.2 + nth-check: 3.0.1 - domhandler@5.0.3: - dependencies: - domelementtype: 2.3.0 + css-what@8.0.0: {} - domhandler@6.0.1: - dependencies: - domelementtype: 3.0.0 + cssom@0.5.0: {} - domutils@3.2.2: - dependencies: - dom-serializer: 2.0.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 + csstype@3.2.3: {} - domutils@4.0.2: - dependencies: - dom-serializer: 3.1.1 - domelementtype: 3.0.0 - domhandler: 6.0.1 + dayjs@1.11.23: {} - dotenv-expand@13.0.0: - dependencies: - dotenv: 17.4.2 + debug@4.4.3: + dependencies: + ms: 2.1.3 - dotenv@17.4.2: {} + define-lazy-prop@2.0.0: {} - dunder-proto@1.0.1: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - - ee-first@1.1.1: {} - - emoji-regex@8.0.0: {} - - encodeurl@2.0.0: {} - - entities@4.5.0: {} - - entities@7.0.1: {} - - entities@8.0.0: {} - - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - - es-object-atoms@1.1.2: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.1.0: - dependencies: - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - has-tostringtag: 1.0.2 - hasown: 2.0.4 - - es-toolkit@1.51.0: {} - - esbuild@0.28.2: - optionalDependencies: - '@esbuild/aix-ppc64': 0.28.2 - '@esbuild/android-arm': 0.28.2 - '@esbuild/android-arm64': 0.28.2 - '@esbuild/android-x64': 0.28.2 - '@esbuild/darwin-arm64': 0.28.2 - '@esbuild/darwin-x64': 0.28.2 - '@esbuild/freebsd-arm64': 0.28.2 - '@esbuild/freebsd-x64': 0.28.2 - '@esbuild/linux-arm': 0.28.2 - '@esbuild/linux-arm64': 0.28.2 - '@esbuild/linux-ia32': 0.28.2 - '@esbuild/linux-loong64': 0.28.2 - '@esbuild/linux-mips64el': 0.28.2 - '@esbuild/linux-ppc64': 0.28.2 - '@esbuild/linux-riscv64': 0.28.2 - '@esbuild/linux-s390x': 0.28.2 - '@esbuild/linux-x64': 0.28.2 - '@esbuild/netbsd-arm64': 0.28.2 - '@esbuild/netbsd-x64': 0.28.2 - '@esbuild/openbsd-arm64': 0.28.2 - '@esbuild/openbsd-x64': 0.28.2 - '@esbuild/openharmony-arm64': 0.28.2 - '@esbuild/sunos-x64': 0.28.2 - '@esbuild/win32-arm64': 0.28.2 - '@esbuild/win32-ia32': 0.28.2 - '@esbuild/win32-x64': 0.28.2 - - escalade@3.2.0: {} - - escape-html@1.0.3: {} - - escape-string-regexp@5.0.0: {} - - estree-walker@3.0.3: - dependencies: - '@types/estree': 1.0.9 - - etag@1.8.1: {} - - express@5.2.1: - dependencies: - accepts: 2.0.0 - body-parser: 2.3.0 - content-disposition: 1.1.0 - content-type: 1.0.5 - cookie: 0.7.2 - cookie-signature: 1.2.2 - debug: 4.4.3 - depd: 2.0.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 2.1.1 - fresh: 2.0.0 - http-errors: 2.0.1 - merge-descriptors: 2.0.0 - mime-types: 3.0.2 - on-finished: 2.4.1 - once: 1.4.0 - parseurl: 1.3.3 - proxy-addr: 2.0.7 - qs: 6.16.0 - range-parser: 1.3.0 - router: 2.2.0 - send: 1.2.1 - serve-static: 2.2.1 - statuses: 2.0.2 - type-is: 2.1.0 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - - exsolve@1.1.1: {} - - fast-safe-stringify@2.1.1: {} - - fdir@6.5.0(picomatch@4.0.7): - optionalDependencies: - picomatch: 4.0.7 - - file-type@22.0.2: - dependencies: - '@tokenizer/inflate': 0.4.1 - strtok3: 10.3.5 - token-types: 6.1.2 - uint8array-extras: 1.5.0 - transitivePeerDependencies: - - supports-color - - filesize@11.0.22: {} - - finalhandler@2.1.1: - dependencies: - debug: 4.4.3 - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.2 - transitivePeerDependencies: - - supports-color - - follow-redirects@1.16.0(debug@4.4.3): - optionalDependencies: - debug: 4.4.3 - - form-data@4.0.6: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - hasown: 2.0.4 - mime-types: 2.1.35 - - forwarded@0.2.0: {} - - fresh@2.0.0: {} - - fsevents@2.3.3: - optional: true - - function-bind@1.1.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.2 - function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.4 - math-intrinsics: 1.1.0 - - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.2 - - giget@3.3.1: {} - - gopd@1.2.0: {} - - has-symbols@1.1.0: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.1.0 - - hasown@2.0.4: - dependencies: - function-bind: 1.1.2 + defu@6.1.7: {} - helmet@8.3.0: {} + delayed-stream@1.0.0: {} - hookable@6.1.1: {} + denque@2.1.0: {} - html-escaper@3.0.3: {} + depd@2.0.0: {} - htmlparser2@10.1.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.2.2 - entities: 7.0.1 + destr@2.0.5: {} - http-errors@2.0.1: - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.2 - toidentifier: 1.0.1 + detect-libc@2.1.2: {} - https-proxy-agent@5.0.1: - dependencies: - agent-base: 6.0.2 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 - iconv-lite@0.7.3: - dependencies: - safer-buffer: 2.1.2 + dom-serializer@3.1.1: + dependencies: + domelementtype: 3.0.0 + domhandler: 6.0.1 + entities: 8.0.0 - ieee754@1.2.1: {} + domelementtype@2.3.0: {} - inherits@2.0.4: {} + domelementtype@3.0.0: {} - ioredis@6.0.0: - dependencies: - '@ioredis/commands': 2.0.0 - cluster-key-slot: 1.1.1 - debug: 4.4.3 - denque: 2.1.0 - redis-errors: 1.2.0 - standard-as-callback: 2.1.0 - transitivePeerDependencies: - - supports-color + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 - ipaddr.js@1.9.1: {} + domhandler@6.0.1: + dependencies: + domelementtype: 3.0.0 - is-docker@2.2.1: {} + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 - is-fullwidth-code-point@3.0.0: {} + domutils@4.0.2: + dependencies: + dom-serializer: 3.1.1 + domelementtype: 3.0.0 + domhandler: 6.0.1 - is-mobile@5.0.0: {} + dotenv-expand@13.0.0: + dependencies: + dotenv: 17.4.2 - is-potential-custom-element-name@1.0.1: {} + dotenv@17.4.2: {} - is-promise@4.0.0: {} + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 - is-wsl@2.2.0: - dependencies: - is-docker: 2.2.1 + ee-first@1.1.1: {} + + emoji-regex@8.0.0: {} + + encodeurl@2.0.0: {} + + entities@4.5.0: {} + + entities@7.0.1: {} + + entities@8.0.0: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@2.3.2: {} + + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + + es-toolkit@1.51.0: {} + + esbuild@0.28.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.2 + '@esbuild/android-arm': 0.28.2 + '@esbuild/android-arm64': 0.28.2 + '@esbuild/android-x64': 0.28.2 + '@esbuild/darwin-arm64': 0.28.2 + '@esbuild/darwin-x64': 0.28.2 + '@esbuild/freebsd-arm64': 0.28.2 + '@esbuild/freebsd-x64': 0.28.2 + '@esbuild/linux-arm': 0.28.2 + '@esbuild/linux-arm64': 0.28.2 + '@esbuild/linux-ia32': 0.28.2 + '@esbuild/linux-loong64': 0.28.2 + '@esbuild/linux-mips64el': 0.28.2 + '@esbuild/linux-ppc64': 0.28.2 + '@esbuild/linux-riscv64': 0.28.2 + '@esbuild/linux-s390x': 0.28.2 + '@esbuild/linux-x64': 0.28.2 + '@esbuild/netbsd-arm64': 0.28.2 + '@esbuild/netbsd-x64': 0.28.2 + '@esbuild/openbsd-arm64': 0.28.2 + '@esbuild/openbsd-x64': 0.28.2 + '@esbuild/openharmony-arm64': 0.28.2 + '@esbuild/sunos-x64': 0.28.2 + '@esbuild/win32-arm64': 0.28.2 + '@esbuild/win32-ia32': 0.28.2 + '@esbuild/win32-x64': 0.28.2 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@5.0.0: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.9 + + etag@1.8.1: {} + + expect-type@1.4.0: {} + + express@5.2.1: + dependencies: + accepts: 2.0.0 + body-parser: 2.3.0 + content-disposition: 1.1.0 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.3 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.1 + fresh: 2.0.0 + http-errors: 2.0.1 + merge-descriptors: 2.0.0 + mime-types: 3.0.2 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.16.0 + range-parser: 1.3.0 + router: 2.2.0 + send: 1.2.1 + serve-static: 2.2.1 + statuses: 2.0.2 + type-is: 2.1.0 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + exsolve@1.1.1: {} + + fast-safe-stringify@2.1.1: {} + + fdir@6.5.0(picomatch@4.0.7): + optionalDependencies: + picomatch: 4.0.7 + + file-type@22.0.2: + dependencies: + '@tokenizer/inflate': 0.4.1 + strtok3: 10.3.5 + token-types: 6.1.2 + uint8array-extras: 1.5.0 + transitivePeerDependencies: + - supports-color + + filesize@11.0.22: {} + + finalhandler@2.1.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + follow-redirects@1.16.0(debug@4.4.3): + optionalDependencies: + debug: 4.4.3 + + form-data@4.0.6: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.4 + mime-types: 2.1.35 + + forwarded@0.2.0: {} + + fresh@2.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.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.2 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.2 + + giget@3.3.1: {} + + gopd@1.2.0: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 - iterare@1.2.1: {} + helmet@8.3.0: {} - jiti@2.7.0: {} + hookable@6.1.1: {} - js-tokens@10.0.0: {} + html-escaper@3.0.3: {} - js-yaml@5.4.1: - dependencies: - argparse: 2.0.1 + htmlparser2@10.1.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 7.0.1 - json2mq@0.2.0: - dependencies: - string-convert: 0.2.1 + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 - json5@2.2.3: {} + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color - lightningcss-android-arm64@1.33.0: - optional: true + iconv-lite@0.7.3: + dependencies: + safer-buffer: 2.1.2 - lightningcss-darwin-arm64@1.33.0: - optional: true + ieee754@1.2.1: {} - lightningcss-darwin-x64@1.33.0: - optional: true + inherits@2.0.4: {} - lightningcss-freebsd-x64@1.33.0: - optional: true + ioredis@6.0.0: + dependencies: + '@ioredis/commands': 2.0.0 + cluster-key-slot: 1.1.1 + debug: 4.4.3 + denque: 2.1.0 + redis-errors: 1.2.0 + standard-as-callback: 2.1.0 + transitivePeerDependencies: + - supports-color - lightningcss-linux-arm-gnueabihf@1.33.0: - optional: true + ipaddr.js@1.9.1: {} - lightningcss-linux-arm64-gnu@1.33.0: - optional: true + is-docker@2.2.1: {} - lightningcss-linux-arm64-musl@1.33.0: - optional: true + is-fullwidth-code-point@3.0.0: {} - lightningcss-linux-x64-gnu@1.33.0: - optional: true + is-mobile@5.0.0: {} - lightningcss-linux-x64-musl@1.33.0: - optional: true + is-potential-custom-element-name@1.0.1: {} - lightningcss-win32-arm64-msvc@1.33.0: - optional: true + is-promise@4.0.0: {} - lightningcss-win32-x64-msvc@1.33.0: - optional: true + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 - lightningcss@1.33.0: - dependencies: - detect-libc: 2.1.2 - optionalDependencies: - lightningcss-android-arm64: 1.33.0 - lightningcss-darwin-arm64: 1.33.0 - lightningcss-darwin-x64: 1.33.0 - lightningcss-freebsd-x64: 1.33.0 - lightningcss-linux-arm-gnueabihf: 1.33.0 - lightningcss-linux-arm64-gnu: 1.33.0 - lightningcss-linux-arm64-musl: 1.33.0 - lightningcss-linux-x64-gnu: 1.33.0 - lightningcss-linux-x64-musl: 1.33.0 - lightningcss-win32-arm64-msvc: 1.33.0 - lightningcss-win32-x64-msvc: 1.33.0 + iterare@1.2.1: {} - linkedom@0.18.13: - dependencies: - css-select: 7.0.0 - cssom: 0.5.0 - html-escaper: 3.0.3 - htmlparser2: 10.1.0 - uhyphen: 0.2.0 + jiti@2.7.0: {} - load-esm@1.0.3: {} + js-tokens@10.0.0: {} - local-pkg@1.2.1: - dependencies: - mlly: 1.8.2 - pkg-types: 2.3.1 - quansync: 0.2.11 + js-yaml@5.4.1: + dependencies: + argparse: 2.0.1 - lodash.merge@4.6.2: {} + json2mq@0.2.0: + dependencies: + string-convert: 0.2.1 - luxon@3.7.2: {} + json5@2.2.3: {} - magic-string@1.2.3: - dependencies: - '@jridgewell/sourcemap-codec': 1.6.0 + lightningcss-android-arm64@1.33.0: + optional: true - magicast@0.5.4: - dependencies: - '@babel/parser': 7.29.8 - '@babel/types': 7.29.8 - source-map-js: 1.2.1 + lightningcss-darwin-arm64@1.33.0: + optional: true - many-keys-map@3.0.3: {} + lightningcss-darwin-x64@1.33.0: + optional: true - math-intrinsics@1.1.0: {} + lightningcss-freebsd-x64@1.33.0: + optional: true - media-typer@0.3.0: {} + lightningcss-linux-arm-gnueabihf@1.33.0: + optional: true - media-typer@1.1.1: {} + lightningcss-linux-arm64-gnu@1.33.0: + optional: true - merge-descriptors@2.0.0: {} + lightningcss-linux-arm64-musl@1.33.0: + optional: true - mime-db@1.52.0: {} + lightningcss-linux-x64-gnu@1.33.0: + optional: true - mime-db@1.54.0: {} + lightningcss-linux-x64-musl@1.33.0: + optional: true - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 + lightningcss-win32-arm64-msvc@1.33.0: + optional: true - mime-types@3.0.2: - dependencies: - mime-db: 1.54.0 + lightningcss-win32-x64-msvc@1.33.0: + optional: true - mlly@1.8.2: - dependencies: - acorn: 8.18.0 - pathe: 2.0.3 - pkg-types: 1.3.1 - ufo: 1.6.4 + lightningcss@1.33.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.33.0 + lightningcss-darwin-arm64: 1.33.0 + lightningcss-darwin-x64: 1.33.0 + lightningcss-freebsd-x64: 1.33.0 + lightningcss-linux-arm-gnueabihf: 1.33.0 + lightningcss-linux-arm64-gnu: 1.33.0 + lightningcss-linux-arm64-musl: 1.33.0 + lightningcss-linux-x64-gnu: 1.33.0 + lightningcss-linux-x64-musl: 1.33.0 + lightningcss-win32-arm64-msvc: 1.33.0 + lightningcss-win32-x64-msvc: 1.33.0 - ms@2.1.3: {} + linkedom@0.18.13: + dependencies: + css-select: 7.0.0 + cssom: 0.5.0 + html-escaper: 3.0.3 + htmlparser2: 10.1.0 + uhyphen: 0.2.0 - msgpackr-extract@3.0.4: - dependencies: - node-gyp-build-optional-packages: 5.2.2 - optionalDependencies: - '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.4 - '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.4 - '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.4 - '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.4 - '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.4 - '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.4 - optional: true + load-esm@1.0.3: {} - msgpackr@2.1.0: - optionalDependencies: - msgpackr-extract: 3.0.4 + local-pkg@1.2.1: + dependencies: + mlly: 1.8.2 + pkg-types: 2.3.1 + quansync: 0.2.11 - multer@2.2.0: - dependencies: - append-field: 1.0.0 - busboy: 1.6.0 - concat-stream: 2.0.0 - type-is: 1.6.18 + lodash.merge@4.6.2: {} - nanoid@3.3.18: {} + luxon@3.7.2: {} - negotiator@1.1.0: - dependencies: - content-type: 2.1.0 + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 - node-abort-controller@3.1.1: {} + magic-string@1.2.3: + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 - node-gyp-build-optional-packages@5.2.2: - dependencies: - detect-libc: 2.1.2 - optional: true + magicast@0.5.4: + dependencies: + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 + source-map-js: 1.2.1 - nth-check@3.0.1: - dependencies: - boolbase: 2.0.0 + many-keys-map@3.0.3: {} - nypm@0.6.9: - dependencies: - citty: 0.2.2 - pathe: 2.0.3 - tinyexec: 1.3.0 + math-intrinsics@1.1.0: {} - object-assign@4.1.1: {} + media-typer@0.3.0: {} - object-inspect@1.13.4: {} + media-typer@1.1.1: {} - ohash@2.0.12: {} + merge-descriptors@2.0.0: {} - on-finished@2.4.1: - dependencies: - ee-first: 1.1.1 + mime-db@1.52.0: {} - once@1.4.0: - dependencies: - wrappy: 1.0.2 + mime-db@1.54.0: {} - open@8.4.2: - dependencies: - define-lazy-prop: 2.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 - parseurl@1.3.3: {} + mime-types@3.0.2: + dependencies: + mime-db: 1.54.0 - path-to-regexp@8.4.2: {} + mlly@1.8.2: + dependencies: + acorn: 8.18.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.4 - pathe@2.0.3: {} + ms@2.1.3: {} - perfect-debounce@2.1.0: {} + msgpackr-extract@3.0.4: + dependencies: + node-gyp-build-optional-packages: 5.2.2 + optionalDependencies: + '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.4 + '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.4 + '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.4 + '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.4 + '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.4 + '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.4 + optional: true - pg-cloudflare@1.4.0: - optional: true + msgpackr@2.1.0: + optionalDependencies: + msgpackr-extract: 3.0.4 - pg-connection-string@2.14.0: {} + multer@2.2.0: + dependencies: + append-field: 1.0.0 + busboy: 1.6.0 + concat-stream: 2.0.0 + type-is: 1.6.18 - pg-int8@1.0.1: {} + nanoid@3.3.18: {} - pg-pool@3.14.0(pg@8.23.0): - dependencies: - pg: 8.23.0 + negotiator@1.1.0: + dependencies: + content-type: 2.1.0 - pg-protocol@1.16.0: {} + node-abort-controller@3.1.1: {} - pg-types@2.2.0: - dependencies: - pg-int8: 1.0.1 - postgres-array: 2.0.0 - postgres-bytea: 1.0.1 - postgres-date: 1.0.7 - postgres-interval: 1.2.0 + node-gyp-build-optional-packages@5.2.2: + dependencies: + detect-libc: 2.1.2 + optional: true - pg@8.23.0: - dependencies: - pg-connection-string: 2.14.0 - pg-pool: 3.14.0(pg@8.23.0) - pg-protocol: 1.16.0 - pg-types: 2.2.0 - pgpass: 1.0.5 - optionalDependencies: - pg-cloudflare: 1.4.0 + nth-check@3.0.1: + dependencies: + boolbase: 2.0.0 - pgpass@1.0.5: - dependencies: - split2: 4.2.0 + nypm@0.6.9: + dependencies: + citty: 0.2.2 + pathe: 2.0.3 + tinyexec: 1.3.0 - picocolors@1.1.1: {} + object-assign@4.1.1: {} - picomatch@2.3.2: {} + object-inspect@1.13.4: {} - picomatch@4.0.7: {} + obug@2.1.4: {} - pkg-types@1.3.1: - dependencies: - confbox: 0.1.8 - mlly: 1.8.2 - pathe: 2.0.3 + ohash@2.0.12: {} - pkg-types@2.3.1: - dependencies: - confbox: 0.2.4 - exsolve: 1.1.1 - pathe: 2.0.3 + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 - postcss@8.5.26: - dependencies: - nanoid: 3.3.18 - picocolors: 1.1.1 - source-map-js: 1.2.1 + once@1.4.0: + dependencies: + wrappy: 1.0.2 - postgres-array@2.0.0: {} + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 - postgres-bytea@1.0.1: {} + parseurl@1.3.3: {} - postgres-date@1.0.7: {} + path-to-regexp@8.4.2: {} - postgres-interval@1.2.0: - dependencies: - xtend: 4.0.2 - - prettier@3.9.6: {} - - proxy-addr@2.0.7: - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - - proxy-from-env@2.1.0: {} - - publish-browser-extension@6.1.1: - dependencies: - '@topcli/prompts': 4.0.0 - cac: 7.0.0 - tasuku: 2.3.0 - - qs@6.16.0: - dependencies: - es-define-property: 1.0.1 - side-channel: 1.1.1 + pathe@2.0.3: {} - quansync@0.2.11: {} + perfect-debounce@2.1.0: {} - range-parser@1.3.0: {} + pg-cloudflare@1.4.0: + optional: true - raw-body@3.0.2: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.1 - iconv-lite: 0.7.3 - unpipe: 1.0.0 - - rc9@3.0.1: - dependencies: - defu: 6.1.7 - destr: 2.0.5 - - react-dom@19.2.8(react@19.2.8): - dependencies: - react: 19.2.8 - scheduler: 0.27.0 - - react-is@19.2.8: {} - - react-router-dom@7.18.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8): - dependencies: - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - react-router: 7.18.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - - react-router@7.18.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8): - dependencies: - cookie: 1.1.1 - react: 19.2.8 - set-cookie-parser: 2.7.2 - optionalDependencies: - react-dom: 19.2.8(react@19.2.8) - - react@19.2.8: {} - - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - - readdirp@5.1.1: {} - - redis-errors@1.2.0: {} - - reflect-metadata@0.2.2: {} - - require-directory@2.1.1: {} - - rolldown@1.2.6: - dependencies: - '@oxc-project/types': 0.147.0 - '@rolldown/pluginutils': 1.0.1 - optionalDependencies: - '@rolldown/binding-android-arm-eabi': 1.2.6 - '@rolldown/binding-android-arm64': 1.2.6 - '@rolldown/binding-darwin-arm64': 1.2.6 - '@rolldown/binding-darwin-x64': 1.2.6 - '@rolldown/binding-freebsd-x64': 1.2.6 - '@rolldown/binding-linux-arm-gnueabihf': 1.2.6 - '@rolldown/binding-linux-arm64-gnu': 1.2.6 - '@rolldown/binding-linux-arm64-musl': 1.2.6 - '@rolldown/binding-linux-ppc64-gnu': 1.2.6 - '@rolldown/binding-linux-s390x-gnu': 1.2.6 - '@rolldown/binding-linux-x64-gnu': 1.2.6 - '@rolldown/binding-linux-x64-musl': 1.2.6 - '@rolldown/binding-openharmony-arm64': 1.2.6 - '@rolldown/binding-win32-arm64-msvc': 1.2.6 - '@rolldown/binding-win32-x64-msvc': 1.2.6 - - router@2.2.0: - dependencies: - debug: 4.4.3 - depd: 2.0.0 - is-promise: 4.0.0 - parseurl: 1.3.3 - path-to-regexp: 8.4.2 - transitivePeerDependencies: - - supports-color - - rxjs@7.8.2: - dependencies: - tslib: 2.8.1 - - safe-buffer@5.2.1: {} - - safer-buffer@2.1.2: {} - - scheduler@0.27.0: {} - - scroll-into-view-if-needed@3.1.0: - dependencies: - compute-scroll-into-view: 3.1.1 - - scule@1.3.0: {} - - semver@7.8.5: {} - - send@1.2.1: - dependencies: - debug: 4.4.3 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 2.0.0 - http-errors: 2.0.1 - mime-types: 3.0.2 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.3.0 - statuses: 2.0.2 - transitivePeerDependencies: - - supports-color - - serve-static@2.2.1: - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 1.2.1 - transitivePeerDependencies: - - supports-color - - set-cookie-parser@2.7.2: {} - - setprototypeof@1.2.0: {} - - side-channel-list@1.0.1: - 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.1: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - side-channel-list: 1.0.1 - side-channel-map: 1.0.1 - side-channel-weakmap: 1.0.2 - - source-map-js@1.2.1: {} - - source-map@0.7.6: {} - - split2@4.2.0: {} - - standard-as-callback@2.1.0: {} - - statuses@2.0.2: {} - - streamsearch@1.1.0: {} - - string-convert@0.2.1: {} - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-literal@4.0.0: - dependencies: - js-tokens: 10.0.0 - - strtok3@10.3.5: - dependencies: - '@tokenizer/token': 0.3.0 - - stylis@4.4.0: {} - - superlock@1.3.5: {} - - swagger-ui-dist@5.32.14: - dependencies: - '@scarf/scarf': 1.4.0 - - tasuku@2.3.0: {} - - throttle-debounce@5.0.2: {} - - tiny-open@1.3.0: {} - - tinyexec@1.3.0: {} - - tinyglobby@0.2.17: - dependencies: - fdir: 6.5.0(picomatch@4.0.7) - picomatch: 4.0.7 - - toidentifier@1.0.1: {} - - token-types@6.1.2: - dependencies: - '@borewit/text-codec': 0.2.2 - '@tokenizer/token': 0.3.0 - ieee754: 1.2.1 - - tslib@2.8.1: {} - - tsx@4.23.13: - dependencies: - esbuild: 0.28.2 - optionalDependencies: - fsevents: 2.3.3 - - turbo@2.10.12: - optionalDependencies: - '@turbo/darwin-64': 2.10.12 - '@turbo/darwin-arm64': 2.10.12 - '@turbo/linux-64': 2.10.12 - '@turbo/linux-arm64': 2.10.12 - '@turbo/windows-64': 2.10.12 - '@turbo/windows-arm64': 2.10.12 - - type-is@1.6.18: - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 - - type-is@2.1.0: - dependencies: - content-type: 2.1.0 - media-typer: 1.1.1 - mime-types: 3.0.2 - - typedarray@0.0.6: {} - - typescript@7.0.2: - optionalDependencies: - '@typescript/typescript-aix-ppc64': 7.0.2 - '@typescript/typescript-darwin-arm64': 7.0.2 - '@typescript/typescript-darwin-x64': 7.0.2 - '@typescript/typescript-freebsd-arm64': 7.0.2 - '@typescript/typescript-freebsd-x64': 7.0.2 - '@typescript/typescript-linux-arm': 7.0.2 - '@typescript/typescript-linux-arm64': 7.0.2 - '@typescript/typescript-linux-loong64': 7.0.2 - '@typescript/typescript-linux-mips64el': 7.0.2 - '@typescript/typescript-linux-ppc64': 7.0.2 - '@typescript/typescript-linux-riscv64': 7.0.2 - '@typescript/typescript-linux-s390x': 7.0.2 - '@typescript/typescript-linux-x64': 7.0.2 - '@typescript/typescript-netbsd-arm64': 7.0.2 - '@typescript/typescript-netbsd-x64': 7.0.2 - '@typescript/typescript-openbsd-arm64': 7.0.2 - '@typescript/typescript-openbsd-x64': 7.0.2 - '@typescript/typescript-sunos-x64': 7.0.2 - '@typescript/typescript-win32-arm64': 7.0.2 - '@typescript/typescript-win32-x64': 7.0.2 - - ufo@1.6.4: {} - - uhyphen@0.2.0: {} - - uid@2.0.2: - dependencies: - '@lukeed/csprng': 1.1.0 - - uint8array-extras@1.5.0: {} - - undici-types@8.3.0: {} - - unimport@6.4.0(esbuild@0.28.2)(rolldown@1.2.6)(vite@8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)): - dependencies: - acorn: 8.18.0 - escape-string-regexp: 5.0.0 - estree-walker: 3.0.3 - local-pkg: 1.2.1 - magic-string: 1.2.3 - mlly: 1.8.2 - pathe: 2.0.3 - picomatch: 4.0.7 - pkg-types: 2.3.1 - scule: 1.3.0 - strip-literal: 4.0.0 - tinyglobby: 0.2.17 - unplugin: 3.3.0(esbuild@0.28.2)(rolldown@1.2.6)(vite@8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)) - unplugin-utils: 0.3.2 - optionalDependencies: - rolldown: 1.2.6 - transitivePeerDependencies: - - '@farmfe/core' - - '@rspack/core' - - bun-types-no-globals - - esbuild - - rollup - - unloader - - vite - - webpack - - unpipe@1.0.0: {} - - unplugin-utils@0.3.2: - dependencies: - pathe: 2.0.3 - picomatch: 4.0.7 - - unplugin@3.3.0(esbuild@0.28.2)(rolldown@1.2.6)(vite@8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)): - dependencies: - '@jridgewell/remapping': 2.3.5 - picomatch: 4.0.7 - webpack-virtual-modules: 0.6.2 - optionalDependencies: - esbuild: 0.28.2 - rolldown: 1.2.6 - vite: 8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13) - - util-deprecate@1.0.2: {} - - vary@1.1.2: {} - - vite@8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13): - dependencies: - lightningcss: 1.33.0 - picomatch: 4.0.7 - postcss: 8.5.26 - rolldown: 1.2.6 - tinyglobby: 0.2.17 - optionalDependencies: - '@types/node': 26.3.0 - esbuild: 0.28.2 - fsevents: 2.3.3 - jiti: 2.7.0 - tsx: 4.23.13 - - webpack-virtual-modules@0.6.2: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - wxt@0.21.4(esbuild@0.28.2)(rolldown@1.2.6)(typescript@7.0.2)(vite@8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)): - dependencies: - '@1natsu/wait-element': 4.2.0 - '@aklinker1/rollup-plugin-visualizer': 5.12.0 - '@aklinker1/zero-zip': 1.0.1 - '@topcli/prompts': 4.0.0 - '@webext-core/fake-browser': 2.0.1 - '@webext-core/isolated-element': 3.0.0 - '@webext-core/match-patterns': 2.0.0 - '@wxt-dev/browser': 0.2.7 - '@wxt-dev/storage': 1.2.9 - c12: 3.3.4(magicast@0.5.4) - cac: 7.0.0 - chokidar: 5.0.0 - consola: 3.4.2 - defu: 6.1.7 - dotenv-expand: 13.0.0 - filesize: 11.0.22 - giget: 3.3.1 - hookable: 6.1.1 - json5: 2.2.3 - linkedom: 0.18.13 - magicast: 0.5.4 - nypm: 0.6.9 - picomatch: 4.0.7 - publish-browser-extension: 6.1.1 - superlock: 1.3.5 - tiny-open: 1.3.0 - tinyexec: 1.3.0 - tinyglobby: 0.2.17 - unimport: 6.4.0(esbuild@0.28.2)(rolldown@1.2.6)(vite@8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)) - vite: 8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13) - optionalDependencies: - typescript: 7.0.2 - transitivePeerDependencies: - - '@farmfe/core' - - '@rspack/core' - - bun-types-no-globals - - canvas - - esbuild - - oxc-parser - - rolldown - - rollup - - unloader - - webpack - - xtend@4.0.2: {} - - y18n@5.0.8: {} - - yargs-parser@21.1.1: {} - - yargs@17.7.3: - 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 - - zod@4.5.4: {} + pg-connection-string@2.14.0: {} + + pg-int8@1.0.1: {} + + pg-pool@3.14.0(pg@8.23.0): + dependencies: + pg: 8.23.0 + + pg-protocol@1.16.0: {} + + pg-types@2.2.0: + dependencies: + pg-int8: 1.0.1 + postgres-array: 2.0.0 + postgres-bytea: 1.0.1 + postgres-date: 1.0.7 + postgres-interval: 1.2.0 + + pg@8.23.0: + dependencies: + pg-connection-string: 2.14.0 + pg-pool: 3.14.0(pg@8.23.0) + pg-protocol: 1.16.0 + pg-types: 2.2.0 + pgpass: 1.0.5 + optionalDependencies: + pg-cloudflare: 1.4.0 + + pgpass@1.0.5: + dependencies: + split2: 4.2.0 + + picocolors@1.1.1: {} + + picomatch@2.3.2: {} + + picomatch@4.0.7: {} + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.2 + pathe: 2.0.3 + + pkg-types@2.3.1: + dependencies: + confbox: 0.2.4 + exsolve: 1.1.1 + pathe: 2.0.3 + + postcss@8.5.26: + dependencies: + nanoid: 3.3.18 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + postgres-array@2.0.0: {} + + postgres-bytea@1.0.1: {} + + postgres-date@1.0.7: {} + + postgres-interval@1.2.0: + dependencies: + xtend: 4.0.2 + + prettier@3.9.6: {} + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + proxy-from-env@2.1.0: {} + + publish-browser-extension@6.1.1: + dependencies: + '@topcli/prompts': 4.0.0 + cac: 7.0.0 + tasuku: 2.3.0 + + qs@6.16.0: + dependencies: + es-define-property: 1.0.1 + side-channel: 1.1.1 + + quansync@0.2.11: {} + + range-parser@1.3.0: {} + + raw-body@3.0.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.7.3 + unpipe: 1.0.0 + + rc9@3.0.1: + dependencies: + defu: 6.1.7 + destr: 2.0.5 + + react-dom@19.2.8(react@19.2.8): + dependencies: + react: 19.2.8 + scheduler: 0.27.0 + + react-is@19.2.8: {} + + react-router-dom@7.18.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + dependencies: + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + react-router: 7.18.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + + react-router@7.18.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + dependencies: + cookie: 1.1.1 + react: 19.2.8 + set-cookie-parser: 2.7.2 + optionalDependencies: + react-dom: 19.2.8(react@19.2.8) + + react@19.2.8: {} + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@5.1.1: {} + + redis-errors@1.2.0: {} + + reflect-metadata@0.2.2: {} + + require-directory@2.1.1: {} + + rolldown@1.2.6: + dependencies: + '@oxc-project/types': 0.147.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm-eabi': 1.2.6 + '@rolldown/binding-android-arm64': 1.2.6 + '@rolldown/binding-darwin-arm64': 1.2.6 + '@rolldown/binding-darwin-x64': 1.2.6 + '@rolldown/binding-freebsd-x64': 1.2.6 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.6 + '@rolldown/binding-linux-arm64-gnu': 1.2.6 + '@rolldown/binding-linux-arm64-musl': 1.2.6 + '@rolldown/binding-linux-ppc64-gnu': 1.2.6 + '@rolldown/binding-linux-s390x-gnu': 1.2.6 + '@rolldown/binding-linux-x64-gnu': 1.2.6 + '@rolldown/binding-linux-x64-musl': 1.2.6 + '@rolldown/binding-openharmony-arm64': 1.2.6 + '@rolldown/binding-win32-arm64-msvc': 1.2.6 + '@rolldown/binding-win32-x64-msvc': 1.2.6 + + router@2.2.0: + dependencies: + debug: 4.4.3 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.4.2 + transitivePeerDependencies: + - supports-color + + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + scheduler@0.27.0: {} + + scroll-into-view-if-needed@3.1.0: + dependencies: + compute-scroll-into-view: 3.1.1 + + scule@1.3.0: {} + + semver@7.8.5: {} + + send@1.2.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.1 + mime-types: 3.0.2 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.3.0 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serve-static@2.2.1: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.1 + transitivePeerDependencies: + - supports-color + + set-cookie-parser@2.7.2: {} + + setprototypeof@1.2.0: {} + + side-channel-list@1.0.1: + 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.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.1 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + siginfo@2.0.0: {} + + source-map-js@1.2.1: {} + + source-map@0.7.6: {} + + split2@4.2.0: {} + + stackback@0.0.2: {} + + standard-as-callback@2.1.0: {} + + statuses@2.0.2: {} + + std-env@4.2.0: {} + + streamsearch@1.1.0: {} + + string-convert@0.2.1: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-literal@4.0.0: + dependencies: + js-tokens: 10.0.0 + + strtok3@10.3.5: + dependencies: + '@tokenizer/token': 0.3.0 + + stylis@4.4.0: {} + + superlock@1.3.5: {} + + swagger-ui-dist@5.32.14: + dependencies: + '@scarf/scarf': 1.4.0 + + tasuku@2.3.0: {} + + throttle-debounce@5.0.2: {} + + tiny-open@1.3.0: {} + + tinybench@2.9.0: {} + + tinyexec@1.3.0: {} + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 + + tinyrainbow@3.1.1: {} + + toidentifier@1.0.1: {} + + token-types@6.1.2: + dependencies: + '@borewit/text-codec': 0.2.2 + '@tokenizer/token': 0.3.0 + ieee754: 1.2.1 + + tslib@2.8.1: {} + + tsx@4.23.13: + dependencies: + esbuild: 0.28.2 + optionalDependencies: + fsevents: 2.3.3 + + turbo@2.10.12: + optionalDependencies: + '@turbo/darwin-64': 2.10.12 + '@turbo/darwin-arm64': 2.10.12 + '@turbo/linux-64': 2.10.12 + '@turbo/linux-arm64': 2.10.12 + '@turbo/windows-64': 2.10.12 + '@turbo/windows-arm64': 2.10.12 + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + type-is@2.1.0: + dependencies: + content-type: 2.1.0 + media-typer: 1.1.1 + mime-types: 3.0.2 + + typedarray@0.0.6: {} + + typescript@7.0.2: + optionalDependencies: + '@typescript/typescript-aix-ppc64': 7.0.2 + '@typescript/typescript-darwin-arm64': 7.0.2 + '@typescript/typescript-darwin-x64': 7.0.2 + '@typescript/typescript-freebsd-arm64': 7.0.2 + '@typescript/typescript-freebsd-x64': 7.0.2 + '@typescript/typescript-linux-arm': 7.0.2 + '@typescript/typescript-linux-arm64': 7.0.2 + '@typescript/typescript-linux-loong64': 7.0.2 + '@typescript/typescript-linux-mips64el': 7.0.2 + '@typescript/typescript-linux-ppc64': 7.0.2 + '@typescript/typescript-linux-riscv64': 7.0.2 + '@typescript/typescript-linux-s390x': 7.0.2 + '@typescript/typescript-linux-x64': 7.0.2 + '@typescript/typescript-netbsd-arm64': 7.0.2 + '@typescript/typescript-netbsd-x64': 7.0.2 + '@typescript/typescript-openbsd-arm64': 7.0.2 + '@typescript/typescript-openbsd-x64': 7.0.2 + '@typescript/typescript-sunos-x64': 7.0.2 + '@typescript/typescript-win32-arm64': 7.0.2 + '@typescript/typescript-win32-x64': 7.0.2 + + ufo@1.6.4: {} + + uhyphen@0.2.0: {} + + uid@2.0.2: + dependencies: + '@lukeed/csprng': 1.1.0 + + uint8array-extras@1.5.0: {} + + undici-types@8.3.0: {} + + unimport@6.4.0(esbuild@0.28.2)(rolldown@1.2.6)(vite@8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)): + dependencies: + acorn: 8.18.0 + escape-string-regexp: 5.0.0 + estree-walker: 3.0.3 + local-pkg: 1.2.1 + magic-string: 1.2.3 + mlly: 1.8.2 + pathe: 2.0.3 + picomatch: 4.0.7 + pkg-types: 2.3.1 + scule: 1.3.0 + strip-literal: 4.0.0 + tinyglobby: 0.2.17 + unplugin: 3.3.0(esbuild@0.28.2)(rolldown@1.2.6)(vite@8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)) + unplugin-utils: 0.3.2 + optionalDependencies: + rolldown: 1.2.6 + transitivePeerDependencies: + - '@farmfe/core' + - '@rspack/core' + - bun-types-no-globals + - esbuild + - rollup + - unloader + - vite + - webpack + + unpipe@1.0.0: {} + + unplugin-utils@0.3.2: + dependencies: + pathe: 2.0.3 + picomatch: 4.0.7 + + unplugin@3.3.0(esbuild@0.28.2)(rolldown@1.2.6)(vite@8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)): + dependencies: + '@jridgewell/remapping': 2.3.5 + picomatch: 4.0.7 + webpack-virtual-modules: 0.6.2 + optionalDependencies: + esbuild: 0.28.2 + rolldown: 1.2.6 + vite: 8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13) + + util-deprecate@1.0.2: {} + + vary@1.1.2: {} + + vite@8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13): + dependencies: + lightningcss: 1.33.0 + picomatch: 4.0.7 + postcss: 8.5.26 + rolldown: 1.2.6 + tinyglobby: 0.2.17 + optionalDependencies: + '@types/node': 26.3.0 + esbuild: 0.28.2 + fsevents: 2.3.3 + jiti: 2.7.0 + tsx: 4.23.13 + + vitest@4.1.11(@types/node@26.3.0)(vite@8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)): + dependencies: + '@vitest/expect': 4.1.11 + '@vitest/mocker': 4.1.11(vite@8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)) + '@vitest/pretty-format': 4.1.11 + '@vitest/runner': 4.1.11 + '@vitest/snapshot': 4.1.11 + '@vitest/spy': 4.1.11 + '@vitest/utils': 4.1.11 + es-module-lexer: 2.3.2 + expect-type: 1.4.0 + magic-string: 0.30.21 + obug: 2.1.4 + pathe: 2.0.3 + picomatch: 4.0.7 + std-env: 4.2.0 + tinybench: 2.9.0 + tinyexec: 1.3.0 + tinyglobby: 0.2.17 + tinyrainbow: 3.1.1 + vite: 8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 26.3.0 + transitivePeerDependencies: + - msw + + webpack-virtual-modules@0.6.2: {} + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + wxt@0.21.4(esbuild@0.28.2)(rolldown@1.2.6)(typescript@7.0.2)(vite@8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)): + dependencies: + '@1natsu/wait-element': 4.2.0 + '@aklinker1/rollup-plugin-visualizer': 5.12.0 + '@aklinker1/zero-zip': 1.0.1 + '@topcli/prompts': 4.0.0 + '@webext-core/fake-browser': 2.0.1 + '@webext-core/isolated-element': 3.0.0 + '@webext-core/match-patterns': 2.0.0 + '@wxt-dev/browser': 0.2.7 + '@wxt-dev/storage': 1.2.9 + c12: 3.3.4(magicast@0.5.4) + cac: 7.0.0 + chokidar: 5.0.0 + consola: 3.4.2 + defu: 6.1.7 + dotenv-expand: 13.0.0 + filesize: 11.0.22 + giget: 3.3.1 + hookable: 6.1.1 + json5: 2.2.3 + linkedom: 0.18.13 + magicast: 0.5.4 + nypm: 0.6.9 + picomatch: 4.0.7 + publish-browser-extension: 6.1.1 + superlock: 1.3.5 + tiny-open: 1.3.0 + tinyexec: 1.3.0 + tinyglobby: 0.2.17 + unimport: 6.4.0(esbuild@0.28.2)(rolldown@1.2.6)(vite@8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)) + vite: 8.2.2(@types/node@26.3.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13) + optionalDependencies: + typescript: 7.0.2 + transitivePeerDependencies: + - '@farmfe/core' + - '@rspack/core' + - bun-types-no-globals + - canvas + - esbuild + - oxc-parser + - rolldown + - rollup + - unloader + - webpack + + xtend@4.0.2: {} + + y18n@5.0.8: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.3: + 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 + + zod@4.5.4: {}