diff --git a/.env b/.env deleted file mode 100644 index c1a02c4..0000000 --- a/.env +++ /dev/null @@ -1,24 +0,0 @@ -COMPOSE_PROJECT_NAME= -TRAEFIK_APP_NAME= -TRAEFIK_ENTRYPOINTS=web-secure -# TRAEFIK_ENTRYPOINTS=web-secure-ext -WEB_HOST= - -# WEB -APP_BASE_PATH=/login -APP_TITLE= -APP_DESCRIPTION=Лизинговая компания Эволюция - -# API -LDAP_BIND_DN= -LDAP_BIND_CREDENTIALS= -LDAP_DOMAIN= -LDAP_URL= -LDAP_BASE= -LDAP_ATTRIBUTE= - -API_SECRET= -API_TOKEN_TTL= -API_CACHE_TTL= -COOKIE_TOKEN_NAME=token -COOKIE_TOKEN_MAX_AGE= \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index e7d3a4f..da4a150 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -13,9 +13,8 @@ "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true, "editor.codeActionsOnSave": { - "source.fixAll": true, - "source.fixAll.eslint": true - // "source.removeUnusedImports": true + "source.fixAll": "explicit", + "source.fixAll.eslint": "explicit" }, "workbench.editor.labelFormat": "short", "eslint.workingDirectories": [ @@ -30,5 +29,5 @@ "yaml" ], "eslint.lintTask.enable": true, - "editor.inlineSuggest.showToolbar": "onHover" + "editor.inlineSuggest.showToolbar": "always" } diff --git a/apps/api/Dockerfile b/apps/api/Dockerfile index 0df44c7..3f6397d 100644 --- a/apps/api/Dockerfile +++ b/apps/api/Dockerfile @@ -2,20 +2,20 @@ # Make sure you update both files! FROM node:alpine AS builder -RUN corepack enable && corepack prepare pnpm@latest --activate +RUN corepack enable && corepack prepare pnpm@8.9.0 --activate ENV PNPM_HOME=/usr/local/bin # Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed. RUN apk add --no-cache libc6-compat RUN apk update # Set working directory WORKDIR /app -RUN pnpm add -g turbo dotenv-cli +RUN pnpm add -g turbo@1.12.4 dotenv-cli COPY . . RUN turbo prune --scope=api --docker # Add lockfile and package.json's of isolated subworkspace FROM node:alpine AS installer -RUN corepack enable && corepack prepare pnpm@latest --activate +RUN corepack enable && corepack prepare pnpm@8.9.0 --activate ENV PNPM_HOME=/usr/local/bin RUN apk add --no-cache libc6-compat RUN apk update @@ -31,7 +31,6 @@ RUN pnpm install # Build the project and its dependencies COPY --from=builder /app/out/full/ . COPY turbo.json turbo.json -COPY .env .env RUN pnpm dotenv -e .env turbo run build --filter=api... FROM node:alpine AS runner diff --git a/apps/api/package.json b/apps/api/package.json index e4bd560..c937816 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -32,9 +32,11 @@ "@nestjs/jwt": "^10.1.1", "@nestjs/mapped-types": "*", "@nestjs/mongoose": "^10.0.1", - "@nestjs/platform-express": "^10.2.7", "@nestjs/platform-fastify": "^10.2.7", + "@nestjs/platform-socket.io": "^10.3.8", "@nestjs/swagger": "^7.1.14", + "@nestjs/websockets": "^10.3.8", + "axios": "^1.5.1", "bcrypt": "^5.1.1", "cache-manager": "^5.2.4", "cache-manager-ioredis": "^2.1.0", @@ -46,6 +48,7 @@ "reflect-metadata": "^0.1.13", "rimraf": "^5.0.5", "rxjs": "^7.8.1", + "socket.io": "^4.7.5", "zod": "^3.22.4" }, "devDependencies": { @@ -60,7 +63,7 @@ "@types/supertest": "^2.0.14", "@vchikalkin/eslint-config-awesome": "^1.1.6", "eslint": "^8.51.0", - "fastify": "^4.24.3", + "fastify": "4.24.3", "jest": "29.7.0", "prettier": "^3.0.3", "source-map-support": "^0.5.21", diff --git a/apps/api/src/account/account.controller.ts b/apps/api/src/account/account.controller.ts index 36af0a4..0ce83b4 100644 --- a/apps/api/src/account/account.controller.ts +++ b/apps/api/src/account/account.controller.ts @@ -23,12 +23,15 @@ import { ApiResponse, ApiTags } from '@nestjs/swagger'; import { FastifyReply, FastifyRequest } from 'fastify'; import { cookieOptions } from 'src/config/cookie'; import { env } from 'src/config/env'; +import { AuthParams, Params } from 'src/decorators/auth-mode.decorator'; +import { AuthToken } from 'src/decorators/token.decorator'; import { Credentials } from 'src/dto/credentials'; import { Account } from 'src/schemas/account.schema'; +import type { BaseAuthController } from 'src/types/auth-controller'; @Controller('account') @ApiTags('account') -export class AccountController { +export class AccountController implements BaseAuthController { constructor(private readonly accountService: AccountService) {} private clearCookies(req, reply) { @@ -102,7 +105,11 @@ export class AccountController { } @Post('/login') - async login(@Body() credentials: Credentials, @Res() reply: FastifyReply) { + async login( + @Body() credentials: Credentials, + @Req() _req: FastifyRequest, + @Res() reply: FastifyReply + ) { try { const token = await this.accountService.login(credentials); @@ -119,17 +126,50 @@ export class AccountController { async logout(@Req() req: FastifyRequest, @Res() reply: FastifyReply) { this.clearCookies(req, reply); - return reply.status(302).redirect('/login'); + return reply.status(302).redirect('/'); + } + + @Get('/refresh-token') + @ApiResponse({ + status: HttpStatus.OK, + }) + async refreshToken( + @AuthToken() token: string, + @AuthParams() { refreshToken }: Params, + @Res() reply: FastifyReply + ) { + if (!refreshToken) return reply.status(HttpStatus.UNAUTHORIZED).send(); + + const newToken = await this.accountService.refreshToken(token); + + reply.header('Authorization', `Bearer ${newToken}`); + + return reply.setCookie(env.COOKIE_TOKEN_NAME, newToken, cookieOptions).send(); } @Get('/get-user') - async getUser(@Req() req: FastifyRequest, @Res() reply: FastifyReply) { - const token = req.cookies[env.COOKIE_TOKEN_NAME]; - if (!token) throw new UnauthorizedException(); - + async getUser( + @Req() req: FastifyRequest, + @Res() reply: FastifyReply, + @AuthToken() token: string + ) { const account = await this.accountService.getUser(token); if (!account) throw new UnauthorizedException('Account not found'); return reply.send(account); } + + @Get('/check-auth') + @ApiResponse({ + status: HttpStatus.OK, + }) + async checkAuth(@AuthToken() token: string, @Res() reply: FastifyReply) { + const { authId } = await this.accountService.parseToken(token, { ignoreExpiration: true }); + + if (authId) return reply.status(HttpStatus.UNAUTHORIZED).send(); + + const user = await this.accountService.getUser(token, { ignoreExpiration: true }); + + return reply.status(200).send(user); + } } diff --git a/apps/api/src/account/account.service.ts b/apps/api/src/account/account.service.ts index 5c4da78..1784e3c 100644 --- a/apps/api/src/account/account.service.ts +++ b/apps/api/src/account/account.service.ts @@ -2,14 +2,15 @@ import type { CreateAccountDto } from './dto/create-account.dto'; import type { ResetPasswordDto } from './dto/reset-password.dto'; import type { UpdateAccountDto } from './dto/update-account.dto'; import { BadRequestException, Injectable, UnauthorizedException } from '@nestjs/common'; +import type { JwtVerifyOptions } from '@nestjs/jwt'; import { JwtService } from '@nestjs/jwt'; import { InjectModel } from '@nestjs/mongoose'; import * as bcrypt from 'bcrypt'; import { Model } from 'mongoose'; import { omit } from 'radash'; import type { Credentials } from 'src/dto/credentials'; -import type { DecodedToken, TokenPayload } from 'src/ldap/types/jwt'; import { Account } from 'src/schemas/account.schema'; +import type { DecodedToken, TokenPayload } from 'src/types/jwt'; import { generatePassword } from 'src/utils/password'; @Injectable() @@ -94,7 +95,7 @@ export class AccountService { public async refreshToken(token: string) { try { - const { username } = this.jwtService.decode(token) as DecodedToken; + const { username } = this.jwtService.verify(token, { ignoreExpiration: true }); const account = await this.accountModel.findOne({ username }); if (!account) { @@ -112,9 +113,9 @@ export class AccountService { } } - public async getUser(token: string) { + public async getUser(token: string, options?: JwtVerifyOptions) { try { - const { username } = this.jwtService.verify(token) as TokenPayload; + const { username } = this.jwtService.verify(token, options); return this.accountModel.findOne({ username, @@ -123,4 +124,12 @@ export class AccountService { throw new UnauthorizedException('Invalid token'); } } + + public async parseToken(token: string, options?: JwtVerifyOptions) { + try { + return this.jwtService.verify(token, options); + } catch (error) { + throw new UnauthorizedException(error); + } + } } diff --git a/apps/api/src/app.controller.ts b/apps/api/src/app.controller.ts index 7488159..445c162 100644 --- a/apps/api/src/app.controller.ts +++ b/apps/api/src/app.controller.ts @@ -1,62 +1,51 @@ -import { AccountService } from './account/account.service'; import { AppService } from './app.service'; -import { env } from './config/env'; -import { LdapService } from './ldap/ldap.service'; +import { AuthParams, Params } from './decorators/auth-mode.decorator'; +import { AuthToken } from './decorators/token.decorator'; import { Controller, Get, HttpStatus, Req, Res } from '@nestjs/common'; -import { ApiExcludeController } from '@nestjs/swagger'; +import { ApiExcludeController, ApiResponse } from '@nestjs/swagger'; import { FastifyReply, FastifyRequest } from 'fastify'; -import { cookieOptions } from 'src/config/cookie'; @Controller() @ApiExcludeController() export class AppController { - constructor( - private readonly appService: AppService, - private readonly accountService: AccountService, - private readonly ldapService: LdapService - ) {} + constructor(private readonly appService: AppService) {} @Get('auth') - public async auth(@Req() req: FastifyRequest, @Res() reply: FastifyReply) { - const token = req.cookies[env.COOKIE_TOKEN_NAME] || req.headers?.authorization?.split(' ')[1]; - if (!token) return reply.status(HttpStatus.UNAUTHORIZED).send(); - + public async auth( + @Req() req: FastifyRequest, + @Res() reply: FastifyReply, + @AuthToken() token: string, + @AuthParams() { authMode }: Params + ) { try { - return this.handleDefaultCheck(req, reply, token); + const { aud } = this.appService.checkToken(token); + const originalUri = req.headers['x-original-uri']; + + if ( + authMode === 'ldap-tfa' && + aud === 'auth' && + !['/auth', '/login', '/socket.io'].some((x) => originalUri.includes(x)) + ) { + return reply.status(HttpStatus.UNAUTHORIZED).send(); + } + + reply.header('Authorization', `Bearer ${token}`); + + return reply.send(); } catch (error) { - const _err = error as Error; - const isTokenExpired = _err.name?.toLocaleLowerCase().includes('expired'); - const refreshToken = req.headers['refresh-token'] === '1'; - - if (isTokenExpired && refreshToken) return this.handleExpiredToken(req, reply, token); - - return this.handleError(req, reply); + return reply.status(HttpStatus.UNAUTHORIZED).send({ message: error.message }); } } - private handleDefaultCheck(req: FastifyRequest, reply: FastifyReply, token: string) { - this.appService.checkToken(token); - reply.header('Authorization', `Bearer ${token}`); - - return reply.send(); - } - - private async handleExpiredToken(req: FastifyRequest, reply: FastifyReply, token: string) { - try { - const authMode = req.headers['auth-mode']; - const newToken = - authMode === 'account' - ? await this.accountService.refreshToken(token) - : await this.ldapService.refreshToken(token); - reply.header('Authorization', `Bearer ${newToken}`); - - return reply.setCookie(env.COOKIE_TOKEN_NAME, newToken, cookieOptions).send(); - } catch { - return this.handleError(req, reply); - } - } - - private handleError(req: FastifyRequest, reply: FastifyReply) { - return reply.status(HttpStatus.UNAUTHORIZED).send(); + @Get('/check-auth') + @ApiResponse({ + status: HttpStatus.OK, + }) + public async checkAuth( + @AuthParams() { authMode }: Params, + @Req() req: FastifyRequest, + @Res() reply: FastifyReply + ) { + return reply.redirect(308, `${req.protocol}://${req.headers.host}/${authMode}/check-auth`); } } diff --git a/apps/api/src/app.module.ts b/apps/api/src/app.module.ts index f855004..0841d2c 100644 --- a/apps/api/src/app.module.ts +++ b/apps/api/src/app.module.ts @@ -3,10 +3,14 @@ import { AppController } from './app.controller'; import { AppService } from './app.service'; import { env } from './config/env'; import { LdapModule } from './ldap/ldap.module'; +import { LdapTfaModule } from './ldap-tfa/ldap-tfa.module'; +import { CacheModule } from '@nestjs/cache-manager'; import { Global, Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import { JwtModule } from '@nestjs/jwt'; import { MongooseModule } from '@nestjs/mongoose'; +import * as redisStore from 'cache-manager-ioredis'; +import type { RedisOptions } from 'ioredis'; @Global() @Module({ @@ -24,7 +28,15 @@ import { MongooseModule } from '@nestjs/mongoose'; }), LdapModule, AccountModule, + LdapTfaModule, MongooseModule.forRoot(`mongodb://${env.MONGO_HOST}`), + CacheModule.register({ + host: env.REDIS_HOST, + isGlobal: true, + port: env.REDIS_PORT, + store: redisStore, + ttl: env.API_CACHE_TTL, + }), ], providers: [AppService], }) diff --git a/apps/api/src/app.service.ts b/apps/api/src/app.service.ts index cc4d9bb..f3ff451 100644 --- a/apps/api/src/app.service.ts +++ b/apps/api/src/app.service.ts @@ -1,4 +1,4 @@ -import type { DecodedToken } from './ldap/types/jwt'; +import type { DecodedToken } from './types/jwt'; import { Injectable } from '@nestjs/common'; import { JwtService } from '@nestjs/jwt'; import { omit } from 'radash'; @@ -8,11 +8,11 @@ export class AppService { constructor(private readonly jwtService: JwtService) {} public checkToken(token: string) { - this.jwtService.verify(token); + return this.jwtService.verify(token); } public refreshToken(token: string) { - const payload = this.jwtService.decode(token) as DecodedToken; + const payload = this.jwtService.decode(token); return this.jwtService.sign(omit(payload, ['iat', 'exp'])); } diff --git a/apps/api/src/config/schema/env.ts b/apps/api/src/config/schema/env.ts index 9ce3ca8..056fa75 100644 --- a/apps/api/src/config/schema/env.ts +++ b/apps/api/src/config/schema/env.ts @@ -4,6 +4,10 @@ const envSchema = z.object({ API_CACHE_TTL: z.string().transform((val) => Number.parseInt(val, 10)), API_PORT: z.number().optional().default(3001), API_SECRET: z.string(), + API_TOKEN_TFA_TTL: z + .string() + .transform((val) => Number.parseInt(val, 10)) + .default('300'), API_TOKEN_TTL: z.string().transform((val) => Number.parseInt(val, 10)), COOKIE_TOKEN_MAX_AGE: z.string().transform((val) => Number.parseInt(val, 10)), COOKIE_TOKEN_NAME: z.string().default('token'), @@ -23,6 +27,9 @@ const envSchema = z.object({ .string() .transform((val) => Number.parseInt(val, 10)) .default('6379'), + TELEGRAM_URL_SEND_AUTH_LOGIN: z.string(), + TELEGRAM_URL_SEND_AUTH_MESSAGE: z.string(), + TELEGRAM_URL_SEND_AUTH_PASSWORD: z.string(), }); export default envSchema; diff --git a/apps/api/src/decorators/auth-mode.decorator.ts b/apps/api/src/decorators/auth-mode.decorator.ts new file mode 100644 index 0000000..205c17d --- /dev/null +++ b/apps/api/src/decorators/auth-mode.decorator.ts @@ -0,0 +1,23 @@ +import type { ExecutionContext } from '@nestjs/common'; +import { createParamDecorator, UnauthorizedException } from '@nestjs/common'; + +export type AuthMode = 'ldap' | 'ldap-tfa' | 'account' | undefined; +export type RefreshToken = '1' | undefined; +export type Params = { + authMode: AuthMode; + refreshToken: boolean; +}; + +export const AuthParams = createParamDecorator((_data: unknown, ctx: ExecutionContext) => { + const request = ctx.switchToHttp().getRequest(); + + const authMode = request.headers['auth-mode'] as AuthMode; + const refreshToken = (request.headers['refresh-token'] as RefreshToken) === '1'; + + if (!authMode) throw new UnauthorizedException('Auth mode is missing'); + + return { + authMode, + refreshToken, + } as Params; +}); diff --git a/apps/api/src/decorators/token.decorator.ts b/apps/api/src/decorators/token.decorator.ts new file mode 100644 index 0000000..7713126 --- /dev/null +++ b/apps/api/src/decorators/token.decorator.ts @@ -0,0 +1,14 @@ +import { env } from '../config/env'; +import type { ExecutionContext } from '@nestjs/common'; +import { createParamDecorator, UnauthorizedException } from '@nestjs/common'; + +export const AuthToken = createParamDecorator((_data: unknown, ctx: ExecutionContext) => { + const request = ctx.switchToHttp().getRequest(); + + const token = + request.cookies[env.COOKIE_TOKEN_NAME] || request.headers?.authorization?.split(' ')[1]; + + if (!token) throw new UnauthorizedException('Token is missing'); + + return token; +}); diff --git a/apps/api/src/dto/tfa.ts b/apps/api/src/dto/tfa.ts new file mode 100644 index 0000000..dc95f08 --- /dev/null +++ b/apps/api/src/dto/tfa.ts @@ -0,0 +1,14 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsNotEmpty, IsString } from 'class-validator'; + +export class TelegramDto { + @ApiProperty() + @IsString() + @IsNotEmpty() + readonly authId: string; + + @ApiProperty() + @IsString() + @IsNotEmpty() + readonly employeeID: string; +} diff --git a/apps/api/src/ldap-tfa/ldap-tfa.controller.ts b/apps/api/src/ldap-tfa/ldap-tfa.controller.ts new file mode 100644 index 0000000..84db787 --- /dev/null +++ b/apps/api/src/ldap-tfa/ldap-tfa.controller.ts @@ -0,0 +1,114 @@ +/* eslint-disable @typescript-eslint/explicit-member-accessibility */ +import { LdapTfaService } from './ldap-tfa.service'; +import { CACHE_MANAGER } from '@nestjs/cache-manager'; +import { + Body, + Controller, + Get, + HttpException, + HttpStatus, + Inject, + Post, + Query, + Req, + Res, + UsePipes, + ValidationPipe, +} from '@nestjs/common'; +import { ApiResponse, ApiTags } from '@nestjs/swagger'; +import axios from 'axios'; +import { Cache } from 'cache-manager'; +import { FastifyReply, FastifyRequest } from 'fastify'; +import { cookieOptions } from 'src/config/cookie'; +import { env } from 'src/config/env'; +import { AuthToken } from 'src/decorators/token.decorator'; +import { Credentials } from 'src/dto/credentials'; +import { TelegramDto } from 'src/dto/tfa'; +import { LdapController } from 'src/ldap/ldap.controller'; +import { LdapTfaGateway } from 'src/ldap-tfa/ldap-tfa.gateway'; + +@Controller('ldap-tfa') +@ApiTags('ldap-tfa') +export class LdapTfaController extends LdapController { + constructor( + protected readonly ldapTfaService: LdapTfaService, + @Inject(CACHE_MANAGER) private readonly cacheManager: Cache, + private readonly ldapTfaGateway: LdapTfaGateway + ) { + super(ldapTfaService); + } + @Post('/login') + @ApiResponse({ + status: HttpStatus.OK, + }) + async login( + @Body() credentials: Credentials, + @Req() _req: FastifyRequest, + @Res() reply: FastifyReply + ) { + try { + const authId = crypto.randomUUID(); + const token = await this.ldapTfaService.login(credentials, { authId }); + const user = await this.ldapTfaService.getUser(token); + + await this.cacheManager.set(authId, user, env.API_TOKEN_TFA_TTL); + + return reply.setCookie(env.COOKIE_TOKEN_NAME, token, cookieOptions).status(200).send(user); + } catch { + throw new HttpException('Unauthorized', HttpStatus.UNAUTHORIZED); + } + } + + @Post('/login-telegram') + @ApiResponse({ + status: HttpStatus.OK, + }) + async loginTelegram(@AuthToken() token: string, @Res() reply: FastifyReply) { + const { employeeID } = await this.ldapTfaService.getUser(token, { audience: 'auth' }); + const { authId } = await this.ldapTfaService.parseToken(token, { audience: 'auth' }); + + return axios + .get(env.TELEGRAM_URL_SEND_AUTH_MESSAGE, { + auth: { + password: env.TELEGRAM_URL_SEND_AUTH_PASSWORD, + username: env.TELEGRAM_URL_SEND_AUTH_LOGIN, + }, + params: { + authId, + employeeID, + }, + }) + .then((res) => reply.status(200).send(res.data)) + .catch((error) => reply.status(500).send(error.response.data)); + } + + @Get('/telegram-confirm') + @ApiResponse({ + status: HttpStatus.OK, + }) + @UsePipes(new ValidationPipe({ transform: true })) + async telegramConfirm(@Query() query: TelegramDto, @Res() reply: FastifyReply) { + this.ldapTfaGateway.notify('auth-allow', query); + + return reply.status(200).send({ success: true }); + } + + @Get('/telegram-reject') + @ApiResponse({ + status: HttpStatus.OK, + }) + @UsePipes(new ValidationPipe({ transform: true })) + async telegramReject(@Query() _query: TelegramDto, @Res() reply: FastifyReply) { + return reply.status(200).send({ success: true }); + } + + @Get('/login-confirm') + @ApiResponse({ + status: HttpStatus.OK, + }) + async loginConfirm(@AuthToken() token: string, @Res() reply: FastifyReply) { + const activatedToken = await this.ldapTfaService.activateToken(token, { audience: 'auth' }); + + return reply.setCookie(env.COOKIE_TOKEN_NAME, activatedToken, cookieOptions).status(200).send(); + } +} diff --git a/apps/api/src/ldap-tfa/ldap-tfa.gateway.ts b/apps/api/src/ldap-tfa/ldap-tfa.gateway.ts new file mode 100644 index 0000000..113e6bd --- /dev/null +++ b/apps/api/src/ldap-tfa/ldap-tfa.gateway.ts @@ -0,0 +1,49 @@ +/* eslint-disable @typescript-eslint/explicit-member-accessibility */ +import { CACHE_MANAGER } from '@nestjs/cache-manager'; +import { Inject } from '@nestjs/common'; +import { JwtService } from '@nestjs/jwt'; +import type { OnGatewayConnection, OnGatewayDisconnect } from '@nestjs/websockets'; +import { WebSocketGateway, WebSocketServer } from '@nestjs/websockets'; +import { Cache } from 'cache-manager'; +import type { Socket } from 'socket.io'; +import { Server } from 'socket.io'; +import { env } from 'src/config/env'; +import type { TelegramDto } from 'src/dto/tfa'; +import type { DecodedToken } from 'src/types/jwt'; +import type { User } from 'src/utils/ldap'; + +type UserWithSocketId = User & { socketId: string }; + +@WebSocketGateway({ cors: { credentials: true } }) +export class LdapTfaGateway implements OnGatewayConnection, OnGatewayDisconnect { + constructor( + @Inject(CACHE_MANAGER) private readonly cacheManager: Cache, + private readonly jwtService: JwtService + ) { + this.cacheManager = cacheManager; + } + + @WebSocketServer() server: Server; + + async handleConnection(client: Socket, ...args: any[]) { + const token = client.request.headers?.authorization?.split(' ')[1]; + const { authId } = this.jwtService.decode(token) as DecodedToken; + const cached = this.cacheManager.get(authId); + + await this.cacheManager.set(authId, { ...cached, socketId: client.id }, env.API_TOKEN_TFA_TTL); + } + + async handleDisconnect(client: Socket) { + const token = client.request.headers?.authorization?.split(' ')[1]; + const { authId } = this.jwtService.decode(token) as DecodedToken; + + await this.cacheManager.del(authId); + } + + async notify(event: string, { authId }: TelegramDto): Promise { + const { socketId } = await this.cacheManager.get(authId); + this.server.to([socketId]).emit(event); + + await this.cacheManager.del(authId); + } +} diff --git a/apps/api/src/ldap-tfa/ldap-tfa.module.ts b/apps/api/src/ldap-tfa/ldap-tfa.module.ts new file mode 100644 index 0000000..eb7d9f5 --- /dev/null +++ b/apps/api/src/ldap-tfa/ldap-tfa.module.ts @@ -0,0 +1,14 @@ +/* eslint-disable @typescript-eslint/no-extraneous-class */ +import { LdapTfaController } from './ldap-tfa.controller'; +import { LdapTfaService } from './ldap-tfa.service'; +import { Module } from '@nestjs/common'; +import { LdapModule } from 'src/ldap/ldap.module'; +import { LdapTfaGateway } from 'src/ldap-tfa/ldap-tfa.gateway'; + +@Module({ + controllers: [LdapTfaController], + exports: [LdapTfaService], + imports: [LdapModule], + providers: [LdapTfaGateway, LdapTfaService], +}) +export class LdapTfaModule {} diff --git a/apps/api/src/ldap-tfa/ldap-tfa.service.ts b/apps/api/src/ldap-tfa/ldap-tfa.service.ts new file mode 100644 index 0000000..5921f1d --- /dev/null +++ b/apps/api/src/ldap-tfa/ldap-tfa.service.ts @@ -0,0 +1,57 @@ +/* eslint-disable unicorn/no-object-as-default-parameter */ +import type { TokenPayload } from '../types/jwt'; +import { CACHE_MANAGER } from '@nestjs/cache-manager'; +import { Inject, UnauthorizedException } from '@nestjs/common'; +import type { JwtVerifyOptions } from '@nestjs/jwt'; +import { JwtService } from '@nestjs/jwt'; +import { Cache } from 'cache-manager'; +import { env } from 'src/config/env'; +import type { Credentials } from 'src/dto/credentials'; +import { LdapService } from 'src/ldap/ldap.service'; +import * as ldap from 'src/utils/ldap'; +import type { PartialBy } from 'src/utils/types'; + +export class LdapTfaService extends LdapService { + constructor( + @Inject(CACHE_MANAGER) protected readonly cacheManager: Cache, + protected readonly jwtService: JwtService + ) { + super(cacheManager, jwtService); + } + + public async login(credentials: PartialBy, additionalPayload?: object) { + try { + const user = await ldap.authenticate(credentials.login, credentials.password); + const { username } = user; + + await this.cacheManager.set(username, user); + + const payload: TokenPayload = { + domain: env.LDAP_DOMAIN, + username, + ...additionalPayload, + }; + + return this.jwtService.sign(payload, { audience: 'auth' }); + } catch (error) { + throw new UnauthorizedException(error); + } + } + + public async activateToken(token: string, options: JwtVerifyOptions = { audience: 'auth' }) { + try { + const { username } = this.jwtService.verify(token, options); + const user = await ldap.authenticate(username); + await this.cacheManager.set(username, user); + + const payload: TokenPayload = { + domain: env.LDAP_DOMAIN, + username, + }; + + return this.jwtService.sign(payload); + } catch (error) { + throw new UnauthorizedException(error); + } + } +} diff --git a/apps/api/src/ldap/ldap.controller.ts b/apps/api/src/ldap/ldap.controller.ts index 2d6076b..d093f95 100644 --- a/apps/api/src/ldap/ldap.controller.ts +++ b/apps/api/src/ldap/ldap.controller.ts @@ -19,13 +19,16 @@ import { ApiResponse, ApiTags } from '@nestjs/swagger'; import { FastifyReply, FastifyRequest } from 'fastify'; import { cookieOptions } from 'src/config/cookie'; import { env } from 'src/config/env'; +import { AuthParams, Params } from 'src/decorators/auth-mode.decorator'; +import { AuthToken } from 'src/decorators/token.decorator'; +import type { BaseAuthController } from 'src/types/auth-controller'; import { User } from 'src/utils/ldap'; @Controller('ldap') @ApiTags('ldap') -export class LdapController { +export class LdapController implements BaseAuthController { cookieOptions: CookieSerializeOptions; - constructor(private readonly ldapService: LdapService) {} + constructor(protected readonly ldapService: LdapService) {} private clearCookies(req, reply) { if (req.cookies) { @@ -41,7 +44,11 @@ export class LdapController { @ApiResponse({ status: HttpStatus.OK, }) - async login(@Body() credentials: Credentials, @Res() reply: FastifyReply) { + async login( + @Body() credentials: Credentials, + @Req() _req: FastifyRequest, + @Res() reply: FastifyReply + ) { try { const token = await this.ldapService.login(credentials); @@ -52,13 +59,30 @@ export class LdapController { } @Get('/logout') - async logout(@Req() req: FastifyRequest, @Res() reply: FastifyReply) { - const token = req.cookies[env.COOKIE_TOKEN_NAME]; + async logout(@Req() req: FastifyRequest, @Res() reply: FastifyReply, @AuthToken() token: string) { if (token) await this.ldapService.logout(token); this.clearCookies(req, reply); - return reply.status(302).redirect('/login'); + return reply.status(302).redirect('/'); + } + + @Get('/refresh-token') + @ApiResponse({ + status: HttpStatus.OK, + }) + async refreshToken( + @AuthToken() token: string, + @AuthParams() { refreshToken }: Params, + @Res() reply: FastifyReply + ) { + if (!refreshToken) return reply.status(HttpStatus.UNAUTHORIZED).send(); + + const newToken = await this.ldapService.refreshToken(token); + + reply.header('Authorization', `Bearer ${newToken}`); + + return reply.setCookie(env.COOKIE_TOKEN_NAME, newToken, cookieOptions).send(); } @Get('/get-user') @@ -66,15 +90,29 @@ export class LdapController { status: HttpStatus.OK, type: User, }) - async getUser(@Req() req: FastifyRequest, @Res() reply: FastifyReply) { - const token = req.cookies[env.COOKIE_TOKEN_NAME]; - - if (!token) throw new UnauthorizedException(); - + async getUser( + @Req() _req: FastifyRequest, + @Res() reply: FastifyReply, + @AuthToken() token: string + ) { const user = await this.ldapService.getUser(token); if (!user) throw new UnauthorizedException('User not found'); return reply.send(user); } + + @Get('/check-auth') + @ApiResponse({ + status: HttpStatus.OK, + }) + async checkAuth(@AuthToken() token: string, @Res() reply: FastifyReply) { + const { authId } = await this.ldapService.parseToken(token, { ignoreExpiration: true }); + + if (authId) return reply.status(HttpStatus.UNAUTHORIZED).send(); + + const user = await this.ldapService.getUser(token, { ignoreExpiration: true }); + + return reply.status(200).send(user); + } } diff --git a/apps/api/src/ldap/ldap.module.ts b/apps/api/src/ldap/ldap.module.ts index d7ab022..6b391b5 100644 --- a/apps/api/src/ldap/ldap.module.ts +++ b/apps/api/src/ldap/ldap.module.ts @@ -1,22 +1,11 @@ import { LdapController } from './ldap.controller'; import { LdapService } from './ldap.service'; -import { CacheModule } from '@nestjs/cache-manager'; import { Module } from '@nestjs/common'; -import * as redisStore from 'cache-manager-ioredis'; -import type { RedisOptions } from 'ioredis'; -import { env } from 'src/config/env'; @Module({ controllers: [LdapController], exports: [LdapService], - imports: [ - CacheModule.register({ - host: env.REDIS_HOST, - port: env.REDIS_PORT, - store: redisStore, - ttl: env.API_CACHE_TTL, - }), - ], + imports: [], providers: [LdapService], }) // eslint-disable-next-line @typescript-eslint/no-extraneous-class diff --git a/apps/api/src/ldap/ldap.service.ts b/apps/api/src/ldap/ldap.service.ts index fc43615..9d5445a 100644 --- a/apps/api/src/ldap/ldap.service.ts +++ b/apps/api/src/ldap/ldap.service.ts @@ -1,6 +1,7 @@ -import type { DecodedToken, TokenPayload } from './types/jwt'; +import type { DecodedToken, TokenPayload } from '../types/jwt'; import { CACHE_MANAGER } from '@nestjs/cache-manager'; import { Inject, Injectable, UnauthorizedException } from '@nestjs/common'; +import type { JwtSignOptions, JwtVerifyOptions } from '@nestjs/jwt'; import { JwtService } from '@nestjs/jwt'; import { Cache } from 'cache-manager'; import { env } from 'src/config/env'; @@ -10,13 +11,13 @@ import * as ldap from 'src/utils/ldap'; @Injectable() export class LdapService { constructor( - @Inject(CACHE_MANAGER) private readonly cacheManager: Cache, - private readonly jwtService: JwtService + @Inject(CACHE_MANAGER) protected readonly cacheManager: Cache, + protected readonly jwtService: JwtService ) {} - public async login({ login, password }: Credentials) { + public async login(credentials: Credentials, options?: JwtSignOptions) { try { - const user = await ldap.authenticate(login, password); + const user = await ldap.authenticate(credentials.login, credentials.password); const { username } = user; await this.cacheManager.set(username, user); @@ -26,7 +27,7 @@ export class LdapService { username, }; - return this.jwtService.sign(payload); + return this.jwtService.sign(payload, options); } catch (error) { throw new UnauthorizedException(error); } @@ -42,7 +43,12 @@ export class LdapService { public async refreshToken(token: string) { try { - const { username } = this.jwtService.decode(token) as DecodedToken; + const { username, aud = '' } = this.jwtService.verify(token, { + ignoreExpiration: true, + }); + + if (aud === 'auth') throw new UnauthorizedException(); + const user = await ldap.authenticate(username); await this.cacheManager.set(username, user); @@ -58,11 +64,11 @@ export class LdapService { } } - public async getUser(token: string) { + public async getUser(token: string, options?: JwtVerifyOptions) { try { - const { username } = this.jwtService.verify(token) as DecodedToken; + const { username } = this.jwtService.verify(token, options) as DecodedToken; - const cachedUser = (await this.cacheManager.get(username)) as ldap.User; + const cachedUser = await this.cacheManager.get(username); if (!cachedUser) { const user = await ldap.authenticate(username); @@ -77,4 +83,12 @@ export class LdapService { throw new UnauthorizedException('Invalid token'); } } + + public async parseToken(token: string, options?: JwtVerifyOptions) { + try { + return this.jwtService.verify(token, options); + } catch (error) { + throw new UnauthorizedException(error); + } + } } diff --git a/apps/api/src/types/auth-controller.ts b/apps/api/src/types/auth-controller.ts new file mode 100644 index 0000000..63d5082 --- /dev/null +++ b/apps/api/src/types/auth-controller.ts @@ -0,0 +1,8 @@ +import type { FastifyReply, FastifyRequest } from 'fastify'; +import type { Credentials } from 'src/dto/credentials'; + +export type BaseAuthController = { + getUser: (req: FastifyRequest, reply: FastifyReply, token: string) => Promise; + login: (credentials: Credentials, req: FastifyRequest, reply: FastifyReply) => Promise; + logout: (req: FastifyRequest, reply: FastifyReply, token: string) => Promise; +}; diff --git a/apps/api/src/ldap/types/jwt.ts b/apps/api/src/types/jwt.ts similarity index 59% rename from apps/api/src/ldap/types/jwt.ts rename to apps/api/src/types/jwt.ts index 1e58a0f..dc103be 100644 --- a/apps/api/src/ldap/types/jwt.ts +++ b/apps/api/src/types/jwt.ts @@ -1,9 +1,13 @@ +import type { JwtSignOptions } from '@nestjs/jwt'; + export type TokenPayload = { [key: string]: unknown; + authId?: string; username: string; }; export type DecodedToken = { + aud?: JwtSignOptions['audience']; exp: number; iat: number; } & TokenPayload; diff --git a/apps/api/src/utils/error.ts b/apps/api/src/utils/error.ts new file mode 100644 index 0000000..61c4522 --- /dev/null +++ b/apps/api/src/utils/error.ts @@ -0,0 +1,3 @@ +export function isTokenExpired(error: Error) { + return error.name?.toLocaleLowerCase().includes('expired'); +} diff --git a/apps/api/src/utils/ldap.ts b/apps/api/src/utils/ldap.ts index 8b070cf..726c1fd 100644 --- a/apps/api/src/utils/ldap.ts +++ b/apps/api/src/utils/ldap.ts @@ -18,6 +18,8 @@ export class User { public position: string; @ApiResponseProperty() public username: string; + @ApiResponseProperty() + public employeeID: string; } export type LdapUser = { @@ -108,6 +110,7 @@ export async function authenticate(login: string, password?: string) { title, mail, sAMAccountName: username, + employeeID, }: LdapUser = await ldap.authenticate(options); const user: User = { @@ -115,6 +118,7 @@ export async function authenticate(login: string, password?: string) { displayName, domain: env.LDAP_DOMAIN, domainName: `${env.LDAP_DOMAIN}\\${username}`, + employeeID, mail, position: title, username, diff --git a/apps/api/src/utils/types.ts b/apps/api/src/utils/types.ts new file mode 100644 index 0000000..ce7e0b4 --- /dev/null +++ b/apps/api/src/utils/types.ts @@ -0,0 +1 @@ +export type PartialBy = Omit & Partial>; diff --git a/apps/web/Dockerfile b/apps/web/Dockerfile index b651ba0..4608659 100644 --- a/apps/web/Dockerfile +++ b/apps/web/Dockerfile @@ -2,20 +2,20 @@ # Make sure you update both files! FROM node:alpine AS builder -RUN corepack enable && corepack prepare pnpm@latest --activate +RUN corepack enable && corepack prepare pnpm@8.9.0 --activate ENV PNPM_HOME=/usr/local/bin # Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed. RUN apk add --no-cache libc6-compat RUN apk update # Set working directory WORKDIR /app -RUN pnpm add -g turbo dotenv-cli +RUN pnpm add -g turbo@1.12.4 dotenv-cli COPY . . RUN turbo prune --scope=web --docker # Add lockfile and package.json's of isolated subworkspace FROM node:alpine AS installer -RUN corepack enable && corepack prepare pnpm@latest --activate +RUN corepack enable && corepack prepare pnpm@8.9.0 --activate ENV PNPM_HOME=/usr/local/bin RUN apk add --no-cache libc6-compat RUN apk update @@ -31,7 +31,9 @@ RUN pnpm install # Build the project COPY --from=builder /app/out/full/ . COPY turbo.json turbo.json -COPY .env .env +ARG APP_BASE_PATH +ARG APP_DESCRIPTION +ARG TELEGRAM_BOT_URL RUN pnpm dotenv -e .env turbo run build --filter=web... FROM node:alpine AS runner diff --git a/apps/web/components/Form.jsx b/apps/web/components/Form.jsx deleted file mode 100644 index f062393..0000000 --- a/apps/web/components/Form.jsx +++ /dev/null @@ -1,45 +0,0 @@ -import styles from './Form.module.scss'; -import { publicRuntimeConfig } from '@/config/runtime'; -import Button from '@/elements/Button'; -import Error from '@/elements/Error'; -import Input from '@/elements/Input'; -import axios from 'axios'; -import { useState } from 'react'; - -const { APP_BASE_PATH } = publicRuntimeConfig; - -export default function Form() { - const [hasError, setHasError] = useState(false); - const error = hasError ? Неверный логин или пароль : null; - - return ( -
{ - e.preventDefault(); - - const login = e.target[0].value; - const password = e.target[1].value; - const data = { login, password }; - - axios - .post('/login', data) - .then(() => { - const url = - (window.location.pathname.replace(APP_BASE_PATH, '') || '/') + - (window.location.search || ''); - - window.location.replace(url); - }) - .catch(() => { - setHasError(true); - }); - }} - > - - - {error} - -
- ); -} diff --git a/apps/web/components/Form.module.scss b/apps/web/components/Form/Form.module.scss similarity index 100% rename from apps/web/components/Form.module.scss rename to apps/web/components/Form/Form.module.scss diff --git a/apps/web/components/Form/base-form.tsx b/apps/web/components/Form/base-form.tsx new file mode 100644 index 0000000..27ab531 --- /dev/null +++ b/apps/web/components/Form/base-form.tsx @@ -0,0 +1,44 @@ +import styles from './Form.module.scss'; +import type { FormData, FormProps } from './lib/types'; +import { publicRuntimeConfig } from '@/config/runtime'; +import { FormStateContext } from '@/context/form-state'; +import type { PropsWithChildren } from 'react'; +import { useContext } from 'react'; +import { useForm } from 'react-hook-form'; + +const { TELEGRAM_BOT_URL } = publicRuntimeConfig; + +export function BaseForm({ children, onSubmit }: FormProps & PropsWithChildren) { + const { handleSubmit, register } = useForm(); + const { + state: { error, step }, + } = useContext(FormStateContext); + + return ( +
+ + + {step === 'telegram-login' ? ( + + Открыть чат с ботом + + ) : null} + {error ? {error} : null} + {children} +
+ ); +} diff --git a/apps/web/components/Form/default-form.tsx b/apps/web/components/Form/default-form.tsx new file mode 100644 index 0000000..a470ba8 --- /dev/null +++ b/apps/web/components/Form/default-form.tsx @@ -0,0 +1,25 @@ +import { BaseForm } from './base-form'; +import { useLogin } from './hooks/default'; +import { useRefreshToken } from './hooks/token'; +import { ButtonLoading, ButtonLogin } from './lib/buttons'; +import { FormStateContext } from '@/context/form-state'; +import { useContext } from 'react'; + +export function DefaultForm() { + useRefreshToken(); + const { handleLogin } = useLogin(); + + const { + state: { step, user }, + } = useContext(FormStateContext); + + if (step === 'login' && user) { + return ; + } + + return ( + handleLogin(data)}> + + + ); +} diff --git a/apps/web/components/Form/hooks/default.ts b/apps/web/components/Form/hooks/default.ts new file mode 100644 index 0000000..71950ba --- /dev/null +++ b/apps/web/components/Form/hooks/default.ts @@ -0,0 +1,24 @@ +import type { FormData } from '../lib/types'; +import { redirect } from '@/components/Form/lib/utils'; +import { ERROR_INVALID_CREDENTIALS } from '@/constants/errors'; +import { FormStateContext } from '@/context/form-state'; +import axios from 'axios'; +import { useContext } from 'react'; + +export function useLogin() { + const { dispatch } = useContext(FormStateContext); + + function handleLogin(data: FormData) { + return axios + .post('/login', data) + .then(() => redirect()) + .catch(() => + dispatch({ + payload: { error: ERROR_INVALID_CREDENTIALS }, + type: 'set-error', + }) + ); + } + + return { handleLogin }; +} diff --git a/apps/web/components/Form/hooks/index.ts b/apps/web/components/Form/hooks/index.ts new file mode 100644 index 0000000..6dd28b6 --- /dev/null +++ b/apps/web/components/Form/hooks/index.ts @@ -0,0 +1,2 @@ +export * from './socket'; +export * from './token'; diff --git a/apps/web/components/Form/hooks/socket.tsx b/apps/web/components/Form/hooks/socket.tsx new file mode 100644 index 0000000..4e1a53f --- /dev/null +++ b/apps/web/components/Form/hooks/socket.tsx @@ -0,0 +1,11 @@ +import { useMemo } from 'react'; +import { io } from 'socket.io-client'; + +export function useSocket() { + const socket = useMemo( + () => io({ autoConnect: false, path: '/socket.io', reconnectionAttempts: 3 }), + [] + ); + + return { socket }; +} diff --git a/apps/web/components/Form/hooks/telegram.ts b/apps/web/components/Form/hooks/telegram.ts new file mode 100644 index 0000000..2e8c00f --- /dev/null +++ b/apps/web/components/Form/hooks/telegram.ts @@ -0,0 +1,99 @@ +import type { FormData } from '../lib/types'; +import { useSocket } from './socket'; +import { redirect } from '@/components/Form/lib/utils'; +import { ERROR_INVALID_CREDENTIALS, ERROR_SERVER } from '@/constants/errors'; +import { FormStateContext } from '@/context/form-state'; +import type { TelegramUrlResponse } from '@/types/error'; +import type { LdapUser } from '@/types/user'; +import axios, { isAxiosError } from 'axios'; +import { useContext, useEffect } from 'react'; + +export function useLogin() { + const { dispatch } = useContext(FormStateContext); + + function handleLogin(data: FormData) { + axios + .post('/login', data) + .then((res) => { + dispatch({ + payload: { + step: 'telegram', + user: res.data, + }, + type: 'set-step', + }); + }) + .catch(() => + dispatch({ + payload: { error: ERROR_INVALID_CREDENTIALS }, + type: 'set-error', + }) + ); + } + + return { handleLogin }; +} + +export function useTelegramLogin() { + const { dispatch } = useContext(FormStateContext); + + function handleTelegramLogin() { + axios + .post('/login-telegram') + .then(() => { + dispatch({ + payload: { + step: 'telegram-login', + }, + type: 'set-step', + }); + }) + .catch((error_) => { + let error = ERROR_SERVER; + + if (isAxiosError(error_) && error_.response?.data?.message) { + error = error_.response?.data?.message; + } + + return dispatch({ + payload: { error }, + type: 'set-error', + }); + }); + } + + return { handleTelegramLogin }; +} + +export function useTelegramConfirm() { + const { + dispatch, + state: { step }, + } = useContext(FormStateContext); + + const { socket } = useSocket(); + + useEffect(() => { + if (step === 'telegram-login') { + socket.open(); + socket.on('connect', () => {}); + + socket.on('auth-allow', () => { + socket.off('connect'); + axios + .get('/login-confirm') + .then(() => redirect()) + .catch(() => + dispatch({ + payload: { error: ERROR_SERVER }, + type: 'set-error', + }) + ); + }); + } + + return () => { + socket.off('connect'); + }; + }, [dispatch, socket, step]); +} diff --git a/apps/web/components/Form/hooks/token.ts b/apps/web/components/Form/hooks/token.ts new file mode 100644 index 0000000..057823c --- /dev/null +++ b/apps/web/components/Form/hooks/token.ts @@ -0,0 +1,28 @@ +import { redirect } from '@/components/Form/lib/utils'; +import { ERROR_SERVER } from '@/constants/errors'; +import { FormStateContext } from '@/context/form-state'; +import axios from 'axios'; +import { useContext, useEffect } from 'react'; + +export function useRefreshToken() { + const { + dispatch, + state: { step, user }, + } = useContext(FormStateContext); + + function handleRefreshToken() { + axios + .get('/refresh-token') + .then(() => redirect()) + .catch(() => + dispatch({ + payload: { error: ERROR_SERVER, user: undefined }, + type: 'set-error', + }) + ); + } + + useEffect(() => { + if (step === 'login' && user) handleRefreshToken(); + }, []); +} diff --git a/apps/web/components/Form/index.tsx b/apps/web/components/Form/index.tsx new file mode 100644 index 0000000..03f08ca --- /dev/null +++ b/apps/web/components/Form/index.tsx @@ -0,0 +1,2 @@ +export * from './default-form'; +export * from './telegram-form'; diff --git a/apps/web/components/Form/lib/buttons.module.scss b/apps/web/components/Form/lib/buttons.module.scss new file mode 100644 index 0000000..da4bfdf --- /dev/null +++ b/apps/web/components/Form/lib/buttons.module.scss @@ -0,0 +1,55 @@ +.button-submit { + display: flex; + justify-content: center; + align-items: center; +} + +.button-telegram { + @extend .button-submit; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + text-transform: none; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + + animation: colorTransition 1s cubic-bezier(0.16, 1, 0.3, 1) forwards; +} + +.button-telegram { + img { + margin: 0; + margin-right: 10px; + } +} + +@keyframes colorTransition { + 0% { + background-color: var(--color-primary); + } + 100% { + background-color: #54a9eb; + } +} + +.button-telegram-icon { + filter: brightness(0) invert(1); + margin: 0 !important; + margin-right: 13px !important; + margin-left: none !important; +} + +.spinner-icon { + filter: brightness(0) invert(1); + fill: var(--color-primary); + margin: 0 !important; + margin-right: 6px !important; +} + +.loading-wrapper { + display: flex; + justify-content: center; + align-items: center; +} diff --git a/apps/web/components/Form/lib/buttons.tsx b/apps/web/components/Form/lib/buttons.tsx new file mode 100644 index 0000000..2e17b24 --- /dev/null +++ b/apps/web/components/Form/lib/buttons.tsx @@ -0,0 +1,56 @@ +import styles from './buttons.module.scss'; +import Spinner from '@/public/assets/animated/90-ring.svg'; +import TelegramIcon from '@/public/assets/images/telegram.svg?url'; +import Image from 'next/image'; +import type { ButtonHTMLAttributes } from 'react'; + +type Props = ButtonHTMLAttributes; + +export function ButtonLogin(props: Props) { + return ( + + ); +} + +export function ButtonLoading(props: Props) { + return ( + + ); +} + +export function ButtonTelegram(props: Props) { + return ( + + ); +} + +export function ButtonTelegramLogin(props: Props) { + return ( + + ); +} diff --git a/apps/web/components/Form/lib/types.ts b/apps/web/components/Form/lib/types.ts new file mode 100644 index 0000000..3bede27 --- /dev/null +++ b/apps/web/components/Form/lib/types.ts @@ -0,0 +1,7 @@ +export type FormData = { + readonly login: string; + readonly password: string; +}; +export type FormProps = { + readonly onSubmit: (data: FormData) => void; +}; diff --git a/apps/web/components/Form/lib/utils.ts b/apps/web/components/Form/lib/utils.ts new file mode 100644 index 0000000..ad25982 --- /dev/null +++ b/apps/web/components/Form/lib/utils.ts @@ -0,0 +1,10 @@ +import { publicRuntimeConfig } from '@/config/runtime'; + +const { APP_BASE_PATH } = publicRuntimeConfig; + +export function redirect() { + const redirectUrl = + (window.location.pathname.replace(APP_BASE_PATH, '') || '/') + (window.location.search || ''); + + window.location.replace(redirectUrl); +} diff --git a/apps/web/components/Form/telegram-form.tsx b/apps/web/components/Form/telegram-form.tsx new file mode 100644 index 0000000..2b43c2b --- /dev/null +++ b/apps/web/components/Form/telegram-form.tsx @@ -0,0 +1,43 @@ +import { BaseForm } from './base-form'; +import { useLogin, useTelegramConfirm, useTelegramLogin } from './hooks/telegram'; +import { useRefreshToken } from './hooks/token'; +import { ButtonLoading, ButtonLogin, ButtonTelegram, ButtonTelegramLogin } from './lib/buttons'; +import { FormStateContext } from '@/context/form-state'; +import { useContext } from 'react'; + +export function TelegramForm() { + useRefreshToken(); + const { handleLogin } = useLogin(); + const { handleTelegramLogin } = useTelegramLogin(); + useTelegramConfirm(); + + const { + state: { step, user }, + } = useContext(FormStateContext); + + if (step === 'login' && user) { + return ; + } + + if (step === 'telegram') { + return ( + handleTelegramLogin()}> + Войти как  {user?.displayName} + + ); + } + + if (step === 'telegram-login') { + return ( + {}}> + + + ); + } + + return ( + handleLogin(data)}> + + + ); +} diff --git a/apps/web/components/Login.jsx b/apps/web/components/Login.jsx deleted file mode 100644 index e968933..0000000 --- a/apps/web/components/Login.jsx +++ /dev/null @@ -1,14 +0,0 @@ -import Form from './Form'; -import styles from './Login.module.scss'; -import Logo from '@/elements/Logo'; - -export default function Login() { - return ( -
-
- -
-
-
- ); -} diff --git a/apps/web/components/Login.module.scss b/apps/web/components/Login/Login.module.scss similarity index 90% rename from apps/web/components/Login.module.scss rename to apps/web/components/Login/Login.module.scss index 592ce35..4d02ecc 100644 --- a/apps/web/components/Login.module.scss +++ b/apps/web/components/Login/Login.module.scss @@ -22,12 +22,6 @@ $layout-breakpoint-desktop: 1680px; width: 100%; padding: 25px 10px; margin-bottom: 0; - - img { - display: block; - margin-left: auto; - margin-right: auto; - } } @media screen and (min-width: $layout-breakpoint-desktop) { diff --git a/apps/web/components/Login/index.jsx b/apps/web/components/Login/index.jsx new file mode 100644 index 0000000..ea75ba1 --- /dev/null +++ b/apps/web/components/Login/index.jsx @@ -0,0 +1,17 @@ +import styles from './Login.module.scss'; +import { Logo } from '@/elements'; +import dynamic from 'next/dynamic'; + +const DynamicDefaultForm = dynamic(() => import('../Form').then((m) => m.DefaultForm)); +const DynamicTelegramForm = dynamic(() => import('../Form').then((m) => m.TelegramForm)); + +export function Login({ tfa }) { + return ( +
+
+ + {tfa ? : } +
+
+ ); +} diff --git a/apps/web/components/index.js b/apps/web/components/index.js new file mode 100644 index 0000000..d64efa0 --- /dev/null +++ b/apps/web/components/index.js @@ -0,0 +1,2 @@ +export * from './Form'; +export * from './Login'; diff --git a/apps/web/config/schema/env.js b/apps/web/config/schema/env.js index 7fe7680..d0f8158 100644 --- a/apps/web/config/schema/env.js +++ b/apps/web/config/schema/env.js @@ -1,8 +1,10 @@ const { z } = require('zod'); const envSchema = z.object({ - APP_DESCRIPTION: z.string(), APP_BASE_PATH: z.string().optional().default(''), + APP_DESCRIPTION: z.string(), + TELEGRAM_BOT_URL: z.string(), + URL_API_CHECK_AUTH: z.string().default('http://auth_api:3001/check-auth'), }); module.exports = envSchema; diff --git a/apps/web/constants/errors.ts b/apps/web/constants/errors.ts new file mode 100644 index 0000000..ca53a64 --- /dev/null +++ b/apps/web/constants/errors.ts @@ -0,0 +1,2 @@ +export const ERROR_INVALID_CREDENTIALS = 'Неверный логин или пароль'; +export const ERROR_SERVER = 'Не удалось войти. Повторите попытку позже'; diff --git a/apps/web/context/form-state.tsx b/apps/web/context/form-state.tsx new file mode 100644 index 0000000..dbba47c --- /dev/null +++ b/apps/web/context/form-state.tsx @@ -0,0 +1,74 @@ +/* eslint-disable sonarjs/no-small-switch */ +import type { LdapUser } from '@/types/user'; +import type { PropsWithChildren } from 'react'; +import { createContext, useMemo, useReducer } from 'react'; + +type State = { + error: string | undefined; + step: 'login' | 'telegram' | 'telegram-login'; + user: LdapUser | undefined; +}; + +type Action = { + payload: Partial; + type: 'set-step' | 'set-error' | 'reset-error'; +}; + +const reducer = (state: State, action: Action): State => { + switch (action.type) { + case 'set-step': { + if (action.payload.step) + return { + ...state, + step: action.payload.step, + user: action.payload.user || state.user, + }; + + return state; + } + + case 'set-error': { + if (action.payload.error) { + return { + ...state, + error: action.payload.error, + }; + } + + return state; + } + + case 'reset-error': { + return { + ...state, + error: undefined, + }; + } + + default: + return state; + } +}; + +type Context = { + dispatch: React.Dispatch; + state: State; +}; + +export const FormStateContext = createContext({} as Context); + +type FormStateProviderProps = { + readonly user?: LdapUser; +} & PropsWithChildren; + +export function FormStateProvider({ children, user = undefined }: FormStateProviderProps) { + const [state, dispatch] = useReducer(reducer, { + error: undefined, + step: 'login', + user, + }); + + const value = useMemo(() => ({ dispatch, state }), [state]); + + return {children}; +} diff --git a/apps/web/elements/Button.tsx b/apps/web/elements/Button.tsx deleted file mode 100644 index df70352..0000000 --- a/apps/web/elements/Button.tsx +++ /dev/null @@ -1,12 +0,0 @@ -/* eslint-disable react/button-has-type */ -import styles from './Button.module.css'; - -type ButtonProps = JSX.IntrinsicElements['button']; - -export default function Button({ children, ...props }: ButtonProps) { - return ( - - ); -} diff --git a/apps/web/elements/Error.jsx b/apps/web/elements/Error.jsx deleted file mode 100644 index 9747204..0000000 --- a/apps/web/elements/Error.jsx +++ /dev/null @@ -1,5 +0,0 @@ -import styles from './Error.module.css'; - -export default function Error({ children }) { - return {children}; -} diff --git a/apps/web/elements/H.jsx b/apps/web/elements/H.jsx deleted file mode 100644 index db91642..0000000 --- a/apps/web/elements/H.jsx +++ /dev/null @@ -1,5 +0,0 @@ -import styles from './H.module.css'; - -export function H3({ children }) { - return

{children}

; -} diff --git a/apps/web/elements/Input.tsx b/apps/web/elements/Input.tsx deleted file mode 100644 index a16544a..0000000 --- a/apps/web/elements/Input.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import styles from './Input.module.css'; - -type InputProps = JSX.IntrinsicElements['input']; - -export default function Input(props: InputProps) { - return ; -} diff --git a/apps/web/elements/Logo.jsx b/apps/web/elements/Logo.jsx index f45e4e1..46e801c 100644 --- a/apps/web/elements/Logo.jsx +++ b/apps/web/elements/Logo.jsx @@ -1,6 +1,6 @@ import Image from 'next/image'; -import logo from 'public/assets/images/logo-primary.svg'; +import logo from 'public/assets/images/logo-primary.svg?url'; -export default function Logo() { - return logo; +export function Logo() { + return logo; } diff --git a/apps/web/elements/index.js b/apps/web/elements/index.js new file mode 100644 index 0000000..d97c695 --- /dev/null +++ b/apps/web/elements/index.js @@ -0,0 +1 @@ +export * from './Logo'; diff --git a/apps/web/next.config.js b/apps/web/next.config.js index fb01ebd..1e60f68 100644 --- a/apps/web/next.config.js +++ b/apps/web/next.config.js @@ -17,4 +17,29 @@ module.exports = { reactStrictMode: true, serverRuntimeConfig: runtimeConfig, swcMinify: true, + webpack(config) { + // Grab the existing rule that handles SVG imports + const fileLoaderRule = config.module.rules.find((rule) => rule.test?.test?.('.svg')); + + config.module.rules.push( + // Reapply the existing rule, but only for svg imports ending in ?url + { + ...fileLoaderRule, + test: /\.svg$/i, + resourceQuery: /url/, // *.svg?url + }, + // Convert all other *.svg imports to React components + { + test: /\.svg$/i, + issuer: fileLoaderRule.issuer, + resourceQuery: { not: [...fileLoaderRule.resourceQuery.not, /url/] }, // exclude if *.svg?url + use: ['@svgr/webpack'], + } + ); + + // Modify the file loader rule to ignore *.svg, since we have it handled now. + fileLoaderRule.exclude = /\.svg$/i; + + return config; + }, }; diff --git a/apps/web/package.json b/apps/web/package.json index 926abf1..48a5728 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -11,15 +11,19 @@ }, "dependencies": { "@fontsource/montserrat": "^5.0.13", + "@svgr/webpack": "^8.1.0", "@types/node": "^20.10.0", "@types/react": "^18.2.39", "@types/react-dom": "^18.2.17", "axios": "^1.5.1", "modern-normalize": "^2.0.0", "next": "^14.2.3", + "radash": "^11.0.0", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-hook-form": "^7.51.3", "sass": "^1.69.3", + "socket.io-client": "^4.7.5", "typescript": "5.3.2", "zod": "^3.22.4" }, diff --git a/apps/web/pages/account.jsx b/apps/web/pages/account.jsx new file mode 100644 index 0000000..82d31c4 --- /dev/null +++ b/apps/web/pages/account.jsx @@ -0,0 +1 @@ +export { default, getServerSideProps } from './ldap'; diff --git a/apps/web/pages/index.jsx b/apps/web/pages/index.jsx deleted file mode 100644 index f39e348..0000000 --- a/apps/web/pages/index.jsx +++ /dev/null @@ -1,23 +0,0 @@ -import Login from '@/components/Login'; -import { publicRuntimeConfig } from '@/config/runtime'; -import Head from 'next/head'; - -const { APP_DESCRIPTION } = publicRuntimeConfig; - -function PageHead() { - return ( - - {`Вход - ${APP_DESCRIPTION}`} - - - ); -} - -export default function Home() { - return ( - <> - - - - ); -} diff --git a/apps/web/pages/ldap-tfa.jsx b/apps/web/pages/ldap-tfa.jsx new file mode 100644 index 0000000..82d31c4 --- /dev/null +++ b/apps/web/pages/ldap-tfa.jsx @@ -0,0 +1 @@ +export { default, getServerSideProps } from './ldap'; diff --git a/apps/web/pages/ldap.jsx b/apps/web/pages/ldap.jsx new file mode 100644 index 0000000..cb2b62c --- /dev/null +++ b/apps/web/pages/ldap.jsx @@ -0,0 +1,52 @@ +import { Login } from '@/components'; +import { publicRuntimeConfig, serverRuntimeConfig } from '@/config/runtime'; +import { FormStateProvider } from '@/context/form-state'; +import axios from 'axios'; +import Head from 'next/head'; +import { pick } from 'radash'; + +const { URL_API_CHECK_AUTH } = serverRuntimeConfig; +const { APP_DESCRIPTION } = publicRuntimeConfig; + +export function PageHead() { + return ( + + {`Вход - ${APP_DESCRIPTION}`} + + + ); +} + +export default function Page(props) { + return ( + + + + + ); +} + +/** @type {import('next').GetServerSideProps} */ +export async function getServerSideProps({ req }) { + const headers = pick(req.headers, ['auth-mode', 'cookie', 'refresh-token']); + const tfa = headers['auth-mode'] === 'ldap-tfa'; + + try { + const { data: user } = await axios.get(URL_API_CHECK_AUTH, { + headers, + }); + + return { + props: { + tfa, + user, + }, + }; + } catch { + return { + props: { + tfa, + }, + }; + } +} diff --git a/apps/web/public/assets/animated/90-ring.svg b/apps/web/public/assets/animated/90-ring.svg new file mode 100644 index 0000000..74838c2 --- /dev/null +++ b/apps/web/public/assets/animated/90-ring.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/web/public/assets/images/telegram.svg b/apps/web/public/assets/images/telegram.svg new file mode 100644 index 0000000..20ac9b3 --- /dev/null +++ b/apps/web/public/assets/images/telegram.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/web/elements/Button.module.css b/apps/web/styles/button.css similarity index 74% rename from apps/web/elements/Button.module.css rename to apps/web/styles/button.css index 419bcd3..c5e07ae 100644 --- a/apps/web/elements/Button.module.css +++ b/apps/web/styles/button.css @@ -1,16 +1,22 @@ -.btn { - background-color: var(--color-primary); - font-family: Montserrat; +button { border: 0; + background-color: var(--color-primary); color: #fff; cursor: pointer; + font-family: Montserrat; font-size: 14px; font-weight: bold; - line-height: 2; + height: 40px; outline: 0; + outline: none; padding: 0.55rem 0.75rem; text-align: center; text-transform: uppercase; vertical-align: middle; width: 100%; } + +button:disabled { + opacity: 0.8; + cursor: not-allowed; +} diff --git a/apps/web/styles/colors.css b/apps/web/styles/colors.css new file mode 100644 index 0000000..1948da2 --- /dev/null +++ b/apps/web/styles/colors.css @@ -0,0 +1,3 @@ +.primary { + color: var(--color-primary); +} diff --git a/apps/web/elements/Error.module.css b/apps/web/styles/error.css similarity index 63% rename from apps/web/elements/Error.module.css rename to apps/web/styles/error.css index 396261e..445886c 100644 --- a/apps/web/elements/Error.module.css +++ b/apps/web/styles/error.css @@ -4,4 +4,7 @@ font-weight: bold; text-transform: uppercase; color: red; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; } diff --git a/apps/web/styles/globals.css b/apps/web/styles/globals.css index 4336cef..e414a92 100644 --- a/apps/web/styles/globals.css +++ b/apps/web/styles/globals.css @@ -1 +1,8 @@ @import 'node_modules/modern-normalize/modern-normalize.css'; +@import './input.css'; +@import './h.css'; +@import './error.css'; +@import './colors.css'; +@import './info.css'; +@import './logo.css'; +@import './button.css'; diff --git a/apps/web/elements/H.module.css b/apps/web/styles/h.css similarity index 95% rename from apps/web/elements/H.module.css rename to apps/web/styles/h.css index f244fec..421ea52 100644 --- a/apps/web/elements/H.module.css +++ b/apps/web/styles/h.css @@ -1,4 +1,4 @@ -.h3 { +h3 { color: var(--color-primary); font-family: Montserrat; font-weight: 700; diff --git a/apps/web/styles/info.css b/apps/web/styles/info.css new file mode 100644 index 0000000..d3c299a --- /dev/null +++ b/apps/web/styles/info.css @@ -0,0 +1,9 @@ +.info { + display: inline-block; + font-family: Montserrat; + font-size: smaller; + font-weight: bold; + text-transform: uppercase; + text-decoration: none; + color: var(--color-primary); +} diff --git a/apps/web/elements/Input.module.css b/apps/web/styles/input.css similarity index 65% rename from apps/web/elements/Input.module.css rename to apps/web/styles/input.css index 4b15105..fce6f5e 100644 --- a/apps/web/elements/Input.module.css +++ b/apps/web/styles/input.css @@ -1,6 +1,6 @@ -.input { +input { font-family: Montserrat; - border: 1px solid rgba(0,16,61,.12); + border: 1px solid rgba(0, 16, 61, 0.12); box-sizing: border-box; height: 40px; background: #fff; @@ -10,8 +10,13 @@ /* font-size: 15px; */ } -.input::placeholder { +input::placeholder { color: var(--color-primary); filter: brightness(0.25); opacity: 0.9; } + +input:disabled { + opacity: 0.8; + cursor: not-allowed; +} diff --git a/apps/web/styles/logo.css b/apps/web/styles/logo.css new file mode 100644 index 0000000..c5fa345 --- /dev/null +++ b/apps/web/styles/logo.css @@ -0,0 +1,5 @@ +.logo { + display: block; + margin-left: auto; + margin-right: auto; +} diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json index 47e1b0c..712bbb4 100644 --- a/apps/web/tsconfig.json +++ b/apps/web/tsconfig.json @@ -26,6 +26,6 @@ "@/*": ["*"] } }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "**/*.js", "**/*.jsx"], + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "**/*.js", "**/*.jsx", "types/svgr.d.ts"], "exclude": ["node_modules"] } diff --git a/apps/web/types/error.ts b/apps/web/types/error.ts new file mode 100644 index 0000000..4376bfe --- /dev/null +++ b/apps/web/types/error.ts @@ -0,0 +1,3 @@ +export type TelegramUrlResponse = { + message: string; +}; diff --git a/apps/web/types/svgr.d.ts b/apps/web/types/svgr.d.ts new file mode 100644 index 0000000..464f104 --- /dev/null +++ b/apps/web/types/svgr.d.ts @@ -0,0 +1,12 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +declare module '*.svg' { + import type { FC, SVGProps } from 'react'; + + const content: FC>; + export default content; +} + +declare module '*.svg?url' { + const content: any; + export default content; +} diff --git a/apps/web/types/user.ts b/apps/web/types/user.ts new file mode 100644 index 0000000..fe0abd0 --- /dev/null +++ b/apps/web/types/user.ts @@ -0,0 +1,9 @@ +export type LdapUser = { + department: string; + displayName: string; + domain: string; + domainName: string; + mail: string; + position: string; + username: string; +}; diff --git a/docker-compose.yml b/docker-compose.yml index 9c5ee6a..38dea27 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,8 +3,16 @@ version: '3' services: auth_web: build: + args: + - APP_BASE_PATH=${APP_BASE_PATH} + - APP_DESCRIPTION=${APP_DESCRIPTION} + - TELEGRAM_BOT_URL=${TELEGRAM_BOT_URL} context: . dockerfile: ./apps/web/Dockerfile + environment: + - APP_BASE_PATH=${APP_BASE_PATH} + - APP_DESCRIPTION=${APP_DESCRIPTION} + - TELEGRAM_BOT_URL=${TELEGRAM_BOT_URL} restart: always networks: - auth_network @@ -27,6 +35,9 @@ services: - COOKIE_TOKEN_MAX_AGE=${COOKIE_TOKEN_MAX_AGE} - REDIS_HOST=redis - MONGO_HOST=mongo + - TELEGRAM_URL_SEND_AUTH_MESSAGE=${TELEGRAM_URL_SEND_AUTH_MESSAGE} + - TELEGRAM_URL_SEND_AUTH_LOGIN=${TELEGRAM_URL_SEND_AUTH_LOGIN} + - TELEGRAM_URL_SEND_AUTH_PASSWORD=${TELEGRAM_URL_SEND_AUTH_PASSWORD} restart: always networks: - auth_network diff --git a/package.json b/package.json index 62d7973..9a8c2ba 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "devDependencies": { "dotenv-cli": "^7.3.0", "prettier": "latest", - "turbo": "latest" + "turbo": "^1.12.4" }, "packageManager": "pnpm@8.9.0", "engines": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 34d8545..fc63e24 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,8 +15,8 @@ importers: specifier: latest version: 3.1.0 turbo: - specifier: latest - version: 1.10.16 + specifier: ^1.12.4 + version: 1.13.4 apps/api: dependencies: @@ -40,7 +40,7 @@ importers: version: 3.1.1(@nestjs/common@10.2.10)(reflect-metadata@0.1.13) '@nestjs/core': specifier: ^10.2.7 - version: 10.2.10(@nestjs/common@10.2.10)(@nestjs/platform-express@10.2.10)(reflect-metadata@0.1.13)(rxjs@7.8.1) + version: 10.2.10(@nestjs/common@10.2.10)(@nestjs/websockets@10.3.10)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nestjs/jwt': specifier: ^10.1.1 version: 10.2.0(@nestjs/common@10.2.10) @@ -50,15 +50,21 @@ importers: '@nestjs/mongoose': specifier: ^10.0.1 version: 10.0.2(@nestjs/common@10.2.10)(@nestjs/core@10.2.10)(mongoose@7.6.6)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/platform-express': - specifier: ^10.2.7 - version: 10.2.10(@nestjs/common@10.2.10)(@nestjs/core@10.2.10) '@nestjs/platform-fastify': specifier: ^10.2.7 version: 10.2.10(@fastify/static@6.12.0)(@nestjs/common@10.2.10)(@nestjs/core@10.2.10) + '@nestjs/platform-socket.io': + specifier: ^10.3.8 + version: 10.3.10(@nestjs/common@10.2.10)(@nestjs/websockets@10.3.10)(rxjs@7.8.1) '@nestjs/swagger': specifier: ^7.1.14 version: 7.1.16(@fastify/static@6.12.0)(@nestjs/common@10.2.10)(@nestjs/core@10.2.10)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13) + '@nestjs/websockets': + specifier: ^10.3.8 + version: 10.3.10(@nestjs/common@10.2.10)(@nestjs/core@10.2.10)(@nestjs/platform-socket.io@10.3.10)(reflect-metadata@0.1.13)(rxjs@7.8.1) + axios: + specifier: ^1.5.1 + version: 1.6.2 bcrypt: specifier: ^5.1.1 version: 5.1.1 @@ -92,6 +98,9 @@ importers: rxjs: specifier: ^7.8.1 version: 7.8.1 + socket.io: + specifier: ^4.7.5 + version: 4.7.5 zod: specifier: ^3.22.4 version: 3.22.4 @@ -101,7 +110,7 @@ importers: version: 10.0.3(typescript@5.3.2) '@nestjs/testing': specifier: ^10.2.7 - version: 10.2.10(@nestjs/common@10.2.10)(@nestjs/core@10.2.10)(@nestjs/platform-express@10.2.10) + version: 10.2.10(@nestjs/common@10.2.10)(@nestjs/core@10.2.10) '@types/bcrypt': specifier: ^5.0.1 version: 5.0.2 @@ -130,7 +139,7 @@ importers: specifier: ^8.51.0 version: 8.54.0 fastify: - specifier: ^4.24.3 + specifier: 4.24.3 version: 4.24.3 jest: specifier: 29.7.0 @@ -165,6 +174,9 @@ importers: '@fontsource/montserrat': specifier: ^5.0.13 version: 5.0.15 + '@svgr/webpack': + specifier: ^8.1.0 + version: 8.1.0(typescript@5.3.2) '@types/node': specifier: ^20.10.0 version: 20.10.0 @@ -182,16 +194,25 @@ importers: version: 2.0.0 next: specifier: ^14.2.3 - version: 14.2.3(@babel/core@7.23.3)(react-dom@18.2.0)(react@18.2.0)(sass@1.69.5) + version: 14.2.5(@babel/core@7.23.3)(react-dom@18.2.0)(react@18.2.0)(sass@1.69.5) + radash: + specifier: ^11.0.0 + version: 11.0.0 react: specifier: ^18.2.0 version: 18.2.0 react-dom: specifier: ^18.2.0 version: 18.2.0(react@18.2.0) + react-hook-form: + specifier: ^7.51.3 + version: 7.52.1(react@18.2.0) sass: specifier: ^1.69.3 version: 1.69.5 + socket.io-client: + specifier: ^4.7.5 + version: 4.7.5 typescript: specifier: 5.3.2 version: 5.3.2 @@ -201,7 +222,7 @@ importers: devDependencies: '@vchikalkin/eslint-config-awesome': specifier: ^1.1.6 - version: 1.1.6(@babel/eslint-plugin@7.22.10)(@babel/plugin-syntax-flow@7.23.3)(@babel/plugin-transform-react-jsx@7.23.4)(@types/node@20.10.0)(eslint-plugin-import@2.29.0)(eslint@8.54.0)(graphql@16.8.1)(prettier@3.2.5)(typescript@5.3.2) + version: 1.1.6(@babel/eslint-plugin@7.22.10)(@babel/plugin-syntax-flow@7.23.3)(@babel/plugin-transform-react-jsx@7.23.4)(@types/node@20.10.0)(eslint-plugin-import@2.29.0)(eslint@8.54.0)(graphql@16.8.1)(prettier@3.3.3)(typescript@5.3.2) eslint: specifier: ^8.51.0 version: 8.54.0 @@ -280,10 +301,23 @@ packages: '@babel/highlight': 7.23.4 chalk: 2.4.2 + /@babel/code-frame@7.24.7: + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.24.7 + picocolors: 1.0.0 + dev: false + /@babel/compat-data@7.23.3: resolution: {integrity: sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==} engines: {node: '>=6.9.0'} + /@babel/compat-data@7.24.8: + resolution: {integrity: sha512-c4IM7OTg6k1Q+AJ153e2mc2QVTezTwnb4VzquwcyiEzGnW0Kedv4do/TrkU98qPeC5LNiMt/QXwIjzYXLBpyZg==} + engines: {node: '>=6.9.0'} + dev: false + /@babel/core@7.23.3: resolution: {integrity: sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==} engines: {node: '>=6.9.0'} @@ -341,6 +375,16 @@ packages: '@jridgewell/trace-mapping': 0.3.20 jsesc: 2.5.2 + /@babel/generator@7.24.8: + resolution: {integrity: sha512-47DG+6F5SzOi0uEvK4wMShmn5yY0mVjVJoWTphdY2B4Rx9wHgjK7Yhtr0ru6nE+sn0v38mzrWOlah0p/YlHHOQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.8 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + dev: false + /@babel/helper-annotate-as-pure@7.22.5: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} @@ -348,6 +392,23 @@ packages: '@babel/types': 7.23.4 dev: true + /@babel/helper-annotate-as-pure@7.24.7: + resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.8 + dev: false + + /@babel/helper-builder-binary-assignment-operator-visitor@7.24.7: + resolution: {integrity: sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.24.8 + '@babel/types': 7.24.8 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/helper-compilation-targets@7.22.15: resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} engines: {node: '>=6.9.0'} @@ -358,10 +419,75 @@ packages: lru-cache: 5.1.1 semver: 6.3.1 + /@babel/helper-compilation-targets@7.24.8: + resolution: {integrity: sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.24.8 + '@babel/helper-validator-option': 7.24.8 + browserslist: 4.23.2 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: false + + /@babel/helper-create-class-features-plugin@7.24.8(@babel/core@7.23.3): + resolution: {integrity: sha512-4f6Oqnmyp2PP3olgUMmOwC3akxSm5aBYraQ6YDdKy7NcAMkDECHWG0DEnV6M2UAkERgIBhYt8S27rURPg7SxWA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-function-name': 7.24.7 + '@babel/helper-member-expression-to-functions': 7.24.8 + '@babel/helper-optimise-call-expression': 7.24.7 + '@babel/helper-replace-supers': 7.24.7(@babel/core@7.23.3) + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/helper-create-regexp-features-plugin@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-annotate-as-pure': 7.24.7 + regexpu-core: 5.3.2 + semver: 6.3.1 + dev: false + + /@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.23.3): + resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-compilation-targets': 7.24.8 + '@babel/helper-plugin-utils': 7.24.8 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/helper-environment-visitor@7.22.20: resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} engines: {node: '>=6.9.0'} + /@babel/helper-environment-visitor@7.24.7: + resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.8 + dev: false + /@babel/helper-function-name@7.23.0: resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} engines: {node: '>=6.9.0'} @@ -369,18 +495,53 @@ packages: '@babel/template': 7.22.15 '@babel/types': 7.23.4 + /@babel/helper-function-name@7.24.7: + resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.24.7 + '@babel/types': 7.24.8 + dev: false + /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.4 + /@babel/helper-hoist-variables@7.24.7: + resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.8 + dev: false + + /@babel/helper-member-expression-to-functions@7.24.8: + resolution: {integrity: sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.24.8 + '@babel/types': 7.24.8 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/helper-module-imports@7.22.15: resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.4 + /@babel/helper-module-imports@7.24.7: + resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.24.8 + '@babel/types': 7.24.8 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.3): resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} engines: {node: '>=6.9.0'} @@ -394,10 +555,65 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.20 + /@babel/helper-module-transforms@7.24.8(@babel/core@7.23.3): + resolution: {integrity: sha512-m4vWKVqvkVAWLXfHCCfff2luJj86U+J0/x+0N3ArG/tP0Fq7zky2dYwMbtPmkc/oulkkbjdL3uWzuoBwQ8R00Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/helper-optimise-call-expression@7.24.7: + resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.8 + dev: false + /@babel/helper-plugin-utils@7.22.5: resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} engines: {node: '>=6.9.0'} - dev: true + + /@babel/helper-plugin-utils@7.24.8: + resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-remap-async-to-generator@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-wrap-function': 7.24.7 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/helper-replace-supers@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-member-expression-to-functions': 7.24.8 + '@babel/helper-optimise-call-expression': 7.24.7 + transitivePeerDependencies: + - supports-color + dev: false /@babel/helper-simple-access@7.22.5: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} @@ -405,24 +621,78 @@ packages: dependencies: '@babel/types': 7.23.4 + /@babel/helper-simple-access@7.24.7: + resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.24.8 + '@babel/types': 7.24.8 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/helper-skip-transparent-expression-wrappers@7.24.7: + resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.24.8 + '@babel/types': 7.24.8 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/helper-split-export-declaration@7.22.6: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.4 + /@babel/helper-split-export-declaration@7.24.7: + resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.8 + dev: false + /@babel/helper-string-parser@7.23.4: resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} engines: {node: '>=6.9.0'} + /@babel/helper-string-parser@7.24.8: + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} + engines: {node: '>=6.9.0'} + dev: false + /@babel/helper-validator-identifier@7.22.20: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} + /@babel/helper-validator-identifier@7.24.7: + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + engines: {node: '>=6.9.0'} + dev: false + /@babel/helper-validator-option@7.22.15: resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} engines: {node: '>=6.9.0'} + /@babel/helper-validator-option@7.24.8: + resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-wrap-function@7.24.7: + resolution: {integrity: sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-function-name': 7.24.7 + '@babel/template': 7.24.7 + '@babel/traverse': 7.24.8 + '@babel/types': 7.24.8 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/helpers@7.23.4: resolution: {integrity: sha512-HfcMizYz10cr3h29VqyfGL6ZWIjTwWfvYBMsBVGwpcbhNGe3wQ1ZXZRPzZoAHhd9OqHadHqjQ89iVKINXnbzuw==} engines: {node: '>=6.9.0'} @@ -441,6 +711,16 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 + /@babel/highlight@7.24.7: + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.24.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.0 + dev: false + /@babel/parser@7.23.4: resolution: {integrity: sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ==} engines: {node: '>=6.0.0'} @@ -448,6 +728,69 @@ packages: dependencies: '@babel/types': 7.23.4 + /@babel/parser@7.24.8: + resolution: {integrity: sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.24.8 + dev: false + + /@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + dev: false + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + dev: false + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.23.3) + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + dev: false + + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.3): + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + dev: false + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.3): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: @@ -455,7 +798,6 @@ packages: dependencies: '@babel/core': 7.23.3 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.3): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} @@ -473,7 +815,34 @@ packages: dependencies: '@babel/core': 7.23.3 '@babel/helper-plugin-utils': 7.22.5 - dev: true + + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.3): + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + dev: false + + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.3): + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + dev: false + + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.3): + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + dev: false /@babel/plugin-syntax-flow@7.23.3(@babel/core@7.23.3): resolution: {integrity: sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==} @@ -495,6 +864,26 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-import-assertions@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + dev: false + + /@babel/plugin-syntax-import-attributes@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + dev: false + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.3): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: @@ -502,7 +891,6 @@ packages: dependencies: '@babel/core': 7.23.3 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.3): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} @@ -511,7 +899,6 @@ packages: dependencies: '@babel/core': 7.23.3 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.3): resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} @@ -523,6 +910,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + dev: false + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.3): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: @@ -530,7 +927,6 @@ packages: dependencies: '@babel/core': 7.23.3 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.3): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} @@ -539,7 +935,6 @@ packages: dependencies: '@babel/core': 7.23.3 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.3): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} @@ -548,7 +943,6 @@ packages: dependencies: '@babel/core': 7.23.3 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.3): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} @@ -557,7 +951,6 @@ packages: dependencies: '@babel/core': 7.23.3 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.3): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} @@ -566,7 +959,6 @@ packages: dependencies: '@babel/core': 7.23.3 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.3): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} @@ -575,7 +967,16 @@ packages: dependencies: '@babel/core': 7.23.3 '@babel/helper-plugin-utils': 7.22.5 - dev: true + + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.3): + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + dev: false /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.3): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} @@ -585,7 +986,6 @@ packages: dependencies: '@babel/core': 7.23.3 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.3): resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} @@ -597,6 +997,505 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + dev: false + + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.3): + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.23.3) + '@babel/helper-plugin-utils': 7.24.8 + dev: false + + /@babel/plugin-transform-arrow-functions@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + dev: false + + /@babel/plugin-transform-async-generator-functions@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-remap-async-to-generator': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.3) + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-async-to-generator@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-remap-async-to-generator': 7.24.7(@babel/core@7.23.3) + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-block-scoped-functions@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + dev: false + + /@babel/plugin-transform-block-scoping@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + dev: false + + /@babel/plugin-transform-class-properties@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-create-class-features-plugin': 7.24.8(@babel/core@7.23.3) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-class-static-block@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-create-class-features-plugin': 7.24.8(@babel/core@7.23.3) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.3) + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-classes@7.24.8(@babel/core@7.23.3): + resolution: {integrity: sha512-VXy91c47uujj758ud9wx+OMgheXm4qJfyhj1P18YvlrQkNOSrwsteHk+EFS3OMGfhMhpZa0A+81eE7G4QC+3CA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-compilation-targets': 7.24.8 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-function-name': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-replace-supers': 7.24.7(@babel/core@7.23.3) + '@babel/helper-split-export-declaration': 7.24.7 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-computed-properties@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/template': 7.24.7 + dev: false + + /@babel/plugin-transform-destructuring@7.24.8(@babel/core@7.23.3): + resolution: {integrity: sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + dev: false + + /@babel/plugin-transform-dotall-regex@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.23.3) + '@babel/helper-plugin-utils': 7.24.8 + dev: false + + /@babel/plugin-transform-duplicate-keys@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + dev: false + + /@babel/plugin-transform-dynamic-import@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.3) + dev: false + + /@babel/plugin-transform-exponentiation-operator@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-export-namespace-from@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.3) + dev: false + + /@babel/plugin-transform-for-of@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-function-name@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-compilation-targets': 7.24.8 + '@babel/helper-function-name': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + dev: false + + /@babel/plugin-transform-json-strings@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.3) + dev: false + + /@babel/plugin-transform-literals@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + dev: false + + /@babel/plugin-transform-logical-assignment-operators@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.3) + dev: false + + /@babel/plugin-transform-member-expression-literals@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + dev: false + + /@babel/plugin-transform-modules-amd@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-module-transforms': 7.24.8(@babel/core@7.23.3) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-modules-commonjs@7.24.8(@babel/core@7.23.3): + resolution: {integrity: sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-module-transforms': 7.24.8(@babel/core@7.23.3) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-simple-access': 7.24.7 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-modules-systemjs@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-hoist-variables': 7.24.7 + '@babel/helper-module-transforms': 7.24.8(@babel/core@7.23.3) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-modules-umd@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-module-transforms': 7.24.8(@babel/core@7.23.3) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-named-capturing-groups-regex@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.23.3) + '@babel/helper-plugin-utils': 7.24.8 + dev: false + + /@babel/plugin-transform-new-target@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + dev: false + + /@babel/plugin-transform-nullish-coalescing-operator@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.3) + dev: false + + /@babel/plugin-transform-numeric-separator@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.3) + dev: false + + /@babel/plugin-transform-object-rest-spread@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-compilation-targets': 7.24.8 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.3) + '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.23.3) + dev: false + + /@babel/plugin-transform-object-super@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-replace-supers': 7.24.7(@babel/core@7.23.3) + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-optional-catch-binding@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.3) + dev: false + + /@babel/plugin-transform-optional-chaining@7.24.8(@babel/core@7.23.3): + resolution: {integrity: sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.3) + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-parameters@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + dev: false + + /@babel/plugin-transform-private-methods@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-create-class-features-plugin': 7.24.8(@babel/core@7.23.3) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-private-property-in-object@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.24.8(@babel/core@7.23.3) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.3) + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-property-literals@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + dev: false + + /@babel/plugin-transform-react-constant-elements@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-7LidzZfUXyfZ8/buRW6qIIHBY8wAZ1OrY9c/wTr8YhZ6vMPo+Uc/CVFLYY1spZrEQlD4w5u8wjqk5NQ3OVqQKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + dev: false + + /@babel/plugin-transform-react-display-name@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + dev: false + + /@babel/plugin-transform-react-jsx-development@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/plugin-transform-react-jsx': 7.24.7(@babel/core@7.23.3) + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.23.3): resolution: {integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==} engines: {node: '>=6.9.0'} @@ -611,6 +1510,305 @@ packages: '@babel/types': 7.23.4 dev: true + /@babel/plugin-transform-react-jsx@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.23.3) + '@babel/types': 7.24.8 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-react-pure-annotations@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + dev: false + + /@babel/plugin-transform-regenerator@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + regenerator-transform: 0.15.2 + dev: false + + /@babel/plugin-transform-reserved-words@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + dev: false + + /@babel/plugin-transform-shorthand-properties@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + dev: false + + /@babel/plugin-transform-spread@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-sticky-regex@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + dev: false + + /@babel/plugin-transform-template-literals@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + dev: false + + /@babel/plugin-transform-typeof-symbol@7.24.8(@babel/core@7.23.3): + resolution: {integrity: sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + dev: false + + /@babel/plugin-transform-typescript@7.24.8(@babel/core@7.23.3): + resolution: {integrity: sha512-CgFgtN61BbdOGCP4fLaAMOPkzWUh6yQZNMr5YSt8uz2cZSSiQONCQFWqsE4NeVfOIhqDOlS9CR3WD91FzMeB2Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.24.8(@babel/core@7.23.3) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.23.3) + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-unicode-escapes@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + dev: false + + /@babel/plugin-transform-unicode-property-regex@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.23.3) + '@babel/helper-plugin-utils': 7.24.8 + dev: false + + /@babel/plugin-transform-unicode-regex@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.23.3) + '@babel/helper-plugin-utils': 7.24.8 + dev: false + + /@babel/plugin-transform-unicode-sets-regex@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.23.3) + '@babel/helper-plugin-utils': 7.24.8 + dev: false + + /@babel/preset-env@7.24.8(@babel/core@7.23.3): + resolution: {integrity: sha512-vObvMZB6hNWuDxhSaEPTKCwcqkAIuDtE+bQGn4XMXne1DSLzFVY8Vmj1bm+mUQXYNN8NmaQEO+r8MMbzPr1jBQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.24.8 + '@babel/core': 7.23.3 + '@babel/helper-compilation-targets': 7.24.8 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-option': 7.24.8 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.3) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.3) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.3) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.3) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.3) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.3) + '@babel/plugin-syntax-import-assertions': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-syntax-import-attributes': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.3) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.3) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.3) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.3) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.3) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.3) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.3) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.3) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.3) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.3) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.23.3) + '@babel/plugin-transform-arrow-functions': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-async-generator-functions': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-async-to-generator': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-block-scoped-functions': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-block-scoping': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-class-properties': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-class-static-block': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-classes': 7.24.8(@babel/core@7.23.3) + '@babel/plugin-transform-computed-properties': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-destructuring': 7.24.8(@babel/core@7.23.3) + '@babel/plugin-transform-dotall-regex': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-duplicate-keys': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-dynamic-import': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-exponentiation-operator': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-export-namespace-from': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-for-of': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-function-name': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-json-strings': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-literals': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-logical-assignment-operators': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-member-expression-literals': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-modules-amd': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.23.3) + '@babel/plugin-transform-modules-systemjs': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-modules-umd': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-named-capturing-groups-regex': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-new-target': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-nullish-coalescing-operator': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-numeric-separator': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-object-rest-spread': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-object-super': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-optional-catch-binding': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.23.3) + '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-private-methods': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-private-property-in-object': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-property-literals': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-regenerator': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-reserved-words': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-shorthand-properties': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-spread': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-sticky-regex': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-template-literals': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-typeof-symbol': 7.24.8(@babel/core@7.23.3) + '@babel/plugin-transform-unicode-escapes': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-unicode-property-regex': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-unicode-regex': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-unicode-sets-regex': 7.24.7(@babel/core@7.23.3) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.3) + babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.23.3) + babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.23.3) + babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.23.3) + core-js-compat: 3.37.1 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.3): + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/types': 7.23.4 + esutils: 2.0.3 + dev: false + + /@babel/preset-react@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-option': 7.24.8 + '@babel/plugin-transform-react-display-name': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-react-jsx': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-react-jsx-development': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-react-pure-annotations': 7.24.7(@babel/core@7.23.3) + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/preset-typescript@7.24.7(@babel/core@7.23.3): + resolution: {integrity: sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-option': 7.24.8 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.23.3) + '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.23.3) + '@babel/plugin-transform-typescript': 7.24.8(@babel/core@7.23.3) + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/regjsgen@0.8.0: + resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} + dev: false + /@babel/runtime-corejs3@7.23.4: resolution: {integrity: sha512-zQyB4MJGM+rvd4pM58n26kf3xbiitw9MHzL8oLiBMKb8MCtVDfV5nDzzJWWzLMtbvKI9wN6XwJYl479qF4JluQ==} engines: {node: '>=6.9.0'} @@ -624,7 +1822,6 @@ packages: engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.0 - dev: true /@babel/template@7.22.15: resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} @@ -634,6 +1831,15 @@ packages: '@babel/parser': 7.23.4 '@babel/types': 7.23.4 + /@babel/template@7.24.7: + resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.24.8 + '@babel/types': 7.24.8 + dev: false + /@babel/traverse@7.23.4: resolution: {integrity: sha512-IYM8wSUwunWTB6tFC2dkKZhxbIjHoWemdK+3f8/wq8aKhbUscxD5MX72ubd90fxvFknaLPeGw5ycU84V1obHJg==} engines: {node: '>=6.9.0'} @@ -651,6 +1857,24 @@ packages: transitivePeerDependencies: - supports-color + /@babel/traverse@7.24.8: + resolution: {integrity: sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.24.8 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-function-name': 7.24.7 + '@babel/helper-hoist-variables': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/parser': 7.24.8 + '@babel/types': 7.24.8 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/types@7.23.4: resolution: {integrity: sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==} engines: {node: '>=6.9.0'} @@ -659,6 +1883,15 @@ packages: '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 + /@babel/types@7.24.8: + resolution: {integrity: sha512-SkSBEHwwJRU52QEVZBmMBnE5Ux2/6WU1grdYyOhpbCNxbmJrDuDCphBzKZSO3taf0zztp+qkWlymE5tVL5l0TA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + dev: false + /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true @@ -1351,6 +2584,15 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.20 + /@jridgewell/gen-mapping@0.3.5: + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + dev: false + /@jridgewell/resolve-uri@3.1.1: resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} engines: {node: '>=6.0.0'} @@ -1359,6 +2601,11 @@ packages: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} + /@jridgewell/set-array@1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + dev: false + /@jridgewell/source-map@0.3.5: resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} dependencies: @@ -1374,6 +2621,13 @@ packages: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 + /@jridgewell/trace-mapping@0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: false + /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: @@ -1426,7 +2680,7 @@ packages: rxjs: ^7.0.0 dependencies: '@nestjs/common': 10.2.10(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.2.10(@nestjs/common@10.2.10)(@nestjs/platform-express@10.2.10)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.2.10(@nestjs/common@10.2.10)(@nestjs/websockets@10.3.10)(reflect-metadata@0.1.13)(rxjs@7.8.1) cache-manager: 5.3.1 reflect-metadata: 0.1.13 rxjs: 7.8.1 @@ -1509,7 +2763,7 @@ packages: uuid: 9.0.0 dev: false - /@nestjs/core@10.2.10(@nestjs/common@10.2.10)(@nestjs/platform-express@10.2.10)(reflect-metadata@0.1.13)(rxjs@7.8.1): + /@nestjs/core@10.2.10(@nestjs/common@10.2.10)(@nestjs/websockets@10.3.10)(reflect-metadata@0.1.13)(rxjs@7.8.1): resolution: {integrity: sha512-+ckOI6BPi2ZMHikT9MCG4ctHDc4OnjhoIytrn7f2AYMMXI4bnutJhqyQKc30VDka5x3Wq6QAD57pgSP7y+JjJg==} requiresBuild: true peerDependencies: @@ -1528,7 +2782,7 @@ packages: optional: true dependencies: '@nestjs/common': 10.2.10(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/platform-express': 10.2.10(@nestjs/common@10.2.10)(@nestjs/core@10.2.10) + '@nestjs/websockets': 10.3.10(@nestjs/common@10.2.10)(@nestjs/core@10.2.10)(@nestjs/platform-socket.io@10.3.10)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nuxtjs/opencollective': 0.3.2 fast-safe-stringify: 2.1.1 iterare: 1.2.1 @@ -1598,28 +2852,12 @@ packages: rxjs: ^7.0.0 dependencies: '@nestjs/common': 10.2.10(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.2.10(@nestjs/common@10.2.10)(@nestjs/platform-express@10.2.10)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.2.10(@nestjs/common@10.2.10)(@nestjs/websockets@10.3.10)(reflect-metadata@0.1.13)(rxjs@7.8.1) mongoose: 7.6.6 reflect-metadata: 0.1.13 rxjs: 7.8.1 dev: false - /@nestjs/platform-express@10.2.10(@nestjs/common@10.2.10)(@nestjs/core@10.2.10): - resolution: {integrity: sha512-U4KDgtMjH8TqEvt0RzC/POP8ABvL9bYoCScvlGtFSKgVGaMLBKkZ4+jHtbQx6qItYSlBBRUuz/dveMZCObfrkQ==} - peerDependencies: - '@nestjs/common': ^10.0.0 - '@nestjs/core': ^10.0.0 - dependencies: - '@nestjs/common': 10.2.10(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.2.10(@nestjs/common@10.2.10)(@nestjs/platform-express@10.2.10)(reflect-metadata@0.1.13)(rxjs@7.8.1) - body-parser: 1.20.2 - cors: 2.8.5 - express: 4.18.2 - multer: 1.4.4-lts.1 - tslib: 2.6.2 - transitivePeerDependencies: - - supports-color - /@nestjs/platform-fastify@10.2.10(@fastify/static@6.12.0)(@nestjs/common@10.2.10)(@nestjs/core@10.2.10): resolution: {integrity: sha512-OGxoLC3mjTPdreE3ooHg6AyXMYdz8m/LDWKr6cssONM5ohtMNcSeexHBFeSx+K4XDyDT3GkspHK+2CSFcphDeA==} peerDependencies: @@ -1638,7 +2876,7 @@ packages: '@fastify/middie': 8.3.0 '@fastify/static': 6.12.0 '@nestjs/common': 10.2.10(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.2.10(@nestjs/common@10.2.10)(@nestjs/platform-express@10.2.10)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.2.10(@nestjs/common@10.2.10)(@nestjs/websockets@10.3.10)(reflect-metadata@0.1.13)(rxjs@7.8.1) fastify: 4.24.3 light-my-request: 5.11.0 path-to-regexp: 3.2.0 @@ -1647,6 +2885,23 @@ packages: - supports-color dev: false + /@nestjs/platform-socket.io@10.3.10(@nestjs/common@10.2.10)(@nestjs/websockets@10.3.10)(rxjs@7.8.1): + resolution: {integrity: sha512-LRd+nGWhUu9hND1txCLPZd78Hea+qKJVENb+c9aDU04T24GRjsInDF2RANMR16JLQFcI9mclktDWX4plE95SHg==} + peerDependencies: + '@nestjs/common': ^10.0.0 + '@nestjs/websockets': ^10.0.0 + rxjs: ^7.1.0 + dependencies: + '@nestjs/common': 10.2.10(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/websockets': 10.3.10(@nestjs/common@10.2.10)(@nestjs/core@10.2.10)(@nestjs/platform-socket.io@10.3.10)(reflect-metadata@0.1.13)(rxjs@7.8.1) + rxjs: 7.8.1 + socket.io: 4.7.5 + tslib: 2.6.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + /@nestjs/schematics@10.0.3(chokidar@3.5.3)(typescript@5.2.2): resolution: {integrity: sha512-2BRujK0GqGQ7j1Zpz+obVfskDnnOeVKt5aXoSaVngKo8Oczy8uYCY+R547TQB+Kf35epdfFER2pVnQrX3/It5A==} peerDependencies: @@ -1696,7 +2951,7 @@ packages: dependencies: '@fastify/static': 6.12.0 '@nestjs/common': 10.2.10(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.2.10(@nestjs/common@10.2.10)(@nestjs/platform-express@10.2.10)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.2.10(@nestjs/common@10.2.10)(@nestjs/websockets@10.3.10)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nestjs/mapped-types': 2.0.3(@nestjs/common@10.2.10)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13) class-transformer: 0.5.1 class-validator: 0.14.0 @@ -1707,7 +2962,7 @@ packages: swagger-ui-dist: 5.9.1 dev: false - /@nestjs/testing@10.2.10(@nestjs/common@10.2.10)(@nestjs/core@10.2.10)(@nestjs/platform-express@10.2.10): + /@nestjs/testing@10.2.10(@nestjs/common@10.2.10)(@nestjs/core@10.2.10): resolution: {integrity: sha512-IVLUnPz/+fkBtPATYfqTIP+phN9yjkXejmj+JyhmcfPJZpxBmD1i9VSMqa4u54l37j0xkGPscQ0IXpbhqMYUKw==} peerDependencies: '@nestjs/common': ^10.0.0 @@ -1721,13 +2976,33 @@ packages: optional: true dependencies: '@nestjs/common': 10.2.10(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.2.10(@nestjs/common@10.2.10)(@nestjs/platform-express@10.2.10)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/platform-express': 10.2.10(@nestjs/common@10.2.10)(@nestjs/core@10.2.10) + '@nestjs/core': 10.2.10(@nestjs/common@10.2.10)(@nestjs/websockets@10.3.10)(reflect-metadata@0.1.13)(rxjs@7.8.1) tslib: 2.6.2 dev: true - /@next/env@14.2.3: - resolution: {integrity: sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA==} + /@nestjs/websockets@10.3.10(@nestjs/common@10.2.10)(@nestjs/core@10.2.10)(@nestjs/platform-socket.io@10.3.10)(reflect-metadata@0.1.13)(rxjs@7.8.1): + resolution: {integrity: sha512-F/fhAC0ylAhjfCZj4Xrgc0yTJ/qltooDCa+fke7BFZLofLmE0yj7WzBVrBHsk/46kppyRcs5XrYjIQLqcDze8g==} + peerDependencies: + '@nestjs/common': ^10.0.0 + '@nestjs/core': ^10.0.0 + '@nestjs/platform-socket.io': ^10.0.0 + reflect-metadata: ^0.1.12 || ^0.2.0 + rxjs: ^7.1.0 + peerDependenciesMeta: + '@nestjs/platform-socket.io': + optional: true + dependencies: + '@nestjs/common': 10.2.10(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.2.10(@nestjs/common@10.2.10)(@nestjs/websockets@10.3.10)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/platform-socket.io': 10.3.10(@nestjs/common@10.2.10)(@nestjs/websockets@10.3.10)(rxjs@7.8.1) + iterare: 1.2.1 + object-hash: 3.0.0 + reflect-metadata: 0.1.13 + rxjs: 7.8.1 + tslib: 2.6.3 + + /@next/env@14.2.5: + resolution: {integrity: sha512-/zZGkrTOsraVfYjGP8uM0p6r0BDT6xWpkjdVbcz66PJVSpwXX3yNiRycxAuDfBKGWBrZBXRuK/YVlkNgxHGwmA==} dev: false /@next/eslint-plugin-next@13.5.6: @@ -1736,8 +3011,8 @@ packages: glob: 7.1.7 dev: true - /@next/swc-darwin-arm64@14.2.3: - resolution: {integrity: sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A==} + /@next/swc-darwin-arm64@14.2.5: + resolution: {integrity: sha512-/9zVxJ+K9lrzSGli1///ujyRfon/ZneeZ+v4ptpiPoOU+GKZnm8Wj8ELWU1Pm7GHltYRBklmXMTUqM/DqQ99FQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -1745,8 +3020,8 @@ packages: dev: false optional: true - /@next/swc-darwin-x64@14.2.3: - resolution: {integrity: sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==} + /@next/swc-darwin-x64@14.2.5: + resolution: {integrity: sha512-vXHOPCwfDe9qLDuq7U1OYM2wUY+KQ4Ex6ozwsKxp26BlJ6XXbHleOUldenM67JRyBfVjv371oneEvYd3H2gNSA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -1754,8 +3029,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-gnu@14.2.3: - resolution: {integrity: sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==} + /@next/swc-linux-arm64-gnu@14.2.5: + resolution: {integrity: sha512-vlhB8wI+lj8q1ExFW8lbWutA4M2ZazQNvMWuEDqZcuJJc78iUnLdPPunBPX8rC4IgT6lIx/adB+Cwrl99MzNaA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -1763,8 +3038,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-musl@14.2.3: - resolution: {integrity: sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==} + /@next/swc-linux-arm64-musl@14.2.5: + resolution: {integrity: sha512-NpDB9NUR2t0hXzJJwQSGu1IAOYybsfeB+LxpGsXrRIb7QOrYmidJz3shzY8cM6+rO4Aojuef0N/PEaX18pi9OA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -1772,8 +3047,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-gnu@14.2.3: - resolution: {integrity: sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==} + /@next/swc-linux-x64-gnu@14.2.5: + resolution: {integrity: sha512-8XFikMSxWleYNryWIjiCX+gU201YS+erTUidKdyOVYi5qUQo/gRxv/3N1oZFCgqpesN6FPeqGM72Zve+nReVXQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -1781,8 +3056,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-musl@14.2.3: - resolution: {integrity: sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ==} + /@next/swc-linux-x64-musl@14.2.5: + resolution: {integrity: sha512-6QLwi7RaYiQDcRDSU/os40r5o06b5ue7Jsk5JgdRBGGp8l37RZEh9JsLSM8QF0YDsgcosSeHjglgqi25+m04IQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -1790,8 +3065,8 @@ packages: dev: false optional: true - /@next/swc-win32-arm64-msvc@14.2.3: - resolution: {integrity: sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==} + /@next/swc-win32-arm64-msvc@14.2.5: + resolution: {integrity: sha512-1GpG2VhbspO+aYoMOQPQiqc/tG3LzmsdBH0LhnDS3JrtDx2QmzXe0B6mSZZiN3Bq7IOMXxv1nlsjzoS1+9mzZw==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -1799,8 +3074,8 @@ packages: dev: false optional: true - /@next/swc-win32-ia32-msvc@14.2.3: - resolution: {integrity: sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==} + /@next/swc-win32-ia32-msvc@14.2.5: + resolution: {integrity: sha512-Igh9ZlxwvCDsu6438FXlQTHlRno4gFpJzqPjSIBZooD22tKeI4fE/YMRoHVJHmrQ2P5YL1DoZ0qaOKkbeFWeMg==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] @@ -1808,8 +3083,8 @@ packages: dev: false optional: true - /@next/swc-win32-x64-msvc@14.2.3: - resolution: {integrity: sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA==} + /@next/swc-win32-x64-msvc@14.2.5: + resolution: {integrity: sha512-tEQ7oinq1/CjSG9uSTerca3v4AZ+dFa+4Yu6ihaG8Ud8ddqLQgFGcnwYls13H5X5CPDPZJdYxyeMui6muOLd4g==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -1928,6 +3203,166 @@ packages: '@sinonjs/commons': 3.0.0 dev: true + /@socket.io/component-emitter@3.1.2: + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + + /@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.23.3): + resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + dev: false + + /@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.23.3): + resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + dev: false + + /@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.23.3): + resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + dev: false + + /@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.23.3): + resolution: {integrity: sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + dev: false + + /@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.23.3): + resolution: {integrity: sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + dev: false + + /@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.23.3): + resolution: {integrity: sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + dev: false + + /@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.23.3): + resolution: {integrity: sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + dev: false + + /@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.23.3): + resolution: {integrity: sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==} + engines: {node: '>=12'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + dev: false + + /@svgr/babel-preset@8.1.0(@babel/core@7.23.3): + resolution: {integrity: sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.23.3) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.23.3) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.23.3) + '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.23.3) + '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.23.3) + '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.23.3) + '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.23.3) + '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.23.3) + dev: false + + /@svgr/core@8.1.0(typescript@5.3.2): + resolution: {integrity: sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==} + engines: {node: '>=14'} + dependencies: + '@babel/core': 7.23.3 + '@svgr/babel-preset': 8.1.0(@babel/core@7.23.3) + camelcase: 6.3.0 + cosmiconfig: 8.3.6(typescript@5.3.2) + snake-case: 3.0.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: false + + /@svgr/hast-util-to-babel-ast@8.0.0: + resolution: {integrity: sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==} + engines: {node: '>=14'} + dependencies: + '@babel/types': 7.23.4 + entities: 4.5.0 + dev: false + + /@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0): + resolution: {integrity: sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==} + engines: {node: '>=14'} + peerDependencies: + '@svgr/core': '*' + dependencies: + '@babel/core': 7.23.3 + '@svgr/babel-preset': 8.1.0(@babel/core@7.23.3) + '@svgr/core': 8.1.0(typescript@5.3.2) + '@svgr/hast-util-to-babel-ast': 8.0.0 + svg-parser: 2.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0)(typescript@5.3.2): + resolution: {integrity: sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==} + engines: {node: '>=14'} + peerDependencies: + '@svgr/core': '*' + dependencies: + '@svgr/core': 8.1.0(typescript@5.3.2) + cosmiconfig: 8.3.6(typescript@5.3.2) + deepmerge: 4.3.1 + svgo: 3.3.2 + transitivePeerDependencies: + - typescript + dev: false + + /@svgr/webpack@8.1.0(typescript@5.3.2): + resolution: {integrity: sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==} + engines: {node: '>=14'} + dependencies: + '@babel/core': 7.23.3 + '@babel/plugin-transform-react-constant-elements': 7.24.7(@babel/core@7.23.3) + '@babel/preset-env': 7.24.8(@babel/core@7.23.3) + '@babel/preset-react': 7.24.7(@babel/core@7.23.3) + '@babel/preset-typescript': 7.24.7(@babel/core@7.23.3) + '@svgr/core': 8.1.0(typescript@5.3.2) + '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0) + '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0)(typescript@5.3.2) + transitivePeerDependencies: + - supports-color + - typescript + dev: false + /@swc/counter@0.1.3: resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} dev: false @@ -1939,6 +3374,11 @@ packages: tslib: 2.6.2 dev: false + /@trysound/sax@0.2.0: + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + dev: false + /@tsconfig/node10@1.0.9: resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} dev: true @@ -1994,10 +3434,18 @@ packages: resolution: {integrity: sha512-8qL93MF05/xrzFm/LSPtzNEOE1eQF3VwGHAcQEylgp5hDSTe41jtFwbSYAPfyYcVa28y1vYSjIt0c1fLLUiC/Q==} dev: true + /@types/cookie@0.4.1: + resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} + /@types/cookiejar@2.1.5: resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} dev: true + /@types/cors@2.8.17: + resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} + dependencies: + '@types/node': 20.10.0 + /@types/eslint-scope@3.7.7: resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} dependencies: @@ -2442,7 +3890,7 @@ packages: - vitest dev: true - /@vchikalkin/eslint-config-awesome@1.1.6(@babel/eslint-plugin@7.22.10)(@babel/plugin-syntax-flow@7.23.3)(@babel/plugin-transform-react-jsx@7.23.4)(@types/node@20.10.0)(eslint-plugin-import@2.29.0)(eslint@8.54.0)(graphql@16.8.1)(prettier@3.2.5)(typescript@5.3.2): + /@vchikalkin/eslint-config-awesome@1.1.6(@babel/eslint-plugin@7.22.10)(@babel/plugin-syntax-flow@7.23.3)(@babel/plugin-transform-react-jsx@7.23.4)(@types/node@20.10.0)(eslint-plugin-import@2.29.0)(eslint@8.54.0)(graphql@16.8.1)(prettier@3.3.3)(typescript@5.3.2): resolution: {integrity: sha512-GMgbUe9CupcCpQnvrZMalfwnuQwoYCH8mMYLYsBtVLbpjyzI3OVsX0GGvqPJbLDO1mBVH3H8DsMMFwwmOpP81A==} peerDependencies: '@babel/eslint-plugin': ^7.22.10 @@ -2454,7 +3902,7 @@ packages: eslint-config-canonical: 42.8.0(@babel/plugin-syntax-flow@7.23.3)(@babel/plugin-transform-react-jsx@7.23.4)(@types/node@20.10.0)(eslint@8.54.0)(graphql@16.8.1)(jest@29.7.0)(typescript@5.3.2) eslint-config-prettier: 9.0.0(eslint@8.54.0) eslint-plugin-canonical: 4.18.0(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.29.0)(eslint@8.54.0)(typescript@5.3.2) - eslint-plugin-prettier: 5.0.1(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.2.5) + eslint-plugin-prettier: 5.0.1(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.3.3) eslint-plugin-sonarjs: 0.22.0(eslint@8.54.0) transitivePeerDependencies: - '@babel/plugin-syntax-flow' @@ -2733,9 +4181,6 @@ packages: normalize-path: 3.0.0 picomatch: 2.3.1 - /append-field@1.0.0: - resolution: {integrity: sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==} - /aproba@2.0.0: resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} dev: false @@ -2782,9 +4227,6 @@ packages: is-array-buffer: 3.0.2 dev: true - /array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - /array-includes@3.1.7: resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} engines: {node: '>= 0.4'} @@ -2997,6 +4439,42 @@ packages: '@types/babel__traverse': 7.20.4 dev: true + /babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.23.3): + resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/compat-data': 7.24.8 + '@babel/core': 7.23.3 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.23.3) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.23.3): + resolution: {integrity: sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.23.3) + core-js-compat: 3.37.1 + transitivePeerDependencies: + - supports-color + dev: false + + /babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.23.3): + resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.23.3) + transitivePeerDependencies: + - supports-color + dev: false + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.3): resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: @@ -3041,6 +4519,10 @@ packages: /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + /base64id@2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + /bcrypt@5.1.1: resolution: {integrity: sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==} engines: {node: '>= 10.0.0'} @@ -3069,43 +4551,9 @@ packages: inherits: 2.0.4 readable-stream: 3.6.2 - /body-parser@1.20.1: - resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.1 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - - /body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.2 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color + /boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + dev: false /boolean@3.2.0: resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} @@ -3145,6 +4593,17 @@ packages: node-releases: 2.0.13 update-browserslist-db: 1.0.13(browserslist@4.22.1) + /browserslist@4.23.2: + resolution: {integrity: sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001641 + electron-to-chromium: 1.4.827 + node-releases: 2.0.14 + update-browserslist-db: 1.1.0(browserslist@4.23.2) + dev: false + /bs-logger@0.2.6: resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} engines: {node: '>= 6'} @@ -3206,10 +4665,6 @@ packages: dependencies: streamsearch: 1.1.0 - /bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - /cache-manager-ioredis@2.1.0: resolution: {integrity: sha512-TCxbp9ceuFveTKWuNaCX8QjoC41rAlHen4s63u9Yd+iXlw3efYmimc/u935PKPxSdhkXpnMes4mxtK3/yb0L4g==} engines: {node: '>=6.0.0'} @@ -3233,6 +4688,7 @@ packages: function-bind: 1.1.2 get-intrinsic: 1.2.2 set-function-length: 1.1.1 + dev: true /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} @@ -3246,13 +4702,12 @@ packages: /camelcase@6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - dev: true /caniuse-lite@1.0.30001565: resolution: {integrity: sha512-xrE//a3O7TP0vaJ8ikzkD2c2NgcVUvsEe2IvFTntV4Yd1Z9FVzh+gW+enX96L0psrbaFMcVcH2l90xNuGDWc8w==} - /caniuse-lite@1.0.30001612: - resolution: {integrity: sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==} + /caniuse-lite@1.0.30001641: + resolution: {integrity: sha512-Phv5thgl67bHYo1TtMY/MurjkHhV4EDaCosezRXgZ8jzA/Ub+wjxAvbGvjoFENStinwi5kCyOYV3mi5tOGykwA==} dev: false /chalk@2.4.2: @@ -3423,6 +4878,11 @@ packages: engines: {node: '>= 6'} dev: false + /commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: false + /comment-json@4.2.3: resolution: {integrity: sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==} engines: {node: '>= 6'} @@ -3445,15 +4905,6 @@ packages: /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - /concat-stream@1.6.2: - resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} - engines: {'0': node >= 0.8} - dependencies: - buffer-from: 1.1.2 - inherits: 2.0.4 - readable-stream: 2.3.8 - typedarray: 0.0.6 - /consola@2.15.3: resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} @@ -3466,22 +4917,20 @@ packages: engines: {node: '>= 0.6'} dependencies: safe-buffer: 5.2.1 - - /content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} + dev: false /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - /cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - /cookie-signature@1.2.1: resolution: {integrity: sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw==} engines: {node: '>=6.6.0'} dev: false + /cookie@0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} + /cookie@0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} @@ -3490,6 +4939,12 @@ packages: resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} dev: true + /core-js-compat@3.37.1: + resolution: {integrity: sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==} + dependencies: + browserslist: 4.23.2 + dev: false + /core-js-pure@3.33.3: resolution: {integrity: sha512-taJ00IDOP+XYQEA2dAe4ESkmHt1fL8wzYDo3mRWQey8uO9UojlBFMneA65kMyxfYP7106c6LzWaq7/haDT6BCQ==} requiresBuild: true @@ -3535,6 +4990,22 @@ packages: typescript: 5.2.2 dev: false + /cosmiconfig@8.3.6(typescript@5.3.2): + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + typescript: 5.3.2 + dev: false + /create-eslint-index@1.0.0: resolution: {integrity: sha512-nXvJjnfDytOOaPOonX0h0a1ggMoqrhdekGeZkD6hkcWYvlCWhU719tKFVh8eU04CnMwu3uwe1JjwuUF2C3k2qg==} engines: {node: '>=4.0.0'} @@ -3573,6 +5044,44 @@ packages: shebang-command: 2.0.0 which: 2.0.2 + /css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.1.0 + nth-check: 2.1.1 + dev: false + + /css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.0.2 + dev: false + + /css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.0.2 + dev: false + + /css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + dev: false + + /csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + dependencies: + css-tree: 2.2.1 + dev: false + /csstype@3.1.2: resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} dev: false @@ -3585,16 +5094,6 @@ packages: resolution: {integrity: sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g==} dev: true - /debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.0.0 - /debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -3664,6 +5163,7 @@ packages: get-intrinsic: 1.2.2 gopd: 1.0.1 has-property-descriptors: 1.0.1 + dev: true /define-lazy-prop@3.0.0: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} @@ -3695,16 +5195,13 @@ packages: /depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} + dev: false /dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} dev: true - /destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - /detect-libc@2.0.2: resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} engines: {node: '>=8'} @@ -3753,6 +5250,40 @@ packages: esutils: 2.0.3 dev: true + /dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + dev: false + + /domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: false + + /domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: false + + /domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dev: false + + /dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + dev: false + /dotenv-cli@7.3.0: resolution: {integrity: sha512-314CA4TyK34YEJ6ntBf80eUY+t1XaFLyem1k9P0sX1gn30qThZ5qZr/ZwE318gEnzyYP9yj9HJk6SqwE0upkfw==} hasBin: true @@ -3786,12 +5317,13 @@ packages: safe-buffer: 5.2.1 dev: false - /ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - /electron-to-chromium@1.4.596: resolution: {integrity: sha512-zW3zbZ40Icb2BCWjm47nxwcFGYlIgdXkAx85XDO7cyky9J4QQfq8t0W19/TLZqq3JPQXtlv8BPIGmfa9Jb4scg==} + /electron-to-chromium@1.4.827: + resolution: {integrity: sha512-VY+J0e4SFcNfQy19MEoMdaIcZLmDCprqvBtkii1WTCTQHpRvf5N8+3kTYCgL/PcntvwQvmMJWTuDPsq+IlhWKQ==} + dev: false + /emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} @@ -3803,16 +5335,49 @@ packages: /emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - /encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} - /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: once: 1.4.0 dev: false + /engine.io-client@6.5.4: + resolution: {integrity: sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ==} + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.4 + engine.io-parser: 5.2.3 + ws: 8.17.1 + xmlhttprequest-ssl: 2.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} + + /engine.io@6.5.5: + resolution: {integrity: sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==} + engines: {node: '>=10.2.0'} + dependencies: + '@types/cookie': 0.4.1 + '@types/cors': 2.8.17 + '@types/node': 20.10.0 + accepts: 1.3.8 + base64id: 2.0.0 + cookie: 0.4.2 + cors: 2.8.5 + debug: 4.3.4 + engine.io-parser: 5.2.3 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + /enhance-visitors@1.0.0: resolution: {integrity: sha512-+29eJLiUixTEDRaZ35Vu8jP3gPLNcQQkQkOQjLp2X+6cZGGPDD/uasbFzvLsJKnGZnvmyZ0srxudwOtskHeIDA==} engines: {node: '>=4.0.0'} @@ -3827,6 +5392,11 @@ packages: graceful-fs: 4.2.11 tapable: 2.2.1 + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: false + /error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: @@ -3927,8 +5497,14 @@ packages: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} + /escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + dev: false + /escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: false /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} @@ -3994,7 +5570,7 @@ packages: eslint-plugin-mocha: 10.2.0(eslint@8.54.0) eslint-plugin-modules-newline: 0.0.6 eslint-plugin-n: 16.3.1(eslint@8.54.0) - eslint-plugin-prettier: 5.0.1(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.2.5) + eslint-plugin-prettier: 5.0.1(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.3.3) eslint-plugin-promise: 6.1.1(eslint@8.54.0) eslint-plugin-react: 7.33.2(eslint@8.54.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.54.0) @@ -4005,7 +5581,7 @@ packages: eslint-plugin-vitest: 0.3.10(@typescript-eslint/eslint-plugin@6.13.1)(eslint@8.54.0)(typescript@5.3.2) eslint-plugin-yml: 1.10.0(eslint@8.54.0) eslint-plugin-zod: 1.4.0(eslint@8.54.0) - prettier: 3.2.5 + prettier: 3.3.3 ramda: 0.29.1 yaml-eslint-parser: 1.2.2 transitivePeerDependencies: @@ -4462,7 +6038,7 @@ packages: synckit: 0.8.5 dev: true - /eslint-plugin-prettier@5.0.1(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.2.5): + /eslint-plugin-prettier@5.0.1(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.3.3): resolution: {integrity: sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -4478,7 +6054,7 @@ packages: dependencies: eslint: 8.54.0 eslint-config-prettier: 9.0.0(eslint@8.54.0) - prettier: 3.2.5 + prettier: 3.3.3 prettier-linter-helpers: 1.0.0 synckit: 0.8.5 dev: true @@ -4777,11 +6353,6 @@ packages: /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - dev: true - - /etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} /event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} @@ -4852,44 +6423,6 @@ packages: jest-util: 29.7.0 dev: true - /express@4.18.2: - resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} - engines: {node: '>= 0.10.0'} - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.1 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.5.0 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.2.0 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.1 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.7 - proxy-addr: 2.0.7 - qs: 6.11.0 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - /external-editor@3.1.0: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} @@ -5036,20 +6569,6 @@ packages: dependencies: to-regex-range: 5.0.1 - /finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} - engines: {node: '>= 0.8'} - dependencies: - debug: 2.6.9 - encodeurl: 1.0.2 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.1 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - /find-my-way@7.7.0: resolution: {integrity: sha512-+SrHpvQ52Q6W9f3wJoJBbAQULJuNEEQwBvlvYwACDhBTLOTMiQ0HYWh4+vC3OivGP2ENcTI1oKlFA2OepJNjhQ==} engines: {node: '>=14'} @@ -5155,10 +6674,6 @@ packages: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} - /fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - /fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} @@ -5237,6 +6752,7 @@ packages: has-proto: 1.0.1 has-symbols: 1.0.3 hasown: 2.0.0 + dev: true /get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} @@ -5304,6 +6820,7 @@ packages: /glob@7.1.7: resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + deprecated: Glob versions prior to v9 are no longer supported dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -5378,6 +6895,7 @@ packages: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: get-intrinsic: 1.2.2 + dev: true /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -5463,14 +6981,17 @@ packages: resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} dependencies: get-intrinsic: 1.2.2 + dev: true /has-proto@1.0.1: resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} engines: {node: '>= 0.4'} + dev: true /has-symbols@1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} + dev: true /has-tostringtag@1.0.0: resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} @@ -5511,6 +7032,7 @@ packages: setprototypeof: 1.2.0 statuses: 2.0.1 toidentifier: 1.0.1 + dev: false /https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} @@ -5542,6 +7064,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 + dev: false /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -5940,9 +7463,6 @@ packages: is-docker: 2.2.1 dev: true - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - /isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} dev: true @@ -6508,7 +8028,6 @@ packages: /jsesc@0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true - dev: true /jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} @@ -6723,6 +8242,10 @@ packages: resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} dev: false + /lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + dev: false + /lodash.defaults@4.2.0: resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} dev: false @@ -6799,6 +8322,12 @@ packages: dependencies: js-tokens: 4.0.0 + /lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + dependencies: + tslib: 2.6.2 + dev: false + /lowercase-keys@1.0.1: resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} engines: {node: '>=0.10.0'} @@ -6855,9 +8384,13 @@ packages: tmpl: 1.0.5 dev: true - /media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} + /mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + dev: false + + /mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + dev: false /memfs@3.5.3: resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} @@ -6872,9 +8405,6 @@ packages: dev: false optional: true - /merge-descriptors@1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} - /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -6898,6 +8428,7 @@ packages: /methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} + dev: true /micro-spelling-correcter@1.1.1: resolution: {integrity: sha512-lkJ3Rj/mtjlRcHk6YyCbvZhyWTOzdBvTHsxMmZSk5jxN1YyVSQ+JETAom55mdzfcyDrY/49Z7UCW760BK30crg==} @@ -6921,11 +8452,6 @@ packages: dependencies: mime-db: 1.52.0 - /mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - /mime@2.6.0: resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} engines: {node: '>=4.0.0'} @@ -7017,12 +8543,6 @@ packages: yallist: 4.0.0 dev: false - /mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - dependencies: - minimist: 1.2.8 - /mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} @@ -7109,27 +8629,12 @@ packages: - supports-color dev: false - /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - /multer@1.4.4-lts.1: - resolution: {integrity: sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg==} - engines: {node: '>= 6.0.0'} - dependencies: - append-field: 1.0.0 - busboy: 1.6.0 - concat-stream: 1.6.2 - mkdirp: 0.5.6 - object-assign: 4.1.1 - type-is: 1.6.18 - xtend: 4.0.2 - /mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} dev: false @@ -7155,8 +8660,8 @@ packages: /neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - /next@14.2.3(@babel/core@7.23.3)(react-dom@18.2.0)(react@18.2.0)(sass@1.69.5): - resolution: {integrity: sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A==} + /next@14.2.5(@babel/core@7.23.3)(react-dom@18.2.0)(react@18.2.0)(sass@1.69.5): + resolution: {integrity: sha512-0f8aRfBVL+mpzfBjYfQuLWh2WyAwtJXCRfkPF4UJ5qd2YwrHczsrSzXU4tRMV0OAxR8ZJZWPFn6uhSC56UTsLA==} engines: {node: '>=18.17.0'} hasBin: true peerDependencies: @@ -7173,10 +8678,10 @@ packages: sass: optional: true dependencies: - '@next/env': 14.2.3 + '@next/env': 14.2.5 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001612 + caniuse-lite: 1.0.30001641 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.2.0 @@ -7184,20 +8689,27 @@ packages: sass: 1.69.5 styled-jsx: 5.1.1(@babel/core@7.23.3)(react@18.2.0) optionalDependencies: - '@next/swc-darwin-arm64': 14.2.3 - '@next/swc-darwin-x64': 14.2.3 - '@next/swc-linux-arm64-gnu': 14.2.3 - '@next/swc-linux-arm64-musl': 14.2.3 - '@next/swc-linux-x64-gnu': 14.2.3 - '@next/swc-linux-x64-musl': 14.2.3 - '@next/swc-win32-arm64-msvc': 14.2.3 - '@next/swc-win32-ia32-msvc': 14.2.3 - '@next/swc-win32-x64-msvc': 14.2.3 + '@next/swc-darwin-arm64': 14.2.5 + '@next/swc-darwin-x64': 14.2.5 + '@next/swc-linux-arm64-gnu': 14.2.5 + '@next/swc-linux-arm64-musl': 14.2.5 + '@next/swc-linux-x64-gnu': 14.2.5 + '@next/swc-linux-x64-musl': 14.2.5 + '@next/swc-win32-arm64-msvc': 14.2.5 + '@next/swc-win32-ia32-msvc': 14.2.5 + '@next/swc-win32-x64-msvc': 14.2.5 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros dev: false + /no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + dependencies: + lower-case: 2.0.2 + tslib: 2.6.2 + dev: false + /node-abort-controller@3.1.1: resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} dev: false @@ -7230,6 +8742,10 @@ packages: /node-releases@2.0.13: resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + dev: false + /nopt@5.0.0: resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} engines: {node: '>=6'} @@ -7280,6 +8796,12 @@ packages: set-blocking: 2.0.0 dev: false + /nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + dev: false + /obj-props@1.4.0: resolution: {integrity: sha512-p7p/7ltzPDiBs6DqxOrIbtRdwxxVRBj5ROukeNb9RgA+fawhrz5n2hpNz8DDmYR//tviJSj7nUnlppGmONkjiQ==} engines: {node: '>=0.10.0'} @@ -7289,8 +8811,13 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + /object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + /object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + dev: true /object-is@1.1.5: resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} @@ -7366,12 +8893,6 @@ packages: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} engines: {node: '>=14.0.0'} - /on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - dependencies: - ee-first: 1.1.1 - /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: @@ -7491,10 +9012,6 @@ packages: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - /parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -7524,9 +9041,6 @@ packages: minipass: 7.0.4 dev: false - /path-to-regexp@0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} - /path-to-regexp@3.2.0: resolution: {integrity: sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==} @@ -7541,6 +9055,10 @@ packages: /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + /picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + dev: false + /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} @@ -7625,8 +9143,8 @@ packages: hasBin: true dev: true - /prettier@3.2.5: - resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + /prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} engines: {node: '>=14'} hasBin: true dev: true @@ -7640,9 +9158,6 @@ packages: react-is: 18.2.0 dev: true - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - /process-warning@2.3.1: resolution: {integrity: sha512-JjBvFEn7MwFbzUDa2SRtKJSsyO0LlER4V/FmwLMhBlXNbGgGxdyFCxIdMDLerWUycsVUyaoM9QFLvppFy4IWaQ==} @@ -7717,12 +9232,6 @@ packages: engines: {node: '>=6.0.0'} dev: true - /qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} - engines: {node: '>=0.6'} - dependencies: - side-channel: 1.0.4 - /qs@6.11.2: resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} engines: {node: '>=0.6'} @@ -7755,28 +9264,6 @@ packages: dependencies: safe-buffer: 5.2.1 - /range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - - /raw-body@2.5.1: - resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} - engines: {node: '>= 0.8'} - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - - /raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - /react-dom@18.2.0(react@18.2.0): resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} peerDependencies: @@ -7787,6 +9274,15 @@ packages: scheduler: 0.23.0 dev: false + /react-hook-form@7.52.1(react@18.2.0): + resolution: {integrity: sha512-uNKIhaoICJ5KQALYZ4TOaOLElyM+xipord+Ha3crEFhTntdLvWZqVY49Wqd/0GiVCA/f9NjemLeiNPjG7Hpurg==} + engines: {node: '>=12.22.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 || ^19 + dependencies: + react: 18.2.0 + dev: false + /react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} dev: true @@ -7821,17 +9317,6 @@ packages: type-fest: 0.6.0 dev: true - /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - /readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -7916,9 +9401,25 @@ packages: which-builtin-type: 1.1.3 dev: true + /regenerate-unicode-properties@10.1.1: + resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + dev: false + + /regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + dev: false + /regenerator-runtime@0.14.0: resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} - dev: true + + /regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + dependencies: + '@babel/runtime': 7.23.4 + dev: false /regexp-ast-analysis@0.6.0: resolution: {integrity: sha512-OLxjyjPkVH+rQlBLb1I/P/VTmamSjGkvN5PTV5BXP432k3uVz727J7H29GA5IFiY0m7e1xBN7049Wn59FY3DEQ==} @@ -7942,6 +9443,18 @@ packages: set-function-name: 2.0.1 dev: true + /regexpu-core@5.3.2: + resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} + engines: {node: '>=4'} + dependencies: + '@babel/regjsgen': 0.8.0 + regenerate: 1.4.2 + regenerate-unicode-properties: 10.1.1 + regjsparser: 0.9.1 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.1.0 + dev: false + /regjsparser@0.10.0: resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} hasBin: true @@ -7949,6 +9462,13 @@ packages: jsesc: 0.5.0 dev: true + /regjsparser@0.9.1: + resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + hasBin: true + dependencies: + jsesc: 0.5.0 + dev: false + /remove-trailing-separator@1.1.0: resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} dev: true @@ -8100,9 +9620,6 @@ packages: isarray: 2.0.5 dev: true - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -8125,6 +9642,7 @@ packages: /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: false /sass@1.69.5: resolution: {integrity: sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==} @@ -8181,42 +9699,11 @@ packages: dependencies: lru-cache: 6.0.0 - /send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - /serialize-javascript@6.0.1: resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} dependencies: randombytes: 2.1.0 - /serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} - dependencies: - encodeurl: 1.0.2 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.18.0 - transitivePeerDependencies: - - supports-color - /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: false @@ -8232,6 +9719,7 @@ packages: get-intrinsic: 1.2.2 gopd: 1.0.1 has-property-descriptors: 1.0.1 + dev: true /set-function-name@2.0.1: resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} @@ -8244,6 +9732,7 @@ packages: /setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: false /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} @@ -8271,6 +9760,7 @@ packages: call-bind: 1.0.5 get-intrinsic: 1.2.2 object-inspect: 1.13.1 + dev: true /sift@16.0.1: resolution: {integrity: sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==} @@ -8298,6 +9788,62 @@ packages: engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} dev: false + /snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + dependencies: + dot-case: 3.0.4 + tslib: 2.6.2 + dev: false + + /socket.io-adapter@2.5.5: + resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==} + dependencies: + debug: 4.3.4 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + /socket.io-client@4.7.5: + resolution: {integrity: sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.4 + engine.io-client: 6.5.4 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + + /socket.io@4.7.5: + resolution: {integrity: sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==} + engines: {node: '>=10.2.0'} + dependencies: + accepts: 1.3.8 + base64id: 2.0.0 + cors: 2.8.5 + debug: 4.3.4 + engine.io: 6.5.5 + socket.io-adapter: 2.5.5 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + /socks@2.7.1: resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} @@ -8389,6 +9935,7 @@ packages: /statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + dev: false /streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} @@ -8466,11 +10013,6 @@ packages: es-abstract: 1.22.3 dev: true - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - dependencies: - safe-buffer: 5.1.2 - /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: @@ -8587,6 +10129,24 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + /svg-parser@2.0.4: + resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} + dev: false + + /svgo@3.3.2: + resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 5.1.0 + css-tree: 2.3.1 + css-what: 6.1.0 + csso: 5.0.5 + picocolors: 1.0.0 + dev: false + /swagger-ui-dist@5.9.1: resolution: {integrity: sha512-5zAx+hUwJb9T3EAntc7TqYkV716CMqG6sZpNlAAMOMWkNXRYxGkN8ADIvD55dQZ10LxN90ZM/TQmN7y1gpICnw==} dev: false @@ -8708,6 +10268,7 @@ packages: /toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + dev: false /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} @@ -8858,6 +10419,9 @@ packages: /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + /tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + /tsutils@3.21.0(typescript@5.3.2): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} @@ -8868,64 +10432,64 @@ packages: typescript: 5.3.2 dev: true - /turbo-darwin-64@1.10.16: - resolution: {integrity: sha512-+Jk91FNcp9e9NCLYlvDDlp2HwEDp14F9N42IoW3dmHI5ZkGSXzalbhVcrx3DOox3QfiNUHxzWg4d7CnVNCuuMg==} + /turbo-darwin-64@1.13.4: + resolution: {integrity: sha512-A0eKd73R7CGnRinTiS7txkMElg+R5rKFp9HV7baDiEL4xTG1FIg/56Vm7A5RVgg8UNgG2qNnrfatJtb+dRmNdw==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /turbo-darwin-arm64@1.10.16: - resolution: {integrity: sha512-jqGpFZipIivkRp/i+jnL8npX0VssE6IAVNKtu573LXtssZdV/S+fRGYA16tI46xJGxSAivrZ/IcgZrV6Jk80bw==} + /turbo-darwin-arm64@1.13.4: + resolution: {integrity: sha512-eG769Q0NF6/Vyjsr3mKCnkG/eW6dKMBZk6dxWOdrHfrg6QgfkBUk0WUUujzdtVPiUIvsh4l46vQrNVd9EOtbyA==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /turbo-linux-64@1.10.16: - resolution: {integrity: sha512-PpqEZHwLoizQ6sTUvmImcRmACyRk9EWLXGlqceogPZsJ1jTRK3sfcF9fC2W56zkSIzuLEP07k5kl+ZxJd8JMcg==} + /turbo-linux-64@1.13.4: + resolution: {integrity: sha512-Bq0JphDeNw3XEi+Xb/e4xoKhs1DHN7OoLVUbTIQz+gazYjigVZvtwCvgrZI7eW9Xo1eOXM2zw2u1DGLLUfmGkQ==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /turbo-linux-arm64@1.10.16: - resolution: {integrity: sha512-TMjFYz8to1QE0fKVXCIvG/4giyfnmqcQIwjdNfJvKjBxn22PpbjeuFuQ5kNXshUTRaTJihFbuuCcb5OYFNx4uw==} + /turbo-linux-arm64@1.13.4: + resolution: {integrity: sha512-BJcXw1DDiHO/okYbaNdcWN6szjXyHWx9d460v6fCHY65G8CyqGU3y2uUTPK89o8lq/b2C8NK0yZD+Vp0f9VoIg==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /turbo-windows-64@1.10.16: - resolution: {integrity: sha512-+jsf68krs0N66FfC4/zZvioUap/Tq3sPFumnMV+EBo8jFdqs4yehd6+MxIwYTjSQLIcpH8KoNMB0gQYhJRLZzw==} + /turbo-windows-64@1.13.4: + resolution: {integrity: sha512-OFFhXHOFLN7A78vD/dlVuuSSVEB3s9ZBj18Tm1hk3aW1HTWTuAw0ReN6ZNlVObZUHvGy8d57OAGGxf2bT3etQw==} cpu: [x64] os: [win32] requiresBuild: true dev: true optional: true - /turbo-windows-arm64@1.10.16: - resolution: {integrity: sha512-sKm3hcMM1bl0B3PLG4ifidicOGfoJmOEacM5JtgBkYM48ncMHjkHfFY7HrJHZHUnXM4l05RQTpLFoOl/uIo2HQ==} + /turbo-windows-arm64@1.13.4: + resolution: {integrity: sha512-u5A+VOKHswJJmJ8o8rcilBfU5U3Y1TTAfP9wX8bFh8teYF1ghP0EhtMRLjhtp6RPa+XCxHHVA2CiC3gbh5eg5g==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /turbo@1.10.16: - resolution: {integrity: sha512-2CEaK4FIuSZiP83iFa9GqMTQhroW2QryckVqUydmg4tx78baftTOS0O+oDAhvo9r9Nit4xUEtC1RAHoqs6ZEtg==} + /turbo@1.13.4: + resolution: {integrity: sha512-1q7+9UJABuBAHrcC4Sxp5lOqYS5mvxRrwa33wpIyM18hlOCpRD/fTJNxZ0vhbMcJmz15o9kkVm743mPn7p6jpQ==} hasBin: true optionalDependencies: - turbo-darwin-64: 1.10.16 - turbo-darwin-arm64: 1.10.16 - turbo-linux-64: 1.10.16 - turbo-linux-arm64: 1.10.16 - turbo-windows-64: 1.10.16 - turbo-windows-arm64: 1.10.16 + turbo-darwin-64: 1.13.4 + turbo-darwin-arm64: 1.13.4 + turbo-linux-64: 1.13.4 + turbo-linux-arm64: 1.13.4 + turbo-windows-64: 1.13.4 + turbo-windows-arm64: 1.13.4 dev: true /type-check@0.4.0: @@ -8959,13 +10523,6 @@ packages: engines: {node: '>=8'} dev: true - /type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 - /typed-array-buffer@1.0.0: resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} engines: {node: '>= 0.4'} @@ -9004,9 +10561,6 @@ packages: is-typed-array: 1.1.12 dev: true - /typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - /typescript@5.2.2: resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} engines: {node: '>=14.17'} @@ -9036,6 +10590,29 @@ packages: /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + /unicode-canonical-property-names-ecmascript@2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + dev: false + + /unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-property-aliases-ecmascript: 2.1.0 + dev: false + + /unicode-match-property-value-ecmascript@2.1.0: + resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + engines: {node: '>=4'} + dev: false + + /unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + dev: false + /universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -9048,10 +10625,6 @@ packages: normalize-path: 2.1.1 dev: true - /unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - /untildify@4.0.0: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} engines: {node: '>=8'} @@ -9067,6 +10640,17 @@ packages: escalade: 3.1.1 picocolors: 1.0.0 + /update-browserslist-db@1.1.0(browserslist@4.23.2): + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.23.2 + escalade: 3.1.2 + picocolors: 1.0.1 + dev: false + /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: @@ -9089,10 +10673,6 @@ packages: which-typed-array: 1.1.13 dev: true - /utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - /uuid@9.0.0: resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} hasBin: true @@ -9390,16 +10970,29 @@ packages: optional: true dev: true + /ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + /xmlhttprequest-ssl@2.0.0: + resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} + engines: {node: '>=0.4.0'} + dev: false + /xregexp@5.1.1: resolution: {integrity: sha512-fKXeVorD+CzWvFs7VBuKTYIW63YD1e1osxwQ8caZ6o1jg6pDAbABDG54LCIq0j5cy7PjRvGIq6sef9DYPXpncg==} dependencies: '@babel/runtime-corejs3': 7.23.4 dev: true - /xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'}