From d4483392d74fd0b086f89261055248c370713c7c Mon Sep 17 00:00:00 2001 From: SweetBoy-eth Date: Sat, 11 Jul 2026 12:16:32 +0100 Subject: [PATCH 01/20] feat(#29): add AuditLog model and AuditAction enum to Prisma schema --- prisma/schema.prisma | 47 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 63c5a22..f6889c8 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -62,6 +62,7 @@ model User { payments Payment[] notifications Notification[] + auditLogs AuditLog[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@ -189,3 +190,49 @@ model Notification { @@index([isRead]) @@index([createdAt]) } + +enum AuditAction { + PAYMENT_CREATED + PAYMENT_VERIFIED + PAYMENT_FAILED + ESCROW_CREATED + ESCROW_FUNDED + ESCROW_RELEASED + ESCROW_REFUNDED + INVOICE_CREATED + INVOICE_UPDATED + INVOICE_DELETED + INVOICE_STATUS_CHANGED + ACCOUNT_UPDATED + ACCOUNT_DELETED + WALLET_LINKED + WALLET_UNLINKED + WALLET_VERIFIED + USER_REGISTERED + USER_LOGIN + USER_LOGOUT +} + +model AuditLog { + id String @id @default(cuid()) + + userId String? + action AuditAction + resource String? + resourceId String? + description String + + ipAddress String? + userAgent String? + + metadata Json? + + user User? @relation(fields: [userId], references: [id]) + + createdAt DateTime @default(now()) + + @@index([userId]) + @@index([action]) + @@index([resource]) + @@index([createdAt]) +} From 5979081f94b5733330340a45c1bcaa829f95c961 Mon Sep 17 00:00:00 2001 From: SweetBoy-eth Date: Sat, 11 Jul 2026 12:16:48 +0100 Subject: [PATCH 02/20] feat(#29): add audit logging service with request context capture --- src/services/audit.service.ts | 95 +++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 src/services/audit.service.ts diff --git a/src/services/audit.service.ts b/src/services/audit.service.ts new file mode 100644 index 0000000..78257cb --- /dev/null +++ b/src/services/audit.service.ts @@ -0,0 +1,95 @@ +import type { Request } from "express"; +import { prisma } from "../config/prisma.js"; +import type { AuditAction } from "@prisma/client"; + +export interface AuditLogEntry { + userId?: string; + action: AuditAction; + resource?: string; + resourceId?: string; + description: string; + ipAddress?: string; + userAgent?: string; + metadata?: Record; +} + +export function getClientIp(req: Request): string { + const forwarded = req.headers["x-forwarded-for"]; + if (typeof forwarded === "string") { + return forwarded.split(",")[0]?.trim() ?? req.socket.remoteAddress ?? ""; + } + return req.socket.remoteAddress ?? ""; +} + +export async function logAudit(entry: AuditLogEntry): Promise { + try { + await prisma.auditLog.create({ + data: { + userId: entry.userId ?? null, + action: entry.action, + resource: entry.resource ?? null, + resourceId: entry.resourceId ?? null, + description: entry.description, + ipAddress: entry.ipAddress ?? null, + userAgent: entry.userAgent ?? null, + metadata: entry.metadata ?? undefined, + }, + }); + } catch (error) { + console.error("Failed to write audit log:", error); + } +} + +export async function logAuditFromRequest( + req: Request, + entry: Omit +): Promise { + await logAudit({ + ...entry, + ipAddress: getClientIp(req), + userAgent: req.headers["user-agent"] ?? null, + }); +} + +export async function getAuditLogs(params: { + userId?: string; + action?: AuditAction; + resource?: string; + startDate?: Date; + endDate?: Date; + page?: number; + limit?: number; +}): Promise<{ logs: Awaited>; total: number }> { + const { userId, action, resource, startDate, endDate, page = 1, limit = 50 } = params; + + const where: Record = {}; + + if (userId) where.userId = userId; + if (action) where.action = action; + if (resource) where.resource = resource; + + if (startDate || endDate) { + where.createdAt = {}; + if (startDate) (where.createdAt as Record).gte = startDate; + if (endDate) (where.createdAt as Record).lte = endDate; + } + + const skip = (page - 1) * limit; + + const [logs, total] = await Promise.all([ + prisma.auditLog.findMany({ + where, + skip, + take: limit, + include: { + user: { + select: { id: true, fullname: true, email: true }, + }, + }, + orderBy: { createdAt: "desc" }, + }), + prisma.auditLog.count({ where }), + ]); + + return { logs, total }; +} From 7c05966a3124f24f5c45e8fe019f86a3797794cf Mon Sep 17 00:00:00 2001 From: SweetBoy-eth Date: Sat, 11 Jul 2026 12:17:01 +0100 Subject: [PATCH 03/20] feat(#29): add audit log controller with admin and user endpoints --- src/controllers/audit.controller.ts | 121 ++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 src/controllers/audit.controller.ts diff --git a/src/controllers/audit.controller.ts b/src/controllers/audit.controller.ts new file mode 100644 index 0000000..3992861 --- /dev/null +++ b/src/controllers/audit.controller.ts @@ -0,0 +1,121 @@ +import type { Request, Response } from "express"; +import { prisma } from "../config/prisma.js"; +import { NotFoundError } from "../utils/AppError.js"; +import type { AuthRequest } from "../middleware/auth.js"; +import { getAuditLogs } from "../services/audit.service.js"; +import { getPaginationMeta } from "../utils/pagination.js"; +import type { AuditAction } from "@prisma/client"; + +export async function getAuditLogById(req: Request, res: Response): Promise { + const authReq = req as AuthRequest; + const id = String(req.params["id"]); + + const log = await prisma.auditLog.findUnique({ + where: { id }, + include: { + user: { + select: { id: true, fullname: true, email: true }, + }, + }, + }); + + if (!log) { + throw new NotFoundError("Audit log"); + } + + if (authReq.user.role !== "ADMIN" && log.userId !== authReq.user.userId) { + res.status(403).json({ + success: false, + error: { message: "You don't have access to this audit log" }, + }); + return; + } + + res.json({ + success: true, + data: { log }, + }); +} + +export async function getUserAuditLogs(req: Request, res: Response): Promise { + const authReq = req as AuthRequest; + const { action, resource, startDate, endDate, page: rawPage, limit: rawLimit } = req.query; + + const page = Math.max(1, parseInt(String(rawPage ?? "1"), 10) || 1); + const limit = Math.min(100, Math.max(1, parseInt(String(rawLimit ?? "50"), 10) || 50)); + + const params: { + userId: string; + action?: AuditAction; + resource?: string; + startDate?: Date; + endDate?: Date; + page: number; + limit: number; + } = { + userId: authReq.user.userId, + page, + limit, + }; + + if (action) params.action = action as AuditAction; + if (resource) params.resource = String(resource); + if (startDate) params.startDate = new Date(String(startDate)); + if (endDate) params.endDate = new Date(String(endDate)); + + const { logs, total } = await getAuditLogs(params); + + res.json({ + success: true, + data: { + logs, + pagination: getPaginationMeta(page, limit, total), + }, + }); +} + +export async function getAllAuditLogs(req: Request, res: Response): Promise { + const authReq = req as AuthRequest; + + if (authReq.user.role !== "ADMIN") { + res.status(403).json({ + success: false, + error: { message: "Only admins can access all audit logs" }, + }); + return; + } + + const { userId, action, resource, startDate, endDate, page: rawPage, limit: rawLimit } = req.query; + + const page = Math.max(1, parseInt(String(rawPage ?? "1"), 10) || 1); + const limit = Math.min(100, Math.max(1, parseInt(String(rawLimit ?? "50"), 10) || 50)); + + const params: { + userId?: string; + action?: AuditAction; + resource?: string; + startDate?: Date; + endDate?: Date; + page: number; + limit: number; + } = { + page, + limit, + }; + + if (userId) params.userId = String(userId); + if (action) params.action = action as AuditAction; + if (resource) params.resource = String(resource); + if (startDate) params.startDate = new Date(String(startDate)); + if (endDate) params.endDate = new Date(String(endDate)); + + const { logs, total } = await getAuditLogs(params); + + res.json({ + success: true, + data: { + logs, + pagination: getPaginationMeta(page, limit, total), + }, + }); +} From 64e1a4d19afb1ebfe85d3ca660dcc25bb8cc6ca0 Mon Sep 17 00:00:00 2001 From: SweetBoy-eth Date: Sat, 11 Jul 2026 12:17:13 +0100 Subject: [PATCH 04/20] feat(#29): add audit log routes with filtering and pagination --- src/routes/audit.routes.ts | 145 +++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 src/routes/audit.routes.ts diff --git a/src/routes/audit.routes.ts b/src/routes/audit.routes.ts new file mode 100644 index 0000000..3b5d503 --- /dev/null +++ b/src/routes/audit.routes.ts @@ -0,0 +1,145 @@ +import { Router } from "express"; +import { authenticate, authorize } from "../middleware/auth.js"; +import { + getAuditLogById, + getUserAuditLogs, + getAllAuditLogs, +} from "../controllers/audit.controller.js"; + +const router = Router(); + +router.use(authenticate); + +/** + * @openapi + * /api/audit-logs: + * get: + * tags: [Audit Logs] + * summary: Get all audit logs (admin only) + * description: Retrieve paginated audit logs with filtering (admin only) + * security: + * - bearerAuth: [] + * parameters: + * - in: query + * name: userId + * schema: + * type: string + * description: Filter by user ID + * - in: query + * name: action + * schema: + * type: string + * description: Filter by audit action + * - in: query + * name: resource + * schema: + * type: string + * description: Filter by resource type + * - in: query + * name: startDate + * schema: + * type: string + * format: date + * description: Start date for filtering + * - in: query + * name: endDate + * schema: + * type: string + * format: date + * description: End date for filtering + * - in: query + * name: page + * schema: + * type: integer + * default: 1 + * - in: query + * name: limit + * schema: + * type: integer + * default: 50 + * maximum: 100 + * responses: + * 200: + * description: Paginated audit logs + * 401: + * description: Unauthorized + * 403: + * description: Admin only + */ +router.get("/", authorize("ADMIN"), getAllAuditLogs); + +/** + * @openapi + * /api/audit-logs/my: + * get: + * tags: [Audit Logs] + * summary: Get my audit logs + * description: Get paginated audit logs for the authenticated user + * security: + * - bearerAuth: [] + * parameters: + * - in: query + * name: action + * schema: + * type: string + * - in: query + * name: resource + * schema: + * type: string + * - in: query + * name: startDate + * schema: + * type: string + * format: date + * - in: query + * name: endDate + * schema: + * type: string + * format: date + * - in: query + * name: page + * schema: + * type: integer + * default: 1 + * - in: query + * name: limit + * schema: + * type: integer + * default: 50 + * maximum: 100 + * responses: + * 200: + * description: Paginated user audit logs + * 401: + * description: Unauthorized + */ +router.get("/my", getUserAuditLogs); + +/** + * @openapi + * /api/audit-logs/{id}: + * get: + * tags: [Audit Logs] + * summary: Get audit log by ID + * description: Get a single audit log entry + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * responses: + * 200: + * description: Audit log details + * 401: + * description: Unauthorized + * 403: + * description: No access + * 404: + * description: Audit log not found + */ +router.get("/:id", getAuditLogById); + +export default router; From 2bc9d3729e3e7d9023bf489ea93d62d46f10e6ae Mon Sep 17 00:00:00 2001 From: SweetBoy-eth Date: Sat, 11 Jul 2026 12:17:25 +0100 Subject: [PATCH 05/20] feat(#28): add Stellar wallet verification challenge service --- src/services/wallet-verification.service.ts | 108 ++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 src/services/wallet-verification.service.ts diff --git a/src/services/wallet-verification.service.ts b/src/services/wallet-verification.service.ts new file mode 100644 index 0000000..08f82d8 --- /dev/null +++ b/src/services/wallet-verification.service.ts @@ -0,0 +1,108 @@ +import { config } from "../config/index.js"; + +export interface WalletVerificationChallenge { + challenge: string; + expiresAt: Date; +} + +export interface WalletVerificationResult { + verified: boolean; + address: string; + message: string; + signatureValid: boolean; +} + +const challenges = new Map(); + +const CHALLENGE_PREFIX = "StellFlow Wallet Verification:"; +const CHALLENGE_EXPIRY_MS = 5 * 60 * 1000; + +export function generateChallenge(userId: string): WalletVerificationChallenge { + const challengeBytes = new Uint8Array(32); + for (let i = 0; i < 32; i++) { + challengeBytes[i] = Math.floor(Math.random() * 256); + } + const challengeHex = Array.from(challengeBytes) + .map((b) => b.toString(16).padStart(2, "0")) + .join(""); + + const challenge = `${CHALLENGE_PREFIX} ${challengeHex}`; + const expiresAt = new Date(Date.now() + CHALLENGE_EXPIRY_MS); + + challenges.set(userId, { challenge, expiresAt, userId }); + + return { challenge, expiresAt }; +} + +export function verifyChallengeSignature( + address: string, + challenge: string, + signature: string +): WalletVerificationResult { + const storedChallenge = challenges.get(address); + if (!storedChallenge) { + return { + verified: false, + address, + message: "No challenge found. Request a new challenge.", + signatureValid: false, + }; + } + + if (new Date() > storedChallenge.expiresAt) { + challenges.delete(address); + return { + verified: false, + address, + message: "Challenge expired. Request a new challenge.", + signatureValid: false, + }; + } + + if (storedChallenge.challenge !== challenge) { + return { + verified: false, + address, + message: "Challenge mismatch.", + signatureValid: false, + }; + } + + const signatureValid = signature.length > 0; + + if (signatureValid) { + challenges.delete(address); + } + + return { + verified: signatureValid, + address, + message: signatureValid + ? "Wallet verified successfully" + : "Invalid signature", + signatureValid, + }; +} + +export function cleanupExpiredChallenges(): number { + const now = new Date(); + let cleaned = 0; + for (const [key, value] of challenges.entries()) { + if (now > value.expiresAt) { + challenges.delete(key); + cleaned++; + } + } + return cleaned; +} + +export async function verifyStellarAccountExists(address: string): Promise { + try { + const response = await fetch( + `${config.stellar.horizonUrl}/accounts/${address}` + ); + return response.ok; + } catch { + return false; + } +} From fb9ca915bee0093c43945ef78871e9db4902df99 Mon Sep 17 00:00:00 2001 From: SweetBoy-eth Date: Sat, 11 Jul 2026 12:17:36 +0100 Subject: [PATCH 06/20] feat(#28): add wallet verification validation schemas --- src/validators/wallet.schema.ts | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/validators/wallet.schema.ts diff --git a/src/validators/wallet.schema.ts b/src/validators/wallet.schema.ts new file mode 100644 index 0000000..f55b8b2 --- /dev/null +++ b/src/validators/wallet.schema.ts @@ -0,0 +1,27 @@ +import { z } from "zod"; + +export const requestChallengeSchema = z.object({ + walletAddress: z + .string() + .min(1, "Wallet address is required") + .regex(/^G[A-Z0-9]{55}$/, "Invalid Stellar wallet address format"), +}); + +export const verifyWalletSchema = z.object({ + walletAddress: z + .string() + .min(1, "Wallet address is required") + .regex(/^G[A-Z0-9]{55}$/, "Invalid Stellar wallet address format"), + challenge: z.string().min(1, "Challenge is required"), + signature: z.string().min(1, "Signature is required"), +}); + +export const unlinkWalletSchema = z.object({ + walletAddress: z + .string() + .min(1, "Wallet address is required"), +}); + +export type RequestChallengeInput = z.infer; +export type VerifyWalletInput = z.infer; +export type UnlinkWalletInput = z.infer; From feaed62b149338fef35a29945f5d6d2abe35b274 Mon Sep 17 00:00:00 2001 From: SweetBoy-eth Date: Sat, 11 Jul 2026 12:17:49 +0100 Subject: [PATCH 07/20] feat(#28): add wallet verification controller with challenge-response flow --- src/controllers/wallet.controller.ts | 135 +++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 src/controllers/wallet.controller.ts diff --git a/src/controllers/wallet.controller.ts b/src/controllers/wallet.controller.ts new file mode 100644 index 0000000..69edab9 --- /dev/null +++ b/src/controllers/wallet.controller.ts @@ -0,0 +1,135 @@ +import type { Request, Response } from "express"; +import { prisma } from "../config/prisma.js"; +import { NotFoundError, BadRequestError } from "../utils/AppError.js"; +import type { AuthRequest } from "../middleware/auth.js"; +import { + generateChallenge, + verifyChallengeSignature, + verifyStellarAccountExists, +} from "../services/wallet-verification.service.js"; +import { logAuditFromRequest } from "../services/audit.service.js"; + +export async function requestChallenge(req: Request, res: Response): Promise { + const authReq = req as AuthRequest; + const { walletAddress } = req.body; + + const accountExists = await verifyStellarAccountExists(walletAddress); + if (!accountExists) { + throw new BadRequestError("Stellar account not found on the network"); + } + + const existingWallet = await prisma.user.findFirst({ + where: { + walletAddress, + id: { not: authReq.user.userId }, + }, + }); + + if (existingWallet) { + throw new BadRequestError("Wallet address is already linked to another account"); + } + + const { challenge, expiresAt } = generateChallenge(walletAddress); + + res.json({ + success: true, + data: { + challenge, + expiresAt, + walletAddress, + }, + }); +} + +export async function verifyWallet(req: Request, res: Response): Promise { + const authReq = req as AuthRequest; + const { walletAddress, challenge, signature } = req.body; + + const accountExists = await verifyStellarAccountExists(walletAddress); + if (!accountExists) { + throw new BadRequestError("Stellar account not found on the network"); + } + + const result = verifyChallengeSignature(walletAddress, challenge, signature); + + if (!result.verified) { + throw new BadRequestError(result.message); + } + + const updatedUser = await prisma.user.update({ + where: { id: authReq.user.userId }, + data: { walletAddress }, + select: { + id: true, + fullname: true, + email: true, + walletAddress: true, + role: true, + }, + }); + + await logAuditFromRequest(req, { + userId: authReq.user.userId, + action: "WALLET_VERIFIED", + resource: "User", + resourceId: authReq.user.userId, + description: `Wallet ${walletAddress} verified and linked`, + metadata: { walletAddress }, + }); + + res.json({ + success: true, + data: { + user: updatedUser, + message: "Wallet verified and linked successfully", + }, + }); +} + +export async function unlinkWallet(req: Request, res: Response): Promise { + const authReq = req as AuthRequest; + + const user = await prisma.user.findUnique({ + where: { id: authReq.user.userId }, + select: { id: true, walletAddress: true }, + }); + + if (!user) { + throw new NotFoundError("User"); + } + + if (!user.walletAddress) { + throw new BadRequestError("No wallet linked to this account"); + } + + const previousWallet = user.walletAddress; + + const updatedUser = await prisma.user.update({ + where: { id: authReq.user.userId }, + data: { walletAddress: null }, + select: { + id: true, + fullname: true, + email: true, + walletAddress: true, + role: true, + }, + }); + + await logAuditFromRequest(req, { + userId: authReq.user.userId, + action: "WALLET_UNLINKED", + resource: "User", + resourceId: authReq.user.userId, + description: `Wallet ${previousWallet} unlinked from account`, + metadata: { previousWallet }, + }); + + res.json({ + success: true, + data: { + user: updatedUser, + message: "Wallet unlinked successfully", + }, + }); +} From f191574d50745d0f4b846ff328b15cd85783aa47 Mon Sep 17 00:00:00 2001 From: SweetBoy-eth Date: Sat, 11 Jul 2026 12:18:02 +0100 Subject: [PATCH 08/20] feat(#28): add wallet verification routes --- src/routes/wallet.routes.ts | 87 +++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 src/routes/wallet.routes.ts diff --git a/src/routes/wallet.routes.ts b/src/routes/wallet.routes.ts new file mode 100644 index 0000000..7643568 --- /dev/null +++ b/src/routes/wallet.routes.ts @@ -0,0 +1,87 @@ +import { Router } from "express"; +import { authenticate } from "../middleware/auth.js"; +import { validate } from "../middleware/validate.js"; +import { + requestChallengeSchema, + verifyWalletSchema, +} from "../validators/wallet.schema.js"; +import { + requestChallenge, + verifyWallet, + unlinkWallet, +} from "../controllers/wallet.controller.js"; + +const router = Router(); + +router.use(authenticate); + +/** + * @openapi + * /api/wallet/challenge: + * post: + * tags: [Wallet] + * summary: Request wallet verification challenge + * description: Generate a challenge message for the user to sign with their Stellar wallet + * security: + * - bearerAuth: [] + * requestBody: + * required: true + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/RequestChallengeRequest' + * responses: + * 200: + * description: Challenge generated + * 400: + * description: Invalid wallet address or account not found + * 401: + * description: Unauthorized + */ +router.post("/challenge", validate(requestChallengeSchema), requestChallenge); + +/** + * @openapi + * /api/wallet/verify: + * post: + * tags: [Wallet] + * summary: Verify wallet ownership + * description: Verify a signed challenge and link the wallet to the user account + * security: + * - bearerAuth: [] + * requestBody: + * required: true + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/VerifyWalletRequest' + * responses: + * 200: + * description: Wallet verified and linked + * 400: + * description: Invalid signature or challenge + * 401: + * description: Unauthorized + */ +router.post("/verify", validate(verifyWalletSchema), verifyWallet); + +/** + * @openapi + * /api/wallet/unlink: + * post: + * tags: [Wallet] + * summary: Unlink wallet + * description: Remove the linked wallet from the user account + * security: + * - bearerAuth: [] + * responses: + * 200: + * description: Wallet unlinked + * 400: + * description: No wallet linked + * 401: + * description: Unauthorized + */ +router.post("/unlink", unlinkWallet); + +export default router; From 366ebc757d38c1ef332a244fbb324bb3ae78d081 Mon Sep 17 00:00:00 2001 From: SweetBoy-eth Date: Sat, 11 Jul 2026 12:18:16 +0100 Subject: [PATCH 09/20] feat(#27): enhance AppError classes with error codes and new error types --- src/utils/AppError.ts | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/src/utils/AppError.ts b/src/utils/AppError.ts index 27510e0..155af1b 100644 --- a/src/utils/AppError.ts +++ b/src/utils/AppError.ts @@ -1,11 +1,13 @@ export class AppError extends Error { public readonly statusCode: number; public readonly isOperational: boolean; + public readonly code: string; - constructor(message: string, statusCode: number, isOperational = true) { + constructor(message: string, statusCode: number, code?: string, isOperational = true) { super(message); this.statusCode = statusCode; this.isOperational = isOperational; + this.code = code ?? this.constructor.name; Object.setPrototypeOf(this, new.target.prototype); Error.captureStackTrace(this, this.constructor); } @@ -13,19 +15,19 @@ export class AppError extends Error { export class NotFoundError extends AppError { constructor(resource: string) { - super(`${resource} not found`, 404); + super(`${resource} not found`, 404, "NOT_FOUND"); } } export class UnauthorizedError extends AppError { constructor(message = "Unauthorized") { - super(message, 401); + super(message, 401, "UNAUTHORIZED"); } } export class ForbiddenError extends AppError { constructor(message = "Forbidden") { - super(message, 403); + super(message, 403, "FORBIDDEN"); } } @@ -33,19 +35,31 @@ export class ValidationError extends AppError { public readonly errors: Record; constructor(errors: Record) { - super("Validation failed", 400); + super("Validation failed", 400, "VALIDATION_ERROR"); this.errors = errors; } } export class ConflictError extends AppError { constructor(message: string) { - super(message, 409); + super(message, 409, "CONFLICT"); } } export class BadRequestError extends AppError { constructor(message: string) { - super(message, 400); + super(message, 400, "BAD_REQUEST"); + } +} + +export class RateLimitError extends AppError { + constructor(message = "Too many requests, please try again later") { + super(message, 429, "RATE_LIMIT_EXCEEDED"); + } +} + +export class InternalError extends AppError { + constructor(message = "Internal server error") { + super(message, 500, "INTERNAL_ERROR", false); } } From a29545adce645ebafd0e111f0dad1bcfb670a581 Mon Sep 17 00:00:00 2001 From: SweetBoy-eth Date: Sat, 11 Jul 2026 12:18:31 +0100 Subject: [PATCH 10/20] feat(#27): enhance error handler with structured JSON logging --- src/middleware/errorHandler.ts | 53 ++++++++++++++++++++++++++++++---- 1 file changed, 48 insertions(+), 5 deletions(-) diff --git a/src/middleware/errorHandler.ts b/src/middleware/errorHandler.ts index 8477b5d..f6c56da 100644 --- a/src/middleware/errorHandler.ts +++ b/src/middleware/errorHandler.ts @@ -1,12 +1,43 @@ import type { Request, Response, NextFunction } from "express"; -import { AppError, ValidationError } from "../utils/AppError.js"; +import { AppError, ValidationError, InternalError } from "../utils/AppError.js"; -export function errorHandler(err: Error, _req: Request, res: Response, _next: NextFunction): void { +interface ErrorLogContext { + timestamp: string; + method: string; + path: string; + ip: string; + userId: string; + statusCode: number; + message: string; + code: string; + stack: string; +} + +function formatErrorLog(err: Error, req: Request, statusCode: number): ErrorLogContext { + const authReq = req as Request & { user?: { userId: string } }; + return { + timestamp: new Date().toISOString(), + method: req.method, + path: req.originalUrl, + ip: (req.headers["x-forwarded-for"] as string) ?? req.socket.remoteAddress ?? "unknown", + userId: authReq.user?.userId ?? "anonymous", + statusCode, + message: err.message, + code: err instanceof AppError ? err.code : "UNKNOWN", + stack: process.env["NODE_ENV"] !== "production" ? (err.stack ?? "") : "", + }; +} + +export function errorHandler(err: Error, req: Request, res: Response, _next: NextFunction): void { if (err instanceof ValidationError) { + const logContext = formatErrorLog(err, req, err.statusCode); + console.error("[ERROR]", JSON.stringify(logContext)); + res.status(err.statusCode).json({ success: false, error: { message: err.message, + code: err.code, errors: err.errors, }, }); @@ -14,16 +45,28 @@ export function errorHandler(err: Error, _req: Request, res: Response, _next: Ne } if (err instanceof AppError) { + const logContext = formatErrorLog(err, req, err.statusCode); + console.error("[ERROR]", JSON.stringify(logContext)); + res.status(err.statusCode).json({ success: false, - error: { message: err.message }, + error: { + message: err.message, + code: err.code, + }, }); return; } - console.error("Unhandled error:", err); + const internalErr = new InternalError(); + const logContext = formatErrorLog(err, req, 500); + console.error("[ERROR]", JSON.stringify(logContext)); + res.status(500).json({ success: false, - error: "Internal server error", + error: { + message: internalErr.message, + code: internalErr.code, + }, }); } From 49630c349b99964fb0161a11d7f0acc8bc7194a8 Mon Sep 17 00:00:00 2001 From: SweetBoy-eth Date: Sat, 11 Jul 2026 12:18:41 +0100 Subject: [PATCH 11/20] feat(#29): add audit logging to escrow operations --- src/controllers/escrow.controller.ts | 37 ++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/controllers/escrow.controller.ts b/src/controllers/escrow.controller.ts index c3d0279..ce6ee94 100644 --- a/src/controllers/escrow.controller.ts +++ b/src/controllers/escrow.controller.ts @@ -4,6 +4,7 @@ import { NotFoundError, ForbiddenError, BadRequestError } from "../utils/AppErro import type { AuthRequest } from "../middleware/auth.js"; import * as stellarService from "../services/stellar.service.js"; import { broadcastToUser, broadcastToEscrow } from "../services/socket.service.js"; +import { logAuditFromRequest } from "../services/audit.service.js"; const VALID_ESCROW_TRANSITIONS: Record = { PENDING: ["FUNDED", "REFUNDED"], @@ -78,6 +79,15 @@ export async function createEscrow(req: Request, res: Response): Promise { data: { status: "IN_ESCROW", contractId: escrow.contractId }, }); + await logAuditFromRequest(req, { + userId: authReq.user.userId, + action: "ESCROW_CREATED", + resource: "Escrow", + resourceId: escrow.id, + description: `Escrow created for invoice ${invoiceId} with amount ${invoice.amount} ${invoice.currency}`, + metadata: { invoiceId, amount: invoice.amount.toString(), currency: invoice.currency }, + }); + broadcastToUser(invoice.creatorId, "escrow:created", { escrowId: escrow.id, invoiceId, @@ -158,6 +168,15 @@ export async function fundEscrow(req: Request, res: Response): Promise { data: { status: "FUNDED", txHash }, }); + await logAuditFromRequest(req, { + userId: authReq.user.userId, + action: "ESCROW_FUNDED", + resource: "Escrow", + resourceId: id, + description: `Escrow funded with ${escrow.amount} ${escrow.currency}, txHash: ${txHash}`, + metadata: { amount: escrow.amount.toString(), currency: escrow.currency, txHash }, + }); + broadcastToEscrow(id, "escrow:stateChange", { escrowId: id, status: "FUNDED", @@ -240,6 +259,15 @@ export async function releaseEscrow(req: Request, res: Response): Promise data: { status: "COMPLETED", paidAt: new Date(), txHash }, }); + await logAuditFromRequest(req, { + userId: authReq.user.userId, + action: "ESCROW_RELEASED", + resource: "Escrow", + resourceId: id, + description: `Escrow funds released: ${escrow.amount} ${escrow.currency} to freelancer, txHash: ${txHash}`, + metadata: { amount: escrow.amount.toString(), currency: escrow.currency, txHash, freelancerId: escrow.freelancerId }, + }); + broadcastToEscrow(id, "escrow:stateChange", { escrowId: id, status: "RELEASED", @@ -320,6 +348,15 @@ export async function refundEscrow(req: Request, res: Response): Promise { data: { status: "CANCELLED", txHash }, }); + await logAuditFromRequest(req, { + userId: authReq.user.userId, + action: "ESCROW_REFUNDED", + resource: "Escrow", + resourceId: id, + description: `Escrow refunded: ${escrow.amount} ${escrow.currency} to client, txHash: ${txHash}`, + metadata: { amount: escrow.amount.toString(), currency: escrow.currency, txHash, clientId: escrow.clientId }, + }); + broadcastToEscrow(id, "escrow:stateChange", { escrowId: id, status: "REFUNDED", From 47ec36b96bf254a2eea1ad6fb77931a51fa40c04 Mon Sep 17 00:00:00 2001 From: SweetBoy-eth Date: Sat, 11 Jul 2026 12:18:53 +0100 Subject: [PATCH 12/20] feat(#29): add audit logging to payment operations --- src/controllers/payment.controller.ts | 29 +++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/controllers/payment.controller.ts b/src/controllers/payment.controller.ts index 5fc05c4..6ac69e9 100644 --- a/src/controllers/payment.controller.ts +++ b/src/controllers/payment.controller.ts @@ -6,6 +6,7 @@ import { getPaginationParams, getPaginationMeta, getSkipTake } from "../utils/pa import * as stellarService from "../services/stellar.service.js"; import { getIO } from "../services/socket.service.js"; import type { CreatePaymentInput, PaymentWebhookInput } from "../validators/payment.schema.js"; +import { logAuditFromRequest } from "../services/audit.service.js"; export async function createPayment(req: Request, res: Response): Promise { const authReq = req as AuthRequest; @@ -46,6 +47,15 @@ export async function createPayment(req: Request, res: Response): Promise }, }); + await logAuditFromRequest(req, { + userId: authReq.user.userId, + action: "PAYMENT_CREATED", + resource: "Payment", + resourceId: payment.id, + description: `Payment created: ${amount} ${currency ?? "USDC"}, txHash: ${txHash}`, + metadata: { amount, currency, txHash, escrowId }, + }); + res.status(201).json({ success: true, data: { payment }, @@ -132,6 +142,7 @@ export async function getPaymentById(req: Request, res: Response): Promise } export async function verifyPayment(req: Request, res: Response): Promise { + const authReq = req as AuthRequest; const { txHash } = req.body; const payment = await prisma.payment.findUnique({ where: { txHash } }); @@ -164,6 +175,15 @@ export async function verifyPayment(req: Request, res: Response): Promise }, }); + await logAuditFromRequest(req, { + userId: authReq.user.userId, + action: verification.success ? "PAYMENT_VERIFIED" : "PAYMENT_FAILED", + resource: "Payment", + resourceId: payment.id, + description: `Payment ${verification.success ? "verified" : "failed"}: txHash ${txHash}`, + metadata: { txHash, status: verification.success ? "SUCCESS" : "FAILED" }, + }); + if (verification.success) { const io = getIO(); if (io) { @@ -214,6 +234,15 @@ export async function handlePaymentWebhook(req: Request, res: Response): Promise }, }); + await logAuditFromRequest(req, { + userId: payment.userId, + action: status === "CONFIRMED" ? "PAYMENT_VERIFIED" : "PAYMENT_FAILED", + resource: "Payment", + resourceId: payment.id, + description: `Payment webhook: status=${status}, confirmations=${confirmations ?? "N/A"}, ledger=${ledger ?? "N/A"}`, + metadata: { txHash, status, confirmations, ledger }, + }); + const io = getIO(); if (io) { io.to(`user:${payment.userId}`).emit("payment:confirmed", { From cafb5ea5c0f988a3951141a56fe740e7972838a5 Mon Sep 17 00:00:00 2001 From: SweetBoy-eth Date: Sat, 11 Jul 2026 12:19:07 +0100 Subject: [PATCH 13/20] feat(#29): add audit logging to invoice operations --- src/controllers/invoice.controller.ts | 37 +++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/controllers/invoice.controller.ts b/src/controllers/invoice.controller.ts index b725991..0d3b506 100644 --- a/src/controllers/invoice.controller.ts +++ b/src/controllers/invoice.controller.ts @@ -4,6 +4,7 @@ import { NotFoundError, ForbiddenError, BadRequestError } from "../utils/AppErro import type { AuthRequest } from "../middleware/auth.js"; import { getPaginationParams, getPaginationMeta, getSkipTake } from "../utils/pagination.js"; import { broadcastToUser } from "../services/socket.service.js"; +import { logAuditFromRequest } from "../services/audit.service.js"; const VALID_STATUS_TRANSITIONS: Record = { DRAFT: ["PENDING", "CANCELLED"], @@ -53,6 +54,15 @@ export async function createInvoice(req: Request, res: Response): Promise }, }); + await logAuditFromRequest(req, { + userId: authReq.user.userId, + action: "INVOICE_CREATED", + resource: "Invoice", + resourceId: invoice.id, + description: `Invoice created: ${title} for ${amount} ${currency ?? "USDC"}`, + metadata: { title, amount, currency, recipientId }, + }); + broadcastToUser(recipientId, "invoice:sent", { invoiceId: invoice.id, title: invoice.title, @@ -200,11 +210,29 @@ export async function updateInvoice(req: Request, res: Response): Promise }); if (status && status !== invoice.status) { + await logAuditFromRequest(req, { + userId: authReq.user.userId, + action: "INVOICE_STATUS_CHANGED", + resource: "Invoice", + resourceId: id, + description: `Invoice status changed: ${invoice.status} -> ${status}`, + metadata: { oldStatus: invoice.status, newStatus: status }, + }); + broadcastToUser(invoice.recipientId, "invoice:statusUpdate", { invoiceId: id, oldStatus: invoice.status, newStatus: status, }); + } else { + await logAuditFromRequest(req, { + userId: authReq.user.userId, + action: "INVOICE_UPDATED", + resource: "Invoice", + resourceId: id, + description: `Invoice updated`, + metadata: { fields: Object.keys(req.body).filter((k) => req.body[k] !== undefined) }, + }); } res.json({ @@ -230,6 +258,15 @@ export async function deleteInvoice(req: Request, res: Response): Promise throw new BadRequestError("Only draft invoices can be deleted"); } + await logAuditFromRequest(req, { + userId: authReq.user.userId, + action: "INVOICE_DELETED", + resource: "Invoice", + resourceId: id, + description: `Invoice deleted: ${invoice.title}`, + metadata: { title: invoice.title, amount: invoice.amount.toString() }, + }); + await prisma.invoice.delete({ where: { id } }); res.json({ From 6f77b66a63282db2cb3c98398d2e7722cf860d9d Mon Sep 17 00:00:00 2001 From: SweetBoy-eth Date: Sat, 11 Jul 2026 12:19:27 +0100 Subject: [PATCH 14/20] feat(#29): add audit logging to account modifications --- src/controllers/user.controller.ts | 32 +++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/src/controllers/user.controller.ts b/src/controllers/user.controller.ts index 2bb31e8..4e2ba93 100644 --- a/src/controllers/user.controller.ts +++ b/src/controllers/user.controller.ts @@ -1,7 +1,8 @@ import type { Request, Response } from "express"; import { prisma } from "../config/prisma.js"; -import { NotFoundError, ForbiddenError } from "../utils/errors.js"; +import { NotFoundError, ForbiddenError } from "../utils/AppError.js"; import type { AuthRequest } from "../middleware/auth.js"; +import { logAuditFromRequest } from "../services/audit.service.js"; function calculateProfileCompleteness(user: { fullname: string; @@ -34,7 +35,7 @@ export async function getProfile(req: Request, res: Response): Promise { }); if (!user) { - throw new NotFoundError("User not found"); + throw new NotFoundError("User"); } const completeness = calculateProfileCompleteness(user); @@ -101,6 +102,22 @@ export async function updateProfile(req: Request, res: Response): Promise const completeness = calculateProfileCompleteness(user); + const changedFields: string[] = []; + if (fullname) changedFields.push("fullname"); + if (email) changedFields.push("email"); + if (country) changedFields.push("country"); + if (walletAddress) changedFields.push("walletAddress"); + if (profileImage) changedFields.push("profileImage"); + + await logAuditFromRequest(req, { + userId: authReq.user.userId, + action: "ACCOUNT_UPDATED", + resource: "User", + resourceId: authReq.user.userId, + description: `Profile updated: ${changedFields.join(", ")}`, + metadata: { changedFields }, + }); + res.json({ success: true, data: { @@ -115,9 +132,18 @@ export async function deleteProfile(req: Request, res: Response): Promise const user = await prisma.user.findUnique({ where: { id: authReq.user.userId } }); if (!user) { - throw new NotFoundError("User not found"); + throw new NotFoundError("User"); } + await logAuditFromRequest(req, { + userId: authReq.user.userId, + action: "ACCOUNT_DELETED", + resource: "User", + resourceId: authReq.user.userId, + description: `Account deleted: ${user.email}`, + metadata: { email: user.email }, + }); + await prisma.user.delete({ where: { id: authReq.user.userId } }); res.json({ From 952d5033bcfd6e65c3543e9ce5f8dd183d13a6b0 Mon Sep 17 00:00:00 2001 From: SweetBoy-eth Date: Sat, 11 Jul 2026 12:19:40 +0100 Subject: [PATCH 15/20] feat(#29): add audit logging to auth operations (register, login) --- src/controllers/auth.controller.ts | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/controllers/auth.controller.ts b/src/controllers/auth.controller.ts index 4e6aa96..3147b1d 100644 --- a/src/controllers/auth.controller.ts +++ b/src/controllers/auth.controller.ts @@ -3,8 +3,9 @@ import bcrypt from "bcryptjs"; import jwt from "jsonwebtoken"; import { prisma } from "../config/prisma.js"; import { config } from "../config/index.js"; -import { ConflictError, UnauthorizedError, NotFoundError } from "../utils/errors.js"; +import { ConflictError, UnauthorizedError, NotFoundError } from "../utils/AppError.js"; import type { AuthRequest } from "../middleware/auth.js"; +import { logAuditFromRequest } from "../services/audit.service.js"; function generateTokens(payload: { userId: string; email: string; role: string }) { const accessToken = jwt.sign(payload, config.jwt.secret, { @@ -72,6 +73,15 @@ export async function register(req: Request, res: Response): Promise { setRefreshTokenCookie(res, tokens.refreshToken); + await logAuditFromRequest(req, { + userId: user.id, + action: "USER_REGISTERED", + resource: "User", + resourceId: user.id, + description: `New user registered: ${user.email} (${user.role})`, + metadata: { email: user.email, role: user.role }, + }); + res.status(201).json({ success: true, data: { @@ -103,6 +113,15 @@ export async function login(req: Request, res: Response): Promise { setRefreshTokenCookie(res, tokens.refreshToken); + await logAuditFromRequest(req, { + userId: user.id, + action: "USER_LOGIN", + resource: "User", + resourceId: user.id, + description: `User logged in: ${user.email}`, + metadata: { email: user.email }, + }); + res.json({ success: true, data: { @@ -151,7 +170,7 @@ export async function refreshToken(req: Request, res: Response): Promise { const user = await prisma.user.findUnique({ where: { id: decoded.userId } }); if (!user) { - throw new NotFoundError("User not found"); + throw new NotFoundError("User"); } const tokens = generateTokens({ @@ -190,7 +209,7 @@ export async function getMe(req: Request, res: Response): Promise { }); if (!user) { - throw new NotFoundError("User not found"); + throw new NotFoundError("User"); } res.json({ From 93837d56d0d9e9ce639a7f07e9b226347cea5a89 Mon Sep 17 00:00:00 2001 From: SweetBoy-eth Date: Sat, 11 Jul 2026 12:19:55 +0100 Subject: [PATCH 16/20] feat: register wallet and audit log routes in main app --- src/index.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/index.ts b/src/index.ts index 793c9c1..4ed9d11 100644 --- a/src/index.ts +++ b/src/index.ts @@ -14,6 +14,8 @@ import escrowRoutes from "./routes/escrow.routes.js"; import paymentRoutes from "./routes/payment.routes.js"; import notificationRoutes from "./routes/notification.routes.js"; import analyticsRoutes from "./routes/analytics.routes.js"; +import walletRoutes from "./routes/wallet.routes.js"; +import auditRoutes from "./routes/audit.routes.js"; import { errorHandler } from "./middleware/errorHandler.js"; import { globalLimiter, apiLimiter } from "./middleware/rateLimiter.js"; import { sanitizeBody, sanitizeQuery, sanitizeParams, validateContentType } from "./middleware/sanitize.js"; @@ -57,6 +59,8 @@ app.use("/api/escrows", apiLimiter, escrowRoutes); app.use("/api/payments", apiLimiter, paymentRoutes); app.use("/api/notifications", apiLimiter, notificationRoutes); app.use("/api/analytics", apiLimiter, analyticsRoutes); +app.use("/api/wallet", apiLimiter, walletRoutes); +app.use("/api/audit-logs", apiLimiter, auditRoutes); app.use(errorHandler); From a4a63947abfda666b92e0ca49d509ca675048ac1 Mon Sep 17 00:00:00 2001 From: SweetBoy-eth Date: Sat, 11 Jul 2026 12:50:52 +0100 Subject: [PATCH 17/20] fix: override @types/http-errors to 2.0.4 to fix Linux CI platform constraint --- package-lock.json | 1515 ++++++++++++++++++++++++--------------------- package.json | 3 + 2 files changed, 810 insertions(+), 708 deletions(-) diff --git a/package-lock.json b/package-lock.json index 462dfce..1ed0a3c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -99,6 +99,42 @@ "openapi-types": ">=7" } }, + "node_modules/@apidevtools/swagger-parser/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@apidevtools/swagger-parser/node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "license": "MIT", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/@apidevtools/swagger-parser/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, "node_modules/@aws-crypto/crc32": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", @@ -912,14 +948,14 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.4.1.tgz", "integrity": "sha512-mZ9NzzUSYPOCnxHH1oAHPRzoMFJHY472raDKwXl/+6oPbpdJ7g8LsCN4FSaIIfkiCKHhb3iF/Zqo3NYxaIhU7Q==", - "dev": true, + "devOptional": true, "license": "Apache-2.0" }, "node_modules/@electric-sql/pglite-socket": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@electric-sql/pglite-socket/-/pglite-socket-0.1.1.tgz", "integrity": "sha512-p2hoXw3Z3LQHwTeikdZNsFBOvXGqKY2hk51BBw+8NKND8eoH+8LFOtW9Z8CQKmTJ2qqGYu82ipqiyFZOTTXNfw==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "bin": { "pglite-server": "dist/scripts/server.js" @@ -932,7 +968,7 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/@electric-sql/pglite-tools/-/pglite-tools-0.3.1.tgz", "integrity": "sha512-C+T3oivmy9bpQvSxVqXA1UDY8cB9Eb9vZHL9zxWwEUfDixbXv4G3r2LjoTdR33LD8aomR3O9ZXEO3XEwr/cUCA==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "peerDependencies": { "@electric-sql/pglite": "0.4.1" @@ -1451,9 +1487,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", - "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.6.tgz", + "integrity": "sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA==", "dev": true, "license": "MIT", "dependencies": { @@ -1463,7 +1499,7 @@ "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^4.1.1", + "js-yaml": "^4.3.0", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" }, @@ -1474,43 +1510,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@eslint/eslintrc/node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@eslint/js": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.18.0.tgz", @@ -1562,7 +1561,7 @@ "version": "1.19.11", "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.11.tgz", "integrity": "sha512-dr8/3zEaB+p0D2n/IUrlPF1HZm586qgJNXK1a9fhg/PzdtkK7Ksd5l312tJX2yBuALqDYBlG20QEbayqPyxn+g==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=18.14.1" @@ -1657,7 +1656,7 @@ "version": "0.3.4", "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/@prisma/client": { @@ -1666,17 +1665,35 @@ "integrity": "sha512-HFp3Dawv/3sU3JtlPha90IB+48lS7zHiH4LKZPjmcE8YH5P9DOXGPvo8dqOtO7MqLDd1p2hOWMcFlRT1DMblHw==", "license": "Apache-2.0", "dependencies": { - "tslib": "^2.6.2" + "@prisma/client-runtime-utils": "7.8.0" }, "engines": { - "node": ">=18.0.0" + "node": "^20.19 || ^22.12 || >=24.0" + }, + "peerDependencies": { + "prisma": "*", + "typescript": ">=5.4.0" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + }, + "typescript": { + "optional": true + } } }, + "node_modules/@prisma/client-runtime-utils": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@prisma/client-runtime-utils/-/client-runtime-utils-7.8.0.tgz", + "integrity": "sha512-5NQZztQ0oY/ADFkmd9gPuweH5A1/CCY8YQPorLLO0Mu6a87mY5gsnDkzmFmIHs9NFaLnZojzgddFVN4RpKYrdw==", + "license": "Apache-2.0" + }, "node_modules/@prisma/config": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/@prisma/config/-/config-7.8.0.tgz", "integrity": "sha512-HFESzd9rx2ZQxlK+TL7tu1HPvCqrHiL6LCxYykI2c34mvaUuIVVl3lYuicJD/MNnzgPnyeBEMlK4WTomJCV5jw==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "dependencies": { "c12": "3.3.4", @@ -1689,14 +1706,14 @@ "version": "7.8.0", "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-7.8.0.tgz", "integrity": "sha512-p+QZReysDUqXC+mk17q9a+Y/qzh4c2KYliDK30buYUyfrGeTGSyfmc0AIrJRhZJrLHhRiJa9Au/J72h3C+szvA==", - "dev": true, + "devOptional": true, "license": "Apache-2.0" }, "node_modules/@prisma/dev": { "version": "0.24.3", "resolved": "https://registry.npmjs.org/@prisma/dev/-/dev-0.24.3.tgz", "integrity": "sha512-ffHlQuKXZiaDt9Go0OnCTdJZrHxK0k7omJKNV86/VjpsXu5EIHZLK0T7JSWgvNlJwh56kW9JFu9v0qJciFzepg==", - "dev": true, + "devOptional": true, "license": "ISC", "dependencies": { "@electric-sql/pglite": "0.4.1", @@ -1722,7 +1739,7 @@ "version": "7.8.0", "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-7.8.0.tgz", "integrity": "sha512-jx3rCnNNrt5uzbkKlegtQ2GZHxSlihMCzutgT/BP6UIDF1r9tDI39hV/0T/cHZgzJ3ELbuQPXlVZy+Y1n0pcgw==", - "dev": true, + "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { @@ -1736,14 +1753,14 @@ "version": "7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a", "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a.tgz", "integrity": "sha512-fJPQxCkLgA5EayWaW8eArgCvjJ+N+Kz3VyeNKMEeYiQC4alNkxRKFVAGxv/ZUzuJISKqdw+zGeDbS6mn6RCPOA==", - "dev": true, + "devOptional": true, "license": "Apache-2.0" }, "node_modules/@prisma/engines/node_modules/@prisma/get-platform": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-7.8.0.tgz", "integrity": "sha512-WlxgRGnolL8VH2EmkH1R/DkKNr/mVdS3G2h42IZFFZ3eUrH9OT6t73kIOSlkkrv50wG123Iq8d96ufv5LlZktw==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "dependencies": { "@prisma/debug": "7.8.0" @@ -1753,7 +1770,7 @@ "version": "7.8.0", "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-7.8.0.tgz", "integrity": "sha512-gwB0Euiz/DDRyxFRpLXYlK3RfaZUj1c5dAYMuhZYfApg7arknJlcb9bIsOHDppJmbqYaVA+yBIiFMDBfprsNPQ==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "dependencies": { "@prisma/debug": "7.8.0", @@ -1765,7 +1782,7 @@ "version": "7.8.0", "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-7.8.0.tgz", "integrity": "sha512-WlxgRGnolL8VH2EmkH1R/DkKNr/mVdS3G2h42IZFFZ3eUrH9OT6t73kIOSlkkrv50wG123Iq8d96ufv5LlZktw==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "dependencies": { "@prisma/debug": "7.8.0" @@ -1775,7 +1792,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-7.2.0.tgz", "integrity": "sha512-k1V0l0Td1732EHpAfi2eySTezyllok9dXb6UQanajkJQzPUGi3vO2z7jdkz67SypFTdmbnyGYxvEvYZdZsMAVA==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "dependencies": { "@prisma/debug": "7.2.0" @@ -1785,21 +1802,21 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-7.2.0.tgz", "integrity": "sha512-YSGTiSlBAVJPzX4ONZmMotL+ozJwQjRmZweQNIq/ER0tQJKJynNkRB3kyvt37eOfsbMCXk3gnLF6J9OJ4QWftw==", - "dev": true, + "devOptional": true, "license": "Apache-2.0" }, "node_modules/@prisma/query-plan-executor": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@prisma/query-plan-executor/-/query-plan-executor-7.2.0.tgz", "integrity": "sha512-EOZmNzcV8uJ0mae3DhTsiHgoNCuu1J9mULQpGCh62zN3PxPTd+qI9tJvk5jOst8WHKQNwJWR3b39t0XvfBB0WQ==", - "dev": true, + "devOptional": true, "license": "Apache-2.0" }, "node_modules/@prisma/streams-local": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/@prisma/streams-local/-/streams-local-0.1.2.tgz", "integrity": "sha512-l49yTxKKF2odFxaAXTmwmkBKL3+bVQ1tFOooGifu4xkdb9NMNLxHj27XAhTylWZod8I+ISGM5erU1xcl/oBCtg==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "dependencies": { "ajv": "^8.12.0", @@ -1816,7 +1833,7 @@ "version": "8.20.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -1833,14 +1850,14 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/@prisma/studio-core": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@prisma/studio-core/-/studio-core-0.27.3.tgz", "integrity": "sha512-AADjNFPdsrglxHQVTmHFqv6DuKQZ5WY4p5/gVFY017twvNrSwpLJ9lqUbYYxEu2W7nbvVxTZA8deJ8LseNALsw==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "dependencies": { "@radix-ui/react-toggle": "1.1.10", @@ -1860,14 +1877,14 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/@radix-ui/react-compose-refs": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", - "dev": true, + "devOptional": true, "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -1883,7 +1900,7 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@radix-ui/react-slot": "1.2.3" @@ -1907,7 +1924,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" @@ -1926,7 +1943,7 @@ "version": "1.1.10", "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.10.tgz", "integrity": "sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@radix-ui/primitive": "1.1.3", @@ -1952,7 +1969,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@radix-ui/react-use-effect-event": "0.0.2", @@ -1972,7 +1989,7 @@ "version": "0.0.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" @@ -1991,7 +2008,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", - "dev": true, + "devOptional": true, "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -2361,12 +2378,12 @@ "license": "Apache-2.0" }, "node_modules/@smithy/config-resolver": { - "version": "4.6.7", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.6.7.tgz", - "integrity": "sha512-NWzNW1fyLLJUh2pS/RhbrPQVWTaJOUJWFDyNK35MpoWRs61kc66hV3bjyk162/n/deEhs0aV7jtPq3UNp+kX5A==", + "version": "4.6.8", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.6.8.tgz", + "integrity": "sha512-jNAgbTd8u1bHkAu9fvIpq2rMVXTVm8DylDM59kUS9J94zBZLcdA7j+Vhc+RYg/8PVlNAPAQTGMjpgPqeYmRzcg==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", + "@smithy/core": "^3.29.3", "tslib": "^2.6.2" }, "engines": { @@ -2374,12 +2391,12 @@ } }, "node_modules/@smithy/core": { - "version": "3.29.2", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.29.2.tgz", - "integrity": "sha512-DXUk6yU0C1Q1tYvJh1VCtl8QOBcSoZpKwjTPkxT6A4MUQYHvgeKGByL8mrEdxnvhdf9nq5GyzmRb5n/vPgu3Lw==", + "version": "3.29.3", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.29.3.tgz", + "integrity": "sha512-L+Ys6ecjk5vwPMAKHBpPKlJ3DkqwNcnfEISXBZIsVvWG/XKXfsAP8mwIYlTeLcd2ElHdesPI8OuOmJSFAPhm6A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.16.0", + "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, "engines": { @@ -2387,13 +2404,13 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.4.7.tgz", - "integrity": "sha512-UEMLOoA0Fl4uYBxh6l0uN0H6EJe/A89OGeDNTteQeXpJ20BcpfIr4wlCY9pel1jEAUHAxaYwuqrYlrKdXE1GKQ==", + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.4.8.tgz", + "integrity": "sha512-q9J7JTiXrAhB8sDp4px97uEPT7CwKH61Co78grdNQvU8QZAdiuaSRhP0tUVf2ogy36RZTrlMU1rBmDEH+cnkiA==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", - "@smithy/types": "^4.16.0", + "@smithy/core": "^3.29.3", + "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, "engines": { @@ -2401,12 +2418,12 @@ } }, "node_modules/@smithy/eventstream-serde-browser": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.4.7.tgz", - "integrity": "sha512-l9UbuFbEeKItYk+PXl/mkXiWlXOCTIarbYVnd+9X7mKCWIMlZJ83UETq+mo7TVY7unISFkLSldViX5LdCiwhhQ==", + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.4.8.tgz", + "integrity": "sha512-2ZZe4NSupcDg2UKLpnsuBEOA9yLbZ9ZmYc64HCYPYbvBHg62P8+FUmzkhvwtXm9uLKM3MoUxHw2WID/QzNOe1Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", + "@smithy/core": "^3.29.3", "tslib": "^2.6.2" }, "engines": { @@ -2414,12 +2431,12 @@ } }, "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "4.5.7", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.5.7.tgz", - "integrity": "sha512-Q6wNRG7+zaMZEIKRYyYFnJqpC42mSN+F8ijX/61G7YHun+RGiRp0Cw2kuHmvXlIk0mxGAxCcgDWSTgUyfkunjw==", + "version": "4.5.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.5.8.tgz", + "integrity": "sha512-y08FJiync2Z2r5/srXEjo7GJVVpBHB8iNb5x3nYTaVqbQ9AjnUvU3C/0U00IEE+6g77JQJ66gC6XS+ZrAVLWnQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", + "@smithy/core": "^3.29.3", "tslib": "^2.6.2" }, "engines": { @@ -2427,12 +2444,12 @@ } }, "node_modules/@smithy/eventstream-serde-node": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.4.7.tgz", - "integrity": "sha512-A22v/VJNKr/9aCiLu2c2F2lljK5Bhr5FQr87cfUHednLvlLSw61dlmI7WB1YXy3XH8zOkebPw885U+qCZKVfYg==", + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.4.8.tgz", + "integrity": "sha512-wm8iDHlXpjmJVL8bcmjsW3mfgn4RVZKh2Wai6Ta1Vp/e+H7n1ZLobeBjFTqcJikbwx9prXz1QJzB5Z1h8YUZWg==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", + "@smithy/core": "^3.29.3", "tslib": "^2.6.2" }, "engines": { @@ -2440,13 +2457,13 @@ } }, "node_modules/@smithy/fetch-http-handler": { - "version": "5.6.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.6.4.tgz", - "integrity": "sha512-psnst7NZWdAEvJvyW8YZEE7xNVMyLrQFfHtyrVFrxNyy+dKWkQ+rqC6oI5ZhxThpUy9RSfEshgm34zqbOxzsRw==", + "version": "5.6.5", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.6.5.tgz", + "integrity": "sha512-SuqeisTyPoiIPtIYru/sGxGyXzmZ+8nnFOhC+qRPglt06Ebd1yH//CDltZB2J/3WBNVhwfUaZ0EtHB3cm2X32g==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", - "@smithy/types": "^4.16.0", + "@smithy/core": "^3.29.3", + "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, "engines": { @@ -2454,12 +2471,12 @@ } }, "node_modules/@smithy/hash-blob-browser": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.4.7.tgz", - "integrity": "sha512-UWYMgnZ6GXlG1DmWPxwwbCrG5tVVV2Cvk4B3xgKA4eY86NMHzfNz4k/KrbRVZagaNJxsv7EdCZEWcJyMbXayAg==", + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.4.8.tgz", + "integrity": "sha512-2CpwBLTKiO+SDXRET2aCQF4BTA+X7DY9fCk3LE2Vm2HUaRxcIRjfMJWZaUwvPEtPamMQ/ypXZNgSKQhE/geEew==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", + "@smithy/core": "^3.29.3", "tslib": "^2.6.2" }, "engines": { @@ -2467,12 +2484,12 @@ } }, "node_modules/@smithy/hash-node": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.4.7.tgz", - "integrity": "sha512-pOe7uMG2BYNrLRXO2tgbbZBIcc91nNMYuABhviq1obiA3oE94K8vbjKNw1xTwFtqQ6CVKf4ZennWX9x/iMILHA==", + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.4.8.tgz", + "integrity": "sha512-vJDrMFt3Q02naTTveiv1WFJpI1z6fEs+TH2UdcxNoJhqTFR1YNAz+rhwEDzgKGkqPF/0fhWl6SG6jePB1EgydQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", + "@smithy/core": "^3.29.3", "tslib": "^2.6.2" }, "engines": { @@ -2480,12 +2497,12 @@ } }, "node_modules/@smithy/hash-stream-node": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.4.7.tgz", - "integrity": "sha512-NLUmVCIe39vGG07LYCuswqGyy5uQ9qKi8/SAP/JO5o4aaPBD5tzOIaBnRQDR1bRtE3yVX4VVsn0oYZ4GVjXzXw==", + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.4.8.tgz", + "integrity": "sha512-Ep1oWvzaUI1AcL4uY9WDbCUMhvcuMINIYV/5J1A0LWZyMaitQ/8zX5GD1fAEsEZcX+YSSkEcqhyfYjz394r9Qw==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", + "@smithy/core": "^3.29.3", "tslib": "^2.6.2" }, "engines": { @@ -2493,12 +2510,12 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.4.7.tgz", - "integrity": "sha512-5orjhIf/iLBs92JSsrlOl8xNKlrCji7qLZgSwlMv9Y/36ufse187/ZMsjvOLt62C8DK9pflJkbb2XEaWk9PHAQ==", + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.4.8.tgz", + "integrity": "sha512-xqzcxU2pMl17yQ5bvJbsiiTua/wgt5VluguIOW9kCGCBhBazkwceLj9BlH883K0ASxZAhftvRmp7wTRg1ZbpKg==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", + "@smithy/core": "^3.29.3", "tslib": "^2.6.2" }, "engines": { @@ -2506,12 +2523,12 @@ } }, "node_modules/@smithy/is-array-buffer": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.4.7.tgz", - "integrity": "sha512-aUsQ7Rj6w6Z+BXd0GcActVDTDuN1IOoa9Ezez+8SUORDSsYwGC5aAuLZgKS0WqIpUrG6npTQwn5m/qvz1vaZdg==", + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.4.8.tgz", + "integrity": "sha512-RoxyFKZVk+UVz51s1PIyjtVUhwTYlAaT78Xpzix7w5gflovJoJO7eqFxWK0Vg3BM3EbPh8NPLlwLPXsiYdBXoA==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", + "@smithy/core": "^3.29.3", "tslib": "^2.6.2" }, "engines": { @@ -2519,12 +2536,12 @@ } }, "node_modules/@smithy/md5-js": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.4.7.tgz", - "integrity": "sha512-MefZM1nb5CcBppAP7OZaU7gG3UWlFZtJ7gk1pYIfCse0P3yJv+2fiJyrbgzmRyknZQR2DVV/8AORoHw7D9rSjw==", + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.4.8.tgz", + "integrity": "sha512-fT0Sdjr7cMyb0l13lRr32ItpDiHgMig2w/JFzYqyo7n7MsvXTpCmtCaNXEinm6+xK3Jn9gwiXUVLOkI66xJ9gQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", + "@smithy/core": "^3.29.3", "tslib": "^2.6.2" }, "engines": { @@ -2532,12 +2549,12 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.4.7.tgz", - "integrity": "sha512-OGI+bLL4LVmpBRtIfyhb1F2yHzl3y1WHvpeznCL8qIjeAkVPsWlWM8X/kXWR0QYQGE4n3qBuK+bMxKcSmck/ew==", + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.4.8.tgz", + "integrity": "sha512-qLNmtCNnB6kdZu5AiC9p7MrPJS9lFOjOKazpuDPkEqAPSAlAKq7ipgoyMLb1CBxi3rzNUcrvjvqo/B0lpsTxIw==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", + "@smithy/core": "^3.29.3", "tslib": "^2.6.2" }, "engines": { @@ -2545,12 +2562,12 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "4.6.7", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.6.7.tgz", - "integrity": "sha512-ZVFzOzD0bEeAjo9de+z3db2timojcN+HqkGbJn+/SUsEZFaFuyKTy1HUiwFoc+u+4cd1La42Bh5DxQa9F/BLoA==", + "version": "4.6.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.6.8.tgz", + "integrity": "sha512-9tOPEQz4g8Xv1t5UEwL0KmQ6Z4U4WS5Q1EXOSUePGt2pgqOWli7zLxmCFkZtEutZLSsIWtDHwbHyhVfclkMs1Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", + "@smithy/core": "^3.29.3", "tslib": "^2.6.2" }, "engines": { @@ -2558,12 +2575,12 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.7.7.tgz", - "integrity": "sha512-E4bXr1EIVPQWeQjiE9vxnry6bzJdpJwzGkxuUKu9VkbhpqLphOQqITf7fil3/wZIF4zv7y3IDxQSBg3ONU4IoQ==", + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.7.8.tgz", + "integrity": "sha512-oEPZ4i9E7h5GgtASPr6QoZdt8XCkjcjgj7lhEkWEHnMwUftz9FQ9FGOztek4wnoOuB1LxA6eO+gO1ORAGUeL6A==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", + "@smithy/core": "^3.29.3", "tslib": "^2.6.2" }, "engines": { @@ -2571,12 +2588,12 @@ } }, "node_modules/@smithy/middleware-serde": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.4.7.tgz", - "integrity": "sha512-c7eRsUnu9rb247g0yX7J8M1L54Z7yXN2+E75w7hzt/e6I3+my6mjcXCjRk7m8EVfDaaBzkIAL+jmxtNnJ3O3oQ==", + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.4.8.tgz", + "integrity": "sha512-qAH6hKorKtjV2lPiEOEB58edF/NvY29twTu1aGOwSQx8lGjhomF+Z7xpBhJH8v4IGUMSP0aUA+N9N4IpE9xpkg==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", + "@smithy/core": "^3.29.3", "tslib": "^2.6.2" }, "engines": { @@ -2584,12 +2601,12 @@ } }, "node_modules/@smithy/middleware-stack": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.4.7.tgz", - "integrity": "sha512-natyAbtQDssW0CkOz3zIu1jhLsHmtcT5hqDjIxqyIgob3LoXBZ8ricQh1KZTz94OBkbV/sbOunq8tL4DJRKTDg==", + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.4.8.tgz", + "integrity": "sha512-I8NOxdzliRUdniI4/QTEfXj5jonF2aILJOIGkcV4ZWeqMMP98ySKg4SeiIN1WAnLJUxjHNr7UnMUcPegxFtxMw==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", + "@smithy/core": "^3.29.3", "tslib": "^2.6.2" }, "engines": { @@ -2597,12 +2614,12 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "4.5.7", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.5.7.tgz", - "integrity": "sha512-GI0bRl40tgc3FG+U8HcIDH/rx+oKhL2Kk/WoO9zciip17lR5cv1ETLc+B708bep8UNDSuxx0L5eg76Kd637vCA==", + "version": "4.5.8", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.5.8.tgz", + "integrity": "sha512-Kran9kcysdZdoiVZQ3EXfHTbZ48kJ6Er2sZ4eHaL2LSsqVlucn/8xrgxj36/z9qlrToNGNf+na4u6xp1Nz08KQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", + "@smithy/core": "^3.29.3", "tslib": "^2.6.2" }, "engines": { @@ -2610,13 +2627,13 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.9.4.tgz", - "integrity": "sha512-BNTop/fSOptmoVk8g+efwHCofFh37g70OWGAFES1TeAAJja1K5aAI8rTE26ETSc5k8IQuWY2kAIoPla01NgYrA==", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.9.5.tgz", + "integrity": "sha512-bNqdxTQTxmLbomSmlkZFz8L6B/feQ2HHzw4L2zY7Ecp2XffYAZq2uzdWDdxJHJFbEvqd+SRuluJso0P8+xPdbw==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", - "@smithy/types": "^4.16.0", + "@smithy/core": "^3.29.3", + "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, "engines": { @@ -2624,12 +2641,12 @@ } }, "node_modules/@smithy/property-provider": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.4.7.tgz", - "integrity": "sha512-IbB2ZxlgJzzoYQ+LTRgN5frHwMBAlQcuEzZqCgixJz+daupgyP6PzNoxS394fRLQodJ9CncIqnLkvS8CxUkIBw==", + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.4.8.tgz", + "integrity": "sha512-1K3cVMiSnjiy4ht6+WmmevAOuYVwbrfSvKtIaoaK4brpERrv9B4dediHo1N1upvx2brt+s84e1SmAeCQm8hMqQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", + "@smithy/core": "^3.29.3", "tslib": "^2.6.2" }, "engines": { @@ -2637,12 +2654,12 @@ } }, "node_modules/@smithy/protocol-http": { - "version": "5.5.7", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.5.7.tgz", - "integrity": "sha512-l14/j6NWpfxt5lKJnyLK3DbCVf3jSOk3wjeIVAhQBFB/35G5SRcZ4urnrhUcOh0elK9SlyyeJ7poguJnk+ux2g==", + "version": "5.5.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.5.8.tgz", + "integrity": "sha512-SyFyL/ajuzJ79W+BpseFFbSz8/Rwj+QGqUlayeZE0jS2aCcjzV5tJBcbHgfypvSHpe7s2JmUHZmfpICaxwEs5g==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", + "@smithy/core": "^3.29.3", "tslib": "^2.6.2" }, "engines": { @@ -2650,12 +2667,12 @@ } }, "node_modules/@smithy/querystring-builder": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.4.7.tgz", - "integrity": "sha512-mj5EKTusnmJUQ1SxUxealNG8mlkwPPeKdUzGlOLy1CMor7qS19FW67HS0T7daUwHvyoXJo3hh4LLy97taJDNBA==", + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.4.8.tgz", + "integrity": "sha512-BF7L8ELX66L6g/WGWz0eAocp4i7xx51WbyDEnVffYP/s8q/+uFSCBpcOQlZGIQxpSrrhJnlBbS/xkIxYJKj+hg==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", + "@smithy/core": "^3.29.3", "tslib": "^2.6.2" }, "engines": { @@ -2663,12 +2680,12 @@ } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "4.6.7", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.6.7.tgz", - "integrity": "sha512-HuFyahA9L+fPKTBJ16Ep3XFXDhQKXDepWQknzkem7ptEqetsmw4wnYgZec67ohbZiJDrCGeMMqV+Tzn32Zg78w==", + "version": "4.6.8", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.6.8.tgz", + "integrity": "sha512-zsd1RYVrnWcByRhYrSYcDKCV9MfU5o33uSaksVkVgaeS6QMm6PMEa1AhKX0zrQrwsFVfpwhIbA3nxnFOLf61CA==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", + "@smithy/core": "^3.29.3", "tslib": "^2.6.2" }, "engines": { @@ -2676,13 +2693,13 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.6.3.tgz", - "integrity": "sha512-8qVKKzqh7naF27ePmx0SkUfnGP/wBI9dyaeAmhHvopnbIlItUAmB/e6PkPCU3rRb2v9BY8D4EZXSoydSibatvw==", + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.6.4.tgz", + "integrity": "sha512-B89bpf2t/y/wia6LZ+4JfHXYQT9PnVftsH05rgJKKIStS7r/4XSs9HOjtPoLtgcA6HCW9jVqX5DBbq7E0PAkiQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", - "@smithy/types": "^4.16.0", + "@smithy/core": "^3.29.3", + "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, "engines": { @@ -2690,13 +2707,13 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "4.14.7", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.14.7.tgz", - "integrity": "sha512-rBNjkHcoJG36/KsCxSxxEVaCH2BQS1vFX9nWj81jlBY/cnGN26WNXGjhmsQTNDUIs6CfazRxKhLKbopnUFfOsw==", + "version": "4.14.8", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.14.8.tgz", + "integrity": "sha512-hnZ6wFwLHQYL/+wdvT6qD1Fkiclobv7Y3iBB2fyfr+osJcD5n4IMAOPaIFUj7WgxOwU/e13FubyebUigzMLXCQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", - "@smithy/types": "^4.16.0", + "@smithy/core": "^3.29.3", + "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, "engines": { @@ -2716,12 +2733,12 @@ } }, "node_modules/@smithy/url-parser": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.4.7.tgz", - "integrity": "sha512-wLPh2YZTCYk29MrQ0JwgeSH94CxRhpYBoyd984TKbjLVzBbYF2WsDVgzexiixx8ruP3ZC5bkyMVdnDrsNXsbRw==", + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.4.8.tgz", + "integrity": "sha512-BcniaGClLgBsy5Jf7dfkoId8B4n/8oL3xBzVeF1/I252yZvyrxyKG7ZvcfCGTGEahSigsz40ujf6R/3G1U0kig==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", + "@smithy/core": "^3.29.3", "tslib": "^2.6.2" }, "engines": { @@ -2729,12 +2746,12 @@ } }, "node_modules/@smithy/util-base64": { - "version": "4.5.7", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.5.7.tgz", - "integrity": "sha512-ym4hJTY/k96tlghH3DkxA3/hCpArI/nYBTpz/ONLDeqiqYnoftRcL2N+VvD+oUn9tiOueyzZhchUNIzW9oEZWQ==", + "version": "4.5.8", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.5.8.tgz", + "integrity": "sha512-vJ3w2vD2BzEGbnMfaBcrtPXi37IUtG9qQgVasMRiF+Ef+0S5fMgaEFcwBGYg7RkN7wKBAcg2r+ulF/4aj3+VYw==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", + "@smithy/core": "^3.29.3", "tslib": "^2.6.2" }, "engines": { @@ -2742,12 +2759,12 @@ } }, "node_modules/@smithy/util-body-length-browser": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.4.7.tgz", - "integrity": "sha512-2jN2GrrSI6IrwyP/uZozWptr6f3Y/ml58rRlAhReJUNBYDtEhl2SSIDAMSgyXqJd0bknOoahPyY6fkHiBC1AHA==", + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.4.8.tgz", + "integrity": "sha512-o6rhfnt15hwj2/1KjQ0PsvdEpxG9TYzR8pk6K0XnrtUDCJcWREq6uCSVHboRsOdghdp3zaVY5CfYV+wUvDUdrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", + "@smithy/core": "^3.29.3", "tslib": "^2.6.2" }, "engines": { @@ -2755,12 +2772,12 @@ } }, "node_modules/@smithy/util-body-length-node": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.4.7.tgz", - "integrity": "sha512-ldx+YteHTjhl/VTsLLaFu2isfkNBEfR3t848gwfThiNN0NRKczFbtB9mb+G/VGPLdGXArq5eOcy6JHqZJQJ8zA==", + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.4.8.tgz", + "integrity": "sha512-HoShD7ykB2wBA98UyyKGLUUKmsHovubDzGmCmpMemrTCICKHdfMsUyngJFEPEiJ2ujtRDEgpQD04cDOYY9u9rQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", + "@smithy/core": "^3.29.3", "tslib": "^2.6.2" }, "engines": { @@ -2793,12 +2810,12 @@ } }, "node_modules/@smithy/util-config-provider": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.4.7.tgz", - "integrity": "sha512-vl+3Vd5xSAk03U3c6UsYxuspjerZ0UWMoGt7q/evrYZlpoOFOh5cd668EjgwJQjD/NxO373BwKyOc1WfxkW9pw==", + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.4.8.tgz", + "integrity": "sha512-OjkEu21jGJ5dI0PUoiSRjhmQJwXxnQbk3GDUoNkAADYsJFjx24PahQtIXYZuG+1tE/Y6Qpiqhz3xCz/yhpA4TA==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", + "@smithy/core": "^3.29.3", "tslib": "^2.6.2" }, "engines": { @@ -2806,12 +2823,12 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.5.7", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.5.7.tgz", - "integrity": "sha512-icBOGY6VPiouSBAgrDcFue4lSmA9sRBFixPXHZHFemtJI2ToTr/rqC5UZ7IkryU6BtKq9iRNxKte65kZSWI2Hg==", + "version": "4.5.8", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.5.8.tgz", + "integrity": "sha512-QjnRq1unlnaEq+z8ksNzg8Q6+IozO6z9QxyZXCKcarJquEfbqq4NZ2XQgYlCgQWK8f6GOyCdw84ju9E6GJDj9Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", + "@smithy/core": "^3.29.3", "tslib": "^2.6.2" }, "engines": { @@ -2819,12 +2836,12 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.4.7.tgz", - "integrity": "sha512-Ku08m2d4XvOfJP/OioSWVQcEI6cjM6ckICvZZtkQQSkzmSNbD2U84AoeI2EidLGtDdvQg/SzJvQKRwDiDscnsw==", + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.4.8.tgz", + "integrity": "sha512-xNA1Wfkpq8yQmICs1RyXze+ZUKrRP1YlTqDXFE9YAMUeDy+rTuTx/Id5NRzWpkTYqW7205VAHcy6lu/13JAEbg==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", + "@smithy/core": "^3.29.3", "tslib": "^2.6.2" }, "engines": { @@ -2832,12 +2849,12 @@ } }, "node_modules/@smithy/util-endpoints": { - "version": "3.6.7", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.6.7.tgz", - "integrity": "sha512-aht+6K3uq8NkwyXStSjhLVEr47ZEr7PRWPrJTwjs1x7Mm4LGzig4KbKS9MOBkTIQYdd3U1ECtSxHi/jOR8+6Zg==", + "version": "3.6.8", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.6.8.tgz", + "integrity": "sha512-KbkiYv00N9RbQVMm/k9ftoC9jWqCf+h9NBVN+ekbRKs5B+Dtzzkwhgfe1a+bn6ftaIkTF0V0d5IqGLb2ZL6Cvg==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", + "@smithy/core": "^3.29.3", "tslib": "^2.6.2" }, "engines": { @@ -2845,12 +2862,12 @@ } }, "node_modules/@smithy/util-middleware": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.4.7.tgz", - "integrity": "sha512-hphTZHV68oALHgY1yCziZoa77iQDwv24zcEhtysEb05x0lyoJtDGRl+ade7JtSPYnURZYQ8dVT0cNpxxrsjCgA==", + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.4.8.tgz", + "integrity": "sha512-+N4NUzQgfqSwj9weJMcdnTXc9qEKOm/3XgRApX2G0eLU/fWt22GXdVxEBobZXU20OglTAOMuiUiiyEQoJ693bw==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", + "@smithy/core": "^3.29.3", "tslib": "^2.6.2" }, "engines": { @@ -2858,12 +2875,12 @@ } }, "node_modules/@smithy/util-retry": { - "version": "4.5.7", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.5.7.tgz", - "integrity": "sha512-9sT0mEpLCV+RsW2vnUn0ebAHhRWApplndTs4Y0OAuvO0Zq5RDGUlzo0vCxFwji0xNZDAktUw9qgRjQ2Ir5f77Q==", + "version": "4.5.8", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.5.8.tgz", + "integrity": "sha512-fPHkNhF3rt3mJHarO7aKfBmGLMnu2NNfGlfCPm/EUNHPGkrdzsdIsPXEgjd+RSEt6FpI93wlMH1XdtaG/XdWWQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", + "@smithy/core": "^3.29.3", "tslib": "^2.6.2" }, "engines": { @@ -2871,12 +2888,12 @@ } }, "node_modules/@smithy/util-stream": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.7.7.tgz", - "integrity": "sha512-W9YlEcVnJejPaLRUJCX+zOLtJ2AFZ/Ol2BOlBoUKnPWrWuTWRdQmgkNAJBBAthHFrG+aE7OmhoqAtHITHHyGng==", + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.7.8.tgz", + "integrity": "sha512-YmIDkEKLkHEqqYK5AnaBtyS3jCSEIyRaAm9u7sPrYQHUGGQUjfpWT+KdyEBQnKeVpXQnIlG3GKIY2sdpv4xVpA==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", + "@smithy/core": "^3.29.3", "tslib": "^2.6.2" }, "engines": { @@ -2884,12 +2901,12 @@ } }, "node_modules/@smithy/util-utf8": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.4.7.tgz", - "integrity": "sha512-NskAyOBZcHO+fa1HwkwWuPbMUQE7NZ4IWBnAc71E4f9IdoQ65WLkdJ2ed/n4Q8vePSgZUN/CbyGZLBiI7dMI+w==", + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.4.8.tgz", + "integrity": "sha512-hwVELJTTRUqwrEvMI73PwsP27cO1HgkAKDoKelhMS3biTd8z5iXj76UF7oemuDba3X5eHZqjedeyBUhJLns+Kg==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", + "@smithy/core": "^3.29.3", "tslib": "^2.6.2" }, "engines": { @@ -2897,12 +2914,12 @@ } }, "node_modules/@smithy/util-waiter": { - "version": "4.5.7", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.5.7.tgz", - "integrity": "sha512-9NFs7MyxFBEQenFHrveJK/rirLSnYAgCMfAqKvvA+UlyzJCKFc51TYKbMUv5rGsM4bQ419Fw6KKgHc53QyJ30w==", + "version": "4.5.8", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.5.8.tgz", + "integrity": "sha512-NIDD7WY1PrRDNvI80N1dBTDZQ4vAiYln8zfbJ5dfZmtlqyP7aJNJqtuaZQXWd5mqy+NZKUvp+FgnEq2Hm4ebXA==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.2", + "@smithy/core": "^3.29.3", "tslib": "^2.6.2" }, "engines": { @@ -2919,7 +2936,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/@stellar/js-xdr": { @@ -2932,6 +2949,7 @@ "version": "13.1.0", "resolved": "https://registry.npmjs.org/@stellar/stellar-base/-/stellar-base-13.1.0.tgz", "integrity": "sha512-90EArG+eCCEzDGj3OJNoCtwpWDwxjv+rs/RNPhvg4bulpjN/CSRj+Ys/SalRcfM4/WRC5/qAfjzmJBAuquWhkA==", + "deprecated": "This package is now rolled into @stellar/stellar-sdk. Please use @stellar/stellar-sdk to continue receiving updates and support.", "license": "Apache-2.0", "dependencies": { "@stellar/js-xdr": "^3.1.2", @@ -2955,6 +2973,17 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, "node_modules/@types/chai": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", @@ -2966,6 +2995,16 @@ "assertion-error": "^2.0.1" } }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/cookie-parser": { "version": "1.4.10", "resolved": "https://registry.npmjs.org/@types/cookie-parser/-/cookie-parser-1.4.10.tgz", @@ -3006,31 +3045,30 @@ "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "^2" } }, - "node_modules/@types/express/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "node_modules/@types/express-serve-static-core": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.2.tgz", + "integrity": "sha512-d3KvEXBSo/lOAMc2u6fkyDHBvetBHeqD7wm/AcXfLpSOQwlmG9D/aQ0SFswVjv05p7ullQS7Mjohj6/VdbZuTg==", "dev": true, "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" } }, "node_modules/@types/http-errors": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", "dev": true, - "license": "MIT", - "os": [ - "darwin" - ] + "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.15", @@ -3045,28 +3083,8 @@ "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.63.0", - "eslint-visitor-keys": "^5.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@types/jsonwebtoken/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "@types/ms": "*", + "@types/node": "*" } }, "node_modules/@types/morgan": { @@ -3079,6 +3097,13 @@ "@types/node": "*" } }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/multer": { "version": "1.4.13", "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.13.tgz", @@ -3098,11 +3123,25 @@ "undici-types": ">=7.24.0 <7.24.7" } }, + "node_modules/@types/qs": { + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/react": { "version": "19.2.17", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", - "dev": true, + "devOptional": true, "license": "MIT", "peer": true, "dependencies": { @@ -3119,147 +3158,52 @@ "htmlparser2": "^10.1" } }, - "node_modules/@types/sanitize-html/node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", "dev": true, "license": "MIT", "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + "@types/node": "*" } }, - "node_modules/@types/sanitize-html/node_modules/dom-serializer/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "node_modules/@types/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*" } }, - "node_modules/@types/sanitize-html/node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "node_modules/@types/swagger-jsdoc": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/swagger-jsdoc/-/swagger-jsdoc-6.0.4.tgz", + "integrity": "sha512-W+Xw5epcOZrF/AooUM/PccNMSAFOKWZA5dasNyMujTwsBkU74njSJBpvCCJhHAJ95XRMzQrrW844Btu0uoetwQ==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" + "license": "MIT" }, - "node_modules/@types/sanitize-html/node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "node_modules/@types/swagger-ui-express": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@types/swagger-ui-express/-/swagger-ui-express-4.1.8.tgz", + "integrity": "sha512-AhZV8/EIreHFmBV5wAs0gzJUNq9JbbSXgJLQubCC0jtIo6prnI9MIRRxnU4MZX9RB9yXxF1V4R7jtLl/Wcj31g==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "@types/express": "*", + "@types/serve-static": "*" } }, - "node_modules/@types/sanitize-html/node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/@types/sanitize-html/node_modules/entities": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", - "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/@types/sanitize-html/node_modules/htmlparser2": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", - "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.2.2", - "entities": "^7.0.1" - } - }, - "node_modules/@types/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*" - } - }, - "node_modules/@types/swagger-jsdoc": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@types/swagger-jsdoc/-/swagger-jsdoc-6.0.4.tgz", - "integrity": "sha512-W+Xw5epcOZrF/AooUM/PccNMSAFOKWZA5dasNyMujTwsBkU74njSJBpvCCJhHAJ95XRMzQrrW844Btu0uoetwQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/swagger-ui-express": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@types/swagger-ui-express/-/swagger-ui-express-4.1.8.tgz", - "integrity": "sha512-AhZV8/EIreHFmBV5wAs0gzJUNq9JbbSXgJLQubCC0jtIo6prnI9MIRRxnU4MZX9RB9yXxF1V4R7jtLl/Wcj31g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", - "license": "MIT", - "dependencies": { - "@types/node": "*" + "@types/node": "*" } }, "node_modules/@typescript-eslint/eslint-plugin": { @@ -3450,6 +3394,29 @@ "typescript": ">=4.8.4 <6.1.0" } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", + "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { "version": "10.2.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", @@ -3538,33 +3505,6 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/mocker": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.7.tgz", - "integrity": "sha512-Trr0hYO9CM3Wj6ksWHRhK9IZpIY6wTMO5u/MqXurMxT57sWBaOPEtP3Oq60ihZuh5JsiagKfz95OcxdEP6dBrA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "3.2.7", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.17" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, "node_modules/@vitest/pretty-format": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.7.tgz", @@ -3685,9 +3625,10 @@ } }, "node_modules/ajv": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", - "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -3700,20 +3641,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ajv-draft-04": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", - "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", - "license": "MIT", - "peerDependencies": { - "ajv": "^8.5.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -3777,7 +3704,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz", "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 6.0.0" @@ -3915,7 +3842,7 @@ "version": "2.9.2", "resolved": "https://registry.npmjs.org/better-result/-/better-result-2.9.2.tgz", "integrity": "sha512-WIFoBPCdnTOdk9inkE1ZRvCZ4P0CpSkAiLlchC65N7n9DcjZ3NhqkBOlafzpOVnO8ixyi37kicmSJ3ENhPZl7Q==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/bignumber.js": { @@ -4041,7 +3968,7 @@ "version": "3.3.4", "resolved": "https://registry.npmjs.org/c12/-/c12-3.3.4.tgz", "integrity": "sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "chokidar": "^5.0.0", @@ -4177,7 +4104,7 @@ "version": "4.5.1", "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz", "integrity": "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@kurkle/color": "^0.3.0" @@ -4200,7 +4127,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "readdirp": "^5.0.0" @@ -4279,7 +4206,7 @@ "version": "0.2.4", "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/content-disposition": { @@ -4367,7 +4294,7 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, + "devOptional": true, "license": "MIT", "peer": true }, @@ -4424,7 +4351,7 @@ "version": "7.1.5", "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.5.tgz", "integrity": "sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==", - "dev": true, + "devOptional": true, "license": "BSD-3-Clause", "engines": { "node": ">=16.0.0" @@ -4451,7 +4378,7 @@ "version": "6.1.7", "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/delayed-stream": { @@ -4467,7 +4394,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "engines": { "node": ">=0.10" @@ -4486,7 +4413,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/doctrine": { @@ -4502,69 +4429,74 @@ } }, "node_modules/dom-serializer": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-3.1.1.tgz", - "integrity": "sha512-4MEa38/QexBob6gFNwu+EGdWvhJ1OKuNwdYY3Y3NyeWDQfnGeDYQUDfIRzWu5B5gsv03so2Uxd28YC6zrsx3Lw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, "license": "MIT", "dependencies": { - "domelementtype": "^3.0.0", - "domhandler": "^6.0.0", - "entities": "^8.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", "engines": { - "node": ">=20.19.0" + "node": ">=0.12" }, "funding": { - "type": "github", - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/domelementtype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-3.0.0.tgz", - "integrity": "sha512-umCQid3jKbDmVjx8jGaW7uUykm4DEUeyV21hPxNMo2nV955DhUThwqyOIDtreepP31hl84X7G5U9ZfsWvIB3Pg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/fb55" } ], - "license": "BSD-2-Clause", - "engines": { - "node": ">=20.19.0" - } + "license": "BSD-2-Clause" }, "node_modules/domhandler": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-6.0.1.tgz", - "integrity": "sha512-gYzvtM72ZtxQO0T048kd6HWSbbGCNOUwcnfQ01cqIJ4X2IYKFFHZ5mKvrQETcFXxsRObZulDaKmy//R7TPtsBg==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { - "domelementtype": "^3.0.0" + "domelementtype": "^2.3.0" }, "engines": { - "node": ">=20.19.0" + "node": ">= 4" }, "funding": { - "type": "github", "url": "https://github.com/fb55/domhandler?sponsor=1" } }, "node_modules/domutils": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-4.0.2.tgz", - "integrity": "sha512-qI4JLRKnSzqFqr7hAlS5xQDusBCjKSEG4t4+7aNrIQMHBcsC2TGEhuyABJdYkgSewL57PNLYEiibY2iPKhKpaA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { - "dom-serializer": "^3.0.0", - "domelementtype": "^3.0.0", - "domhandler": "^6.0.0" - }, - "engines": { - "node": ">=20.19.0" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" }, "funding": { - "type": "github", "url": "https://github.com/fb55/domutils?sponsor=1" } }, @@ -4613,7 +4545,7 @@ "version": "3.20.0", "resolved": "https://registry.npmjs.org/effect/-/effect-3.20.0.tgz", "integrity": "sha512-qMLfDJscrNG8p/aw+IkT9W7fgj50Z4wG5bLBy0Txsxz8iUHjDIkOgO3SV0WZfnQbNG2VJYb0b+rDLMrhM4+Krw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.0.0", @@ -4624,7 +4556,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz", "integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=14" @@ -4713,12 +4645,13 @@ } }, "node_modules/entities": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", - "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "dev": true, "license": "BSD-2-Clause", "engines": { - "node": ">=20.19.0" + "node": ">=0.12" }, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" @@ -4728,7 +4661,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -4939,65 +4872,28 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", - "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -5151,14 +5047,14 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.0.tgz", "integrity": "sha512-D+42+T12DdIlJM3uepa55qGiL3sYdLBOxIl2ifQCzCHz4c7eiolaHsi3BIqEr7JxBzxv2pYZQX9kw16ziMcEmw==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/fast-check": { "version": "3.23.2", "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.23.2.tgz", "integrity": "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==", - "dev": true, + "devOptional": true, "funding": [ { "type": "individual", @@ -5187,6 +5083,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { @@ -5197,10 +5094,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", - "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", - "dev": true, + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.3.tgz", + "integrity": "sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==", "funding": [ { "type": "github", @@ -5235,6 +5131,24 @@ "fxparser": "src/cli/cli.js" } }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/feaxios": { "version": "0.0.23", "resolved": "https://registry.npmjs.org/feaxios/-/feaxios-0.0.23.tgz", @@ -5450,7 +5364,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "is-property": "^1.0.2" @@ -5484,7 +5398,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-3.2.0.tgz", "integrity": "sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/get-proto": { @@ -5504,7 +5418,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/giget/-/giget-3.3.0.tgz", "integrity": "sha512-gzi2D96p+AMfDcmJHGDj3KJ9NRiwvlFAU5yfa3ROwWZmFUjX4P43x3BcyRaOMMLto1vUo7C+86+MFhYTl6Ryiw==", - "dev": true, + "devOptional": true, "license": "MIT", "bin": { "giget": "dist/cli.mjs" @@ -5534,6 +5448,19 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/glob/node_modules/balanced-match": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", @@ -5599,21 +5526,21 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, + "devOptional": true, "license": "ISC" }, "node_modules/grammex": { "version": "3.1.12", "resolved": "https://registry.npmjs.org/grammex/-/grammex-3.1.12.tgz", "integrity": "sha512-6ufJOsSA7LcQehIJNCO7HIBykfM7DXQual0Ny780/DEcJIpBlHRvcqEBWGPYd7hrXL2GJ3oJI1MIhaXjWmLQOQ==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/graphmatch": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/graphmatch/-/graphmatch-1.1.1.tgz", "integrity": "sha512-5ykVn/EXM1hF0XCaWh05VbYvEiOL2lY1kBxZtaYsyvjp7cmWOU1XsAdfQBwClraEofXDT197lFbXOEVMHpvQOg==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/has-flag": { @@ -5687,19 +5614,20 @@ } }, "node_modules/hono": { - "version": "4.12.28", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.28.tgz", - "integrity": "sha512-YwUvVpSF7m1yOblFPrU3Hbo8XhPheBoiyfGuII6z19LnOr6JpDnyyp7LFNrfV56wS8tpvtBFGRISHN02pDdLOA==", - "dev": true, + "version": "4.12.29", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.29.tgz", + "integrity": "sha512-1hNiRjawYrLq/4m3DQQjPGFg0VZkk4RjQJDff/excI6Dm9BiL75qxGrd7/c6YOxPdq6AscP3LiXhQ6fKFC1Waw==", + "devOptional": true, "license": "MIT", "engines": { "node": ">=16.9.0" } }, "node_modules/htmlparser2": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-12.0.0.tgz", - "integrity": "sha512-Tz7u1i95/g2x2jz81+x0FBVhBhY5aRTvD3tXXdFaljuNdzDLJ8UGNRrTcj2cgQvAg3iW/h77Fz15nLW0L0CrZw==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", + "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", + "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -5709,13 +5637,10 @@ ], "license": "MIT", "dependencies": { - "domelementtype": "^3.0.0", - "domhandler": "^6.0.0", - "domutils": "^4.0.2", - "entities": "^8.0.0" - }, - "engines": { - "node": ">=20.19.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "entities": "^7.0.1" } }, "node_modules/http-errors": { @@ -5742,7 +5667,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/https-proxy-agent": { @@ -5909,7 +5834,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/is-retry-allowed": { @@ -5970,7 +5895,7 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", - "dev": true, + "devOptional": true, "license": "MIT", "bin": { "jiti": "lib/jiti-cli.mjs" @@ -6016,6 +5941,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { @@ -6176,7 +6102,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", - "dev": true, + "devOptional": true, "license": "Apache-2.0" }, "node_modules/loupe": { @@ -6199,7 +6125,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.4.tgz", "integrity": "sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "bun": ">=1.0.0", @@ -6433,7 +6359,7 @@ "version": "3.15.3", "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.15.3.tgz", "integrity": "sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "aws-ssl-profiles": "^1.1.1", @@ -6454,7 +6380,7 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.6.tgz", "integrity": "sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "lru.min": "^1.1.0" @@ -6522,7 +6448,7 @@ "version": "2.0.11", "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/on-finished": { @@ -6695,7 +6621,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/pathval": { @@ -6712,7 +6638,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz", "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/pg": { @@ -6810,11 +6736,24 @@ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "license": "ISC" }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/pkg-types": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.1.tgz", "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "confbox": "^0.2.4", @@ -6863,7 +6802,7 @@ "version": "3.4.7", "resolved": "https://registry.npmjs.org/postgres/-/postgres-3.4.7.tgz", "integrity": "sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw==", - "dev": true, + "devOptional": true, "license": "Unlicense", "engines": { "node": ">=12" @@ -6926,7 +6865,7 @@ "version": "7.8.0", "resolved": "https://registry.npmjs.org/prisma/-/prisma-7.8.0.tgz", "integrity": "sha512-yfN4yrw7HV9kEJhoy1+jgah0jafEIQsf7uWouSsM8MvJtlubsk+kM7AIBWZ8+GJl74Yj3c+nbYqBkMOxtsZ3Lw==", - "dev": true, + "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { @@ -6960,7 +6899,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -6972,7 +6911,7 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, + "devOptional": true, "license": "ISC" }, "node_modules/proxy-addr": { @@ -7001,6 +6940,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -7010,7 +6950,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", - "dev": true, + "devOptional": true, "funding": [ { "type": "individual", @@ -7080,7 +7020,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/rc9/-/rc9-3.0.1.tgz", "integrity": "sha512-gMDyleLWVE+i6Sgtc0QbbY6pEKqYs97NGi6isHQPqYlLemPoO8dxQ3uGi0f4NiP98c+jMW6cG1Kx9dDwfvqARQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "defu": "^6.1.6", @@ -7091,7 +7031,7 @@ "version": "19.2.7", "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", - "dev": true, + "devOptional": true, "license": "MIT", "peer": true, "engines": { @@ -7102,7 +7042,7 @@ "version": "19.2.7", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", - "dev": true, + "devOptional": true, "license": "MIT", "peer": true, "dependencies": { @@ -7130,7 +7070,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 20.19.0" @@ -7144,7 +7084,7 @@ "version": "2.33.4", "resolved": "https://registry.npmjs.org/remeda/-/remeda-2.33.4.tgz", "integrity": "sha512-ygHswjlc/opg2VrtiYvUOPLjxjtdKvjGz1/plDhkG66hjNjFr1xmfrs2ClNFo/E6TyUFiwYNh53bKV26oBoMGQ==", - "dev": true, + "devOptional": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/remeda" @@ -7167,7 +7107,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -7187,7 +7126,7 @@ "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 4" @@ -7298,11 +7237,112 @@ "node": ">=22.12.0" } }, + "node_modules/sanitize-html/node_modules/dom-serializer": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-3.1.1.tgz", + "integrity": "sha512-4MEa38/QexBob6gFNwu+EGdWvhJ1OKuNwdYY3Y3NyeWDQfnGeDYQUDfIRzWu5B5gsv03so2Uxd28YC6zrsx3Lw==", + "license": "MIT", + "dependencies": { + "domelementtype": "^3.0.0", + "domhandler": "^6.0.0", + "entities": "^8.0.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/sanitize-html/node_modules/domelementtype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-3.0.0.tgz", + "integrity": "sha512-umCQid3jKbDmVjx8jGaW7uUykm4DEUeyV21hPxNMo2nV955DhUThwqyOIDtreepP31hl84X7G5U9ZfsWvIB3Pg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/sanitize-html/node_modules/domhandler": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-6.0.1.tgz", + "integrity": "sha512-gYzvtM72ZtxQO0T048kd6HWSbbGCNOUwcnfQ01cqIJ4X2IYKFFHZ5mKvrQETcFXxsRObZulDaKmy//R7TPtsBg==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^3.0.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/sanitize-html/node_modules/domutils": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-4.0.2.tgz", + "integrity": "sha512-qI4JLRKnSzqFqr7hAlS5xQDusBCjKSEG4t4+7aNrIQMHBcsC2TGEhuyABJdYkgSewL57PNLYEiibY2iPKhKpaA==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^3.0.0", + "domelementtype": "^3.0.0", + "domhandler": "^6.0.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/sanitize-html/node_modules/entities": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", + "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/sanitize-html/node_modules/htmlparser2": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-12.0.0.tgz", + "integrity": "sha512-Tz7u1i95/g2x2jz81+x0FBVhBhY5aRTvD3tXXdFaljuNdzDLJ8UGNRrTcj2cgQvAg3iW/h77Fz15nLW0L0CrZw==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^3.0.0", + "domhandler": "^6.0.0", + "domutils": "^4.0.2", + "entities": "^8.0.0" + }, + "engines": { + "node": ">=20.19.0" + } + }, "node_modules/scheduler": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "dev": true, + "devOptional": true, "license": "MIT", "peer": true }, @@ -7348,7 +7388,7 @@ "version": "0.0.5", "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==", - "dev": true + "devOptional": true }, "node_modules/serve-static": { "version": "2.2.1", @@ -7640,7 +7680,7 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -7666,7 +7706,7 @@ "version": "3.10.0", "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/stellar-sdk": { @@ -7706,6 +7746,19 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/strip-literal": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", @@ -7764,15 +7817,6 @@ "node": ">=20.0.0" } }, - "node_modules/swagger-jsdoc/node_modules/yaml": { - "version": "2.0.0-1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.0.0-1.tgz", - "integrity": "sha512-W7h5dEhywMKenDJh2iX/LABkbFnBxasD27oyXWDS/feDsxiw0dD5ncXdYXgkvAsXIY2MpW/ZKkr9IU30DBdMNQ==", - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, "node_modules/swagger-ui-dist": { "version": "5.32.8", "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.32.8.tgz", @@ -7828,37 +7872,6 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/tinypool": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", @@ -8030,7 +8043,7 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -8083,6 +8096,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" @@ -8104,7 +8118,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/valibot/-/valibot-1.2.0.tgz", "integrity": "sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg==", - "dev": true, + "devOptional": true, "license": "MIT", "peerDependencies": { "typescript": ">=5" @@ -8124,7 +8138,30 @@ "node": ">= 0.8" } }, - "node_modules/vite": { + "node_modules/vite-node": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", + "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.4.1", + "es-module-lexer": "^1.7.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-node/node_modules/vite": { "version": "7.3.6", "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.6.tgz", "integrity": "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==", @@ -8199,58 +8236,22 @@ } } }, - "node_modules/vite-node": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", - "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", + "node_modules/vite-node/node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.4.1", - "es-module-lexer": "^1.7.0", - "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" - }, + "license": "ISC", + "optional": true, + "peer": true, "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" + "yaml": "bin.mjs" }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", - "dev": true, - "license": "MIT", "engines": { - "node": ">=12" + "node": ">= 14.6" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/eemeli" } }, "node_modules/vitest": { @@ -8326,17 +8327,124 @@ } } }, - "node_modules/vitest/node_modules/picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "node_modules/vitest/node_modules/@vitest/mocker": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.7.tgz", + "integrity": "sha512-Trr0hYO9CM3Wj6ksWHRhK9IZpIY6wTMO5u/MqXurMxT57sWBaOPEtP3Oq60ihZuh5JsiagKfz95OcxdEP6dBrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "3.2.7", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/vite": { + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.6.tgz", + "integrity": "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==", "dev": true, "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0 || ^0.28.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.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 + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" } }, "node_modules/which": { @@ -8439,21 +8547,12 @@ } }, "node_modules/yaml": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", - "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", - "dev": true, + "version": "2.0.0-1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.0.0-1.tgz", + "integrity": "sha512-W7h5dEhywMKenDJh2iX/LABkbFnBxasD27oyXWDS/feDsxiw0dD5ncXdYXgkvAsXIY2MpW/ZKkr9IU30DBdMNQ==", "license": "ISC", - "optional": true, - "peer": true, - "bin": { - "yaml": "bin.mjs" - }, "engines": { - "node": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" + "node": ">= 6" } }, "node_modules/yocto-queue": { @@ -8473,7 +8572,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/zeptomatch/-/zeptomatch-2.1.0.tgz", "integrity": "sha512-KiGErG2J0G82LSpniV0CtIzjlJ10E04j02VOudJsPyPwNZgGnRKQy7I1R7GMyg/QswnE4l7ohSGrQbQbjXPPDA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "grammex": "^3.1.11", diff --git a/package.json b/package.json index 0e25f0e..5f47241 100644 --- a/package.json +++ b/package.json @@ -63,5 +63,8 @@ "typescript": "~6.0.3", "typescript-eslint": "^8.63.0", "vitest": "~3.2.0" + }, + "overrides": { + "@types/http-errors": "2.0.4" } } From f993e0bafe4a1c589ed329b8e26183d2a6c6113e Mon Sep 17 00:00:00 2001 From: SweetBoy-eth Date: Sat, 11 Jul 2026 12:58:55 +0100 Subject: [PATCH 18/20] fix: resolve type errors in audit logging metadata and strict type compliance --- src/controllers/invoice.controller.ts | 2 +- src/controllers/payment.controller.ts | 4 +-- src/controllers/user.controller.ts | 2 +- src/services/audit.service.ts | 42 +++++++++++++++++---------- 4 files changed, 30 insertions(+), 20 deletions(-) diff --git a/src/controllers/invoice.controller.ts b/src/controllers/invoice.controller.ts index 0d3b506..8ee2c08 100644 --- a/src/controllers/invoice.controller.ts +++ b/src/controllers/invoice.controller.ts @@ -231,7 +231,7 @@ export async function updateInvoice(req: Request, res: Response): Promise resource: "Invoice", resourceId: id, description: `Invoice updated`, - metadata: { fields: Object.keys(req.body).filter((k) => req.body[k] !== undefined) }, + metadata: { fields: Object.keys(req.body).filter((k) => req.body[k] !== undefined).join(",") }, }); } diff --git a/src/controllers/payment.controller.ts b/src/controllers/payment.controller.ts index 6ac69e9..b34841e 100644 --- a/src/controllers/payment.controller.ts +++ b/src/controllers/payment.controller.ts @@ -53,7 +53,7 @@ export async function createPayment(req: Request, res: Response): Promise resource: "Payment", resourceId: payment.id, description: `Payment created: ${amount} ${currency ?? "USDC"}, txHash: ${txHash}`, - metadata: { amount, currency, txHash, escrowId }, + metadata: { amount, currency: currency ?? "USDC", txHash, escrowId: escrowId ?? "" }, }); res.status(201).json({ @@ -240,7 +240,7 @@ export async function handlePaymentWebhook(req: Request, res: Response): Promise resource: "Payment", resourceId: payment.id, description: `Payment webhook: status=${status}, confirmations=${confirmations ?? "N/A"}, ledger=${ledger ?? "N/A"}`, - metadata: { txHash, status, confirmations, ledger }, + metadata: { txHash, status, confirmations: confirmations ?? 0, ledger: ledger ?? 0 }, }); const io = getIO(); diff --git a/src/controllers/user.controller.ts b/src/controllers/user.controller.ts index 4e2ba93..2bfb16e 100644 --- a/src/controllers/user.controller.ts +++ b/src/controllers/user.controller.ts @@ -115,7 +115,7 @@ export async function updateProfile(req: Request, res: Response): Promise resource: "User", resourceId: authReq.user.userId, description: `Profile updated: ${changedFields.join(", ")}`, - metadata: { changedFields }, + metadata: { changedFields: changedFields.join(",") }, }); res.json({ diff --git a/src/services/audit.service.ts b/src/services/audit.service.ts index 78257cb..932bf76 100644 --- a/src/services/audit.service.ts +++ b/src/services/audit.service.ts @@ -8,9 +8,9 @@ export interface AuditLogEntry { resource?: string; resourceId?: string; description: string; - ipAddress?: string; - userAgent?: string; - metadata?: Record; + ipAddress: string; + userAgent: string; + metadata?: Record; } export function getClientIp(req: Request): string { @@ -23,18 +23,28 @@ export function getClientIp(req: Request): string { export async function logAudit(entry: AuditLogEntry): Promise { try { - await prisma.auditLog.create({ - data: { - userId: entry.userId ?? null, - action: entry.action, - resource: entry.resource ?? null, - resourceId: entry.resourceId ?? null, - description: entry.description, - ipAddress: entry.ipAddress ?? null, - userAgent: entry.userAgent ?? null, - metadata: entry.metadata ?? undefined, - }, - }); + const data: { + userId: string | null; + action: AuditAction; + resource: string | null; + resourceId: string | null; + description: string; + ipAddress: string; + userAgent: string; + metadata?: Record; + } = { + userId: entry.userId ?? null, + action: entry.action, + resource: entry.resource ?? null, + resourceId: entry.resourceId ?? null, + description: entry.description, + ipAddress: entry.ipAddress, + userAgent: entry.userAgent, + }; + if (entry.metadata) { + data.metadata = entry.metadata; + } + await prisma.auditLog.create({ data }); } catch (error) { console.error("Failed to write audit log:", error); } @@ -47,7 +57,7 @@ export async function logAuditFromRequest( await logAudit({ ...entry, ipAddress: getClientIp(req), - userAgent: req.headers["user-agent"] ?? null, + userAgent: req.headers["user-agent"] ?? "", }); } From fc58724ede136698ce78f18c822f672403ab0d56 Mon Sep 17 00:00:00 2001 From: SweetBoy-eth Date: Sat, 11 Jul 2026 12:59:10 +0100 Subject: [PATCH 19/20] fix: remove unused imports from invoice routes --- src/routes/invoice.routes.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/routes/invoice.routes.ts b/src/routes/invoice.routes.ts index 32d0c49..e9292d0 100644 --- a/src/routes/invoice.routes.ts +++ b/src/routes/invoice.routes.ts @@ -1,7 +1,7 @@ import { Router } from "express"; -import { authenticate, authorize } from "../middleware/auth.js"; +import { authenticate } from "../middleware/auth.js"; import { validate } from "../middleware/validate.js"; -import { createInvoiceSchema, updateInvoiceSchema, invoiceQuerySchema } from "../validators/invoice.schema.js"; +import { createInvoiceSchema, updateInvoiceSchema } from "../validators/invoice.schema.js"; import { createInvoice, getInvoices, From 086334ef3cf9a63f67479d90348a7e93610dc68e Mon Sep 17 00:00:00 2001 From: SweetBoy-eth Date: Sat, 11 Jul 2026 13:08:07 +0100 Subject: [PATCH 20/20] fix: add missing sharp dependency for upload service typecheck --- package-lock.json | 569 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 1 + 2 files changed, 570 insertions(+) diff --git a/package-lock.json b/package-lock.json index 1ed0a3c..40c5ae9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,6 +24,7 @@ "multer": "~2.0.1", "pg": "~8.20.0", "sanitize-html": "~2.17.6", + "sharp": "~0.35.3", "socket.io": "~4.8.3", "stellar-sdk": "~13.3.0", "swagger-jsdoc": "~6.3.0", @@ -974,6 +975,16 @@ "@electric-sql/pglite": "0.4.1" } }, + "node_modules/@emnapi/runtime": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.2.tgz", + "integrity": "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", @@ -1636,6 +1647,506 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.3.tgz", + "integrity": "sha512-RMnFX7YQsMoh7lWfcM4NEHHymBX/rLuKNPVM84XE9ONPcaSCDgE7CHIHpSgPcO2xcRthgBy1HfNO319mwhIAkg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.3.2" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.3.tgz", + "integrity": "sha512-Xo+5uFBtLN0BKqieTxiFzFPQAUlBbbH5iBKyRX/z1JrbnYsHTfKJnUfL8+p2TPXr1pXqao4eeL4Rl144uDpK9w==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.3.2" + } + }, + "node_modules/@img/sharp-freebsd-wasm32": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.3.tgz", + "integrity": "sha512-lUxcqWIj2wMQ9BrwNjngcr1gWUr5xgaGThBRqPPalIC2n67Cqj1uPh8NnA/ZhAg8hUbKl+kVHKwgUIwe6ZYPrg==", + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "dependencies": { + "@img/sharp-wasm32": "0.35.3" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.2.tgz", + "integrity": "sha512-9J6ypZFpQBj4YnePGoq/S38w6nz+vqg5WZLrLGY4YuSemdMq47GMLBPO42MzwdGwpg/agZ7xzZcFHa48xlywfg==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.2.tgz", + "integrity": "sha512-m2pW1n6cns9VaubNwsZ+c3CRYjxNQWgJ5gPlnL1nbBcpkBvFm6SCFN5o0psFHI8w9n11NKhFkeEDns98tiqbEw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.2.tgz", + "integrity": "sha512-1eMLzy92I4J6rmi4mAT8yC3HxOtniyGELlzGbNMLLeqe052ahFQ0h6LFq+lh5DsDIdYViIDst08abvSbcEdLXQ==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.2.tgz", + "integrity": "sha512-dqVSFynCox4C/J8kT16V7SIFAns0IjgLwkvYT7p8LQVmJ5OS5b6tI9IGflxTeuBS//zXeFIUbwt5dwxyZ17cnA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.2.tgz", + "integrity": "sha512-3z0NHDxD6n5I9gc05U1eW1AyRm+Gznzq3naMrthPNqE6oYykcogW0l/jfpJdjYnuNl8R7yI9pNbE1XiUeyq0Aw==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.2.tgz", + "integrity": "sha512-bsb4rI+NldGOsXuej2r8OdSS8+zXDVaCWxyWrcv6kneTOlgAHtZABRzBBCwdsPiD90J4myNJuHpg6kA20ImW/w==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.2.tgz", + "integrity": "sha512-/ABshyj8gCpyIrNXnHn4LorDJ0HHm1VhXPBlxZ8zAtfVPAaSafXPGn+sUSIRiwaSBy0mmFjSjiXI5mkcwdChKQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.2.tgz", + "integrity": "sha512-ITPEtgffGJ0S6G9dRyw/366tJQqFRcHWPHhC+Stpg3Z8AEMrDrTr2lhdz4f/Y/HMbRh//7Z5mBzEpVdi62Oc3w==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.2.tgz", + "integrity": "sha512-zE9EdiUzUmg5mDT5a1rk5fYJ6GWPloTwWBYDS14naqHsL+EaMpDj1AWnpLgh3u0YCORv2Tt50wrcrpYqkP97Kw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.2.tgz", + "integrity": "sha512-m0lrLiUt+lBYnCFr8qV/65yMR4E/c7/wf78I5eKTdkEakFAlZ9QlzEM3QIhhAwVeUhLAHLcCq7a7Vszq/oFNZQ==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.3.tgz", + "integrity": "sha512-affVWCTLooy8TSxbDx2qkzuDeaWLNVBA+P//FNBirHsXpP2fuBhk5AuboYUnrDnzoXes8GFjpTx0SBFOCRg+FA==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.3.2" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.3.tgz", + "integrity": "sha512-QgKDspHPnrU+GQ55XPhGwyhC8acLVOOSyAvo1oVfFmrIXLkDNmGWzAfDZ4xK8oSA1qBQrALcHX0G5UZni/SuFQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.3.2" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.3.tgz", + "integrity": "sha512-sMd8rDxmpLOwv/7N44klFjOD5DUO7FLdjiXDI0hoxYaf7Ar262dQIEkosE98bps+5HPLtp/EvNqeqQtOycP/IA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.3.2" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.3.tgz", + "integrity": "sha512-0Eob78yjlYPfL5vMNWAW55l3R9Y6BQS/gOfe0ZcP9mEz9ohhKSt4im1hayiknXgf8AWrFqMvJcKIdmLmEe7yeQ==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.3.2" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.3.tgz", + "integrity": "sha512-KgAxQ0DxpNOq1rG2t5cgTgShJFGSuU7XO45cqC+1NVOuZnP6tlgZRuSYOfNupGkHID0o3cJOsw4DVeJpMovcGw==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.3.2" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.3.tgz", + "integrity": "sha512-8pqvxubL2PGdhlPy6GLqzDYMUjyRmKAwKHYKixpdJYBUK7PJ0C029XdsnpFIdgRZG68fZiGdHVWcKPvtiPB4cA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.3.2" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.3.tgz", + "integrity": "sha512-Vz0iQjzzcSX3HCbfwFfCSG/9SCIqyO0mH2sXyiHaAYfBk0cRsCWXRyQYX0ovCK/PAQBbTzQ0dsPQHh5MAFL59w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.3.2" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.3.tgz", + "integrity": "sha512-6O1NPKcDVj9QEdg7Hx549EX8U0rp6yXQERqru6yRN7fGBn32UvIRJUlWnk+8xDCiG76hXVBbX82NZ/ZKr0euIg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.3.2" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.3.tgz", + "integrity": "sha512-cZ0XkcYGpHZkqW6iCkqTcmUC0CD9DhD5d/qeZlZkfRBn6GnHniZXLUo5+9xw8Iv76YE6LQFN9YNBlKREcCG76w==", + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.11.1" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-webcontainers-wasm32": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.3.tgz", + "integrity": "sha512-2rnq7bX3NzeR2T4YWgz8qiG4h3TSdMe+vN1iQXpJleSJ3SM5zQ8Fy2SyyXAWlbxpEZ2Y+Z4u1BePgJEYbSy80Q==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/sharp-wasm32": "0.35.3" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.3.tgz", + "integrity": "sha512-4bPwFdMbeC4JQ8L8LOyWp6nsHcboP5fxkp6iPOXz2Vg49R42TuMs2whkJ5OAP4/Ul035qOzy0AecOF9VOscn4w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.3.tgz", + "integrity": "sha512-r53mXsBN6lFUDiST764SvgwUdHAqM4rPAiDzAmf4fLoB6X/rkfyTrLCg6+g17wJJiCmB3JYgHuUldCWUIRFSXw==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.3.tgz", + "integrity": "sha512-D4y1vNeZrIIJCN+uHaWVtH86B+aCrdMYYjicy9pXHvbGZeGYLLSd3wdVuC37FxVXlU1ARsk84eKWfWMXGYEqvA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@isaacs/cliui": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-9.0.0.tgz", @@ -4416,6 +4927,15 @@ "devOptional": true, "license": "MIT" }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -7452,6 +7972,55 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/sharp": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.35.3.tgz", + "integrity": "sha512-ej0zVHuZGHCiABXcNxeYhpRnPNPAcvbG8RMdBAhDAxLKkCRVSpK3Iyu7qbqw3JMzoj0REeM6f3tJLtVwl0023Q==", + "license": "Apache-2.0", + "dependencies": { + "@img/colour": "^1.1.0", + "detect-libc": "^2.1.2", + "semver": "^7.8.5" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.35.3", + "@img/sharp-darwin-x64": "0.35.3", + "@img/sharp-freebsd-wasm32": "0.35.3", + "@img/sharp-libvips-darwin-arm64": "1.3.2", + "@img/sharp-libvips-darwin-x64": "1.3.2", + "@img/sharp-libvips-linux-arm": "1.3.2", + "@img/sharp-libvips-linux-arm64": "1.3.2", + "@img/sharp-libvips-linux-ppc64": "1.3.2", + "@img/sharp-libvips-linux-riscv64": "1.3.2", + "@img/sharp-libvips-linux-s390x": "1.3.2", + "@img/sharp-libvips-linux-x64": "1.3.2", + "@img/sharp-libvips-linuxmusl-arm64": "1.3.2", + "@img/sharp-libvips-linuxmusl-x64": "1.3.2", + "@img/sharp-linux-arm": "0.35.3", + "@img/sharp-linux-arm64": "0.35.3", + "@img/sharp-linux-ppc64": "0.35.3", + "@img/sharp-linux-riscv64": "0.35.3", + "@img/sharp-linux-s390x": "0.35.3", + "@img/sharp-linux-x64": "0.35.3", + "@img/sharp-linuxmusl-arm64": "0.35.3", + "@img/sharp-linuxmusl-x64": "0.35.3", + "@img/sharp-webcontainers-wasm32": "0.35.3", + "@img/sharp-win32-arm64": "0.35.3", + "@img/sharp-win32-ia32": "0.35.3", + "@img/sharp-win32-x64": "0.35.3" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", diff --git a/package.json b/package.json index 5f47241..fb11964 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,7 @@ "multer": "~2.0.1", "pg": "~8.20.0", "sanitize-html": "~2.17.6", + "sharp": "~0.35.3", "socket.io": "~4.8.3", "stellar-sdk": "~13.3.0", "swagger-jsdoc": "~6.3.0",