diff --git a/.env.example b/.env.example index 2a3ed07..1e74002 100644 --- a/.env.example +++ b/.env.example @@ -2,6 +2,7 @@ DATABASE_URL= PORT= API_PREFIX= NODE_ENV= +RP_ID= GOOGLE_CLIENT_ID= GOOGLE_CLIENT_SECRET= MICROSOFT_CLIENT_ID= diff --git a/.swcrc b/.swcrc deleted file mode 100644 index 08b5bdf..0000000 --- a/.swcrc +++ /dev/null @@ -1,10 +0,0 @@ -{ - "$schema": "https://swc.rs/schema.json", - "jsc": { - "target": "es2020", - "parser": { "syntax": "typescript" }, - "baseUrl": ".", - "paths": { "@/*": ["app/*"] } - }, - "module": { "type": "commonjs" } -} diff --git a/README.md b/README.md index e4c8913..a3b4443 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,6 @@ Welcome to the Task Pro App Backend, the powerhouse behind the ultimate tool for managing your tasks efficiently. This backend repository handles all the server-side logic, data management, and API integrations needed to support Task Pro's seamless performance. -_Link to the swagger docs:_ https://api.taskpro.qzz.io/docs - _Link to the frontend repo:_ https://github.com/chertik77/TaskPro-frontend ## Features @@ -46,4 +44,4 @@ _Link to the frontend repo:_ https://github.com/chertik77/TaskPro-frontend ## Languages and Tools -![Languages and Tools](https://skills.syvixor.com/api/icons?i=nodejs,ts,expressjs,prisma,mongodb,swagger,cloudinary,redis,zod,betterauth,resend,githubactions,yarn,commitlint,eslint,prettier,postman,vscode&perline=9) +![Languages and Tools](https://skills.syvixor.com/api/icons?i=nodejs,ts,hono,prisma,mongodb,swagger,cloudinary,redis,zod,betterauth,resend,githubactions,yarn,commitlint,eslint,prettier,postman,vscode&perline=9) diff --git a/app/app.ts b/app/app.ts index 4670d8d..c2c85bc 100644 --- a/app/app.ts +++ b/app/app.ts @@ -1,30 +1,43 @@ -import express from 'express' -import { toNodeHandler } from 'better-auth/node' -import cookieParser from 'cookie-parser' -import cors from 'cors' -import helmet from 'helmet' -import logger from 'morgan' -import * as z from 'zod' +import type { AuthVariables } from './types' + +import { Hono } from 'hono' +import { cors } from 'hono/cors' +import { HTTPException } from 'hono/http-exception' +import { logger } from 'hono/logger' +import { secureHeaders } from 'hono/secure-headers' +import z from 'zod' import { env, zodConfig } from './config' import { auth } from './lib' -import { globalErrorHandler, notFoundHandler } from './middlewares' import { apiRouter } from './routes' -export const app = express() +export const app = new Hono<{ Variables: AuthVariables }>() z.config(zodConfig) -app.use(cors({ origin: env.ALLOWED_ORIGINS, credentials: true })) +app.use('*', logger()) +app.use('*', secureHeaders()) + +app.use('*', cors({ origin: env.ALLOWED_ORIGINS, credentials: true })) + +app.on(['GET', 'POST'], `${env.API_PREFIX}/auth/*`, c => + auth.handler(c.req.raw) +) + +app.route(env.API_PREFIX, apiRouter) -app.all(`${env.API_PREFIX}/auth/*splat`, toNodeHandler(auth)) +app.notFound(c => c.json({ status: 404, message: 'Not found' }, 404)) -app.use(helmet()) -app.use(logger(app.get('env') === 'development' ? 'dev' : 'combined')) -app.use(cookieParser()) -app.use(express.json()) +app.onError((err, c) => { + if (err instanceof HTTPException) return err.getResponse() -app.use(env.API_PREFIX, apiRouter) + console.error(err) -app.use(notFoundHandler) -app.use(globalErrorHandler) + return c.json( + { + status: err instanceof HTTPException ? err.status : 500, + message: err.message || 'Server error' + }, + err instanceof HTTPException ? err.status : 500 + ) +}) diff --git a/app/config/env.config.ts b/app/config/env.config.ts index f2f13ed..4d62523 100644 --- a/app/config/env.config.ts +++ b/app/config/env.config.ts @@ -1,7 +1,9 @@ -import 'dotenv/config' +import { loadEnvFile } from 'node:process' import * as z from 'zod' +loadEnvFile(process.cwd() + '/.env') + const envSchema = z.object({ CLOUDINARY_API_KEY: z.string(), CLOUDINARY_API_SECRET: z.string(), @@ -19,6 +21,7 @@ const envSchema = z.object({ REDIS_PORT: z.coerce.number().int().positive().min(1000).max(65535), PORT: z.coerce.number().int().positive().min(1000).max(65535), API_PREFIX: z.string().default(''), + RP_ID: z.hostname(), NODE_ENV: z.enum(['development', 'production']).default('development'), ALLOWED_ORIGINS: z .string() diff --git a/app/config/redis.config.ts b/app/config/redis.config.ts index f513d59..6e7a093 100644 --- a/app/config/redis.config.ts +++ b/app/config/redis.config.ts @@ -1,4 +1,4 @@ -import Redis from 'ioredis' +import { Redis } from 'ioredis' import { env } from './env.config' diff --git a/app/controllers/board.controller.ts b/app/controllers/board.controller.ts deleted file mode 100644 index f5c0544..0000000 --- a/app/controllers/board.controller.ts +++ /dev/null @@ -1,141 +0,0 @@ -import type { - BoardParamsSchema, - CreateBoardSchema, - UpdateBoardSchema -} from '@/schemas' -import type { - TypedRequest, - TypedRequestBody, - TypedRequestParams -} from '@/types' -import type { NextFunction, Request, Response } from 'express' -import type { ZodType } from 'zod' - -import { prisma } from '@/prisma' -import { NotFound } from 'http-errors' - -import { redisClient } from '@/config' -import boardImages from '@/data/board-bg-images.json' - -class BoardController { - getAll = async ({ user }: Request, res: Response) => { - const cacheKey = `boards:user:${user.id}:all` - - const cachedBoards = await redisClient.get(cacheKey) - - if (cachedBoards) { - res.json(JSON.parse(cachedBoards)) - } else { - const boards = await prisma.board.findMany({ where: { userId: user.id } }) - - await redisClient.set(cacheKey, JSON.stringify(boards), 'EX', 5 * 60) - - res.json(boards) - } - } - - getById = async ( - { user, params }: TypedRequestParams, - res: Response, - next: NextFunction - ) => { - const cacheKey = `board:${params.boardId}:user:${user.id}` - - const cachedBoard = await redisClient.get(cacheKey) - - if (cachedBoard) { - res.json(JSON.parse(cachedBoard)) - } else { - const board = await prisma.board.findUnique({ - where: { id: params.boardId, userId: user.id }, - include: { - columns: { - orderBy: { order: 'asc' }, - include: { - tasks: { include: { labels: true }, orderBy: { order: 'asc' } } - } - } - } - }) - - if (!board) return next(NotFound('Board not found')) - - await redisClient.set(cacheKey, JSON.stringify(board), 'EX', 5 * 60) - - res.json(board) - } - } - - create = async ( - { body, user }: TypedRequestBody, - res: Response - ) => { - const newBoard = await prisma.board.create({ - data: { - ...body, - userId: user.id, - background: { - identifier: body.background, - url: boardImages[body.background] - } - } - }) - - await redisClient.del(`boards:user:${user.id}:all`) - - res.json(newBoard) - } - - updateById = async ( - { - body, - params, - user - }: TypedRequest< - typeof BoardParamsSchema, - ZodType, - typeof UpdateBoardSchema - >, - res: Response, - next: NextFunction - ) => { - const updatedBoard = await prisma.board.updateIgnoreNotFound({ - where: { id: params.boardId, userId: user.id }, - data: { - ...body, - background: body.background - ? { - identifier: body.background, - url: boardImages[body.background] - } - : undefined - } - }) - - if (!updatedBoard) return next(NotFound('Board not found')) - - await redisClient.del(`board:${updatedBoard.id}:user:${user.id}`) - await redisClient.del(`boards:user:${user.id}:all`) - - res.json(updatedBoard) - } - - deleteById = async ( - { params, user }: TypedRequestParams, - res: Response, - next: NextFunction - ) => { - const deletedBoard = await prisma.board.deleteIgnoreNotFound({ - where: { id: params.boardId, userId: user.id } - }) - - if (!deletedBoard) return next(NotFound('Board not found')) - - await redisClient.del(`board:${deletedBoard.id}:user:${user.id}`) - await redisClient.del(`boards:user:${user.id}:all`) - - res.sendStatus(204) - } -} - -export const boardController = new BoardController() diff --git a/app/controllers/column.controller.ts b/app/controllers/column.controller.ts deleted file mode 100644 index 4b7c371..0000000 --- a/app/controllers/column.controller.ts +++ /dev/null @@ -1,137 +0,0 @@ -import type { - BoardParamsSchema, - ColumnParamsSchema, - CreateBoardSchema, - UpdateColumnOrderSchema, - UpdateColumnSchema -} from '@/schemas' -import type { TypedRequest, TypedRequestParams } from '@/types' -import type { NextFunction, Response } from 'express' -import type { ZodType } from 'zod' - -import { prisma } from '@/prisma' -import { BadRequest, NotFound } from 'http-errors' - -import { redisClient } from '@/config' - -class ColumnController { - create = async ( - { - params, - user, - body - }: TypedRequest< - typeof BoardParamsSchema, - ZodType, - typeof CreateBoardSchema - >, - res: Response, - next: NextFunction - ) => { - const board = await prisma.board.findUnique({ - where: { id: params.boardId, userId: user.id } - }) - - if (!board) return next(NotFound('Board not found')) - - const lastColumn = await prisma.column.findFirst({ - where: { boardId: board.id }, - orderBy: { order: 'desc' }, - select: { order: true } - }) - - const newOrder = lastColumn ? lastColumn.order + 1 : 1 - - const column = await prisma.column.create({ - data: { ...body, order: newOrder, boardId: board.id } - }) - - await redisClient.del(`board:${params.boardId}:user:${user.id}`) - - res.json(column) - } - - updateById = async ( - { - params, - body - }: TypedRequest< - typeof ColumnParamsSchema, - ZodType, - typeof UpdateColumnSchema - >, - res: Response, - next: NextFunction - ) => { - const updatedColumn = await prisma.column.updateIgnoreNotFound({ - where: { id: params.columnId }, - include: { board: { select: { userId: true } } }, - data: body - }) - - if (!updatedColumn) return next(NotFound('Column not found')) - - const { board, ...column } = updatedColumn - - await redisClient.del(`board:${updatedColumn.boardId}:user:${board.userId}`) - - res.json(column) - } - - updateOrder = async ( - { - params, - body - }: TypedRequest< - typeof BoardParamsSchema, - ZodType, - typeof UpdateColumnOrderSchema - >, - res: Response, - next: NextFunction - ) => { - const board = await prisma.board.findUnique({ - where: { id: params.boardId } - }) - - if (!board) return next(NotFound('Board not found')) - - const transaction = body.ids.map((id, order) => - prisma.column.update({ - where: { id }, - data: { order, boardId: board.id } - }) - ) - - try { - const updatedColumns = await prisma.$transaction(transaction) - - await redisClient.del(`board:${board.id}:user:${board.userId}`) - - res.json(updatedColumns) - } catch { - return next(BadRequest('Invalid order')) - } - } - - deleteById = async ( - { params }: TypedRequestParams, - res: Response, - next: NextFunction - ) => { - const deletedColumn = await prisma.column.deleteIgnoreNotFound({ - where: { id: params.columnId }, - include: { board: { select: { userId: true } } } - }) - - if (!deletedColumn) return next(NotFound('Column not found')) - - await redisClient.del( - `board:${deletedColumn.boardId}:user:${deletedColumn.board.userId}` - ) - - res.sendStatus(204) - } -} - -export const columnController = new ColumnController() diff --git a/app/controllers/index.ts b/app/controllers/index.ts deleted file mode 100644 index b30a1fc..0000000 --- a/app/controllers/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export { boardController } from './board.controller' -export { taskController } from './task.controller' -export { labelController } from './label.controller' -export { columnController } from './column.controller' -export { userController } from './user.controller' diff --git a/app/controllers/label.controller.ts b/app/controllers/label.controller.ts deleted file mode 100644 index 50b0f45..0000000 --- a/app/controllers/label.controller.ts +++ /dev/null @@ -1,93 +0,0 @@ -import type { - CreateLabelSchema, - LabelParamsSchema, - UpdateLabelSchema -} from '@/schemas' -import type { - TypedRequest, - TypedRequestBody, - TypedRequestParams -} from '@/types' -import type { NextFunction, Request, Response } from 'express' -import type { ZodType } from 'zod' - -import { prisma } from '@/prisma' -import { NotFound } from 'http-errors' - -import { redisClient } from '@/config' - -class LabelController { - getAll = async ({ user }: Request, res: Response) => { - const cacheKey = `labels:user:${user.id}` - - const cachedLabels = await redisClient.get(cacheKey) - - if (cachedLabels) { - res.json(JSON.parse(cachedLabels)) - } else { - const labels = await prisma.label.findMany({ where: { userId: user.id } }) - - await redisClient.set(cacheKey, JSON.stringify(labels), 'EX', 5 * 60) - - res.json(labels) - } - } - - createLabel = async ( - { body, user }: TypedRequestBody, - res: Response - ) => { - const { name, color } = body - - const label = await prisma.label.create({ - data: { name, color, userId: user.id } - }) - - await redisClient.del(`labels:user:${user.id}`) - - res.json(label) - } - - updateById = async ( - { - params, - body, - user - }: TypedRequest< - typeof LabelParamsSchema, - ZodType, - typeof UpdateLabelSchema - >, - res: Response, - next: NextFunction - ) => { - const updatedLabel = await prisma.label.updateIgnoreNotFound({ - where: { id: params.labelId, userId: user.id }, - data: body - }) - - if (!updatedLabel) return next(NotFound('Label not found')) - - await redisClient.del(`labels:user:${user.id}`) - - res.json(updatedLabel) - } - - deleteById = async ( - { params, user }: TypedRequestParams, - res: Response, - next: NextFunction - ) => { - const deletedLabel = await prisma.label.deleteIgnoreNotFound({ - where: { id: params.labelId, userId: user.id } - }) - - if (!deletedLabel) return next(NotFound('Label not found')) - - await redisClient.del(`labels:user:${user.id}`) - - res.sendStatus(204) - } -} - -export const labelController = new LabelController() diff --git a/app/controllers/task.controller.ts b/app/controllers/task.controller.ts deleted file mode 100644 index f9fa866..0000000 --- a/app/controllers/task.controller.ts +++ /dev/null @@ -1,163 +0,0 @@ -import type { - ColumnParamsSchema, - CreateTaskSchema, - TaskParamsSchema, - UpdateTaskOrderSchema, - UpdateTaskSchema -} from '@/schemas' -import type { TypedRequest, TypedRequestParams } from '@/types' -import type { NextFunction, Response } from 'express' -import type { ZodType } from 'zod' - -import { prisma } from '@/prisma' -import { BadRequest, NotFound } from 'http-errors' - -import { redisClient } from '@/config' - -class TaskController { - create = async ( - { - params, - body - }: TypedRequest< - typeof ColumnParamsSchema, - ZodType, - typeof CreateTaskSchema - >, - res: Response, - next: NextFunction - ) => { - const column = await prisma.column.findUnique({ - where: { id: params.columnId }, - include: { board: { select: { userId: true } } } - }) - - if (!column) return next(NotFound('Column not found')) - - const newOrder = await this.getNewTaskOrder(column.id) - - const newTask = await prisma.task.create({ - data: { - ...body, - columnId: column.id, - order: newOrder, - labels: { connect: body.labels?.map(id => ({ id })) } - }, - include: { labels: true } - }) - - await redisClient.del(`board:${column.boardId}:user:${column.board.userId}`) - - res.json(newTask) - } - - updateById = async ( - { - params, - body - }: TypedRequest, - res: Response, - next: NextFunction - ) => { - if (body.columnId) { - const column = await prisma.column.findUnique({ - where: { id: body.columnId } - }) - - if (!column) return next(NotFound('Column not found')) - } - - const updatedTask = await prisma.task.updateIgnoreNotFound({ - where: { id: params.taskId }, - data: { - ...body, - completedAt: body.completed ? new Date() : null, - labels: { set: body.labels?.map(id => ({ id })) } - }, - include: { - labels: true, - column: { include: { board: { select: { userId: true } } } } - } - }) - - if (!updatedTask) return next(NotFound('Task not found')) - - const { column, ...task } = updatedTask - - await redisClient.del(`board:${column.boardId}:user:${column.board.userId}`) - - res.json(task) - } - - updateOrder = async ( - { - params, - body - }: TypedRequest< - typeof ColumnParamsSchema, - ZodType, - typeof UpdateTaskOrderSchema - >, - res: Response, - next: NextFunction - ) => { - const column = await prisma.column.findUnique({ - where: { id: params.columnId }, - include: { board: { select: { userId: true } } } - }) - - if (!column) return next(NotFound('Column not found')) - - const transaction = body.ids.map((id, order) => - prisma.task.update({ - where: { id }, - data: { order, columnId: column.id } - }) - ) - - try { - const updatedTasks = await prisma.$transaction(transaction) - - await redisClient.del( - `board:${column.boardId}:user:${column.board.userId}` - ) - - res.json(updatedTasks) - } catch { - return next(BadRequest('Invalid order')) - } - } - - deleteById = async ( - { params }: TypedRequestParams, - res: Response, - next: NextFunction - ) => { - const deletedTask = await prisma.task.deleteIgnoreNotFound({ - where: { id: params.taskId }, - include: { column: { include: { board: { select: { userId: true } } } } } - }) - - if (!deletedTask) return next(NotFound('Task not found')) - - await redisClient.del( - `board:${deletedTask.column.boardId}:user:${deletedTask.column.board.userId}` - ) - - res.sendStatus(204) - } - - private getNewTaskOrder = async (columnId: string) => { - const lastTask = await prisma.task.findFirst({ - where: { columnId }, - orderBy: { order: 'desc' }, - select: { order: true } - }) - - const newOrder = lastTask ? lastTask.order + 1 : 1 - - return newOrder - } -} - -export const taskController = new TaskController() diff --git a/app/controllers/user.controller.ts b/app/controllers/user.controller.ts deleted file mode 100644 index a558b39..0000000 --- a/app/controllers/user.controller.ts +++ /dev/null @@ -1,134 +0,0 @@ -import type { NeedHelpSchema } from '@/schemas' -import type { TypedRequestBody } from '@/types' -import type { NextFunction, Response } from 'express' - -import { - supportRequestAdminTemplate, - supportRequestUserTemplate -} from '@/emails/templates' -import { InternalServerError } from 'http-errors' - -import { env, resend } from '@/config' - -class UserController { - // update = async ( - // { user, body, headers, file }: TypedRequestBody, - // res: Response, - // next: NextFunction - // ) => { - // // @ts-expect-error it exists - // const { imagePublicId } = user - // const { email, currentPassword, newPassword, ...data } = body - - // if (email) auth.api.changeEmail({ body: { newEmail: email } }) - - // if (currentPassword && newPassword) { - // auth.api.changePassword({ - // body: { currentPassword, newPassword } - // }) - // } - - // const updateData: Partial = data - - // if (file) { - // const extArr = ['jpeg', 'png', 'jpg', 'webp'] - // const ext = file.mimetype.split('/').pop() - - // if (!extArr.includes(ext!)) { - // return next( - // NotAcceptable( - // 'File must have .jpeg or .png or .jpg or .webp extension' - // ) - // ) - // } - - // try { - // const newImage = await uploadToCloudinary({ - // file: file.path, - // folder: 'TaskPro/user_avatars' - // }) - - // if (imagePublicId) { - // await cloudinary.uploader.destroy(imagePublicId, { - // type: 'upload', - // resource_type: 'image' - // }) - // } - - // updateData.image = newImage.url - // // @ts-expect-error it exists - // updateData.imagePublicId = newImage.public_id - // } catch { - // return next(InternalServerError('Uploading avatar error')) - // } - // } - - // console.log(updateData) - - // const updatedUser = await auth.api.updateUser({ - // headers: fromNodeHeaders(headers), - // body: updateData, - // asResponse: true - // }) - - // console.log(updatedUser) - - // res.json(updatedUser) - // } - - help = async ( - { body }: TypedRequestBody, - res: Response, - next: NextFunction - ) => { - const supportRequestAdmin = supportRequestAdminTemplate({ - email: body.email, - comment: body.comment - }) - - const supportRequestUser = supportRequestUserTemplate({ - comment: body.comment - }) - - const results = await Promise.allSettled([ - resend.emails.send({ - from: 'TaskPro ', - subject: '🆕 New Support Request', - to: env.RESEND_RECEIVER, - replyTo: body.email, - html: supportRequestAdmin - }), - - resend.emails.send({ - from: 'TaskPro ', - subject: 'Help Request', - to: body.email, - html: supportRequestUser - }) - ]) - - const [adminResult, userResult] = results - - const adminError = - adminResult.status === 'rejected' - ? adminResult.reason - : adminResult.value?.error - - const userError = - userResult.status === 'rejected' - ? userResult.reason - : userResult.value?.error - - if (adminError || userError) { - return next( - InternalServerError( - adminError?.message || userError?.message || 'Email sending failed' - ) - ) - } - - res.json({ message: 'Email sent' }) - } -} - -export const userController = new UserController() diff --git a/app/lib/auth.ts b/app/lib/auth.ts index 62122ed..a8e49a0 100644 --- a/app/lib/auth.ts +++ b/app/lib/auth.ts @@ -1,12 +1,14 @@ +import type { BetterAuthPlugin, Session } from 'better-auth' + +import { passkey } from '@better-auth/passkey' import { redisStorage } from '@better-auth/redis-storage' -import { Theme } from '@prisma/client' -import { betterAuth } from 'better-auth' +import { APIError, betterAuth } from 'better-auth' import { prismaAdapter } from 'better-auth/adapters/prisma' -import { openAPI } from 'better-auth/plugins' +import { createAuthEndpoint, createAuthMiddleware } from 'better-auth/api' import { env, redisClient } from '../config' import { prisma } from '../prisma' -import { mapMicrosoftProfileToUser } from './map-microsoft-profile-to-user' +import { mapMicrosoftProfileToUser, parseUserAgent } from '../utils' export const auth = betterAuth({ appName: 'Task Pro', @@ -26,14 +28,50 @@ export const auth = betterAuth({ databaseHooks: { user: { create: { - before: async user => ({ data: { ...user, emailVerified: true } }) + before: async user => ({ data: { ...user, emailVerified: true } }), + after: async user => { + const userId = user.id + await prisma.$transaction([ + prisma.userSettings.create({ data: { userId } }), + prisma.taskSettings.create({ data: { userId } }), + prisma.labelSettings.create({ data: { userId } }), + prisma.accessibilitySettings.create({ data: { userId } }) + ]) + } } } }, - user: { - additionalFields: { - theme: { type: Object.values(Theme), input: true }, - imagePublicId: { type: 'string', input: true } + hooks: { + after: createAuthMiddleware(async ctx => { + if (ctx.path.startsWith('/list-sessions')) { + const sessions = ctx.context.returned as Session[] | APIError + + if (sessions instanceof APIError) return ctx.context.returned + + const currentSession = ctx.context.session?.session + + const updatedSessions = sessions + .map(session => { + const { userAgent, ...rest } = session + const { browser, os } = parseUserAgent(userAgent) + + return { + ...rest, + browser, + os, + isCurrent: session.id === currentSession?.id + } + }) + .sort((a, b) => Number(b.isCurrent) - Number(a.isCurrent)) + + return updatedSessions + } + }) + }, + user: { additionalFields: { imagePublicId: { type: 'string' } } }, + account: { + accountLinking: { + trustedProviders: ['google', 'microsoft', 'email-password'] } }, emailAndPassword: { enabled: true, requireEmailVerification: false }, @@ -54,5 +92,44 @@ export const auth = betterAuth({ }, trustedOrigins: env.ALLOWED_ORIGINS, disabledPaths: ['/verify-email', '/send-verification-email'], - plugins: [openAPI({ disableDefaultReference: true })] + plugins: [ + revokeSessionByIdPLugin(), + passkey({ + rpID: env.RP_ID, + rpName: 'Task Pro', + advanced: { webAuthnChallengeCookie: 'task-pro-passkey' } + }) + ] }) + +function revokeSessionByIdPLugin() { + return { + id: 'revoke-session-id', + endpoints: { + revokeSessionById: createAuthEndpoint( + '/revoke-session-id', + { method: 'POST' }, + async ctx => { + if (!ctx.headers) return ctx.error(401, { message: 'Unauthorized' }) + + const cookieHeader = ctx.headers.get('cookie') + + const token = cookieHeader + ?.split('; ') + .find(cookie => cookie.startsWith('taskpro.session_token=')) + ?.split('=')[1] + + const decodedToken = token ? decodeURIComponent(token) : null + + if (!decodedToken) { + return ctx.error(404, { message: 'Token not found' }) + } + + await ctx.context.internalAdapter.deleteSession(decodedToken) + + return ctx.json({ success: true }) + } + ) + } + } satisfies BetterAuthPlugin +} diff --git a/app/lib/hono.ts b/app/lib/hono.ts new file mode 100644 index 0000000..786ab38 --- /dev/null +++ b/app/lib/hono.ts @@ -0,0 +1,15 @@ +import type { AuthVariables } from '@/types' + +import { OpenAPIHono } from '@hono/zod-openapi' + +import { requireAuth } from '@/middlewares' + +export const createProtectedRouter = () => { + const router = new OpenAPIHono<{ + Variables: AuthVariables + }>() + + router.use('*', requireAuth) + + return router +} diff --git a/app/lib/index.ts b/app/lib/index.ts index 4dc209f..c39b475 100644 --- a/app/lib/index.ts +++ b/app/lib/index.ts @@ -1,3 +1,2 @@ -export { mapMicrosoftProfileToUser } from './map-microsoft-profile-to-user' -export { uploadToCloudinary } from './upload-to-cloudinary' +export { createProtectedRouter } from './hono' export { auth } from './auth' diff --git a/app/lib/map-microsoft-profile-to-user.ts b/app/lib/map-microsoft-profile-to-user.ts deleted file mode 100644 index c85db06..0000000 --- a/app/lib/map-microsoft-profile-to-user.ts +++ /dev/null @@ -1,36 +0,0 @@ -import type { MicrosoftEntraIDProfile, User } from 'better-auth' - -import { prisma } from '@/prisma' - -import cloudinary from '@/config' - -import { uploadToCloudinary } from './upload-to-cloudinary' - -export const mapMicrosoftProfileToUser = async ( - profile: MicrosoftEntraIDProfile -): Promise> => { - const user = await prisma.user.findUnique({ - where: { email: profile.email } - }) - - const cleanedBase64 = profile.picture.trim().replace(/\s/g, '') - - const uploadedImage = await uploadToCloudinary({ - file: cleanedBase64, - folder: 'TaskPro/user_avatars' - }) - - if (user?.imagePublicId) { - await cloudinary.uploader.destroy(user.imagePublicId, { - type: 'upload', - resource_type: 'image' - }) - } - - return { - email: profile.email ?? profile.preferred_username ?? profile.upn, - image: uploadedImage.url, - // @ts-expect-error it exists - imagePublicId: uploadedImage.public_id - } -} diff --git a/app/middlewares/errorHandler.ts b/app/middlewares/errorHandler.ts deleted file mode 100644 index 3e767e2..0000000 --- a/app/middlewares/errorHandler.ts +++ /dev/null @@ -1,16 +0,0 @@ -import type { NextFunction, Request, Response } from 'express' -import type { HttpError } from 'http-errors' - -export const notFoundHandler = (_: Request, res: Response) => { - res.status(404).json({ message: 'Not found' }) -} - -export const globalErrorHandler = ( - err: HttpError, - _: Request, - res: Response, - __: NextFunction -) => { - const { status = 500, message = 'Server error' } = err - res.status(status).json({ statusCode: status, message }) -} diff --git a/app/middlewares/index.ts b/app/middlewares/index.ts index 9b58ba6..b127215 100644 --- a/app/middlewares/index.ts +++ b/app/middlewares/index.ts @@ -1,4 +1 @@ export { requireAuth } from './require-auth' -export { upload } from './multer' -export { validateRequest } from './validate-request' -export { notFoundHandler, globalErrorHandler } from './errorHandler' diff --git a/app/middlewares/multer.ts b/app/middlewares/multer.ts deleted file mode 100644 index 4dfa4a8..0000000 --- a/app/middlewares/multer.ts +++ /dev/null @@ -1,10 +0,0 @@ -import multer from 'multer' - -const storage = multer.diskStorage({ - filename: (_, file, cb) => { - const uniquePrefix = `${Date.now()}_${Math.round(Math.random() * 1e9)}` - cb(null, `${uniquePrefix}_${file.originalname}`) - } -}) - -export const upload = multer({ storage }) diff --git a/app/middlewares/require-auth.ts b/app/middlewares/require-auth.ts index 6b4e038..a91cceb 100644 --- a/app/middlewares/require-auth.ts +++ b/app/middlewares/require-auth.ts @@ -1,22 +1,22 @@ -import type { NextFunction, Request, Response } from 'express' +import type { AuthVariables } from '@/types' import { auth } from '@/lib' -import { fromNodeHeaders } from 'better-auth/node' -import { Unauthorized } from 'http-errors' +import { createMiddleware } from 'hono/factory' +import { HTTPException } from 'hono/http-exception' -export const requireAuth = async ( - req: Request, - _: Response, - next: NextFunction -) => { +export const requireAuth = createMiddleware<{ + Variables: AuthVariables +}>(async (c, next) => { const session = await auth.api.getSession({ - headers: fromNodeHeaders(req.headers) + headers: c.req.raw.headers }) - if (!session) return next(Unauthorized()) + if (!session) { + throw new HTTPException(401, { message: 'Unauthorized' }) + } - req.user = session.user - req.session = session.session + c.set('user', session.user) + c.set('session', session.session) - next() -} + await next() +}) diff --git a/app/middlewares/validate-request.ts b/app/middlewares/validate-request.ts deleted file mode 100644 index 6135142..0000000 --- a/app/middlewares/validate-request.ts +++ /dev/null @@ -1,57 +0,0 @@ -import type { RequestHandler } from 'express' -import type * as z from 'zod' - -import createHttpError from 'http-errors' - -type RequestValidation = { - params?: z.ZodType

