diff --git a/apps/server/src/common/infrastructure/logger/index.ts b/apps/server/src/common/infrastructure/logger/index.ts index d9de1ded..5a82e41f 100644 --- a/apps/server/src/common/infrastructure/logger/index.ts +++ b/apps/server/src/common/infrastructure/logger/index.ts @@ -16,7 +16,6 @@ const initLogger = () => { format.timestamp({ format: "YYYY-MM-DD HH:mm:ss" }), format.align(), format.splat(), - format.metadata(), format.errors({ stack: !isProduction }), format.printf((info) => { diff --git a/apps/server/src/common/presentation/express/express-controller.ts b/apps/server/src/common/presentation/express/express-controller.ts index 14ad723e..66bbe895 100644 --- a/apps/server/src/common/presentation/express/express-controller.ts +++ b/apps/server/src/common/presentation/express/express-controller.ts @@ -1,10 +1,14 @@ import { logger } from "@common/infrastructure/logger"; +import { + AuthenticatedRequest, + TabContextRequest, +} from "@contexts/auth/infraestructure/express/types"; import { NextFunction, Request, Response } from "express"; import httpStatus from "http-status"; import { ApiError } from "./api-error"; export abstract class ExpressController { - protected req!: Request; + protected req!: Request | AuthenticatedRequest | TabContextRequest; protected res!: Response; protected next!: NextFunction; diff --git a/apps/server/src/contexts/auth/application/index.ts b/apps/server/src/contexts/auth/application/index.ts index e8634dcd..fec328bf 100644 --- a/apps/server/src/contexts/auth/application/index.ts +++ b/apps/server/src/contexts/auth/application/index.ts @@ -1,4 +1,5 @@ export * from "./list-users"; export * from "./login"; export * from "./logout"; +export * from "./refresh-token"; export * from "./register"; diff --git a/apps/server/src/contexts/auth/application/refresh-token/index.ts b/apps/server/src/contexts/auth/application/refresh-token/index.ts index 71e9adab..e1939e9b 100644 --- a/apps/server/src/contexts/auth/application/refresh-token/index.ts +++ b/apps/server/src/contexts/auth/application/refresh-token/index.ts @@ -1 +1 @@ -export * from "./login.use-case"; +export * from "./refresh-token.use-case"; diff --git a/apps/server/src/contexts/auth/application/register/refresh-token.use-case.ts b/apps/server/src/contexts/auth/application/refresh-token/refresh-token.use-case.ts similarity index 64% rename from apps/server/src/contexts/auth/application/register/refresh-token.use-case.ts rename to apps/server/src/contexts/auth/application/refresh-token/refresh-token.use-case.ts index 95cd4e0f..fec2d3d5 100644 --- a/apps/server/src/contexts/auth/application/register/refresh-token.use-case.ts +++ b/apps/server/src/contexts/auth/application/refresh-token/refresh-token.use-case.ts @@ -1,4 +1,3 @@ -import { Result } from "@common/domain"; import { ITransactionManager } from "@common/infrastructure/database"; import { Token } from "@contexts/auth/domain"; import { IAuthService } from "@contexts/auth/domain/services"; @@ -11,18 +10,14 @@ export class RefreshTokenUseCase { public async execute(token: Token) { return await this.transactionManager.complete(async (transaction) => { - const payload = this.authService.verifyRefreshToken(token); - if (!payload || !payload.email || !payload.user_id || !payload.tab_id || !payload.roles) { - return Result.fail(new Error("Invalid input data")); - } + const payloadData = this.authService.verifyRefreshToken(token); - const { user_id, tab_id, email, roles } = payload; + /*if (!payload || !payload.email || !payload.user_id || !payload.tab_id || !payload.roles) { + return Result.fail(new Error("Invalid input data")); + }*/ return this.authService.generateRefreshToken({ - user_id, - tab_id, - email, - roles, + ...payloadData, }); }); } diff --git a/apps/server/src/contexts/auth/application/register/index.ts b/apps/server/src/contexts/auth/application/register/index.ts index e1939e9b..8d88027a 100644 --- a/apps/server/src/contexts/auth/application/register/index.ts +++ b/apps/server/src/contexts/auth/application/register/index.ts @@ -1 +1 @@ -export * from "./refresh-token.use-case"; +export * from "./register.use-case"; diff --git a/apps/server/src/contexts/auth/application/refresh-token/login.use-case.ts b/apps/server/src/contexts/auth/application/register/register.use-case.ts similarity index 62% rename from apps/server/src/contexts/auth/application/refresh-token/login.use-case.ts rename to apps/server/src/contexts/auth/application/register/register.use-case.ts index 34dde47c..e3d4d3da 100644 --- a/apps/server/src/contexts/auth/application/refresh-token/login.use-case.ts +++ b/apps/server/src/contexts/auth/application/register/register.use-case.ts @@ -1,16 +1,16 @@ import { ITransactionManager } from "@common/infrastructure/database"; -import { LoginData } from "@contexts/auth/domain"; +import { RegisterData } from "@contexts/auth/domain"; import { IAuthService } from "@contexts/auth/domain/services"; -export class LoginUseCase { +export class RegisterUseCase { constructor( private readonly authService: IAuthService, private readonly transactionManager: ITransactionManager ) {} - public async execute(loginData: LoginData) { + public async execute(registerData: RegisterData) { return await this.transactionManager.complete(async (transaction) => { - return await this.authService.loginUser(loginData, transaction); + return await this.authService.registerUser(registerData, transaction); }); } } diff --git a/apps/server/src/contexts/auth/domain/aggregates/authenticated-user.ts b/apps/server/src/contexts/auth/domain/aggregates/authenticated-user.ts index 9c7ecb5c..e4fbf273 100644 --- a/apps/server/src/contexts/auth/domain/aggregates/authenticated-user.ts +++ b/apps/server/src/contexts/auth/domain/aggregates/authenticated-user.ts @@ -56,7 +56,7 @@ export class AuthenticatedUser } hasRoles(roles: string[]): boolean { - return roles.map((rol) => this.hasRole(rol)).some((value) => value != false); + return roles && roles.map((rol) => this.hasRole(rol)).some((value) => value != false); } get username(): Username { diff --git a/apps/server/src/contexts/auth/domain/entities/index.ts b/apps/server/src/contexts/auth/domain/entities/index.ts index f78c931c..a66561ad 100644 --- a/apps/server/src/contexts/auth/domain/entities/index.ts +++ b/apps/server/src/contexts/auth/domain/entities/index.ts @@ -1,3 +1,4 @@ +export * from "./jwt-payload"; export * from "./login-data"; export * from "./logout-data"; export * from "./register-data"; diff --git a/apps/server/src/contexts/auth/domain/entities/jwt-payload.ts b/apps/server/src/contexts/auth/domain/entities/jwt-payload.ts new file mode 100644 index 00000000..aabfaaa5 --- /dev/null +++ b/apps/server/src/contexts/auth/domain/entities/jwt-payload.ts @@ -0,0 +1,75 @@ +import { DomainEntity, Result, UniqueID } from "@common/domain"; +import { EmailAddress } from "../value-objects"; + +export interface IJWTPayloadProps { + tabId: UniqueID; + userId: UniqueID; + email: EmailAddress; +} + +export interface IJWTPayloadPrimitives { + tab_id: string; + user_id: string; + email: string; +} + +export interface IJWTPayload { + tabId: UniqueID; + userId: UniqueID; + email: EmailAddress; + + toPersistenceData(): any; +} + +export class JWTPayload extends DomainEntity implements IJWTPayload { + static create(props: IJWTPayloadProps): Result { + if (props.email.isEmpty()) { + return Result.fail(new Error("Email is required")); + } + + return Result.ok(new JWTPayload(props)); + } + + static createFromPrimitives(values: IJWTPayloadPrimitives): Result { + const { email, user_id, tab_id } = values; + const emailOrError = EmailAddress.create(email); + const userIdOrError = UniqueID.create(user_id, false); + const tabIdOrError = UniqueID.create(tab_id, false); + + const result = Result.combine([emailOrError, userIdOrError, tabIdOrError]); + + if (result.isFailure) { + return Result.fail(result.error); + } + + if (emailOrError.data.isEmpty()) { + return Result.fail(new Error("Email is required")); + } + + return JWTPayload.create({ + email: emailOrError.data, + userId: userIdOrError.data, + tabId: tabIdOrError.data, + }); + } + + get tabId(): UniqueID { + return this._props.tabId; + } + + get userId(): UniqueID { + return this._props.userId; + } + + get email(): EmailAddress { + return this._props.email; + } + + toPersistenceData(): any { + return { + tab_id: this.tabId.toString(), + user_id: this.userId.toString(), + email: this.email.toString(), + }; + } +} diff --git a/apps/server/src/contexts/auth/domain/entities/login-data.ts b/apps/server/src/contexts/auth/domain/entities/login-data.ts index 2dab132b..1f172534 100644 --- a/apps/server/src/contexts/auth/domain/entities/login-data.ts +++ b/apps/server/src/contexts/auth/domain/entities/login-data.ts @@ -7,6 +7,12 @@ export interface ILoginDataProps { tabId: UniqueID; } +export interface ILoginDataPrimitives { + email: string; + plainPassword: string; + tabId: string; +} + export interface ILoginData { email: EmailAddress; plainPassword: PlainPassword; @@ -18,15 +24,11 @@ export class LoginData extends DomainEntity implements ILoginDa return Result.ok(new this(props)); } - static createFromPrimitives(props: { - email: string; - plainPassword: string; - tabId: string; - }): Result { - const { email, plainPassword, tabId } = props; + static createFromPrimitives(values: ILoginDataPrimitives): Result { + const { email, plainPassword, tabId } = values; const emailOrError = EmailAddress.create(email); const plainPasswordOrError = PlainPassword.create(plainPassword); - const tabIdOrError = UniqueID.create(tabId); + const tabIdOrError = UniqueID.create(tabId, false); const result = Result.combine([emailOrError, plainPasswordOrError, tabIdOrError]); diff --git a/apps/server/src/contexts/auth/domain/entities/logout-data.ts b/apps/server/src/contexts/auth/domain/entities/logout-data.ts index 836e4b3f..50db80b3 100644 --- a/apps/server/src/contexts/auth/domain/entities/logout-data.ts +++ b/apps/server/src/contexts/auth/domain/entities/logout-data.ts @@ -6,6 +6,11 @@ export interface ILogoutDataProps { tabId: UniqueID; } +export interface ILogoutDataPrimitives { + email: string; + tabId: string; +} + export interface ILogoutData { email: EmailAddress; tabId: UniqueID; @@ -16,10 +21,10 @@ export class LogoutData extends DomainEntity implements ILogou return Result.ok(new this(props)); } - static createFromPrimitives(props: { email: string; tabId: string }): Result { - const { email, tabId } = props; + static createFromPrimitives(values: ILogoutDataPrimitives): Result { + const { email, tabId } = values; const emailOrError = EmailAddress.create(email); - const tabIdOrError = UniqueID.create(tabId); + const tabIdOrError = UniqueID.create(tabId, false); const result = Result.combine([emailOrError, tabIdOrError]); diff --git a/apps/server/src/contexts/auth/domain/entities/register-data.ts b/apps/server/src/contexts/auth/domain/entities/register-data.ts index ea789a74..973ee196 100644 --- a/apps/server/src/contexts/auth/domain/entities/register-data.ts +++ b/apps/server/src/contexts/auth/domain/entities/register-data.ts @@ -7,6 +7,12 @@ export interface IRegisterDataProps { hashPassword: HashPassword; } +export interface IRegisterDataPrimitives { + username: string; + email: string; + plainPassword: string; +} + export interface IRegisterData { username: Username; email: EmailAddress; @@ -18,11 +24,7 @@ export class RegisterData extends DomainEntity implements IR return Result.ok(new this(props)); } - static createFromPrimitives(props: { - username: string; - email: string; - plainPassword: string; - }): Result { + static createFromPrimitives(props: IRegisterDataPrimitives): Result { const { username, email, plainPassword } = props; const userNameOrError = Username.create(username); diff --git a/apps/server/src/contexts/auth/domain/entities/tab-context.ts b/apps/server/src/contexts/auth/domain/entities/tab-context.ts index 3fb5074d..30454902 100644 --- a/apps/server/src/contexts/auth/domain/entities/tab-context.ts +++ b/apps/server/src/contexts/auth/domain/entities/tab-context.ts @@ -5,6 +5,12 @@ export interface ITabContextProps { userId: UniqueID; } +export interface ITabContextPrimitives { + id: string; + tab_id: string; + user_id: string; +} + export interface ITabContext { tabId: UniqueID; userId: UniqueID; @@ -17,6 +23,23 @@ export class TabContext extends DomainEntity implements ITabCo return Result.ok(new this(props, id)); } + static createFromPrimitives(values: ITabContextPrimitives): Result { + const { user_id, tab_id } = values; + const userIdOrError = UniqueID.create(user_id, false); + const tabIdOrError = UniqueID.create(tab_id, false); + + const result = Result.combine([userIdOrError, tabIdOrError]); + + if (result.isFailure) { + return Result.fail(result.error); + } + + return TabContext.create({ + userId: userIdOrError.data, + tabId: tabIdOrError.data, + }); + } + get tabId(): UniqueID { return this._props.tabId; } @@ -25,10 +48,7 @@ export class TabContext extends DomainEntity implements ITabCo return this._props.userId; } - /** - * 🔹 Devuelve una representación lista para persistencia - */ - toPersistenceData(): any { + toPersistenceData(): ITabContextPrimitives { return { id: this._id.toString(), tab_id: this.tabId.toString(), diff --git a/apps/server/src/contexts/auth/domain/repositories/authenticated-user-repository.interface.ts b/apps/server/src/contexts/auth/domain/repositories/authenticated-user-repository.interface.ts index 4cea2fb8..7f591861 100644 --- a/apps/server/src/contexts/auth/domain/repositories/authenticated-user-repository.interface.ts +++ b/apps/server/src/contexts/auth/domain/repositories/authenticated-user-repository.interface.ts @@ -1,9 +1,13 @@ import { Result } from "@common/domain"; import { AuthenticatedUser } from "../aggregates"; -import { EmailAddress } from "../value-objects"; +import { EmailAddress, Username } from "../value-objects"; export interface IAuthenticatedUserRepository { getUserByEmail(email: EmailAddress, transaction?: any): Promise>; - userExists(email: EmailAddress, transaction?: any): Promise>; + userExists( + username: Username, + email: EmailAddress, + transaction?: any + ): Promise>; createUser(user: AuthenticatedUser, transaction?: any): Promise>; } diff --git a/apps/server/src/contexts/auth/domain/services/auth-service.interface.ts b/apps/server/src/contexts/auth/domain/services/auth-service.interface.ts index 6fd99665..b4431aa5 100644 --- a/apps/server/src/contexts/auth/domain/services/auth-service.interface.ts +++ b/apps/server/src/contexts/auth/domain/services/auth-service.interface.ts @@ -2,13 +2,13 @@ import { Result } from "@common/domain"; import { AuthenticatedUser, EmailAddress, + IJWTPayload, LoginData, LogoutData, RegisterData, TabContext, Token, } from ".."; -import { IJWTPayload } from "../../infraestructure"; export interface IAuthService { generateAccessToken(payload: IJWTPayload): Result; diff --git a/apps/server/src/contexts/auth/domain/services/auth.service.ts b/apps/server/src/contexts/auth/domain/services/auth.service.ts index d210f6ae..17203949 100644 --- a/apps/server/src/contexts/auth/domain/services/auth.service.ts +++ b/apps/server/src/contexts/auth/domain/services/auth.service.ts @@ -3,13 +3,14 @@ import { AuthenticatedUser, EmailAddress, IAuthenticatedUserRepository, + IJWTPayload, + JWTPayload, LoginData, RegisterData, TabContext, Token, } from ".."; import { JwtHelper } from "../../infraestructure/passport/jwt.helper"; -import { IJWTPayload } from "../../infraestructure/passport/passport-auth-provider"; import { ITabContextRepository } from "../repositories/tab-context-repository.interface"; import { IAuthService } from "./auth-service.interface"; @@ -23,11 +24,13 @@ export class AuthService implements IAuthService { ) {} generateAccessToken(payload: IJWTPayload): Result { - return Token.create(JwtHelper.generateToken(payload, ACCESS_EXPIRATION)); + const data = payload.toPersistenceData(); + return Token.create(JwtHelper.generateToken(data, ACCESS_EXPIRATION)); } generateRefreshToken(payload: IJWTPayload): Result { - return Token.create(JwtHelper.generateToken(payload, REFRESH_EXPIRATION)); + const data = payload.toPersistenceData(); + return Token.create(JwtHelper.generateToken(data, REFRESH_EXPIRATION)); } verifyRefreshToken(token: Token): IJWTPayload { @@ -45,7 +48,7 @@ export class AuthService implements IAuthService { const { username, email, hashPassword } = registerData; // Verificar si el usuario ya existe - const userExists = await this.authUserRepo.userExists(email, transaction); + const userExists = await this.authUserRepo.userExists(username, email, transaction); if (userExists.isSuccess && userExists.data) { return Result.fail(new Error("Email is already registered")); } @@ -95,6 +98,7 @@ export class AuthService implements IAuthService { Error > > { + let result: any; const { email, plainPassword, tabId } = loginData; // Verificar que el tab ID está definido @@ -103,12 +107,12 @@ export class AuthService implements IAuthService { } // 🔹 Verificar si el usuario existe en la base de datos - const userResult = await this.authUserRepo.getUserByEmail(email, transaction); - if (userResult.isFailure) { + result = await this.authUserRepo.getUserByEmail(email, transaction); + if (result.isFailure) { return Result.fail(new Error("Invalid email or password")); } - const user = userResult.data; + const user = result.data; // 🔹 Verificar que la contraseña sea correcta const isValidPassword = await user.verifyPassword(plainPassword); @@ -122,30 +126,26 @@ export class AuthService implements IAuthService { tabId: tabId, }); - if (contextOrError.isFailure) { - return Result.fail(new Error("Error creating user context")); + // 🔹 Generar Access Token y Refresh Token + const payloadOrError = JWTPayload.create({ + userId: user.id, + email: email, + tabId: tabId, + //roles: ["USER"], + }); + + result = Result.combine([contextOrError, payloadOrError]); + if (result.isFailure) { + return Result.fail(new Error("Error on login")); } const tabContext = contextOrError.data; - await this.tabContextRepo.registerContextByTabId(tabContext, transaction); - // 🔹 Generar Access Token y Refresh Token - const accessTokenOrError = this.generateAccessToken({ - user_id: user.id.toString(), - email: email.toString(), - tab_id: tabId.toString(), - roles: ["USER"], - }); + const accessTokenOrError = this.generateAccessToken(payloadOrError.data); + const refreshTokenOrError = this.generateRefreshToken(payloadOrError.data); - const refreshTokenOrError = this.generateRefreshToken({ - user_id: user.id.toString(), - email: email.toString(), - tab_id: tabId.toString(), - roles: ["USER"], - }); - - const result = Result.combine([accessTokenOrError, refreshTokenOrError]); + result = Result.combine([accessTokenOrError, refreshTokenOrError]); if (result.isFailure) { return Result.fail(result.error); diff --git a/apps/server/src/contexts/auth/domain/services/tab-context-service.interface.ts b/apps/server/src/contexts/auth/domain/services/tab-context-service.interface.ts index aabc7c29..e8a8cc73 100644 --- a/apps/server/src/contexts/auth/domain/services/tab-context-service.interface.ts +++ b/apps/server/src/contexts/auth/domain/services/tab-context-service.interface.ts @@ -2,7 +2,7 @@ import { Result, UniqueID } from "@common/domain"; import { TabContext } from "../entities"; export interface ITabContextService { - getContextByTabId(tabId: UniqueID): Promise>; + getContextByTabId(tabId: UniqueID, transaction?: any): Promise>; createContext( params: { tabId: UniqueID; userId: UniqueID }, transaction?: any diff --git a/apps/server/src/contexts/auth/domain/value-objects/email-address.ts b/apps/server/src/contexts/auth/domain/value-objects/email-address.ts index def02d55..b893327a 100644 --- a/apps/server/src/contexts/auth/domain/value-objects/email-address.ts +++ b/apps/server/src/contexts/auth/domain/value-objects/email-address.ts @@ -1,10 +1,12 @@ import { Result, ValueObject } from "@common/domain"; +import { logger } from "@common/infrastructure/logger"; import { z } from "zod"; export const NULLED_EMAIL_ADDRESS = null; export class EmailAddress extends ValueObject { static create(email: string | null): Result { + logger.debug(`Creating EmailAddress from ${email}`); const normalizedEmail = email?.trim() === "" ? NULLED_EMAIL_ADDRESS : email?.toLowerCase() || NULLED_EMAIL_ADDRESS; diff --git a/apps/server/src/contexts/auth/domain/value-objects/token.ts b/apps/server/src/contexts/auth/domain/value-objects/token.ts index 1b18a793..47f634fb 100644 --- a/apps/server/src/contexts/auth/domain/value-objects/token.ts +++ b/apps/server/src/contexts/auth/domain/value-objects/token.ts @@ -13,7 +13,7 @@ export class Token extends ValueObject { } private static validate(token: string) { - const schema = z.string().min(319, { message: "Invalid token string" }); + const schema = z.string().min(1, { message: "Invalid token string" }); return schema.safeParse(token); } } diff --git a/apps/server/src/contexts/auth/infraestructure/express/types.ts b/apps/server/src/contexts/auth/infraestructure/express/types.ts new file mode 100644 index 00000000..a611c231 --- /dev/null +++ b/apps/server/src/contexts/auth/infraestructure/express/types.ts @@ -0,0 +1,10 @@ +import { AuthenticatedUser, TabContext } from "@contexts/auth/domain"; +import { Request } from "express"; + +export interface TabContextRequest extends Request { + tabContext?: TabContext; +} + +export interface AuthenticatedRequest extends Request { + user?: AuthenticatedUser; +} diff --git a/apps/server/src/contexts/auth/infraestructure/middleware/passport-auth.middleware.ts b/apps/server/src/contexts/auth/infraestructure/middleware/passport-auth.middleware.ts index a9b6317d..0fc1011a 100644 --- a/apps/server/src/contexts/auth/infraestructure/middleware/passport-auth.middleware.ts +++ b/apps/server/src/contexts/auth/infraestructure/middleware/passport-auth.middleware.ts @@ -1,19 +1,16 @@ import { UniqueID } from "@common/domain"; import { ApiError, ExpressController } from "@common/presentation"; import { AuthenticatedUser } from "@contexts/auth/domain"; -import { authProvider } from "@contexts/auth/infraestructure"; -import { NextFunction, Request, Response } from "express"; - -// Extender el Request de Express para incluir el usuario autenticado optionalmente -interface AuthenticatedRequest extends Request { - user?: AuthenticatedUser; -} +//import { authProvider } from "@contexts/auth/infraestructure"; +import { NextFunction, Response } from "express"; +import { AuthenticatedRequest } from "../express/types"; +import { authProvider } from "../passport"; // Comprueba el rol del usuario const _authorizeUser = (condition: (user: AuthenticatedUser) => boolean) => { return (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - console.log(req.user); const user = req.user as AuthenticatedUser; + if (!user || !condition(user)) { return ExpressController.errorResponse( new ApiError({ @@ -25,16 +22,21 @@ const _authorizeUser = (condition: (user: AuthenticatedUser) => boolean) => { ); } - //setAuthContext(req, res, user); return next(); }; }; // Verifica que el usuario esté autenticado -export const checkUser = [authProvider.authenticateJWT(), _authorizeUser((user) => user.isUser)]; +export const checkUser = [ + authProvider.authenticateJWT(), + _authorizeUser((user) => true /*user.isUser*/), +]; // Verifica que el usuario sea administrador -export const checkUserIsAdmin = [_authorizeUser((user) => user.isAdmin)]; +export const checkUserIsAdmin = [ + authProvider.authenticateJWT(), + _authorizeUser((user) => user.isAdmin), +]; // Middleware para verificar que el usuario sea administrador o el dueño de los datos (self) export const checkUserIsAdminOrOwner = [ diff --git a/apps/server/src/contexts/auth/infraestructure/middleware/tab-context.middleware.ts b/apps/server/src/contexts/auth/infraestructure/middleware/tab-context.middleware.ts index 23b2b0a1..9de9cfee 100644 --- a/apps/server/src/contexts/auth/infraestructure/middleware/tab-context.middleware.ts +++ b/apps/server/src/contexts/auth/infraestructure/middleware/tab-context.middleware.ts @@ -1,59 +1,3 @@ -import { UniqueID } from "@common/domain"; -import { ApiError, ExpressController } from "@common/presentation"; -import { TabContext } from "@contexts/auth/domain"; -import { NextFunction, Request, Response } from "express"; -import httpStatus from "http-status"; +import { authProvider } from "../passport"; -// Extender el Request de Express para incluir el usuario autenticado optionalmente -interface TabContextRequest extends Request { - tabContext?: TabContext; -} - -export const validateTabContextHeader = async ( - req: TabContextRequest, - res: Response, - next: NextFunction -) => { - const tabId = String(req.headers["x-tab-id"]); - if (!tabId) { - return ExpressController.errorResponse( - new ApiError({ - status: 401, - title: httpStatus["401"], - name: httpStatus["401_NAME"], - detail: "Tab ID is required", - }), - res - ); - } - - const tabIdOrError = UniqueID.create(tabId, false); - if (tabIdOrError.isFailure) { - return ExpressController.errorResponse( - new ApiError({ - status: 422, - title: httpStatus["422"], - name: httpStatus["422_NAME"], - detail: "Invalid Tab ID", - }), - res - ); - } - /*const contextOrError = await createTabContextService().getContextByTabId(tabIdOrError.data); - if (contextOrError.isFailure) { - return ExpressController.errorResponse( - new ApiError({ - status: 401, - title: httpStatus["401"], - name: httpStatus["401_NAME"], - detail: "Invalid or expired Tab ID", - }), - res - ); - } - - const context = contextOrError.data; - - req.tabContext = context;*/ - next(); -}; +export const checkTabContext = [authProvider.authenticateTabId()]; diff --git a/apps/server/src/contexts/auth/infraestructure/passport/index.ts b/apps/server/src/contexts/auth/infraestructure/passport/index.ts index 61f318ef..fb296c3f 100644 --- a/apps/server/src/contexts/auth/infraestructure/passport/index.ts +++ b/apps/server/src/contexts/auth/infraestructure/passport/index.ts @@ -1,11 +1,11 @@ import { SequelizeTransactionManager } from "@common/infrastructure"; import { AuthService, TabContextService } from "@contexts/auth/domain/services"; import { authenticatedUserRepository, tabContextRepository } from "../sequelize"; -import { IJWTPayload, PassportAuthProvider } from "./passport-auth-provider"; +import { PassportAuthProvider } from "./passport-auth-provider"; const transactionManager = new SequelizeTransactionManager(); const authService = new AuthService(authenticatedUserRepository, tabContextRepository); const tabContextService = new TabContextService(tabContextRepository); const authProvider = new PassportAuthProvider(authService, tabContextService, transactionManager); -export { authProvider, IJWTPayload }; +export { authProvider }; diff --git a/apps/server/src/contexts/auth/infraestructure/passport/passport-auth-provider.ts b/apps/server/src/contexts/auth/infraestructure/passport/passport-auth-provider.ts index f18e0ba9..68cc3760 100644 --- a/apps/server/src/contexts/auth/infraestructure/passport/passport-auth-provider.ts +++ b/apps/server/src/contexts/auth/infraestructure/passport/passport-auth-provider.ts @@ -1,59 +1,38 @@ +import { NextFunction, Response } from "express"; + import { Result, UniqueID } from "@common/domain"; import { ITransactionManager } from "@common/infrastructure/database"; -import { AuthenticatedUser, EmailAddress, PlainPassword } from "@contexts/auth/domain"; +import { logger } from "@common/infrastructure/logger"; +import { EmailAddress, TabContext } from "@contexts/auth/domain"; import { IAuthService, ITabContextService } from "@contexts/auth/domain/services"; import passport from "passport"; import { ExtractJwt, Strategy as JwtStrategy } from "passport-jwt"; -import { Strategy as LocalStrategy } from "passport-local"; +import { TabContextRequest } from "../express/types"; const SECRET_KEY = process.env.JWT_SECRET || "supersecretkey"; -export interface IJWTPayload { - user_id: string; - email: string; - tab_id: string; - roles: string[]; -} - export class PassportAuthProvider { - private async _getUserByEmailAndPassword( - email: string, - password: string - ): Promise> { - const emailVO = EmailAddress.create(email); - if (emailVO.isFailure) { - return Result.fail(emailVO.error); + private async _getContextByTabId(value: string): Promise> { + const tabIdOrError = UniqueID.create(value, false); + if (tabIdOrError.isFailure) { + return Result.fail(new Error("Invalid tab ID")); } - const plainPasswordVO = PlainPassword.create(password); - if (plainPasswordVO.isFailure) { - return Result.fail(plainPasswordVO.error); + const tabResult = await this.tabContextService.getContextByTabId(tabIdOrError.data); + if (tabResult.isFailure) { + return Result.fail(new Error("Invalid token data")); } - const userResult = await this.authService.getUserByEmail(emailVO.data); - - if (userResult.isFailure || !userResult.data) { - return Result.fail(new Error("Invalid email or password")); - } - - const user = userResult.data; - const isValidPassword = await user.verifyPassword(plainPasswordVO.data); - - if (!isValidPassword) { - return Result.fail(new Error("Invalid email or password")); - } - - return Result.ok(user); + return Result.ok(tabResult.data); } - private async _getUserAndContextByToken(token: IJWTPayload) { - const { user_id, email, roles, tab_id } = token; + private async _getUserByToken(tokenPayload: any) { + const { user_id, email, roles } = tokenPayload; const userIdVO = UniqueID.create(user_id); - const tabIdVO = UniqueID.create(tab_id); const emailVO = EmailAddress.create(email!); - const okOrError = Result.combine([userIdVO, tabIdVO, emailVO]); + const okOrError = Result.combine([userIdVO, emailVO]); if (okOrError.isFailure) { return Result.fail(okOrError.error.message); } @@ -67,23 +46,13 @@ export class PassportAuthProvider { const user = userResult.data; const checkUserId = user.id.equals(userIdVO.data); - const checkRoles = user.hasRoles(roles); + const checkRoles = true; //user.hasRoles(roles); if (!checkUserId || !checkRoles) { return Result.fail(new Error("Invalid token data")); } - const tabResult = await this.tabContextService.getContextByTabId(tabIdVO.data); - if (tabResult.isFailure) { - return Result.fail(new Error("Invalid token data")); - } - - const tabContext = tabResult.data; - - return Result.ok({ - user, - tabContext, - }); + return Result.ok(user); } constructor( @@ -105,37 +74,41 @@ export class PassportAuthProvider { "jwt", new JwtStrategy(jwtOptions, async (tokenPayload, done) => { try { - const userOrError = await this._getUserAndContextByToken(tokenPayload); - return userOrError.isSuccess - ? done(null, userOrError.data) - : done(userOrError.error, false, { message: "Invalid JWT data" }); + const userOrError = await this._getUserByToken(tokenPayload); + if (userOrError.isFailure) { + return done(userOrError.error, false, { message: "Invalid JWT data" }); + } + + return done(null, userOrError.data); } catch (error) { return done(error, false); } }) ); - passport.use( - "email", - new LocalStrategy( - { usernameField: "email", passwordField: "password" }, - async (email, password, done) => { - try { - const userOrError = await this._getUserByEmailAndPassword(email, password); - return userOrError.isSuccess - ? done(null, userOrError.data) - : done(userOrError.error, false, { message: "Invalid email or password" }); - } catch (error) { - return done(error, false); - } - } - ) - ); - passport.initialize(); } authenticateJWT() { + logger.debug("Authenticating JWT"); return passport.authenticate("jwt", { session: false }); } + + authenticateTabId() { + logger.debug("Authenticating Tab ID"); + return async (req: TabContextRequest, res: Response, next: NextFunction) => { + const tabIdValue = req.header("X-Tab-ID"); + if (!tabIdValue) { + return res.status(401).json({ message: "Tab ID is required" }); + } + + const tabContextOrError = await this._getContextByTabId(tabIdValue); + if (tabContextOrError.isFailure) { + return res.status(401).json({ message: "Invalid tab context data" }); + } + + req.tabContext = tabContextOrError.data; + return next(); + }; + } } diff --git a/apps/server/src/contexts/auth/infraestructure/sequelize/authenticated-user.repository.ts b/apps/server/src/contexts/auth/infraestructure/sequelize/authenticated-user.repository.ts index 94765e4f..fcbc508c 100644 --- a/apps/server/src/contexts/auth/infraestructure/sequelize/authenticated-user.repository.ts +++ b/apps/server/src/contexts/auth/infraestructure/sequelize/authenticated-user.repository.ts @@ -4,6 +4,7 @@ import { AuthenticatedUser, EmailAddress, IAuthenticatedUserRepository, + Username, } from "@contexts/auth/domain"; import { Transaction } from "sequelize"; import { authenticatedUserMapper, IAuthenticatedUserMapper } from "../mappers"; @@ -20,7 +21,7 @@ class AuthenticatedUserRepository */ private _customErrorMapper(error: Error): string | null { if (error.name === "SequelizeUniqueConstraintError") { - return "User with this email already exists"; + return "User with this email or username already exists"; } return null; @@ -32,18 +33,26 @@ class AuthenticatedUserRepository } async userExists( + username: Username, email: EmailAddress, transaction?: Transaction ): Promise> { try { - const rawUser: any = await this._findById( + const userWithEmail = await this._findById( AuthUserModel, "email", email.toString(), transaction ); - return Result.ok(Boolean(rawUser)); + const userWithUsername = await this._findById( + AuthUserModel, + "username", + username.toString(), + transaction + ); + + return Result.ok(Boolean(userWithEmail || userWithUsername)); } catch (error: any) { return this._handleDatabaseError(error, this._customErrorMapper); } diff --git a/apps/server/src/contexts/auth/infraestructure/sequelize/user.repository.ts b/apps/server/src/contexts/auth/infraestructure/sequelize/user.repository.ts index 5823e679..d471cc2d 100644 --- a/apps/server/src/contexts/auth/infraestructure/sequelize/user.repository.ts +++ b/apps/server/src/contexts/auth/infraestructure/sequelize/user.repository.ts @@ -13,7 +13,7 @@ class UserRepository extends SequelizeRepository implements IUserRepositor */ private _customErrorMapper(error: Error): string | null { if (error.name === "SequelizeUniqueConstraintError") { - return "User with this email already exists"; + return "User with this email or username already exists"; } return null; diff --git a/apps/server/src/contexts/auth/presentation/controllers/login/login.presenter.ts b/apps/server/src/contexts/auth/presentation/controllers/login/login.presenter.ts index d6bd1a39..1dc1e766 100644 --- a/apps/server/src/contexts/auth/presentation/controllers/login/login.presenter.ts +++ b/apps/server/src/contexts/auth/presentation/controllers/login/login.presenter.ts @@ -1,4 +1,4 @@ -import { AuthenticatedUser, TabContext } from "@contexts/auth/domain"; +import { AuthenticatedUser, TabContext, Token } from "@contexts/auth/domain"; import { ILoginUserResponseDTO } from "../../dto"; export interface ILoginPresenter { @@ -6,8 +6,8 @@ export interface ILoginPresenter { user: AuthenticatedUser; tabContext: TabContext; tokens: { - accessToken: string; - refreshToken: string; + accessToken: Token; + refreshToken: Token; }; }) => ILoginUserResponseDTO; } @@ -17,8 +17,8 @@ export const loginPresenter: ILoginPresenter = { user: AuthenticatedUser; tabContext: TabContext; tokens: { - accessToken: string; - refreshToken: string; + accessToken: Token; + refreshToken: Token; }; }): ILoginUserResponseDTO => { const { diff --git a/apps/server/src/contexts/auth/presentation/controllers/logout/logout.controller.ts b/apps/server/src/contexts/auth/presentation/controllers/logout/logout.controller.ts index 335a6e34..79cc1bad 100644 --- a/apps/server/src/contexts/auth/presentation/controllers/logout/logout.controller.ts +++ b/apps/server/src/contexts/auth/presentation/controllers/logout/logout.controller.ts @@ -1,6 +1,6 @@ import { ExpressController } from "@common/presentation"; import { LogoutUseCase } from "@contexts/auth/application/logout"; -import { LogoutData } from "@contexts/auth/domain"; +import { AuthenticatedUser, LogoutData, TabContext } from "@contexts/auth/domain"; export class LogoutController extends ExpressController { public constructor(private readonly logout: LogoutUseCase) { @@ -8,9 +8,12 @@ export class LogoutController extends ExpressController { } async executeImpl() { - const logoutDataOrError = LogoutData.createFromPrimitives({ - email: this.req.body.email, - tabId: String(this.req.headers["x-tab-id"]), + const user = this.req.user as AuthenticatedUser; + const tabContext = this.req.tabContext as TabContext; + + const logoutDataOrError = LogoutData.create({ + email: user.email, + tabId: tabContext.tabId, }); if (logoutDataOrError.isFailure) { @@ -23,6 +26,8 @@ export class LogoutController extends ExpressController { return this.handleError(logoutOrError.error); } + // Habría que invalidar el token del cliente + return this.ok(); } diff --git a/apps/server/src/contexts/auth/presentation/controllers/refreshToken/index.ts b/apps/server/src/contexts/auth/presentation/controllers/refreshToken/index.ts index 886c11e8..1ca699c9 100644 --- a/apps/server/src/contexts/auth/presentation/controllers/refreshToken/index.ts +++ b/apps/server/src/contexts/auth/presentation/controllers/refreshToken/index.ts @@ -1,4 +1,5 @@ import { SequelizeTransactionManager } from "@common/infrastructure"; +import { RefreshTokenUseCase } from "@contexts/auth/application"; import { AuthService } from "@contexts/auth/domain/services"; import { authenticatedUserRepository, tabContextRepository } from "@contexts/auth/infraestructure"; import { RefreshTokenController } from "./refresh-token.controller"; diff --git a/apps/server/src/contexts/auth/presentation/controllers/refreshToken/refresh-token.controller.ts b/apps/server/src/contexts/auth/presentation/controllers/refreshToken/refresh-token.controller.ts index ac36e874..5c8347ae 100644 --- a/apps/server/src/contexts/auth/presentation/controllers/refreshToken/refresh-token.controller.ts +++ b/apps/server/src/contexts/auth/presentation/controllers/refreshToken/refresh-token.controller.ts @@ -19,7 +19,7 @@ export class RefreshTokenController extends ExpressController { return this.clientError("Invalid input data", refreshTokenOrError.error); } - const newRefreshTokenOrError = this.refreshToken.execute(refreshTokenOrError.data); + const newRefreshTokenOrError = await this.refreshToken.execute(refreshTokenOrError.data); if (newRefreshTokenOrError.isFailure) { return this.handleError(newRefreshTokenOrError.error); @@ -31,10 +31,6 @@ export class RefreshTokenController extends ExpressController { private handleError(error: Error) { const message = error.message; - if (message.includes("User with this email already exists")) { - return this.conflictError(message); - } - if ( message.includes("Database connection lost") || message.includes("Database request timed out") diff --git a/apps/server/src/contexts/auth/presentation/controllers/refreshToken/refresh-token.presenter.ts b/apps/server/src/contexts/auth/presentation/controllers/refreshToken/refresh-token.presenter.ts index 72bef456..bd14222b 100644 --- a/apps/server/src/contexts/auth/presentation/controllers/refreshToken/refresh-token.presenter.ts +++ b/apps/server/src/contexts/auth/presentation/controllers/refreshToken/refresh-token.presenter.ts @@ -2,13 +2,11 @@ import { Token } from "@contexts/auth/domain"; import { IRefreshTokenResponseDTO } from "../../dto"; export interface IRefreshTokenPresenter { - toDto: (data: { refreshToken: Token }) => IRefreshTokenResponseDTO; + toDto: (refreshToken: Token) => IRefreshTokenResponseDTO; } export const refreshTokenPresenter: IRefreshTokenPresenter = { - toDto: (data: { refreshToken: Token }): IRefreshTokenResponseDTO => { - const { refreshToken } = data; - + toDto: (refreshToken: Token): IRefreshTokenResponseDTO => { return { refresh_token: refreshToken.toString(), }; diff --git a/apps/server/src/contexts/auth/presentation/controllers/register/index.ts b/apps/server/src/contexts/auth/presentation/controllers/register/index.ts index c436ab0e..691099ca 100644 --- a/apps/server/src/contexts/auth/presentation/controllers/register/index.ts +++ b/apps/server/src/contexts/auth/presentation/controllers/register/index.ts @@ -1,5 +1,5 @@ import { SequelizeTransactionManager } from "@common/infrastructure"; -import { RefreshTokenUseCase } from "@contexts/auth/application/register"; +import { RegisterUseCase } from "@contexts/auth/application/register"; import { AuthService } from "@contexts/auth/domain/services"; import { authenticatedUserRepository, tabContextRepository } from "@contexts/auth/infraestructure"; import { RegisterController } from "./register.controller"; @@ -9,7 +9,7 @@ export const registerController = () => { const transactionManager = new SequelizeTransactionManager(); const authService = new AuthService(authenticatedUserRepository, tabContextRepository); - const useCase = new RefreshTokenUseCase(authService, transactionManager); + const useCase = new RegisterUseCase(authService, transactionManager); const presenter = registerPresenter; return new RegisterController(useCase, presenter); diff --git a/apps/server/src/contexts/auth/presentation/controllers/register/register.controller.ts b/apps/server/src/contexts/auth/presentation/controllers/register/register.controller.ts index 36518067..a0e865c6 100644 --- a/apps/server/src/contexts/auth/presentation/controllers/register/register.controller.ts +++ b/apps/server/src/contexts/auth/presentation/controllers/register/register.controller.ts @@ -1,11 +1,11 @@ import { ExpressController } from "@common/presentation"; -import { RefreshTokenUseCase } from "@contexts/auth/application/register"; +import { RegisterUseCase } from "@contexts/auth/application"; import { RegisterData } from "@contexts/auth/domain"; import { IRegisterPresenter } from "./register.presenter"; export class RegisterController extends ExpressController { public constructor( - private readonly register: RefreshTokenUseCase, + private readonly register: RegisterUseCase, private readonly presenter: IRegisterPresenter ) { super(); @@ -34,7 +34,7 @@ export class RegisterController extends ExpressController { private handleError(error: Error) { const message = error.message; - if (message.includes("User with this email already exists")) { + if (message.includes("User with this email or username already exists")) { return this.conflictError(message); } diff --git a/apps/server/src/routes/auth.routes.ts b/apps/server/src/routes/auth.routes.ts index 0609a89f..cc417fb8 100644 --- a/apps/server/src/routes/auth.routes.ts +++ b/apps/server/src/routes/auth.routes.ts @@ -1,8 +1,9 @@ import { validateRequestDTO } from "@common/presentation"; -import { checkUser, validateTabContextHeader } from "@contexts/auth/infraestructure"; +import { checkTabContext, checkUser } from "@contexts/auth/infraestructure"; import { loginController, logoutController, + refreshTokenController, registerController, } from "@contexts/auth/presentation/controllers"; import { @@ -50,7 +51,7 @@ export const authRouter = (appRouter: Router) => { authRoutes.post( "/login", validateRequestDTO(LoginUserSchema), - validateTabContextHeader, + checkTabContext, (req: Request, res: Response, next: NextFunction) => { loginController().execute(req, res, next); } @@ -69,7 +70,7 @@ export const authRouter = (appRouter: Router) => { */ authRoutes.post( "/logout", - validateTabContextHeader, + checkTabContext, checkUser, (req: Request, res: Response, next: NextFunction) => { logoutController().execute(req, res, next); @@ -79,6 +80,7 @@ export const authRouter = (appRouter: Router) => { authRoutes.post( "/refresh", validateRequestDTO(RefreshTokenSchema), + checkTabContext, (req: Request, res: Response, next: NextFunction) => { refreshTokenController().execute(req, res, next); } diff --git a/apps/server/src/routes/user.routes.ts b/apps/server/src/routes/user.routes.ts index c52be9de..c98778bc 100644 --- a/apps/server/src/routes/user.routes.ts +++ b/apps/server/src/routes/user.routes.ts @@ -1,21 +1,15 @@ import { validateRequestDTO } from "@common/presentation"; -import { createAuthProvider } from "@contexts/auth/infraestructure"; -import { - listUsersController, - ListUsersSchema, - validateTabContextHeader, -} from "@contexts/auth/presentation"; +import { listUsersController, ListUsersSchema } from "@contexts/auth/presentation"; import { NextFunction, Request, Response, Router } from "express"; export const userRouter = (appRouter: Router) => { const authRoutes: Router = Router({ mergeParams: true }); - const authProvider = createAuthProvider(); authRoutes.get( "/", validateRequestDTO(ListUsersSchema), - validateTabContextHeader, - authProvider.authenticateJWT(), + //validateTabContextHeader, + //authProvider.authenticateJWT(), //authProvider.checkIsAdmin(), async (req: Request, res: Response, next: NextFunction) => { listUsersController().execute(req, res, next); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d89d0ddd..4b0ee3d2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -275,6 +275,24 @@ importers: specifier: ^8.21.0 version: 8.22.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3) + packages/rdx-criteria: + devDependencies: + '@changesets/cli': + specifier: ^2.27.5 + version: 2.27.12 + '@types/node': + specifier: ^22.10.7 + version: 22.12.0 + eslint-config-codely: + specifier: ^3.1.4 + version: 3.1.4 + tsx: + specifier: ^4.13.2 + version: 4.19.2 + typescript: + specifier: ^5.7.3 + version: 5.7.3 + packages/shared: {} packages/typescript-config: {} @@ -347,6 +365,13 @@ packages: resolution: {integrity: sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==} engines: {node: '>=6.9.0'} + '@babel/eslint-parser@7.26.8': + resolution: {integrity: sha512-3tBctaHRW6xSub26z7n8uyOTwwUsCdvIug/oxBH9n6yCO5hMj2vwDJAo7RbBMKrM7P+W2j61zLKviJQFGOYKMg==} + engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} + peerDependencies: + '@babel/core': ^7.11.0 + eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 + '@babel/generator@7.26.5': resolution: {integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==} engines: {node: '>=6.9.0'} @@ -493,6 +518,10 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/runtime@7.26.9': + resolution: {integrity: sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==} + engines: {node: '>=6.9.0'} + '@babel/template@7.25.9': resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} engines: {node: '>=6.9.0'} @@ -508,6 +537,61 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@changesets/apply-release-plan@7.0.8': + resolution: {integrity: sha512-qjMUj4DYQ1Z6qHawsn7S71SujrExJ+nceyKKyI9iB+M5p9lCL55afuEd6uLBPRpLGWQwkwvWegDHtwHJb1UjpA==} + + '@changesets/assemble-release-plan@6.0.5': + resolution: {integrity: sha512-IgvBWLNKZd6k4t72MBTBK3nkygi0j3t3zdC1zrfusYo0KpdsvnDjrMM9vPnTCLCMlfNs55jRL4gIMybxa64FCQ==} + + '@changesets/changelog-git@0.2.0': + resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} + + '@changesets/cli@2.27.12': + resolution: {integrity: sha512-9o3fOfHYOvBnyEn0mcahB7wzaA3P4bGJf8PNqGit5PKaMEFdsRixik+txkrJWd2VX+O6wRFXpxQL8j/1ANKE9g==} + hasBin: true + + '@changesets/config@3.0.5': + resolution: {integrity: sha512-QyXLSSd10GquX7hY0Mt4yQFMEeqnO5z/XLpbIr4PAkNNoQNKwDyiSrx4yd749WddusH1v3OSiA0NRAYmH/APpQ==} + + '@changesets/errors@0.2.0': + resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + + '@changesets/get-dependents-graph@2.1.2': + resolution: {integrity: sha512-sgcHRkiBY9i4zWYBwlVyAjEM9sAzs4wYVwJUdnbDLnVG3QwAaia1Mk5P8M7kraTOZN+vBET7n8KyB0YXCbFRLQ==} + + '@changesets/get-release-plan@4.0.6': + resolution: {integrity: sha512-FHRwBkY7Eili04Y5YMOZb0ezQzKikTka4wL753vfUA5COSebt7KThqiuCN9BewE4/qFGgF/5t3AuzXx1/UAY4w==} + + '@changesets/get-version-range-type@0.4.0': + resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} + + '@changesets/git@3.0.2': + resolution: {integrity: sha512-r1/Kju9Y8OxRRdvna+nxpQIsMsRQn9dhhAZt94FLDeu0Hij2hnOozW8iqnHBgvu+KdnJppCveQwK4odwfw/aWQ==} + + '@changesets/logger@0.1.1': + resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} + + '@changesets/parse@0.4.0': + resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} + + '@changesets/pre@2.0.1': + resolution: {integrity: sha512-vvBJ/If4jKM4tPz9JdY2kGOgWmCowUYOi5Ycv8dyLnEE8FgpYYUo1mgJZxcdtGGP3aG8rAQulGLyyXGSLkIMTQ==} + + '@changesets/read@0.6.2': + resolution: {integrity: sha512-wjfQpJvryY3zD61p8jR87mJdyx2FIhEcdXhKUqkja87toMrP/3jtg/Yg29upN+N4Ckf525/uvV7a4tzBlpk6gg==} + + '@changesets/should-skip-package@0.1.1': + resolution: {integrity: sha512-H9LjLbF6mMHLtJIc/eHR9Na+MifJ3VxtgP/Y+XLn4BF7tDTEN1HNYtH6QMcjP1uxp9sjaFYmW8xqloaCi/ckTg==} + + '@changesets/types@4.1.0': + resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} + + '@changesets/types@6.0.0': + resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} + + '@changesets/write@0.3.2': + resolution: {integrity: sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==} + '@colors/colors@1.6.0': resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} engines: {node: '>=0.1.90'} @@ -831,10 +915,18 @@ packages: resolution: {integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/eslintrc@3.2.0': resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@8.57.1': + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/js@9.19.0': resolution: {integrity: sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -855,10 +947,19 @@ packages: resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} engines: {node: '>=18.18.0'} + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + '@humanwhocodes/retry@0.3.1': resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} @@ -966,6 +1067,12 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@manypkg/find-root@1.1.0': + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + + '@manypkg/get-packages@1.1.3': + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + '@mapbox/node-pre-gyp@1.0.11': resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} hasBin: true @@ -973,6 +1080,9 @@ packages: '@next/eslint-plugin-next@15.1.6': resolution: {integrity: sha512-+slMxhTgILUntZDGNgsKEYHUvpn72WP1YTlkmEhS51vnVd7S9jEEy0n9YAMcI21vUG4akTw9voWH02lrClt/yw==} + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': + resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1208,6 +1318,12 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + + '@types/node@20.17.19': + resolution: {integrity: sha512-LEwC7o1ifqg/6r2gn9Dns0f1rhK+fPFDoMiceTJ6kWmVk6bgXBI/9IOWfVan4WiAavK9pIVWdX0/e3J+eEUh5A==} + '@types/node@22.12.0': resolution: {integrity: sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==} @@ -1276,6 +1392,17 @@ packages: '@types/yargs@17.0.33': resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + '@typescript-eslint/eslint-plugin@7.18.0': + resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@typescript-eslint/eslint-plugin@8.22.0': resolution: {integrity: sha512-4Uta6REnz/xEJMvwf72wdUnC3rr4jAQf5jnTkeRQ9b6soxLxhDEbS/pfMPoJLDfFPNVRdryqWUIV/2GZzDJFZw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1284,6 +1411,16 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' + '@typescript-eslint/parser@7.18.0': + resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@typescript-eslint/parser@8.22.0': resolution: {integrity: sha512-MqtmbdNEdoNxTPzpWiWnqNac54h8JDAmkWtJExBVVnSrSmi9z+sZUt0LfKqk9rjqmKOIeRhO4fHHJ1nQIjduIQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1295,10 +1432,24 @@ packages: resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/scope-manager@7.18.0': + resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} + engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/scope-manager@8.22.0': resolution: {integrity: sha512-/lwVV0UYgkj7wPSw0o8URy6YI64QmcOdwHuGuxWIYznO6d45ER0wXUbksr9pYdViAofpUCNJx/tAzNukgvaaiQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/type-utils@7.18.0': + resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@typescript-eslint/type-utils@8.22.0': resolution: {integrity: sha512-NzE3aB62fDEaGjaAYZE4LH7I1MUwHooQ98Byq0G0y3kkibPJQIXVUspzlFOmOfHhiDLwKzMlWxaNv+/qcZurJA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1310,6 +1461,10 @@ packages: resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/types@7.18.0': + resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} + engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/types@8.22.0': resolution: {integrity: sha512-0S4M4baNzp612zwpD4YOieP3VowOARgK2EkN/GBn95hpyF8E2fbMT55sRHWBq+Huaqk3b3XK+rxxlM8sPgGM6A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1323,6 +1478,15 @@ packages: typescript: optional: true + '@typescript-eslint/typescript-estree@7.18.0': + resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@typescript-eslint/typescript-estree@8.22.0': resolution: {integrity: sha512-SJX99NAS2ugGOzpyhMza/tX+zDwjvwAtQFLsBo3GQxiGcvaKlqGBkmZ+Y1IdiSi9h4Q0Lr5ey+Cp9CGWNY/F/w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1335,6 +1499,12 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@typescript-eslint/utils@7.18.0': + resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + '@typescript-eslint/utils@8.22.0': resolution: {integrity: sha512-T8oc1MbF8L+Bk2msAvCUzjxVB2Z2f+vXYfcucE2wOmYs7ZUwco5Ep0fYZw8quNwOiw9K8GYVL+Kgc2pETNTLOg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1346,10 +1516,17 @@ packages: resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/visitor-keys@7.18.0': + resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} + engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/visitor-keys@8.22.0': resolution: {integrity: sha512-AWpYAXnUgvLNabGTy3uBylkgZoosva/miNd1I8Bz3SjotmQPbVqhO4Cczo8AsZ44XVErEBPr/CRSgaj8sG7g0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@vitejs/plugin-react@4.3.4': resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==} engines: {node: ^14.18.0 || >=16.0.0} @@ -1384,6 +1561,10 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} @@ -1528,6 +1709,10 @@ packages: resolution: {integrity: sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==} engines: {node: '>= 10.0.0'} + better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} + binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -1607,6 +1792,9 @@ packages: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -1797,6 +1985,10 @@ packages: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + detect-libc@2.0.3: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} @@ -1827,6 +2019,10 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dotenv@16.0.3: resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} engines: {node: '>=12'} @@ -1883,6 +2079,10 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} @@ -1942,6 +2142,9 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + eslint-config-codely@3.1.4: + resolution: {integrity: sha512-hX5CUj8Tsnclzr4glf4Pl2f8Y0r0dPhIOFmf863+zRTI0AUNIxuwfngy8shy4YiyMWMyuFEwEWpkumZ1mfFA7w==} + eslint-config-prettier@10.0.1: resolution: {integrity: sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw==} hasBin: true @@ -2046,6 +2249,11 @@ packages: peerDependencies: eslint: '>=5.0.0' + eslint-plugin-simple-import-sort@12.1.1: + resolution: {integrity: sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==} + peerDependencies: + eslint: '>=5.0.0' + eslint-plugin-sort-class-members@1.21.0: resolution: {integrity: sha512-QKV4jvGMu/ge1l4s1TUBC6rqqV/fbABWY7q2EeNpV3FRikoX6KuLhiNvS8UuMi+EERe0hKGrNU9e6ukFDxNnZQ==} engines: {node: '>=4.0.0'} @@ -2076,10 +2284,18 @@ packages: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@8.2.0: resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2088,6 +2304,12 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + eslint@9.19.0: resolution: {integrity: sha512-ug92j0LepKlbbEv6hD911THhoRHmbdXt2gX+VDABAW/Ir7D3nqKdv5Pf5vtlyY6HQMTEP2skXY43ueqTCWssEA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2102,6 +2324,10 @@ packages: resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} @@ -2147,6 +2373,13 @@ packages: resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} engines: {node: '>= 0.10.0'} + extendable-error@0.1.7: + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -2176,6 +2409,10 @@ packages: fecha@4.2.3: resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -2202,6 +2439,10 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@4.0.1: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} @@ -2231,6 +2472,14 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} @@ -2317,6 +2566,10 @@ packages: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} @@ -2399,6 +2652,9 @@ packages: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} + human-id@1.0.2: + resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} + human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -2531,6 +2787,10 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + is-property@1.0.2: resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} @@ -2554,6 +2814,10 @@ packages: resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} + is-subdir@1.2.0: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} + is-symbol@1.1.1: resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} engines: {node: '>= 0.4'} @@ -2574,6 +2838,10 @@ packages: resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -2790,6 +3058,9 @@ packages: engines: {node: '>=6'} hasBin: true + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + jsonwebtoken@9.0.2: resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} engines: {node: '>=12', npm: '>=6'} @@ -2864,6 +3135,9 @@ packages: lodash.once@4.1.1: resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -3014,6 +3288,10 @@ packages: moment@2.30.1: resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -3145,10 +3423,21 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + outdent@0.5.0: + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + own-keys@1.0.1: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} + p-filter@2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -3165,6 +3454,10 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -3172,6 +3465,9 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + package-manager-detector@0.2.9: + resolution: {integrity: sha512-+vYvA/Y31l8Zk8dwxHhL3JfTuHPm6tlxM2A3GeQyl7ovYnSp1+mzAxClxaOr0qO1TtPxbQxetI7v5XqKLJZk7Q==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -3249,6 +3545,10 @@ packages: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + pirates@4.0.6: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} @@ -3310,6 +3610,11 @@ packages: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + prettier@3.4.2: resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} engines: {node: '>=14'} @@ -3381,6 +3686,10 @@ packages: read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + read-yaml-file@1.1.0: + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} + readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -3396,6 +3705,9 @@ packages: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} @@ -3623,6 +3935,9 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + spawndamnit@3.0.1: + resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} + sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -3745,6 +4060,10 @@ packages: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} + term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} @@ -3752,6 +4071,9 @@ packages: text-hex@1.0.0: resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -3759,6 +4081,10 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} @@ -3788,6 +4114,12 @@ packages: resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} engines: {node: '>= 14.0.0'} + ts-api-utils@1.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + ts-api-utils@2.0.0: resolution: {integrity: sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==} engines: {node: '>=18.12'} @@ -3915,6 +4247,10 @@ packages: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} @@ -3963,9 +4299,16 @@ packages: undefsafe@2.0.5: resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + undici-types@6.20.0: resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} @@ -4200,6 +4543,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/eslint-parser@7.26.8(@babel/core@7.26.7)(eslint@8.57.1)': + dependencies: + '@babel/core': 7.26.7 + '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 + eslint: 8.57.1 + eslint-visitor-keys: 2.1.0 + semver: 6.3.1 + '@babel/generator@7.26.5': dependencies: '@babel/parser': 7.26.7 @@ -4344,6 +4695,10 @@ snapshots: '@babel/core': 7.26.7 '@babel/helper-plugin-utils': 7.26.5 + '@babel/runtime@7.26.9': + dependencies: + regenerator-runtime: 0.14.1 + '@babel/template@7.25.9': dependencies: '@babel/code-frame': 7.26.2 @@ -4369,6 +4724,148 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} + '@changesets/apply-release-plan@7.0.8': + dependencies: + '@changesets/config': 3.0.5 + '@changesets/get-version-range-type': 0.4.0 + '@changesets/git': 3.0.2 + '@changesets/should-skip-package': 0.1.1 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + detect-indent: 6.1.0 + fs-extra: 7.0.1 + lodash.startcase: 4.4.0 + outdent: 0.5.0 + prettier: 2.8.8 + resolve-from: 5.0.0 + semver: 7.6.3 + + '@changesets/assemble-release-plan@6.0.5': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.2 + '@changesets/should-skip-package': 0.1.1 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + semver: 7.6.3 + + '@changesets/changelog-git@0.2.0': + dependencies: + '@changesets/types': 6.0.0 + + '@changesets/cli@2.27.12': + dependencies: + '@changesets/apply-release-plan': 7.0.8 + '@changesets/assemble-release-plan': 6.0.5 + '@changesets/changelog-git': 0.2.0 + '@changesets/config': 3.0.5 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.2 + '@changesets/get-release-plan': 4.0.6 + '@changesets/git': 3.0.2 + '@changesets/logger': 0.1.1 + '@changesets/pre': 2.0.1 + '@changesets/read': 0.6.2 + '@changesets/should-skip-package': 0.1.1 + '@changesets/types': 6.0.0 + '@changesets/write': 0.3.2 + '@manypkg/get-packages': 1.1.3 + ansi-colors: 4.1.3 + ci-info: 3.9.0 + enquirer: 2.4.1 + external-editor: 3.1.0 + fs-extra: 7.0.1 + mri: 1.2.0 + p-limit: 2.3.0 + package-manager-detector: 0.2.9 + picocolors: 1.1.1 + resolve-from: 5.0.0 + semver: 7.6.3 + spawndamnit: 3.0.1 + term-size: 2.2.1 + + '@changesets/config@3.0.5': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.2 + '@changesets/logger': 0.1.1 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + micromatch: 4.0.8 + + '@changesets/errors@0.2.0': + dependencies: + extendable-error: 0.1.7 + + '@changesets/get-dependents-graph@2.1.2': + dependencies: + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + picocolors: 1.1.1 + semver: 7.6.3 + + '@changesets/get-release-plan@4.0.6': + dependencies: + '@changesets/assemble-release-plan': 6.0.5 + '@changesets/config': 3.0.5 + '@changesets/pre': 2.0.1 + '@changesets/read': 0.6.2 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/get-version-range-type@0.4.0': {} + + '@changesets/git@3.0.2': + dependencies: + '@changesets/errors': 0.2.0 + '@manypkg/get-packages': 1.1.3 + is-subdir: 1.2.0 + micromatch: 4.0.8 + spawndamnit: 3.0.1 + + '@changesets/logger@0.1.1': + dependencies: + picocolors: 1.1.1 + + '@changesets/parse@0.4.0': + dependencies: + '@changesets/types': 6.0.0 + js-yaml: 3.14.1 + + '@changesets/pre@2.0.1': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + + '@changesets/read@0.6.2': + dependencies: + '@changesets/git': 3.0.2 + '@changesets/logger': 0.1.1 + '@changesets/parse': 0.4.0 + '@changesets/types': 6.0.0 + fs-extra: 7.0.1 + p-filter: 2.1.0 + picocolors: 1.1.1 + + '@changesets/should-skip-package@0.1.1': + dependencies: + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/types@4.1.0': {} + + '@changesets/types@6.0.0': {} + + '@changesets/write@0.3.2': + dependencies: + '@changesets/types': 6.0.0 + fs-extra: 7.0.1 + human-id: 1.0.2 + prettier: 2.8.8 + '@colors/colors@1.6.0': {} '@cspotcode/source-map-support@0.8.1': @@ -4528,6 +5025,11 @@ snapshots: '@esbuild/win32-x64@0.24.2': optional: true + '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)': + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 + '@eslint-community/eslint-utils@4.4.1(eslint@9.19.0(jiti@1.21.7))': dependencies: eslint: 9.19.0(jiti@1.21.7) @@ -4547,6 +5049,20 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.4.0(supports-color@5.5.0) + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + '@eslint/eslintrc@3.2.0': dependencies: ajv: 6.12.6 @@ -4561,6 +5077,8 @@ snapshots: transitivePeerDependencies: - supports-color + '@eslint/js@8.57.1': {} + '@eslint/js@9.19.0': {} '@eslint/object-schema@2.1.5': {} @@ -4577,8 +5095,18 @@ snapshots: '@humanfs/core': 0.19.1 '@humanwhocodes/retry': 0.3.1 + '@humanwhocodes/config-array@0.13.0': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.0(supports-color@5.5.0) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + '@humanwhocodes/module-importer@1.0.1': {} + '@humanwhocodes/object-schema@2.0.3': {} + '@humanwhocodes/retry@0.3.1': {} '@humanwhocodes/retry@0.4.1': {} @@ -4786,6 +5314,22 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@manypkg/find-root@1.1.0': + dependencies: + '@babel/runtime': 7.26.9 + '@types/node': 12.20.55 + find-up: 4.1.0 + fs-extra: 8.1.0 + + '@manypkg/get-packages@1.1.3': + dependencies: + '@babel/runtime': 7.26.9 + '@changesets/types': 4.1.0 + '@manypkg/find-root': 1.1.0 + fs-extra: 8.1.0 + globby: 11.1.0 + read-yaml-file: 1.1.0 + '@mapbox/node-pre-gyp@1.0.11': dependencies: detect-libc: 2.0.3 @@ -4805,6 +5349,10 @@ snapshots: dependencies: fast-glob: 3.3.1 + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': + dependencies: + eslint-scope: 5.1.1 + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -5011,6 +5559,12 @@ snapshots: '@types/ms@2.1.0': {} + '@types/node@12.20.55': {} + + '@types/node@20.17.19': + dependencies: + undici-types: 6.19.8 + '@types/node@22.12.0': dependencies: undici-types: 6.20.0 @@ -5088,6 +5642,24 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.3) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.7.3) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 7.18.0 + eslint: 8.57.1 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.4.3(typescript@5.7.3) + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/eslint-plugin@8.22.0(@typescript-eslint/parser@8.22.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.6.3))(eslint@9.19.0(jiti@1.21.7))(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -5122,6 +5694,19 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.3)': + dependencies: + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.4.0(supports-color@5.5.0) + eslint: 8.57.1 + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/parser@8.22.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.6.3)': dependencies: '@typescript-eslint/scope-manager': 8.22.0 @@ -5151,11 +5736,28 @@ snapshots: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 + '@typescript-eslint/scope-manager@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + '@typescript-eslint/scope-manager@8.22.0': dependencies: '@typescript-eslint/types': 8.22.0 '@typescript-eslint/visitor-keys': 8.22.0 + '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.7.3)': + dependencies: + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.7.3) + debug: 4.4.0(supports-color@5.5.0) + eslint: 8.57.1 + ts-api-utils: 1.4.3(typescript@5.7.3) + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/type-utils@8.22.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.6.3)': dependencies: '@typescript-eslint/typescript-estree': 8.22.0(typescript@5.6.3) @@ -5180,6 +5782,8 @@ snapshots: '@typescript-eslint/types@5.62.0': {} + '@typescript-eslint/types@7.18.0': {} + '@typescript-eslint/types@8.22.0': {} '@typescript-eslint/typescript-estree@5.62.0(typescript@5.7.3)': @@ -5196,6 +5800,21 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.7.3)': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.4.0(supports-color@5.5.0) + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.4.3(typescript@5.7.3) + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/typescript-estree@8.22.0(typescript@5.6.3)': dependencies: '@typescript-eslint/types': 8.22.0 @@ -5239,6 +5858,17 @@ snapshots: - supports-color - typescript + '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.7.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) + eslint: 8.57.1 + transitivePeerDependencies: + - supports-color + - typescript + '@typescript-eslint/utils@8.22.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.6.3)': dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0(jiti@1.21.7)) @@ -5266,11 +5896,18 @@ snapshots: '@typescript-eslint/types': 5.62.0 eslint-visitor-keys: 3.4.3 + '@typescript-eslint/visitor-keys@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + eslint-visitor-keys: 3.4.3 + '@typescript-eslint/visitor-keys@8.22.0': dependencies: '@typescript-eslint/types': 8.22.0 eslint-visitor-keys: 4.2.0 + '@ungap/structured-clone@1.3.0': {} + '@vitejs/plugin-react@4.3.4(vite@6.0.11(@types/node@22.12.0)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))': dependencies: '@babel/core': 7.26.7 @@ -5312,6 +5949,8 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + ansi-colors@4.1.3: {} + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 @@ -5505,6 +6144,10 @@ snapshots: - encoding - supports-color + better-path-resolve@1.0.0: + dependencies: + is-windows: 1.0.2 + binary-extensions@2.3.0: {} body-parser@1.20.3: @@ -5592,6 +6235,8 @@ snapshots: char-regex@1.0.2: {} + chardet@0.7.0: {} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -5767,6 +6412,8 @@ snapshots: destroy@1.2.0: {} + detect-indent@6.1.0: {} + detect-libc@2.0.3: {} detect-newline@3.1.0: {} @@ -5787,6 +6434,10 @@ snapshots: dependencies: esutils: 2.0.3 + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + dotenv@16.0.3: {} dotenv@16.4.7: {} @@ -5829,6 +6480,11 @@ snapshots: encodeurl@2.0.0: {} + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 @@ -5957,7 +6613,6 @@ snapshots: '@esbuild/win32-arm64': 0.23.1 '@esbuild/win32-ia32': 0.23.1 '@esbuild/win32-x64': 0.23.1 - optional: true esbuild@0.24.2: optionalDependencies: @@ -5995,10 +6650,35 @@ snapshots: escape-string-regexp@4.0.0: {} + eslint-config-codely@3.1.4: + dependencies: + '@babel/core': 7.26.7 + '@babel/eslint-parser': 7.26.8(@babel/core@7.26.7)(eslint@8.57.1) + '@types/node': 20.17.19 + '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3) + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.3) + eslint: 8.57.1 + eslint-config-prettier: 9.1.0(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1) + eslint-plugin-prettier: 5.2.3(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.4.2) + eslint-plugin-simple-import-sort: 12.1.1(eslint@8.57.1) + eslint-plugin-unused-imports: 3.2.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1) + prettier: 3.4.2 + typescript: 5.7.3 + transitivePeerDependencies: + - '@types/eslint' + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + eslint-config-prettier@10.0.1(eslint@9.19.0(jiti@1.21.7)): dependencies: eslint: 9.19.0(jiti@1.21.7) + eslint-config-prettier@9.1.0(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + eslint-config-prettier@9.1.0(eslint@9.19.0(jiti@1.21.7)): dependencies: eslint: 9.19.0(jiti@1.21.7) @@ -6011,6 +6691,16 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.3) + eslint: 8.57.1 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.22.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint@9.19.0(jiti@1.21.7)): dependencies: debug: 3.2.7 @@ -6034,6 +6724,35 @@ snapshots: - supports-color - typescript + eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1): + dependencies: + '@rtsao/scc': 1.1.0 + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.57.1 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) + hasown: 2.0.2 + is-core-module: 2.16.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + string.prototype.trimend: 1.0.9 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.3) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.22.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.19.0(jiti@1.21.7)): dependencies: '@rtsao/scc': 1.1.0 @@ -6076,6 +6795,15 @@ snapshots: eslint-plugin-only-warn@1.1.0: {} + eslint-plugin-prettier@5.2.3(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.4.2): + dependencies: + eslint: 8.57.1 + prettier: 3.4.2 + prettier-linter-helpers: 1.0.0 + synckit: 0.9.2 + optionalDependencies: + eslint-config-prettier: 9.1.0(eslint@8.57.1) + eslint-plugin-prettier@5.2.3(eslint-config-prettier@9.1.0(eslint@9.19.0(jiti@1.21.7)))(eslint@9.19.0(jiti@1.21.7))(prettier@3.4.2): dependencies: eslint: 9.19.0(jiti@1.21.7) @@ -6119,6 +6847,10 @@ snapshots: dependencies: eslint: 9.19.0(jiti@1.21.7) + eslint-plugin-simple-import-sort@12.1.1(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + eslint-plugin-sort-class-members@1.21.0(eslint@9.19.0(jiti@1.21.7)): dependencies: eslint: 9.19.0(jiti@1.21.7) @@ -6129,6 +6861,13 @@ snapshots: eslint: 9.19.0(jiti@1.21.7) turbo: 2.3.4 + eslint-plugin-unused-imports@3.2.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + eslint-rule-composer: 0.3.0 + optionalDependencies: + '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3) + eslint-plugin-unused-imports@3.2.0(@typescript-eslint/eslint-plugin@8.22.0(@typescript-eslint/parser@8.22.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.19.0(jiti@1.21.7)): dependencies: eslint: 9.19.0(jiti@1.21.7) @@ -6143,15 +6882,65 @@ snapshots: esrecurse: 4.3.0 estraverse: 4.3.0 + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + eslint-scope@8.2.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 + eslint-visitor-keys@2.1.0: {} + eslint-visitor-keys@3.4.3: {} eslint-visitor-keys@4.2.0: {} + eslint@8.57.1: + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.1 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.3.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.0(supports-color@5.5.0) + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + eslint@9.19.0(jiti@1.21.7): dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0(jiti@1.21.7)) @@ -6199,6 +6988,12 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 4.2.0 + espree@9.6.1: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 3.4.3 + esprima@4.0.1: {} esquery@1.6.0: @@ -6275,6 +7070,14 @@ snapshots: transitivePeerDependencies: - supports-color + extendable-error@0.1.7: {} + + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + fast-deep-equal@3.1.3: {} fast-diff@1.3.0: {} @@ -6309,6 +7112,10 @@ snapshots: fecha@4.2.3: {} + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -6347,6 +7154,12 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 + flat-cache@3.2.0: + dependencies: + flatted: 3.3.2 + keyv: 4.5.4 + rimraf: 3.0.2 + flat-cache@4.0.1: dependencies: flatted: 3.3.2 @@ -6371,6 +7184,18 @@ snapshots: fresh@0.5.2: {} + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + fs-minipass@2.1.0: dependencies: minipass: 3.3.6 @@ -6444,7 +7269,6 @@ snapshots: get-tsconfig@4.10.0: dependencies: resolve-pkg-maps: 1.0.0 - optional: true glob-parent@5.1.2: dependencies: @@ -6483,6 +7307,10 @@ snapshots: globals@11.12.0: {} + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + globals@14.0.0: {} globals@15.14.0: {} @@ -6556,6 +7384,8 @@ snapshots: transitivePeerDependencies: - supports-color + human-id@1.0.2: {} + human-signals@2.1.0: {} iconv-lite@0.4.24: @@ -6679,6 +7509,8 @@ snapshots: is-number@7.0.0: {} + is-path-inside@3.0.3: {} + is-property@1.0.2: {} is-regex@1.2.1: @@ -6701,6 +7533,10 @@ snapshots: call-bound: 1.0.3 has-tostringtag: 1.0.2 + is-subdir@1.2.0: + dependencies: + better-path-resolve: 1.0.0 + is-symbol@1.1.1: dependencies: call-bound: 1.0.3 @@ -6722,6 +7558,8 @@ snapshots: call-bound: 1.0.3 get-intrinsic: 1.2.7 + is-windows@1.0.2: {} + isarray@2.0.5: {} isexe@2.0.0: {} @@ -7131,6 +7969,10 @@ snapshots: json5@2.2.3: {} + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + jsonwebtoken@9.0.2: dependencies: jws: 3.2.2 @@ -7207,6 +8049,8 @@ snapshots: lodash.once@4.1.1: {} + lodash.startcase@4.4.0: {} + lodash@4.17.21: {} logform@2.7.0: @@ -7332,6 +8176,8 @@ snapshots: moment@2.30.1: {} + mri@1.2.0: {} + ms@2.0.0: {} ms@2.1.3: {} @@ -7476,12 +8322,20 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + os-tmpdir@1.0.2: {} + + outdent@0.5.0: {} + own-keys@1.0.1: dependencies: get-intrinsic: 1.2.7 object-keys: 1.1.1 safe-push-apply: 1.0.0 + p-filter@2.1.0: + dependencies: + p-map: 2.1.0 + p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -7498,10 +8352,14 @@ snapshots: dependencies: p-limit: 3.1.0 + p-map@2.1.0: {} + p-try@2.2.0: {} package-json-from-dist@1.0.1: {} + package-manager-detector@0.2.9: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -7569,6 +8427,8 @@ snapshots: pify@2.3.0: {} + pify@4.0.1: {} + pirates@4.0.6: {} pkg-dir@4.2.0: @@ -7621,6 +8481,8 @@ snapshots: dependencies: fast-diff: 1.3.0 + prettier@2.8.8: {} + prettier@3.4.2: {} pretty-format@29.7.0: @@ -7688,6 +8550,13 @@ snapshots: dependencies: pify: 2.3.0 + read-yaml-file@1.1.0: + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + readable-stream@3.6.2: dependencies: inherits: 2.0.4 @@ -7711,6 +8580,8 @@ snapshots: get-proto: 1.0.1 which-builtin-type: 1.2.1 + regenerator-runtime@0.14.1: {} + regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.8 @@ -7730,8 +8601,7 @@ snapshots: resolve-from@5.0.0: {} - resolve-pkg-maps@1.0.0: - optional: true + resolve-pkg-maps@1.0.0: {} resolve.exports@2.0.3: {} @@ -7973,6 +8843,11 @@ snapshots: source-map@0.6.1: {} + spawndamnit@3.0.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + sprintf-js@1.0.3: {} sqlstring@2.3.3: {} @@ -8139,6 +9014,8 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 + term-size@2.2.1: {} + test-exclude@6.0.0: dependencies: '@istanbuljs/schema': 0.1.3 @@ -8147,6 +9024,8 @@ snapshots: text-hex@1.0.0: {} + text-table@0.2.0: {} + thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -8155,6 +9034,10 @@ snapshots: dependencies: any-promise: 1.3.0 + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + tmpl@1.0.5: {} to-regex-range@5.0.1: @@ -8173,6 +9056,10 @@ snapshots: triple-beam@1.4.1: {} + ts-api-utils@1.4.3(typescript@5.7.3): + dependencies: + typescript: 5.7.3 + ts-api-utils@2.0.0(typescript@5.6.3): dependencies: typescript: 5.6.3 @@ -8274,7 +9161,6 @@ snapshots: get-tsconfig: 4.10.0 optionalDependencies: fsevents: 2.3.3 - optional: true turbo-darwin-64@2.3.4: optional: true @@ -8309,6 +9195,8 @@ snapshots: type-detect@4.0.8: {} + type-fest@0.20.2: {} + type-fest@0.21.3: {} type-is@1.6.18: @@ -8382,8 +9270,12 @@ snapshots: undefsafe@2.0.5: {} + undici-types@6.19.8: {} + undici-types@6.20.0: {} + universalify@0.1.2: {} + unpipe@1.0.0: {} update-browserslist-db@1.1.2(browserslist@4.24.4):