diff --git a/packages/backend/.prettierrc b/packages/backend/.prettierrc index 12c8ccb..0981b7c 100644 --- a/packages/backend/.prettierrc +++ b/packages/backend/.prettierrc @@ -1,6 +1,4 @@ { "singleQuote": true, - "trailingComma": "all", - "tabWidth": 2, - "useTabs": false -} \ No newline at end of file + "printWidth": 120 +} diff --git a/packages/backend/eslint.config.ts b/packages/backend/eslint.config.ts index 9be9ba2..a8bed08 100644 --- a/packages/backend/eslint.config.ts +++ b/packages/backend/eslint.config.ts @@ -4,11 +4,14 @@ import eslint from '@eslint/js'; import globals from 'globals'; import tseslint from 'typescript-eslint'; import eslintPluginJest from 'eslint-plugin-jest'; +import eslintPluginImport from 'eslint-plugin-import'; import eslintPluginPrettier from 'eslint-plugin-prettier/recommended'; export default defineConfig( eslint.configs.recommended, ...tseslint.configs.recommendedTypeChecked, + eslintPluginImport.flatConfigs.recommended, + eslintPluginImport.flatConfigs.typescript, eslintPluginPrettier, eslintPluginJest.configs['flat/recommended'], { @@ -24,12 +27,34 @@ export default defineConfig( tsconfigRootDir: import.meta.dirname, }, }, + settings: { + 'import/resolver': { + typescript: { + project: './tsconfig.json', + }, + }, + }, }, { rules: { - '@typescript-eslint/no-explicit-any': 'off', - '@typescript-eslint/no-floating-promises': 'warn', - '@typescript-eslint/no-unsafe-argument': 'warn', + '@typescript-eslint/no-explicit-any': 'error', + '@typescript-eslint/no-floating-promises': 'error', + '@typescript-eslint/no-unsafe-argument': 'error', + '@typescript-eslint/consistent-type-imports': 'error', + '@typescript-eslint/no-unused-vars': [ + 'error', + { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }, + ], + 'no-console': ['error', { allow: ['warn', 'error'] }], + 'import/order': [ + 'error', + { + groups: ['builtin', 'external', 'internal', 'parent', 'sibling', 'index'], + 'newlines-between': 'always', + alphabetize: { order: 'asc', caseInsensitive: true }, + }, + ], + 'import/no-unresolved': 'off', }, }, { diff --git a/packages/backend/package.json b/packages/backend/package.json index 197e092..ca64a13 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -14,8 +14,8 @@ "start:dev": "dotenv -e .env.development.local -- nest start --watch", "start:debug": "dotenv -e .env.development.local -- nest start --debug --watch", "start:prod": "prisma migrate deploy && node dist/src/main", - "lint": "eslint src/**/*.ts", - "lint:fix": "eslint --fix src/**/*.ts", + "lint": "eslint \"src/**/*.ts\"", + "lint:fix": "eslint --fix \"src/**/*.ts\"", "format": "prettier --check src/", "format:fix": "prettier --write src/", "pretest": "pnpm build", @@ -71,6 +71,8 @@ "dotenv-cli": "10.0.0", "eslint": "9.39.3", "eslint-config-prettier": "10.1.8", + "eslint-import-resolver-typescript": "^4.4.4", + "eslint-plugin-import": "^2.32.0", "eslint-plugin-jest": "29.15.0", "eslint-plugin-prettier": "5.5.5", "globals": "16.5.0", diff --git a/packages/backend/src/app.module.ts b/packages/backend/src/app.module.ts index a7c7c48..32e0294 100644 --- a/packages/backend/src/app.module.ts +++ b/packages/backend/src/app.module.ts @@ -1,21 +1,14 @@ import { Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; -import { LoggerModule } from './logger/logger.module.js'; -import { PrismaModule } from './prisma/prisma.module.js'; + +import { AuthModule } from './auth/auth.module.js'; import { BotModule } from './bot/bot.module.js'; import { ClustersModule } from './clusters/clusters.module.js'; import { DockerModule } from './docker/docker.module.js'; -import { AuthModule } from './auth/auth.module.js'; +import { LoggerModule } from './logger/logger.module.js'; +import { PrismaModule } from './prisma/prisma.module.js'; @Module({ - imports: [ - LoggerModule, - ConfigModule, - PrismaModule, - BotModule, - ClustersModule, - DockerModule, - AuthModule, - ], + imports: [LoggerModule, ConfigModule, PrismaModule, BotModule, ClustersModule, DockerModule, AuthModule], }) export class AppModule {} diff --git a/packages/backend/src/auth/auth.controller.spec.ts b/packages/backend/src/auth/auth.controller.spec.ts index 109c397..17a2946 100644 --- a/packages/backend/src/auth/auth.controller.spec.ts +++ b/packages/backend/src/auth/auth.controller.spec.ts @@ -1,8 +1,11 @@ -import { Test, TestingModule } from '@nestjs/testing'; +import type { TestingModule } from '@nestjs/testing'; +import { Test } from '@nestjs/testing'; +import type { DeepMockProxy } from 'jest-mock-extended'; +import { mockDeep } from 'jest-mock-extended'; + import { AuthController } from './auth.controller.js'; -import { AuthGuard } from './guards/jwt.guard.js'; -import { DeepMockProxy, mockDeep } from 'jest-mock-extended'; import { AuthService } from './auth.service.js'; +import { AuthGuard } from './guards/jwt.guard.js'; describe('AuthController', () => { let controller: AuthController; diff --git a/packages/backend/src/auth/auth.controller.ts b/packages/backend/src/auth/auth.controller.ts index 0f78474..de0527f 100644 --- a/packages/backend/src/auth/auth.controller.ts +++ b/packages/backend/src/auth/auth.controller.ts @@ -8,9 +8,10 @@ import { ApiTags, ApiUnauthorizedResponse, } from '@nestjs/swagger'; + import { AuthService } from './auth.service.js'; -import { RegisterDto } from './dto/register.dto.js'; import { LoginDto } from './dto/login.dto.js'; +import { RegisterDto } from './dto/register.dto.js'; import { UserTokenDto } from './entities/user-token.entity.js'; @Controller('auth') diff --git a/packages/backend/src/auth/auth.module.ts b/packages/backend/src/auth/auth.module.ts index 08059de..3ef05fd 100644 --- a/packages/backend/src/auth/auth.module.ts +++ b/packages/backend/src/auth/auth.module.ts @@ -1,9 +1,11 @@ import { Module } from '@nestjs/common'; -import { JwtModule, JwtSignOptions } from '@nestjs/jwt'; import { ConfigModule, ConfigService } from '@nestjs/config'; +import { JwtModule, JwtSignOptions } from '@nestjs/jwt'; + +import { PrismaModule } from '../prisma/prisma.module.js'; + import { AuthController } from './auth.controller.js'; import { AuthService } from './auth.service.js'; -import { PrismaModule } from '../prisma/prisma.module.js'; import { AuthGuard } from './guards/jwt.guard.js'; @Module({ @@ -15,8 +17,7 @@ import { AuthGuard } from './guards/jwt.guard.js'; useFactory: (config: ConfigService) => ({ secret: config.getOrThrow('JWT_SECRET'), signOptions: { - expiresIn: - config.getOrThrow('JWT_EXPIRES_IN'), + expiresIn: config.getOrThrow('JWT_EXPIRES_IN'), }, }), }), diff --git a/packages/backend/src/auth/auth.service.spec.ts b/packages/backend/src/auth/auth.service.spec.ts index 9243ee8..bf0424a 100644 --- a/packages/backend/src/auth/auth.service.spec.ts +++ b/packages/backend/src/auth/auth.service.spec.ts @@ -1,12 +1,16 @@ +import type { Prisma } from '@hallmaster/prisma-client'; import { beforeEach, describe, expect, it, jest } from '@jest/globals'; -import { Test, TestingModule } from '@nestjs/testing'; +import { ConflictException, UnauthorizedException } from '@nestjs/common'; import { JwtModule, JwtService } from '@nestjs/jwt'; -import { DeepMockProxy, mockDeep } from 'jest-mock-extended'; -import { AuthService } from './auth.service.js'; +import type { TestingModule } from '@nestjs/testing'; +import { Test } from '@nestjs/testing'; +import type { DeepMockProxy } from 'jest-mock-extended'; +import { mockDeep } from 'jest-mock-extended'; + import { PrismaService } from '../prisma/prisma.service.js'; -import { RegisterDto } from './dto/register.dto.js'; -import { Prisma } from '@hallmaster/prisma-client'; -import { ConflictException, UnauthorizedException } from '@nestjs/common'; + +import { AuthService } from './auth.service.js'; +import type { RegisterDto } from './dto/register.dto.js'; describe('authService', () => { let service: AuthService; @@ -54,9 +58,7 @@ describe('authService', () => { const hashPasswordMock = jest .spyOn(AuthService, 'hashPassword') - .mockImplementationOnce((password) => - Promise.resolve(`${password}-hashed`), - ); + .mockImplementationOnce((password) => Promise.resolve(`${password}-hashed`)); const signAsyncMock = jest.spyOn(jwtService, 'signAsync'); @@ -101,9 +103,7 @@ describe('authService', () => { prismaService.user.count.mockResolvedValueOnce(1); - await expect(service.register(credentials)).rejects.toBeInstanceOf( - ConflictException, - ); + await expect(service.register(credentials)).rejects.toBeInstanceOf(ConflictException); expect(prismaService.user.count).toHaveBeenCalledTimes(1); }); @@ -121,9 +121,7 @@ describe('authService', () => { const verifyPasswordMock = jest .spyOn(AuthService, 'verifyPassword') - .mockImplementationOnce((hash: string, password: string) => - Promise.resolve(hash === `${password}-hashed`), - ); + .mockImplementationOnce((hash: string, password: string) => Promise.resolve(hash === `${password}-hashed`)); const signAsyncMock = jest.spyOn(jwtService, 'signAsync'); @@ -140,10 +138,7 @@ describe('authService', () => { }); expect(prismaService.user.findFirst).toHaveBeenCalledTimes(1); - expect(verifyPasswordMock).toHaveBeenCalledWith( - `${credentials.password}-hashed`, - credentials.password, - ); + expect(verifyPasswordMock).toHaveBeenCalledWith(`${credentials.password}-hashed`, credentials.password); expect(verifyPasswordMock).toHaveBeenCalledTimes(1); expect(signAsyncMock).toHaveBeenCalledWith({ @@ -169,9 +164,7 @@ describe('authService', () => { prismaService.user.findFirst.mockResolvedValueOnce(null); - await expect(service.login(credentials)).rejects.toBeInstanceOf( - UnauthorizedException, - ); + await expect(service.login(credentials)).rejects.toBeInstanceOf(UnauthorizedException); expect(prismaService.user.findFirst).toHaveBeenCalledWith({ select: { @@ -198,13 +191,9 @@ describe('authService', () => { const verifyPasswordMock = jest .spyOn(AuthService, 'verifyPassword') - .mockImplementationOnce((hash: string, password: string) => - Promise.resolve(hash === `${password}-hashed`), - ); + .mockImplementationOnce((hash: string, password: string) => Promise.resolve(hash === `${password}-hashed`)); - await expect(service.login(credentials)).rejects.toBeInstanceOf( - UnauthorizedException, - ); + await expect(service.login(credentials)).rejects.toBeInstanceOf(UnauthorizedException); expect(prismaService.user.findFirst).toHaveBeenCalledWith({ select: { @@ -217,10 +206,7 @@ describe('authService', () => { }); expect(prismaService.user.findFirst).toHaveBeenCalledTimes(1); - expect(verifyPasswordMock).toHaveBeenCalledWith( - `not-${credentials.password}-hashed`, - credentials.password, - ); + expect(verifyPasswordMock).toHaveBeenCalledWith(`not-${credentials.password}-hashed`, credentials.password); expect(verifyPasswordMock).toHaveBeenCalledTimes(1); }); }); diff --git a/packages/backend/src/auth/auth.service.ts b/packages/backend/src/auth/auth.service.ts index 6becb47..d0261a3 100644 --- a/packages/backend/src/auth/auth.service.ts +++ b/packages/backend/src/auth/auth.service.ts @@ -1,16 +1,15 @@ import { randomBytes } from 'node:crypto'; -import { - ConflictException, - Injectable, - UnauthorizedException, -} from '@nestjs/common'; + +import { ConflictException, Injectable, UnauthorizedException } from '@nestjs/common'; import { JwtService } from '@nestjs/jwt'; import { hash, argon2id, verify } from 'argon2'; + import { PrismaService } from '../prisma/prisma.service.js'; -import { RegisterDto } from './dto/register.dto.js'; + import { LoginDto } from './dto/login.dto.js'; -import { UserTokenDto } from './entities/user-token.entity.js'; +import { RegisterDto } from './dto/register.dto.js'; import { UserTokenDataDto } from './entities/user-token-data.entity.js'; +import { UserTokenDto } from './entities/user-token.entity.js'; /* https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html#argon2id */ const OWASP_CONFIGS = [ @@ -85,10 +84,7 @@ export class AuthService { throw new UnauthorizedException(); } - const passwordMatch = await AuthService.verifyPassword( - user.password, - dto.password, - ); + const passwordMatch = await AuthService.verifyPassword(user.password, dto.password); if (!passwordMatch) { throw new UnauthorizedException(); } diff --git a/packages/backend/src/auth/dto/login.dto.ts b/packages/backend/src/auth/dto/login.dto.ts index af025dc..3c2f806 100644 --- a/packages/backend/src/auth/dto/login.dto.ts +++ b/packages/backend/src/auth/dto/login.dto.ts @@ -1,4 +1,5 @@ import { createZodDto } from 'nestjs-zod'; + import { loginSchema } from '../schemas/login.schema.js'; export class LoginDto extends createZodDto(loginSchema) {} diff --git a/packages/backend/src/auth/dto/register.dto.ts b/packages/backend/src/auth/dto/register.dto.ts index 63dd3f4..4f95994 100644 --- a/packages/backend/src/auth/dto/register.dto.ts +++ b/packages/backend/src/auth/dto/register.dto.ts @@ -1,4 +1,5 @@ import { createZodDto } from 'nestjs-zod'; + import { registerSchema } from '../schemas/register.schema.js'; export class RegisterDto extends createZodDto(registerSchema) {} diff --git a/packages/backend/src/auth/entities/user-token-data.entity.ts b/packages/backend/src/auth/entities/user-token-data.entity.ts index 1f8265d..9a6ea4e 100644 --- a/packages/backend/src/auth/entities/user-token-data.entity.ts +++ b/packages/backend/src/auth/entities/user-token-data.entity.ts @@ -1,4 +1,5 @@ import { createZodDto } from 'nestjs-zod'; + import { userTokenDataSchema } from '../schemas/user-token-data.schema.js'; export class UserTokenDataDto extends createZodDto(userTokenDataSchema) {} diff --git a/packages/backend/src/auth/entities/user-token.entity.ts b/packages/backend/src/auth/entities/user-token.entity.ts index e88d7d2..3f88a75 100644 --- a/packages/backend/src/auth/entities/user-token.entity.ts +++ b/packages/backend/src/auth/entities/user-token.entity.ts @@ -1,4 +1,5 @@ import { createZodDto } from 'nestjs-zod'; + import { userTokenSchema } from '../schemas/user-token.schema.js'; export class UserTokenDto extends createZodDto(userTokenSchema) {} diff --git a/packages/backend/src/auth/guards/jwt.guard.ts b/packages/backend/src/auth/guards/jwt.guard.ts index b1ec9ff..ec67cd9 100644 --- a/packages/backend/src/auth/guards/jwt.guard.ts +++ b/packages/backend/src/auth/guards/jwt.guard.ts @@ -1,10 +1,6 @@ -import { - CanActivate, - ExecutionContext, - Injectable, - UnauthorizedException, -} from '@nestjs/common'; +import { CanActivate, ExecutionContext, Injectable, UnauthorizedException } from '@nestjs/common'; import { FastifyRequest } from 'fastify'; + import { AuthService } from '../auth.service.js'; @Injectable() diff --git a/packages/backend/src/auth/schemas/login.schema.ts b/packages/backend/src/auth/schemas/login.schema.ts index bb0030b..1290b3d 100644 --- a/packages/backend/src/auth/schemas/login.schema.ts +++ b/packages/backend/src/auth/schemas/login.schema.ts @@ -1,4 +1,4 @@ -import z from 'zod'; +import { z } from 'zod'; export const loginSchema = z.object({ username: z.string().min(1).meta({ diff --git a/packages/backend/src/auth/schemas/register.schema.ts b/packages/backend/src/auth/schemas/register.schema.ts index 5639e22..a4bd993 100644 --- a/packages/backend/src/auth/schemas/register.schema.ts +++ b/packages/backend/src/auth/schemas/register.schema.ts @@ -1,4 +1,4 @@ -import z from 'zod'; +import { z } from 'zod'; export const registerSchema = z.object({ username: z.string().min(1).meta({ diff --git a/packages/backend/src/auth/schemas/user-token-data.schema.ts b/packages/backend/src/auth/schemas/user-token-data.schema.ts index 68f0714..1711ced 100644 --- a/packages/backend/src/auth/schemas/user-token-data.schema.ts +++ b/packages/backend/src/auth/schemas/user-token-data.schema.ts @@ -1,9 +1,7 @@ -import z from 'zod'; +import { z } from 'zod'; export const userTokenDataSchema = z.object({ - username: z - .string() - .meta({ description: "The authenticated user's username." }), + username: z.string().meta({ description: "The authenticated user's username." }), }); export type UserTokenData = z.infer; diff --git a/packages/backend/src/auth/schemas/user-token.schema.ts b/packages/backend/src/auth/schemas/user-token.schema.ts index 2606d3a..44839d6 100644 --- a/packages/backend/src/auth/schemas/user-token.schema.ts +++ b/packages/backend/src/auth/schemas/user-token.schema.ts @@ -1,4 +1,4 @@ -import z from 'zod'; +import { z } from 'zod'; export const userTokenSchema = z.object({ token: z.jwt().meta({ diff --git a/packages/backend/src/bot/bot.controller.spec.ts b/packages/backend/src/bot/bot.controller.spec.ts index 90150c8..60fba34 100644 --- a/packages/backend/src/bot/bot.controller.spec.ts +++ b/packages/backend/src/bot/bot.controller.spec.ts @@ -1,8 +1,12 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { DeepMockProxy, mockDeep } from 'jest-mock-extended'; +import type { TestingModule } from '@nestjs/testing'; +import { Test } from '@nestjs/testing'; +import type { DeepMockProxy } from 'jest-mock-extended'; +import { mockDeep } from 'jest-mock-extended'; + +import { AuthGuard } from '../auth/guards/jwt.guard.js'; + import { BotController } from './bot.controller.js'; import { BotService } from './bot.service.js'; -import { AuthGuard } from '../auth/guards/jwt.guard.js'; describe('BotController', () => { let controller: BotController; diff --git a/packages/backend/src/bot/bot.controller.ts b/packages/backend/src/bot/bot.controller.ts index e7b7424..7ce1d01 100644 --- a/packages/backend/src/bot/bot.controller.ts +++ b/packages/backend/src/bot/bot.controller.ts @@ -1,15 +1,4 @@ -import { - Body, - Controller, - Delete, - Get, - HttpCode, - HttpStatus, - Patch, - Post, - UseGuards, -} from '@nestjs/common'; - +import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Patch, Post, UseGuards } from '@nestjs/common'; import { ApiAcceptedResponse, ApiBearerAuth, @@ -22,20 +11,21 @@ import { ApiTags, ApiUnauthorizedResponse, } from '@nestjs/swagger'; + +import { AuthGuard } from '../auth/guards/jwt.guard.js'; + import { BotService } from './bot.service.js'; import { CreateBotZodDto } from './dto/create-bot.dto.js'; import { GetBotZodDto } from './dto/get-bot.dto.js'; import { GetRecommendedShardsZodDto } from './dto/get-recommended-shards.dto.js'; import { UpdateBotZodDto } from './dto/update-bot.dto.js'; -import { AuthGuard } from '../auth/guards/jwt.guard.js'; @ApiTags('Bot') @Controller('bot') @ApiBearerAuth('jwt') @UseGuards(AuthGuard) @ApiUnauthorizedResponse({ - description: - 'This route is protected by an Authorization header that is either not provided or invalid.', + description: 'This route is protected by an Authorization header that is either not provided or invalid.', }) export class BotController { constructor(private readonly botService: BotService) {} @@ -61,8 +51,7 @@ export class BotController { @Post() @HttpCode(HttpStatus.CREATED) @ApiCreatedResponse({ - description: - 'The bot informations have been retrieve correctly and it has been created in database successfully.', + description: 'The bot informations have been retrieve correctly and it has been created in database successfully.', type: GetBotZodDto, }) @ApiConflictResponse({ diff --git a/packages/backend/src/bot/bot.module.ts b/packages/backend/src/bot/bot.module.ts index 56555e3..0b805b6 100644 --- a/packages/backend/src/bot/bot.module.ts +++ b/packages/backend/src/bot/bot.module.ts @@ -1,9 +1,11 @@ import { Module } from '@nestjs/common'; -import { BotService } from './bot.service.js'; -import { BotController } from './bot.controller.js'; -import { PrismaModule } from '../prisma/prisma.module.js'; -import { ClustersModule } from '../clusters/clusters.module.js'; + import { AuthModule } from '../auth/auth.module.js'; +import { ClustersModule } from '../clusters/clusters.module.js'; +import { PrismaModule } from '../prisma/prisma.module.js'; + +import { BotController } from './bot.controller.js'; +import { BotService } from './bot.service.js'; @Module({ imports: [AuthModule, PrismaModule, ClustersModule], diff --git a/packages/backend/src/bot/bot.service.spec.ts b/packages/backend/src/bot/bot.service.spec.ts index e74f121..6a2c59e 100644 --- a/packages/backend/src/bot/bot.service.spec.ts +++ b/packages/backend/src/bot/bot.service.spec.ts @@ -1,15 +1,16 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { DeepMockProxy, mockDeep } from 'jest-mock-extended'; -import { BotService } from './bot.service.js'; -import { PrismaService } from '../prisma/prisma.service.js'; -import { ClustersService } from '../clusters/clusters.service.js'; -import { CreateBotDto, UpdateBotDto } from 'src/index.dto.js'; +import { BadRequestException, ConflictException, NotFoundException } from '@nestjs/common'; +import type { TestingModule } from '@nestjs/testing'; +import { Test } from '@nestjs/testing'; import { PrismaClientKnownRequestError } from '@prisma/client/runtime/client'; -import { - BadRequestException, - ConflictException, - NotFoundException, -} from '@nestjs/common'; +import type { DeepMockProxy } from 'jest-mock-extended'; +import { mockDeep } from 'jest-mock-extended'; + +import type { CreateBotDto, UpdateBotDto } from 'src/index.dto.js'; + +import { ClustersService } from '../clusters/clusters.service.js'; +import { PrismaService } from '../prisma/prisma.service.js'; + +import { BotService } from './bot.service.js'; const HALLMASTER_BOT_ID = '1352006130926096504'; const DISCORD_BOT_TOKEN = `${Buffer.from(HALLMASTER_BOT_ID).toString('base64')}.YYYYYY.ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ`; @@ -30,8 +31,7 @@ describe('BotService', () => { let service: BotService; const prismaService: DeepMockProxy = mockDeep(); - const clustersService: DeepMockProxy = - mockDeep(); + const clustersService: DeepMockProxy = mockDeep(); beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ @@ -89,9 +89,7 @@ describe('BotService', () => { }), ); - await expect(service.create(body)).rejects.toBeInstanceOf( - ConflictException, - ); + await expect(service.create(body)).rejects.toBeInstanceOf(ConflictException); }); it('should find the bot', async () => { @@ -304,9 +302,7 @@ describe('BotService', () => { dockerImage: MOCK_DOCKER_IMAGE, }); - await expect(service.update(body)).rejects.toBeInstanceOf( - BadRequestException, - ); + await expect(service.update(body)).rejects.toBeInstanceOf(BadRequestException); }); it('should reject layout with out-of-range shard IDs', async () => { @@ -321,9 +317,7 @@ describe('BotService', () => { dockerImage: MOCK_DOCKER_IMAGE, }); - await expect(service.update(body)).rejects.toBeInstanceOf( - BadRequestException, - ); + await expect(service.update(body)).rejects.toBeInstanceOf(BadRequestException); }); it('should throw NotFoundException when updating non-existent bot', async () => { @@ -336,9 +330,7 @@ describe('BotService', () => { prismaService.bot.findFirst.mockResolvedValueOnce(null); - await expect(service.update(body)).rejects.toBeInstanceOf( - NotFoundException, - ); + await expect(service.update(body)).rejects.toBeInstanceOf(NotFoundException); }); it('should remove the bot and stop all clusters', async () => { diff --git a/packages/backend/src/bot/bot.service.ts b/packages/backend/src/bot/bot.service.ts index 4b22061..f590a0f 100644 --- a/packages/backend/src/bot/bot.service.ts +++ b/packages/backend/src/bot/bot.service.ts @@ -1,4 +1,5 @@ import { UUID } from 'node:crypto'; + import { BadRequestException, ConflictException, @@ -8,13 +9,15 @@ import { NotFoundException, UnauthorizedException, } from '@nestjs/common'; +import { PrismaClientKnownRequestError } from '@prisma/client/runtime/client'; + import { ClustersService } from '../clusters/clusters.service.js'; import { PrismaService } from '../prisma/prisma.service.js'; + +import { formatDockerImage } from './bot.utils.js'; import { CreateBotZodDto } from './dto/create-bot.dto.js'; import { GetBotZodDto } from './dto/get-bot.dto.js'; import { UpdateBotZodDto } from './dto/update-bot.dto.js'; -import { PrismaClientKnownRequestError } from '@prisma/client/runtime/client'; -import { formatDockerImage } from './bot.utils.js'; @Injectable() export class BotService { @@ -52,9 +55,7 @@ export class BotService { for (const shardId of allShardIds) { if (shardId < 0 || shardId >= totalShards) { - throw new BadRequestException( - `Shard ID ${shardId} is out of range [0, ${totalShards - 1}].`, - ); + throw new BadRequestException(`Shard ID ${shardId} is out of range [0, ${totalShards - 1}].`); } } } @@ -88,10 +89,7 @@ export class BotService { const data = (await response.json()) as { shards?: number }; if (!data.shards || typeof data.shards !== 'number') { - throw new HttpException( - 'Got an invalid response from the Discord API.', - HttpStatus.FAILED_DEPENDENCY, - ); + throw new HttpException('Got an invalid response from the Discord API.', HttpStatus.FAILED_DEPENDENCY); } return { shards: data.shards }; @@ -168,12 +166,7 @@ export class BotService { if (input.image !== undefined) { const [serverName, ...path] = input.image.split('/'); const [image, tag] = path.join('/').split(':'); - if ( - current === null || - serverName !== current.serverName || - image !== current.image || - tag !== current.tag - ) { + if (current === null || serverName !== current.serverName || image !== current.image || tag !== current.tag) { update.serverName = serverName; update.image = image; update.tag = tag; @@ -209,23 +202,15 @@ export class BotService { const totalShards = layout.flat().length; const sortedLayout = layout.map((s) => [...s].sort((a, b) => a - b)); - const oldLayout = bot.clusters.map((c) => - [...c.shardIds].sort((a, b) => a - b), - ); - const layoutChanged = - JSON.stringify(sortedLayout) !== JSON.stringify(oldLayout); - - const tokenChanged = - updateBotDto.token !== undefined && updateBotDto.token !== bot.token; - - const dockerImageUpdate = this.buildDockerImageUpdate( - updateBotDto.dockerImage, - bot.dockerImage, - ); + const oldLayout = bot.clusters.map((c) => [...c.shardIds].sort((a, b) => a - b)); + const layoutChanged = JSON.stringify(sortedLayout) !== JSON.stringify(oldLayout); + + const tokenChanged = updateBotDto.token !== undefined && updateBotDto.token !== bot.token; + + const dockerImageUpdate = this.buildDockerImageUpdate(updateBotDto.dockerImage, bot.dockerImage); const dockerImageChanged = dockerImageUpdate !== undefined; - const shouldForceRestart = - layoutChanged || tokenChanged || dockerImageChanged; + const shouldForceRestart = layoutChanged || tokenChanged || dockerImageChanged; for (const cluster of bot.clusters) { await this.clustersService.remove(cluster.id as UUID); @@ -241,10 +226,7 @@ export class BotService { clusters: { createMany: { data: layout.map((clusterShardIds, index) => ({ - status: - shouldForceRestart || bot.clusters[index]?.status !== 'STOPPED' - ? 'UPDATING' - : 'STOPPED', + status: shouldForceRestart || bot.clusters[index]?.status !== 'STOPPED' ? 'UPDATING' : 'STOPPED', shardIds: clusterShardIds, })), }, diff --git a/packages/backend/src/bot/dto/create-bot.dto.ts b/packages/backend/src/bot/dto/create-bot.dto.ts index 8279883..9bf35c7 100644 --- a/packages/backend/src/bot/dto/create-bot.dto.ts +++ b/packages/backend/src/bot/dto/create-bot.dto.ts @@ -1,5 +1,5 @@ import { createZodDto } from 'nestjs-zod'; -import z from 'zod'; +import { z } from 'zod'; export const CreateBotDockerImageSchema = z.object({ image: z.string().meta({ @@ -7,12 +7,10 @@ export const CreateBotDockerImageSchema = z.object({ 'The Docker image to use, following this format: hostname/repo/image:tag. (example: hallmaster/discord-bot:tag)', }), username: z.string().optional().meta({ - description: - 'The username used to authenticate to a remote Docker registry.', + description: 'The username used to authenticate to a remote Docker registry.', }), password: z.string().optional().meta({ - description: - 'The password used to authenticate to a remote Docker registry.', + description: 'The password used to authenticate to a remote Docker registry.', }), }); @@ -21,8 +19,7 @@ export const CreateBotSchema = z.object({ description: 'The token of the Discord bot.', }), dockerImage: CreateBotDockerImageSchema.meta({ - description: - 'The information required to pull the Discord bot Docker image.', + description: 'The information required to pull the Discord bot Docker image.', }), }); diff --git a/packages/backend/src/bot/dto/get-bot.dto.ts b/packages/backend/src/bot/dto/get-bot.dto.ts index 7032e18..8488e64 100644 --- a/packages/backend/src/bot/dto/get-bot.dto.ts +++ b/packages/backend/src/bot/dto/get-bot.dto.ts @@ -1,5 +1,5 @@ import { createZodDto } from 'nestjs-zod'; -import z from 'zod'; +import { z } from 'zod'; export const GetBotDockerImageSchema = z.object({ image: z.string().meta({ @@ -18,8 +18,7 @@ export const GetBotSchema = z.object({ description: 'The total number of shards for the bot.', }), layout: z.array(z.array(z.number().nonnegative())).meta({ - description: - 'The cluster layout. Each element is an array of shard IDs assigned to that cluster.', + description: 'The cluster layout. Each element is an array of shard IDs assigned to that cluster.', }), dockerImage: GetBotDockerImageSchema.meta({ description: 'The Docker image configuration associated with the bot.', diff --git a/packages/backend/src/bot/dto/get-recommended-shards.dto.ts b/packages/backend/src/bot/dto/get-recommended-shards.dto.ts index 85a0624..51efa76 100644 --- a/packages/backend/src/bot/dto/get-recommended-shards.dto.ts +++ b/packages/backend/src/bot/dto/get-recommended-shards.dto.ts @@ -1,5 +1,5 @@ import { createZodDto } from 'nestjs-zod'; -import z from 'zod'; +import { z } from 'zod'; export const GetRecommendedShardsSchema = z.object({ shards: z.number().positive().meta({ @@ -7,6 +7,4 @@ export const GetRecommendedShardsSchema = z.object({ }), }); -export class GetRecommendedShardsZodDto extends createZodDto( - GetRecommendedShardsSchema, -) {} +export class GetRecommendedShardsZodDto extends createZodDto(GetRecommendedShardsSchema) {} diff --git a/packages/backend/src/bot/dto/update-bot.dto.ts b/packages/backend/src/bot/dto/update-bot.dto.ts index 3a3d33a..592e271 100644 --- a/packages/backend/src/bot/dto/update-bot.dto.ts +++ b/packages/backend/src/bot/dto/update-bot.dto.ts @@ -1,9 +1,7 @@ -import { z } from 'zod'; import { createZodDto } from 'nestjs-zod'; -import { - CreateBotDockerImageSchema, - CreateBotSchema, -} from './create-bot.dto.js'; +import { z } from 'zod'; + +import { CreateBotDockerImageSchema, CreateBotSchema } from './create-bot.dto.js'; export const UpdateBotSchema = CreateBotSchema.extend({ layout: z.array(z.array(z.number().nonnegative())).min(1).meta({ @@ -11,8 +9,7 @@ export const UpdateBotSchema = CreateBotSchema.extend({ 'The cluster layout. Each element is an array of shard IDs assigned to that cluster. Example: [[0, 1, 2], [3]] creates 2 clusters with 4 total shards.', }), dockerImage: CreateBotDockerImageSchema.partial().meta({ - description: - 'Partial Docker image configuration. Any provided field will be updated.', + description: 'Partial Docker image configuration. Any provided field will be updated.', }), }).partial(); diff --git a/packages/backend/src/clusters/clusters.controller.spec.ts b/packages/backend/src/clusters/clusters.controller.spec.ts index 2cd0053..0f1c854 100644 --- a/packages/backend/src/clusters/clusters.controller.spec.ts +++ b/packages/backend/src/clusters/clusters.controller.spec.ts @@ -1,14 +1,17 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { DeepMockProxy, mockDeep } from 'jest-mock-extended'; +import type { TestingModule } from '@nestjs/testing'; +import { Test } from '@nestjs/testing'; +import type { DeepMockProxy } from 'jest-mock-extended'; +import { mockDeep } from 'jest-mock-extended'; + +import { AuthGuard } from '../auth/guards/jwt.guard.js'; + import { ClustersController } from './clusters.controller.js'; import { ClustersService } from './clusters.service.js'; -import { AuthGuard } from '../auth/guards/jwt.guard.js'; describe('ClustersController', () => { let controller: ClustersController; const authGuard: DeepMockProxy = mockDeep(); - const clusterService: DeepMockProxy = - mockDeep(); + const clusterService: DeepMockProxy = mockDeep(); beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ diff --git a/packages/backend/src/clusters/clusters.controller.ts b/packages/backend/src/clusters/clusters.controller.ts index e3ac884..8a5d03f 100644 --- a/packages/backend/src/clusters/clusters.controller.ts +++ b/packages/backend/src/clusters/clusters.controller.ts @@ -1,3 +1,6 @@ +import type { UUID } from 'node:crypto'; +import { Readable } from 'node:stream'; + import { Controller, Delete, @@ -11,7 +14,6 @@ import { Sse, UseGuards, } from '@nestjs/common'; -import { Observable, timer, switchMap, from } from 'rxjs'; import { ApiBadRequestResponse, ApiBearerAuth, @@ -22,24 +24,21 @@ import { ApiTags, ApiUnauthorizedResponse, } from '@nestjs/swagger'; -import type { UUID } from 'node:crypto'; +import { Observable, timer, switchMap, from } from 'rxjs'; + +import { AuthGuard } from '../auth/guards/jwt.guard.js'; + import { ClustersService } from './clusters.service.js'; -import { GetClusterZodDto } from './dto/get-cluster.dto.js'; -import { - GetClusterLogsQueryZodDto, - GetClusterLogsZodDto, -} from './dto/get-cluster-logs.dto.js'; +import { GetClusterLogsQueryZodDto, GetClusterLogsZodDto } from './dto/get-cluster-logs.dto.js'; import { GetClusterStatsZodDto } from './dto/get-cluster-stats.dto.js'; -import { AuthGuard } from '../auth/guards/jwt.guard.js'; -import { Readable } from 'node:stream'; +import { GetClusterZodDto } from './dto/get-cluster.dto.js'; @ApiTags('Clusters') @Controller('clusters') @ApiBearerAuth('jwt') @UseGuards(AuthGuard) @ApiUnauthorizedResponse({ - description: - 'This route is protected by an Authorization header that is either not provided or invalid.', + description: 'This route is protected by an Authorization header that is either not provided or invalid.', }) export class ClustersController { constructor(private readonly clustersService: ClustersService) {} @@ -56,8 +55,7 @@ export class ClustersController { @Sse('stream') @ApiOkResponse({ - description: - 'SSE stream that emits the full list of clusters every 5 seconds.', + description: 'SSE stream that emits the full list of clusters every 5 seconds.', type: GetClusterZodDto, isArray: true, }) @@ -138,10 +136,7 @@ export class ClustersController { @ApiNotFoundResponse({ description: 'The ID points to an unresolved cluster.', }) - async getLogs( - @Param('id') id: UUID, - @Query() query: GetClusterLogsQueryZodDto, - ) { + async getLogs(@Param('id') id: UUID, @Query() query: GetClusterLogsQueryZodDto) { return await this.clustersService.logs( id, query.since ? new Date(query.since) : undefined, @@ -186,8 +181,7 @@ export class ClustersController { description: 'The ID points to an unresolved cluster.', }) @ApiBadRequestResponse({ - description: - 'The requested cluster has no bound container or its not running.', + description: 'The requested cluster has no bound container or its not running.', }) async getStats(@Param('id') id: UUID) { return await this.clustersService.stats(id); @@ -195,8 +189,7 @@ export class ClustersController { @Sse(':id/stats/stream') @ApiOkResponse({ - description: - 'SSE stream that emits the stats of the cluster every 5 seconds.', + description: 'SSE stream that emits the stats of the cluster every 5 seconds.', type: GetClusterStatsZodDto, }) @ApiProduces('text/event-stream') @@ -204,8 +197,7 @@ export class ClustersController { description: 'The ID points to an unresolved cluster.', }) @ApiBadRequestResponse({ - description: - 'The requested cluster has no bound container or its not running.', + description: 'The requested cluster has no bound container or its not running.', }) streamStats(@Param('id') id: UUID): Observable { return timer(0, 5000).pipe( diff --git a/packages/backend/src/clusters/clusters.module.ts b/packages/backend/src/clusters/clusters.module.ts index 3dc44e9..aacf456 100644 --- a/packages/backend/src/clusters/clusters.module.ts +++ b/packages/backend/src/clusters/clusters.module.ts @@ -1,9 +1,11 @@ import { Module } from '@nestjs/common'; -import { ClustersService } from './clusters.service.js'; -import { ClustersController } from './clusters.controller.js'; -import { PrismaModule } from '../prisma/prisma.module.js'; -import { DockerModule } from '../docker/docker.module.js'; + import { AuthModule } from '../auth/auth.module.js'; +import { DockerModule } from '../docker/docker.module.js'; +import { PrismaModule } from '../prisma/prisma.module.js'; + +import { ClustersController } from './clusters.controller.js'; +import { ClustersService } from './clusters.service.js'; @Module({ imports: [AuthModule, PrismaModule, DockerModule], diff --git a/packages/backend/src/clusters/clusters.service.spec.ts b/packages/backend/src/clusters/clusters.service.spec.ts index b7b041a..1f38947 100644 --- a/packages/backend/src/clusters/clusters.service.spec.ts +++ b/packages/backend/src/clusters/clusters.service.spec.ts @@ -1,8 +1,12 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { DeepMockProxy, mockDeep } from 'jest-mock-extended'; -import { ClustersService } from './clusters.service.js'; -import { PrismaService } from '../prisma/prisma.service.js'; +import type { TestingModule } from '@nestjs/testing'; +import { Test } from '@nestjs/testing'; +import type { DeepMockProxy } from 'jest-mock-extended'; +import { mockDeep } from 'jest-mock-extended'; + import { DockerService } from '../docker/docker.service.js'; +import { PrismaService } from '../prisma/prisma.service.js'; + +import { ClustersService } from './clusters.service.js'; describe('ClustersService', () => { let service: ClustersService; diff --git a/packages/backend/src/clusters/clusters.service.ts b/packages/backend/src/clusters/clusters.service.ts index 1e442dd..1a1ef7f 100644 --- a/packages/backend/src/clusters/clusters.service.ts +++ b/packages/backend/src/clusters/clusters.service.ts @@ -1,11 +1,9 @@ import { UUID } from 'node:crypto'; import type { Readable } from 'node:stream'; -import { - BadRequestException, - Injectable, - NotFoundException, -} from '@nestjs/common'; + import type { Cluster } from '@hallmaster/prisma-client'; +import { BadRequestException, Injectable, NotFoundException } from '@nestjs/common'; + import { DockerService } from '../docker/docker.service.js'; import { PrismaService } from '../prisma/prisma.service.js'; @@ -125,10 +123,7 @@ export class ClustersService { if (null === resource.containerId) { throw new BadRequestException('The cluster has no container ID.'); } - return await this.dockerService.streamContainerLogs( - resource.containerId, - tail, - ); + return await this.dockerService.streamContainerLogs(resource.containerId, tail); } async logs(id: UUID, since?: Date, until?: Date, tail?: number | 'all') { @@ -138,12 +133,7 @@ export class ClustersService { throw new BadRequestException('The cluster has no container ID.'); } - return await this.dockerService.getContainerLogs( - resource.containerId, - since, - until, - tail, - ); + return await this.dockerService.getContainerLogs(resource.containerId, since, until, tail); } async stats(id: UUID) { @@ -154,9 +144,7 @@ export class ClustersService { } if (resource.status !== 'RUNNING') { - throw new BadRequestException( - 'Unable to gather stats on a non-running cluster.', - ); + throw new BadRequestException('Unable to gather stats on a non-running cluster.'); } return await this.dockerService.getContainerStats(resource.containerId); diff --git a/packages/backend/src/clusters/dto/get-cluster-logs.dto.ts b/packages/backend/src/clusters/dto/get-cluster-logs.dto.ts index cfec1bb..0e9d911 100644 --- a/packages/backend/src/clusters/dto/get-cluster-logs.dto.ts +++ b/packages/backend/src/clusters/dto/get-cluster-logs.dto.ts @@ -1,5 +1,5 @@ import { createZodDto } from 'nestjs-zod'; -import z from 'zod'; +import { z } from 'zod'; export const GetClusterLogsQuerySchema = z.object({ since: z.iso.datetime().optional().meta({ @@ -8,22 +8,12 @@ export const GetClusterLogsQuerySchema = z.object({ until: z.iso.datetime().optional().meta({ description: 'At which point in time does the logs collection end.', }), - tail: z.coerce - .number() - .positive() - .min(1) - .or(z.literal('all')) - .optional() - .default('all') - .meta({ - description: - "How many logs to fetch, from latest to oldest. 'all' gets all the logs.", - }), + tail: z.coerce.number().positive().min(1).or(z.literal('all')).optional().default('all').meta({ + description: "How many logs to fetch, from latest to oldest. 'all' gets all the logs.", + }), }); -export class GetClusterLogsQueryZodDto extends createZodDto( - GetClusterLogsQuerySchema, -) {} +export class GetClusterLogsQueryZodDto extends createZodDto(GetClusterLogsQuerySchema) {} export type GetClusterLogsQueryDto = z.infer; diff --git a/packages/backend/src/clusters/dto/get-cluster-stats.dto.ts b/packages/backend/src/clusters/dto/get-cluster-stats.dto.ts index b46484b..0f921dd 100644 --- a/packages/backend/src/clusters/dto/get-cluster-stats.dto.ts +++ b/packages/backend/src/clusters/dto/get-cluster-stats.dto.ts @@ -1,13 +1,12 @@ import { createZodDto } from 'nestjs-zod'; -import z from 'zod'; +import { z } from 'zod'; const GetClusterStatsProcessesUsageSchema = z.object({ usage: z.number().meta({ description: 'The number of processes running in the cluster.', }), percentage: z.number().meta({ - description: - 'The number of running processes in the cluster over the limit.', + description: 'The number of running processes in the cluster over the limit.', }), }); @@ -34,12 +33,10 @@ const GetClusterStatsNetworkSchema = z.object({ const GetClusterStatsDiskSchema = z.object({ read: z.number().nullable().meta({ - description: - 'The number of bytes read from disk. The value is null if no disk interface is detected.', + description: 'The number of bytes read from disk. The value is null if no disk interface is detected.', }), write: z.number().nullable().meta({ - description: - 'The number of bytes written to disk. The value is null if no disk interface is detected.', + description: 'The number of bytes written to disk. The value is null if no disk interface is detected.', }), }); @@ -51,13 +48,10 @@ export const GetClusterStatsSchema = z.object({ memory: GetClusterStatsMemoryUsageSchema, disk: GetClusterStatsDiskSchema, networks: z.array(GetClusterStatsNetworkSchema).meta({ - description: - 'The usage of each detected networking interface in the cluster.', + description: 'The usage of each detected networking interface in the cluster.', }), }); -export class GetClusterStatsZodDto extends createZodDto( - GetClusterStatsSchema, -) {} +export class GetClusterStatsZodDto extends createZodDto(GetClusterStatsSchema) {} export type GetClusterStatsDto = z.infer; diff --git a/packages/backend/src/clusters/dto/get-cluster.dto.ts b/packages/backend/src/clusters/dto/get-cluster.dto.ts index 6e6243b..1d87908 100644 --- a/packages/backend/src/clusters/dto/get-cluster.dto.ts +++ b/packages/backend/src/clusters/dto/get-cluster.dto.ts @@ -1,5 +1,5 @@ import { createZodDto } from 'nestjs-zod'; -import z from 'zod'; +import { z } from 'zod'; export const GetClusterSchema = z.object({ id: z.uuid().meta({ diff --git a/packages/backend/src/docker/docker.module.ts b/packages/backend/src/docker/docker.module.ts index abd4c10..3d10b24 100644 --- a/packages/backend/src/docker/docker.module.ts +++ b/packages/backend/src/docker/docker.module.ts @@ -1,20 +1,19 @@ +import { DockerSocket } from '@hallmaster/docker.js'; import { Module } from '@nestjs/common'; import { ConfigModule, ConfigService } from '@nestjs/config'; -import { DockerSocket } from '@hallmaster/docker.js'; + import { PrismaModule } from '../prisma/prisma.module.js'; -import { DockerService } from './docker.service.js'; import { PrismaService } from '../prisma/prisma.service.js'; +import { DockerService } from './docker.service.js'; + @Module({ imports: [ConfigModule, PrismaModule], providers: [ { provide: DockerService, inject: [ConfigService, PrismaService], - async useFactory( - configService: ConfigService, - prismaService: PrismaService, - ) { + async useFactory(configService: ConfigService, prismaService: PrismaService) { const dockerSocket = new DockerSocket(); await dockerSocket.init(); diff --git a/packages/backend/src/docker/docker.service.spec.ts b/packages/backend/src/docker/docker.service.spec.ts index 0751aa8..2bb61fd 100644 --- a/packages/backend/src/docker/docker.service.spec.ts +++ b/packages/backend/src/docker/docker.service.spec.ts @@ -1,10 +1,14 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { ConfigService } from '@nestjs/config'; -import { DeepMockProxy, mockDeep } from 'jest-mock-extended'; import { DockerSocket } from '@hallmaster/docker.js'; -import { DockerService } from './docker.service.js'; +import { ConfigService } from '@nestjs/config'; +import type { TestingModule } from '@nestjs/testing'; +import { Test } from '@nestjs/testing'; +import type { DeepMockProxy } from 'jest-mock-extended'; +import { mockDeep } from 'jest-mock-extended'; + import { PrismaService } from '../prisma/prisma.service.js'; +import { DockerService } from './docker.service.js'; + describe('DockerService', () => { let service: DockerService; const prismaService: DeepMockProxy = mockDeep(); diff --git a/packages/backend/src/docker/docker.service.ts b/packages/backend/src/docker/docker.service.ts index 15ed0a0..3326fd9 100644 --- a/packages/backend/src/docker/docker.service.ts +++ b/packages/backend/src/docker/docker.service.ts @@ -1,20 +1,12 @@ -import { - DockerContainersAPI, - DockerImagesAPI, - DockerSocket, - DockerAPIHttpError, -} from '@hallmaster/docker.js'; -import { - BadRequestException, - Injectable, - InternalServerErrorException, - NotFoundException, -} from '@nestjs/common'; import type { Readable } from 'node:stream'; + +import { DockerContainersAPI, DockerImagesAPI, DockerSocket, DockerAPIHttpError } from '@hallmaster/docker.js'; +import { Bot, Cluster, DockerImage } from '@hallmaster/prisma-client'; +import { BadRequestException, Injectable, InternalServerErrorException, NotFoundException } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; -import { PrismaService } from '../prisma/prisma.service.js'; + import { GetClusterStatsZodDto } from '../clusters/dto/get-cluster-stats.dto.js'; -import { Bot, Cluster, DockerImage } from '@hallmaster/prisma-client'; +import { PrismaService } from '../prisma/prisma.service.js'; @Injectable() export class DockerService { @@ -48,7 +40,7 @@ export class DockerService { }); throw new BadRequestException('Unable to pull the Docker image.', { - description: `An error occurred while pulling the bot's Docker image from ${dockerImage.image}: ${e}`, + description: `An error occurred while pulling the bot's Docker image from ${dockerImage.image}: ${e instanceof Error ? e.message : String(e)}`, cause: e, }); } @@ -66,17 +58,11 @@ export class DockerService { throw new NotFoundException(); } - const discordBotTokenEnvName = this.configService.getOrThrow( - 'DISCORD_BOT_TOKEN_ENV_NAME', - ); + const discordBotTokenEnvName = this.configService.getOrThrow('DISCORD_BOT_TOKEN_ENV_NAME'); - const totalShardsEnvName = this.configService.getOrThrow( - 'TOTAL_SHARDS_ENV_NAME', - ); + const totalShardsEnvName = this.configService.getOrThrow('TOTAL_SHARDS_ENV_NAME'); - const shardIdListEnvName = this.configService.getOrThrow( - 'SHARD_ID_LIST_ENV_NAME', - ); + const shardIdListEnvName = this.configService.getOrThrow('SHARD_ID_LIST_ENV_NAME'); await this.prismaService.cluster.update({ data: { @@ -134,7 +120,7 @@ export class DockerService { }); throw new BadRequestException('Unable to create the cluster', { - description: `An error occurred while starting the Docker container project: ${e}`, + description: `An error occurred while starting the Docker container project: ${e instanceof Error ? e.message : String(e)}`, cause: e, }); } @@ -171,7 +157,7 @@ export class DockerService { }); throw new BadRequestException('Unable to create the cluster', { - description: `An error occurred while starting the Docker container project: ${e}`, + description: `An error occurred while starting the Docker container project: ${e instanceof Error ? e.message : String(e)}`, cause: e, }); } @@ -189,10 +175,7 @@ export class DockerService { await dockerContainersAPI.stop(container.Id); } catch (e) { - if ( - !(e instanceof DockerAPIHttpError) || - e.message !== `no such container: ${cluster.containerId}` - ) { + if (!(e instanceof DockerAPIHttpError) || e.message !== `no such container: ${cluster.containerId}`) { await this.prismaService.cluster.update({ where: { id: cluster.id, @@ -203,7 +186,7 @@ export class DockerService { }); throw new BadRequestException('Unable to stop the cluster', { - description: `An error occurred while removing the Docker container: ${e}`, + description: `An error occurred while removing the Docker container: ${e instanceof Error ? e.message : String(e)}`, cause: e, }); } @@ -231,7 +214,7 @@ export class DockerService { await dockerContainersAPI.remove(cluster.containerId); } catch (e) { throw new BadRequestException('Unable to remove the cluster', { - description: `An error occurred while removing the Docker container: ${e}`, + description: `An error occurred while removing the Docker container: ${e instanceof Error ? e.message : String(e)}`, cause: e, }); } @@ -253,10 +236,7 @@ export class DockerService { await this.start(bot, cluster); } - async streamContainerLogs( - containerId: string, - tail?: number | 'all', - ): Promise { + async streamContainerLogs(containerId: string, tail?: number | 'all'): Promise { const dockerContainersAPI = new DockerContainersAPI(this.dockerSocket); return await dockerContainersAPI.logs(containerId, { follow: true, @@ -267,12 +247,7 @@ export class DockerService { }); } - async getContainerLogs( - containerId: string, - since?: Date, - until?: Date, - tail?: number | 'all', - ) { + async getContainerLogs(containerId: string, since?: Date, until?: Date, tail?: number | 'all') { const dockerContainersAPI = new DockerContainersAPI(this.dockerSocket); const sinceTimestamp = since ? since.getTime() / 1000 : undefined; @@ -297,20 +272,13 @@ export class DockerService { stream: false, }); - const cpuDelta = - stats.cpu_stats.cpu_usage.total_usage - - stats.precpu_stats.cpu_usage.total_usage; + const cpuDelta = stats.cpu_stats.cpu_usage.total_usage - stats.precpu_stats.cpu_usage.total_usage; - const systemDelta = - stats.cpu_stats.system_cpu_usage - stats.precpu_stats.system_cpu_usage; + const systemDelta = stats.cpu_stats.system_cpu_usage - stats.precpu_stats.system_cpu_usage; - const onlineCPUs = - stats.cpu_stats.online_cpus ?? - stats.cpu_stats.cpu_usage.percpu_usage?.length ?? - 1; + const onlineCPUs = stats.cpu_stats.online_cpus ?? stats.cpu_stats.cpu_usage.percpu_usage?.length ?? 1; - const cpuPercentage = - systemDelta > 0 ? (cpuDelta / systemDelta) * onlineCPUs * 100 : 0; + const cpuPercentage = systemDelta > 0 ? (cpuDelta / systemDelta) * onlineCPUs * 100 : 0; const processesUsage = stats.pids_stats.current; const processesPercentage = (processesUsage / stats.pids_stats.limit) * 100; @@ -329,13 +297,11 @@ export class DockerService { ?.filter((service) => service.op === 'write') ?.reduce((acc, cur) => acc + cur.value, 0); - const networks = Object.entries(stats.networks).map( - ([interfaceName, data]) => ({ - interface: interfaceName, - transmitted: data.tx_bytes, - received: data.rx_bytes, - }), - ); + const networks = Object.entries(stats.networks).map(([interfaceName, data]) => ({ + interface: interfaceName, + transmitted: data.tx_bytes, + received: data.rx_bytes, + })); return { cpuPercentage: cpuPercentage, diff --git a/packages/backend/src/index.dto.ts b/packages/backend/src/index.dto.ts index aec4706..e4dab74 100644 --- a/packages/backend/src/index.dto.ts +++ b/packages/backend/src/index.dto.ts @@ -1,27 +1,15 @@ export { registerSchema } from './auth/schemas/register.schema.js'; export { loginSchema } from './auth/schemas/login.schema.js'; -export { - CreateBotSchema, - type CreateBotDto, -} from './bot/dto/create-bot.dto.js'; -export { - UpdateBotSchema, - type UpdateBotDto, -} from './bot/dto/update-bot.dto.js'; +export { CreateBotSchema, type CreateBotDto } from './bot/dto/create-bot.dto.js'; +export { UpdateBotSchema, type UpdateBotDto } from './bot/dto/update-bot.dto.js'; export { GetBotSchema, type GetBotDto } from './bot/dto/get-bot.dto.js'; -export { - GetClusterSchema, - type GetClusterDto, -} from './clusters/dto/get-cluster.dto.js'; +export { GetClusterSchema, type GetClusterDto } from './clusters/dto/get-cluster.dto.js'; export { GetClusterLogsQuerySchema, GetClusterLogsSchema, type GetClusterLogsQueryDto, type GetClusterLogsDto, } from './clusters/dto/get-cluster-logs.dto.js'; -export { - GetClusterStatsSchema, - type GetClusterStatsDto, -} from './clusters/dto/get-cluster-stats.dto.js'; +export { GetClusterStatsSchema, type GetClusterStatsDto } from './clusters/dto/get-cluster-stats.dto.js'; diff --git a/packages/backend/src/logger/logger.module.ts b/packages/backend/src/logger/logger.module.ts index d4766e5..d2adb67 100644 --- a/packages/backend/src/logger/logger.module.ts +++ b/packages/backend/src/logger/logger.module.ts @@ -1,4 +1,5 @@ import { Module } from '@nestjs/common'; + import { LoggerService } from './logger.service.js'; @Module({ diff --git a/packages/backend/src/logger/logger.service.spec.ts b/packages/backend/src/logger/logger.service.spec.ts index dc0d050..c42ab50 100644 --- a/packages/backend/src/logger/logger.service.spec.ts +++ b/packages/backend/src/logger/logger.service.spec.ts @@ -1,4 +1,6 @@ -import { Test, TestingModule } from '@nestjs/testing'; +import type { TestingModule } from '@nestjs/testing'; +import { Test } from '@nestjs/testing'; + import { LoggerService } from './logger.service.js'; describe('LoggerService', () => { diff --git a/packages/backend/src/logger/logger.service.ts b/packages/backend/src/logger/logger.service.ts index e9e34d2..0f64689 100644 --- a/packages/backend/src/logger/logger.service.ts +++ b/packages/backend/src/logger/logger.service.ts @@ -1,6 +1,6 @@ import { Injectable, LoggerService as NestLoggerService } from '@nestjs/common'; -import * as winston from 'winston'; import { utilities as nestWinstonModuleUtilities } from 'nest-winston'; +import * as winston from 'winston'; @Injectable() export class LoggerService implements NestLoggerService { diff --git a/packages/backend/src/logger/logging.interceptor.ts b/packages/backend/src/logger/logging.interceptor.ts index 0e182c4..95a7128 100644 --- a/packages/backend/src/logger/logging.interceptor.ts +++ b/packages/backend/src/logger/logging.interceptor.ts @@ -1,12 +1,7 @@ -import { - CallHandler, - ExecutionContext, - HttpException, - Injectable, - NestInterceptor, -} from '@nestjs/common'; -import { catchError, Observable, tap, throwError } from 'rxjs'; +import { CallHandler, ExecutionContext, HttpException, Injectable, NestInterceptor } from '@nestjs/common'; import type { FastifyReply, FastifyRequest } from 'fastify'; +import { catchError, Observable, tap, throwError } from 'rxjs'; + import { LoggerService } from './logger.service.js'; @Injectable() @@ -32,15 +27,9 @@ export class LoggingInterceptor implements NestInterceptor { if (error instanceof HttpException) { const statusCode = error.getStatus(); - this.logger.error( - `${method} ${url} ${statusCode} - ${duration}ms - ${error.message}`, - error.stack ?? '', - ); + this.logger.error(`${method} ${url} ${statusCode} - ${duration}ms - ${error.message}`, error.stack ?? ''); } else { - this.logger.error( - `${method} ${url} 500 - ${duration}ms`, - error instanceof Error ? (error.stack ?? '') : '', - ); + this.logger.error(`${method} ${url} 500 - ${duration}ms`, error instanceof Error ? (error.stack ?? '') : ''); } return throwError(() => error); diff --git a/packages/backend/src/main.ts b/packages/backend/src/main.ts index 3ee194b..4d8a0ef 100644 --- a/packages/backend/src/main.ts +++ b/packages/backend/src/main.ts @@ -1,23 +1,19 @@ import { constants } from 'node:zlib'; -import { cleanupOpenApiDoc, ZodValidationPipe } from 'nestjs-zod'; -import { - FastifyAdapter, - NestFastifyApplication, -} from '@nestjs/platform-fastify'; + +import fastifyCompress from '@fastify/compress'; import { Logger } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; import { NestFactory } from '@nestjs/core'; +import type { NestFastifyApplication } from '@nestjs/platform-fastify'; +import { FastifyAdapter } from '@nestjs/platform-fastify'; +import type { OpenAPIObject, SwaggerCustomOptions } from '@nestjs/swagger'; +import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; +import { cleanupOpenApiDoc, ZodValidationPipe } from 'nestjs-zod'; +import { SwaggerTheme, SwaggerThemeNameEnum } from 'swagger-themes'; + import { AppModule } from './app.module.js'; import { LoggerService } from './logger/logger.service.js'; import { LoggingInterceptor } from './logger/logging.interceptor.js'; -import { - DocumentBuilder, - OpenAPIObject, - SwaggerCustomOptions, - SwaggerModule, -} from '@nestjs/swagger'; -import { SwaggerTheme, SwaggerThemeNameEnum } from 'swagger-themes'; -import fastifyCompress from '@fastify/compress'; -import { ConfigService } from '@nestjs/config'; const getSwaggerDocumentConfig = (): Omit => new DocumentBuilder() @@ -26,14 +22,8 @@ const getSwaggerDocumentConfig = (): Omit => 'This document indexes all the available routes, along with their params, queries, payloads and responses.', ) .addTag('Authentication', 'All the endpoints used to authenticate a user.') - .addTag( - 'Bot', - "All the endpoints used to manage the bot's configuration (shards, clusters, ...)", - ) - .addTag( - 'Clusters', - 'All the endpoints to manage the clusters themselves (start, stop, restart, ...)', - ) + .addTag('Bot', "All the endpoints used to manage the bot's configuration (shards, clusters, ...)") + .addTag('Clusters', 'All the endpoints to manage the clusters themselves (start, stop, restart, ...)') .addBearerAuth( { type: 'http', @@ -46,10 +36,7 @@ const getSwaggerDocumentConfig = (): Omit => .build(); async function bootstrap() { - const app = await NestFactory.create( - AppModule, - new FastifyAdapter(), - ); + const app = await NestFactory.create(AppModule, new FastifyAdapter()); const configService = app.get(ConfigService); const port = configService.get('PORT', 3000); @@ -73,10 +60,7 @@ async function bootstrap() { }); const swaggerDocumentationConfig = getSwaggerDocumentConfig(); - const document = SwaggerModule.createDocument( - app, - swaggerDocumentationConfig, - ); + const document = SwaggerModule.createDocument(app, swaggerDocumentationConfig); cleanupOpenApiDoc(document); const theme = new SwaggerTheme(); const swaggerConfig: SwaggerCustomOptions = { diff --git a/packages/backend/src/prisma/prisma.module.ts b/packages/backend/src/prisma/prisma.module.ts index 45bf167..2d18a8e 100644 --- a/packages/backend/src/prisma/prisma.module.ts +++ b/packages/backend/src/prisma/prisma.module.ts @@ -1,5 +1,6 @@ import { Module } from '@nestjs/common'; import { ConfigModule, ConfigService } from '@nestjs/config'; + import { PrismaService } from './prisma.service.js'; @Module({ diff --git a/packages/backend/src/prisma/prisma.service.spec.ts b/packages/backend/src/prisma/prisma.service.spec.ts index ddb05f8..a763246 100644 --- a/packages/backend/src/prisma/prisma.service.spec.ts +++ b/packages/backend/src/prisma/prisma.service.spec.ts @@ -1,4 +1,6 @@ -import { Test, TestingModule } from '@nestjs/testing'; +import type { TestingModule } from '@nestjs/testing'; +import { Test } from '@nestjs/testing'; + import { PrismaService } from './prisma.service.js'; describe('PrismaService', () => { diff --git a/packages/backend/src/prisma/prisma.service.ts b/packages/backend/src/prisma/prisma.service.ts index 835b8a3..2e88644 100644 --- a/packages/backend/src/prisma/prisma.service.ts +++ b/packages/backend/src/prisma/prisma.service.ts @@ -1,13 +1,10 @@ import { PrismaClient } from '@hallmaster/prisma-client'; +import { Injectable, OnModuleDestroy, OnModuleInit } from '@nestjs/common'; import { PrismaPg } from '@prisma/adapter-pg'; import { Pool } from 'pg'; -import { Injectable, OnModuleDestroy, OnModuleInit } from '@nestjs/common'; @Injectable() -export class PrismaService - extends PrismaClient - implements OnModuleInit, OnModuleDestroy -{ +export class PrismaService extends PrismaClient implements OnModuleInit, OnModuleDestroy { constructor(databaseUrl: string) { const pool = new Pool({ connectionString: databaseUrl }); const adapter = new PrismaPg(pool); diff --git a/packages/backend/tsconfig.json b/packages/backend/tsconfig.json index 8d685e7..8c091b5 100644 --- a/packages/backend/tsconfig.json +++ b/packages/backend/tsconfig.json @@ -1,24 +1,38 @@ { + "$schema": "https://json.schemastore.org/tsconfig.json", "compilerOptions": { - "module": "node20", - "moduleResolution": "node16", + "strict": true, + "allowUnreachableCode": false, + "noFallthroughCasesInSwitch": true, + "noImplicitOverride": true, + "noImplicitReturns": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + + "module": "NodeNext", + "moduleResolution": "NodeNext", + "resolveJsonModule": true, + "declaration": true, + "declarationMap": true, "removeComments": true, - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "allowSyntheticDefaultImports": true, - "target": "ES2023", "sourceMap": true, + "newLine": "lf", "outDir": "./dist", "rootDir": "./", - "baseUrl": "./", - "incremental": true, - "skipLibCheck": true, - "strictNullChecks": true, + + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, "forceConsistentCasingInFileNames": true, - "noImplicitAny": false, - "strictBindCallApply": false, - "noFallthroughCasesInSwitch": false, "isolatedModules": true, + + "target": "ES2023", + "lib": ["ES2023"], + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + + "baseUrl": "./", + "incremental": true, + "skipLibCheck": true } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b49a525..6c49ec2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -138,6 +138,12 @@ importers: eslint-config-prettier: specifier: 10.1.8 version: 10.1.8(eslint@9.39.3(jiti@2.6.1)) + eslint-import-resolver-typescript: + specifier: ^4.4.4 + version: 4.4.4(eslint-plugin-import@2.32.0)(eslint@9.39.3(jiti@2.6.1)) + eslint-plugin-import: + specifier: ^2.32.0 + version: 2.32.0(@typescript-eslint/parser@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.3(jiti@2.6.1)) eslint-plugin-jest: specifier: 29.15.0 version: 29.15.0(@typescript-eslint/eslint-plugin@8.56.0(@typescript-eslint/parser@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1))(jest@29.7.0(@types/node@22.19.11)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.19.11)(typescript@5.9.3)))(typescript@5.9.3) @@ -623,6 +629,15 @@ packages: '@electric-sql/pglite@0.3.15': resolution: {integrity: sha512-Cj++n1Mekf9ETfdc16TlDi+cDDQF0W7EcbyRHYOAeZdsAe8M/FJg18itDTSwyHfar2WIezawM9o0EKaRGVKygQ==} + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + '@epic-web/invariant@1.0.0': resolution: {integrity: sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==} @@ -1323,6 +1338,9 @@ packages: resolution: {integrity: sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==} engines: {node: '>= 10'} + '@napi-rs/wasm-runtime@0.2.12': + resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + '@nestjs/cli@11.0.16': resolution: {integrity: sha512-P0H+Vcjki6P5160E5QnMt3Q0X5FTg4PZkP99Ig4lm/4JWqfw32j3EXv3YBTJ2DmxLwOQ/IS9F7dzKpMAgzKTGg==} engines: {node: '>= 20.11'} @@ -2127,6 +2145,9 @@ packages: cpu: [x64] os: [win32] + '@rtsao/scc@1.1.0': + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + '@scarf/scarf@1.4.0': resolution: {integrity: sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==} @@ -2423,6 +2444,9 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -2471,6 +2495,9 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + '@types/jsonwebtoken@9.0.10': resolution: {integrity: sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==} @@ -2581,6 +2608,109 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@unrs/resolver-binding-android-arm-eabi@1.11.1': + resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} + cpu: [arm] + os: [android] + + '@unrs/resolver-binding-android-arm64@1.11.1': + resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} + cpu: [arm64] + os: [android] + + '@unrs/resolver-binding-darwin-arm64@1.11.1': + resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} + cpu: [arm64] + os: [darwin] + + '@unrs/resolver-binding-darwin-x64@1.11.1': + resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} + cpu: [x64] + os: [darwin] + + '@unrs/resolver-binding-freebsd-x64@1.11.1': + resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} + cpu: [x64] + os: [freebsd] + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-x64-musl@1.11.1': + resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@unrs/resolver-binding-wasm32-wasi@1.11.1': + resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} + cpu: [arm64] + os: [win32] + + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} + cpu: [ia32] + os: [win32] + + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} + cpu: [x64] + os: [win32] + '@webassemblyjs/ast@1.14.1': resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} @@ -2936,9 +3066,17 @@ packages: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + array-ify@1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} + engines: {node: '>= 0.4'} + array-timsort@1.0.3: resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} @@ -2946,9 +3084,29 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} + array.prototype.findlastindex@1.2.6: + resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + async@3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} @@ -2959,6 +3117,10 @@ packages: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + avvio@9.2.0: resolution: {integrity: sha512-2t/sy01ArdHHE0vRH5Hsay+RtCZt3dLPji7W7/MMOCEgze5b7SNDC4j5H6FnVgPkI1MTNFGzHdHrVXDDl7QSSQ==} @@ -3118,6 +3280,10 @@ packages: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} + call-bind@1.0.9: + resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} + engines: {node: '>= 0.4'} + call-bound@1.0.4: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} @@ -3390,6 +3556,26 @@ packages: resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} engines: {node: '>=12'} + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -3433,6 +3619,14 @@ packages: resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} engines: {node: '>=10'} + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} @@ -3485,6 +3679,10 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dot-prop@5.3.0: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} @@ -3571,6 +3769,10 @@ packages: error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + es-abstract@1.24.2: + resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==} + engines: {node: '>= 0.4'} + es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -3590,6 +3792,14 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + esbuild@0.27.3: resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} engines: {node: '>=18'} @@ -3616,6 +3826,62 @@ packages: peerDependencies: eslint: '>=7.0.0' + eslint-import-context@0.1.9: + resolution: {integrity: sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + peerDependencies: + unrs-resolver: ^1.0.0 + peerDependenciesMeta: + unrs-resolver: + optional: true + + eslint-import-resolver-node@0.3.10: + resolution: {integrity: sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==} + + eslint-import-resolver-typescript@4.4.4: + resolution: {integrity: sha512-1iM2zeBvrYmUNTj2vSC/90JTHDth+dfOfiNKkxApWRsTJYNrc8rOdxxIf5vazX+BiAXTeOT0UvWpGI/7qIWQOw==} + engines: {node: ^16.17.0 || >=18.6.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + eslint-plugin-import-x: '*' + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + + eslint-module-utils@2.12.1: + resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-import@2.32.0: + resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint-plugin-jest@29.15.0: resolution: {integrity: sha512-ZCGr7vTH2WSo2hrK5oM2RULFmMruQ7W3cX7YfwoTiPfzTGTFBMmrVIz45jZHd++cGKj/kWf02li/RhTGcANJSA==} engines: {node: ^20.12.0 || ^22.0.0 || >=24.0.0} @@ -3882,6 +4148,10 @@ packages: fn.name@1.1.0: resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} @@ -3939,9 +4209,20 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + generate-function@2.3.1: resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -3969,6 +4250,13 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.14.0: + resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} + giget@2.0.0: resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==} hasBin: true @@ -4015,6 +4303,10 @@ packages: resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} engines: {node: '>=18'} + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -4041,10 +4333,21 @@ packages: engines: {node: '>=0.4.7'} hasBin: true + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} @@ -4136,6 +4439,10 @@ packages: inspect-with-kind@1.0.5: resolution: {integrity: sha512-MAQUJuIo7Xqk8EVNP+6d3CKq9c80hi4tjIbIAT6lmGW9W6WzlHiu9PS8uSuUYU+Do+j1baiFp3H25XEVxDIG2g==} + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -4144,17 +4451,52 @@ packages: resolution: {integrity: sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==} engines: {node: '>= 10'} + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-bun-module@2.0.0: + resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + is-core-module@2.16.1: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -4163,6 +4505,10 @@ packages: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -4171,9 +4517,21 @@ packages: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -4202,18 +4560,54 @@ packages: is-reference@3.0.3: resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + is-subdir@1.2.0: resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} engines: {node: '>=4'} + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} @@ -4221,6 +4615,9 @@ packages: isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -4473,6 +4870,10 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -4857,6 +5258,11 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + napi-postinstall@0.3.4: + resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -4894,6 +5300,10 @@ packages: node-emoji@1.11.0: resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} + node-exports-info@1.6.0: + resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==} + engines: {node: '>= 0.4'} + node-fetch-native@1.6.7: resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} @@ -4932,6 +5342,30 @@ packages: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.entries@1.1.9: + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + obug@2.1.1: resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} @@ -4967,6 +5401,10 @@ packages: outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + oxfmt@0.41.0: resolution: {integrity: sha512-sKLdJZdQ3bw6x9qKiT7+eID4MNEXlDHf5ZacfIircrq6Qwjk0L6t2/JQlZZrVHTXJawK3KaMuBoJnEJPcqCEdg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -5155,6 +5593,10 @@ packages: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + postcss@8.5.6: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} @@ -5331,9 +5773,17 @@ packages: reflect-metadata@0.2.2: resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + regexp-to-ast@0.5.0: resolution: {integrity: sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==} + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + remeda@2.33.4: resolution: {integrity: sha512-ygHswjlc/opg2VrtiYvUOPLjxjtdKvjGz1/plDhkG66hjNjFr1xmfrs2ClNFo/E6TyUFiwYNh53bKV26oBoMGQ==} @@ -5360,6 +5810,9 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve.exports@2.0.3: resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} engines: {node: '>=10'} @@ -5369,6 +5822,11 @@ packages: engines: {node: '>= 0.4'} hasBin: true + resolve@2.0.0-next.6: + resolution: {integrity: sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==} + engines: {node: '>= 0.4'} + hasBin: true + responselike@3.0.0: resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} engines: {node: '>=14.16'} @@ -5419,12 +5877,24 @@ packages: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + safe-regex2@5.0.0: resolution: {integrity: sha512-YwJwe5a51WlK7KbOJREPdjNrpViQBI3p4T50lfwPuDhZnE3XGVTlGvi+aolc5+RvxDD6bnUmjVsU9n1eboLUYw==} @@ -5490,6 +5960,18 @@ packages: set-cookie-parser@3.0.1: resolution: {integrity: sha512-n7Z7dXZhJbwuAHhNzkTti6Aw9QDDjZtm3JTpTGATIdNzdQz5GuFs22w90BcvF4INfnrL5xrX3oGsuqO5Dx3A1Q==} + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -5582,6 +6064,10 @@ packages: resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} engines: {node: '>= 0.6'} + stable-hash-x@0.2.0: + resolution: {integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==} + engines: {node: '>=12.0.0'} + stack-trace@0.0.10: resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} @@ -5596,6 +6082,10 @@ packages: std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} @@ -5614,6 +6104,18 @@ packages: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -5853,6 +6355,9 @@ packages: resolution: {integrity: sha512-zbem3rfRS8BgeNK50Zz5SIQgXzLafiHjOwUAvk/38/o1jHn/V5QAgVUcz884or7WYcPaH3N2CIfUc2u0ul7UcA==} engines: {node: '>=10.13.0'} + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + tsconfig-paths@4.2.0: resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} engines: {node: '>=6'} @@ -5884,6 +6389,22 @@ packages: resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} engines: {node: '>= 0.6'} + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} @@ -5912,6 +6433,10 @@ packages: resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} engines: {node: '>=18'} + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + unbzip2-stream@1.4.3: resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} @@ -5930,6 +6455,9 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} + unrs-resolver@1.11.1: + resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} + update-browserslist-db@1.2.3: resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} hasBin: true @@ -6041,6 +6569,22 @@ packages: webpack-cli: optional: true + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.20: + resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} + engines: {node: '>= 0.4'} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -6674,6 +7218,22 @@ snapshots: '@electric-sql/pglite@0.3.15': {} + '@emnapi/core@1.10.0': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.8.1 + optional: true + '@epic-web/invariant@1.0.0': {} '@esbuild/aix-ppc64@0.27.3': @@ -7431,6 +7991,13 @@ snapshots: '@napi-rs/nice-win32-x64-msvc': 1.1.1 optional: true + '@napi-rs/wasm-runtime@0.2.12': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.1 + optional: true + '@nestjs/cli@11.0.16(@swc/cli@0.6.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(chokidar@4.0.3))(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.19.11)': dependencies: '@angular-devkit/core': 19.2.19(chokidar@4.0.3) @@ -8011,6 +8578,8 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.60.0': optional: true + '@rtsao/scc@1.1.0': {} + '@scarf/scarf@1.4.0': {} '@sinclair/typebox@0.27.10': {} @@ -8299,6 +8868,11 @@ snapshots: '@tsconfig/node16@1.0.4': {} + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.29.0 @@ -8359,6 +8933,8 @@ snapshots: '@types/json-schema@7.0.15': {} + '@types/json5@0.0.29': {} + '@types/jsonwebtoken@9.0.10': dependencies: '@types/ms': 2.1.0 @@ -8506,6 +9082,65 @@ snapshots: '@ungap/structured-clone@1.3.0': {} + '@unrs/resolver-binding-android-arm-eabi@1.11.1': + optional: true + + '@unrs/resolver-binding-android-arm64@1.11.1': + optional: true + + '@unrs/resolver-binding-darwin-arm64@1.11.1': + optional: true + + '@unrs/resolver-binding-darwin-x64@1.11.1': + optional: true + + '@unrs/resolver-binding-freebsd-x64@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-x64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-wasm32-wasi@1.11.1': + dependencies: + '@napi-rs/wasm-runtime': 0.2.12 + optional: true + + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + optional: true + + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + optional: true + + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + optional: true + '@webassemblyjs/ast@1.14.1': dependencies: '@webassemblyjs/helper-numbers': 1.13.2 @@ -9119,20 +9754,76 @@ snapshots: aria-query@5.3.2: {} + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + array-ify@1.0.0: {} + array-includes@3.1.9: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + math-intrinsics: 1.1.0 + array-timsort@1.0.3: {} array-union@2.1.0: {} + array.prototype.findlastindex@1.2.6: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + + array.prototype.flat@1.3.3: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-shim-unscopables: 1.1.0 + + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-shim-unscopables: 1.1.0 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + asap@2.0.6: {} + async-function@1.0.0: {} + async@3.2.6: {} asynckit@0.4.0: {} atomic-sleep@1.0.0: {} + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + avvio@9.2.0: dependencies: '@fastify/error': 4.2.0 @@ -9344,6 +10035,13 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 + call-bind@1.0.9: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + call-bound@1.0.4: dependencies: call-bind-apply-helpers: 1.0.2 @@ -9593,6 +10291,28 @@ snapshots: dargs@8.1.0: {} + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + debug@3.2.7: + dependencies: + ms: 2.1.3 + debug@4.4.3: dependencies: ms: 2.1.3 @@ -9617,6 +10337,18 @@ snapshots: defer-to-connect@2.0.1: {} + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + defu@6.1.4: {} delayed-stream@1.0.0: {} @@ -9651,6 +10383,10 @@ snapshots: dependencies: path-type: 4.0.0 + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + dot-prop@5.3.0: dependencies: is-obj: 2.0.0 @@ -9741,6 +10477,63 @@ snapshots: dependencies: is-arrayish: 0.2.1 + es-abstract@1.24.2: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.20 + es-define-property@1.0.1: {} es-errors@1.3.0: {} @@ -9758,6 +10551,16 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 + es-shim-unscopables@1.1.0: + dependencies: + hasown: 2.0.2 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + esbuild@0.27.3: optionalDependencies: '@esbuild/aix-ppc64': 0.27.3 @@ -9800,6 +10603,76 @@ snapshots: dependencies: eslint: 9.39.3(jiti@2.6.1) + eslint-import-context@0.1.9(unrs-resolver@1.11.1): + dependencies: + get-tsconfig: 4.14.0 + stable-hash-x: 0.2.0 + optionalDependencies: + unrs-resolver: 1.11.1 + + eslint-import-resolver-node@0.3.10: + dependencies: + debug: 3.2.7 + is-core-module: 2.16.1 + resolve: 2.0.0-next.6 + transitivePeerDependencies: + - supports-color + + eslint-import-resolver-typescript@4.4.4(eslint-plugin-import@2.32.0)(eslint@9.39.3(jiti@2.6.1)): + dependencies: + debug: 4.4.3 + eslint: 9.39.3(jiti@2.6.1) + eslint-import-context: 0.1.9(unrs-resolver@1.11.1) + get-tsconfig: 4.14.0 + is-bun-module: 2.0.0 + stable-hash-x: 0.2.0 + tinyglobby: 0.2.15 + unrs-resolver: 1.11.1 + optionalDependencies: + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.3(jiti@2.6.1)) + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.3(jiti@2.6.1)): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.3(jiti@2.6.1) + eslint-import-resolver-node: 0.3.10 + eslint-import-resolver-typescript: 4.4.4(eslint-plugin-import@2.32.0)(eslint@9.39.3(jiti@2.6.1)) + transitivePeerDependencies: + - supports-color + + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.3(jiti@2.6.1)): + dependencies: + '@rtsao/scc': 1.1.0 + array-includes: 3.1.9 + array.prototype.findlastindex: 1.2.6 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 9.39.3(jiti@2.6.1) + eslint-import-resolver-node: 0.3.10 + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.3(jiti@2.6.1)) + hasown: 2.0.2 + is-core-module: 2.16.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + string.prototype.trimend: 1.0.9 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + eslint-plugin-jest@29.15.0(@typescript-eslint/eslint-plugin@8.56.0(@typescript-eslint/parser@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1))(jest@29.7.0(@types/node@22.19.11)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.19.11)(typescript@5.9.3)))(typescript@5.9.3): dependencies: '@typescript-eslint/utils': 8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) @@ -10149,6 +11022,10 @@ snapshots: fn.name@1.1.0: {} + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 @@ -10220,10 +11097,23 @@ snapshots: function-bind@1.1.2: {} + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + generate-function@2.3.1: dependencies: is-property: 1.0.2 + generator-function@2.0.1: {} + gensync@1.0.0-beta.2: {} get-caller-file@2.0.5: {} @@ -10252,6 +11142,16 @@ snapshots: get-stream@6.0.1: {} + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + get-tsconfig@4.14.0: + dependencies: + resolve-pkg-maps: 1.0.0 + giget@2.0.0: dependencies: citty: 0.1.6 @@ -10310,6 +11210,11 @@ snapshots: globals@16.5.0: {} + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + globby@11.1.0: dependencies: array-union: 2.1.0 @@ -10350,8 +11255,18 @@ snapshots: optionalDependencies: uglify-js: 3.19.3 + has-bigints@1.1.0: {} + has-flag@4.0.0: {} + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + has-symbols@1.1.0: {} has-tostringtag@1.0.2: @@ -10427,31 +11342,98 @@ snapshots: dependencies: kind-of: 6.0.3 + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + ipaddr.js@1.9.1: optional: true ipaddr.js@2.3.0: {} + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-arrayish@0.2.1: {} + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-bun-module@2.0.0: + dependencies: + semver: 7.7.4 + + is-callable@1.2.7: {} + is-core-module@2.16.1: dependencies: hasown: 2.0.2 + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + is-extglob@2.1.1: {} + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + is-fullwidth-code-point@3.0.0: {} is-generator-fn@2.1.0: {} + is-generator-function@1.1.2: + dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 is-interactive@1.0.0: {} + is-map@2.0.3: {} + is-module@1.0.0: {} + is-negative-zero@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + is-number@7.0.0: {} is-obj@2.0.0: {} @@ -10473,18 +11455,59 @@ snapshots: dependencies: '@types/estree': 1.0.8 + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + is-stream@2.0.1: {} + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + is-subdir@1.2.0: dependencies: better-path-resolve: 1.0.0 + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.20 + is-unicode-supported@0.1.0: {} + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-windows@1.0.2: {} isarray@1.0.0: {} + isarray@2.0.5: {} + isexe@2.0.0: {} istanbul-lib-coverage@3.2.2: {} @@ -10985,6 +12008,10 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} + json5@1.0.2: + dependencies: + minimist: 1.2.8 + json5@2.2.3: {} jsonc-parser@3.3.1: {} @@ -11308,6 +12335,8 @@ snapshots: nanoid@3.3.11: {} + napi-postinstall@0.3.4: {} + natural-compare@1.4.0: {} negotiator@1.0.0: @@ -11338,6 +12367,13 @@ snapshots: dependencies: lodash: 4.17.23 + node-exports-info@1.6.0: + dependencies: + array.prototype.flatmap: 1.3.3 + es-errors: 1.3.0 + object.entries: 1.1.9 + semver: 6.3.1 + node-fetch-native@1.6.7: {} node-gyp-build@4.8.4: {} @@ -11365,6 +12401,44 @@ snapshots: object-inspect@1.13.4: {} + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + object.entries@1.1.9: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-object-atoms: 1.1.1 + + object.groupby@1.0.3: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + + object.values@1.2.1: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + obug@2.1.1: {} ohash@2.0.11: {} @@ -11411,6 +12485,12 @@ snapshots: outdent@0.5.0: {} + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + oxfmt@0.41.0: dependencies: tinypool: 2.1.0 @@ -11626,6 +12706,8 @@ snapshots: pluralize@8.0.0: {} + possible-typed-array-names@1.1.0: {} + postcss@8.5.6: dependencies: nanoid: 3.3.11 @@ -11804,8 +12886,28 @@ snapshots: reflect-metadata@0.2.2: {} + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + regexp-to-ast@0.5.0: {} + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + remeda@2.33.4: {} require-directory@2.1.1: {} @@ -11822,6 +12924,8 @@ snapshots: resolve-from@5.0.0: {} + resolve-pkg-maps@1.0.0: {} + resolve.exports@2.0.3: {} resolve@1.22.11: @@ -11830,6 +12934,15 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + resolve@2.0.0-next.6: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.16.1 + node-exports-info: 1.6.0 + object-keys: 1.1.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + responselike@3.0.0: dependencies: lowercase-keys: 3.0.0 @@ -11936,10 +13049,29 @@ snapshots: dependencies: mri: 1.2.0 + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + safe-buffer@5.1.2: {} safe-buffer@5.2.1: {} + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + safe-regex2@5.0.0: dependencies: ret: 0.5.0 @@ -12016,6 +13148,28 @@ snapshots: set-cookie-parser@3.0.1: {} + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + setprototypeof@1.2.0: optional: true @@ -12108,6 +13262,8 @@ snapshots: sqlstring@2.3.3: {} + stable-hash-x@0.2.0: {} + stack-trace@0.0.10: {} stack-utils@2.0.6: @@ -12119,6 +13275,11 @@ snapshots: std-env@3.10.0: {} + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + stream-shift@1.0.3: {} streamsearch@1.1.0: @@ -12144,6 +13305,29 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 @@ -12401,6 +13585,13 @@ snapshots: tapable: 2.3.0 tsconfig-paths: 4.2.0 + tsconfig-paths@3.15.0: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + tsconfig-paths@4.2.0: dependencies: json5: 2.2.3 @@ -12432,6 +13623,39 @@ snapshots: mime-types: 3.0.2 optional: true + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + typedarray@0.0.6: optional: true @@ -12457,6 +13681,13 @@ snapshots: uint8array-extras@1.5.0: {} + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + unbzip2-stream@1.4.3: dependencies: buffer: 5.7.1 @@ -12471,6 +13702,30 @@ snapshots: unpipe@1.0.0: optional: true + unrs-resolver@1.11.1: + dependencies: + napi-postinstall: 0.3.4 + optionalDependencies: + '@unrs/resolver-binding-android-arm-eabi': 1.11.1 + '@unrs/resolver-binding-android-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-x64': 1.11.1 + '@unrs/resolver-binding-freebsd-x64': 1.11.1 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-arm64-musl': 1.11.1 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1 + '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-musl': 1.11.1 + '@unrs/resolver-binding-wasm32-wasi': 1.11.1 + '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1 + '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 + '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 + update-browserslist-db@1.2.3(browserslist@4.28.1): dependencies: browserslist: 4.28.1 @@ -12569,6 +13824,47 @@ snapshots: - esbuild - uglify-js + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.2 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.20 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.20: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + which@2.0.2: dependencies: isexe: 2.0.0