- query?: z.ZodType - body?: z.ZodType -} - -export const validateRequest: ( - schemas: RequestValidation -) => RequestHandler = - ({ params, query, body }) => - (req, _, next) => { - const errors: Record = {} - - if (params) { - const parsed = params.safeParse(req.params) - - if (!parsed.success) { - parsed.error.issues.forEach(({ path, message }) => { - const errorPath = `${path.join('.')}` - errors[errorPath] = message - }) - } - } - - if (query) { - const parsed = query.safeParse(req.query) - - if (!parsed.success) { - parsed.error.issues.forEach(({ path, message }) => { - const errorPath = `${path.join('.')}` - errors[errorPath] = message - }) - } - } - - if (body) { - const parsed = body.safeParse(req.body) - - if (!parsed.success) { - parsed.error.issues.forEach(({ path, message }) => { - const errorPath = `${path.join('.')}` - errors[errorPath] = message - }) - } - } - - if (Object.keys(errors).length > 0) { - return next(createHttpError(400, { message: errors })) - } - - return next() - } diff --git a/app/redis/index.ts b/app/redis/index.ts new file mode 100644 index 0000000..33f2b09 --- /dev/null +++ b/app/redis/index.ts @@ -0,0 +1,3 @@ +export { invalidate } from './invalidation' +export { REDIS_TTL } from './ttl' +export { redisKeys } from './keys' diff --git a/app/redis/invalidation.ts b/app/redis/invalidation.ts new file mode 100644 index 0000000..6c02391 --- /dev/null +++ b/app/redis/invalidation.ts @@ -0,0 +1,36 @@ +import { redisClient } from '@/config' + +import { redisKeys } from './keys' + +export const invalidate = { + board(userId: string, boardId: string) { + return redisClient.del(redisKeys.boards.byId(boardId, userId)) + }, + + boardRelated(userId: string, boardId: string) { + return redisClient.del([ + redisKeys.boards.byId(boardId, userId), + redisKeys.boards.byUser(userId) + ]) + }, + + boardMany(userId: string, boardIds: string[]) { + if (!boardIds.length) return Promise.resolve() + + return redisClient.del( + boardIds.map(boardId => redisKeys.boards.byId(boardId, userId)) + ) + }, + + boards(userId: string) { + return redisClient.del(redisKeys.boards.byUser(userId)) + }, + + labels(userId: string) { + return redisClient.del(redisKeys.labels.byUser(userId)) + }, + + settings(userId: string) { + return redisClient.del(redisKeys.settings.byUser(userId)) + } +} diff --git a/app/redis/keys.ts b/app/redis/keys.ts new file mode 100644 index 0000000..7c1d1b5 --- /dev/null +++ b/app/redis/keys.ts @@ -0,0 +1,18 @@ +const APP_PREFIX = 'taskpro' + +const createKey = (...parts: (string | number)[]) => + [APP_PREFIX, ...parts].join(':') + +export const redisKeys = { + boards: { + byUser: (userId: string) => createKey('boards', 'user', userId, 'all'), + byId: (boardId: string, userId: string) => + createKey('board', boardId, 'user', userId) + }, + labels: { + byUser: (userId: string) => createKey('labels', 'user', userId) + }, + settings: { + byUser: (userId: string) => createKey('settings', 'user', userId) + } +} diff --git a/app/redis/ttl.ts b/app/redis/ttl.ts new file mode 100644 index 0000000..e2a57b9 --- /dev/null +++ b/app/redis/ttl.ts @@ -0,0 +1,5 @@ +export const REDIS_TTL = { + SHORT: 60, + DEFAULT: 5 * 60, + LONG: 60 * 60 +} as const diff --git a/app/routes/api/board.ts b/app/routes/api/board.ts deleted file mode 100644 index facd4da..0000000 --- a/app/routes/api/board.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Router } from 'express' - -import { boardController } from '@/controllers' - -import { requireAuth, validateRequest } from '@/middlewares' - -import { - BoardParamsSchema, - CreateBoardSchema, - UpdateBoardSchema -} from '@/schemas' - -export const boardRouter = Router() - -boardRouter.use(requireAuth) - -boardRouter.get('/', boardController.getAll) - -boardRouter.get( - '/:boardId', - validateRequest({ params: BoardParamsSchema }), - boardController.getById -) - -boardRouter.post( - '/', - validateRequest({ body: CreateBoardSchema }), - boardController.create -) - -boardRouter.patch( - '/:boardId', - validateRequest({ body: UpdateBoardSchema, params: BoardParamsSchema }), - boardController.updateById -) - -boardRouter.delete( - '/:boardId', - validateRequest({ params: BoardParamsSchema }), - boardController.deleteById -) diff --git a/app/routes/api/column.ts b/app/routes/api/column.ts deleted file mode 100644 index 8b3884b..0000000 --- a/app/routes/api/column.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Router } from 'express' - -import { columnController } from '@/controllers' - -import { requireAuth, validateRequest } from '@/middlewares' - -import { - BoardParamsSchema, - ColumnParamsSchema, - CreateColumnSchema, - UpdateColumnOrderSchema, - UpdateColumnSchema -} from '@/schemas' - -export const columnRouter = Router() - -columnRouter.use(requireAuth) - -columnRouter.post( - '/:boardId', - validateRequest({ body: CreateColumnSchema, params: BoardParamsSchema }), - columnController.create -) - -columnRouter.patch( - '/:columnId', - validateRequest({ body: UpdateColumnSchema, params: ColumnParamsSchema }), - columnController.updateById -) - -columnRouter.patch( - '/:boardId/order', - validateRequest({ body: UpdateColumnOrderSchema, params: BoardParamsSchema }), - columnController.updateOrder -) - -columnRouter.delete( - '/:columnId', - validateRequest({ params: ColumnParamsSchema }), - columnController.deleteById -) diff --git a/app/routes/api/label.ts b/app/routes/api/label.ts deleted file mode 100644 index 19973e4..0000000 --- a/app/routes/api/label.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Router } from 'express' - -import { labelController } from '@/controllers' - -import { requireAuth, validateRequest } from '@/middlewares' - -import { CreateLabelSchema } from '@/schemas' - -export const labelRouter = Router() - -labelRouter.use(requireAuth) - -labelRouter.get('/', labelController.getAll) - -labelRouter.post( - '/', - validateRequest({ body: CreateLabelSchema }), - labelController.createLabel -) - -labelRouter.patch('/:labelId', labelController.updateById) - -labelRouter.delete('/:labelId', labelController.deleteById) diff --git a/app/routes/api/task.ts b/app/routes/api/task.ts deleted file mode 100644 index bdad23b..0000000 --- a/app/routes/api/task.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Router } from 'express' - -import { taskController } from '@/controllers' - -import { requireAuth, validateRequest } from '@/middlewares' - -import { - ColumnParamsSchema, - CreateTaskSchema, - TaskParamsSchema, - UpdateTaskOrderSchema, - UpdateTaskSchema -} from '@/schemas' - -export const taskRouter = Router() - -taskRouter.use(requireAuth) - -taskRouter.post( - '/:columnId', - validateRequest({ body: CreateTaskSchema, params: ColumnParamsSchema }), - taskController.create -) - -taskRouter.patch( - '/:taskId', - validateRequest({ body: UpdateTaskSchema, params: TaskParamsSchema }), - taskController.updateById -) - -taskRouter.patch( - '/:columnId/order', - validateRequest({ body: UpdateTaskOrderSchema, params: ColumnParamsSchema }), - taskController.updateOrder -) - -taskRouter.delete( - '/:taskId', - validateRequest({ params: TaskParamsSchema }), - taskController.deleteById -) diff --git a/app/routes/api/user.ts b/app/routes/api/user.ts deleted file mode 100644 index 9c57b8f..0000000 --- a/app/routes/api/user.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Router } from 'express' - -import { userController } from '@/controllers' - -import { requireAuth, validateRequest } from '@/middlewares' - -import { NeedHelpSchema } from '@/schemas' - -export const userRouter = Router() - -userRouter.use(requireAuth) - -// userRouter.patch( -// '/', -// upload.single('avatar'), -// validateRequest({ body: UpdateUserSchema }), -// userController.update -// ) - -userRouter.post( - '/help', - validateRequest({ body: NeedHelpSchema }), - userController.help -) diff --git a/app/routes/board/openapi.ts b/app/routes/board/openapi.ts new file mode 100644 index 0000000..3c9726f --- /dev/null +++ b/app/routes/board/openapi.ts @@ -0,0 +1,112 @@ +import { createRoute, z } from '@hono/zod-openapi' + +import { + BadRequestResponse, + BoardParamsSchema, + BoardSchema, + CreateBoardSchema, + NotFoundResponse, + UnauthorizedResponse, + UpdateBoardSchema +} from '@/schemas' + +export const getAllBoardsRoute = createRoute({ + method: 'get', + path: '/', + operationId: 'getAllBoards', + tags: ['Board'], + summary: 'Get all boards', + security: [{ bearerAuth: [] }], + responses: { + 200: { + description: 'Success', + content: { + 'application/json': { + schema: z.array(BoardSchema.omit({ columns: true })) + } + } + }, + 401: UnauthorizedResponse + } +}) + +export const createBoardRoute = createRoute({ + method: 'post', + path: '/', + operationId: 'createBoard', + tags: ['Board'], + summary: 'Create new board', + security: [{ bearerAuth: [] }], + request: { + body: { + required: true, + content: { 'application/json': { schema: CreateBoardSchema } } + } + }, + responses: { + 201: { + description: 'Success', + content: { 'application/json': { schema: BoardSchema } } + }, + 400: BadRequestResponse, + 401: UnauthorizedResponse + } +}) + +export const getBoardByIdRoute = createRoute({ + method: 'get', + path: '/{boardId}', + operationId: 'getBoardById', + tags: ['Board'], + summary: 'Get board by id', + security: [{ bearerAuth: [] }], + request: { params: BoardParamsSchema }, + responses: { + 200: { + description: 'Success', + content: { 'application/json': { schema: BoardSchema } } + }, + 401: UnauthorizedResponse, + 404: NotFoundResponse + } +}) + +export const updateBoardRoute = createRoute({ + method: 'patch', + path: '/{boardId}', + operationId: 'updateBoard', + tags: ['Board'], + summary: 'Update board by id', + security: [{ bearerAuth: [] }], + request: { + params: BoardParamsSchema, + body: { + required: true, + content: { 'application/json': { schema: UpdateBoardSchema } } + } + }, + responses: { + 200: { + description: 'Success', + content: { 'application/json': { schema: BoardSchema } } + }, + 400: BadRequestResponse, + 401: UnauthorizedResponse, + 404: NotFoundResponse + } +}) + +export const deleteBoardRoute = createRoute({ + method: 'delete', + path: '/{boardId}', + operationId: 'deleteBoard', + tags: ['Board'], + summary: 'Delete board by id', + security: [{ bearerAuth: [] }], + request: { params: BoardParamsSchema }, + responses: { + 204: { description: 'The resource was deleted successfully.' }, + 401: UnauthorizedResponse, + 404: NotFoundResponse + } +}) diff --git a/app/routes/board/route.ts b/app/routes/board/route.ts new file mode 100644 index 0000000..71e6a4d --- /dev/null +++ b/app/routes/board/route.ts @@ -0,0 +1,66 @@ +import type { BoardSchema } from '@/schemas' +import type { z } from '@hono/zod-openapi' + +import { createProtectedRouter } from '@/lib' +import { boardService } from '@/services' + +import { + createBoardRoute, + deleteBoardRoute, + getAllBoardsRoute, + getBoardByIdRoute, + updateBoardRoute +} from './openapi' + +export const boardRouter = createProtectedRouter() + +boardRouter.openapi(getAllBoardsRoute, async c => { + const user = c.get('user') + + const boards = await boardService.getAll(user.id) + + return c.json(boards, 200) +}) + +boardRouter.openapi(getBoardByIdRoute, async c => { + const { boardId } = c.req.valid('param') + const user = c.get('user') + + const board = await boardService.getById(boardId, user.id) + + return c.json(board) +}) + +boardRouter.openapi(createBoardRoute, async c => { + const json = c.req.valid('json') + const user = c.get('user') + + const board = (await boardService.create(json, user.id)) as z.infer< + typeof BoardSchema + > + + return c.json(board, 201) +}) + +boardRouter.openapi(updateBoardRoute, async c => { + const { boardId } = c.req.valid('param') + const json = c.req.valid('json') + const user = c.get('user') + + const board = (await boardService.updateById( + json, + boardId, + user.id + )) as z.infer + + return c.json(board, 200) +}) + +boardRouter.openapi(deleteBoardRoute, async c => { + const { boardId } = c.req.valid('param') + const user = c.get('user') + + await boardService.deleteById(boardId, user.id) + + return c.body(null, 204) +}) diff --git a/app/routes/column/openapi.ts b/app/routes/column/openapi.ts new file mode 100644 index 0000000..485aed1 --- /dev/null +++ b/app/routes/column/openapi.ts @@ -0,0 +1,111 @@ +import { createRoute, z } from '@hono/zod-openapi' + +import { + BadRequestResponse, + BoardParamsSchema, + ColumnParamsSchema, + ColumnSchema, + CreateColumnSchema, + NotFoundResponse, + UnauthorizedResponse, + UpdateColumnSchema, + UpdateColumnsOrderSchema +} from '@/schemas' + +export const createColumnRoute = createRoute({ + method: 'post', + path: '/{boardId}', + operationId: 'createColumn', + tags: ['Column'], + summary: 'Create new column', + security: [{ bearerAuth: [] }], + request: { + params: BoardParamsSchema, + body: { + required: true, + content: { 'application/json': { schema: CreateColumnSchema } } + } + }, + responses: { + 201: { + description: 'Success', + content: { + 'application/json': { schema: ColumnSchema.omit({ tasks: true }) } + } + }, + 400: BadRequestResponse, + 401: UnauthorizedResponse, + 404: NotFoundResponse + } +}) + +export const updateColumnsOrderRoute = createRoute({ + method: 'patch', + path: '/{boardId}/order', + operationId: 'updateColumnsOrder', + tags: ['Column'], + summary: 'Update columns order', + security: [{ bearerAuth: [] }], + request: { + params: BoardParamsSchema, + body: { + required: true, + content: { 'application/json': { schema: UpdateColumnsOrderSchema } } + } + }, + responses: { + 200: { + description: 'Success', + content: { + 'application/json': { + schema: z.array(ColumnSchema.omit({ tasks: true })) + } + } + }, + 400: BadRequestResponse, + 401: UnauthorizedResponse, + 404: NotFoundResponse + } +}) + +export const updateColumnRoute = createRoute({ + method: 'patch', + path: '/{columnId}', + operationId: 'updateColumn', + tags: ['Column'], + summary: 'Update column by id', + security: [{ bearerAuth: [] }], + request: { + params: ColumnParamsSchema, + body: { + required: true, + content: { 'application/json': { schema: UpdateColumnSchema } } + } + }, + responses: { + 200: { + description: 'Success', + content: { + 'application/json': { schema: ColumnSchema.omit({ tasks: true }) } + } + }, + 400: BadRequestResponse, + 401: UnauthorizedResponse, + 404: NotFoundResponse + } +}) + +export const deleteColumnRoute = createRoute({ + method: 'delete', + path: '/{columnId}', + operationId: 'deleteColumn', + tags: ['Column'], + summary: 'Delete column by id', + security: [{ bearerAuth: [] }], + request: { params: ColumnParamsSchema }, + responses: { + 204: { description: 'The resource was deleted successfully.' }, + 401: UnauthorizedResponse, + 404: NotFoundResponse + } +}) diff --git a/app/routes/column/route.ts b/app/routes/column/route.ts new file mode 100644 index 0000000..e77a9e9 --- /dev/null +++ b/app/routes/column/route.ts @@ -0,0 +1,50 @@ +import { createProtectedRouter } from '@/lib' +import { columnService } from '@/services' + +import { + createColumnRoute, + deleteColumnRoute, + updateColumnRoute, + updateColumnsOrderRoute +} from './openapi' + +export const columnRouter = createProtectedRouter() + +columnRouter.openapi(createColumnRoute, async c => { + const { boardId } = c.req.valid('param') + const json = c.req.valid('json') + const user = c.get('user') + + const column = await columnService.create(json, boardId, user.id) + + return c.json(column, 201) +}) + +columnRouter.openapi(updateColumnRoute, async c => { + const { columnId } = c.req.valid('param') + const json = c.req.valid('json') + const user = c.get('user') + + const column = await columnService.updateById(json, columnId, user.id) + + return c.json(column, 200) +}) + +columnRouter.openapi(updateColumnsOrderRoute, async c => { + const { boardId } = c.req.valid('param') + const json = c.req.valid('json') + const user = c.get('user') + + const columns = await columnService.updateOrder(json, boardId, user.id) + + return c.json(columns, 200) +}) + +columnRouter.openapi(deleteColumnRoute, async c => { + const { columnId } = c.req.valid('param') + const user = c.get('user') + + await columnService.deleteById(columnId, user.id) + + return c.body(null, 204) +}) diff --git a/app/routes/index.ts b/app/routes/index.ts index c1cf972..e7ae6fb 100644 --- a/app/routes/index.ts +++ b/app/routes/index.ts @@ -1,47 +1,66 @@ -import fs from 'fs' -import path from 'path' -import type { SwaggerUiOptions } from 'swagger-ui-express' - -import { Router } from 'express' -import swaggerUi from 'swagger-ui-express' +import { swaggerUI } from '@hono/swagger-ui' +import { OpenAPIHono, z } from '@hono/zod-openapi' import { env } from '@/config' -import { boardRouter } from './api/board' -import { columnRouter } from './api/column' -import { labelRouter } from './api/label' -import { taskRouter } from './api/task' -import { userRouter } from './api/user' +import { boardRouter } from './board/route' +import { columnRouter } from './column/route' +import { labelRouter } from './label/route' +import { settingsRouter } from './settings/route' +import { taskRouter } from './task/route' +import { userRouter } from './user/route' -export const apiRouter = Router() +const apiRouter = new OpenAPIHono({ + defaultHook: (result, c) => { + if (result.success) return -const swaggerPath = path.join(process.cwd(), 'openapi.json') -const swagger = JSON.parse(fs.readFileSync(swaggerPath, 'utf-8')) + return c.json( + { + status: 400, + message: 'Validation failed', + errors: z.flattenError(result.error).fieldErrors + }, + 400 + ) + } +}) -apiRouter.get('/openapi.json', (_, res) => { - res.json(swagger) +apiRouter.doc31('/openapi.json', { + openapi: '3.1.0', + info: { + version: '2.3.0', + title: 'Task Pro API', + description: + 'Task Pro API provides endpoints for managing projects, tasks, and user assignments with secure authentication and efficient workflows.', + contact: { + name: 'TaskPro', + url: 'https://www.taskpro.qzz.io' + } + }, + servers: [ + { url: 'http://localhost:9537/api' }, + { url: 'https://api.taskpro.qzz.io' } + ] }) -const swaggerOptions: SwaggerUiOptions = { - customSiteTitle: 'TaskPro API Docs', - explorer: true, - swaggerOptions: { - urls: [ - { url: `${env.API_PREFIX}/openapi.json`, name: 'Main API' }, - { url: `${env.API_PREFIX}/auth/open-api/generate-schema`, name: 'Auth' } - ], - 'urls.primaryName': 'Main API' - } +apiRouter.openAPIRegistry.registerComponent('securitySchemes', 'bearerAuth', { + type: 'http', + scheme: 'bearer', + bearerFormat: 'JWT' +}) + +if (env.NODE_ENV === 'development') { + apiRouter.get( + '/ui', + swaggerUI({ title: 'Task Pro API', url: `${env.API_PREFIX}/openapi.json` }) + ) } -apiRouter.use( - '/docs', - swaggerUi.serve, - swaggerUi.setup(swagger, swaggerOptions) -) - -apiRouter.use('/user', userRouter) -apiRouter.use('/board', boardRouter) -apiRouter.use('/column', columnRouter) -apiRouter.use('/task', taskRouter) -apiRouter.use('/label', labelRouter) +apiRouter.route('/user', userRouter) +apiRouter.route('/user/settings', settingsRouter) +apiRouter.route('/board', boardRouter) +apiRouter.route('/column', columnRouter) +apiRouter.route('/task', taskRouter) +apiRouter.route('/label', labelRouter) + +export { apiRouter } diff --git a/app/routes/label/openapi.ts b/app/routes/label/openapi.ts new file mode 100644 index 0000000..a079391 --- /dev/null +++ b/app/routes/label/openapi.ts @@ -0,0 +1,95 @@ +import { createRoute, z } from '@hono/zod-openapi' + +import { + BadRequestResponse, + NotFoundResponse, + UnauthorizedResponse +} from '@/schemas' +import { + CreateLabelSchema, + LabelConflictResponse, + LabelParamsSchema, + LabelSchema, + UpdateLabelSchema +} from '@/schemas/label.schema' + +export const getAllLabelsRoute = createRoute({ + method: 'get', + path: '/', + tags: ['Label'], + operationId: 'getAllLabels', + summary: 'Get all labels', + security: [{ bearerAuth: [] }], + responses: { + 200: { + description: 'Success', + content: { 'application/json': { schema: z.array(LabelSchema) } } + }, + 401: UnauthorizedResponse + } +}) + +export const createLabelRoute = createRoute({ + method: 'post', + path: '/', + tags: ['Label'], + operationId: 'createLabel', + summary: 'Create new label', + security: [{ bearerAuth: [] }], + request: { + body: { + required: true, + content: { 'application/json': { schema: CreateLabelSchema } } + } + }, + responses: { + 201: { + description: 'Success', + content: { 'application/json': { schema: LabelSchema } } + }, + 400: BadRequestResponse, + 401: UnauthorizedResponse, + 409: LabelConflictResponse + } +}) + +export const updateLabelRoute = createRoute({ + method: 'patch', + path: '/{labelId}', + tags: ['Label'], + operationId: 'updateLabel', + summary: 'Update label by id', + security: [{ bearerAuth: [] }], + request: { + params: LabelParamsSchema, + body: { + required: true, + content: { 'application/json': { schema: UpdateLabelSchema } } + } + }, + responses: { + 200: { + description: 'Success', + content: { 'application/json': { schema: LabelSchema } } + }, + 400: BadRequestResponse, + 401: UnauthorizedResponse, + 404: NotFoundResponse, + 409: LabelConflictResponse + } +}) + +export const deleteLabelRoute = createRoute({ + method: 'delete', + path: '/{labelId}', + tags: ['Label'], + operationId: 'deleteLabel', + summary: 'Delete label by id', + security: [{ bearerAuth: [] }], + request: { params: LabelParamsSchema }, + responses: { + 204: { description: 'The resource was deleted successfully.' }, + 401: UnauthorizedResponse, + 404: NotFoundResponse + } +}) diff --git a/app/routes/label/route.ts b/app/routes/label/route.ts new file mode 100644 index 0000000..cab508d --- /dev/null +++ b/app/routes/label/route.ts @@ -0,0 +1,47 @@ +import { createProtectedRouter } from '@/lib' +import { labelService } from '@/services' + +import { + createLabelRoute, + deleteLabelRoute, + getAllLabelsRoute, + updateLabelRoute +} from './openapi' + +export const labelRouter = createProtectedRouter() + +labelRouter.openapi(getAllLabelsRoute, async c => { + const user = c.get('user') + + const labels = await labelService.getAll(user.id) + + return c.json(labels, 200) +}) + +labelRouter.openapi(createLabelRoute, async c => { + const json = c.req.valid('json') + const user = c.get('user') + + const label = await labelService.create(json, user.id) + + return c.json(label, 201) +}) + +labelRouter.openapi(updateLabelRoute, async c => { + const { labelId } = c.req.valid('param') + const json = c.req.valid('json') + const user = c.get('user') + + const label = await labelService.updateById(json, labelId, user.id) + + return c.json(label, 200) +}) + +labelRouter.openapi(deleteLabelRoute, async c => { + const { labelId } = c.req.valid('param') + const user = c.get('user') + + await labelService.deleteById(labelId, user.id) + + return c.body(null, 204) +}) diff --git a/app/routes/settings/openapi.ts b/app/routes/settings/openapi.ts new file mode 100644 index 0000000..d948587 --- /dev/null +++ b/app/routes/settings/openapi.ts @@ -0,0 +1,125 @@ +import { createRoute } from '@hono/zod-openapi' + +import { + AccessibilitySettingsSchema, + BadRequestResponse, + GeneralSettingsSchema, + GetAllSettingsResponseSchema, + LabelSettingsSchema, + TaskSettingsSchema, + UnauthorizedResponse, + UpdateAccessibilitySettingsSchema, + UpdateGeneralSettingsSchema, + UpdateLabelSettingsSchema, + UpdateTaskSettingsSchema +} from '@/schemas' + +export const getAllSettingsRoute = createRoute({ + method: 'get', + path: '/', + operationId: 'getAllSettings', + tags: ['User'], + summary: 'Get all user settings', + security: [{ bearerAuth: [] }], + responses: { + 200: { + description: 'Success', + content: { 'application/json': { schema: GetAllSettingsResponseSchema } } + }, + 401: UnauthorizedResponse + } +}) + +export const updateGeneralSettingsRoute = createRoute({ + method: 'patch', + path: '/general', + operationId: 'updateGeneralSettings', + tags: ['User'], + summary: 'Update general settings', + security: [{ bearerAuth: [] }], + request: { + body: { + required: true, + content: { 'application/json': { schema: UpdateGeneralSettingsSchema } } + } + }, + responses: { + 200: { + description: 'Updated', + content: { 'application/json': { schema: GeneralSettingsSchema } } + }, + 400: BadRequestResponse, + 401: UnauthorizedResponse + } +}) + +export const updateTaskSettingsRoute = createRoute({ + method: 'patch', + path: '/task', + operationId: 'updateTaskSettings', + tags: ['User'], + summary: 'Update task settings', + security: [{ bearerAuth: [] }], + request: { + body: { + required: true, + content: { 'application/json': { schema: UpdateTaskSettingsSchema } } + } + }, + responses: { + 200: { + description: 'Updated', + content: { 'application/json': { schema: TaskSettingsSchema } } + }, + 400: BadRequestResponse, + 401: UnauthorizedResponse + } +}) + +export const updateLabelSettingsRoute = createRoute({ + method: 'patch', + path: '/label', + operationId: 'updateLabelSettings', + tags: ['User'], + summary: 'Update label settings', + security: [{ bearerAuth: [] }], + request: { + body: { + required: true, + content: { 'application/json': { schema: UpdateLabelSettingsSchema } } + } + }, + responses: { + 200: { + description: 'Updated', + content: { 'application/json': { schema: LabelSettingsSchema } } + }, + 400: BadRequestResponse, + 401: UnauthorizedResponse + } +}) + +export const updateAccessibilitySettingsRoute = createRoute({ + method: 'patch', + path: '/accessibility', + operationId: 'updateAccessibilitySettings', + tags: ['User'], + summary: 'Update accessibility settings', + security: [{ bearerAuth: [] }], + request: { + body: { + required: true, + content: { + 'application/json': { schema: UpdateAccessibilitySettingsSchema } + } + } + }, + responses: { + 200: { + description: 'Updated', + content: { 'application/json': { schema: AccessibilitySettingsSchema } } + }, + 400: BadRequestResponse, + 401: UnauthorizedResponse + } +}) diff --git a/app/routes/settings/route.ts b/app/routes/settings/route.ts new file mode 100644 index 0000000..61bfdf9 --- /dev/null +++ b/app/routes/settings/route.ts @@ -0,0 +1,56 @@ +import { createProtectedRouter } from '@/lib' +import { settingsService } from '@/services' + +import { + getAllSettingsRoute, + updateAccessibilitySettingsRoute, + updateGeneralSettingsRoute, + updateLabelSettingsRoute, + updateTaskSettingsRoute +} from './openapi' + +export const settingsRouter = createProtectedRouter() + +settingsRouter.openapi(getAllSettingsRoute, async c => { + const user = c.get('user') + + const settings = await settingsService.getAll(user.id) + + return c.json(settings, 200) +}) + +settingsRouter.openapi(updateGeneralSettingsRoute, async c => { + const json = c.req.valid('json') + const user = c.get('user') + + const settings = await settingsService.updateGeneral(json, user.id) + + return c.json(settings, 200) +}) + +settingsRouter.openapi(updateTaskSettingsRoute, async c => { + const json = c.req.valid('json') + const user = c.get('user') + + const settings = await settingsService.updateTasks(json, user.id) + + return c.json(settings, 200) +}) + +settingsRouter.openapi(updateLabelSettingsRoute, async c => { + const json = c.req.valid('json') + const user = c.get('user') + + const settings = await settingsService.updateLabels(json, user.id) + + return c.json(settings, 200) +}) + +settingsRouter.openapi(updateAccessibilitySettingsRoute, async c => { + const json = c.req.valid('json') + const user = c.get('user') + + const settings = await settingsService.updateAccessibility(json, user.id) + + return c.json(settings, 200) +}) diff --git a/app/routes/task/openapi.ts b/app/routes/task/openapi.ts new file mode 100644 index 0000000..663ce55 --- /dev/null +++ b/app/routes/task/openapi.ts @@ -0,0 +1,107 @@ +import { createRoute, z } from '@hono/zod-openapi' + +import { + BadRequestResponse, + ColumnParamsSchema, + CreateTaskSchema, + NotFoundResponse, + TaskParamsSchema, + TaskSchema, + UnauthorizedResponse, + UpdateTaskSchema, + UpdateTasksOrderSchema +} from '@/schemas' + +export const createTaskRoute = createRoute({ + method: 'post', + path: '/{columnId}', + operationId: 'createTask', + tags: ['Task'], + summary: 'Create new task', + security: [{ bearerAuth: [] }], + request: { + params: ColumnParamsSchema, + body: { + required: true, + content: { 'application/json': { schema: CreateTaskSchema } } + } + }, + responses: { + 201: { + description: 'Success', + content: { 'application/json': { schema: TaskSchema } } + }, + 400: BadRequestResponse, + 401: UnauthorizedResponse, + 404: NotFoundResponse + } +}) + +export const updateTasksOrderRoute = createRoute({ + method: 'patch', + path: '/{columnId}/order', + operationId: 'updateTasksOrder', + tags: ['Task'], + summary: 'Update tasks order', + security: [{ bearerAuth: [] }], + request: { + params: ColumnParamsSchema, + body: { + required: true, + content: { 'application/json': { schema: UpdateTasksOrderSchema } } + } + }, + responses: { + 200: { + description: 'Updated', + content: { + 'application/json': { + schema: z.array(TaskSchema.omit({ labels: true })) + } + } + }, + 400: BadRequestResponse, + 401: UnauthorizedResponse, + 404: NotFoundResponse + } +}) + +export const updateTaskRoute = createRoute({ + method: 'patch', + path: '/{taskId}', + operationId: 'updateTask', + tags: ['Task'], + summary: 'Update task by id', + security: [{ bearerAuth: [] }], + request: { + params: TaskParamsSchema, + body: { + required: true, + content: { 'application/json': { schema: UpdateTaskSchema } } + } + }, + responses: { + 200: { + description: 'Success', + content: { 'application/json': { schema: TaskSchema } } + }, + 400: BadRequestResponse, + 401: UnauthorizedResponse, + 404: NotFoundResponse + } +}) + +export const deleteTaskRoute = createRoute({ + method: 'delete', + path: '/{taskId}', + operationId: 'deleteTask', + tags: ['Task'], + summary: 'Delete task by id', + security: [{ bearerAuth: [] }], + request: { params: TaskParamsSchema }, + responses: { + 204: { description: 'The resource was deleted successfully.' }, + 401: UnauthorizedResponse, + 404: NotFoundResponse + } +}) diff --git a/app/routes/task/route.ts b/app/routes/task/route.ts new file mode 100644 index 0000000..acaedae --- /dev/null +++ b/app/routes/task/route.ts @@ -0,0 +1,50 @@ +import { createProtectedRouter } from '@/lib' +import { taskService } from '@/services' + +import { + createTaskRoute, + deleteTaskRoute, + updateTaskRoute, + updateTasksOrderRoute +} from './openapi' + +export const taskRouter = createProtectedRouter() + +taskRouter.openapi(createTaskRoute, async c => { + const json = c.req.valid('json') + const { columnId } = c.req.valid('param') + const user = c.get('user') + + const task = await taskService.create(json, columnId, user.id) + + return c.json(task, 201) +}) + +taskRouter.openapi(updateTaskRoute, async c => { + const json = c.req.valid('json') + const { taskId } = c.req.valid('param') + const user = c.get('user') + + const task = await taskService.updateById(json, taskId, user.id) + + return c.json(task, 200) +}) + +taskRouter.openapi(updateTasksOrderRoute, async c => { + const { columnId } = c.req.valid('param') + const json = c.req.valid('json') + const user = c.get('user') + + const tasks = await taskService.updateOrder(json, columnId, user.id) + + return c.json(tasks, 200) +}) + +taskRouter.openapi(deleteTaskRoute, async c => { + const { taskId } = c.req.valid('param') + const user = c.get('user') + + await taskService.deleteById(taskId, user.id) + + return c.body(null, 204) +}) diff --git a/app/routes/user/openapi.ts b/app/routes/user/openapi.ts new file mode 100644 index 0000000..7fe20be --- /dev/null +++ b/app/routes/user/openapi.ts @@ -0,0 +1,31 @@ +import { createRoute } from '@hono/zod-openapi' + +import { + BadRequestResponse, + HelpResponseSchema, + HelpSchema, + UnauthorizedResponse +} from '@/schemas' + +export const helpRoute = createRoute({ + method: 'post', + path: '/help', + operationId: 'help', + tags: ['User'], + summary: 'Send email need help', + security: [{ bearerAuth: [] }], + request: { + body: { + required: true, + content: { 'application/json': { schema: HelpSchema } } + } + }, + responses: { + 200: { + content: { 'application/json': { schema: HelpResponseSchema } }, + description: 'Email sent' + }, + 400: BadRequestResponse, + 401: UnauthorizedResponse + } +}) diff --git a/app/routes/user/route.ts b/app/routes/user/route.ts new file mode 100644 index 0000000..ca8c6a0 --- /dev/null +++ b/app/routes/user/route.ts @@ -0,0 +1,14 @@ +import { createProtectedRouter } from '@/lib' +import { userService } from '@/services' + +import { helpRoute } from './openapi' + +export const userRouter = createProtectedRouter() + +userRouter.openapi(helpRoute, async c => { + const json = c.req.valid('json') + + await userService.help(json) + + return c.json({ message: 'Email sent' }, 200) +}) diff --git a/app/schemas/board.schema.ts b/app/schemas/board.schema.ts index 3fc2e25..1240edf 100644 --- a/app/schemas/board.schema.ts +++ b/app/schemas/board.schema.ts @@ -1,9 +1,10 @@ +import { z } from '@hono/zod-openapi' import { Icon } from '@prisma/client' -import * as z from 'zod' import boardImages from '@/data/board-bg-images.json' -import { objectIdSchema } from './object-id.schema' +import { ColumnSchema } from './column.schema' +import { ObjectIdSchema } from './object-id.schema' const zObjectKeys = >(obj: T) => { const keys = Object.keys(obj) as Extract[] @@ -13,12 +14,37 @@ const zObjectKeys = >(obj: T) => { ) } -export const CreateBoardSchema = z.object({ - title: z.string().min(3), - icon: z.enum(Icon), - background: zObjectKeys(boardImages) -}) +const BoardIconSchema = z.enum(Icon).openapi('BoardIcon') +const BoardBackgroundIdSchema = + zObjectKeys(boardImages).openapi('BoardBackgroundId') +const BoardBackground = z + .object({ + identifier: BoardBackgroundIdSchema, + url: z.url().nullable().openapi({ + example: + 'https://res.cloudinary.com/dmbnnewoy/image/upload/v1707099093/TaskPro/board_bg_images/desk/nfxep55xgvpq7xitemq1.jpg' + }) + }) + .openapi('BoardBackground') + +export const BoardSchema = z + .object({ + id: ObjectIdSchema, + title: z.string().min(3).openapi({ example: 'Project office' }), + icon: BoardIconSchema.openapi({ example: Icon.layout }), + background: BoardBackground, + userId: ObjectIdSchema, + columns: z.array(ColumnSchema), + createdAt: z.date(), + updatedAt: z.date() + }) + .openapi('Board') + +export const CreateBoardSchema = BoardSchema.pick({ + title: true, + icon: true +}).extend({ background: BoardBackgroundIdSchema }) export const UpdateBoardSchema = CreateBoardSchema.partial() -export const BoardParamsSchema = z.object({ boardId: objectIdSchema() }) +export const BoardParamsSchema = z.object({ boardId: ObjectIdSchema }) diff --git a/app/schemas/column.schema.ts b/app/schemas/column.schema.ts index b0ef8c0..282ec36 100644 --- a/app/schemas/column.schema.ts +++ b/app/schemas/column.schema.ts @@ -1,15 +1,30 @@ -import * as z from 'zod' +import { z } from '@hono/zod-openapi' -import { objectIdSchema } from './object-id.schema' +import { ObjectIdSchema } from './object-id.schema' +import { TaskSchema } from './task.schema' -export const CreateColumnSchema = z.object({ - title: z.string().min(3) +export const ColumnSchema = z + .object({ + id: ObjectIdSchema, + title: z.string().min(3).openapi({ example: 'In progress' }), + order: z.number().int().openapi({ example: 1 }), + boardId: ObjectIdSchema, + tasks: z.array(TaskSchema), + createdAt: z.date(), + updatedAt: z.date() + }) + .openapi('Column') + +export const CreateColumnSchema = ColumnSchema.pick({ + title: true }) export const UpdateColumnSchema = CreateColumnSchema.partial() -export const ColumnParamsSchema = z.object({ columnId: objectIdSchema() }) +export const ColumnParamsSchema = z.object({ columnId: ObjectIdSchema }) -export const UpdateColumnOrderSchema = z.object({ - ids: z.array(objectIdSchema()) +export const UpdateColumnsOrderSchema = z.object({ + ids: z.array(ObjectIdSchema).openapi({ + example: ['6672fdccc07147fc7ae1bb93', '6743474be4006eca6c8122e7'] + }) }) diff --git a/app/schemas/error-schema.ts b/app/schemas/error-schema.ts new file mode 100644 index 0000000..042928b --- /dev/null +++ b/app/schemas/error-schema.ts @@ -0,0 +1,41 @@ +import { z } from '@hono/zod-openapi' + +export const ErrorResponseSchema = z + .object({ + status: z.number().openapi({ example: 400 }), + message: z.union([z.string(), z.record(z.string(), z.array(z.string()))]) + }) + .openapi('ErrorResponse') + +export const BadRequestResponse = { + description: 'Bad Request', + content: { + 'application/json': { + schema: ErrorResponseSchema.openapi({ + example: { status: 400, message: 'Validation failed' } + }) + } + } +} + +export const UnauthorizedResponse = { + description: 'Unauthorized', + content: { + 'application/json': { + schema: ErrorResponseSchema.openapi({ + example: { status: 401, message: 'Unauthorized' } + }) + } + } +} + +export const NotFoundResponse = { + description: 'Not Found', + content: { + 'application/json': { + schema: ErrorResponseSchema.openapi({ + example: { status: 404, message: 'Not found' } + }) + } + } +} diff --git a/app/schemas/index.ts b/app/schemas/index.ts index 8354e7e..9392d18 100644 --- a/app/schemas/index.ts +++ b/app/schemas/index.ts @@ -1,23 +1,44 @@ export { + BoardSchema, CreateBoardSchema, UpdateBoardSchema, BoardParamsSchema } from './board.schema' export { + TaskSchema, CreateTaskSchema, UpdateTaskSchema, TaskParamsSchema, - UpdateTaskOrderSchema + UpdateTasksOrderSchema } from './task.schema' export { + ColumnSchema, CreateColumnSchema, UpdateColumnSchema, ColumnParamsSchema, - UpdateColumnOrderSchema + UpdateColumnsOrderSchema } from './column.schema' export { CreateLabelSchema, UpdateLabelSchema, - LabelParamsSchema + LabelParamsSchema, + LabelConflictResponse } from './label.schema' -export { UpdateUserSchema, NeedHelpSchema } from './user.schema' +export { + GetAllSettingsResponseSchema, + GeneralSettingsSchema, + TaskSettingsSchema, + LabelSettingsSchema, + AccessibilitySettingsSchema, + UpdateGeneralSettingsSchema, + UpdateTaskSettingsSchema, + UpdateLabelSettingsSchema, + UpdateAccessibilitySettingsSchema +} from './settings.schema' +export { + BadRequestResponse, + ErrorResponseSchema, + NotFoundResponse, + UnauthorizedResponse +} from './error-schema' +export { HelpSchema, HelpResponseSchema } from './user.schema' diff --git a/app/schemas/label.schema.ts b/app/schemas/label.schema.ts index 67f0e6b..df1b1c1 100644 --- a/app/schemas/label.schema.ts +++ b/app/schemas/label.schema.ts @@ -1,13 +1,50 @@ -import { LabelColor } from '@prisma/client' +import { AccentColor } from '@prisma/client' import * as z from 'zod' -import { objectIdSchema } from './object-id.schema' +import { ErrorResponseSchema } from './error-schema' +import { ObjectIdSchema } from './object-id.schema' +import { AccentColorSchema } from './settings.schema' -export const CreateLabelSchema = z.object({ - name: z.string().min(2), - color: z.enum(LabelColor) +export const LabelSchema = z + .object({ + id: ObjectIdSchema, + name: z.string().openapi({ example: 'Bug' }), + description: z + .string() + .min(3) + .nullable() + .openapi({ example: 'Description of the bug' }), + color: AccentColorSchema.openapi({ example: AccentColor.red }), + userId: ObjectIdSchema, + taskIds: z.array(ObjectIdSchema).openapi({ example: [] }), + createdAt: z.date().openapi({ example: '2026-06-29T14:30:00.000Z' }), + updatedAt: z.date().openapi({ example: '2026-06-29T14:30:00.000Z' }) + }) + .openapi('Label') + +export const CreateLabelSchema = LabelSchema.pick({ + name: true, + color: true }) -export const UpdateLabelSchema = CreateLabelSchema.partial() +export const UpdateLabelSchema = z + .object({ + ...CreateLabelSchema.shape, + description: z.nullable(z.string().min(3)).openapi({ + example: 'Description of the bug' + }) + }) + .partial() + +export const LabelParamsSchema = z.object({ labelId: ObjectIdSchema }) -export const LabelParamsSchema = z.object({ labelId: objectIdSchema() }) +export const LabelConflictResponse = { + description: 'Conflict', + content: { + 'application/json': { + schema: ErrorResponseSchema.openapi({ + example: { status: 409, message: 'Label with same name already exists' } + }) + } + } +} diff --git a/app/schemas/object-id.schema.ts b/app/schemas/object-id.schema.ts index cbd8d20..5a4e16c 100644 --- a/app/schemas/object-id.schema.ts +++ b/app/schemas/object-id.schema.ts @@ -1,6 +1,9 @@ -import * as z from 'zod' +import { z } from '@hono/zod-openapi' -export const objectIdSchema = () => - z - .string() - .regex(/^[0-9a-f]{24}$/, 'The field must have a valid ObjectId format') +export const ObjectIdSchema = z + .string() + .regex(/^[0-9a-f]{24}$/, 'The field must have a valid ObjectId format') + .openapi({ + format: 'objectid', + example: '6672fdccc07147fc7ae1bb93' + }) diff --git a/app/schemas/settings.schema.ts b/app/schemas/settings.schema.ts new file mode 100644 index 0000000..0ceb0b8 --- /dev/null +++ b/app/schemas/settings.schema.ts @@ -0,0 +1,108 @@ +import { z } from '@hono/zod-openapi' +import { + AccentColor, + BoardBackgroundBlur, + CardDensity, + DateFormat, + DefaultDeadline, + FontSize, + LabelDisplay, + MaxLabelsShown, + NewTaskPosition, + Priority, + TaskSort, + Theme, + WeekStart +} from '@prisma/client' + +import { ObjectIdSchema } from './object-id.schema' + +export const AccentColorSchema = z.enum(AccentColor).openapi('AccentColor') + +export const GeneralSettingsSchema = z + .object({ + id: ObjectIdSchema, + theme: z.enum(Theme).openapi({ default: Theme.light }), + accentColor: AccentColorSchema.openapi({ default: AccentColor.blue }), + firstDayOfWeek: z.enum(WeekStart).openapi({ example: WeekStart.monday }), + dateFormat: z.enum(DateFormat).openapi({ example: DateFormat.dd_mm_yyyy }), + boardBackgroundBlur: z + .enum(BoardBackgroundBlur) + .openapi({ example: BoardBackgroundBlur.off }), + usePointerCursors: z.boolean().openapi({ example: true }), + enableAnimations: z.boolean().openapi({ example: true }), + confirmBeforeDelete: z.boolean().openapi({ example: true }), + userId: ObjectIdSchema + }) + .openapi('GeneralSettings') + +export const TaskSettingsSchema = z + .object({ + id: ObjectIdSchema, + sortTasksBy: z.enum(TaskSort).openapi({ example: TaskSort.manual }), + defaultPriority: z.enum(Priority).openapi({ example: Priority.without }), + defaultDeadline: z + .enum(DefaultDeadline) + .openapi({ example: DefaultDeadline.none }), + cardDensity: z.enum(CardDensity).openapi({ example: CardDensity.compact }), + showCompletedTasks: z.boolean().openapi({ example: true }), + showPriorityIndicator: z.boolean().openapi({ example: true }), + newTaskPosition: z + .enum(NewTaskPosition) + .openapi({ example: NewTaskPosition.bottom }), + enableNaturalLanguageDates: z.boolean().openapi({ example: true }), + userId: ObjectIdSchema + }) + .openapi('TaskSettings') + +export const LabelSettingsSchema = z + .object({ + id: ObjectIdSchema, + showLabelsOnTask: z.boolean().openapi({ example: true }), + labelDisplay: z.enum(LabelDisplay).openapi({ example: LabelDisplay.full }), + maxLabelsShown: z + .enum(MaxLabelsShown) + .openapi({ example: MaxLabelsShown.three }), + userId: ObjectIdSchema + }) + .openapi('LabelSettings') + +export const AccessibilitySettingsSchema = z + .object({ + id: ObjectIdSchema, + fontSize: z.enum(FontSize).openapi({ example: FontSize.medium }), + reducedMotion: z.boolean().openapi({ example: false }), + highContrast: z.boolean().openapi({ example: false }), + focusIndicators: z.boolean().openapi({ example: true }), + keyboardNavigationHints: z.boolean().openapi({ example: false }), + userId: ObjectIdSchema + }) + .openapi('AccessibilitySettings') + +export const GetAllSettingsResponseSchema = z.object({ + general: GeneralSettingsSchema, + task: TaskSettingsSchema, + label: LabelSettingsSchema, + accessibility: AccessibilitySettingsSchema +}) + +export const UpdateGeneralSettingsSchema = GeneralSettingsSchema.omit({ + id: true, + userId: true +}).partial() + +export const UpdateTaskSettingsSchema = TaskSettingsSchema.omit({ + id: true, + userId: true +}).partial() + +export const UpdateLabelSettingsSchema = LabelSettingsSchema.omit({ + id: true, + userId: true +}).partial() + +export const UpdateAccessibilitySettingsSchema = + AccessibilitySettingsSchema.omit({ + id: true, + userId: true + }).partial() diff --git a/app/schemas/task.schema.ts b/app/schemas/task.schema.ts index 69d7633..30f76e4 100644 --- a/app/schemas/task.schema.ts +++ b/app/schemas/task.schema.ts @@ -1,13 +1,46 @@ +import { z } from '@hono/zod-openapi' import { Priority } from '@prisma/client' -import * as z from 'zod' -import { objectIdSchema } from './object-id.schema' +import { LabelSchema } from './label.schema' +import { ObjectIdSchema } from './object-id.schema' -export const CreateTaskSchema = z.object({ - title: z.string().min(3), - description: z.optional(z.string().min(3)), - priority: z.enum(Priority), - labels: z.optional(z.array(objectIdSchema())), +const TaskPrioritySchema = z.enum(Priority).openapi('TaskPriority') + +export const TaskSchema = z + .object({ + id: ObjectIdSchema, + title: z.string().min(3).openapi({ example: 'Publication of the project' }), + description: z.string().min(3).nullable().openapi({ + example: + 'Review the project materials: Familiarize yourself with the project...' + }), + priority: TaskPrioritySchema.openapi({ example: Priority.high }), + deadline: z + .date() + .nullable() + .openapi({ example: '2025-10-15T00:00:00.000Z' }), + order: z.number().int().openapi({ example: 1 }), + completed: z.boolean().openapi({ example: false }), + completedAt: z.date().nullable().openapi({ example: null }), + columnId: ObjectIdSchema, + labels: z.array(LabelSchema), + createdAt: z.date(), + updatedAt: z.date() + }) + .openapi('Task') + +export const CreateTaskSchema = TaskSchema.pick({ + title: true, + priority: true +}).extend({ + description: z.optional(z.string().min(3)).openapi({ + example: + 'Review the project materials: Familiarize yourself with the project...' + }), + labels: z.optional(z.array(ObjectIdSchema)).openapi({ + description: 'Array of Label ids to attach to the task', + example: ['6672fdccc07147fc7ae1bb93'] + }), deadline: z .optional( z.iso.datetime().refine(value => { @@ -27,15 +60,20 @@ export const CreateTaskSchema = z.object({ export const UpdateTaskSchema = z .object({ ...CreateTaskSchema.shape, - completed: z.boolean(), - description: z.nullable(z.string().min(3)), - deadline: z.nullable(z.iso.datetime()), - columnId: objectIdSchema() + completed: TaskSchema.shape.completed, + description: z.nullable(z.string().min(3)).openapi({ + example: + 'Review the project materials: Familiarize yourself with the project...' + }), + deadline: z.nullable(z.iso.datetime()).openapi({ example: '2025-10-15' }), + columnId: ObjectIdSchema }) .partial() -export const TaskParamsSchema = z.object({ taskId: objectIdSchema() }) +export const TaskParamsSchema = z.object({ taskId: ObjectIdSchema }) -export const UpdateTaskOrderSchema = z.object({ - ids: z.array(objectIdSchema()) +export const UpdateTasksOrderSchema = z.object({ + ids: z.array(ObjectIdSchema).openapi({ + example: ['6672fdccc07147fc7ae1bb93', '6743474be4006eca6c8122e7'] + }) }) diff --git a/app/schemas/user.schema.ts b/app/schemas/user.schema.ts index 224be5a..22e2721 100644 --- a/app/schemas/user.schema.ts +++ b/app/schemas/user.schema.ts @@ -1,16 +1,12 @@ -import { Theme } from '@prisma/client' -import * as z from 'zod' +import { z } from '@hono/zod-openapi' -export const NeedHelpSchema = z.object({ - email: z.email(), - comment: z.string().min(5) +export const HelpSchema = z.object({ + email: z.email().openapi({ example: 'user@example.com' }), + comment: z.string().min(5).openapi({ + example: 'Need help with the Kanban board feature.' + }) }) -export const UpdateUserSchema = z - .object({ - name: z.string().min(2), - email: z.email(), - password: z.string().min(8).max(64), - theme: z.enum(Theme) - }) - .partial() +export const HelpResponseSchema = z.object({ + message: z.string().openapi({ example: 'Email sent' }) +}) diff --git a/app/server.ts b/app/server.ts index 32cf25b..b9cdfdf 100644 --- a/app/server.ts +++ b/app/server.ts @@ -1,10 +1,12 @@ +import { serve } from '@hono/node-server' + import { app } from './app' // eslint-disable-next-line no-restricted-syntax -const port = process.env.PORT || 10000 +const port = Number(process.env.PORT) || 10000 console.log('Starting server...') -app.listen(port, () => { - console.log(`Server started on port ${port}`) +serve({ fetch: app.fetch, port }, info => { + console.log(`Server started on port ${info.port}`) }) diff --git a/app/services/board.service.ts b/app/services/board.service.ts new file mode 100644 index 0000000..2a523ee --- /dev/null +++ b/app/services/board.service.ts @@ -0,0 +1,121 @@ +import type { CreateBoardSchema, UpdateBoardSchema } from '@/schemas' +import type { z } from 'zod' + +import { prisma } from '@/prisma' +import { invalidate, REDIS_TTL, redisKeys } from '@/redis' +import { HTTPException } from 'hono/http-exception' + +import { redisClient } from '@/config' +import boardImages from '@/data/board-bg-images.json' + +class BoardService { + getAll = async (userId: string) => { + const cacheKey = redisKeys.boards.byUser(userId) + + const cachedBoards = await redisClient.get(cacheKey) + + if (cachedBoards) return JSON.parse(cachedBoards) + + const boards = await prisma.board.findMany({ where: { userId } }) + + await redisClient.set( + cacheKey, + JSON.stringify(boards), + 'EX', + REDIS_TTL.DEFAULT + ) + + return boards + } + + getById = async (boardId: string, userId: string) => { + const cacheKey = redisKeys.boards.byId(boardId, userId) + + const cachedBoard = await redisClient.get(cacheKey) + + if (cachedBoard) return JSON.parse(cachedBoard) + + const board = await prisma.board.findUnique({ + where: { id: boardId, userId }, + include: { + columns: { + orderBy: { order: 'asc' }, + include: { + tasks: { include: { labels: true }, orderBy: { order: 'asc' } } + } + } + } + }) + + if (!board) { + throw new HTTPException(404, { message: 'Board not found' }) + } + + await redisClient.set( + cacheKey, + JSON.stringify(board), + 'EX', + REDIS_TTL.DEFAULT + ) + + return board + } + + create = async (data: z.infer, userId: string) => { + const newBoard = await prisma.board.create({ + data: { + ...data, + userId, + background: { + identifier: data.background, + url: boardImages[data.background] + } + } + }) + + await invalidate.boards(userId) + + return newBoard + } + + updateById = async ( + data: z.infer, + boardId: string, + userId: string + ) => { + const updatedBoard = await prisma.board.updateIgnoreNotFound({ + where: { id: boardId, userId }, + data: { + ...data, + background: data.background + ? { + identifier: data.background, + url: boardImages[data.background] + } + : undefined + } + }) + + if (!updatedBoard) { + throw new HTTPException(404, { message: 'Board not found' }) + } + + await invalidate.boardRelated(userId, updatedBoard.id) + + return updatedBoard + } + + deleteById = async (boardId: string, userId: string) => { + const deletedBoard = await prisma.board.deleteIgnoreNotFound({ + where: { id: boardId, userId } + }) + + if (!deletedBoard) { + throw new HTTPException(404, { message: 'Board not found' }) + } + + await invalidate.boardRelated(userId, deletedBoard.id) + } +} + +export const boardService = new BoardService() diff --git a/app/services/column.service.ts b/app/services/column.service.ts new file mode 100644 index 0000000..e6a3a33 --- /dev/null +++ b/app/services/column.service.ts @@ -0,0 +1,108 @@ +import type { + CreateColumnSchema, + UpdateColumnSchema, + UpdateColumnsOrderSchema +} from '@/schemas' +import type z from 'zod' + +import { prisma } from '@/prisma' +import { invalidate } from '@/redis' +import { HTTPException } from 'hono/http-exception' + +class ColumnService { + create = async ( + data: z.infer, + boardId: string, + userId: string + ) => { + const board = await prisma.board.findUnique({ + where: { id: boardId, userId } + }) + + if (!board) { + throw new HTTPException(404, { message: 'Board not found' }) + } + + const lastColumn = await prisma.column.findFirst({ + where: { boardId: board.id }, + orderBy: { order: 'desc' }, + select: { order: true } + }) + + const newOrder = lastColumn ? lastColumn.order + 1 : 1 + + const column = await prisma.column.create({ + data: { ...data, order: newOrder, boardId: board.id } + }) + + await invalidate.board(userId, board.id) + + return column + } + + updateById = async ( + data: z.infer, + columnId: string, + userId: string + ) => { + const updatedColumn = await prisma.column.updateIgnoreNotFound({ + where: { id: columnId }, + include: { board: { select: { userId: true } } }, + data + }) + + if (!updatedColumn) { + throw new HTTPException(404, { message: 'Column not found' }) + } + + await invalidate.board(userId, updatedColumn.boardId) + + return updatedColumn + } + + updateOrder = async ( + data: z.infer, + boardId: string, + userId: string + ) => { + const board = await prisma.board.findUnique({ + where: { id: boardId } + }) + + if (!board) { + throw new HTTPException(404, { message: 'Board not found' }) + } + + const transaction = data.ids.map((id, order) => + prisma.column.update({ + where: { id }, + data: { order, boardId: board.id } + }) + ) + + try { + const updatedColumns = await prisma.$transaction(transaction) + + await invalidate.board(userId, board.id) + + return updatedColumns + } catch { + throw new HTTPException(400, { message: 'Invalid order' }) + } + } + + deleteById = async (columnId: string, userId: string) => { + const deletedColumn = await prisma.column.deleteIgnoreNotFound({ + where: { id: columnId }, + include: { board: { select: { userId: true } } } + }) + + if (!deletedColumn) { + throw new HTTPException(404, { message: 'Column not found' }) + } + + await invalidate.board(userId, deletedColumn.boardId) + } +} + +export const columnService = new ColumnService() diff --git a/app/services/index.ts b/app/services/index.ts new file mode 100644 index 0000000..313df01 --- /dev/null +++ b/app/services/index.ts @@ -0,0 +1,6 @@ +export { boardService } from './board.service' +export { columnService } from './column.service' +export { taskService } from './task.service' +export { labelService } from './label.service' +export { userService } from './user.service' +export { settingsService } from './settings.service' diff --git a/app/services/label.service.ts b/app/services/label.service.ts new file mode 100644 index 0000000..c3d79fb --- /dev/null +++ b/app/services/label.service.ts @@ -0,0 +1,143 @@ +import type { CreateLabelSchema, UpdateLabelSchema } from '@/schemas' +import type { z } from 'zod' + +import { prisma } from '@/prisma' +import { invalidate, redisKeys } from '@/redis' +import { HTTPException } from 'hono/http-exception' + +import { redisClient } from '@/config' + +class LabelService { + getAll = async (userId: string) => { + const cacheKey = redisKeys.labels.byUser(userId) + + const cachedLabels = await redisClient.get(cacheKey) + + if (cachedLabels) return JSON.parse(cachedLabels) + + const labels = await prisma.label.findMany({ where: { userId } }) + + await redisClient.set(cacheKey, JSON.stringify(labels), 'EX', 5 * 60) + + return labels + } + + create = async (data: z.infer, userId: string) => { + const { name, color } = data + + const labelWithSameName = await prisma.label.findUnique({ + where: { userId_name: { userId, name } } + }) + + if (labelWithSameName) { + throw new HTTPException(409, { + message: 'Label with same name already exists' + }) + } + + const label = await prisma.label.create({ + data: { name, color, userId } + }) + + await invalidate.labels(userId) + + return label + } + + updateById = async ( + data: z.infer, + labelId: string, + userId: string + ) => { + const labelWithSameName = await prisma.label.findUnique({ + where: { userId_name: { userId, name: data.name! } } + }) + + if (labelWithSameName) { + throw new HTTPException(409, { + message: 'Label with same name already exists' + }) + } + + const updatedLabel = await prisma.label.updateIgnoreNotFound({ + where: { id: labelId, userId }, + data + }) + + if (!updatedLabel) { + throw new HTTPException(404, { message: 'Label not found' }) + } + + const affectedBoards = await this.findAffectedBoardsByLabelId( + userId, + updatedLabel.id + ) + + await Promise.all([ + invalidate.labels(userId), + invalidate.boardMany( + userId, + affectedBoards.map(board => board.id) + ) + ]) + + return updatedLabel + } + + deleteById = async (labelId: string, userId: string) => { + const label = await prisma.label.findFirst({ + where: { id: labelId, userId } + }) + + if (!label) { + throw new HTTPException(404, { message: 'Label not found' }) + } + + const tasks = await prisma.task.findMany({ + where: { labelIds: { has: label.id } }, + select: { id: true, labelIds: true } + }) + + const affectedBoards = await this.findAffectedBoardsByLabelId( + userId, + label.id + ) + + await prisma.$transaction([ + ...tasks.map(task => + prisma.task.update({ + where: { id: task.id }, + data: { + labelIds: { set: task.labelIds.filter(id => id !== label.id) } + } + }) + ), + prisma.label.delete({ where: { id: label.id } }) + ]) + + await Promise.all([ + invalidate.labels(userId), + invalidate.boardMany( + userId, + affectedBoards.map(board => board.id) + ) + ]) + } + + private findAffectedBoardsByLabelId = async ( + userId: string, + labelId: string + ) => { + return await prisma.board.findMany({ + where: { + userId, + columns: { + some: { tasks: { some: { labels: { some: { id: labelId } } } } } + } + }, + select: { id: true } + }) + } +} + +export const labelService = new LabelService() diff --git a/app/services/settings.service.ts b/app/services/settings.service.ts new file mode 100644 index 0000000..e569a8d --- /dev/null +++ b/app/services/settings.service.ts @@ -0,0 +1,96 @@ +import type { + UpdateAccessibilitySettingsSchema, + UpdateGeneralSettingsSchema, + UpdateLabelSettingsSchema, + UpdateTaskSettingsSchema +} from '@/schemas' +import type { z } from 'zod' + +import { prisma } from '@/prisma' +import { invalidate, REDIS_TTL, redisKeys } from '@/redis' + +import { redisClient } from '@/config' + +class SettingsService { + getAll = async (userId: string) => { + const cacheKey = redisKeys.settings.byUser(userId) + + const cachedSettings = await redisClient.get(cacheKey) + + if (cachedSettings) return JSON.parse(cachedSettings) + + const [general, task, label, accessibility] = await Promise.all([ + prisma.userSettings.findUnique({ where: { userId } }), + prisma.taskSettings.findUnique({ where: { userId } }), + prisma.labelSettings.findUnique({ where: { userId } }), + prisma.accessibilitySettings.findUnique({ where: { userId } }) + ]) + + await redisClient.set( + cacheKey, + JSON.stringify({ general, task, label, accessibility }), + 'EX', + REDIS_TTL.DEFAULT + ) + + return { general, task, label, accessibility } + } + + updateGeneral = async ( + data: z.infer, + userId: string + ) => { + const settings = await prisma.userSettings.update({ + where: { userId }, + data + }) + + await invalidate.settings(userId) + + return settings + } + + updateTasks = async ( + data: z.infer, + userId: string + ) => { + const settings = await prisma.taskSettings.update({ + where: { userId }, + data + }) + + await invalidate.settings(userId) + + return settings + } + + updateLabels = async ( + data: z.infer, + userId: string + ) => { + const settings = await prisma.labelSettings.update({ + where: { userId }, + data + }) + + await invalidate.settings(userId) + + return settings + } + + updateAccessibility = async ( + data: z.infer, + userId: string + ) => { + const settings = await prisma.accessibilitySettings.update({ + where: { userId }, + data + }) + + await invalidate.settings(userId) + + return settings + } +} + +export const settingsService = new SettingsService() diff --git a/app/services/task.service.ts b/app/services/task.service.ts new file mode 100644 index 0000000..6ef9786 --- /dev/null +++ b/app/services/task.service.ts @@ -0,0 +1,137 @@ +import type { + CreateTaskSchema, + UpdateTaskSchema, + UpdateTasksOrderSchema +} from '@/schemas' +import type { z } from 'zod' + +import { prisma } from '@/prisma' +import { invalidate } from '@/redis' +import { HTTPException } from 'hono/http-exception' + +class TaskService { + create = async ( + data: z.infer, + columnId: string, + userId: string + ) => { + const column = await prisma.column.findUnique({ + where: { id: columnId }, + include: { board: { select: { userId: true } } } + }) + + if (!column) throw new HTTPException(404, { message: 'Column not found' }) + + const newOrder = await this.getNewTaskOrder(column.id) + + const newTask = await prisma.task.create({ + data: { + ...data, + columnId: column.id, + order: newOrder, + labels: { connect: data.labels?.map(id => ({ id })) } + }, + include: { labels: true } + }) + + await invalidate.board(userId, column.boardId) + + return newTask + } + + updateById = async ( + data: z.infer, + taskId: string, + userId: string + ) => { + if (data.columnId) { + const column = await prisma.column.findUnique({ + where: { id: data.columnId } + }) + + if (!column) throw new HTTPException(404, { message: 'Column not found' }) + } + + const updatedTask = await prisma.task.updateIgnoreNotFound({ + where: { id: taskId }, + data: { + ...data, + completedAt: data.completed ? new Date() : null, + labels: { set: data.labels?.map(id => ({ id })) } + }, + include: { + labels: true, + column: { include: { board: { select: { userId: true } } } } + } + }) + + if (!updatedTask) { + throw new HTTPException(404, { message: 'Task not found' }) + } + + const { column, ...task } = updatedTask + + await invalidate.board(userId, column.boardId) + + return task + } + + updateOrder = async ( + data: z.infer, + columnId: string, + userId: string + ) => { + const column = await prisma.column.findUnique({ + where: { id: columnId }, + include: { board: { select: { userId: true } } } + }) + + if (!column) { + throw new HTTPException(404, { message: 'Column not found' }) + } + + const transaction = data.ids.map((id, order) => + prisma.task.update({ + where: { id }, + data: { order, columnId: column.id } + }) + ) + + try { + const updatedTasks = await prisma.$transaction(transaction) + + await invalidate.board(userId, column.boardId) + + return updatedTasks + } catch { + throw new HTTPException(400, { message: 'Invalid order' }) + } + } + + deleteById = async (taskId: string, userId: string) => { + const deletedTask = await prisma.task.deleteIgnoreNotFound({ + where: { id: taskId }, + include: { column: { include: { board: { select: { userId: true } } } } } + }) + + if (!deletedTask) { + throw new HTTPException(404, { message: 'Task not found' }) + } + + await invalidate.board(userId, deletedTask.column.boardId) + } + + private getNewTaskOrder = async (columnId: string) => { + const lastTask = await prisma.task.findFirst({ + where: { columnId }, + orderBy: { order: 'desc' }, + select: { order: true } + }) + + const newOrder = lastTask ? lastTask.order + 1 : 1 + + return newOrder + } +} + +export const taskService = new TaskService() diff --git a/app/services/user.service.ts b/app/services/user.service.ts new file mode 100644 index 0000000..fb7f203 --- /dev/null +++ b/app/services/user.service.ts @@ -0,0 +1,61 @@ +import type { HelpSchema } from '@/schemas' +import type z from 'zod' + +import { + supportRequestAdminTemplate, + supportRequestUserTemplate +} from '@/emails/templates' +import { HTTPException } from 'hono/http-exception' + +import { env, resend } from '@/config' + +class UserService { + help = async (data: z.infer) => { + const supportRequestAdmin = supportRequestAdminTemplate({ + email: data.email, + comment: data.comment + }) + + const supportRequestUser = supportRequestUserTemplate({ + comment: data.comment + }) + + const results = await Promise.allSettled([ + resend.emails.send({ + from: 'TaskPro ', + subject: '🆕 New Support Request', + to: env.RESEND_RECEIVER, + replyTo: data.email, + html: supportRequestAdmin + }), + + resend.emails.send({ + from: 'TaskPro ', + subject: 'Help Request', + to: data.email, + html: supportRequestUser + }) + ]) + + const [adminResult, userResult] = results + + const adminError = + adminResult.status === 'rejected' + ? adminResult.reason + : adminResult.value?.error + + const userError = + userResult.status === 'rejected' + ? userResult.reason + : userResult.value?.error + + if (adminError || userError) { + throw new HTTPException(500, { + message: + adminError?.message || userError?.message || 'Email sending failed' + }) + } + } +} + +export const userService = new UserService() diff --git a/app/types/auth.ts b/app/types/auth.ts new file mode 100644 index 0000000..f750bae --- /dev/null +++ b/app/types/auth.ts @@ -0,0 +1,6 @@ +import type { auth } from '@/lib' + +export type AuthVariables = { + user: typeof auth.$Infer.Session.user + session: typeof auth.$Infer.Session.session +} diff --git a/app/types/express.d.ts b/app/types/express.d.ts deleted file mode 100644 index 74d5731..0000000 --- a/app/types/express.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { Session, User } from 'better-auth' - -declare global { - namespace Express { - interface Request { - user: User - session: Session - } - } -} diff --git a/app/types/index.ts b/app/types/index.ts index 9b0f0b3..f3d249c 100644 --- a/app/types/index.ts +++ b/app/types/index.ts @@ -1,9 +1,2 @@ -export type { MicrosoftProfile } from './microsoft-profile' -export type { JwtPayload } from './jwt-payload' +export type { AuthVariables } from './auth' export type { SupportRequestEmail } from './support-request-email' -export type { - TypedRequest, - TypedRequestBody, - TypedRequestQuery, - TypedRequestParams -} from './request' diff --git a/app/types/jwt-payload.ts b/app/types/jwt-payload.ts deleted file mode 100644 index 00351be..0000000 --- a/app/types/jwt-payload.ts +++ /dev/null @@ -1,4 +0,0 @@ -export type JwtPayload = { - id?: string - sid?: string -} diff --git a/app/types/microsoft-profile.ts b/app/types/microsoft-profile.ts deleted file mode 100644 index 7a97de8..0000000 --- a/app/types/microsoft-profile.ts +++ /dev/null @@ -1,6 +0,0 @@ -export type MicrosoftProfile = { - name?: string - email?: string - preferred_username: string - upn: string -} diff --git a/app/types/request.ts b/app/types/request.ts deleted file mode 100644 index 4b74569..0000000 --- a/app/types/request.ts +++ /dev/null @@ -1,30 +0,0 @@ -import type { Request } from 'express' -import type { ParamsDictionary } from 'express-serve-static-core' -import type * as z from 'zod' - -export type TypedRequest< - P extends z.ZodType, - Q extends z.ZodType, - B extends z.ZodType -> = Request, unknown, z.infer, z.infer> - -export type TypedRequestBody = Request< - ParamsDictionary, - unknown, - z.infer, - unknown -> - -export type TypedRequestParams

= Request< - z.infer

, - unknown, - unknown, - unknown -> - -export type TypedRequestQuery = Request< - ParamsDictionary, - unknown, - unknown, - z.infer -> diff --git a/app/utils/index.ts b/app/utils/index.ts new file mode 100644 index 0000000..ca853b8 --- /dev/null +++ b/app/utils/index.ts @@ -0,0 +1,3 @@ +export { mapMicrosoftProfileToUser } from './map-microsoft-profile-to-user' +export { uploadToCloudinary } from './upload-to-cloudinary' +export { parseUserAgent } from './parse-user-agent' diff --git a/app/utils/map-microsoft-profile-to-user.ts b/app/utils/map-microsoft-profile-to-user.ts new file mode 100644 index 0000000..68a7c1a --- /dev/null +++ b/app/utils/map-microsoft-profile-to-user.ts @@ -0,0 +1,45 @@ +import type { MicrosoftEntraIDProfile, User } from 'better-auth' + +import { prisma } from '@/prisma' + +import cloudinary from '@/config' + +import { uploadToCloudinary } from './upload-to-cloudinary' + +export const mapMicrosoftProfileToUser = async ( + profile: MicrosoftEntraIDProfile +): Promise> => { + const email = profile.email ?? profile.preferred_username ?? profile.upn + + if (!email) throw new Error('Microsoft profile has no email') + + const user = await prisma.user.findUnique({ + where: { email: profile.email } + }) + + let image: string | undefined + let imagePublicId: string | undefined + + if (profile.picture) { + const uploadedImage = await uploadToCloudinary({ + file: profile.picture.trim().replace(/\s/g, ''), + folder: 'TaskPro/user_avatars' + }) + + image = uploadedImage.url + imagePublicId = uploadedImage.public_id + + if (user?.imagePublicId) { + await cloudinary.uploader.destroy(user.imagePublicId, { + type: 'upload', + resource_type: 'image' + }) + } + } + + return { + email, + ...(image && { image }), + ...(imagePublicId && { imagePublicId }) + } +} diff --git a/app/utils/parse-user-agent.ts b/app/utils/parse-user-agent.ts new file mode 100644 index 0000000..d2f9a14 --- /dev/null +++ b/app/utils/parse-user-agent.ts @@ -0,0 +1,12 @@ +import { UAParser } from 'ua-parser-js' + +export const parseUserAgent = (userAgent: string | null | undefined) => { + if (!userAgent) return { browser: '', os: '' } + + const parser = new UAParser(userAgent) + + const browser = parser.getBrowser() + const os = parser.getOS() + + return { browser: browser.name, os: os.name } +} diff --git a/app/lib/upload-to-cloudinary.ts b/app/utils/upload-to-cloudinary.ts similarity index 100% rename from app/lib/upload-to-cloudinary.ts rename to app/utils/upload-to-cloudinary.ts diff --git a/openapi.json b/openapi.json deleted file mode 100644 index ec4079d..0000000 --- a/openapi.json +++ /dev/null @@ -1,1158 +0,0 @@ -{ - "openapi": "3.1.0", - "info": { - "version": "2.3.0", - "title": "Task Pro API", - "description": "Task Pro API provides endpoints for managing projects, tasks, and user assignments with secure authentication and efficient workflows.", - "contact": { - "name": "TaskPro", - "url": "https://www.taskpro.qzz.io" - } - }, - "servers": [ - { "url": "http://localhost:9537/api" }, - { "url": "https://api.taskpro.qzz.io" } - ], - "paths": { - "/user/help": { - "post": { - "tags": ["User"], - "operationId": "help", - "summary": "Send email need help", - "security": [{ "bearerAuth": [] }], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "required": ["email", "comment"], - "properties": { - "email": { - "type": "string", - "format": "email", - "example": "user@example.com" - }, - "comment": { - "type": "string", - "example": "Need help with the Kanban board feature." - } - } - } - } - } - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string", - "example": "Email sent" - } - } - } - } - } - }, - "400": { "$ref": "#/components/responses/BadRequestError" }, - "401": { "$ref": "#/components/responses/Unauthorized" } - } - } - }, - "/board": { - "get": { - "tags": ["Board"], - "operationId": "getAllBoards", - "summary": "Get all boards", - "security": [{ "bearerAuth": [] }], - "responses": { - "200": { "$ref": "#/components/responses/AllBoardsResponse" }, - "401": { "$ref": "#/components/responses/Unauthorized" } - } - }, - "post": { - "tags": ["Board"], - "operationId": "createBoard", - "summary": "Create new board", - "security": [{ "bearerAuth": [] }], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "title": { - "type": "string", - "minLength": 3, - "example": "My New Project" - }, - "icon": { "$ref": "#/components/schemas/BoardIcon" }, - "background": { - "$ref": "#/components/schemas/BoardBackgroundId" - } - } - } - } - } - }, - "responses": { - "201": { "$ref": "#/components/responses/BoardResponse" }, - "400": { "$ref": "#/components/responses/BoardBadRequest" }, - "401": { "$ref": "#/components/responses/Unauthorized" } - } - } - }, - "/board/{boardId}": { - "get": { - "tags": ["Board"], - "operationId": "getBoardById", - "summary": "Get board by id", - "parameters": [ - { - "in": "path", - "name": "boardId", - "required": true, - "schema": { - "type": "string" - } - } - ], - "security": [{ "bearerAuth": [] }], - "responses": { - "200": { "$ref": "#/components/responses/BoardByIdResponse" }, - "401": { "$ref": "#/components/responses/Unauthorized" }, - "404": { "$ref": "#/components/responses/NotFound" } - } - }, - "patch": { - "tags": ["Board"], - "operationId": "updateBoard", - "summary": "Update board by id", - "parameters": [ - { - "in": "path", - "name": "boardId", - "required": true, - "schema": { - "type": "string" - } - } - ], - "security": [{ "bearerAuth": [] }], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "title": { - "type": "string", - "minLength": 3, - "example": "Updated Project Office" - }, - "icon": { "$ref": "#/components/schemas/BoardIcon" }, - "background": { - "$ref": "#/components/schemas/BoardBackgroundId" - } - } - } - } - } - }, - "responses": { - "200": { "$ref": "#/components/responses/BoardResponse" }, - "400": { "$ref": "#/components/responses/BoardBadRequest" }, - "401": { "$ref": "#/components/responses/Unauthorized" }, - "404": { "$ref": "#/components/responses/NotFound" } - } - }, - "delete": { - "tags": ["Board"], - "operationId": "deleteBoard", - "summary": "Delete board by id", - "parameters": [ - { - "in": "path", - "name": "boardId", - "required": true, - "schema": { - "type": "string" - } - } - ], - "security": [{ "bearerAuth": [] }], - "responses": { - "204": { "description": "The resource was deleted successfully." }, - "401": { "$ref": "#/components/responses/Unauthorized" }, - "404": { "$ref": "#/components/responses/NotFound" } - } - } - }, - "/column/{boardId}": { - "post": { - "tags": ["Column"], - "operationId": "createColumn", - "summary": "Create new column", - "parameters": [ - { - "in": "path", - "name": "boardId", - "required": true, - "schema": { - "type": "string" - } - } - ], - "security": [{ "bearerAuth": [] }], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "required": ["title"], - "properties": { - "title": { - "type": "string", - "minLength": 3, - "example": "To Do" - } - } - } - } - } - }, - "responses": { - "201": { "$ref": "#/components/responses/ColumnResponse" }, - "400": { "$ref": "#/components/responses/ColumnBadRequest" }, - "401": { "$ref": "#/components/responses/Unauthorized" }, - "404": { "$ref": "#/components/responses/NotFound" } - } - } - }, - "/column/{boardId}/order": { - "patch": { - "tags": ["Column"], - "operationId": "updateColumnsOrder", - "summary": "Update columns order", - "parameters": [ - { - "in": "path", - "name": "boardId", - "required": true, - "schema": { - "type": "string" - } - } - ], - "security": [{ "bearerAuth": [] }], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "required": ["ids"], - "properties": { - "ids": { - "type": "array", - "items": { - "type": "string" - }, - "example": [ - "67470731ed1b2ff3a2e5bd56", - "67470773c750b6298e1892ad", - "67470737ed1b2ff3a2e5bd57" - ] - } - } - } - } - } - }, - "responses": { - "200": { - "$ref": "#/components/responses/UpdateColumnsOrderResponse" - }, - "400": { "$ref": "#/components/responses/UpdateOrderBadRequest" }, - "401": { "$ref": "#/components/responses/Unauthorized" }, - "404": { "$ref": "#/components/responses/NotFound" } - } - } - }, - "/column/{columnId}": { - "patch": { - "tags": ["Column"], - "operationId": "updateColumn", - "summary": "Update column by id", - "parameters": [ - { - "in": "path", - "name": "columnId", - "required": true, - "schema": { - "type": "string" - } - } - ], - "security": [{ "bearerAuth": [] }], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "title": { - "type": "string", - "minLength": 3, - "example": "Doing" - } - } - } - } - } - }, - "responses": { - "200": { "$ref": "#/components/responses/ColumnResponse" }, - "400": { "$ref": "#/components/responses/ColumnBadRequest" }, - "401": { "$ref": "#/components/responses/Unauthorized" }, - "404": { "$ref": "#/components/responses/NotFound" } - } - }, - "delete": { - "tags": ["Column"], - "operationId": "deleteColumn", - "summary": "Delete column by id", - "parameters": [ - { - "in": "path", - "name": "columnId", - "required": true, - "schema": { - "type": "string" - } - } - ], - "security": [{ "bearerAuth": [] }], - "responses": { - "204": { "description": "The resource was deleted successfully." }, - "401": { "$ref": "#/components/responses/Unauthorized" }, - "404": { "$ref": "#/components/responses/NotFound" } - } - } - }, - "/task/{columnId}": { - "post": { - "tags": ["Task"], - "operationId": "createTask", - "summary": "Create new task", - "parameters": [ - { - "in": "path", - "name": "columnId", - "required": true, - "schema": { - "type": "string" - } - } - ], - "security": [{ "bearerAuth": [] }], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "required": ["title", "priority"], - "properties": { - "title": { - "type": "string", - "minLength": 3, - "example": "Publication of the project" - }, - "description": { - "type": "string", - "minLength": 3, - "example": "Review the project materials: Familiarize yourself with the project's content, including text, images, and any supplementary materials." - }, - "deadline": { - "type": "string", - "format": "date", - "example": "2025-10-15" - }, - "priority": { "$ref": "#/components/schemas/TaskPriority" }, - "labels": { - "type": "array", - "description": "Array of Label ids to attach to the task", - "items": { "type": "string" }, - "example": ["6672fdccc07147fc7ae1bb93"] - } - } - } - } - } - }, - "responses": { - "201": { "$ref": "#/components/responses/TaskResponse" }, - "400": { "$ref": "#/components/responses/TaskBadRequest" }, - "401": { "$ref": "#/components/responses/Unauthorized" }, - "404": { "$ref": "#/components/responses/NotFound" } - } - } - }, - "/task/{columnId}/order": { - "patch": { - "tags": ["Task"], - "operationId": "updateTasksOrder", - "summary": "Update tasks order", - "parameters": [ - { - "in": "path", - "name": "columnId", - "required": true, - "schema": { - "type": "string" - } - } - ], - "security": [{ "bearerAuth": [] }], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "required": ["ids"], - "properties": { - "ids": { - "type": "array", - "items": { - "type": "string" - }, - "example": [ - "6672fdccc07147fc7ae1bb93", - "6743474be4006eca6c8122e7" - ] - } - } - } - } - } - }, - "responses": { - "200": { "$ref": "#/components/responses/UpdateTaskOrderResponse" }, - "400": { "$ref": "#/components/responses/UpdateOrderBadRequest" }, - "401": { "$ref": "#/components/responses/Unauthorized" }, - "404": { "$ref": "#/components/responses/NotFound" } - } - } - }, - "/task/{taskId}": { - "patch": { - "tags": ["Task"], - "operationId": "updateTask", - "summary": "Update task by id", - "parameters": [ - { - "in": "path", - "name": "taskId", - "required": true, - "schema": { - "type": "string" - } - } - ], - "security": [{ "bearerAuth": [] }], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "title": { - "type": "string", - "minLength": 3, - "example": "Final Project Review" - }, - "description": { - "type": ["string", "null"], - "minLength": 3, - "example": "Review and finalize all project documentation." - }, - "deadline": { - "type": ["string", "null"], - "format": "date", - "example": "2025-11-01" - }, - "priority": { - "allOf": [{ "$ref": "#/components/schemas/TaskPriority" }], - "example": "low" - }, - "completed": { - "type": "boolean", - "example": true - }, - "columnId": { - "type": "string", - "example": "6672fdccc07147fc7ae1bb93", - "description": "Id of the column to move the task to" - }, - "labels": { - "type": "array", - "description": "Array of Label ids to attach to the task", - "items": { "type": "string" }, - "example": ["6672fdccc07147fc7ae1bb93"] - } - } - } - } - } - }, - "responses": { - "200": { "$ref": "#/components/responses/TaskResponse" }, - "400": { "$ref": "#/components/responses/TaskBadRequest" }, - "401": { "$ref": "#/components/responses/Unauthorized" }, - "404": { "$ref": "#/components/responses/NotFound" } - } - }, - "delete": { - "tags": ["Task"], - "operationId": "deleteTask", - "summary": "Delete task by id", - "parameters": [ - { - "in": "path", - "name": "taskId", - "required": true, - "schema": { - "type": "string" - } - } - ], - "security": [{ "bearerAuth": [] }], - "responses": { - "204": { "description": "The resource was deleted successfully." }, - "401": { "$ref": "#/components/responses/Unauthorized" }, - "404": { "$ref": "#/components/responses/NotFound" } - } - } - }, - "/label": { - "get": { - "tags": ["Label"], - "operationId": "getAllLabels", - "summary": "Get all labels", - "security": [{ "bearerAuth": [] }], - "responses": { - "200": { "$ref": "#/components/responses/AllLabelsResponse" }, - "401": { "$ref": "#/components/responses/Unauthorized" } - } - }, - "post": { - "tags": ["Label"], - "operationId": "createLabel", - "summary": "Create new label", - "security": [{ "bearerAuth": [] }], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "required": ["name", "color"], - "properties": { - "name": { - "type": "string", - "minLength": 2, - "example": "Bug" - }, - "color": { "$ref": "#/components/schemas/LabelColor" } - } - } - } - } - }, - "responses": { - "201": { "$ref": "#/components/responses/LabelResponse" }, - "400": { "$ref": "#/components/responses/LabelBadRequest" }, - "401": { "$ref": "#/components/responses/Unauthorized" } - } - } - }, - "/label/{labelId}": { - "patch": { - "tags": ["Label"], - "operationId": "updateLabel", - "summary": "Update label by id", - "parameters": [ - { - "in": "path", - "name": "labelId", - "required": true, - "schema": { - "type": "string" - } - } - ], - "security": [{ "bearerAuth": [] }], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 2, - "example": "Bug" - }, - "color": { "$ref": "#/components/schemas/LabelColor" } - } - } - } - } - }, - "responses": { - "200": { "$ref": "#/components/responses/LabelResponse" }, - "400": { "$ref": "#/components/responses/LabelBadRequest" }, - "401": { "$ref": "#/components/responses/Unauthorized" }, - "404": { "$ref": "#/components/responses/NotFound" } - } - }, - "delete": { - "tags": ["Label"], - "operationId": "deleteLabel", - "summary": "Delete label by id", - "parameters": [ - { - "in": "path", - "name": "labelId", - "required": true, - "schema": { - "type": "string" - } - } - ], - "security": [{ "bearerAuth": [] }], - "responses": { - "204": { "description": "The resource was deleted successfully." }, - "401": { "$ref": "#/components/responses/Unauthorized" }, - "404": { "$ref": "#/components/responses/NotFound" } - } - } - } - }, - "components": { - "schemas": { - "Board": { - "type": "object", - "required": [ - "id", - "title", - "icon", - "background", - "userId", - "createdAt", - "updatedAt" - ], - "properties": { - "id": { - "type": "string", - "example": "6672f1d2f02c8b04130c718c" - }, - "title": { - "type": "string", - "example": "Project office" - }, - "icon": { "$ref": "#/components/schemas/BoardIcon" }, - "background": { "$ref": "#/components/schemas/BoardBackground" }, - "userId": { - "type": "string", - "example": "6671743db85c96453e04a684" - }, - "columns": { - "type": "array", - "items": { "$ref": "#/components/schemas/Column" } - }, - "createdAt": { - "type": "string", - "format": "date-time", - "example": "2026-06-29T14:30:00.000Z" - }, - "updatedAt": { - "type": "string", - "format": "date-time", - "example": "2026-06-29T14:30:00.000Z" - } - } - }, - "BoardBackground": { - "type": "object", - "required": ["identifier", "url"], - "properties": { - "identifier": { "$ref": "#/components/schemas/BoardBackgroundId" }, - "url": { - "type": ["string", "null"], - "format": "url", - "example": "https://res.cloudinary.com/dmbnnewoy/image/upload/v1707099093/TaskPro/board_bg_images/desk/nfxep55xgvpq7xitemq1.jpg" - } - } - }, - "BoardBackgroundId": { - "type": "string", - "enum": [ - "default", - "flowers", - "mountains-night", - "sakura", - "night-sky", - "tropics", - "light-sky", - "sea-rocks", - "blue-ball", - "red-moon", - "sea-boat", - "air-balloons", - "gorge", - "sea-boat-2", - "air-balloons-2", - "northern-lights" - ], - "example": "flowers" - }, - "BoardIcon": { - "type": "string", - "enum": [ - "sparkles", - "layout", - "kanban", - "layers", - "compass", - "target", - "sunrise", - "orbit", - "palette", - "leaf" - ], - "example": "grid" - }, - "Column": { - "type": "object", - "required": [ - "id", - "title", - "order", - "boardId", - "createdAt", - "updatedAt" - ], - "properties": { - "id": { - "type": "string", - "example": "6672f604c07147fc7ae1bb81" - }, - "title": { "type": "string", "example": "In progress" }, - "order": { "type": "integer", "example": 1 }, - "boardId": { - "type": "string", - "example": "67470718ed1b2ff3a2e5bd55" - }, - "tasks": { - "type": "array", - "items": { "$ref": "#/components/schemas/Task" } - }, - "createdAt": { - "type": "string", - "format": "date-time", - "example": "2026-06-29T14:30:00.000Z" - }, - "updatedAt": { - "type": "string", - "format": "date-time", - "example": "2026-06-29T14:30:00.000Z" - } - } - }, - "Task": { - "type": "object", - "required": [ - "id", - "title", - "description", - "priority", - "deadline", - "completed", - "columnId", - "order", - "completedAt", - "createdAt", - "updatedAt" - ], - "properties": { - "id": { - "type": "string", - "example": "6672fdccc07147fc7ae1bb93" - }, - "title": { - "type": "string", - "example": "Publication of the project" - }, - "description": { - "type": ["string", "null"], - "example": "Review the project materials: Familiarize yourself with the project's content, including text, images, and any supplementary materials." - }, - "priority": { "$ref": "#/components/schemas/TaskPriority" }, - "deadline": { - "type": ["string", "null"], - "format": "date-time", - "example": "2025-10-15T00:00:00.000Z" - }, - "order": { "type": "integer", "example": 1 }, - "completed": { "type": "boolean", "example": false }, - "completedAt": { - "type": ["string", "null"], - "format": "date-time", - "example": null - }, - "columnId": { - "type": "string", - "example": "6671743db85c96453e04a684" - }, - "labels": { - "type": "array", - "items": { "$ref": "#/components/schemas/Label" } - }, - "createdAt": { - "type": "string", - "format": "date-time", - "example": "2026-06-29T14:30:00.000Z" - }, - "updatedAt": { - "type": "string", - "format": "date-time", - "example": "2026-06-29T14:30:00.000Z" - } - } - }, - "TaskPriority": { - "type": "string", - "enum": ["without", "low", "medium", "high"], - "example": "high" - }, - "Label": { - "type": "object", - "required": ["id", "name", "color", "userId", "createdAt", "updatedAt"], - "properties": { - "id": { - "type": "string", - "example": "6672fdccc07147fc7ae1bb93" - }, - "name": { - "type": "string", - "example": "Bug" - }, - "color": { "$ref": "#/components/schemas/LabelColor" }, - "userId": { - "type": "string", - "example": "6671743db85c96453e04a684" - }, - "taskId": { - "type": ["string", "null"], - "example": null - }, - "createdAt": { - "type": "string", - "format": "date-time", - "example": "2026-06-29T14:30:00.000Z" - }, - "updatedAt": { - "type": "string", - "format": "date-time", - "example": "2026-06-29T14:30:00.000Z" - } - } - }, - "LabelColor": { - "type": "string", - "enum": [ - "blue", - "purple", - "red", - "gray", - "cyan", - "yellow", - "indigo", - "green" - ], - "example": "red" - }, - "ErrorResponse": { - "type": "object", - "properties": { - "statusCode": { "type": "integer", "example": 400 }, - "message": { - "oneOf": [{ "type": "string" }, { "type": "object" }] - } - } - } - }, - "responses": { - "NotFound": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse", - "example": { "statusCode": 404, "message": "Not found" } - } - } - } - }, - "Conflict": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse", - "example": { - "statusCode": 409, - "message": "Provided email already exists" - } - } - } - } - }, - "Unauthorized": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse", - "example": { "statusCode": 401, "message": "Unauthorized" } - } - } - } - }, - "Forbidden": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse", - "example": { "statusCode": 403, "message": "Forbidden" } - } - } - } - }, - "BadRequestError": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse", - "example": { - "statusCode": 400, - "message": { - "email": "The field must have a valid email format", - "password": "The field must be at least 8 characters", - "name": "The field must be at least 2 characters" - } - } - } - } - } - }, - "UpdateOrderBadRequest": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse", - "example": { - "statusCode": 400, - "message": { - "ids": "The field must be of type array" - } - } - } - } - } - }, - "AllBoardsResponse": { - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { "$ref": "#/components/schemas/Board" } - } - } - } - }, - "BoardResponse": { - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Board" } - } - } - }, - "BoardBadRequest": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse", - "example": { - "statusCode": 400, - "message": { - "title": "The field must be at least 3 characters", - "icon": "The field must be one of the following values: sparkles, layout, kanban, layers, compass, target, sunrise, orbit, palette, leaf" - } - } - } - } - } - }, - "BoardByIdResponse": { - "content": { - "application/json": { - "schema": { - "allOf": [ - { "$ref": "#/components/schemas/Board" }, - { - "type": "object", - "properties": { - "columns": { - "type": "array", - "items": { - "allOf": [ - { "$ref": "#/components/schemas/Column" }, - { - "type": "object", - "properties": { - "tasks": { - "type": "array", - "items": { "$ref": "#/components/schemas/Task" } - } - } - } - ] - } - } - } - } - ] - } - } - } - }, - "ColumnResponse": { - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Column" } - } - } - }, - "ColumnBadRequest": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse", - "example": { - "statusCode": 400, - "message": { - "title": "The field must be at least 3 characters", - "boardId": "The field must have a valid ObjectId format" - } - } - } - } - } - }, - "UpdateColumnsOrderResponse": { - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { "$ref": "#/components/schemas/Column" } - } - } - } - }, - "TaskResponse": { - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Task" } - } - } - }, - "TaskBadRequest": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse", - "example": { - "statusCode": 400, - "message": { - "description": "The field must be of type string", - "priority": "The field must be one of the following values: without, low, medium, high", - "columnId": "The field must have a valid ObjectId format" - } - } - } - } - } - }, - "UpdateTaskOrderResponse": { - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { "$ref": "#/components/schemas/Task" } - } - } - } - }, - "AllLabelsResponse": { - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { "$ref": "#/components/schemas/Label" } - } - } - } - }, - "LabelResponse": { - "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/Label" } - } - } - }, - "LabelBadRequest": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse", - "example": { - "statusCode": 400, - "message": { - "color": "The field must be one of the following values: blue, purple, red, gray, cyan, yellow, indigo, green" - } - } - } - } - } - } - }, - "securitySchemes": { - "bearerAuth": { - "type": "http", - "scheme": "bearer", - "bearerFormat": "JWT" - } - } - } -} diff --git a/package.json b/package.json index ab00641..5c51ca5 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,13 @@ { "name": "taskpro-backend", - "version": "0.0.0", "private": true, + "type": "module", "engines": { "node": ">=22.0.0" }, "scripts": { - "start": "node dist/app/server.js", - "build": "swc app -d dist --copy-files", + "start": "node dist/server.cjs", + "build": "tsup app/server.ts", "dev": "tsx watch --include ./openapi.json app/server.ts", "lint": "eslint --fix app/**/*.ts", "format": "prettier --write ./app", @@ -18,22 +18,18 @@ "schema": "./prisma" }, "dependencies": { + "@better-auth/passkey": "^1.6.23", "@better-auth/redis-storage": "^1.6.23", + "@hono/node-server": "^2.0.11", + "@hono/swagger-ui": "^0.6.1", + "@hono/zod-openapi": "^1.5.1", "@prisma/client": "^6.19.3", "better-auth": "^1.6.23", "cloudinary": "^2.10.0", - "cookie-parser": "^1.4.7", - "cors": "2.8.6", - "dotenv": "^17.4.2", - "express": "^5.2.1", - "helmet": "^8.2.0", - "http-errors": "^2.0.1", + "hono": "^4.12.31", "ioredis": "^5.11.1", - "jose": "^6.2.3", - "morgan": "1.11.0", - "multer": "^2.2.0", "resend": "^6.17.2", - "swagger-ui-express": "^5.0.1", + "ua-parser-js": "^2.0.10", "zod": "^4.4.3" }, "devDependencies": { @@ -41,16 +37,7 @@ "@commitlint/config-conventional": "^21.2.0", "@eslint/js": "^10.0.1", "@ianvs/prettier-plugin-sort-imports": "^4.7.1", - "@swc/cli": "^0.8.1", - "@swc/core": "^1.15.43", - "@types/cookie-parser": "^1.4.10", - "@types/cors": "^2.8.19", - "@types/express": "5.0.6", - "@types/morgan": "^1.9.10", - "@types/multer": "^2.2.0", "@types/node": "^25.9.5", - "@types/nodemailer": "^8.0.1", - "@types/swagger-ui-express": "^4.1.8", "eslint": "^10.7.0", "eslint-formatter-mo": "^2.4.1", "globals": "^17.7.0", @@ -59,6 +46,7 @@ "lint-staged": "^17.0.8", "prettier": "^3.9.5", "prisma": "^6.19.3", + "tsup": "^8.5.1", "tsx": "^4.23.0", "typescript": "^6.0.3", "typescript-eslint": "^8.63.0" diff --git a/prisma/models/label.prisma b/prisma/models/label.prisma index 6daf78b..90ee7dc 100644 --- a/prisma/models/label.prisma +++ b/prisma/models/label.prisma @@ -1,7 +1,8 @@ model Label { - id String @id @default(auto()) @map("_id") @db.ObjectId - name String - color LabelColor + id String @id @default(auto()) @map("_id") @db.ObjectId + name String + description String? + color AccentColor userId String @db.ObjectId user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@ -15,14 +16,3 @@ model Label { @@unique([userId, name]) @@map("labels") } - -enum LabelColor { - blue - purple - red - gray - cyan - yellow - indigo - green -} diff --git a/prisma/models/passkey.prisma b/prisma/models/passkey.prisma new file mode 100644 index 0000000..7fda49d --- /dev/null +++ b/prisma/models/passkey.prisma @@ -0,0 +1,21 @@ +model Passkey { + id String @id @default(auto()) @map("_id") @db.ObjectId + name String? + aaguid String? + transports String? + counter Int + + deviceType String @map("device_type") + backedUp Boolean @map("backed_up") + publicKey String @map("public_key") + credentialID String @map("credential_id") + + createdAt DateTime? @map("created_at") + + userId String @map("user_id") @db.ObjectId + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + + @@index([userId]) + @@index([credentialID]) + @@map("passkeys") +} diff --git a/prisma/models/settings.prisma b/prisma/models/settings.prisma new file mode 100644 index 0000000..3582efd --- /dev/null +++ b/prisma/models/settings.prisma @@ -0,0 +1,149 @@ +model UserSettings { + id String @id @default(auto()) @map("_id") @db.ObjectId + + theme Theme @default(light) + accentColor AccentColor @default(blue) @map("accent_color") + + firstDayOfWeek WeekStart @default(monday) @map("first_day_of_week") + dateFormat DateFormat @default(dd_mm_yyyy) @map("date_format") + boardBackgroundBlur BoardBackgroundBlur @default(off) @map("board_background_blur") + usePointerCursors Boolean @default(true) @map("use_pointer_cursors") + enableAnimations Boolean @default(true) @map("enable_animations") + confirmBeforeDelete Boolean @default(true) @map("confirm_before_delete") + + userId String @map("user_id") @db.ObjectId + user User @relation(fields: [userId], references: [id]) + + @@unique([userId]) + @@map("user_settings") +} + +model TaskSettings { + id String @id @default(auto()) @map("_id") @db.ObjectId + + sortTasksBy TaskSort @default(manual) @map("sort_tasks_by") + + defaultPriority Priority @default(without) @map("default_priority") + defaultDeadline DefaultDeadline @default(none) @map("default_deadline") + + cardDensity CardDensity @default(compact) @map("card_density") + showCompletedTasks Boolean @default(true) @map("show_completed_tasks") + showPriorityIndicator Boolean @default(true) @map("show_priority_indicator") + newTaskPosition NewTaskPosition @default(bottom) @map("new_task_position") + + enableNaturalLanguageDates Boolean @default(true) @map("enable_natural_language_dates") + + userId String @map("user_id") @db.ObjectId + user User @relation(fields: [userId], references: [id]) + + @@unique([userId]) + @@map("task_settings") +} + +model LabelSettings { + id String @id @default(auto()) @map("_id") @db.ObjectId + + showLabelsOnTask Boolean @default(true) @map("show_labels_on_task") + labelDisplay LabelDisplay @default(full) @map("label_display") + maxLabelsShown MaxLabelsShown @default(three) @map("max_labels_shown") + + userId String @map("user_id") @db.ObjectId + user User @relation(fields: [userId], references: [id]) + + @@unique([userId]) + @@map("label_settings") +} + +model AccessibilitySettings { + id String @id @default(auto()) @map("_id") @db.ObjectId + + fontSize FontSize @default(medium) @map("font_size") + reducedMotion Boolean @default(false) @map("reduced_motion") + highContrast Boolean @default(false) @map("high_contrast") + focusIndicators Boolean @default(true) @map("focus_indicators") + keyboardNavigationHints Boolean @default(false) @map("keyboard_navigation_hints") + + userId String @map("user_id") @db.ObjectId + user User @relation(fields: [userId], references: [id]) + + @@unique([userId]) + @@map("accessibility_settings") +} + +enum Theme { + light + dark + system +} + +enum AccentColor { + blue + purple + red + gray + cyan + yellow + indigo + green +} + +enum WeekStart { + sunday + monday +} + +enum BoardBackgroundBlur { + off + low + medium +} + +enum NewTaskPosition { + top + bottom +} + +enum DefaultDeadline { + none + today + tomorrow + three_days + one_week +} + +enum FontSize { + small + medium + large +} + +enum MaxLabelsShown { + one + two + three + all +} + +enum CardDensity { + compact + comfortable +} + +enum TaskSort { + manual + priority + deadline + created + alphabetical +} + +enum LabelDisplay { + full + compact +} + +enum DateFormat { + dd_mm_yyyy + mm_dd_yyyy + yyyy_mm_dd +} diff --git a/prisma/models/user.prisma b/prisma/models/user.prisma index 580a878..665ec0d 100644 --- a/prisma/models/user.prisma +++ b/prisma/models/user.prisma @@ -5,22 +5,21 @@ model User { emailVerified Boolean @default(false) @map("email_verified") image String? imagePublicId String? @map("image_public_id") - theme Theme @default(light) sessions Session[] accounts Account[] + passkeys Passkey[] boards Board[] labels Label[] + settings UserSettings? + taskSettings TaskSettings? + labelSettings LabelSettings? + accessibilitySettings AccessibilitySettings? + createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") @@unique([email]) @@map("users") } - -enum Theme { - light - dark - system -} diff --git a/tsconfig.json b/tsconfig.json index e960264..e024e59 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,18 +1,21 @@ { "compilerOptions": { - "target": "ES2020", - "module": "nodenext", - "moduleResolution": "nodenext", - "outDir": "./dist", + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "Bundler", + "strict": true, + "verbatimModuleSyntax": true, + "skipLibCheck": true, + "types": ["node"], + "jsxImportSource": "hono/jsx", "rootDir": "./app", + "outDir": "./dist", "baseUrl": ".", "paths": { "@/*": ["app/*"] }, - "esModuleInterop": true, - "strict": true, - "resolveJsonModule": true, "forceConsistentCasingInFileNames": true, - "ignoreDeprecations": "6.0", - "skipLibCheck": true + "noUncheckedIndexedAccess": true, + "noImplicitOverride": true, + "ignoreDeprecations": "6.0" }, "include": ["app"] } diff --git a/yarn.lock b/yarn.lock index a172050..d3019ef 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,13 @@ # yarn lockfile v1 +"@asteasolutions/zod-to-openapi@^8.5.0": + version "8.5.0" + resolved "https://registry.yarnpkg.com/@asteasolutions/zod-to-openapi/-/zod-to-openapi-8.5.0.tgz#f073822daad87c4ab2ae991ee86b1a5070ac9942" + integrity sha512-SABbKiObg5dLRiTFnqiW1WWwGcg1BJfmHtT2asIBnBHg6Smy/Ms2KHc650+JI4Hw7lSkdiNebEGXpwoxfben8Q== + dependencies: + openapi3-ts "^4.1.2" + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.29.7": version "7.29.7" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.7.tgz#f2fbbfea87c44a21590ec515b778b2c26d8866e7" @@ -103,6 +110,15 @@ resolved "https://registry.yarnpkg.com/@better-auth/mongo-adapter/-/mongo-adapter-1.6.23.tgz#21637c529c8bc1b5ff27de8b96059d781acd151f" integrity sha512-7+QdevitGlKBbP6JbiSk5SBnzPsKV/mDrQBGBn8hwByQLeJwqpqbuBPw7ZI8vzUlFfAAnyFiqwP3Eb8mxnp7pA== +"@better-auth/passkey@^1.6.23": + version "1.6.23" + resolved "https://registry.yarnpkg.com/@better-auth/passkey/-/passkey-1.6.23.tgz#953f52105e9a24491e7a6f9a5b31fa4fbe82e057" + integrity sha512-nr5tKaNd/huUwTYX4DUm4HcXgBkixj0lXrRHdy9azY4fFjF49Tyif4sPyRMWnQJYxlRJ1HVEMJq2nGyr5CLXQg== + dependencies: + "@simplewebauthn/browser" "^13.2.2" + "@simplewebauthn/server" "^13.2.3" + zod "^4.3.6" + "@better-auth/prisma-adapter@1.6.23": version "1.6.23" resolved "https://registry.yarnpkg.com/@better-auth/prisma-adapter/-/prisma-adapter-1.6.23.tgz#d141a4cc74785392bb0490d37002bd6d75b3b661" @@ -130,11 +146,6 @@ resolved "https://registry.yarnpkg.com/@better-fetch/fetch/-/fetch-1.3.1.tgz#04a0d289de818a0b436bfda48e70b2b19227cc19" integrity sha512-ABkD1WhyfPZprKRQI3bhATjeiFuNWC9PXhfGWqL+sg/gKrM977oFrYkdb4msM3hgUGonr7KlOsOFT5TU2rht9g== -"@borewit/text-codec@^0.2.1": - version "0.2.2" - resolved "https://registry.yarnpkg.com/@borewit/text-codec/-/text-codec-0.2.2.tgz#75025f735c0983b3a871668804a57387e3649375" - integrity sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ== - "@commitlint/cli@^21.2.1": version "21.2.1" resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-21.2.1.tgz#a1b4fa3d4366ac5d09e591218cb633f7fc031704" @@ -298,131 +309,261 @@ resolved "https://registry.yarnpkg.com/@conventional-changelog/template/-/template-1.2.1.tgz#8f673635d6ec8289bc5d5a1264629fd1e88b8d4f" integrity sha512-TzlTVpKPjaqW6qOYjQcYUDuGsLCNsvFHVBXkYGTAnf5V37jCWrE5haKNXzz0WZUtVHjrpV76L1buANjwXMfT8w== +"@esbuild/aix-ppc64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz#82b74f92aa78d720b714162939fb248c90addf53" + integrity sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg== + "@esbuild/aix-ppc64@0.28.1": version "0.28.1" resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz#7a01a8d2ec2fbb2dac78adad09b0fa781e4082be" integrity sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ== +"@esbuild/android-arm64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz#f78cb8a3121fc205a53285adb24972db385d185d" + integrity sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ== + "@esbuild/android-arm64@0.28.1": version "0.28.1" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz#b540a27d14e4afd058496a4dbec4d3f414db110a" integrity sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg== +"@esbuild/android-arm@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.27.7.tgz#593e10a1450bbfcac6cb321f61f468453bac209d" + integrity sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ== + "@esbuild/android-arm@0.28.1": version "0.28.1" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.28.1.tgz#704bd297de6d762de54eabbeafbf55f6756abe2f" integrity sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ== +"@esbuild/android-x64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.27.7.tgz#453143d073326033d2d22caf9e48de4bae274b07" + integrity sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg== + "@esbuild/android-x64@0.28.1": version "0.28.1" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.28.1.tgz#d1cb166d34b0fbf0fe8ab460a5594f24a378701e" integrity sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng== +"@esbuild/darwin-arm64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz#6f23000fb9b40b7e04b7d0606c0693bd0632f322" + integrity sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw== + "@esbuild/darwin-arm64@0.28.1": version "0.28.1" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz#1034b26457fc886368fe61bbd09f653f6afa8e54" integrity sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q== +"@esbuild/darwin-x64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz#27393dd18bb1263c663979c5f1576e00c2d024be" + integrity sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ== + "@esbuild/darwin-x64@0.28.1": version "0.28.1" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz#65556a432a1e4d72032d8218c1932fcca1a49772" integrity sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ== +"@esbuild/freebsd-arm64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz#22e4638fa502d1c0027077324c97640e3adf3a62" + integrity sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w== + "@esbuild/freebsd-arm64@0.28.1": version "0.28.1" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz#2e61e0592f9030d7e3dae18ee25ebc535918aef6" integrity sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw== +"@esbuild/freebsd-x64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz#9224b8e4fea924ce2194e3efc3e9aebf822192d6" + integrity sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ== + "@esbuild/freebsd-x64@0.28.1": version "0.28.1" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz#c95ec289959ef8079c4dca817a1e2c4be66b9bd3" integrity sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ== +"@esbuild/linux-arm64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz#4f5d1c27527d817b35684ae21419e57c2bda0966" + integrity sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A== + "@esbuild/linux-arm64@0.28.1": version "0.28.1" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz#40b22175dda06182f3ee8141186c5ff304c4a717" integrity sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g== +"@esbuild/linux-arm@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz#b9e9d070c8c1c0449cf12b20eac37d70a4595921" + integrity sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA== + "@esbuild/linux-arm@0.28.1": version "0.28.1" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz#c09a0f67917592ac0de892a9be4d3814debd2a6c" integrity sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ== +"@esbuild/linux-ia32@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz#3f80fb696aa96051a94047f35c85b08b21c36f9e" + integrity sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg== + "@esbuild/linux-ia32@0.28.1": version "0.28.1" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz#a580f9c676797833891e519fc7a1337c8afd8db3" integrity sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w== +"@esbuild/linux-loong64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz#9be1f2c28210b13ebb4156221bba356fe1675205" + integrity sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q== + "@esbuild/linux-loong64@0.28.1": version "0.28.1" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz#46452cf321dc7f9e91c2fa780a56bb56e79cd68b" integrity sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg== +"@esbuild/linux-mips64el@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz#4ab5ee67a3dfcbcb5e8fd7883dae6e735b1163b8" + integrity sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw== + "@esbuild/linux-mips64el@0.28.1": version "0.28.1" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz#4211b3184dd6608f53dcb22e39f5d34ee08852c8" integrity sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ== +"@esbuild/linux-ppc64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz#dac78c689f6499459c4321e5c15032c12307e7ea" + integrity sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ== + "@esbuild/linux-ppc64@0.28.1": version "0.28.1" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz#697857c2a61cb9b0b6bb6652e40c1dc5e1ca8e5d" integrity sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ== +"@esbuild/linux-riscv64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz#050f7d3b355c3a98308e935bc4d6325da91b0027" + integrity sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ== + "@esbuild/linux-riscv64@0.28.1": version "0.28.1" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz#d192943eb146a40ac4c6497d0cf7be35b986bf08" integrity sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ== +"@esbuild/linux-s390x@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz#d61f715ce61d43fe5844ad0d8f463f88cbe4fef6" + integrity sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw== + "@esbuild/linux-s390x@0.28.1": version "0.28.1" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz#acea0356da0e0ebc08f97cf7b9c2e401e1e648dc" integrity sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag== +"@esbuild/linux-x64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz#ca8e1aa478fc8209257bf3ac8f79c4dc2982f32a" + integrity sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA== + "@esbuild/linux-x64@0.28.1": version "0.28.1" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz#6f0c3ce0cb64c534b70c4c45ecb2c16d34e35dfd" integrity sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA== +"@esbuild/netbsd-arm64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz#1650f2c1b948deeb3ef948f2fc30614723c09690" + integrity sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w== + "@esbuild/netbsd-arm64@0.28.1": version "0.28.1" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz#8bcd77077a0dce3378b574fedb26d2a253b73d36" integrity sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw== +"@esbuild/netbsd-x64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz#65772ab342c4b3319bf0705a211050aac1b6e320" + integrity sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw== + "@esbuild/netbsd-x64@0.28.1": version "0.28.1" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz#e7fb2a01e99c830c94e6623cd9fefb4c8fb58347" integrity sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg== +"@esbuild/openbsd-arm64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz#37ed7cfa66549d7955852fce37d0c3de4e715ea1" + integrity sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A== + "@esbuild/openbsd-arm64@0.28.1": version "0.28.1" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz#c52909372db8b86e2c55e05a8940033b5660a3b2" integrity sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q== +"@esbuild/openbsd-x64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz#01bf3d385855ef50cb33db7c4b52f957c34cd179" + integrity sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg== + "@esbuild/openbsd-x64@0.28.1": version "0.28.1" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz#c427b9be5a64c262ff9a7eb70b5fbbaadf446c6c" integrity sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw== +"@esbuild/openharmony-arm64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz#6c1f94b34086599aabda4eac8f638294b9877410" + integrity sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw== + "@esbuild/openharmony-arm64@0.28.1": version "0.28.1" resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz#dc9b147baca2e6c4b3c85571741ef4860a489097" integrity sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg== +"@esbuild/sunos-x64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz#4b0dd17ae0a6941d2d0fd35a906392517071a90d" + integrity sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA== + "@esbuild/sunos-x64@0.28.1": version "0.28.1" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz#ce866d12df13c15e4c99f073a3d466f6e0649b3a" integrity sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ== +"@esbuild/win32-arm64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz#34193ab5565d6ff68ca928ac04be75102ccb2e77" + integrity sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA== + "@esbuild/win32-arm64@0.28.1": version "0.28.1" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz#7468e3692d01d629d5941e5d83817bb80f9e39b4" integrity sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA== +"@esbuild/win32-ia32@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz#eb67f0e4482515d8c1894ede631c327a4da9fc4d" + integrity sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw== + "@esbuild/win32-ia32@0.28.1": version "0.28.1" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz#a5bc0063fb2bcab6d0ed63f2a1537958bc269ec6" integrity sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg== +"@esbuild/win32-x64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz#8fe30b3088b89b4873c3a6cc87597ae3920c0a8b" + integrity sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg== + "@esbuild/win32-x64@0.28.1": version "0.28.1" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz#10064ee44f4347b90c9a02b446bbf80a91632b12" @@ -481,6 +622,35 @@ "@eslint/core" "^1.2.1" levn "^0.4.1" +"@hexagon/base64@^1.1.27": + version "1.1.28" + resolved "https://registry.yarnpkg.com/@hexagon/base64/-/base64-1.1.28.tgz#7d306a97f1423829be5b27c9d388fe50e3099d48" + integrity sha512-lhqDEAvWixy3bZ+UOYbPwUbBkwBq5C1LAJ/xPC8Oi+lL54oyakv/npbA0aU2hgCsx/1NUd4IBvV03+aUBWxerw== + +"@hono/node-server@^2.0.11": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@hono/node-server/-/node-server-2.0.11.tgz#0e947b19fe8602232cf6049feeda8f15dea47569" + integrity sha512-bjD221KPLoJTWUwso1J6fGKiTXEUFedG/s0visavY4zakFPkeGURMRNly+FhBHs7T8Dz4qHaZIMX9ZoJHSJtKA== + +"@hono/swagger-ui@^0.6.1": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@hono/swagger-ui/-/swagger-ui-0.6.1.tgz#7eece7b346f208153e3122bae8316cdb3bee1c6e" + integrity sha512-sJTvldu1GPeEPfyeLG7gRj+W4vEuD+JDi+JjJ3TJs/DvMUtBLs0KJO5yokGegWWdy5qrbdnQGekbhgNRmPmYKQ== + +"@hono/zod-openapi@^1.5.1": + version "1.5.1" + resolved "https://registry.yarnpkg.com/@hono/zod-openapi/-/zod-openapi-1.5.1.tgz#46689572ecaf9bf7fe501a72afe8a8c41c2f8a03" + integrity sha512-ZaDdEIkn6PEGjIYHXJeyByg6yhvLzI+UXn968pWtahpwcQ6HMjQYXI3zNffTl0Wl9QZ79nUnGqiN1erEIu23fA== + dependencies: + "@asteasolutions/zod-to-openapi" "^8.5.0" + "@hono/zod-validator" "^0.9.0" + openapi3-ts "^4.5.0" + +"@hono/zod-validator@^0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@hono/zod-validator/-/zod-validator-0.9.0.tgz#c7aca09d74f35d228c4ec6128ca627f097038a2c" + integrity sha512-n0ZSXmCiHVIp4Y5wlOOyZCeTd/rsawA/qW1cipB8QOYKZ9N8Tk0nZUZCXho9cu374AN4JpDNKioNKBJ/W+LBug== + "@humanfs/core@^0.19.2": version "0.19.2" resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.2.tgz#a8272ca03b2acf492670222b2320b6c421bfde60" @@ -528,7 +698,7 @@ resolved "https://registry.yarnpkg.com/@ioredis/commands/-/commands-1.10.0.tgz#cc387f8ec5ebe5b3b5104d393b5ac1f9cf794b9a" integrity sha512-UmeW7z4LfctwoQ5wkhVzgq8tXkreED2xZGpX+Bg+zA+WJFZCT6c062AfCK/Dfk81xZnnwdhJCUMkitihRaoC2Q== -"@jridgewell/gen-mapping@^0.3.12": +"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.2": version "0.3.13" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f" integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== @@ -541,7 +711,7 @@ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": +"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0", "@jridgewell/sourcemap-codec@^1.5.5": version "1.5.5" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== @@ -554,118 +724,10 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@keyv/serialize@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@keyv/serialize/-/serialize-1.1.1.tgz#0c01dd3a3483882af7cf3878d4e71d505c81fc4a" - integrity sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA== - -"@napi-rs/nice-android-arm-eabi@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.1.1.tgz#4ebd966821cd6c2cc7cc020eb468de397bb9b40f" - integrity sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw== - -"@napi-rs/nice-android-arm64@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.1.1.tgz#e183ba874512bc005852daab8b78c63e0a4288a8" - integrity sha512-blG0i7dXgbInN5urONoUCNf+DUEAavRffrO7fZSeoRMJc5qD+BJeNcpr54msPF6qfDD6kzs9AQJogZvT2KD5nw== - -"@napi-rs/nice-darwin-arm64@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.1.1.tgz#64b1585809774cbb8bf95cea3d4c8827c9897394" - integrity sha512-s/E7w45NaLqTGuOjC2p96pct4jRfo61xb9bU1unM/MJ/RFkKlJyJDx7OJI/O0ll/hrfpqKopuAFDV8yo0hfT7A== - -"@napi-rs/nice-darwin-x64@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.1.1.tgz#99c0c7f62cb1e23ca76881bb29cc6000aeccc6f0" - integrity sha512-dGoEBnVpsdcC+oHHmW1LRK5eiyzLwdgNQq3BmZIav+9/5WTZwBYX7r5ZkQC07Nxd3KHOCkgbHSh4wPkH1N1LiQ== - -"@napi-rs/nice-freebsd-x64@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.1.1.tgz#9a5ca0e3ced86207887c98a5a560de8cde5a909e" - integrity sha512-kHv4kEHAylMYmlNwcQcDtXjklYp4FCf0b05E+0h6nDHsZ+F0bDe04U/tXNOqrx5CmIAth4vwfkjjUmp4c4JktQ== - -"@napi-rs/nice-linux-arm-gnueabihf@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.1.1.tgz#b8a6a1bc88d0de3e99ac3fdea69980dc6e20b502" - integrity sha512-E1t7K0efyKXZDoZg1LzCOLxgolxV58HCkaEkEvIYQx12ht2pa8hoBo+4OB3qh7e+QiBlp1SRf+voWUZFxyhyqg== - -"@napi-rs/nice-linux-arm64-gnu@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.1.1.tgz#226f1ef30fcb80fa40370e843b75cc86e39e1183" - integrity sha512-CIKLA12DTIZlmTaaKhQP88R3Xao+gyJxNWEn04wZwC2wmRapNnxCUZkVwggInMJvtVElA+D4ZzOU5sX4jV+SmQ== - -"@napi-rs/nice-linux-arm64-musl@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.1.1.tgz#01345c3db79210ba5406c8729e8db75ed11c5f14" - integrity sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg== - -"@napi-rs/nice-linux-ppc64-gnu@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.1.1.tgz#ce7a1025227daab491ded40784b561394d688fcb" - integrity sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg== - -"@napi-rs/nice-linux-riscv64-gnu@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.1.1.tgz#9bef5dc89a0425d03163853b4968dbb686d98fd5" - integrity sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw== - -"@napi-rs/nice-linux-s390x-gnu@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.1.1.tgz#247c8c7c45876877bdb337cfeb290ff4fd82de62" - integrity sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ== - -"@napi-rs/nice-linux-x64-gnu@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.1.1.tgz#7fd1f5e037cb44ab4f5f95a3b3225a99e3248f12" - integrity sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg== - -"@napi-rs/nice-linux-x64-musl@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.1.1.tgz#d447cd7157ae5da5c0b15fc618bf61f0c344ff6f" - integrity sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw== - -"@napi-rs/nice-openharmony-arm64@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@napi-rs/nice-openharmony-arm64/-/nice-openharmony-arm64-1.1.1.tgz#1120e457d2cc6b2bc86ef0a697faefe2e194dfce" - integrity sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ== - -"@napi-rs/nice-win32-arm64-msvc@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.1.1.tgz#91e4cfecf339b43fa7934f0c8b19d04f4cdd9bc0" - integrity sha512-uoTb4eAvM5B2aj/z8j+Nv8OttPf2m+HVx3UjA5jcFxASvNhQriyCQF1OB1lHL43ZhW+VwZlgvjmP5qF3+59atA== - -"@napi-rs/nice-win32-ia32-msvc@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.1.1.tgz#ed9300bba074d3e3b0a077d6b157f2b4ff70af0e" - integrity sha512-CNQqlQT9MwuCsg1Vd/oKXiuH+TcsSPJmlAFc5frFyX/KkOh0UpBLEj7aoY656d5UKZQMQFP7vJNa1DNUNORvug== - -"@napi-rs/nice-win32-x64-msvc@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.1.1.tgz#8292b82fb46458618ccff5b8130f78974349541e" - integrity sha512-vB+4G/jBQCAh0jelMTY3+kgFy00Hlx2f2/1zjMoH821IbplbWZOkLiTYXQkygNTzQJTq5cvwBDgn2ppHD+bglQ== - -"@napi-rs/nice@^1.0.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@napi-rs/nice/-/nice-1.1.1.tgz#c1aacd631ecd4c500c959e3e7cfedd5c73bffe2a" - integrity sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw== - optionalDependencies: - "@napi-rs/nice-android-arm-eabi" "1.1.1" - "@napi-rs/nice-android-arm64" "1.1.1" - "@napi-rs/nice-darwin-arm64" "1.1.1" - "@napi-rs/nice-darwin-x64" "1.1.1" - "@napi-rs/nice-freebsd-x64" "1.1.1" - "@napi-rs/nice-linux-arm-gnueabihf" "1.1.1" - "@napi-rs/nice-linux-arm64-gnu" "1.1.1" - "@napi-rs/nice-linux-arm64-musl" "1.1.1" - "@napi-rs/nice-linux-ppc64-gnu" "1.1.1" - "@napi-rs/nice-linux-riscv64-gnu" "1.1.1" - "@napi-rs/nice-linux-s390x-gnu" "1.1.1" - "@napi-rs/nice-linux-x64-gnu" "1.1.1" - "@napi-rs/nice-linux-x64-musl" "1.1.1" - "@napi-rs/nice-openharmony-arm64" "1.1.1" - "@napi-rs/nice-win32-arm64-msvc" "1.1.1" - "@napi-rs/nice-win32-ia32-msvc" "1.1.1" - "@napi-rs/nice-win32-x64-msvc" "1.1.1" +"@levischuck/tiny-cbor@^0.2.2": + version "0.2.11" + resolved "https://registry.yarnpkg.com/@levischuck/tiny-cbor/-/tiny-cbor-0.2.11.tgz#833ddf7f3627dcb62d855d9c184061b4a1a875b3" + integrity sha512-llBRm4dT4Z89aRsm6u2oEZ8tfwL/2l6BwpZ7JcyieouniDECM5AqNgr/y08zalEIvW3RSK4upYyybDcmjXqAow== "@noble/ciphers@^2.1.1": version "2.2.0" @@ -682,6 +744,145 @@ resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.41.1.tgz#b04e7151c5913a7a006d4f465479da75efb98a7a" integrity sha512-/UhIkaZgPutTFmQ7RnIJGgDXZmtEJ7Dvi86xNTFWcnRxVRNk/aotsqDJYeEvDP+FSMB2SdW+pQzNMcWP0rwuNA== +"@peculiar/asn1-android@^2.6.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-android/-/asn1-android-2.8.0.tgz#b5cad0fba5085f8a9a68c48bd13ade318c466c75" + integrity sha512-skLbS+IOGv1lUgDqtChr8xvtvEr3HMse/JGBaL2r1J1o/n7a8wqOrovMtlRq/UXLhxvmLaONP67hwtshgzwfzA== + dependencies: + "@peculiar/asn1-schema" "^2.8.0" + asn1js "^3.0.10" + tslib "^2.8.1" + +"@peculiar/asn1-cms@^2.6.0", "@peculiar/asn1-cms@^2.8.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-cms/-/asn1-cms-2.8.0.tgz#b48a8389319228f929e9acd8cee8da6c858738de" + integrity sha512-NgekZOrSJFSBFLFoLfwePguAWAx7z1+f2TEsWFUMyiqqfntZ4+S/S5hzqME3q4pCA0iOsFKdwiQ35dwY24eVqA== + dependencies: + "@peculiar/asn1-schema" "^2.8.0" + "@peculiar/asn1-x509" "^2.8.0" + "@peculiar/asn1-x509-attr" "^2.8.0" + asn1js "^3.0.10" + tslib "^2.8.1" + +"@peculiar/asn1-csr@^2.6.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-csr/-/asn1-csr-2.8.0.tgz#c9bb5dec2eaff824a705e82a4a58d45e6d2c35d0" + integrity sha512-akbF8+uvleHs8sejNPQxwmVFuInAg6FMNHOwMILXfP518YfFJwdR3jr6oNUPOaEJfuEhn/vkNOCIT6ASUd4mbg== + dependencies: + "@peculiar/asn1-schema" "^2.8.0" + "@peculiar/asn1-x509" "^2.8.0" + asn1js "^3.0.10" + tslib "^2.8.1" + +"@peculiar/asn1-ecc@^2.6.0", "@peculiar/asn1-ecc@^2.6.1": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-ecc/-/asn1-ecc-2.8.0.tgz#d51ab2b07eca98e0cf492d051e98bbd0a071305a" + integrity sha512-ohwlk+u9Rv2NOAY1c6MfHj45ATVF8R1DUN/WCgABiRtLi2ZftlZWZX7KvpAbU8v9xPcmoILfELeEABj/rn18AQ== + dependencies: + "@peculiar/asn1-schema" "^2.8.0" + "@peculiar/asn1-x509" "^2.8.0" + asn1js "^3.0.10" + tslib "^2.8.1" + +"@peculiar/asn1-pfx@^2.8.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-pfx/-/asn1-pfx-2.8.0.tgz#8e189b6455e2bf9e5f921bb150ea86d7e7d1875d" + integrity sha512-5yof1ytoB++RQtaFbqSUJ8pxDJtZT6vbVqZ8XoJ61ph7UjNVvfFwAilnCodqkNsAodpy13gDhoxZXw00pghnyg== + dependencies: + "@peculiar/asn1-cms" "^2.8.0" + "@peculiar/asn1-pkcs8" "^2.8.0" + "@peculiar/asn1-rsa" "^2.8.0" + "@peculiar/asn1-schema" "^2.8.0" + asn1js "^3.0.10" + tslib "^2.8.1" + +"@peculiar/asn1-pkcs8@^2.8.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.8.0.tgz#a46cf8857b9b063896afa41d2b8b2aa6a07a70a2" + integrity sha512-qAKXtLpBEw9LqhKpjw3ajZSXlBur+ipW+y2ivVBQAG6F6qRx94yO+1ZR4mvw+YaCfKSaOzLeYEzsPaBp4SJELA== + dependencies: + "@peculiar/asn1-schema" "^2.8.0" + "@peculiar/asn1-x509" "^2.8.0" + asn1js "^3.0.10" + tslib "^2.8.1" + +"@peculiar/asn1-pkcs9@^2.6.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.8.0.tgz#6d62697af0bbd4f30fdf0d23b4018f3f09620de3" + integrity sha512-b5nDWCnkV60+cQ141D6sVVwK9nz64R5n3zSVnklGd+ECdkW2Ol3U1a6yYFlalpSOaD557yuJB64A+q42jG7lUQ== + dependencies: + "@peculiar/asn1-cms" "^2.8.0" + "@peculiar/asn1-pfx" "^2.8.0" + "@peculiar/asn1-pkcs8" "^2.8.0" + "@peculiar/asn1-schema" "^2.8.0" + "@peculiar/asn1-x509" "^2.8.0" + "@peculiar/asn1-x509-attr" "^2.8.0" + asn1js "^3.0.10" + tslib "^2.8.1" + +"@peculiar/asn1-rsa@^2.6.0", "@peculiar/asn1-rsa@^2.6.1", "@peculiar/asn1-rsa@^2.8.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-rsa/-/asn1-rsa-2.8.0.tgz#9d98d0fc42fec50119d2881b8a9925d36daaea73" + integrity sha512-zHEUlCqB2mk7x2lxDwHHJy7hWZOPdGHVlsmITWKB5/PbQo61atbu9PJ/0r9dQNMwFzbKPXZ8uK8/91eUhRznSg== + dependencies: + "@peculiar/asn1-schema" "^2.8.0" + "@peculiar/asn1-x509" "^2.8.0" + asn1js "^3.0.10" + tslib "^2.8.1" + +"@peculiar/asn1-schema@^2.6.0", "@peculiar/asn1-schema@^2.8.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-2.8.0.tgz#69699f84259b2161607cabfc34e512a4023dbef9" + integrity sha512-7YT0U/ze0tF2QOBbE15gKZwy5tvgGyLRiRHLzhlbOpf7BT032oBSd0haZqXn5W6l26WLlu3dyxzjM+2638/z2Q== + dependencies: + "@peculiar/utils" "^2.0.2" + asn1js "^3.0.10" + tslib "^2.8.1" + +"@peculiar/asn1-x509-attr@^2.8.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.8.0.tgz#bd168e3f5e8bc23e56b1a97891f9f2fb7f730204" + integrity sha512-tHjkfS/qhMnmrlB2J9NhflQlQ7In3khO3CfmVrriOlpTeErY9ZIKOso1hQ5JQiyrJ7ShvqVPk7E5fQmbclkSKA== + dependencies: + "@peculiar/asn1-schema" "^2.8.0" + "@peculiar/asn1-x509" "^2.8.0" + asn1js "^3.0.10" + tslib "^2.8.1" + +"@peculiar/asn1-x509@^2.6.0", "@peculiar/asn1-x509@^2.6.1", "@peculiar/asn1-x509@^2.8.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-x509/-/asn1-x509-2.8.0.tgz#9958a9ef35dec8426aabad78ffe8798e318b06e2" + integrity sha512-N0CMuhWUzsWEVq6F1q9X6+VKUnWzSW+cSVg+aPaGGwDdbFoFWTYgin5MHwXgpWd6y9COMBxnfy/Qc+Xc7F0Zwg== + dependencies: + "@peculiar/asn1-schema" "^2.8.0" + "@peculiar/utils" "^2.0.2" + asn1js "^3.0.10" + tslib "^2.8.1" + +"@peculiar/utils@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@peculiar/utils/-/utils-2.0.3.tgz#a27ca4c4b73652e110f19a7d16d664f458a5528e" + integrity sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ== + dependencies: + tslib "^2.8.1" + +"@peculiar/x509@^1.14.3": + version "1.14.3" + resolved "https://registry.yarnpkg.com/@peculiar/x509/-/x509-1.14.3.tgz#2c44c2b89474346afec38a0c2803ec4fb8ce959e" + integrity sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA== + dependencies: + "@peculiar/asn1-cms" "^2.6.0" + "@peculiar/asn1-csr" "^2.6.0" + "@peculiar/asn1-ecc" "^2.6.0" + "@peculiar/asn1-pkcs9" "^2.6.0" + "@peculiar/asn1-rsa" "^2.6.0" + "@peculiar/asn1-schema" "^2.6.0" + "@peculiar/asn1-x509" "^2.6.0" + pvtsutils "^1.3.6" + reflect-metadata "^0.2.2" + tslib "^2.8.1" + tsyringe "^4.10.0" + "@prisma/client@^6.19.3": version "6.19.3" resolved "https://registry.yarnpkg.com/@prisma/client/-/client-6.19.3.tgz#b04413143eeb0812a323451bbc1a22767cee11ef" @@ -733,15 +934,130 @@ dependencies: "@prisma/debug" "6.19.3" -"@scarf/scarf@=1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@scarf/scarf/-/scarf-1.4.0.tgz#3bbb984085dbd6d982494538b523be1ce6562972" - integrity sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ== - -"@sec-ant/readable-stream@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz#60de891bb126abfdc5410fdc6166aca065f10a0c" - integrity sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg== +"@rollup/rollup-android-arm-eabi@4.62.2": + version "4.62.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz#5e9849b661c2229cf967a08dbe2dbbe9e8c991e5" + integrity sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg== + +"@rollup/rollup-android-arm64@4.62.2": + version "4.62.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz#5b0699ee5dd484b222c9ed74aff43c91ea8b17f8" + integrity sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw== + +"@rollup/rollup-darwin-arm64@4.62.2": + version "4.62.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz#8bc52c9d7a3ce8d0533c351a9c935de781daa06f" + integrity sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A== + +"@rollup/rollup-darwin-x64@4.62.2": + version "4.62.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz#ba2ef3e8fb310f0af35588f270cfa5aa96e48764" + integrity sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA== + +"@rollup/rollup-freebsd-arm64@4.62.2": + version "4.62.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz#93b10bdbfe8ada226b8bc0c02ef6b7f544474d96" + integrity sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw== + +"@rollup/rollup-freebsd-x64@4.62.2": + version "4.62.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz#3e8aa38ef3c9c300946871e3fdbb0c30e0a20f86" + integrity sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg== + +"@rollup/rollup-linux-arm-gnueabihf@4.62.2": + version "4.62.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz#1d7994384bb0ad1bc41921b506e1642d4f9d7fc3" + integrity sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg== + +"@rollup/rollup-linux-arm-musleabihf@4.62.2": + version "4.62.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz#a6540f47cf844a56b80ca9ff95d2acdfb2cef97b" + integrity sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA== + +"@rollup/rollup-linux-arm64-gnu@4.62.2": + version "4.62.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz#404f2045651840cbf48da91ba6d0f490f0bc2cbf" + integrity sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA== + +"@rollup/rollup-linux-arm64-musl@4.62.2": + version "4.62.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz#a3404ffddf7b474b48c99b9c893b6247bb765ba5" + integrity sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ== + +"@rollup/rollup-linux-loong64-gnu@4.62.2": + version "4.62.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz#e8aac6d549b377945e349882f199b7c8eb75ca38" + integrity sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg== + +"@rollup/rollup-linux-loong64-musl@4.62.2": + version "4.62.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz#6e2e44ea50310b3a582078a915e5feb879c820d4" + integrity sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ== + +"@rollup/rollup-linux-ppc64-gnu@4.62.2": + version "4.62.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz#6898302da6d77a0537cde64b2b4c6b60659bd110" + integrity sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A== + +"@rollup/rollup-linux-ppc64-musl@4.62.2": + version "4.62.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz#333717c95dd5a66bef8f63e7ef8a9fd845fd18d0" + integrity sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w== + +"@rollup/rollup-linux-riscv64-gnu@4.62.2": + version "4.62.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz#81bc06ba380352004d01f4826eb7cdccefa05bad" + integrity sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg== + +"@rollup/rollup-linux-riscv64-musl@4.62.2": + version "4.62.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz#95a7cd39de21389ad6788a5284eaaa738e29ca4c" + integrity sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q== + +"@rollup/rollup-linux-s390x-gnu@4.62.2": + version "4.62.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz#06e6db2ec1bc48b5374c7923ef83c2eb024b2452" + integrity sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg== + +"@rollup/rollup-linux-x64-gnu@4.62.2": + version "4.62.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz#5dc818988285e09e88790c6462def72413df2da3" + integrity sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A== + +"@rollup/rollup-linux-x64-musl@4.62.2": + version "4.62.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz#2080f4a93349e9afd34be6fc1a37e01fc8bfc80f" + integrity sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg== + +"@rollup/rollup-openbsd-x64@4.62.2": + version "4.62.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz#21d64a8acb66221724b923e51af5333df1af044b" + integrity sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg== + +"@rollup/rollup-openharmony-arm64@4.62.2": + version "4.62.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz#8e0fcd9d02141e337b4c5b5cff576cb9a76b1ba0" + integrity sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA== + +"@rollup/rollup-win32-arm64-msvc@4.62.2": + version "4.62.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz#bdb4cc4efd58efe808203347f0f5463f0ea16e52" + integrity sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg== + +"@rollup/rollup-win32-ia32-msvc@4.62.2": + version "4.62.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz#dbaebde5afd24eae0eefe915d901632e7cb59860" + integrity sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q== + +"@rollup/rollup-win32-x64-gnu@4.62.2": + version "4.62.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz#84109e85fea5f8f1353499f96578fdc2a0e8b138" + integrity sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg== + +"@rollup/rollup-win32-x64-msvc@4.62.2": + version "4.62.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz#3671ce3f9b928d5c01f879792d5c0b60ae14d4ad" + integrity sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA== "@shikijs/core@1.29.2": version "1.29.2" @@ -811,15 +1127,24 @@ resolved "https://registry.yarnpkg.com/@simple-libs/stream-utils/-/stream-utils-2.0.0.tgz#758d2a0876b4d672dac1eae212cdbab452670d3c" integrity sha512-fCTuZK4QBa+39Oz9l4OGfJfz+GpwCp3AqO7Zch3to99xHPgstVsRFpeQ8LNd2o1Gv8raL2mCFwiaHh7bFSp5DQ== -"@sindresorhus/is@^7.0.1": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-7.2.0.tgz#7c594e1a64336d2008d99d814056d459421504d4" - integrity sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw== - -"@sindresorhus/merge-streams@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz#abb11d99aeb6d27f1b563c38147a72d50058e339" - integrity sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ== +"@simplewebauthn/browser@^13.2.2": + version "13.3.0" + resolved "https://registry.yarnpkg.com/@simplewebauthn/browser/-/browser-13.3.0.tgz#e12153e71f4a8f4f8f17f94ca9c5161115306239" + integrity sha512-BE/UWv6FOToAdVk0EokzkqQQDOWtNydYlY6+OrmiZ5SCNmb41VehttboTetUM3T/fr6EAFYVXjz4My2wg230rQ== + +"@simplewebauthn/server@^13.2.3": + version "13.3.2" + resolved "https://registry.yarnpkg.com/@simplewebauthn/server/-/server-13.3.2.tgz#e465836b1b874d8773b8b2242ecda3e828087476" + integrity sha512-KEDhfcGP1PAKRVSDjA3npTQFqS2b/srm+ipoNBNHdkzrHAlaRQUTE+a5f4ywsx6thxAw1NU2rYcLEY1949RGbQ== + dependencies: + "@hexagon/base64" "^1.1.27" + "@levischuck/tiny-cbor" "^0.2.2" + "@peculiar/asn1-android" "^2.6.0" + "@peculiar/asn1-ecc" "^2.6.1" + "@peculiar/asn1-rsa" "^2.6.1" + "@peculiar/asn1-schema" "^2.6.0" + "@peculiar/asn1-x509" "^2.6.1" + "@peculiar/x509" "^1.14.3" "@stablelib/base64@^1.0.0": version "1.0.1" @@ -831,183 +1156,16 @@ resolved "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.1.0.tgz#a79b55dbaf8604812f52d140b2c9ab41bc150bb8" integrity sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w== -"@swc/cli@^0.8.1": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@swc/cli/-/cli-0.8.1.tgz#454e854086213bc047b89a96f059d6d3be494681" - integrity sha512-L+ACCGHCiS0VqHVep/INLVnvRvJ2XooQFLZq4L8snhxw1jsqz+XRcY313UsyPVturPPE1shW3jic7rt3qEQTSQ== - dependencies: - "@swc/counter" "^0.1.3" - "@xhmikosr/bin-wrapper" "^14.0.0" - commander "^8.3.0" - minimatch "^9.0.3" - piscina "^4.3.1" - semver "^7.3.8" - slash "3.0.0" - source-map "^0.7.3" - tinyglobby "^0.2.13" - -"@swc/core-darwin-arm64@1.15.43": - version "1.15.43" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.43.tgz#386294f8427dde2df1a70dd0a5826d67af70e996" - integrity sha512-v1aVuvXdo/BHxJzco9V2xpHrvwWmhfS8t6gziY5wJxd+Z2h8AeJRnAwPD8itCDaGXVBwJ/CaKfxEzTkG0Va0OA== - -"@swc/core-darwin-x64@1.15.43": - version "1.15.43" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.15.43.tgz#c4823529c424e2ae25b7eb786438474741521fcb" - integrity sha512-lp3d4Lamc8dt5huYdGLSR+9hLxmfr1jb0l+4XXG2zPqZwYWRN9R0U2qYoTrggiU2RWW0oV9VbWM3kBnqIc2kdQ== - -"@swc/core-linux-arm-gnueabihf@1.15.43": - version "1.15.43" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.43.tgz#c0a0ed17cffc5d4af192935667f12f05feeb39f9" - integrity sha512-JWTQQELtsG5GgphDrr/XqqmM2pDN3cZqbMS0Mrg+iTiXL3F74sn/S2IyYE/5u4h2KLkTf9qQ7dXyxsbx7YzkeA== - -"@swc/core-linux-arm64-gnu@1.15.43": - version "1.15.43" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.43.tgz#1eb2d9c5eeee5bb9d00599b475ddc31dc2870d22" - integrity sha512-B4otJRdPWIsmiSBf0uG7Z/+vMWmkufjz5MmYxubwKuZazDW14Zd3symga1N62QR4RT+kEFeHEgsXfZGyn/w0hw== - -"@swc/core-linux-arm64-musl@1.15.43": - version "1.15.43" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.43.tgz#ea6b5c38088f3921a57922d3931b2d74fd23a9fd" - integrity sha512-6zB6OnpViBxYy4tgY3v2i6AZY9fwkcHZ032UOwtwUuW1d19sdT07qF0kZe6/3UR1tUaK6jjg2rmVcUIBCEYVjQ== - -"@swc/core-linux-ppc64-gnu@1.15.43": - version "1.15.43" - resolved "https://registry.yarnpkg.com/@swc/core-linux-ppc64-gnu/-/core-linux-ppc64-gnu-1.15.43.tgz#538fac30bbd5f1e678bb7bac9ccc62246a6f6d7a" - integrity sha512-coxE1ZWdB3uSDVNoEtYNrRi/1epvckZx9cTJ8ICUxTMTxGk+yvQ/Twacp3ruZSaMPGCriUjP86C37VhaT6nyRg== - -"@swc/core-linux-s390x-gnu@1.15.43": - version "1.15.43" - resolved "https://registry.yarnpkg.com/@swc/core-linux-s390x-gnu/-/core-linux-s390x-gnu-1.15.43.tgz#ee564b45f3f578b1fc82136c4dab163189316641" - integrity sha512-lXfLhs+LpBsD5inuYx+YDH5WsPPBQ95KPUiy8P5wq9ob9xKDZFqwNfU2QW6bGO8NqRO/H9JQomTSt5Yyh+FGfA== - -"@swc/core-linux-x64-gnu@1.15.43": - version "1.15.43" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.43.tgz#e6e3bfea76921c7f5e16d50a126615f2e04ce1c8" - integrity sha512-07XnKwTmKy8TGOZG3D9fRnLWGynxPjwQnZLVmBFbo6F+7vHYzBIOuwXEhemrChBWb6yDNZsVCcMWCPX6FDD2xg== - -"@swc/core-linux-x64-musl@1.15.43": - version "1.15.43" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.43.tgz#539f6f2721c0cc32e5db5cf0d453c82045f6662d" - integrity sha512-TJc+bsSIaBh+hZvZ5GRtW/K1bw66TJ9vsUwvVIsZdiWxU5ObLwZvfcnZ3UpgVfMnFibRes9uriJrQNBHEEogRQ== - -"@swc/core-win32-arm64-msvc@1.15.43": - version "1.15.43" - resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.43.tgz#b7bb6b611d484ac19d0ee21469e7012d646c28b5" - integrity sha512-jfd7s2/bUQYkOHLs+LWQNKZdmDa8+sufKLllhpWAhVQ2GDCwsHe3vR/j+OSiItZNtkzFuaawa3+SAKz9y5gYfw== - -"@swc/core-win32-ia32-msvc@1.15.43": - version "1.15.43" - resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.43.tgz#e5b25722a7d27bb0c9a9bdee7863f29c8674364e" - integrity sha512-rLAE8JvucqEW1ZGohxPQrQWPBQeJG4+ypKbWfdlU/qmKScvCkxf9/Jxnzki1dkUQCQ7P5Enp13RlvqOlvx/32g== - -"@swc/core-win32-x64-msvc@1.15.43": - version "1.15.43" - resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.43.tgz#d28842621201c345383d468d40c09648b6cd6e68" - integrity sha512-h8MLDHZcfIukwQWj03rIJZx1I0E81AYj2X7J/nGErG4nz+QAv6G1Z+peotvinL3lqpbo32tLYSMFo32/ySzxKg== - -"@swc/core@^1.15.43": - version "1.15.43" - resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.15.43.tgz#653e6573968fd5c74163b9885ea0a933012c9f22" - integrity sha512-1CuKjFkPxIgGdeHVuNbkxmBxkcbdc08u0aiI43pFq6yY1tTVKmXT9hFEooyyKs/sJ3xf1GPHyEwTtk9Xl8dvQw== - dependencies: - "@swc/counter" "^0.1.3" - "@swc/types" "^0.1.27" - optionalDependencies: - "@swc/core-darwin-arm64" "1.15.43" - "@swc/core-darwin-x64" "1.15.43" - "@swc/core-linux-arm-gnueabihf" "1.15.43" - "@swc/core-linux-arm64-gnu" "1.15.43" - "@swc/core-linux-arm64-musl" "1.15.43" - "@swc/core-linux-ppc64-gnu" "1.15.43" - "@swc/core-linux-s390x-gnu" "1.15.43" - "@swc/core-linux-x64-gnu" "1.15.43" - "@swc/core-linux-x64-musl" "1.15.43" - "@swc/core-win32-arm64-msvc" "1.15.43" - "@swc/core-win32-ia32-msvc" "1.15.43" - "@swc/core-win32-x64-msvc" "1.15.43" - -"@swc/counter@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" - integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== - -"@swc/types@^0.1.27": - version "0.1.27" - resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.27.tgz#12080b0c426dea450634f202d9a3c82ac396e793" - integrity sha512-K6h3iUlqeM946U4sXFYeahefR1YBbXJvko+hv8WS8/0BNJ4OHiHRywMnQUJCqkR7Y9+hqQ1TvEpiKqUhz7NEFg== - dependencies: - "@swc/counter" "^0.1.3" - -"@tokenizer/inflate@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@tokenizer/inflate/-/inflate-0.4.1.tgz#fa6cdb8366151b3cc8426bf9755c1ea03a2fba08" - integrity sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA== - dependencies: - debug "^4.4.3" - token-types "^6.1.1" - -"@tokenizer/token@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@tokenizer/token/-/token-0.3.0.tgz#fe98a93fe789247e998c75e74e9c7c63217aa276" - integrity sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A== - -"@types/body-parser@*": - version "1.19.6" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.6.tgz#1859bebb8fd7dac9918a45d54c1971ab8b5af474" - integrity sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/connect@*": - version "3.4.38" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" - integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== - dependencies: - "@types/node" "*" - -"@types/cookie-parser@^1.4.10": - version "1.4.10" - resolved "https://registry.yarnpkg.com/@types/cookie-parser/-/cookie-parser-1.4.10.tgz#a045272a383a30597a01955d4f9c790018f214e4" - integrity sha512-B4xqkqfZ8Wek+rCOeRxsjMS9OgvzebEzzLYw7NHYuvzb7IdxOkI0ZHGgeEBX4PUM7QGVvNSK60T3OvWj3YfBRg== - -"@types/cors@^2.8.19": - version "2.8.19" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.19.tgz#d93ea2673fd8c9f697367f5eeefc2bbfa94f0342" - integrity sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg== - dependencies: - "@types/node" "*" - "@types/esrecurse@^4.3.1": version "4.3.1" resolved "https://registry.yarnpkg.com/@types/esrecurse/-/esrecurse-4.3.1.tgz#6f636af962fbe6191b830bd676ba5986926bccec" integrity sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw== -"@types/estree@^1.0.6", "@types/estree@^1.0.8": +"@types/estree@1.0.9", "@types/estree@^1.0.6", "@types/estree@^1.0.8": version "1.0.9" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.9.tgz#cf3f0e876d7bee15a93ab925b82bf570a3904a24" integrity sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg== -"@types/express-serve-static-core@^5.0.0": - version "5.1.1" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz#1a77faffee9572d39124933259be2523837d7eaa" - integrity sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/send" "*" - -"@types/express@*", "@types/express@5.0.6": - version "5.0.6" - resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.6.tgz#2d724b2c990dcb8c8444063f3580a903f6d500cc" - integrity sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^5.0.0" - "@types/serve-static" "^2" - "@types/hast@^3.0.0", "@types/hast@^3.0.4": version "3.0.4" resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa" @@ -1015,16 +1173,6 @@ dependencies: "@types/unist" "*" -"@types/http-cache-semantics@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz#f6a7788f438cbfde15f29acad46512b4c01913b3" - integrity sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q== - -"@types/http-errors@*": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.5.tgz#5b749ab2b16ba113423feb1a64a95dcd30398472" - integrity sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg== - "@types/json-schema@^7.0.15": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" @@ -1037,27 +1185,6 @@ dependencies: "@types/unist" "*" -"@types/morgan@^1.9.10": - version "1.9.10" - resolved "https://registry.yarnpkg.com/@types/morgan/-/morgan-1.9.10.tgz#725c15d95a5e6150237524cd713bc2d68f9edf1a" - integrity sha512-sS4A1zheMvsADRVfT0lYbJ4S9lmsey8Zo2F7cnbYjWHP67Q0AwMYuuzLlkIM2N8gAbb9cubhIVFwcIN2XyYCkA== - dependencies: - "@types/node" "*" - -"@types/multer@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@types/multer/-/multer-2.2.0.tgz#f987c770cbe309d1b5e60c251851d6550f121f61" - integrity sha512-3U1troeqGV8Ntp7Q3klwf4zr23VEoqYVocYXaswm9+8z3O9UHDYAqLxjJ/h550iRADTjKdOdhhasXw6gD6kYtg== - dependencies: - "@types/express" "*" - -"@types/node@*": - version "26.1.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-26.1.0.tgz#aa85f0727fc5611347091c478341c63650903439" - integrity sha512-O0A1G3xPGy4w7AgQdAQYUlQ+BKk2Oovw8eRpofyp5KdBZULnbe+WqaOVNrm705SHphCiG4XHsACrSmPu1f+Kgw== - dependencies: - undici-types "~8.3.0" - "@types/node@^25.9.5": version "25.9.5" resolved "https://registry.yarnpkg.com/@types/node/-/node-25.9.5.tgz#0fefc09e6e82e94cde291bacf43522e989eb01a4" @@ -1065,46 +1192,6 @@ dependencies: undici-types ">=7.24.0 <7.24.7" -"@types/nodemailer@^8.0.1": - version "8.0.1" - resolved "https://registry.yarnpkg.com/@types/nodemailer/-/nodemailer-8.0.1.tgz#4ef2b4e62c819225a0b8a6384bf750c0c664d465" - integrity sha512-PxpaInm8V1JQDd4j0ds5HfvWQk8JupS1C0Picb96QJsrrRDjBH+DlK7L4ZdNSqNULhiZRQHc40nLVShaGxXAMw== - dependencies: - "@types/node" "*" - -"@types/qs@*": - version "6.15.1" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.15.1.tgz#8606884272c63f0db96986bd3548650d8a9388bf" - integrity sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw== - -"@types/range-parser@*": - version "1.2.7" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" - integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== - -"@types/send@*": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@types/send/-/send-1.2.1.tgz#6a784e45543c18c774c049bff6d3dbaf045c9c74" - integrity sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ== - dependencies: - "@types/node" "*" - -"@types/serve-static@*", "@types/serve-static@^2": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-2.2.0.tgz#d4a447503ead0d1671132d1ab6bd58b805d8de6a" - integrity sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ== - dependencies: - "@types/http-errors" "*" - "@types/node" "*" - -"@types/swagger-ui-express@^4.1.8": - version "4.1.8" - resolved "https://registry.yarnpkg.com/@types/swagger-ui-express/-/swagger-ui-express-4.1.8.tgz#3c0e0bf2543c7efb500eaa081bfde6d92f88096c" - integrity sha512-AhZV8/EIreHFmBV5wAs0gzJUNq9JbbSXgJLQubCC0jtIo6prnI9MIRRxnU4MZX9RB9yXxF1V4R7jtLl/Wcj31g== - dependencies: - "@types/express" "*" - "@types/serve-static" "*" - "@types/tinycolor2@^1.4.0": version "1.4.6" resolved "https://registry.yarnpkg.com/@types/tinycolor2/-/tinycolor2-1.4.6.tgz#670cbc0caf4e58dd61d1e3a6f26386e473087f06" @@ -1216,109 +1303,6 @@ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.2.tgz#a03ad82cd5676414d068ba86f880c5681194aadf" integrity sha512-5jsZFwgR5rTdKwidH9Qmat75RKwqfpKlWWB1frDkljN127mwqBu8K0PYo7/hFpF03IEJpfVPpCQDY/eDx3iHvA== -"@xhmikosr/archive-type@^8.0.1": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@xhmikosr/archive-type/-/archive-type-8.1.0.tgz#0e7cb065a81b8cab0020692072d55970b776e601" - integrity sha512-EXOjEbnZFE5c/nFMf4FOrEURVanzHpnkPYmnmr78u02/8hAhE0FMq8p9TK1IM0/bFr5VcyBUY0gfLm8f7dKy+Q== - dependencies: - file-type "^21.3.4" - -"@xhmikosr/bin-check@^8.2.1": - version "8.2.2" - resolved "https://registry.yarnpkg.com/@xhmikosr/bin-check/-/bin-check-8.2.2.tgz#b4abc2f0743acca07bc1508ae4309e43bf4798f4" - integrity sha512-Y/b0YJoCDda6DCFj8ikks06GrEWDsz/3vdgGLeectV9p+YJc76YugRjtqFdd2KTf2rnEPjalL2hcXP+x2KcSLQ== - dependencies: - execa "^9.6.1" - isexe "^4.0.0" - -"@xhmikosr/bin-wrapper@^14.0.0": - version "14.4.0" - resolved "https://registry.yarnpkg.com/@xhmikosr/bin-wrapper/-/bin-wrapper-14.4.0.tgz#5bc989979dea4b230f4b5dfffb2c99ba1334bd11" - integrity sha512-Qp4YGNOIBnNEXoyM8nc0L92frBtrerzRpE/zZ4EMU9i37tGGfiuKyQTdHdVUcj7z1ZMfg2hAk+i5gMbWGc5cdw== - dependencies: - "@xhmikosr/bin-check" "^8.2.1" - "@xhmikosr/downloader" "^16.2.0" - "@xhmikosr/os-filter-obj" "^4.1.0" - binary-version-check "^6.1.0" - -"@xhmikosr/decompress-tar@^9.0.0", "@xhmikosr/decompress-tar@^9.0.1": - version "9.0.1" - resolved "https://registry.yarnpkg.com/@xhmikosr/decompress-tar/-/decompress-tar-9.0.1.tgz#0a9dda01606107e926419baa81e8e07b3979f001" - integrity sha512-4AkVR1SoqTxYY22IRRYKDeLirPIDGqMqYsqgjKYuwhgRcBb+yDP4t5Xph33UCzL/nahK/aADmlMEjTNstbX7kw== - dependencies: - file-type "^21.3.0" - is-stream "^4.0.1" - tar-stream "3.1.7" - -"@xhmikosr/decompress-tarbz2@^9.0.1": - version "9.0.2" - resolved "https://registry.yarnpkg.com/@xhmikosr/decompress-tarbz2/-/decompress-tarbz2-9.0.2.tgz#e2aba9a25d3b7822d755c605880c9e1d0d461926" - integrity sha512-m0DvZhE7remCxtS8xY2iHSjivT4v+iyYDdfNoeuu8Nm+7g8xEXdLKSyDEicu4u1ImJLLGEfjMuTLera/F6UGWw== - dependencies: - "@xhmikosr/decompress-tar" "^9.0.1" - file-type "^21.3.4" - is-stream "^4.0.1" - seek-bzip "^2.0.0" - unbzip2-stream "^1.4.3" - -"@xhmikosr/decompress-targz@^9.0.1": - version "9.0.1" - resolved "https://registry.yarnpkg.com/@xhmikosr/decompress-targz/-/decompress-targz-9.0.1.tgz#e0e26f05a48423e3440b51a384aae97fe52d3bf5" - integrity sha512-1JXu2b6yrpm5EuBoOzMU57B4qrHXJKWQQ7LlMynNEiz85mEjDciO3ayf//GXaTLLCEKiHjWlU3q3THjgf7uODA== - dependencies: - "@xhmikosr/decompress-tar" "^9.0.0" - file-type "^21.3.0" - is-stream "^4.0.1" - -"@xhmikosr/decompress-unzip@^8.1.1": - version "8.2.1" - resolved "https://registry.yarnpkg.com/@xhmikosr/decompress-unzip/-/decompress-unzip-8.2.1.tgz#f684f202c5f216380e4755d26b39cddfa22b4cb5" - integrity sha512-2MS94QnmXQwjkKN8WyFiu1sU7J3rcWJcMze4kRYsX7tN+CXpUGECgkh4YSOhujpkWPuVlFudIziJHO/TxOqkQQ== - dependencies: - file-type "^21.3.4" - get-stream "^9.0.1" - yauzl "^3.4.0" - -"@xhmikosr/decompress@^11.1.3": - version "11.1.3" - resolved "https://registry.yarnpkg.com/@xhmikosr/decompress/-/decompress-11.1.3.tgz#ce5262138bfce39af0916c030c1fda717361b1e9" - integrity sha512-NiyhJq6z7ERsYghcnXZUI6ooDXgZtoB+G9eUsYhfSM4VLp2rKx9UxhKI1NEf1PqosrNPxG3bnSsr2UBVbNurlg== - dependencies: - "@xhmikosr/decompress-tar" "^9.0.1" - "@xhmikosr/decompress-tarbz2" "^9.0.1" - "@xhmikosr/decompress-targz" "^9.0.1" - "@xhmikosr/decompress-unzip" "^8.1.1" - graceful-fs "^4.2.11" - strip-dirs "^3.0.0" - -"@xhmikosr/downloader@^16.2.0": - version "16.2.0" - resolved "https://registry.yarnpkg.com/@xhmikosr/downloader/-/downloader-16.2.0.tgz#5f31077709e87395796bf20fab033714fb663360" - integrity sha512-5vFLFTOFdDyuPJ6DDaqFPviMnMLrjWvpvbTp+go+JDoyzUBLd4dTjb+1PXIRiUMvJSvlxjpC8GIVN8mYVhQfhg== - dependencies: - "@xhmikosr/archive-type" "^8.0.1" - "@xhmikosr/decompress" "^11.1.3" - content-disposition "^2.0.1" - ext-name "^5.0.0" - file-type "^21.3.4" - filenamify "^7.0.1" - got "^14.6.6" - -"@xhmikosr/os-filter-obj@^4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@xhmikosr/os-filter-obj/-/os-filter-obj-4.1.0.tgz#3ad11a5d2dd47972076a990c6fbfd77c4570b86a" - integrity sha512-y5ArHvQ7BVule/+L9yE2nYMhceiJhgsqo58lOfnisQ7bg+Kjfmkgr7JBuVFiTkl+ErdShpp829QstZQyLugl8g== - dependencies: - system-architecture "^1.0.0" - -accepts@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-2.0.0.tgz#bbcf4ba5075467f3f2131eab3cffc73c2f5d7895" - integrity sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng== - dependencies: - mime-types "^3.0.0" - negotiator "^1.0.0" - acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" @@ -1373,48 +1357,30 @@ ansi-styles@^6.2.1, ansi-styles@^6.2.3: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041" integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== -append-field@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/append-field/-/append-field-1.0.0.tgz#1e3440e915f0b1203d23748e78edd7b9b5b43e56" - integrity sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw== +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== argparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -b4a@^1.6.4: - version "1.8.1" - resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.8.1.tgz#7f16334ca80127aeb26064a28841acbf174840a4" - integrity sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +asn1js@^3.0.10: + version "3.0.10" + resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-3.0.10.tgz#df26c874c8a8b41ca605efea47b2ad07551013dd" + integrity sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg== + dependencies: + pvtsutils "^1.3.6" + pvutils "^1.1.5" + tslib "^2.8.1" balanced-match@^4.0.2: version "4.0.4" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-4.0.4.tgz#bfb10662feed8196a2c62e7c68e17720c274179a" integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA== -bare-events@^2.7.0: - version "2.9.1" - resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.9.1.tgz#5c86616966343bcb03a1b3155feab253eadbf349" - integrity sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg== - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -basic-auth@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" - integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== - dependencies: - safe-buffer "5.1.2" - better-auth@^1.6.23: version "1.6.23" resolved "https://registry.yarnpkg.com/better-auth/-/better-auth-1.6.23.tgz#1af5228d94be69fb2e63b5bfd57d843c849cc28a" @@ -1448,45 +1414,6 @@ better-call@1.3.7: rou3 "^0.7.12" set-cookie-parser "^3.0.1" -binary-version-check@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/binary-version-check/-/binary-version-check-6.1.0.tgz#5db7b0199dd32cdc35cada48d7535c5c1c169dcd" - integrity sha512-REKdLKmuViV2WrtWXvNSiPX04KbIjfUV3Cy8batUeOg+FtmowavzJorfFhWq95cVJzINnL/44ixP26TrdJZACA== - dependencies: - binary-version "^7.1.0" - semver "^7.6.0" - semver-truncate "^3.0.0" - -binary-version@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/binary-version/-/binary-version-7.1.0.tgz#672f045628e6cd416a2292d4c1e06567f7e560cc" - integrity sha512-Iy//vPc3ANPNlIWd242Npqc8MK0a/i4kVcHDlDA6HNMv5zMxz4ulIFhOSYJVKw/8AbHdHy0CnGYEt1QqSXxPsw== - dependencies: - execa "^8.0.1" - find-versions "^6.0.0" - -body-parser@^2.2.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-2.3.0.tgz#6d8662f4d8c336028b8ac9aa24251b0ca64ba437" - integrity sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw== - dependencies: - bytes "^3.1.2" - content-type "^2.0.0" - debug "^4.4.3" - http-errors "^2.0.1" - iconv-lite "^0.7.2" - on-finished "^2.4.1" - qs "^6.15.2" - raw-body "^3.0.2" - type-is "^2.1.0" - -brace-expansion@^2.0.2: - version "2.1.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.1.1.tgz#c68b1c4111c76aae3a6fba55d496cee10c39dad8" - integrity sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA== - dependencies: - balanced-match "^1.0.0" - brace-expansion@^5.0.5: version "5.0.7" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.7.tgz#1b0e46965b479dad65af737b4a02790a05498337" @@ -1494,35 +1421,12 @@ brace-expansion@^5.0.5: dependencies: balanced-match "^4.0.2" -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer@^5.2.1: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -busboy@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" - integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== +bundle-require@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/bundle-require/-/bundle-require-5.1.0.tgz#8db66f41950da3d77af1ef3322f4c3e04009faee" + integrity sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA== dependencies: - streamsearch "^1.1.0" - -byte-counter@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/byte-counter/-/byte-counter-0.1.0.tgz#c49760b5790e50e942a0d57a57b3fc0e94488dcc" - integrity sha512-jheRLVMeUKrDBjVw2O5+k4EvR4t9wtxHL+bo/LxfkxsVeuGMy3a5SEGgXdAFA4FSzTrU8rQXQIrsZ3oBq5a0pQ== - -bytes@^3.1.2, bytes@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + load-tsconfig "^0.2.3" c12@3.1.0: version "3.1.0" @@ -1542,39 +1446,10 @@ c12@3.1.0: pkg-types "^2.2.0" rc9 "^2.1.2" -cacheable-lookup@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz#3476a8215d046e5a3202a9209dd13fec1f933a27" - integrity sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w== - -cacheable-request@^13.0.12: - version "13.0.19" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-13.0.19.tgz#2c8a3b6b4cc37ea6906cc182f5b838e5822b2f97" - integrity sha512-SVXGH037+Mo1aIMO5B2UcleR43FGjFdN+M8JObSyEoQ2Mn4CODRWx28gN5jiTF0n5ItsgtIZfyargMNs8GX4kg== - dependencies: - "@types/http-cache-semantics" "^4.2.0" - get-stream "^9.0.1" - http-cache-semantics "^4.2.0" - keyv "^5.6.0" - mimic-response "^4.0.0" - normalize-url "^8.1.1" - responselike "^4.0.2" - -call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" - integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - -call-bound@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" - integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== - dependencies: - call-bind-apply-helpers "^1.0.2" - get-intrinsic "^1.3.0" +cac@^6.7.14: + version "6.7.14" + resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" + integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== callsites@^3.0.0: version "3.1.0" @@ -1661,25 +1536,15 @@ comma-separated-tokens@^2.0.0: resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== -commander@^6.0.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" - integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== - -commander@^8.3.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" - integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== -concat-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1" - integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.0.2" - typedarray "^0.0.6" +confbox@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.1.8.tgz#820d73d3b3c82d9bd910652c5d4d599ef8ff8b06" + integrity sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w== confbox@^0.2.2, confbox@^0.2.4: version "0.2.4" @@ -1691,26 +1556,6 @@ consola@^3.2.3, consola@^3.4.0: resolved "https://registry.yarnpkg.com/consola/-/consola-3.4.2.tgz#5af110145397bb67afdab77013fdc34cae590ea7" integrity sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA== -content-disposition@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-1.1.0.tgz#f3db789c752d45564cc7e9e1e0b31790d4a38e17" - integrity sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g== - -content-disposition@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-2.0.1.tgz#88a75c7a52ef9c407c96035fe83a66939c2a4dc9" - integrity sha512-e+H0ZXHSWYrENhQzw1LPuP4oF5MzVKmDU6d3hxlvaPEYLLg62MxtQNPRx4SYSuYJSBUgnQIG4HIN2tEtNv7Dog== - -content-type@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== - -content-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-2.0.0.tgz#2fb3ede69dffa0af78ca7c4ce7589680638b56df" - integrity sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ== - conventional-changelog-angular@^9.0.0: version "9.2.1" resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-9.2.1.tgz#58c20e13f3cbaf4b41c23d898378c3e02ce716c3" @@ -1733,42 +1578,6 @@ conventional-commits-parser@^7.0.0: "@simple-libs/stream-utils" "^2.0.0" meow "^14.0.0" -convert-hrtime@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/convert-hrtime/-/convert-hrtime-5.0.0.tgz#f2131236d4598b95de856926a67100a0a97e9fa3" - integrity sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg== - -cookie-parser@^1.4.7: - version "1.4.7" - resolved "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.4.7.tgz#e2125635dfd766888ffe90d60c286404fa0e7b26" - integrity sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw== - dependencies: - cookie "0.7.2" - cookie-signature "1.0.6" - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie-signature@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.2.2.tgz#57c7fc3cc293acab9fec54d73e15690ebe4a1793" - integrity sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg== - -cookie@0.7.2, cookie@^0.7.1: - version "0.7.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" - integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== - -cors@2.8.6: - version "2.8.6" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.6.tgz#ff5dd69bd95e547503820d29aba4f8faf8dfec96" - integrity sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw== - dependencies: - object-assign "^4" - vary "^1" - cosmiconfig-typescript-loader@^6.1.0: version "6.3.0" resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-6.3.0.tgz#a5ee3ec3da5a976c0c233fd0e0b5ca14b58b0327" @@ -1786,7 +1595,7 @@ cosmiconfig@^9.0.1: js-yaml "^4.1.0" parse-json "^5.2.0" -cross-spawn@^7.0.3, cross-spawn@^7.0.6: +cross-spawn@^7.0.6: version "7.0.6" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== @@ -1795,13 +1604,6 @@ cross-spawn@^7.0.3, cross-spawn@^7.0.6: shebang-command "^2.0.0" which "^2.0.1" -debug@2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - debug@4.4.3, debug@^4.3.1, debug@^4.3.2, debug@^4.4.0, debug@^4.4.3: version "4.4.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" @@ -1809,13 +1611,6 @@ debug@4.4.3, debug@^4.3.1, debug@^4.3.2, debug@^4.4.0, debug@^4.4.3: dependencies: ms "^2.1.3" -decompress-response@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-10.0.0.tgz#d8abd2a4c136c3b99b49a08d1f9a709fe35675a4" - integrity sha512-oj7KWToJuuxlPr7VV0vabvxEIiqNMo+q0NueIiL3XhtwC6FVOX7Hr1c0C4eD0bmf7Zr+S/dSf2xvkH3Ad6sU3Q== - dependencies: - mimic-response "^4.0.0" - deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -1836,11 +1631,6 @@ denque@2.1.0: resolved "https://registry.yarnpkg.com/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1" integrity sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw== -depd@^2.0.0, depd@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - dequal@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" @@ -1851,6 +1641,11 @@ destr@^2.0.3: resolved "https://registry.yarnpkg.com/destr/-/destr-2.0.5.tgz#7d112ff1b925fb8d2079fac5bdb4a90973b51fdb" integrity sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA== +detect-europe-js@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/detect-europe-js/-/detect-europe-js-0.1.2.tgz#aa76642e05dae786efc2e01a23d4792cd24c7b88" + integrity sha512-lgdERlL3u0aUdHocoouzT10d9I89VVhk0qNRmll7mXdGfJT1/wqZ2ZLA4oJAjeACPY5fT1wsbq2AT+GkuInsow== + devlop@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/devlop/-/devlop-1.1.0.tgz#4db7c2ca4dc6e0e834c30be70c94bbc976dc7018" @@ -1863,25 +1658,6 @@ dotenv@^16.6.1: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.6.1.tgz#773f0e69527a8315c7285d5ee73c4459d20a8020" integrity sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow== -dotenv@^17.4.2: - version "17.4.2" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-17.4.2.tgz#c07e54a746e11eba021dd9e1047ced5afdc1c034" - integrity sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw== - -dunder-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" - integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== - dependencies: - call-bind-apply-helpers "^1.0.1" - es-errors "^1.3.0" - gopd "^1.2.0" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - effect@3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/effect/-/effect-3.21.0.tgz#ce222ce8f785b9e63f104b9a4ead985e7965f2c0" @@ -1905,11 +1681,6 @@ empathic@2.0.0: resolved "https://registry.yarnpkg.com/empathic/-/empathic-2.0.0.tgz#71d3c2b94fad49532ef98a6c34be0386659f6131" integrity sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA== -encodeurl@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" - integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== - env-paths@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" @@ -1927,28 +1698,43 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-define-property@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" - integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== - -es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.2.tgz#a2d0b373205724dfa525d23b0c3e1b1ca582c99b" - integrity sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw== - dependencies: - es-errors "^1.3.0" - es-toolkit@^1.46.0: version "1.49.0" resolved "https://registry.yarnpkg.com/es-toolkit/-/es-toolkit-1.49.0.tgz#93c5b031865792fc03cbf5bd20c132a4f976a52a" integrity sha512-G5iZ6Pc/FNRY/soKZHC+TxGDD83rHUDXxzaWhGCX44vAv/tMs56WMusnm/KMNK+luUPsgA9U28cGr4RDlSzL2g== +esbuild@^0.27.0: + version "0.27.7" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.27.7.tgz#bcadce22b2f3fd76f257e3a64f83a64986fea11f" + integrity sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w== + optionalDependencies: + "@esbuild/aix-ppc64" "0.27.7" + "@esbuild/android-arm" "0.27.7" + "@esbuild/android-arm64" "0.27.7" + "@esbuild/android-x64" "0.27.7" + "@esbuild/darwin-arm64" "0.27.7" + "@esbuild/darwin-x64" "0.27.7" + "@esbuild/freebsd-arm64" "0.27.7" + "@esbuild/freebsd-x64" "0.27.7" + "@esbuild/linux-arm" "0.27.7" + "@esbuild/linux-arm64" "0.27.7" + "@esbuild/linux-ia32" "0.27.7" + "@esbuild/linux-loong64" "0.27.7" + "@esbuild/linux-mips64el" "0.27.7" + "@esbuild/linux-ppc64" "0.27.7" + "@esbuild/linux-riscv64" "0.27.7" + "@esbuild/linux-s390x" "0.27.7" + "@esbuild/linux-x64" "0.27.7" + "@esbuild/netbsd-arm64" "0.27.7" + "@esbuild/netbsd-x64" "0.27.7" + "@esbuild/openbsd-arm64" "0.27.7" + "@esbuild/openbsd-x64" "0.27.7" + "@esbuild/openharmony-arm64" "0.27.7" + "@esbuild/sunos-x64" "0.27.7" + "@esbuild/win32-arm64" "0.27.7" + "@esbuild/win32-ia32" "0.27.7" + "@esbuild/win32-x64" "0.27.7" + esbuild@~0.28.0: version "0.28.1" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.28.1.tgz#ef45b4634c9c9d97a296aea4114a5f9840f95578" @@ -1986,11 +1772,6 @@ escalade@^3.1.1, escalade@^3.2.0: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== -escape-html@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" @@ -2105,110 +1886,16 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -etag@^1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - eventemitter3@^5.0.4: version "5.0.4" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.4.tgz#a86d66170433712dde814707ac52b5271ceb1feb" integrity sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw== -events-universal@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/events-universal/-/events-universal-1.0.1.tgz#b56a84fd611b6610e0a2d0f09f80fdf931e2dfe6" - integrity sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw== - dependencies: - bare-events "^2.7.0" - -execa@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" - integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^8.0.1" - human-signals "^5.0.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^4.1.0" - strip-final-newline "^3.0.0" - -execa@^9.6.1: - version "9.6.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-9.6.1.tgz#5b90acedc6bdc0fa9b9a6ddf8f9cbb0c75a7c471" - integrity sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA== - dependencies: - "@sindresorhus/merge-streams" "^4.0.0" - cross-spawn "^7.0.6" - figures "^6.1.0" - get-stream "^9.0.0" - human-signals "^8.0.1" - is-plain-obj "^4.1.0" - is-stream "^4.0.1" - npm-run-path "^6.0.0" - pretty-ms "^9.2.0" - signal-exit "^4.1.0" - strip-final-newline "^4.0.0" - yoctocolors "^2.1.1" - -express@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/express/-/express-5.2.1.tgz#8f21d15b6d327f92b4794ecf8cb08a72f956ac04" - integrity sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw== - dependencies: - accepts "^2.0.0" - body-parser "^2.2.1" - content-disposition "^1.0.0" - content-type "^1.0.5" - cookie "^0.7.1" - cookie-signature "^1.2.1" - debug "^4.4.0" - depd "^2.0.0" - encodeurl "^2.0.0" - escape-html "^1.0.3" - etag "^1.8.1" - finalhandler "^2.1.0" - fresh "^2.0.0" - http-errors "^2.0.0" - merge-descriptors "^2.0.0" - mime-types "^3.0.0" - on-finished "^2.4.1" - once "^1.4.0" - parseurl "^1.3.3" - proxy-addr "^2.0.7" - qs "^6.14.0" - range-parser "^1.2.1" - router "^2.2.0" - send "^1.1.0" - serve-static "^2.2.0" - statuses "^2.0.1" - type-is "^2.0.1" - vary "^1.1.2" - exsolve@^1.0.7, exsolve@^1.0.8: version "1.1.0" resolved "https://registry.yarnpkg.com/exsolve/-/exsolve-1.1.0.tgz#adefa9b18b3f3515e946d48eb2ca3bb0f2c51b4d" integrity sha512-D+42+T12DdIlJM3uepa55qGiL3sYdLBOxIl2ifQCzCHz4c7eiolaHsi3BIqEr7JxBzxv2pYZQX9kw16ziMcEmw== -ext-list@^2.0.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/ext-list/-/ext-list-2.2.2.tgz#0b98e64ed82f5acf0f2931babf69212ef52ddd37" - integrity sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA== - dependencies: - mime-db "^1.28.0" - -ext-name@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ext-name/-/ext-name-5.0.0.tgz#70781981d183ee15d13993c8822045c506c8f0a6" - integrity sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ== - dependencies: - ext-list "^2.0.0" - sort-keys-length "^1.0.0" - fast-check@^3.23.1: version "3.23.2" resolved "https://registry.yarnpkg.com/fast-check/-/fast-check-3.23.2.tgz#0129f1eb7e4f500f58e8290edc83c670e4a574a2" @@ -2221,11 +1908,6 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-fifo@^1.2.0, fast-fifo@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" - integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== - fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -2251,13 +1933,6 @@ fdir@^6.5.0: resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== -figures@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-6.1.0.tgz#935479f51865fa7479f6fa94fc6fc7ac14e62c4a" - integrity sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg== - dependencies: - is-unicode-supported "^2.0.0" - file-entry-cache@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" @@ -2265,55 +1940,22 @@ file-entry-cache@^8.0.0: dependencies: flat-cache "^4.0.0" -file-type@^21.3.0, file-type@^21.3.4: - version "21.3.4" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-21.3.4.tgz#e3f902faee8ec4aa152909fc902a7a77f9c06725" - integrity sha512-Ievi/yy8DS3ygGvT47PjSfdFoX+2isQueoYP1cntFW1JLYAuS4GD7NUPGg4zv2iZfV52uDyk5w5Z0TdpRS6Q1g== +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: - "@tokenizer/inflate" "^0.4.1" - strtok3 "^10.3.4" - token-types "^6.1.1" - uint8array-extras "^1.4.0" + locate-path "^6.0.0" + path-exists "^4.0.0" -filename-reserved-regex@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-4.0.0.tgz#bc981c1e5c8aee7d32ac8594c109aa14682b01d2" - integrity sha512-9ZT504KxEQDamsOogZImAWGEN24R1uFAxU3ZS4AZqn2ooidmN68Olh7n4/RcA4lLatZztjA0ZSuxeLHVoCc8JA== - -filenamify@^7.0.1: - version "7.0.2" - resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-7.0.2.tgz#4a3ac9ffaebd7dc3bb649b4d28e3b9e8554fb12a" - integrity sha512-fz10TUqSZ1lG7ftW1KnRotJzMD8YRb6kaAQKpZJBLvqXXfFgIEpuazy1w2lK3zhMiBSdH/uF9LFlv5smJ2Jl1w== - dependencies: - filename-reserved-regex "^4.0.0" - -finalhandler@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-2.1.1.tgz#a2c517a6559852bcdb06d1f8bd7f51b68fad8099" - integrity sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA== - dependencies: - debug "^4.4.0" - encodeurl "^2.0.0" - escape-html "^1.0.3" - on-finished "^2.4.1" - parseurl "^1.3.3" - statuses "^2.0.1" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -find-versions@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-6.0.0.tgz#fda285d3bb7c0c098f09e0727c54d31735f0c7d1" - integrity sha512-2kCCtc+JvcZ86IGAz3Z2Y0A1baIz9fL31pH/0S1IqZr9Iwnjq8izfPtrCyQKO6TLMPELLsQMre7VDqeIKCsHkA== +fix-dts-default-cjs-exports@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz#955cb6b3d519691c57828b078adadf2cb92e9549" + integrity sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg== dependencies: - semver-regex "^4.0.5" - super-regex "^1.0.0" + magic-string "^0.30.17" + mlly "^1.7.4" + rollup "^4.34.8" flat-cache@^4.0.0: version "4.0.1" @@ -2328,36 +1970,11 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.4.2.tgz#f5c23c107f0f37de8dbdf24f13722b3b98d52726" integrity sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA== -form-data-encoder@^4.0.2: - version "4.1.0" - resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-4.1.0.tgz#497cedc94810bd5d53b99b5d4f6c152d5cbc9db2" - integrity sha512-G6NsmEW15s0Uw9XnCg+33H3ViYRyiM0hMrMhhqQOR8NFc5GhYrI+6I3u7OTw7b91J2g8rtvMBZJDbcGb2YUniw== - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-2.0.0.tgz#8dd7df6a1b3a1b3a5cf186c05a5dd267622635a4" - integrity sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A== - -fsevents@~2.3.3: +fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -function-timeout@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/function-timeout/-/function-timeout-1.0.2.tgz#e5a7b6ffa523756ff20e1231bbe37b5f373aadd5" - integrity sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA== - get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" @@ -2368,43 +1985,6 @@ get-east-asian-width@^1.0.0, get-east-asian-width@^1.3.1, get-east-asian-width@^ resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz#216900f91df11a8b2c198c3e1d93d6c035a776b9" integrity sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA== -get-intrinsic@^1.2.5, get-intrinsic@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" - integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== - dependencies: - call-bind-apply-helpers "^1.0.2" - es-define-property "^1.0.1" - es-errors "^1.3.0" - es-object-atoms "^1.1.1" - function-bind "^1.1.2" - get-proto "^1.0.1" - gopd "^1.2.0" - has-symbols "^1.1.0" - hasown "^2.0.2" - math-intrinsics "^1.1.0" - -get-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" - integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== - dependencies: - dunder-proto "^1.0.1" - es-object-atoms "^1.0.0" - -get-stream@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" - integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== - -get-stream@^9.0.0, get-stream@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-9.0.1.tgz#95157d21df8eb90d1647102b63039b1df60ebd27" - integrity sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA== - dependencies: - "@sec-ant/readable-stream" "^0.4.1" - is-stream "^4.0.1" - giget@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/giget/-/giget-2.0.0.tgz#395fc934a43f9a7a29a29d55b99f23e30c14f195" @@ -2436,34 +2016,6 @@ globals@^17.7.0: resolved "https://registry.yarnpkg.com/globals/-/globals-17.7.0.tgz#553d55090b4dde8209ec2da42580d6e7e7d8b10d" integrity sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg== -gopd@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" - integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== - -got@^14.6.6: - version "14.6.6" - resolved "https://registry.yarnpkg.com/got/-/got-14.6.6.tgz#5adf7f576f89de8e291fd782e8b277f9bcc8e6c0" - integrity sha512-QLV1qeYSo5l13mQzWgP/y0LbMr5Plr5fJilgAIwgnwseproEbtNym8xpLsDzeZ6MWXgNE6kdWGBjdh3zT/Qerg== - dependencies: - "@sindresorhus/is" "^7.0.1" - byte-counter "^0.1.0" - cacheable-lookup "^7.0.0" - cacheable-request "^13.0.12" - decompress-response "^10.0.0" - form-data-encoder "^4.0.2" - http2-wrapper "^2.2.1" - keyv "^5.5.3" - lowercase-keys "^3.0.0" - p-cancelable "^4.0.1" - responselike "^4.0.2" - type-fest "^4.26.1" - -graceful-fs@^4.2.11: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - gradient-string@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/gradient-string/-/gradient-string-3.0.0.tgz#716d6d6f35309513fa92d38f506c6df0ce1f5ebb" @@ -2477,18 +2029,6 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbols@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" - integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== - -hasown@^2.0.2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.4.tgz#8c62d8cb90beb2aad5d0a5b67581ad9854c3f003" - integrity sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A== - dependencies: - function-bind "^1.1.2" - hast-util-to-html@^9.0.4: version "9.0.5" resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz#ccc673a55bb8e85775b08ac28380f72d47167005" @@ -2513,67 +2053,21 @@ hast-util-whitespace@^3.0.0: dependencies: "@types/hast" "^3.0.0" -helmet@^8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/helmet/-/helmet-8.2.0.tgz#61cb43244de24255a288c2fddb36086074eb1812" - integrity sha512-DRgTIUgnWcJ62KyarxxziuqYxKGnR6Rgg19BlbucN/dpmJbl1XOit6qvoOX0ZT+HhWe5OUVhU/a1zpGyc1xA0Q== +hono@^4.12.31: + version "4.12.31" + resolved "https://registry.yarnpkg.com/hono/-/hono-4.12.31.tgz#2ccaaf3ccd82db372f169c5b39c065c31ff36294" + integrity sha512-zJIHFrl6bq3RDd2YusFNCDlM8qUprxKswyi/OPzPyzKDdyBXDqWx8bZlZ7R+saTdSTatUmb3O7K4SspGPaEOQg== html-void-elements@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-3.0.0.tgz#fc9dbd84af9e747249034d4d62602def6517f1d7" integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg== -http-cache-semantics@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz#205f4db64f8562b76a4ff9235aa5279839a09dd5" - integrity sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ== - -http-errors@^2.0.0, http-errors@^2.0.1, http-errors@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.1.tgz#36d2f65bc909c8790018dd36fb4d93da6caae06b" - integrity sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ== - dependencies: - depd "~2.0.0" - inherits "~2.0.4" - setprototypeof "~1.2.0" - statuses "~2.0.2" - toidentifier "~1.0.1" - -http2-wrapper@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.1.tgz#310968153dcdedb160d8b72114363ef5fce1f64a" - integrity sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ== - dependencies: - quick-lru "^5.1.1" - resolve-alpn "^1.2.0" - -human-signals@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" - integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== - -human-signals@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-8.0.1.tgz#f08bb593b6d1db353933d06156cedec90abe51fb" - integrity sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ== - husky@^9.1.7: version "9.1.7" resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.7.tgz#d46a38035d101b46a70456a850ff4201344c0b2d" integrity sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA== -iconv-lite@^0.7.2, iconv-lite@~0.7.0: - version "0.7.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.7.3.tgz#84ee12f963e7de50bc01a13e160a078b3b0f415f" - integrity sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -ieee754@^1.1.13, ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - ignore@^5.2.0: version "5.3.2" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" @@ -2597,23 +2091,11 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== -inherits@^2.0.3, inherits@~2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - ini@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/ini/-/ini-6.0.0.tgz#efc7642b276f6a37d22fdf56ef50889d7146bf30" integrity sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ== -inspect-with-kind@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/inspect-with-kind/-/inspect-with-kind-1.0.5.tgz#fce151d4ce89722c82ca8e9860bb96f9167c316c" - integrity sha512-MAQUJuIo7Xqk8EVNP+6d3CKq9c80hi4tjIbIAT6lmGW9W6WzlHiu9PS8uSuUYU+Do+j1baiFp3H25XEVxDIG2g== - dependencies: - kind-of "^6.0.2" - ioredis@^5.11.1: version "5.11.1" resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-5.11.1.tgz#2d1e52e350a79ee3b00883f3681a410427b49f28" @@ -2627,11 +2109,6 @@ ioredis@^5.11.1: redis-parser "3.0.0" standard-as-callback "2.1.0" -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - irregular-plurals@^3.3.0: version "3.5.0" resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-3.5.0.tgz#0835e6639aa8425bdc8b0d33d0dc4e89d9c01d2b" @@ -2661,46 +2138,21 @@ is-glob@^4.0.0, is-glob@^4.0.3: dependencies: is-extglob "^2.1.1" -is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== - is-plain-obj@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== -is-promise@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" - integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== - -is-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" - integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== - -is-stream@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-4.0.1.tgz#375cf891e16d2e4baec250b85926cffc14720d9b" - integrity sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A== - -is-unicode-supported@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz#09f0ab0de6d3744d48d265ebb98f65d11f2a9b3a" - integrity sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ== +is-standalone-pwa@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-standalone-pwa/-/is-standalone-pwa-0.1.1.tgz#7a1b0459471a95378aa0764d5dc0a9cec95f2871" + integrity sha512-9Cbovsa52vNQCjdXOzeQq5CnCbAcRk05aU62K20WO372NrTv0NxibLFCK6lQ4/iZEFdEA3p3t2VNOn8AJ53F5g== isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -isexe@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-4.0.0.tgz#48f6576af8e87a18feb796b7ed5e2e5903b43dca" - integrity sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw== - jiti@2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/jiti/-/jiti-2.6.1.tgz#178ef2fc9a1a594248c20627cd820187a4d78d92" @@ -2711,11 +2163,16 @@ jiti@^2.4.2, jiti@^2.7.0: resolved "https://registry.yarnpkg.com/jiti/-/jiti-2.7.0.tgz#974228f2f4ca2bc21885a1797b45fea68e950c64" integrity sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ== -jose@^6.1.3, jose@^6.2.3: +jose@^6.1.3: version "6.2.3" resolved "https://registry.yarnpkg.com/jose/-/jose-6.2.3.tgz#0975197ad973251221c658a3cddc4b951a250c2d" integrity sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw== +joycon@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" + integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== + js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -2765,18 +2222,6 @@ keyv@^4.5.4: dependencies: json-buffer "3.0.1" -keyv@^5.5.3, keyv@^5.6.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-5.6.0.tgz#03044074c6b4d072d0a62c7b9fa649537baf0105" - integrity sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw== - dependencies: - "@keyv/serialize" "^1.1.1" - -kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - "kysely@^0.28.17 || ^0.29.0": version "0.29.2" resolved "https://registry.yarnpkg.com/kysely/-/kysely-0.29.2.tgz#4a07da18db3bba2911693c2b3bd4af415104a85f" @@ -2790,6 +2235,11 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +lilconfig@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4" + integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== + lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" @@ -2818,6 +2268,11 @@ listr2@^10.2.1: rfdc "^1.4.1" wrap-ansi "^10.0.0" +load-tsconfig@^0.2.3: + version "0.2.5" + resolved "https://registry.yarnpkg.com/load-tsconfig/-/load-tsconfig-0.2.5.tgz#453b8cd8961bfb912dea77eb6c168fe8cca3d3a1" + integrity sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg== + locate-path@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" @@ -2841,24 +2296,12 @@ log-update@^6.1.0: strip-ansi "^7.1.0" wrap-ansi "^9.0.0" -lowercase-keys@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" - integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== - -make-asynchronous@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/make-asynchronous/-/make-asynchronous-1.1.0.tgz#6225f7f1ccaab9acaac5e2fcd0b075afefff19aa" - integrity sha512-ayF7iT+44LXdxJLTrTd3TLQpFDDvPCBxXxbv+pMUSuHA5Q8zyAfwkRP6aHHwNVFBUFWtxAHqwNJxF8vMZLAbVg== +magic-string@^0.30.17: + version "0.30.21" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.21.tgz#56763ec09a0fa8091df27879fd94d19078c00d91" + integrity sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ== dependencies: - p-event "^6.0.0" - type-fest "^4.6.0" - web-worker "^1.5.0" - -math-intrinsics@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" - integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + "@jridgewell/sourcemap-codec" "^1.5.5" mdast-util-to-hast@^13.0.0: version "13.2.1" @@ -2875,31 +2318,11 @@ mdast-util-to-hast@^13.0.0: unist-util-visit "^5.0.0" vfile "^6.0.0" -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -media-typer@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-1.1.0.tgz#6ab74b8f2d3320f2064b2a87a38e7931ff3a5561" - integrity sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw== - meow@^14.0.0: version "14.1.0" resolved "https://registry.yarnpkg.com/meow/-/meow-14.1.0.tgz#3cd2d16ad534829ab12fcb5010fc2fdb89facd31" integrity sha512-EDYo6VlmtnumlcBCbh1gLJ//9jvM/ndXHfVXIFrZVr6fGcwTUyCTFNTLCKuY3ffbK8L/+3Mzqnd58RojiZqHVw== -merge-descriptors@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-2.0.0.tgz#ea922f660635a2249ee565e0449f951e6b603808" - integrity sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - micromark-util-character@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-2.1.1.tgz#2f987831a40d4c510ac261e89852c4e9703ccda6" @@ -2932,45 +2355,11 @@ micromark-util-types@^2.0.0: resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.2.tgz#f00225f5f5a0ebc3254f96c36b6605c4b393908e" integrity sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA== -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-db@^1.28.0, mime-db@^1.54.0: - version "1.54.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" - integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== - -mime-types@^3.0.0, mime-types@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-3.0.2.tgz#39002d4182575d5af036ffa118100f2524b2e2ab" - integrity sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A== - dependencies: - mime-db "^1.54.0" - -mime-types@~2.1.24: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mimic-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" - integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== - mimic-function@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== -mimic-response@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-4.0.0.tgz#35468b19e7c75d10f5165ea25e75a5ceea7cf70f" - integrity sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg== - minimatch@^10.2.2, minimatch@^10.2.4: version "10.2.5" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.5.tgz#bd48687a0be38ed2961399105600f832095861d1" @@ -2978,43 +2367,29 @@ minimatch@^10.2.2, minimatch@^10.2.4: dependencies: brace-expansion "^5.0.5" -minimatch@^9.0.3: - version "9.0.9" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.9.tgz#9b0cb9fcb78087f6fd7eababe2511c4d3d60574e" - integrity sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg== - dependencies: - brace-expansion "^2.0.2" - -morgan@1.11.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.11.0.tgz#98464b8538802f14e9e5374ebe23ac364cd617e8" - integrity sha512-zSkVu3t18r39pw4ixfBKvfZi3y2UOqr7d4WYwcj3m8nXpEQK4rPO6GLzs/CExoRgmX3y9EjmmcXqv6jq0SK46g== +mlly@^1.7.4: + version "1.8.2" + resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.8.2.tgz#e7f7919a82d13b174405613117249a3f449d78bb" + integrity sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA== dependencies: - basic-auth "~2.0.1" - debug "2.6.9" - depd "~2.0.0" - on-finished "~2.4.1" - on-headers "~1.1.0" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + acorn "^8.16.0" + pathe "^2.0.3" + pkg-types "^1.3.1" + ufo "^1.6.3" ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -multer@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/multer/-/multer-2.2.0.tgz#f005268ca816324ba7335e3b48166896a3fa5d79" - integrity sha512-6rdyFg2kLrMh9Jee7/BMPuV9lEAd7lLW2YUpF9/YxR7njyoUwwQ0ZPh3TaIY50Sw6vlyD2HW3wGOkTS4P79xrQ== +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== dependencies: - append-field "^1.0.0" - busboy "^1.6.0" - concat-stream "^2.0.0" - type-is "^1.6.18" + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" nanostores@^1.1.1: version "1.4.0" @@ -3026,36 +2401,11 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -negotiator@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-1.0.0.tgz#b6c91bb47172d69f93cfd7c357bbb529019b5f6a" - integrity sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg== - node-fetch-native@^1.6.6: version "1.6.7" resolved "https://registry.yarnpkg.com/node-fetch-native/-/node-fetch-native-1.6.7.tgz#9d09ca63066cc48423211ed4caf5d70075d76a71" integrity sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q== -normalize-url@^8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.1.1.tgz#751a20c8520e5725404c06015fea21d7567f25ef" - integrity sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ== - -npm-run-path@^5.1.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" - integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== - dependencies: - path-key "^4.0.0" - -npm-run-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-6.0.0.tgz#25cfdc4eae04976f3349c0b1afc089052c362537" - integrity sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA== - dependencies: - path-key "^4.0.0" - unicorn-magic "^0.3.0" - nypm@^0.6.0: version "0.6.8" resolved "https://registry.yarnpkg.com/nypm/-/nypm-0.6.8.tgz#8fc62cf5aee4cdaebd487e593fe7b246862be01d" @@ -3065,47 +2415,16 @@ nypm@^0.6.0: pathe "^2.0.3" tinyexec "^1.2.4" -object-assign@^4: +object-assign@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-inspect@^1.13.3, object-inspect@^1.13.4: - version "1.13.4" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" - integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== - ohash@^2.0.11: version "2.0.11" resolved "https://registry.yarnpkg.com/ohash/-/ohash-2.0.11.tgz#60b11e8cff62ca9dee88d13747a5baa145f5900b" integrity sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ== -on-finished@^2.4.1, on-finished@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -on-headers@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.1.0.tgz#59da4f91c45f5f989c6e4bcedc5a3b0aed70ff65" - integrity sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A== - -once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" - integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== - dependencies: - mimic-fn "^4.0.0" - onetime@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/onetime/-/onetime-7.0.0.tgz#9f16c92d8c9ef5120e3acd9dd9957cceecc1ab60" @@ -3122,6 +2441,13 @@ oniguruma-to-es@^2.2.0: regex "^5.1.1" regex-recursion "^5.1.1" +openapi3-ts@^4.1.2, openapi3-ts@^4.5.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/openapi3-ts/-/openapi3-ts-4.6.0.tgz#a602c03b993f9e9081cc97d762966c8080f4d77c" + integrity sha512-a4sfn6L2sIShhtzJqmjGrARvxAW/3F2BJDdyRVvNF9VhAsZSh5hSyI3a9TNvmzBxXmq66nY5LNT5bQcBxYAZZg== + dependencies: + yaml "^2.9.0" + optionator@^0.9.3: version "0.9.4" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" @@ -3134,18 +2460,6 @@ optionator@^0.9.3: type-check "^0.4.0" word-wrap "^1.2.5" -p-cancelable@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-4.0.1.tgz#2d1edf1ab8616b72c73db41c4bc9ecdd10af640e" - integrity sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg== - -p-event@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/p-event/-/p-event-6.0.1.tgz#8f62a1e3616d4bc01fce3abda127e0383ef4715b" - integrity sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w== - dependencies: - p-timeout "^6.1.2" - p-limit@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" @@ -3160,11 +2474,6 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" -p-timeout@^6.1.2: - version "6.1.4" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-6.1.4.tgz#418e1f4dd833fa96a2e3f532547dd2abdb08dbc2" - integrity sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg== - parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -3182,16 +2491,6 @@ parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" -parse-ms@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-4.0.0.tgz#c0c058edd47c2a590151a718990533fd62803df4" - integrity sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw== - -parseurl@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -3202,26 +2501,11 @@ path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-key@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" - integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== - -path-to-regexp@^8.0.0: - version "8.4.2" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-8.4.2.tgz#795c420c4f7ca45c5b887366f622ee0c9852cccd" - integrity sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA== - -pathe@^2.0.3: +pathe@^2.0.1, pathe@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== - perfect-debounce@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz#9c2e8bc30b169cc984a58b7d5b28049839591d2a" @@ -3237,12 +2521,19 @@ picomatch@^4.0.4: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.5.tgz#51ea57a17d86f605f81039595fbc40ed06a55fab" integrity sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A== -piscina@^4.3.1: - version "4.9.3" - resolved "https://registry.yarnpkg.com/piscina/-/piscina-4.9.3.tgz#a8df8f699f1f3721c01720d0e7dcc49e7de1fea8" - integrity sha512-3e3ka9QCE8RJ5I9uszdAADZnkcYi21cqmF3gxox3u884N72qpFHCsIVhHt8cEQ9t3Auq/NqoiCEuhxlxxQuDWA== - optionalDependencies: - "@napi-rs/nice" "^1.0.1" +pirates@^4.0.1: + version "4.0.7" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.7.tgz#643b4a18c4257c8a65104b73f3049ce9a0a15e22" + integrity sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA== + +pkg-types@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.3.1.tgz#bd7cc70881192777eef5326c19deb46e890917df" + integrity sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ== + dependencies: + confbox "^0.1.8" + mlly "^1.7.4" + pathe "^2.0.1" pkg-types@^2.2.0: version "2.3.1" @@ -3265,6 +2556,13 @@ postal-mime@2.7.4: resolved "https://registry.yarnpkg.com/postal-mime/-/postal-mime-2.7.4.tgz#3718d1f188357ed86f906f1db8d4ca455efa4927" integrity sha512-0WdnFQYUrPGGTFu1uOqD2s7omwua8xaeYGdO6rb88oD5yJ/4pPHDA4sdWqfD8wQVfCny563n/HQS7zTFft+f/g== +postcss-load-config@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-6.0.1.tgz#6fd7dcd8ae89badcf1b2d644489cbabf83aa8096" + integrity sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g== + dependencies: + lilconfig "^3.1.1" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -3275,13 +2573,6 @@ prettier@^3.9.5: resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.9.5.tgz#4fec97736e33b9d0b620b48914fe93b530e835ad" integrity sha512-/FVl766LpUfB5vXgCYOYa0MeV/441Ia99AeICQIQFTY/Nw0roZwULcXpku5i1/m5kt/baz+s4Zogspd839HSMg== -pretty-ms@^9.2.0: - version "9.3.0" - resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-9.3.0.tgz#dd2524fcb3c326b4931b2272dfd1e1a8ed9a9f5a" - integrity sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ== - dependencies: - parse-ms "^4.0.0" - prisma@^6.19.3: version "6.19.3" resolved "https://registry.yarnpkg.com/prisma/-/prisma-6.19.3.tgz#48c80d6a7b74269f6f30e27c1f8781a83249410c" @@ -3295,14 +2586,6 @@ property-information@^7.0.0: resolved "https://registry.yarnpkg.com/property-information/-/property-information-7.2.0.tgz#0809b34264e995c0bfcd3227028a1e35210af80a" integrity sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg== -proxy-addr@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - punycode@^2.1.0: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" @@ -3313,33 +2596,17 @@ pure-rand@^6.1.0: resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== -qs@^6.14.0, qs@^6.15.2: - version "6.15.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.15.3.tgz#76852132a58ed5c7c0ef67e4441b9bb5d6061b3b" - integrity sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A== +pvtsutils@^1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.3.6.tgz#ec46e34db7422b9e4fdc5490578c1883657d6001" + integrity sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg== dependencies: - es-define-property "^1.0.1" - side-channel "^1.1.1" - -quick-lru@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" - integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + tslib "^2.8.1" -range-parser@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.3.0.tgz#d7f19be812bb62721472b45d3be219ef09572b47" - integrity sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw== - -raw-body@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-3.0.2.tgz#3e3ada5ae5568f9095d84376fd3a49b8fb000a51" - integrity sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA== - dependencies: - bytes "~3.1.2" - http-errors "~2.0.1" - iconv-lite "~0.7.0" - unpipe "~1.0.0" +pvutils@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.1.5.tgz#84b0dea4a5d670249aa9800511804ee0b7c2809c" + integrity sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA== rc9@^2.1.2: version "2.1.2" @@ -3349,15 +2616,6 @@ rc9@^2.1.2: defu "^6.1.4" destr "^2.0.3" -readable-stream@^3.0.2: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - readdirp@^4.0.1: version "4.1.2" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" @@ -3375,6 +2633,11 @@ redis-parser@3.0.0: dependencies: redis-errors "^1.0.0" +reflect-metadata@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.2.2.tgz#400c845b6cba87a21f2c65c4aeb158f4fa4d9c5b" + integrity sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q== + regex-recursion@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/regex-recursion/-/regex-recursion-5.1.1.tgz#5a73772d18adbf00f57ad097bf54171b39d78f8b" @@ -3408,11 +2671,6 @@ resend@^6.17.2: postal-mime "2.7.4" standardwebhooks "1.0.0" -resolve-alpn@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" - integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -3423,13 +2681,6 @@ resolve-from@^5.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -responselike@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-4.0.2.tgz#d99a1105aeca5909c1e93156a839c7f3173e26c2" - integrity sha512-cGk8IbWEAnaCpdAt1BHzJ3Ahz5ewDJa0KseTsE3qIRMJ3C698W8psM7byCeWVpd/Ha7FUYzuRVzXoKoM6nRUbA== - dependencies: - lowercase-keys "^3.0.0" - restore-cursor@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-5.1.0.tgz#0766d95699efacb14150993f55baf0953ea1ebe7" @@ -3443,98 +2694,55 @@ rfdc@^1.4.1: resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== +rollup@^4.34.8: + version "4.62.2" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.62.2.tgz#d90fc4cb811f071303c890b779595634f35f9541" + integrity sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA== + dependencies: + "@types/estree" "1.0.9" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.62.2" + "@rollup/rollup-android-arm64" "4.62.2" + "@rollup/rollup-darwin-arm64" "4.62.2" + "@rollup/rollup-darwin-x64" "4.62.2" + "@rollup/rollup-freebsd-arm64" "4.62.2" + "@rollup/rollup-freebsd-x64" "4.62.2" + "@rollup/rollup-linux-arm-gnueabihf" "4.62.2" + "@rollup/rollup-linux-arm-musleabihf" "4.62.2" + "@rollup/rollup-linux-arm64-gnu" "4.62.2" + "@rollup/rollup-linux-arm64-musl" "4.62.2" + "@rollup/rollup-linux-loong64-gnu" "4.62.2" + "@rollup/rollup-linux-loong64-musl" "4.62.2" + "@rollup/rollup-linux-ppc64-gnu" "4.62.2" + "@rollup/rollup-linux-ppc64-musl" "4.62.2" + "@rollup/rollup-linux-riscv64-gnu" "4.62.2" + "@rollup/rollup-linux-riscv64-musl" "4.62.2" + "@rollup/rollup-linux-s390x-gnu" "4.62.2" + "@rollup/rollup-linux-x64-gnu" "4.62.2" + "@rollup/rollup-linux-x64-musl" "4.62.2" + "@rollup/rollup-openbsd-x64" "4.62.2" + "@rollup/rollup-openharmony-arm64" "4.62.2" + "@rollup/rollup-win32-arm64-msvc" "4.62.2" + "@rollup/rollup-win32-ia32-msvc" "4.62.2" + "@rollup/rollup-win32-x64-gnu" "4.62.2" + "@rollup/rollup-win32-x64-msvc" "4.62.2" + fsevents "~2.3.2" + rou3@^0.7.12: version "0.7.12" resolved "https://registry.yarnpkg.com/rou3/-/rou3-0.7.12.tgz#cac17425c04abddba854a42385cabfe0b971a179" integrity sha512-iFE4hLDuloSWcD7mjdCDhx2bKcIsYbtOTpfH5MHHLSKMOUyjqQXTeZVa289uuwEGEKFoE/BAPbhaU4B774nceg== -router@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/router/-/router-2.2.0.tgz#019be620b711c87641167cc79b99090f00b146ef" - integrity sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ== - dependencies: - debug "^4.4.0" - depd "^2.0.0" - is-promise "^4.0.0" - parseurl "^1.3.3" - path-to-regexp "^8.0.0" - -safe-buffer@5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -"safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -seek-bzip@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-2.0.0.tgz#f0478ab6acd0ac72345d18dc7525dd84d3c706a2" - integrity sha512-SMguiTnYrhpLdk3PwfzHeotrcwi8bNV4iemL9tx9poR/yeaMYwB9VzR1w7b57DuWpuqR8n6oZboi0hj3AxZxQg== - dependencies: - commander "^6.0.0" - -semver-regex@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-4.0.5.tgz#fbfa36c7ba70461311f5debcb3928821eb4f9180" - integrity sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw== - -semver-truncate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/semver-truncate/-/semver-truncate-3.0.0.tgz#0e3b4825d4a4225d8ae6e7c72231182b42edba40" - integrity sha512-LJWA9kSvMolR51oDE6PN3kALBNaUdkxzAGcexw8gjMA8xr5zUqK0JiR3CgARSqanYF3Z1YHvsErb1KDgh+v7Rg== - dependencies: - semver "^7.3.5" - -semver@^7.3.5, semver@^7.3.8, semver@^7.5.2, semver@^7.6.0, semver@^7.7.3: +semver@^7.5.2, semver@^7.6.0, semver@^7.7.3: version "7.8.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.8.5.tgz#39b646037dd50c14fb451e7e4cac58ed8b863f69" integrity sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA== -send@^1.1.0, send@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/send/-/send-1.2.1.tgz#9eab743b874f3550f40a26867bf286ad60d3f3ed" - integrity sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ== - dependencies: - debug "^4.4.3" - encodeurl "^2.0.0" - escape-html "^1.0.3" - etag "^1.8.1" - fresh "^2.0.0" - http-errors "^2.0.1" - mime-types "^3.0.2" - ms "^2.1.3" - on-finished "^2.4.1" - range-parser "^1.2.1" - statuses "^2.0.2" - -serve-static@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-2.2.1.tgz#7f186a4a4e5f5b663ad7a4294ff1bf37cf0e98a9" - integrity sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw== - dependencies: - encodeurl "^2.0.0" - escape-html "^1.0.3" - parseurl "^1.3.3" - send "^1.2.0" - set-cookie-parser@^3.0.1: version "3.1.1" resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-3.1.1.tgz#5d80652208e37545aba30ea613d4f797ea405af8" integrity sha512-vM9SUhjsUYs6UeJUmygc5Ofm5eQGe85riob5ju6XCgFGJI5PLV4nrDAQpQjd+LkFBpAkADn5BQQpZ9EUNkyLuA== -setprototypeof@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -3561,56 +2769,11 @@ shiki@^1.26.1: "@shikijs/vscode-textmate" "^10.0.1" "@types/hast" "^3.0.4" -side-channel-list@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.1.tgz#c2e0b5a14a540aebee3bbc6c3f8666cc9b509127" - integrity sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w== - dependencies: - es-errors "^1.3.0" - object-inspect "^1.13.4" - -side-channel-map@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" - integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - get-intrinsic "^1.2.5" - object-inspect "^1.13.3" - -side-channel-weakmap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" - integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - get-intrinsic "^1.2.5" - object-inspect "^1.13.3" - side-channel-map "^1.0.1" - -side-channel@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.1.tgz#ea02c62e05dc4bea67d4442f0fb71ee192f8e0ab" - integrity sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ== - dependencies: - es-errors "^1.3.0" - object-inspect "^1.13.4" - side-channel-list "^1.0.1" - side-channel-map "^1.0.1" - side-channel-weakmap "^1.0.2" - signal-exit@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== -slash@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - slice-ansi@^7.1.0: version "7.1.2" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.2.tgz#adf7be70aa6d72162d907cd0e6d5c11f507b5403" @@ -3627,21 +2790,7 @@ slice-ansi@^8.0.0: ansi-styles "^6.2.3" is-fullwidth-code-point "^5.1.0" -sort-keys-length@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sort-keys-length/-/sort-keys-length-1.0.1.tgz#9cb6f4f4e9e48155a6aa0671edd336ff1479a188" - integrity sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw== - dependencies: - sort-keys "^1.0.0" - -sort-keys@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" - integrity sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg== - dependencies: - is-plain-obj "^1.0.0" - -source-map@^0.7.3: +source-map@^0.7.6: version "0.7.6" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.6.tgz#a3658ab87e5b6429c8a1f3ba0083d4c61ca3ef02" integrity sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ== @@ -3664,25 +2813,6 @@ standardwebhooks@1.0.0: "@stablelib/base64" "^1.0.0" fast-sha256 "^1.3.0" -statuses@^2.0.1, statuses@^2.0.2, statuses@~2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.2.tgz#8f75eecef765b5e1cfcdc080da59409ed424e382" - integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== - -streamsearch@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" - integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== - -streamx@^2.15.0: - version "2.28.0" - resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.28.0.tgz#035ab56057b7ed2211b51d532e6973f0f99fbf11" - integrity sha512-1Yowhzjf0ivGMrTIkY9hav5TxobO9qIVqUE41fiCGMGgc3CLlf4MY+9AHmZqBWgDTue0fY9zWjYFVyf6Diuobw== - dependencies: - events-universal "^1.0.0" - fast-fifo "^1.3.2" - text-decoder "^1.1.0" - string-argv@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" @@ -3705,13 +2835,6 @@ string-width@^8.2.0: get-east-asian-width "^1.5.0" strip-ansi "^7.1.2" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - stringify-entities@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.4.tgz#b3b79ef5f277cc4ac73caeb0236c5ba939b3a4f3" @@ -3727,39 +2850,18 @@ strip-ansi@^7.1.0, strip-ansi@^7.1.2: dependencies: ansi-regex "^6.2.2" -strip-dirs@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-3.0.0.tgz#7c9a5d7822ce079a9db40387a4b20d5654746f42" - integrity sha512-I0sdgcFTfKQlUPZyAqPJmSG3HLO9rWDFnxonnIbskYNM3DwFOeTNB5KzVq3dA1GdRAc/25b5Y7UO2TQfKWw4aQ== - dependencies: - inspect-with-kind "^1.0.5" - is-plain-obj "^1.1.0" - -strip-final-newline@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" - integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== - -strip-final-newline@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-4.0.0.tgz#35a369ec2ac43df356e3edd5dcebb6429aa1fa5c" - integrity sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw== - -strtok3@^10.3.4: - version "10.3.5" - resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-10.3.5.tgz#7213285da0dc3dec0fc8ce5df4b8b7a733f14360" - integrity sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA== - dependencies: - "@tokenizer/token" "^0.3.0" - -super-regex@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/super-regex/-/super-regex-1.1.0.tgz#14b69b6374f7b3338db52ecd511dae97c27acf75" - integrity sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ== +sucrase@^3.35.0: + version "3.35.1" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.1.tgz#4619ea50393fe8bd0ae5071c26abd9b2e346bfe1" + integrity sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw== dependencies: - function-timeout "^1.0.1" - make-asynchronous "^1.0.1" - time-span "^5.1.0" + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + tinyglobby "^0.2.11" + ts-interface-checker "^0.1.9" supports-color@^7.0.0: version "7.2.0" @@ -3776,34 +2878,6 @@ supports-hyperlinks@^2.2.0: has-flag "^4.0.0" supports-color "^7.0.0" -swagger-ui-dist@>=5.0.0: - version "5.32.8" - resolved "https://registry.yarnpkg.com/swagger-ui-dist/-/swagger-ui-dist-5.32.8.tgz#14a5e6ba016875dfb31de26cff5c3bea725a3c89" - integrity sha512-dgMdWXIgnI4zX4OPhKEdWnlDODbgm8W3AX0Ivn/BBqcUh6xZsBxhZMnvk6DJyRz1BTrj8dPxtarmEGgkz30oyA== - dependencies: - "@scarf/scarf" "=1.4.0" - -swagger-ui-express@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/swagger-ui-express/-/swagger-ui-express-5.0.1.tgz#fb8c1b781d2793a6bd2f8a205a3f4bd6fa020dd8" - integrity sha512-SrNU3RiBGTLLmFU8GIJdOdanJTl4TOmT27tt3bWWHppqYmAZ6IDuEuBvMU6nZq0zLEe6b/1rACXCgLZqO6ZfrA== - dependencies: - swagger-ui-dist ">=5.0.0" - -system-architecture@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/system-architecture/-/system-architecture-1.0.0.tgz#0e71d7678d3d3b2fabfac0e00ea0306b14f8a532" - integrity sha512-0OJWD12D7XX3KUg1DYkMaTTjSTo2k/mhIYI3HlBlceXSMcJhW/1qO735fPKS5prcyjvn57Ub151vvASYXpQrEw== - -tar-stream@3.1.7: - version "3.1.7" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.7.tgz#24b3fb5eabada19fe7338ed6d26e5f7c482e792b" - integrity sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ== - dependencies: - b4a "^1.6.4" - fast-fifo "^1.2.0" - streamx "^2.15.0" - terminal-link@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-3.0.0.tgz#91c82a66b52fc1684123297ce384429faf72ac5c" @@ -3812,36 +2886,36 @@ terminal-link@^3.0.0: ansi-escapes "^5.0.0" supports-hyperlinks "^2.2.0" -text-decoder@^1.1.0: - version "1.2.7" - resolved "https://registry.yarnpkg.com/text-decoder/-/text-decoder-1.2.7.tgz#5d073a9a74b9c0a9d28dfadcab96b604af57d8ba" - integrity sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ== +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== dependencies: - b4a "^1.6.4" + thenify ">= 3.1.0 < 4" -through@^2.3.8: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== - -time-span@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/time-span/-/time-span-5.1.0.tgz#80c76cf5a0ca28e0842d3f10a4e99034ce94b90d" - integrity sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA== +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== dependencies: - convert-hrtime "^5.0.0" + any-promise "^1.0.0" tinycolor2@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.6.0.tgz#f98007460169b0263b97072c5ae92484ce02d09e" integrity sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw== +tinyexec@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.2.tgz#941794e657a85e496577995c6eef66f53f42b3d2" + integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA== + tinyexec@^1.0.0, tinyexec@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-1.2.4.tgz#ae45bb2edebda94c70f4ea897e0f1243e470db71" integrity sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg== -tinyglobby@^0.2.13, tinyglobby@^0.2.15: +tinyglobby@^0.2.11, tinyglobby@^0.2.15: version "0.2.17" resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.17.tgz#562a9a6c9eb2b3b123d39719f9af5bb44fcd7631" integrity sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g== @@ -3857,19 +2931,10 @@ tinygradient@^1.1.5: "@types/tinycolor2" "^1.4.0" tinycolor2 "^1.0.0" -toidentifier@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -token-types@^6.1.1: - version "6.1.2" - resolved "https://registry.yarnpkg.com/token-types/-/token-types-6.1.2.tgz#18d0fd59b996d421f9f83914d6101c201bd08129" - integrity sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww== - dependencies: - "@borewit/text-codec" "^0.2.1" - "@tokenizer/token" "^0.3.0" - ieee754 "^1.2.1" +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== trim-lines@^3.0.0: version "3.0.1" @@ -3881,6 +2946,44 @@ ts-api-utils@^2.5.0: resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.5.0.tgz#4acd4a155e22734990a5ed1fe9e97f113bcb37c1" integrity sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA== +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + +tslib@^1.9.3: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + +tsup@^8.5.1: + version "8.5.1" + resolved "https://registry.yarnpkg.com/tsup/-/tsup-8.5.1.tgz#a9c7a875b93344bdf70600dedd78e70f88ec9a65" + integrity sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing== + dependencies: + bundle-require "^5.1.0" + cac "^6.7.14" + chokidar "^4.0.3" + consola "^3.4.0" + debug "^4.4.0" + esbuild "^0.27.0" + fix-dts-default-cjs-exports "^1.0.0" + joycon "^3.1.1" + picocolors "^1.1.1" + postcss-load-config "^6.0.1" + resolve-from "^5.0.0" + rollup "^4.34.8" + source-map "^0.7.6" + sucrase "^3.35.0" + tinyexec "^0.3.2" + tinyglobby "^0.2.11" + tree-kill "^1.2.2" + tsx@^4.23.0: version "4.23.1" resolved "https://registry.yarnpkg.com/tsx/-/tsx-4.23.1.tgz#1703da002ee4432b9a053917431f91462fca235b" @@ -3890,6 +2993,13 @@ tsx@^4.23.0: optionalDependencies: fsevents "~2.3.3" +tsyringe@^4.10.0: + version "4.10.0" + resolved "https://registry.yarnpkg.com/tsyringe/-/tsyringe-4.10.0.tgz#d0c95815d584464214060285eaaadd94aa03299c" + integrity sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw== + dependencies: + tslib "^1.9.3" + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -3902,33 +3012,6 @@ type-fest@^1.0.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== -type-fest@^4.26.1, type-fest@^4.6.0: - version "4.41.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.41.0.tgz#6ae1c8e5731273c2bf1f58ad39cbae2c91a46c58" - integrity sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA== - -type-is@^1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -type-is@^2.0.1, type-is@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-2.1.0.tgz#71d1a7053293582e16ac9f3ebaf1ab9aa49e5570" - integrity sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA== - dependencies: - content-type "^2.0.0" - media-typer "^1.1.0" - mime-types "^3.0.0" - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== - typescript-eslint@^8.63.0: version "8.64.0" resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.64.0.tgz#4984dae4de9dc8bf892acf5c394d0a2a5f08c3e1" @@ -3944,34 +3027,30 @@ typescript@^6.0.3: resolved "https://registry.yarnpkg.com/typescript/-/typescript-6.0.3.tgz#90251dc007916e972786cb94d74d15b185577d21" integrity sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw== -uint8array-extras@^1.4.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/uint8array-extras/-/uint8array-extras-1.5.0.tgz#10d2a85213de3ada304fea1c454f635c73839e86" - integrity sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A== +ua-is-frozen@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ua-is-frozen/-/ua-is-frozen-0.1.2.tgz#bfbc5f06336e379590e36beca444188c7dc3a7f3" + integrity sha512-RwKDW2p3iyWn4UbaxpP2+VxwqXh0jpvdxsYpZ5j/MLLiQOfbsV5shpgQiw93+KMYQPcteeMQ289MaAFzs3G9pw== -unbzip2-stream@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" - integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== +ua-parser-js@^2.0.10: + version "2.0.10" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-2.0.10.tgz#a28f1087ef5a3fff5aeb6bd86258841bfb6327b8" + integrity sha512-t+3Ktbq0Ies2vaSezfOaWiolH4OigQIO1dk+1xDpOydB1COVPocVYOrEV5rqZ0kFY9XYG1v9LutCyMgYBpABcw== dependencies: - buffer "^5.2.1" - through "^2.3.8" + detect-europe-js "^0.1.2" + is-standalone-pwa "^0.1.1" + ua-is-frozen "^0.1.2" + +ufo@^1.6.3: + version "1.6.4" + resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.6.4.tgz#7a8fb875fcc6382d2c7d0b3692738b0500a92467" + integrity sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA== "undici-types@>=7.24.0 <7.24.7": version "7.24.6" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.24.6.tgz#61275b485d7fd4e9d269c7cf04ec2873c9cc0f91" integrity sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg== -undici-types@~8.3.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-8.3.0.tgz#44e9fc9f3244648cdea35e4f9bb2d681e9410809" - integrity sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ== - -unicorn-magic@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.3.0.tgz#4efd45c85a69e0dd576d25532fbfa22aa5c8a104" - integrity sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA== - unist-util-is@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.1.tgz#d0a3f86f2dd0db7acd7d8c2478080b5c67f9c6a9" @@ -4010,11 +3089,6 @@ unist-util-visit@^5.0.0: unist-util-is "^6.0.0" unist-util-visit-parents "^6.0.0" -unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -4022,16 +3096,6 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -util-deprecate@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -vary@^1, vary@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - vfile-message@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-4.0.3.tgz#87b44dddd7b70f0641c2e3ed0864ba73e2ea8df4" @@ -4048,11 +3112,6 @@ vfile@^6.0.0: "@types/unist" "^3.0.0" vfile-message "^4.0.0" -web-worker@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/web-worker/-/web-worker-1.5.0.tgz#71b2b0fbcc4293e8f0aa4f6b8a3ffebff733dcc5" - integrity sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw== - which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -4083,11 +3142,6 @@ wrap-ansi@^9.0.0: string-width "^7.0.0" strip-ansi "^7.1.0" -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" @@ -4115,23 +3169,11 @@ yargs@^18.0.0: y18n "^5.0.5" yargs-parser "^22.0.0" -yauzl@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-3.4.0.tgz#88b2a21455f37ca7dccf2eeb33bacb4392322719" - integrity sha512-jIH9yLR9wqr0wOS0TpBvo/g/2UgZH5qePVbjgRliiF0BYvOZyaBknKsF+x9Iht0O6sqgnB93rCICdOZFecJuDw== - dependencies: - pend "~1.2.0" - yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -yoctocolors@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yoctocolors/-/yoctocolors-2.1.2.tgz#d795f54d173494e7d8db93150cec0ed7f678c83a" - integrity sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug== - zod@^4.3.6, zod@^4.4.3: version "4.4.3" resolved "https://registry.yarnpkg.com/zod/-/zod-4.4.3.tgz#b680f172885d18bbebf21a834ea25e55a1bbf356"