diff --git a/Dockerfile b/Dockerfile index a3c8b20..b2d2c8d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,14 +1,20 @@ -FROM node:20 - +# 1. Build Stage +FROM node:20-alpine AS builder WORKDIR /app -COPY package.json yarn.lock ./ +COPY package.json yarn.lock ./ +RUN yarn install --frozen-lockfile +COPY . . +RUN yarn build -RUN yarn install +# 2. Run Stage +FROM node:20-alpine +WORKDIR /app -COPY . . +COPY --from=builder /app/package.json /app/yarn.lock ./ +COPY --from=builder /app/dist ./dist -RUN yarn build +RUN yarn install --production --frozen-lockfile EXPOSE 3000 -CMD ["yarn", "start:dev"] +CMD ["node", "dist/src/main.js"] diff --git a/docker-compose.yml b/docker-compose.yml index 1696c16..a75fce3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,17 +12,3 @@ services: - '3000:3000' env_file: - .env - - mysql: - image: mysql:8.0 - restart: always - container_name: univent-db - environment: - MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD} - ports: - - '${DB_HOST_PORT}:${DB_CONTAINER_PORT}' - volumes: - - db-data:/var/lib/mysql - -volumes: - db-data: diff --git a/iam/admin/admin.module.ts b/iam/admin/admin.module.ts new file mode 100644 index 0000000..24c354e --- /dev/null +++ b/iam/admin/admin.module.ts @@ -0,0 +1,25 @@ +import { Module } from '@nestjs/common'; +import { ADMIN_REPOSITORY } from './domain/admin.repository'; +import { AdminRepositoryImpl } from './infrastructure/admin.repository.impl'; +import { MikroOrmModule } from '@mikro-orm/nestjs'; +import { AdminEntity } from './infrastructure/admin.entity'; +import { SharedModule } from 'src/shared/shared.module'; +import { AdminController } from './presentation/admin.controller'; +import { GetAdminUseCase } from './application/get/get-admin.use-case'; +import { CreateAdminUseCase } from './application/create/create.use-case'; + +const usecases = [GetAdminUseCase, CreateAdminUseCase]; + +@Module({ + imports: [MikroOrmModule.forFeature([AdminEntity]), SharedModule], + providers: [ + ...usecases, + { + provide: ADMIN_REPOSITORY, + useClass: AdminRepositoryImpl, + }, + ], + exports: [...usecases], + controllers: [AdminController], +}) +export class AdminModule {} diff --git a/iam/admin/application/create/create.command.ts b/iam/admin/application/create/create.command.ts new file mode 100644 index 0000000..6f3073f --- /dev/null +++ b/iam/admin/application/create/create.command.ts @@ -0,0 +1,3 @@ +export class CreateAdminCommand { + constructor(public readonly name: string) {} +} diff --git a/iam/admin/application/create/create.result.ts b/iam/admin/application/create/create.result.ts new file mode 100644 index 0000000..c7a5711 --- /dev/null +++ b/iam/admin/application/create/create.result.ts @@ -0,0 +1,3 @@ +export class CreateAdminResult { + adminId: string; +} diff --git a/iam/admin/application/create/create.use-case.ts b/iam/admin/application/create/create.use-case.ts new file mode 100644 index 0000000..1fca386 --- /dev/null +++ b/iam/admin/application/create/create.use-case.ts @@ -0,0 +1,29 @@ +import { ADMIN_REPOSITORY, AdminRepository } from 'iam/admin/domain/admin.repository'; +import { CreateAdminCommand } from './create.command'; +import { CreateAdminResult } from './create.result'; +import { Inject, Injectable } from '@nestjs/common'; +import { Admin } from 'iam/admin/domain/admin'; +import { Identifier } from 'src/shared/core/domain/identifier'; + +@Injectable() +export class CreateAdminUseCase { + constructor( + @Inject(ADMIN_REPOSITORY) + private readonly adminRepository: AdminRepository, + ) {} + + async execute(command: CreateAdminCommand): Promise { + const { name } = command; + + const admin = Admin.create({ + id: Identifier.create(), + name, + createdAt: new Date(), + updatedAt: new Date(), + }); + + await this.adminRepository.save(admin); + + return { adminId: admin.id.value }; + } +} diff --git a/iam/admin/application/get/get-admin.query.ts b/iam/admin/application/get/get-admin.query.ts new file mode 100644 index 0000000..faad2e5 --- /dev/null +++ b/iam/admin/application/get/get-admin.query.ts @@ -0,0 +1,7 @@ +import { IsNotEmpty, IsString } from 'class-validator'; + +export class GetAdminQuery { + @IsString() + @IsNotEmpty() + adminId: string; +} diff --git a/iam/admin/application/get/get-admin.use-case.ts b/iam/admin/application/get/get-admin.use-case.ts new file mode 100644 index 0000000..47394f6 --- /dev/null +++ b/iam/admin/application/get/get-admin.use-case.ts @@ -0,0 +1,18 @@ +import { Inject, Injectable } from '@nestjs/common'; +import { ADMIN_REPOSITORY, AdminRepository } from 'iam/admin/domain/admin.repository'; +import { GetAdminQuery } from './get-admin.query'; +import { AdminView } from 'iam/admin/domain/admin.view'; + +@Injectable() +export class GetAdminUseCase { + constructor( + @Inject(ADMIN_REPOSITORY) + private readonly adminRepository: AdminRepository, + ) {} + + async execute(query: GetAdminQuery): Promise { + const admin = await this.adminRepository.loadById(query.adminId); + + return { name: admin.name }; + } +} diff --git a/iam/admin/domain/admin.repository.ts b/iam/admin/domain/admin.repository.ts new file mode 100644 index 0000000..8c76a30 --- /dev/null +++ b/iam/admin/domain/admin.repository.ts @@ -0,0 +1,8 @@ +import { Admin } from './admin'; + +export interface AdminRepository { + save(admin: Admin): Promise; + loadById(id: string): Promise; +} + +export const ADMIN_REPOSITORY = Symbol('ADMIN_REPOSITORY'); diff --git a/iam/admin/domain/admin.ts b/iam/admin/domain/admin.ts new file mode 100644 index 0000000..286283c --- /dev/null +++ b/iam/admin/domain/admin.ts @@ -0,0 +1,35 @@ +import { AggregateRoot } from 'src/shared/core/domain/base.aggregate'; +import { BaseEntityProps } from 'src/shared/core/domain/base.entity'; +import { CustomException } from 'src/shared/exception/custom-exception'; +import { CustomExceptionCode } from 'src/shared/exception/custom-exception-code'; + +export interface AdminProps extends BaseEntityProps { + name: string; +} + +export class Admin extends AggregateRoot { + protected constructor(props: AdminProps) { + super(props); + } + + public static create(props: AdminProps): Admin { + const admin = new Admin(props); + admin.validate(); + + return admin; + } + + public static of(props: AdminProps): Admin { + return new Admin(props); + } + + public validate(): void { + if (this.props.name.length < 1 || this.props.name.length > 20) { + throw new CustomException(CustomExceptionCode.ADMIN_INVALID_NAME_LENGTH); + } + } + + get name(): string { + return this.props.name; + } +} diff --git a/iam/admin/domain/admin.view.ts b/iam/admin/domain/admin.view.ts new file mode 100644 index 0000000..4ac3daf --- /dev/null +++ b/iam/admin/domain/admin.view.ts @@ -0,0 +1,9 @@ +import { ApiProperty } from '@nestjs/swagger'; + +export class AdminView { + @ApiProperty({ + example: '이름', + description: '관리자 이름', + }) + name: string; +} diff --git a/iam/admin/infrastructure/admin.entity.ts b/iam/admin/infrastructure/admin.entity.ts new file mode 100644 index 0000000..b5ab820 --- /dev/null +++ b/iam/admin/infrastructure/admin.entity.ts @@ -0,0 +1,8 @@ +import { Entity, Property } from '@mikro-orm/core'; +import { BaseEntity } from 'src/shared/core/infrastructure/orm-entity/base.entity'; + +@Entity({ tableName: 'admin' }) +export class AdminEntity extends BaseEntity { + @Property({ type: 'varchar' }) + name: string; +} diff --git a/iam/admin/infrastructure/admin.mapper.ts b/iam/admin/infrastructure/admin.mapper.ts new file mode 100644 index 0000000..25fdaeb --- /dev/null +++ b/iam/admin/infrastructure/admin.mapper.ts @@ -0,0 +1,24 @@ +import { Identifier } from 'src/shared/core/domain/identifier'; +import { Admin } from '../domain/admin'; +import { AdminEntity } from './admin.entity'; + +export class AdminMapper { + static toDomain(entity: AdminEntity): Admin { + return Admin.create({ + id: Identifier.from(entity.id), + name: entity.name, + createdAt: entity.createdAt, + updatedAt: entity.updatedAt, + }); + } + + static toEntity(domain: Admin): AdminEntity { + const entity = new AdminEntity(); + entity.id = domain.id.value; + entity.name = domain.name; + entity.createdAt = domain.createdAt; + entity.updatedAt = domain.updatedAt; + + return entity; + } +} diff --git a/iam/admin/infrastructure/admin.repository.impl.ts b/iam/admin/infrastructure/admin.repository.impl.ts new file mode 100644 index 0000000..62b2671 --- /dev/null +++ b/iam/admin/infrastructure/admin.repository.impl.ts @@ -0,0 +1,28 @@ +import { EntityManager, EntityRepository } from '@mikro-orm/mysql'; +import { Admin } from '../domain/admin'; +import { AdminRepository } from '../domain/admin.repository'; +import { AdminMapper } from './admin.mapper'; +import { AdminEntity } from './admin.entity'; +import { InjectRepository } from '@mikro-orm/nestjs'; +import { CustomException } from 'src/shared/exception/custom-exception'; +import { CustomExceptionCode } from 'src/shared/exception/custom-exception-code'; + +export class AdminRepositoryImpl implements AdminRepository { + constructor( + @InjectRepository(AdminEntity) + private readonly ormRepository: EntityRepository, + private readonly em: EntityManager, + ) {} + + async save(admin: Admin): Promise { + const entity = AdminMapper.toEntity(admin); + await this.em.persistAndFlush(entity); + } + + async loadById(id: string): Promise { + const entity = await this.ormRepository.findOne({ id }); + if (!entity) throw new CustomException(CustomExceptionCode.ADMIN_NOT_FOUND); + + return AdminMapper.toDomain(entity); + } +} diff --git a/iam/admin/presentation/admin.controller.ts b/iam/admin/presentation/admin.controller.ts new file mode 100644 index 0000000..94b103b --- /dev/null +++ b/iam/admin/presentation/admin.controller.ts @@ -0,0 +1,22 @@ +import { Controller, Get, UseGuards } from '@nestjs/common'; +import { ApiTags } from '@nestjs/swagger'; +import { GetAdminUseCase } from '../application/get/get-admin.use-case'; +import { RolesGuard } from 'iam/auth/auth-core/infrastructure/guard/role.guard'; +import { AuthGuard } from '@nestjs/passport'; +import { Roles } from 'src/shared/core/presentation/role.decorator'; +import { Role } from 'iam/auth/auth-core/domain/value-object/role'; +import { Admin, AdminPayload } from 'src/shared/core/presentation/admin.decorator'; +import { AdminView } from '../domain/admin.view'; + +@ApiTags('admin') +@Controller('admin') +export class AdminController { + constructor(private readonly getAdminUseCase: GetAdminUseCase) {} + + @Get() + @UseGuards(AuthGuard('jwt-admin-access'), RolesGuard) + @Roles(Role.ADMIN) + async getAdminInfo(@Admin() admin: AdminPayload): Promise { + return await this.getAdminUseCase.execute({ adminId: admin.adminId }); + } +} diff --git a/iam/auth/auth-admin/application/login/login.command.ts b/iam/auth/auth-admin/application/login/login.command.ts new file mode 100644 index 0000000..c83a948 --- /dev/null +++ b/iam/auth/auth-admin/application/login/login.command.ts @@ -0,0 +1,6 @@ +export class AdminLoginCommand { + constructor( + public readonly accountId: string, + public readonly password: string, + ) {} +} diff --git a/iam/auth/auth-admin/application/login/login.result.ts b/iam/auth/auth-admin/application/login/login.result.ts new file mode 100644 index 0000000..a8e3b83 --- /dev/null +++ b/iam/auth/auth-admin/application/login/login.result.ts @@ -0,0 +1,3 @@ +export class AdminLoginResult { + accessToken: string; +} diff --git a/iam/auth/auth-admin/application/login/login.use-case.ts b/iam/auth/auth-admin/application/login/login.use-case.ts new file mode 100644 index 0000000..efd27a2 --- /dev/null +++ b/iam/auth/auth-admin/application/login/login.use-case.ts @@ -0,0 +1,47 @@ +import { Inject, Injectable } from '@nestjs/common'; +import { AUTH_ADMIN_REPOSITORY, AuthAdminRepository } from '../../domain/auth-admin.repository'; +import { AdminLoginCommand } from './login.command'; +import { PASSWORD_HASHER, PasswordHasher } from 'iam/auth/auth-core/domain/password-hasher'; +import { CustomException } from 'src/shared/exception/custom-exception'; +import { CustomExceptionCode } from 'src/shared/exception/custom-exception-code'; +import { TokenType } from 'iam/auth/auth-core/infrastructure/jwt/jwt.factory'; +import { AuthAdmin } from '../../domain/auth-admin'; +import { Role } from 'iam/auth/auth-core/domain/value-object/role'; +import { JwtProvider } from 'iam/auth/auth-core/infrastructure/jwt/jwt.provider'; +import { AdminLoginResult } from './login.result'; + +@Injectable() +export class AdminLoginUseCase { + constructor( + @Inject(AUTH_ADMIN_REPOSITORY) + private readonly authAdminRepository: AuthAdminRepository, + @Inject(PASSWORD_HASHER) + private readonly passwordHasher: PasswordHasher, + private readonly jwtProvider: JwtProvider, + ) {} + + async execute(command: AdminLoginCommand): Promise { + const { accountId, password } = command; + + const authAdmin = await this.validateAccount(accountId.trim(), password.trim()); + const { accessToken } = await this.generateToken(authAdmin.adminId.value); + + return { accessToken }; + } + + private async validateAccount(accountId: string, password: string): Promise { + const authAdmin = await this.authAdminRepository.loadByAccountId(accountId); + if (!authAdmin) throw new CustomException(CustomExceptionCode.AUTH_ADMIN_NOT_FOUND); + + const isPasswordValid = await this.passwordHasher.compare(password, authAdmin.passwordHash.value); + if (!isPasswordValid) throw new CustomException(CustomExceptionCode.AUTH_INVALID_PASSWORD); + + return authAdmin; + } + + private async generateToken(adminId: string): Promise<{ accessToken: string }> { + const { token: accessToken } = await this.jwtProvider.generateToken(TokenType.ACCESS, adminId, [Role.ADMIN]); + + return { accessToken }; + } +} diff --git a/iam/auth/auth-admin/application/register/register-admin.command.ts b/iam/auth/auth-admin/application/register/register-admin.command.ts new file mode 100644 index 0000000..a8c7fb8 --- /dev/null +++ b/iam/auth/auth-admin/application/register/register-admin.command.ts @@ -0,0 +1,7 @@ +export class RegisterAdminCommand { + constructor( + public readonly accountId: string, + public readonly password: string, + public readonly name: string, + ) {} +} diff --git a/iam/auth/auth-admin/application/register/register-admin.result.ts b/iam/auth/auth-admin/application/register/register-admin.result.ts new file mode 100644 index 0000000..7b21902 --- /dev/null +++ b/iam/auth/auth-admin/application/register/register-admin.result.ts @@ -0,0 +1,3 @@ +export class RegisterAdminResult { + accessToken: string; +} diff --git a/iam/auth/auth-admin/application/register/register-admin.use-case.ts b/iam/auth/auth-admin/application/register/register-admin.use-case.ts new file mode 100644 index 0000000..33040c2 --- /dev/null +++ b/iam/auth/auth-admin/application/register/register-admin.use-case.ts @@ -0,0 +1,71 @@ +import { Inject, Injectable } from '@nestjs/common'; +import { AUTH_ADMIN_REPOSITORY, AuthAdminRepository } from '../../domain/auth-admin.repository'; +import { JwtProvider } from 'iam/auth/auth-core/infrastructure/jwt/jwt.provider'; +import { RegisterAdminCommand } from './register-admin.command'; +import { RegisterAdminResult } from './register-admin.result'; +import { CustomException } from 'src/shared/exception/custom-exception'; +import { CustomExceptionCode } from 'src/shared/exception/custom-exception-code'; +import { AuthAdmin } from '../../domain/auth-admin'; +import { TokenType } from 'iam/auth/auth-core/infrastructure/jwt/jwt.factory'; +import { Role } from 'iam/auth/auth-core/domain/value-object/role'; +import { Identifier } from 'src/shared/core/domain/identifier'; +import { AccountId } from 'iam/auth/auth-organization/domain/vo/account-id'; +import { PasswordHash } from 'iam/auth/auth-core/domain/value-object/password-hash'; +import { CreateAdminUseCase } from 'iam/admin/application/create/create.use-case'; +import { CreateAdminCommand } from 'iam/admin/application/create/create.command'; +import { Transactional } from '@mikro-orm/core'; +import { PASSWORD_HASHER, PasswordHasher } from 'iam/auth/auth-core/domain/password-hasher'; + +@Injectable() +export class RegisterAdminUseCase { + constructor( + @Inject(AUTH_ADMIN_REPOSITORY) + private readonly authAdminRepository: AuthAdminRepository, + @Inject(PASSWORD_HASHER) + private readonly passwordHasher: PasswordHasher, + private readonly jwtProvider: JwtProvider, + private readonly createAdminUseCase: CreateAdminUseCase, + ) {} + + @Transactional() + async execute(command: RegisterAdminCommand): Promise { + const { accountId, password, name } = command; + const existingAdmin = await this.authAdminRepository.loadByAccountId(accountId); + if (existingAdmin) throw new CustomException(CustomExceptionCode.AUTH_ADMIN_ALREADY_EXISTS); + + const adminId = await this.createAdmin(name); + const authAdmin = await this.createAuthAdmin(accountId, password, adminId); + const accessToken = await this.generateToken(authAdmin.adminId.value); + + return { accessToken }; + } + + private async createAdmin(name: string): Promise { + const { adminId } = await this.createAdminUseCase.execute(new CreateAdminCommand(name)); + return adminId; + } + + private async createAuthAdmin(accountId: string, password: string, adminId: string): Promise { + const passwordHash = await this.passwordHasher.hash(password); + + const authAdmin = AuthAdmin.create({ + id: Identifier.create(), + accountId: AccountId.create(accountId), + passwordHash: PasswordHash.create(passwordHash), + adminId: Identifier.from(adminId), + createdAt: new Date(), + updatedAt: new Date(), + isDeleted: false, + deletedAt: null, + }); + + await this.authAdminRepository.save(authAdmin); + + return authAdmin; + } + + private async generateToken(adminId: string): Promise { + const { token: accessToken } = await this.jwtProvider.generateToken(TokenType.ACCESS, adminId, [Role.ADMIN]); + return accessToken; + } +} diff --git a/iam/auth/auth-admin/auth-admin.module.ts b/iam/auth/auth-admin/auth-admin.module.ts new file mode 100644 index 0000000..76d7fc8 --- /dev/null +++ b/iam/auth/auth-admin/auth-admin.module.ts @@ -0,0 +1,30 @@ +import { MikroOrmModule } from '@mikro-orm/nestjs'; +import { Module } from '@nestjs/common'; +import { AuthAdminEntity } from './infrastructure/auth-admin.entity'; +import { AUTH_ADMIN_REPOSITORY } from './domain/auth-admin.repository'; +import { AuthAdminRepositoryImpl } from './infrastructure/auth-admin.repository.impl'; +import { AuthCoreModule } from '../auth-core/auth-core.module'; +import { AdminLoginUseCase } from './application/login/login.use-case'; +import { AuthAdminController } from './presentation/auth-admin.controller'; +import { AdminModule } from 'iam/admin/admin.module'; +import { RegisterAdminUseCase } from './application/register/register-admin.use-case'; +import { JwtAdminAccessStrategy } from './infrastructure/jwt/jwt-access.strategy'; +import { JwtAdminRefreshStrategy } from './infrastructure/jwt/jwt-refresh.strategy'; + +const usecases = [RegisterAdminUseCase, AdminLoginUseCase]; +const jwt = [JwtAdminAccessStrategy, JwtAdminRefreshStrategy]; + +@Module({ + imports: [MikroOrmModule.forFeature([AuthAdminEntity]), AuthCoreModule, AdminModule], + providers: [ + ...usecases, + ...jwt, + { + provide: AUTH_ADMIN_REPOSITORY, + useClass: AuthAdminRepositoryImpl, + }, + ], + controllers: [AuthAdminController], + exports: [], +}) +export class AuthAdminModule {} diff --git a/iam/auth/auth-admin/domain/auth-admin.repository.ts b/iam/auth/auth-admin/domain/auth-admin.repository.ts new file mode 100644 index 0000000..fb77698 --- /dev/null +++ b/iam/auth/auth-admin/domain/auth-admin.repository.ts @@ -0,0 +1,9 @@ +import { AuthAdmin } from './auth-admin'; + +export interface AuthAdminRepository { + save(authAdmin: AuthAdmin): Promise; + loadById(id: string): Promise; + loadByAccountId(accountId: string): Promise; +} + +export const AUTH_ADMIN_REPOSITORY = Symbol('AUTH_ADMIN_REPOSITORY'); diff --git a/iam/auth/auth-admin/domain/auth-admin.ts b/iam/auth/auth-admin/domain/auth-admin.ts new file mode 100644 index 0000000..f3d26d6 --- /dev/null +++ b/iam/auth/auth-admin/domain/auth-admin.ts @@ -0,0 +1,71 @@ +import { PasswordHash } from 'iam/auth/auth-core/domain/value-object/password-hash'; +import { AccountId } from 'iam/auth/auth-organization/domain/vo/account-id'; +import { AggregateRoot } from 'src/shared/core/domain/base.aggregate'; +import { BaseEntityProps } from 'src/shared/core/domain/base.entity'; +import { Identifier } from 'src/shared/core/domain/identifier'; + +export interface AuthAdminProps extends BaseEntityProps { + accountId: AccountId; + passwordHash: PasswordHash; + adminId: Identifier; + isDeleted: boolean; + deletedAt: Date | null; +} + +export class AuthAdmin extends AggregateRoot { + constructor(props: AuthAdminProps) { + super(props); + } + + public static create(props: AuthAdminProps): AuthAdmin { + const authAdmin = new AuthAdmin(props); + authAdmin.validate(); + + return authAdmin; + } + + public static of(props: AuthAdminProps): AuthAdmin { + return new AuthAdmin(props); + } + + public validate(): void {} + + update(accountId: AccountId | null, passwordHash: PasswordHash | null, adminId: Identifier | null) { + if (accountId) this.props.accountId = accountId; + if (passwordHash) this.props.passwordHash = passwordHash; + if (adminId) this.props.adminId = adminId; + this.props.updatedAt = new Date(); + + this.validate(); + } + + delete() { + this.props.isDeleted = true; + this.props.deletedAt = new Date(); + } + + unDelete() { + this.props.isDeleted = false; + this.props.deletedAt = null; + } + + get accountId(): AccountId { + return this.props.accountId; + } + + get passwordHash(): PasswordHash { + return this.props.passwordHash; + } + + get adminId(): Identifier { + return this.props.adminId; + } + + get isDeleted(): boolean { + return this.props.isDeleted; + } + + get deletedAt(): Date | null { + return this.props.deletedAt; + } +} diff --git a/iam/auth/auth-admin/infrastructure/auth-admin.entity.ts b/iam/auth/auth-admin/infrastructure/auth-admin.entity.ts new file mode 100644 index 0000000..6b915a3 --- /dev/null +++ b/iam/auth/auth-admin/infrastructure/auth-admin.entity.ts @@ -0,0 +1,21 @@ +import { Entity, Property, Unique } from '@mikro-orm/core'; +import { BaseEntity } from 'src/shared/core/infrastructure/orm-entity/base.entity'; + +@Entity({ tableName: 'auth_admin' }) +@Unique({ properties: ['accountId'] }) +export class AuthAdminEntity extends BaseEntity { + @Property({ type: 'varchar' }) + accountId: string; + + @Property({ type: 'varchar' }) + passwordHash: string; + + @Property({ type: 'varchar' }) + adminId: string; + + @Property({ type: 'boolean' }) + isDeleted: boolean; + + @Property({ type: 'datetime', nullable: true }) + deletedAt: Date | null; +} diff --git a/iam/auth/auth-admin/infrastructure/auth-admin.mapper.ts b/iam/auth/auth-admin/infrastructure/auth-admin.mapper.ts new file mode 100644 index 0000000..92acaf9 --- /dev/null +++ b/iam/auth/auth-admin/infrastructure/auth-admin.mapper.ts @@ -0,0 +1,33 @@ +import { Identifier } from 'src/shared/core/domain/identifier'; +import { AuthAdmin } from '../domain/auth-admin'; +import { AuthAdminEntity } from './auth-admin.entity'; +import { AccountId } from 'iam/auth/auth-organization/domain/vo/account-id'; +import { PasswordHash } from 'iam/auth/auth-core/domain/value-object/password-hash'; + +export class AuthAdminMapper { + static toEntity(domain: AuthAdmin): AuthAdminEntity { + const entity = new AuthAdminEntity(); + entity.id = domain.id.value; + entity.accountId = domain.accountId.value; + entity.passwordHash = domain.passwordHash.value; + entity.adminId = domain.adminId.value; + entity.isDeleted = domain.isDeleted; + entity.deletedAt = domain.deletedAt; + entity.createdAt = domain.createdAt; + entity.updatedAt = domain.updatedAt; + return entity; + } + + static toDomain(entity: AuthAdminEntity): AuthAdmin { + return new AuthAdmin({ + id: Identifier.from(entity.id), + accountId: AccountId.create(entity.accountId), + passwordHash: PasswordHash.create(entity.passwordHash), + adminId: Identifier.from(entity.adminId), + isDeleted: entity.isDeleted, + deletedAt: entity.deletedAt, + createdAt: entity.createdAt, + updatedAt: entity.updatedAt, + }); + } +} diff --git a/iam/auth/auth-admin/infrastructure/auth-admin.repository.impl.ts b/iam/auth/auth-admin/infrastructure/auth-admin.repository.impl.ts new file mode 100644 index 0000000..0e4c8b3 --- /dev/null +++ b/iam/auth/auth-admin/infrastructure/auth-admin.repository.impl.ts @@ -0,0 +1,35 @@ +import { InjectRepository } from '@mikro-orm/nestjs'; +import { AuthAdminEntity } from './auth-admin.entity'; +import { EntityManager, EntityRepository } from '@mikro-orm/mysql'; +import { AuthAdminRepository } from '../domain/auth-admin.repository'; +import { AuthAdmin } from '../domain/auth-admin'; +import { AuthAdminMapper } from './auth-admin.mapper'; +import { CustomException } from 'src/shared/exception/custom-exception'; +import { CustomExceptionCode } from 'src/shared/exception/custom-exception-code'; + +export class AuthAdminRepositoryImpl implements AuthAdminRepository { + constructor( + @InjectRepository(AuthAdminEntity) + private readonly ormRepository: EntityRepository, + private readonly em: EntityManager, + ) {} + + async save(authAdmin: AuthAdmin): Promise { + const entity = AuthAdminMapper.toEntity(authAdmin); + await this.em.persistAndFlush(entity); + } + + async loadById(id: string): Promise { + const entity = await this.ormRepository.findOne({ id }); + if (!entity) throw new CustomException(CustomExceptionCode.AUTH_ADMIN_NOT_FOUND); + + return AuthAdminMapper.toDomain(entity); + } + + async loadByAccountId(accountId: string): Promise { + const entity = await this.ormRepository.findOne({ accountId }); + if (!entity) return null; + + return AuthAdminMapper.toDomain(entity); + } +} diff --git a/iam/auth/auth-admin/infrastructure/jwt/jwt-access.strategy.ts b/iam/auth/auth-admin/infrastructure/jwt/jwt-access.strategy.ts new file mode 100644 index 0000000..48c6dcf --- /dev/null +++ b/iam/auth/auth-admin/infrastructure/jwt/jwt-access.strategy.ts @@ -0,0 +1,5 @@ +import { Injectable } from '@nestjs/common'; +import { CreateJwtAccessStrategy } from 'iam/auth/auth-core/infrastructure/jwt/base-jwt.strategy'; + +@Injectable() +export class JwtAdminAccessStrategy extends CreateJwtAccessStrategy('jwt-admin-access', 'adminAccessToken') {} diff --git a/iam/auth/auth-admin/infrastructure/jwt/jwt-refresh.strategy.ts b/iam/auth/auth-admin/infrastructure/jwt/jwt-refresh.strategy.ts new file mode 100644 index 0000000..396892a --- /dev/null +++ b/iam/auth/auth-admin/infrastructure/jwt/jwt-refresh.strategy.ts @@ -0,0 +1,5 @@ +import { Injectable } from '@nestjs/common'; +import { CreateJwtRefreshStrategy } from 'iam/auth/auth-core/infrastructure/jwt/base-jwt.strategy'; + +@Injectable() +export class JwtAdminRefreshStrategy extends CreateJwtRefreshStrategy('jwt-admin-refresh', 'adminRefreshToken') {} diff --git a/iam/auth/auth-admin/presentation/auth-admin.controller.ts b/iam/auth/auth-admin/presentation/auth-admin.controller.ts new file mode 100644 index 0000000..13578b4 --- /dev/null +++ b/iam/auth/auth-admin/presentation/auth-admin.controller.ts @@ -0,0 +1,57 @@ +import { Body, Controller, HttpStatus, Post, Res, UseGuards } from '@nestjs/common'; +import { AdminLoginUseCase } from '../application/login/login.use-case'; +import { ApiTags } from '@nestjs/swagger'; +import { AdminLoginRequestDto } from './dto/request/login.request.dto'; +import { Response } from 'express'; +import { accessTokenCookieOptions } from 'src/shared/config/cookie.config'; +import { RegisterAdminUseCase } from '../application/register/register-admin.use-case'; +import { RegisterAdminRequestDto } from './dto/request/register-admin.request.dto'; +import { AuthGuard } from '@nestjs/passport'; +import { RolesGuard } from 'iam/auth/auth-core/infrastructure/guard/role.guard'; +import { Roles } from 'src/shared/core/presentation/role.decorator'; +import { Role } from 'iam/auth/auth-core/domain/value-object/role'; + +@ApiTags('Auth Admin') +@Controller('auth/admin') +export class AuthAdminController { + constructor( + private readonly registerAdminUseCase: RegisterAdminUseCase, + private readonly adminLoginUseCase: AdminLoginUseCase, + ) {} + + @Post('register') + async register(@Body() dto: RegisterAdminRequestDto, @Res() res: Response): Promise { + const { accountId, password, name } = dto; + const { accessToken } = await this.registerAdminUseCase.execute({ + accountId: accountId, + password: password, + name: name, + }); + + res.cookie('adminAccessToken', accessToken, accessTokenCookieOptions); + + res.status(HttpStatus.CREATED).send(); + } + + @Post('login') + async login(@Body() dto: AdminLoginRequestDto, @Res() res: Response): Promise { + const { accountId, password } = dto; + const { accessToken } = await this.adminLoginUseCase.execute({ + accountId: accountId, + password: password, + }); + + res.cookie('adminAccessToken', accessToken, accessTokenCookieOptions); + + res.status(HttpStatus.OK).send(); + } + + @Post('logout') + @UseGuards(AuthGuard('jwt-admin-access'), RolesGuard) + @Roles(Role.ADMIN) + logout(@Res() res: Response) { + res.clearCookie('adminAccessToken', accessTokenCookieOptions); + + res.status(HttpStatus.OK).send(); + } +} diff --git a/iam/auth/auth-admin/presentation/dto/request/login.request.dto.ts b/iam/auth/auth-admin/presentation/dto/request/login.request.dto.ts new file mode 100644 index 0000000..0c6373e --- /dev/null +++ b/iam/auth/auth-admin/presentation/dto/request/login.request.dto.ts @@ -0,0 +1,20 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsNotEmpty, IsString } from 'class-validator'; + +export class AdminLoginRequestDto { + @IsString() + @IsNotEmpty() + @ApiProperty({ + description: '아이디', + example: 'org_123456', + }) + accountId: string; + + @IsString() + @IsNotEmpty() + @ApiProperty({ + description: '비밀번호', + example: 'password123', + }) + password: string; +} diff --git a/iam/auth/auth-admin/presentation/dto/request/register-admin.request.dto.ts b/iam/auth/auth-admin/presentation/dto/request/register-admin.request.dto.ts new file mode 100644 index 0000000..a531e5f --- /dev/null +++ b/iam/auth/auth-admin/presentation/dto/request/register-admin.request.dto.ts @@ -0,0 +1,31 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsNotEmpty, IsString } from 'class-validator'; + +export class RegisterAdminRequestDto { + @IsString() + @IsNotEmpty() + @ApiProperty({ + description: '관리자 아이디', + example: 'org123', + required: true, + }) + accountId: string; + + @IsString() + @IsNotEmpty() + @ApiProperty({ + description: '관리자 비밀번호', + example: 'password123', + required: true, + }) + password: string; + + @IsString() + @IsNotEmpty() + @ApiProperty({ + description: '관리자명', + example: 'Admin Name', + required: true, + }) + name: string; +} diff --git a/iam/auth/auth-core/auth-core.module.ts b/iam/auth/auth-core/auth-core.module.ts index 9b31632..71a5941 100644 --- a/iam/auth/auth-core/auth-core.module.ts +++ b/iam/auth/auth-core/auth-core.module.ts @@ -6,14 +6,23 @@ import { PassportModule } from '@nestjs/passport'; import { JwtModule } from '@nestjs/jwt'; import { KakaoOAuthProvider } from './infrastructure/oauth/kakao.provider'; import { OAuthProviderFactory } from './infrastructure/oauth/oauth-provider.factory'; +import { PASSWORD_HASHER } from './domain/password-hasher'; +import { PasswordHasherImpl } from './infrastructure/bcrypt/password-hasher.impl'; -const jwt = [JwtProvider, JwtAccessStrategy, JwtRefreshStrategy]; +const jwt = [JwtProvider, JwtAccessStrategy, JwtRefreshStrategy, PassportModule, JwtModule]; const oAuth = [OAuthProviderFactory, KakaoOAuthProvider]; @Module({ imports: [PassportModule, JwtModule.register({})], - providers: [...jwt, ...oAuth], + providers: [ + ...jwt, + ...oAuth, + { + provide: PASSWORD_HASHER, + useClass: PasswordHasherImpl, + }, + ], controllers: [], - exports: [OAuthProviderFactory, ...jwt], + exports: [OAuthProviderFactory, ...jwt, PASSWORD_HASHER], }) export class AuthCoreModule {} diff --git a/iam/auth/auth-organization/domain/password-hasher.ts b/iam/auth/auth-core/domain/password-hasher.ts similarity index 100% rename from iam/auth/auth-organization/domain/password-hasher.ts rename to iam/auth/auth-core/domain/password-hasher.ts diff --git a/iam/auth/auth-organization/domain/vo/password-hash.ts b/iam/auth/auth-core/domain/value-object/password-hash.ts similarity index 100% rename from iam/auth/auth-organization/domain/vo/password-hash.ts rename to iam/auth/auth-core/domain/value-object/password-hash.ts diff --git a/iam/auth/auth-organization/infrastructure/password-hasher.impl.ts b/iam/auth/auth-core/infrastructure/bcrypt/password-hasher.impl.ts similarity index 83% rename from iam/auth/auth-organization/infrastructure/password-hasher.impl.ts rename to iam/auth/auth-core/infrastructure/bcrypt/password-hasher.impl.ts index f4d7ee6..56948f4 100644 --- a/iam/auth/auth-organization/infrastructure/password-hasher.impl.ts +++ b/iam/auth/auth-core/infrastructure/bcrypt/password-hasher.impl.ts @@ -1,5 +1,5 @@ import * as bcrypt from 'bcrypt'; -import { PasswordHasher } from '../domain/password-hasher'; +import { PasswordHasher } from '../../domain/password-hasher'; export class PasswordHasherImpl implements PasswordHasher { async hash(plain: string): Promise { diff --git a/iam/auth/auth-core/infrastructure/jwt/base-jwt.strategy.ts b/iam/auth/auth-core/infrastructure/jwt/base-jwt.strategy.ts new file mode 100644 index 0000000..03b8006 --- /dev/null +++ b/iam/auth/auth-core/infrastructure/jwt/base-jwt.strategy.ts @@ -0,0 +1,43 @@ +import { Injectable } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { PassportStrategy } from '@nestjs/passport'; +import { Request } from 'express'; +import { ExtractJwt, JwtFromRequestFunction, Strategy } from 'passport-jwt'; +import { CustomException } from 'src/shared/exception/custom-exception'; +import { CustomExceptionCode } from 'src/shared/exception/custom-exception-code'; +import { JwtPayload } from './jwt-payload'; + +function CreateJwtStrategy(strategyName: string, cookieName: string, secretKeyConfigPath: string) { + @Injectable() + abstract class JwtStrategy extends PassportStrategy(Strategy, strategyName) { + constructor(readonly configService: ConfigService) { + super({ + jwtFromRequest: ExtractJwt.fromExtractors([ + (req: Request) => { + try { + return req.cookies?.[cookieName] as string; + } catch (e: unknown) { + console.log(e); + throw new CustomException(CustomExceptionCode.AUTH_INVALID_ACCESS_TOKEN); + } + }, + ]) as JwtFromRequestFunction, + ignoreExpiration: false, + secretOrKey: configService.getOrThrow(secretKeyConfigPath), + }); + } + + validate(payload: JwtPayload): JwtPayload { + return payload; + } + } + return JwtStrategy; +} + +export function CreateJwtAccessStrategy(strategyName: string, cookieName: string) { + return CreateJwtStrategy(strategyName, cookieName, 'jwt.access.secret'); +} + +export function CreateJwtRefreshStrategy(strategyName: string, cookieName: string) { + return CreateJwtStrategy(strategyName, cookieName, 'jwt.refresh.secret'); +} diff --git a/iam/auth/auth-organization/application/change-password/change-password.command.ts b/iam/auth/auth-organization/application/change-password/change-password.command.ts new file mode 100644 index 0000000..0ded125 --- /dev/null +++ b/iam/auth/auth-organization/application/change-password/change-password.command.ts @@ -0,0 +1,7 @@ +export class ChangePasswordCommand { + constructor( + public readonly organizationId: string, + public readonly currentPassword: string, + public readonly newPassword: string, + ) {} +} diff --git a/iam/auth/auth-organization/application/change-password/change-password.use-case.ts b/iam/auth/auth-organization/application/change-password/change-password.use-case.ts new file mode 100644 index 0000000..986373e --- /dev/null +++ b/iam/auth/auth-organization/application/change-password/change-password.use-case.ts @@ -0,0 +1,35 @@ +import { Inject, Injectable } from '@nestjs/common'; +import { ChangePasswordCommand } from './change-password.command'; +import { AUTH_ORGANIZATION_STORE, AuthOrganizationStore } from '../../domain/auth-organization.store'; +import { CustomException } from 'src/shared/exception/custom-exception'; +import { CustomExceptionCode } from 'src/shared/exception/custom-exception-code'; +import { PASSWORD_HASHER, PasswordHasher } from 'iam/auth/auth-core/domain/password-hasher'; +import { PasswordHash } from 'iam/auth/auth-core/domain/value-object/password-hash'; + +@Injectable() +export class ChangeOrganizationPasswordUseCase { + constructor( + @Inject(AUTH_ORGANIZATION_STORE) + private readonly authOrganizationStore: AuthOrganizationStore, + @Inject(PASSWORD_HASHER) + private readonly passwordHasher: PasswordHasher, + ) {} + + async execute(command: ChangePasswordCommand) { + const { organizationId, currentPassword, newPassword } = command; + + const authOrganization = await this.authOrganizationStore.loadByOrganizationId(organizationId); + if (!authOrganization) throw new CustomException(CustomExceptionCode.AUTH_ORGANIZATION_NOT_FOUND); + + console.log('currentPassword:', currentPassword); + console.log('authOrganization.passwordHash.value:', authOrganization.passwordHash.value); + + const isPasswordValid = await this.passwordHasher.compare(currentPassword, authOrganization.passwordHash.value); + if (!isPasswordValid) throw new CustomException(CustomExceptionCode.AUTH_INVALID_CURRENT_PASSWORD); + + const newPasswordHash = await this.passwordHasher.hash(newPassword); + authOrganization.updatePassword(PasswordHash.create(newPasswordHash)); + + await this.authOrganizationStore.update(authOrganization); + } +} diff --git a/iam/auth/auth-organization/application/login/login.use-case.ts b/iam/auth/auth-organization/application/login/login.use-case.ts index 49b0f58..25b07ac 100644 --- a/iam/auth/auth-organization/application/login/login.use-case.ts +++ b/iam/auth/auth-organization/application/login/login.use-case.ts @@ -1,7 +1,6 @@ import { Inject, Injectable } from '@nestjs/common'; import { LoginCommand } from './login.command'; import { AUTH_ORGANIZATION_STORE, AuthOrganizationStore } from '../../domain/auth-organization.store'; -import { PASSWORD_HASHER, PasswordHasher } from '../../domain/password-hasher'; import { CustomException } from 'src/shared/exception/custom-exception'; import { CustomExceptionCode } from 'src/shared/exception/custom-exception-code'; import { AuthOrganization } from '../../domain/auth-organization'; @@ -9,6 +8,7 @@ import { LoginResult } from './login.result'; import { JwtProvider } from 'iam/auth/auth-core/infrastructure/jwt/jwt.provider'; import { Role } from 'iam/auth/auth-core/domain/value-object/role'; import { TokenType } from 'iam/auth/auth-core/infrastructure/jwt/jwt.factory'; +import { PASSWORD_HASHER, PasswordHasher } from 'iam/auth/auth-core/domain/password-hasher'; @Injectable() export class LoginUseCase { @@ -35,7 +35,7 @@ export class LoginUseCase { if (!authOrganization) throw new CustomException(CustomExceptionCode.AUTH_ORGANIZATION_NOT_FOUND); const isPasswordValid = await this.passwordHasher.compare(password, authOrganization.passwordHash.value); - if (!isPasswordValid) throw new CustomException(CustomExceptionCode.AUTH_ORGANIZATION_INVALID_PASSWORD); + if (!isPasswordValid) throw new CustomException(CustomExceptionCode.AUTH_INVALID_PASSWORD); return authOrganization; } diff --git a/iam/auth/auth-organization/application/create/create.command.ts b/iam/auth/auth-organization/application/register-organization/register-organization.command.ts similarity index 79% rename from iam/auth/auth-organization/application/create/create.command.ts rename to iam/auth/auth-organization/application/register-organization/register-organization.command.ts index 435301c..95ac38e 100644 --- a/iam/auth/auth-organization/application/create/create.command.ts +++ b/iam/auth/auth-organization/application/register-organization/register-organization.command.ts @@ -1,4 +1,4 @@ -export class CreateAuthOrganizationCommand { +export class RegisterOrganizationCommand { constructor( public readonly accountId: string, public readonly password: string, diff --git a/iam/auth/auth-organization/application/create/create.use-case.ts b/iam/auth/auth-organization/application/register-organization/register-organization.use-case.ts similarity index 51% rename from iam/auth/auth-organization/application/create/create.use-case.ts rename to iam/auth/auth-organization/application/register-organization/register-organization.use-case.ts index d5a0bea..f0228f7 100644 --- a/iam/auth/auth-organization/application/create/create.use-case.ts +++ b/iam/auth/auth-organization/application/register-organization/register-organization.use-case.ts @@ -1,40 +1,52 @@ import { Inject, Injectable } from '@nestjs/common'; -import { CreateAuthOrganizationCommand } from './create.command'; +import { RegisterOrganizationCommand } from './register-organization.command'; import { AUTH_ORGANIZATION_STORE, AuthOrganizationStore } from '../../domain/auth-organization.store'; import { CustomException } from 'src/shared/exception/custom-exception'; import { CustomExceptionCode } from 'src/shared/exception/custom-exception-code'; import { Identifier } from 'src/shared/core/domain/identifier'; import { AuthOrganization } from '../../domain/auth-organization'; import { AccountId } from '../../domain/vo/account-id'; -import { PasswordHash } from '../../domain/vo/password-hash'; -import { EventBus } from '@nestjs/cqrs'; -import { AuthOrganizationCreatedEvent } from '../../domain/event/auth-organization-created.event'; -import { PASSWORD_HASHER, PasswordHasher } from '../../domain/password-hasher'; import { RawPassword } from '../../domain/vo/raw-password'; +import { PASSWORD_HASHER, PasswordHasher } from 'iam/auth/auth-core/domain/password-hasher'; +import { CreateOrganizationUseCase } from 'iam/organization/application/create/create.use-case'; +import { PasswordHash } from 'iam/auth/auth-core/domain/value-object/password-hash'; +import { Transactional } from '@mikro-orm/core'; @Injectable() -export class CreateAuthOrganizationUseCase { +export class RegisterOrganizationUseCase { constructor( @Inject(AUTH_ORGANIZATION_STORE) private readonly authOrganizationStore: AuthOrganizationStore, @Inject(PASSWORD_HASHER) private readonly passwordHasher: PasswordHasher, - private readonly eventBus: EventBus, + private readonly createOrganiationUseCase: CreateOrganizationUseCase, ) {} - async execute(command: CreateAuthOrganizationCommand) { + @Transactional() + async execute(command: RegisterOrganizationCommand) { + const { accountId, password, name, contact } = command; + const existingAuth = await this.authOrganizationStore.loadByAccountId(command.accountId.trim()); if (existingAuth) throw new CustomException(CustomExceptionCode.AUTH_ORGANIZATION_ACCOUNT_ID_ALREADY_EXISTS); - const rawPassword = RawPassword.create(command.password.trim()); + const organizationId = await this.createOrganization(name, contact); + await this.createAuthOrganization(accountId, password, organizationId); + } + + private async createAuthOrganization( + accountId: string, + password: string, + organizationId: string, + ): Promise { + const rawPassword = RawPassword.create(password.trim()); const hashedPassword = await this.passwordHasher.hash(rawPassword.value); const authOrganization = AuthOrganization.create({ id: Identifier.create(), - accountId: AccountId.create(command.accountId.trim()), + accountId: AccountId.create(accountId.trim()), passwordHash: PasswordHash.create(hashedPassword), refreshToken: null, - organizationId: Identifier.create(), + organizationId: Identifier.from(organizationId), createdAt: new Date(), updatedAt: new Date(), isDeleted: false, @@ -43,8 +55,12 @@ export class CreateAuthOrganizationUseCase { await this.authOrganizationStore.save(authOrganization); - await this.eventBus.publish( - new AuthOrganizationCreatedEvent(authOrganization.organizationId.value, command.name, command.contact), - ); + return authOrganization; + } + + private async createOrganization(name: string, contact: string): Promise { + const result = await this.createOrganiationUseCase.execute({ name, contact }); + + return result.organizationId; } } diff --git a/iam/auth/auth-organization/application/withdraw/withdraw.command.ts b/iam/auth/auth-organization/application/withdraw/withdraw.command.ts new file mode 100644 index 0000000..02ea06e --- /dev/null +++ b/iam/auth/auth-organization/application/withdraw/withdraw.command.ts @@ -0,0 +1,3 @@ +export class WithdrawOrganizationCommand { + constructor(public readonly organizationId: string) {} +} diff --git a/iam/auth/auth-organization/application/withdraw/withdraw.use-case.ts b/iam/auth/auth-organization/application/withdraw/withdraw.use-case.ts new file mode 100644 index 0000000..c56981a --- /dev/null +++ b/iam/auth/auth-organization/application/withdraw/withdraw.use-case.ts @@ -0,0 +1,21 @@ +import { Inject, Injectable } from '@nestjs/common'; +import { AUTH_ORGANIZATION_STORE, AuthOrganizationStore } from '../../domain/auth-organization.store'; +import { WithdrawOrganizationCommand } from './withdraw.command'; +import { Transactional } from '@mikro-orm/core'; +import { DeleteOrganizationUseCase } from 'iam/organization/application/delete/delete.use-case'; + +@Injectable() +export class WithdrawOrganizationUseCase { + constructor( + @Inject(AUTH_ORGANIZATION_STORE) + private readonly authOrganizationStore: AuthOrganizationStore, + private readonly deleteOrganizationUseCase: DeleteOrganizationUseCase, + ) {} + + @Transactional() + async execute(command: WithdrawOrganizationCommand): Promise { + const { organizationId } = command; + await this.authOrganizationStore.deleteById(organizationId); + await this.deleteOrganizationUseCase.execute({ organizationId }); + } +} diff --git a/iam/auth/auth-organization/auth-organization.module.ts b/iam/auth/auth-organization/auth-organization.module.ts index 3d991ce..5149766 100644 --- a/iam/auth/auth-organization/auth-organization.module.ts +++ b/iam/auth/auth-organization/auth-organization.module.ts @@ -3,32 +3,48 @@ import { Module } from '@nestjs/common'; import { SharedModule } from 'src/shared/shared.module'; import { AUTH_ORGANIZATION_STORE } from './domain/auth-organization.store'; import { AuthOrganizationEntity } from './infrastructure/auth-organization.entity'; -import { CreateAuthOrganizationUseCase } from './application/create/create.use-case'; import { CqrsModule } from '@nestjs/cqrs'; -import { PASSWORD_HASHER } from './domain/password-hasher'; import { AuthOrganizationStoreImpl } from './infrastructure/auth-organization.store.impl'; -import { PasswordHasherImpl } from './infrastructure/password-hasher.impl'; import { AuthCoreModule } from '../auth-core/auth-core.module'; import { CheckAccountIdUseCase } from './application/check-account-id/check-account-id.use-case'; import { RenewTokenUseCase } from './application/renew-token/renew-token.use-case'; import { LoginUseCase } from './application/login/login.use-case'; import { LogoutUseCase } from './application/logout/logout.use-case'; import { AuthOrganizationController } from './presentation/auth-organization.controller'; +import { RegisterOrganizationUseCase } from './application/register-organization/register-organization.use-case'; +import { OrganizationModule } from 'iam/organization/organization.module'; +import { WithdrawOrganizationUseCase } from './application/withdraw/withdraw.use-case'; +import { ChangeOrganizationPasswordUseCase } from './application/change-password/change-password.use-case'; +import { JwtOrganizationAccessStrategy } from './infrastructure/jwt/jwt-access.strategy'; +import { JwtOrganizationRefreshStrategy } from './infrastructure/jwt/jwt-refresh.strategy'; -const usecases = [CreateAuthOrganizationUseCase, RenewTokenUseCase, LoginUseCase, LogoutUseCase, CheckAccountIdUseCase]; +const usecases = [ + RegisterOrganizationUseCase, + RenewTokenUseCase, + LoginUseCase, + LogoutUseCase, + CheckAccountIdUseCase, + WithdrawOrganizationUseCase, + ChangeOrganizationPasswordUseCase, +]; + +const jwt = [JwtOrganizationAccessStrategy, JwtOrganizationRefreshStrategy]; @Module({ - imports: [SharedModule, MikroOrmModule.forFeature([AuthOrganizationEntity]), AuthCoreModule, CqrsModule], + imports: [ + SharedModule, + MikroOrmModule.forFeature([AuthOrganizationEntity]), + AuthCoreModule, + OrganizationModule, + CqrsModule, + ], providers: [ ...usecases, + ...jwt, { provide: AUTH_ORGANIZATION_STORE, useClass: AuthOrganizationStoreImpl, }, - { - provide: PASSWORD_HASHER, - useClass: PasswordHasherImpl, - }, ], controllers: [AuthOrganizationController], exports: [], diff --git a/iam/auth/auth-organization/domain/auth-organization.store.ts b/iam/auth/auth-organization/domain/auth-organization.store.ts index 71ecced..c9d98fb 100644 --- a/iam/auth/auth-organization/domain/auth-organization.store.ts +++ b/iam/auth/auth-organization/domain/auth-organization.store.ts @@ -7,6 +7,7 @@ export interface AuthOrganizationStore { loadByRefreshToken(refreshToken: string): Promise; loadByAccountId(accountId: string): Promise; existsByAccountId(accountId: string): Promise; + deleteById(organizationId: string): Promise; } export const AUTH_ORGANIZATION_STORE = Symbol('AUTH_ORGANIZATION_STORE'); diff --git a/iam/auth/auth-organization/domain/auth-organization.ts b/iam/auth/auth-organization/domain/auth-organization.ts index a252e18..c02f6b2 100644 --- a/iam/auth/auth-organization/domain/auth-organization.ts +++ b/iam/auth/auth-organization/domain/auth-organization.ts @@ -2,7 +2,7 @@ import { AggregateRoot } from 'src/shared/core/domain/base.aggregate'; import { BaseEntityProps } from 'src/shared/core/domain/base.entity'; import { Identifier } from 'src/shared/core/domain/identifier'; import { AccountId } from './vo/account-id'; -import { PasswordHash } from './vo/password-hash'; +import { PasswordHash } from 'iam/auth/auth-core/domain/value-object/password-hash'; export interface AuthOrganizationProps extends BaseEntityProps { accountId: AccountId; @@ -51,6 +51,11 @@ export class AuthOrganization extends AggregateRoot { this.props.updatedAt = new Date(); } + updatePassword(passwordHash: PasswordHash) { + this.props.passwordHash = passwordHash; + this.props.updatedAt = new Date(); + } + delete() { this.props.isDeleted = true; this.props.deletedAt = new Date(); diff --git a/iam/auth/auth-organization/infrastructure/auth-organization.mapper.ts b/iam/auth/auth-organization/infrastructure/auth-organization.mapper.ts index 8b3dd1f..f55f89a 100644 --- a/iam/auth/auth-organization/infrastructure/auth-organization.mapper.ts +++ b/iam/auth/auth-organization/infrastructure/auth-organization.mapper.ts @@ -2,7 +2,7 @@ import { Identifier } from 'src/shared/core/domain/identifier'; import { AuthOrganization } from '../domain/auth-organization'; import { AuthOrganizationEntity } from './auth-organization.entity'; import { AccountId } from '../domain/vo/account-id'; -import { PasswordHash } from '../domain/vo/password-hash'; +import { PasswordHash } from 'iam/auth/auth-core/domain/value-object/password-hash'; export class AuthOrganizationMapper { static toDomain(entity: AuthOrganizationEntity): AuthOrganization { diff --git a/iam/auth/auth-organization/infrastructure/auth-organization.store.impl.ts b/iam/auth/auth-organization/infrastructure/auth-organization.store.impl.ts index 6067c3f..0649bea 100644 --- a/iam/auth/auth-organization/infrastructure/auth-organization.store.impl.ts +++ b/iam/auth/auth-organization/infrastructure/auth-organization.store.impl.ts @@ -22,6 +22,7 @@ export class AuthOrganizationStoreImpl implements AuthOrganizationStore { AuthOrganizationEntity, { id: authOrganization.id.value }, { + passwordHash: authOrganization.passwordHash.value, refreshToken: authOrganization.refreshToken, updatedAt: authOrganization.updatedAt, }, @@ -53,4 +54,8 @@ export class AuthOrganizationStoreImpl implements AuthOrganizationStore { const count = await this.ormRepository.count({ accountId }); return count > 0; } + + async deleteById(organizationId: string): Promise { + await this.em.nativeDelete(AuthOrganizationEntity, { organizationId }); + } } diff --git a/iam/auth/auth-organization/infrastructure/jwt/jwt-access.strategy.ts b/iam/auth/auth-organization/infrastructure/jwt/jwt-access.strategy.ts new file mode 100644 index 0000000..6614357 --- /dev/null +++ b/iam/auth/auth-organization/infrastructure/jwt/jwt-access.strategy.ts @@ -0,0 +1,8 @@ +import { Injectable } from '@nestjs/common'; +import { CreateJwtAccessStrategy } from 'iam/auth/auth-core/infrastructure/jwt/base-jwt.strategy'; + +@Injectable() +export class JwtOrganizationAccessStrategy extends CreateJwtAccessStrategy( + 'jwt-organization-access', + 'organizationAccessToken', +) {} diff --git a/iam/auth/auth-organization/infrastructure/jwt/jwt-refresh.strategy.ts b/iam/auth/auth-organization/infrastructure/jwt/jwt-refresh.strategy.ts new file mode 100644 index 0000000..821e624 --- /dev/null +++ b/iam/auth/auth-organization/infrastructure/jwt/jwt-refresh.strategy.ts @@ -0,0 +1,8 @@ +import { Injectable } from '@nestjs/common'; +import { CreateJwtRefreshStrategy } from 'iam/auth/auth-core/infrastructure/jwt/base-jwt.strategy'; + +@Injectable() +export class JwtOrganizationRefreshStrategy extends CreateJwtRefreshStrategy( + 'jwt-organization-refresh', + 'organizationRefreshToken', +) {} diff --git a/iam/auth/auth-organization/presentation/auth-organization.controller.ts b/iam/auth/auth-organization/presentation/auth-organization.controller.ts index 21ca873..0029f2a 100644 --- a/iam/auth/auth-organization/presentation/auth-organization.controller.ts +++ b/iam/auth/auth-organization/presentation/auth-organization.controller.ts @@ -1,6 +1,5 @@ -import { Body, Controller, HttpStatus, Post, Res, UseGuards } from '@nestjs/common'; +import { Body, Controller, Delete, HttpStatus, Patch, Post, Res, UseGuards } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; -import { CreateAuthOrganizationUseCase } from '../application/create/create.use-case'; import { RegisterOrganizationRequestDto } from './dto/request/register-organization.request.dto'; import { Response } from 'express'; import { RenewTokenUseCase } from '../application/renew-token/renew-token.use-case'; @@ -17,22 +16,28 @@ import { Organization, OrganizationPayload } from 'src/shared/core/presentation/ import { Roles } from 'src/shared/core/presentation/role.decorator'; import { Role } from 'iam/auth/auth-core/domain/value-object/role'; import { RolesGuard } from 'iam/auth/auth-core/infrastructure/guard/role.guard'; +import { RegisterOrganizationUseCase } from '../application/register-organization/register-organization.use-case'; +import { WithdrawOrganizationUseCase } from '../application/withdraw/withdraw.use-case'; +import { ChangeOrganizationPasswordUseCase } from '../application/change-password/change-password.use-case'; +import { ChangeOrganizationPasswordRequestDto } from './dto/request/change-password.request.dto'; @ApiTags('auth-organization') @Controller('auth/organization') export class AuthOrganizationController { constructor( - private readonly createAuthOrganizationUseCase: CreateAuthOrganizationUseCase, + private readonly registerOrganizationUseCase: RegisterOrganizationUseCase, private readonly renewTokenUseCase: RenewTokenUseCase, private readonly loginUseCase: LoginUseCase, private readonly logoutUseCase: LogoutUseCase, private readonly checkAccountIdUseCase: CheckAccountIdUseCase, + private readonly withdrawOrganizationUseCase: WithdrawOrganizationUseCase, + private readonly changeOrganizationPasswordUseCase: ChangeOrganizationPasswordUseCase, ) {} @Post('register') @AuthOrganizationDocs('register') async registerOrganization(@Body() dto: RegisterOrganizationRequestDto) { - await this.createAuthOrganizationUseCase.execute({ + await this.registerOrganizationUseCase.execute({ accountId: dto.accountId, password: dto.password, name: dto.name, @@ -56,14 +61,14 @@ export class AuthOrganizationController { password: dto.password, }); - res.cookie('accessToken', accessToken, accessTokenCookieOptions); - res.cookie('refreshToken', refreshToken, refreshTokenCookieOptions); + res.cookie('organizationAccessToken', accessToken, accessTokenCookieOptions); + res.cookie('organizationRefreshToken', refreshToken, refreshTokenCookieOptions); res.status(HttpStatus.OK).send(); } @Post('refresh') - @UseGuards(AuthGuard('jwt-refresh'), RolesGuard) + @UseGuards(AuthGuard('jwt-organization-refresh'), RolesGuard) @Roles(Role.ORGANIZATION) @AuthOrganizationDocs('refresh') async renewToken(@Organization() organization: OrganizationPayload, @Res() res: Response) { @@ -73,21 +78,52 @@ export class AuthOrganizationController { jti: jti, }); - res.cookie('accessToken', accessToken, accessTokenCookieOptions); - res.cookie('refreshToken', refreshToken, refreshTokenCookieOptions); + res.cookie('organizationAccessToken', accessToken, accessTokenCookieOptions); + res.cookie('organizationRefreshToken', refreshToken, refreshTokenCookieOptions); res.status(HttpStatus.OK).send(); } @Post('logout') - @UseGuards(AuthGuard('jwt-access'), RolesGuard) + @UseGuards(AuthGuard('jwt-organization-access'), RolesGuard) @Roles(Role.ORGANIZATION) @AuthOrganizationDocs('logout') async logout(@Organization() organization: OrganizationPayload, @Res() res: Response) { await this.logoutUseCase.execute({ organizationId: organization.organizationId }); - res.clearCookie('accessToken', accessTokenCookieOptions); - res.clearCookie('refreshToken', refreshTokenCookieOptions); + res.clearCookie('organizationAccessToken', accessTokenCookieOptions); + res.clearCookie('organizationRefreshToken', refreshTokenCookieOptions); + + res.status(HttpStatus.OK).send(); + } + + @Delete('withdraw') + @UseGuards(AuthGuard('jwt-organization-access'), RolesGuard) + @Roles(Role.ORGANIZATION) + @AuthOrganizationDocs('withdraw') + async withdraw(@Organization() organization: OrganizationPayload, @Res() res: Response) { + await this.withdrawOrganizationUseCase.execute({ organizationId: organization.organizationId }); + + res.clearCookie('organizationAccessToken', accessTokenCookieOptions); + res.clearCookie('organizationRefreshToken', refreshTokenCookieOptions); + + res.status(HttpStatus.OK).send(); + } + + @Patch('change-password') + @UseGuards(AuthGuard('jwt-organization-access'), RolesGuard) + @Roles(Role.ORGANIZATION) + @AuthOrganizationDocs('changePassword') + async changePassword( + @Organization() organization: OrganizationPayload, + @Body() dto: ChangeOrganizationPasswordRequestDto, + @Res() res: Response, + ) { + await this.changeOrganizationPasswordUseCase.execute({ + organizationId: organization.organizationId, + currentPassword: dto.currentPassword, + newPassword: dto.newPassword, + }); res.status(HttpStatus.OK).send(); } diff --git a/iam/auth/auth-organization/presentation/auth-organization.docs.ts b/iam/auth/auth-organization/presentation/auth-organization.docs.ts index bf4b994..915fd2f 100644 --- a/iam/auth/auth-organization/presentation/auth-organization.docs.ts +++ b/iam/auth/auth-organization/presentation/auth-organization.docs.ts @@ -14,7 +14,14 @@ import { LoginRequestDto } from './dto/request/login.request.dto'; import { CheckAccountIdRequestDto } from './dto/request/check-account-id.request.dto'; import { CheckAccountIdResponseDto } from './dto/response/check-account-id.response.dto'; -export type AuthOrganizationEndpoint = 'register' | 'login' | 'logout' | 'refresh' | 'checkAccountId'; +export type AuthOrganizationEndpoint = + | 'register' + | 'login' + | 'logout' + | 'refresh' + | 'checkAccountId' + | 'withdraw' + | 'changePassword'; export const AuthOrganizationDocs = createDocs({ register: () => @@ -95,4 +102,30 @@ export const AuthOrganizationDocs = createDocs({ description: '유효하지 않은 refresh token', }), ), + withdraw: () => + applyDecorators( + ApiOperation({ + summary: 'organization 삭제', + description: '조직을 삭제합니다.', + }), + ApiOkResponse({ + description: 'organization 삭제 성공', + }), + ApiUnauthorizedResponse({ + description: '유효하지 않은 access token', + }), + ), + changePassword: () => + applyDecorators( + ApiOperation({ + summary: '비밀번호 변경', + description: '현재 비밀번호와 새 비밀번호를 받아 비밀번호 변경 처리', + }), + ApiOkResponse({ + description: '비밀번호 변경 성공', + }), + ApiUnauthorizedResponse({ + description: '유효하지 않은 access token 또는 현재 비밀번호 불일치', + }), + ), }); diff --git a/iam/auth/auth-organization/presentation/dto/request/change-password.request.dto.ts b/iam/auth/auth-organization/presentation/dto/request/change-password.request.dto.ts new file mode 100644 index 0000000..5819ead --- /dev/null +++ b/iam/auth/auth-organization/presentation/dto/request/change-password.request.dto.ts @@ -0,0 +1,20 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsNotEmpty, IsString } from 'class-validator'; + +export class ChangeOrganizationPasswordRequestDto { + @IsString() + @IsNotEmpty() + @ApiProperty({ + description: '현재 비밀번호', + example: 'password123', + }) + currentPassword: string; + + @IsString() + @IsNotEmpty() + @ApiProperty({ + description: '새 비밀번호', + example: 'password123', + }) + newPassword: string; +} diff --git a/iam/auth/auth-user/auth-user.module.ts b/iam/auth/auth-user/auth-user.module.ts index 40d1925..96c3616 100644 --- a/iam/auth/auth-user/auth-user.module.ts +++ b/iam/auth/auth-user/auth-user.module.ts @@ -14,9 +14,12 @@ import { AuthUserEntity } from './infrastructure/auth-user.entity'; import { AuthCoreModule } from '../auth-core/auth-core.module'; import { AuthUserController } from './presentation/auth-user.controller'; import { UserModule } from 'iam/user/user.module'; +import { JwtUserAccessStrategy } from './infrastructure/jwt/jwt-access.strategy'; +import { JwtUserRefreshStrategy } from './infrastructure/jwt/jwt-refresh.strategy'; const usecases = [OAuthLoginUseCase, AuthorizeOAuthUseCase, RenewTokenUseCase, LogoutUseCase, UnlinkOAuthUseCase]; const listeners = [UnlinkOAuthListener]; +const jwt = [JwtUserAccessStrategy, JwtUserRefreshStrategy]; @Module({ imports: [MikroOrmModule.forFeature([AuthUserEntity]), AuthCoreModule, SharedModule, CqrsModule, UserModule], @@ -27,6 +30,7 @@ const listeners = [UnlinkOAuthListener]; }, ...usecases, ...listeners, + ...jwt, ], controllers: [AuthUserController], exports: [], diff --git a/iam/auth/auth-user/infrastructure/jwt/jwt-access.strategy.ts b/iam/auth/auth-user/infrastructure/jwt/jwt-access.strategy.ts new file mode 100644 index 0000000..fd95737 --- /dev/null +++ b/iam/auth/auth-user/infrastructure/jwt/jwt-access.strategy.ts @@ -0,0 +1,5 @@ +import { Injectable } from '@nestjs/common'; +import { CreateJwtAccessStrategy } from 'iam/auth/auth-core/infrastructure/jwt/base-jwt.strategy'; + +@Injectable() +export class JwtUserAccessStrategy extends CreateJwtAccessStrategy('jwt-user-access', 'accessToken') {} diff --git a/iam/auth/auth-user/infrastructure/jwt/jwt-refresh.strategy.ts b/iam/auth/auth-user/infrastructure/jwt/jwt-refresh.strategy.ts new file mode 100644 index 0000000..0c7faee --- /dev/null +++ b/iam/auth/auth-user/infrastructure/jwt/jwt-refresh.strategy.ts @@ -0,0 +1,5 @@ +import { Injectable } from '@nestjs/common'; +import { CreateJwtRefreshStrategy } from 'iam/auth/auth-core/infrastructure/jwt/base-jwt.strategy'; + +@Injectable() +export class JwtUserRefreshStrategy extends CreateJwtRefreshStrategy('jwt-user-refresh', 'refreshToken') {} diff --git a/iam/auth/auth-user/presentation/auth-user.controller.ts b/iam/auth/auth-user/presentation/auth-user.controller.ts index 6ec7f26..024b1bb 100644 --- a/iam/auth/auth-user/presentation/auth-user.controller.ts +++ b/iam/auth/auth-user/presentation/auth-user.controller.ts @@ -62,7 +62,7 @@ export class AuthUserController { } @Get('refresh') - @UseGuards(AuthGuard('jwt-refresh'), RolesGuard) + @UseGuards(AuthGuard('jwt-user-refresh'), RolesGuard) @Roles(Role.USER) @AuthUserDocs('renewToken') async renewToken(@User() user: UserPayload, @Res() res: Response) { @@ -75,7 +75,7 @@ export class AuthUserController { } @Post('logout') - @UseGuards(AuthGuard('jwt-access'), RolesGuard) + @UseGuards(AuthGuard('jwt-user-access'), RolesGuard) @Roles(Role.USER) @AuthUserDocs('logout') async logout(@User() user: UserPayload, @Res() res: Response) { @@ -88,7 +88,7 @@ export class AuthUserController { } @Post('withdraw') - @UseGuards(AuthGuard('jwt-access'), RolesGuard) + @UseGuards(AuthGuard('jwt-user-access'), RolesGuard) @Roles(Role.USER) @AuthUserDocs('withdraw') async withdraw(@User() user: UserPayload, @Res() res: Response) { diff --git a/iam/auth/auth.module.ts b/iam/auth/auth.module.ts index 044ae9e..4418870 100644 --- a/iam/auth/auth.module.ts +++ b/iam/auth/auth.module.ts @@ -2,9 +2,10 @@ import { Module } from '@nestjs/common'; import { AuthUserModule } from './auth-user/auth-user.module'; import { AuthOrganizationModule } from './auth-organization/auth-organization.module'; import { AuthCoreModule } from './auth-core/auth-core.module'; +import { AuthAdminModule } from './auth-admin/auth-admin.module'; @Module({ - imports: [AuthUserModule, AuthOrganizationModule, AuthCoreModule], + imports: [AuthUserModule, AuthOrganizationModule, AuthAdminModule, AuthCoreModule], providers: [], }) export class AuthModule {} diff --git a/iam/iam.module.ts b/iam/iam.module.ts index d3ada3f..fafde16 100644 --- a/iam/iam.module.ts +++ b/iam/iam.module.ts @@ -2,8 +2,9 @@ import { Module } from '@nestjs/common'; import { AuthModule } from './auth/auth.module'; import { UserModule } from './user/user.module'; import { OrganizationModule } from './organization/organization.module'; +import { AdminModule } from './admin/admin.module'; @Module({ - imports: [AuthModule, UserModule, OrganizationModule], + imports: [AuthModule, UserModule, OrganizationModule, AdminModule], }) export class IamModule {} diff --git a/iam/organization/application/create/create.command.ts b/iam/organization/application/create/create.command.ts index b16b90b..74eeef7 100644 --- a/iam/organization/application/create/create.command.ts +++ b/iam/organization/application/create/create.command.ts @@ -1,8 +1,5 @@ -import { Identifier } from 'src/shared/core/domain/identifier'; - export class CreateOrganizationCommand { constructor( - public readonly organizationId: Identifier, public readonly name: string, public readonly contact: string, ) {} diff --git a/iam/organization/application/create/create.result.ts b/iam/organization/application/create/create.result.ts new file mode 100644 index 0000000..e020a7a --- /dev/null +++ b/iam/organization/application/create/create.result.ts @@ -0,0 +1,3 @@ +export class CreateOrganizationResult { + organizationId: string; +} diff --git a/iam/organization/application/create/create.use-case.ts b/iam/organization/application/create/create.use-case.ts index a3a6d7d..31554b2 100644 --- a/iam/organization/application/create/create.use-case.ts +++ b/iam/organization/application/create/create.use-case.ts @@ -3,6 +3,8 @@ import { CommandHandler } from '@nestjs/cqrs'; import { CreateOrganizationCommand } from './create.command'; import { ORGANIZATION_STORE, OrganizationStore } from '../../domain/organization.store'; import { Organization } from '../../domain/organization'; +import { CreateOrganizationResult } from './create.result'; +import { Identifier } from 'src/shared/core/domain/identifier'; @Injectable() @CommandHandler(CreateOrganizationCommand) @@ -12,11 +14,11 @@ export class CreateOrganizationUseCase { private readonly organizationStore: OrganizationStore, ) {} - async execute(command: CreateOrganizationCommand): Promise { - const { organizationId, name, contact } = command; + async execute(command: CreateOrganizationCommand): Promise { + const { name, contact } = command; const organization = Organization.create({ - id: organizationId, + id: Identifier.create(), name: name, contact: contact, createdAt: new Date(), @@ -24,5 +26,7 @@ export class CreateOrganizationUseCase { }); await this.organizationStore.save(organization); + + return { organizationId: organization.id.value }; } } diff --git a/iam/organization/application/delete/delete.use-case.ts b/iam/organization/application/delete/delete.use-case.ts index 0c8dcf3..7dc7822 100644 --- a/iam/organization/application/delete/delete.use-case.ts +++ b/iam/organization/application/delete/delete.use-case.ts @@ -12,10 +12,11 @@ export class DeleteOrganizationUseCase { ) {} async execute(command: DeleteOrganizationCommand): Promise { - const organization = await this.organizationStore.loadById(command.organizationId); + const { organizationId } = command; + const organization = await this.organizationStore.loadById(organizationId); if (!organization) throw new CustomException(CustomExceptionCode.ORGANIZATION_NOT_FOUND); - const { organizationId } = command; + organization.delete(); await this.organizationStore.deleteById(organizationId); } } diff --git a/iam/organization/application/get-all/get-all-organizations.query.ts b/iam/organization/application/get-all/get-all-organizations.query.ts new file mode 100644 index 0000000..6dfbdfc --- /dev/null +++ b/iam/organization/application/get-all/get-all-organizations.query.ts @@ -0,0 +1,7 @@ +export class GetAllOrganizationsQuery { + constructor( + public readonly pageSize: number, + public readonly cursorId?: string, + public readonly cursorDate?: Date, + ) {} +} diff --git a/iam/organization/application/get-all/get-all-organizations.result.ts b/iam/organization/application/get-all/get-all-organizations.result.ts new file mode 100644 index 0000000..1cbb38f --- /dev/null +++ b/iam/organization/application/get-all/get-all-organizations.result.ts @@ -0,0 +1,8 @@ +import { OrganizationAdminView } from 'iam/organization/domain/organization.admin.view'; + +export class GetAllOrganizationsResult { + organizations: OrganizationAdminView[]; + cursorId: string | null; + cursorDate: string | null; + hasNext: boolean; +} diff --git a/iam/organization/application/get-all/get-all-organizations.use-case.ts b/iam/organization/application/get-all/get-all-organizations.use-case.ts new file mode 100644 index 0000000..1ff8efd --- /dev/null +++ b/iam/organization/application/get-all/get-all-organizations.use-case.ts @@ -0,0 +1,32 @@ +import { Inject, Injectable } from '@nestjs/common'; +import { ORGANIZATION_READER, OrganizationReader } from 'iam/organization/domain/organization.reader'; +import { GetAllOrganizationsQuery } from './get-all-organizations.query'; +import { GetAllOrganizationsResult } from './get-all-organizations.result'; + +@Injectable() +export class GetAllOrganizationsUseCase { + constructor( + @Inject(ORGANIZATION_READER) + private readonly organizationReader: OrganizationReader, + ) {} + + async execute(query: GetAllOrganizationsQuery): Promise { + const { pageSize, cursorId, cursorDate } = query; + + const organizationAdminViews = await this.organizationReader.findAllByCursor(pageSize, cursorId, cursorDate); + + const hasNext = organizationAdminViews.length > pageSize; + + const organizations = hasNext ? organizationAdminViews.slice(0, pageSize) : organizationAdminViews; + const lastItem = organizations[organizations.length - 1]; + const nextCursorId = hasNext && lastItem ? lastItem.id : null; + const nextCursorDate = hasNext && lastItem ? lastItem.createdAt : null; + + return { + organizations, + cursorId: nextCursorId, + cursorDate: nextCursorDate, + hasNext, + }; + } +} diff --git a/iam/organization/domain/organization.admin.view.ts b/iam/organization/domain/organization.admin.view.ts new file mode 100644 index 0000000..0b892cb --- /dev/null +++ b/iam/organization/domain/organization.admin.view.ts @@ -0,0 +1,27 @@ +import { ApiProperty } from '@nestjs/swagger'; + +export class OrganizationAdminView { + @ApiProperty({ + example: 'org-12345', + description: '고유 식별자', + }) + id: string; + + @ApiProperty({ + example: '서울대학교', + description: '기관 이름', + }) + name: string; + + @ApiProperty({ + example: '02-1234-5678', + description: '기관 연락처', + }) + contact: string; + + @ApiProperty({ + example: '2023-01-01T00:00:00.000Z', + description: '생성 일자', + }) + createdAt: string; +} diff --git a/iam/organization/domain/organization.reader.ts b/iam/organization/domain/organization.reader.ts index dc24df9..efc0a26 100644 --- a/iam/organization/domain/organization.reader.ts +++ b/iam/organization/domain/organization.reader.ts @@ -1,7 +1,9 @@ +import { OrganizationAdminView } from './organization.admin.view'; import { OrganizationView } from './organization.view'; export interface OrganizationReader { findById(organizationId: string): Promise; + findAllByCursor(pageSize: number, cursorId?: string, cursorDate?: Date): Promise; } export const ORGANIZATION_READER = Symbol('ORGANIZATION_READER'); diff --git a/iam/organization/infrastructure/organization.mapper.ts b/iam/organization/infrastructure/organization.mapper.ts index a7d702f..ef69a0e 100644 --- a/iam/organization/infrastructure/organization.mapper.ts +++ b/iam/organization/infrastructure/organization.mapper.ts @@ -1,6 +1,8 @@ import { Identifier } from 'src/shared/core/domain/identifier'; import { Organization } from '../domain/organization'; import { OrganizationEntity } from './organization.entity'; +import { OrganizationViewEntity } from './organization.view.entity'; +import { OrganizationAdminView } from '../domain/organization.admin.view'; export class OrganizationMapper { static toDomain(entity: OrganizationEntity): Organization { @@ -23,4 +25,13 @@ export class OrganizationMapper { return entity; } + + static toOrganizationAdminModel(entity: OrganizationViewEntity): OrganizationAdminView { + return { + id: entity.id, + name: entity.name, + contact: entity.contact, + createdAt: entity.createdAt.toISOString(), + }; + } } diff --git a/iam/organization/infrastructure/organization.reader.impl.ts b/iam/organization/infrastructure/organization.reader.impl.ts index edb144b..82081a3 100644 --- a/iam/organization/infrastructure/organization.reader.impl.ts +++ b/iam/organization/infrastructure/organization.reader.impl.ts @@ -5,6 +5,8 @@ import { CustomException } from 'src/shared/exception/custom-exception'; import { CustomExceptionCode } from 'src/shared/exception/custom-exception-code'; import { OrganizationReader } from '../domain/organization.reader'; import { OrganizationView } from '../domain/organization.view'; +import { OrganizationAdminView } from '../domain/organization.admin.view'; +import { OrganizationMapper } from './organization.mapper'; export class OrganizationReaderImpl implements OrganizationReader { constructor( @@ -30,4 +32,25 @@ export class OrganizationReaderImpl implements OrganizationReader { contact: organizationEntity.contact, }; } + + async findAllByCursor(pageSize: number, cursorId?: string, cursorDate?: Date): Promise { + const qb = this.organizationOrmRepository.createQueryBuilder('o'); + + if (cursorDate && cursorId) { + qb.where({ + $or: [ + { createdAt: { $lt: cursorDate } }, + { + $and: [{ createdAt: cursorDate }, { id: { $lt: cursorId } }], + }, + ], + }); + } + + qb.orderBy({ createdAt: 'DESC', id: 'DESC' }).limit(pageSize + 1); + + const result = await qb.getResultList(); + + return result.map((org) => OrganizationMapper.toOrganizationAdminModel(org)); + } } diff --git a/iam/organization/infrastructure/organization.store.impl.ts b/iam/organization/infrastructure/organization.store.impl.ts index d6580c1..c9d66b1 100644 --- a/iam/organization/infrastructure/organization.store.impl.ts +++ b/iam/organization/infrastructure/organization.store.impl.ts @@ -3,8 +3,6 @@ import { EntityManager, EntityRepository } from '@mikro-orm/mysql'; import { Organization } from '../domain/organization'; import { OrganizationEntity } from './organization.entity'; import { OrganizationMapper } from './organization.mapper'; -import { CustomException } from 'src/shared/exception/custom-exception'; -import { CustomExceptionCode } from 'src/shared/exception/custom-exception-code'; import { OrganizationStore } from '../domain/organization.store'; export class OrganizationStoreImpl implements OrganizationStore { @@ -20,12 +18,7 @@ export class OrganizationStoreImpl implements OrganizationStore { } async deleteById(organizationId: string): Promise { - const entity = await this.ormRepository.findOne({ id: organizationId }); - if (!entity) - throw new CustomException( - CustomExceptionCode.ORGANIZATION_NOT_FOUND, - `[OrganizationCommandRepository] ${organizationId}에 해당하는 기관이 존재하지 않습니다.`, - ); + await this.em.nativeDelete(OrganizationEntity, { id: organizationId }); } async updateById(organization: Organization): Promise { diff --git a/iam/organization/infrastructure/organization.view.entity.ts b/iam/organization/infrastructure/organization.view.entity.ts index d4e1773..e9edcd3 100644 --- a/iam/organization/infrastructure/organization.view.entity.ts +++ b/iam/organization/infrastructure/organization.view.entity.ts @@ -5,7 +5,8 @@ import { Entity, Property } from '@mikro-orm/core'; SELECT o.id, o.name, - o.contact + o.contact, + o.created_at FROM organization o `, @@ -19,4 +20,7 @@ export class OrganizationViewEntity { @Property() contact: string; + + @Property() + createdAt: Date; } diff --git a/iam/organization/organization.module.ts b/iam/organization/organization.module.ts index f290241..e08ca3e 100644 --- a/iam/organization/organization.module.ts +++ b/iam/organization/organization.module.ts @@ -11,12 +11,15 @@ import { ORGANIZATION_READER } from './domain/organization.reader'; import { OrganizationReaderImpl } from './infrastructure/organization.reader.impl'; import { OrganizationViewEntity } from './infrastructure/organization.view.entity'; import { GetOrganizationUseCase } from './application/get/get-organization.use-case'; +import { GetAllOrganizationsUseCase } from './application/get-all/get-all-organizations.use-case'; +import { OrganizationAdminController } from './presentation/organization.admin.controller'; const usecases = [ CreateOrganizationUseCase, UpdateOrganizationUseCase, DeleteOrganizationUseCase, GetOrganizationUseCase, + GetAllOrganizationsUseCase, ]; @Module({ @@ -32,7 +35,7 @@ const usecases = [ }, ...usecases, ], - controllers: [OrganizationController], + controllers: [OrganizationController, OrganizationAdminController], exports: [...usecases], }) export class OrganizationModule {} diff --git a/iam/organization/presentation/dto/request/get-all-organizations.request.dto.ts b/iam/organization/presentation/dto/request/get-all-organizations.request.dto.ts new file mode 100644 index 0000000..5efc2aa --- /dev/null +++ b/iam/organization/presentation/dto/request/get-all-organizations.request.dto.ts @@ -0,0 +1,18 @@ +import { Type } from 'class-transformer'; +import { IsDateString, IsInt, IsOptional, IsString, Min } from 'class-validator'; + +export class GetAllOrganizationsRequestDto { + @IsOptional() + @Type(() => Number) + @IsInt() + @Min(1) + pageSize: number = 10; + + @IsOptional() + @IsString() + cursorId?: string; + + @IsOptional() + @IsDateString() + cursorDate?: string; +} diff --git a/iam/organization/presentation/organization.admin.controller.ts b/iam/organization/presentation/organization.admin.controller.ts new file mode 100644 index 0000000..7f14933 --- /dev/null +++ b/iam/organization/presentation/organization.admin.controller.ts @@ -0,0 +1,25 @@ +import { Controller, Get, Query, UseGuards } from '@nestjs/common'; +import { ApiTags } from '@nestjs/swagger'; +import { GetAllOrganizationsUseCase } from '../application/get-all/get-all-organizations.use-case'; +import { AuthGuard } from '@nestjs/passport'; +import { RolesGuard } from 'iam/auth/auth-core/infrastructure/guard/role.guard'; +import { Roles } from 'src/shared/core/presentation/role.decorator'; +import { Role } from 'iam/auth/auth-core/domain/value-object/role'; +import { GetAllOrganizationsRequestDto } from './dto/request/get-all-organizations.request.dto'; + +@ApiTags('admin-organization') +@Controller('admin/organization') +export class OrganizationAdminController { + constructor(private readonly getAllOrganizationsUseCase: GetAllOrganizationsUseCase) {} + + @Get() + @UseGuards(AuthGuard('jwt-access'), RolesGuard) + @Roles(Role.ADMIN) + async getAll(@Query() query: GetAllOrganizationsRequestDto) { + return await this.getAllOrganizationsUseCase.execute({ + pageSize: query.pageSize, + cursorId: query.cursorId, + cursorDate: query.cursorDate ? new Date(query.cursorDate) : undefined, + }); + } +} diff --git a/iam/organization/presentation/organization.controller.ts b/iam/organization/presentation/organization.controller.ts index 5b3f3f6..bd61bec 100644 --- a/iam/organization/presentation/organization.controller.ts +++ b/iam/organization/presentation/organization.controller.ts @@ -20,7 +20,7 @@ export class OrganizationController { ) {} @Patch() - @UseGuards(AuthGuard('jwt-access'), RolesGuard) + @UseGuards(AuthGuard('jwt-organization-access'), RolesGuard) @Roles(Role.ORGANIZATION) @OrganizationDocs('update') async updateOrganization( @@ -35,7 +35,7 @@ export class OrganizationController { } @Get() - @UseGuards(AuthGuard('jwt-access'), RolesGuard) + @UseGuards(AuthGuard('jwt-organization-access'), RolesGuard) @Roles(Role.ORGANIZATION) @OrganizationDocs('get') async getOrganization(@Organization() organization: OrganizationPayload): Promise { diff --git a/iam/user/application/get-all/get-all-users.query.ts b/iam/user/application/get-all/get-all-users.query.ts new file mode 100644 index 0000000..33aeb12 --- /dev/null +++ b/iam/user/application/get-all/get-all-users.query.ts @@ -0,0 +1,5 @@ +export interface GetAllUsersQuery { + pageSize: number; + cursorId?: string; + cursorDate?: Date; +} diff --git a/iam/user/application/get-all/get-all-users.result.ts b/iam/user/application/get-all/get-all-users.result.ts new file mode 100644 index 0000000..0f3e32c --- /dev/null +++ b/iam/user/application/get-all/get-all-users.result.ts @@ -0,0 +1,8 @@ +import { UserAdminView } from 'iam/user/domain/user.admin.view'; + +export class GetAllUsersResult { + users: UserAdminView[]; + cursorId: string | null; + cursorDate: string | null; + hasNext: boolean; +} diff --git a/iam/user/application/get-all/get-all-users.use-case.ts b/iam/user/application/get-all/get-all-users.use-case.ts new file mode 100644 index 0000000..c195a25 --- /dev/null +++ b/iam/user/application/get-all/get-all-users.use-case.ts @@ -0,0 +1,32 @@ +import { Inject, Injectable } from '@nestjs/common'; +import { USER_READER, UserReader } from 'iam/user/domain/user.reader'; +import { GetAllUsersQuery } from './get-all-users.query'; +import { GetAllUsersResult } from './get-all-users.result'; + +@Injectable() +export class GetAllUsersUseCase { + constructor( + @Inject(USER_READER) + private readonly userReader: UserReader, + ) {} + + async execute(query: GetAllUsersQuery): Promise { + const { pageSize, cursorId, cursorDate } = query; + const userAdminViews = await this.userReader.findAllByCursor(pageSize, cursorId, cursorDate); + + const hasNext = userAdminViews.length > pageSize; + + const users = hasNext ? userAdminViews.slice(0, pageSize) : userAdminViews; + + const lastItem = users[users.length - 1]; + const nextCursorId = hasNext && lastItem ? lastItem.id : null; + const nextCursorDate = hasNext && lastItem ? lastItem.createdAt : null; + + return { + users, + cursorId: nextCursorId, + cursorDate: nextCursorDate, + hasNext, + }; + } +} diff --git a/iam/user/domain/user.admin.view.ts b/iam/user/domain/user.admin.view.ts new file mode 100644 index 0000000..6c93841 --- /dev/null +++ b/iam/user/domain/user.admin.view.ts @@ -0,0 +1,21 @@ +import { ApiProperty } from '@nestjs/swagger'; + +export class UserAdminView { + @ApiProperty({ + example: 'user-12345', + description: '고유 식별자', + }) + id: string; + + @ApiProperty({ + example: 'user@example.com', + description: '이메일 주소', + }) + email: string; + + @ApiProperty({ + example: '2023-01-01T00:00:00.000Z', + description: '생성 일자', + }) + createdAt: string; +} diff --git a/iam/user/domain/user.reader.ts b/iam/user/domain/user.reader.ts index b154e45..beb10e0 100644 --- a/iam/user/domain/user.reader.ts +++ b/iam/user/domain/user.reader.ts @@ -1,7 +1,9 @@ +import { UserAdminView } from './user.admin.view'; import { UserView } from './user.view'; export interface UserReader { findById(userId: string): Promise; + findAllByCursor(pageSize: number, cursorId?: string, cursorDate?: Date): Promise; } export const USER_READER = Symbol('USER_READER'); diff --git a/iam/user/infrastructure/user.mapper.ts b/iam/user/infrastructure/user.mapper.ts index 5c8346d..792f19b 100644 --- a/iam/user/infrastructure/user.mapper.ts +++ b/iam/user/infrastructure/user.mapper.ts @@ -1,6 +1,7 @@ import { Identifier } from 'src/shared/core/domain/identifier'; import { User } from '../domain/user'; import { UserEntity } from './user.entity'; +import { UserAdminView } from '../domain/user.admin.view'; export class UserMapper { static toDomain(entity: UserEntity): User { @@ -21,4 +22,20 @@ export class UserMapper { return entity; } + + static toUserModel(domain: User): UserAdminView { + return { + id: domain.id.value, + createdAt: domain.createdAt.toISOString(), + email: domain.email, + }; + } + + static toUserAdminModel(entity: UserEntity): UserAdminView { + return { + id: entity.id, + createdAt: entity.createdAt.toISOString(), + email: entity.email, + }; + } } diff --git a/iam/user/infrastructure/user.reader.impl.ts b/iam/user/infrastructure/user.reader.impl.ts index 2c8519b..c53b506 100644 --- a/iam/user/infrastructure/user.reader.impl.ts +++ b/iam/user/infrastructure/user.reader.impl.ts @@ -5,6 +5,8 @@ import { CustomException } from 'src/shared/exception/custom-exception'; import { CustomExceptionCode } from 'src/shared/exception/custom-exception-code'; import { UserReader } from '../domain/user.reader'; import { UserEntity } from './user.entity'; +import { UserAdminView } from '../domain/user.admin.view'; +import { UserMapper } from './user.mapper'; export class UserReaderImpl implements UserReader { constructor( @@ -28,4 +30,25 @@ export class UserReaderImpl implements UserReader { return { email: userEntity.email }; } + + async findAllByCursor(pageSize: number, cursorId?: string, cursorDate?: Date): Promise { + const qb = this.ormRepository.createQueryBuilder('u'); + + if (cursorDate && cursorId) { + qb.where({ + $or: [ + { createdAt: { $lt: cursorDate } }, + { + $and: [{ createdAt: cursorDate }, { id: { $lt: cursorId } }], + }, + ], + }); + } + + qb.orderBy({ createdAt: 'DESC', id: 'DESC' }).limit(pageSize + 1); + + const result = await qb.getResultList(); + + return result.map((user) => UserMapper.toUserAdminModel(user)); + } } diff --git a/iam/user/presentation/dto/request/get-all-users.request.dto.ts b/iam/user/presentation/dto/request/get-all-users.request.dto.ts new file mode 100644 index 0000000..30a8be6 --- /dev/null +++ b/iam/user/presentation/dto/request/get-all-users.request.dto.ts @@ -0,0 +1,18 @@ +import { Type } from 'class-transformer'; +import { IsDateString, IsInt, IsOptional, IsString, Min } from 'class-validator'; + +export class GetAllUsersRequestDto { + @IsOptional() + @Type(() => Number) + @IsInt() + @Min(1) + pageSize: number = 10; + + @IsOptional() + @IsString() + cursorId?: string; + + @IsOptional() + @IsDateString() + cursorDate?: string; +} diff --git a/iam/user/presentation/user.admin.controller.ts b/iam/user/presentation/user.admin.controller.ts new file mode 100644 index 0000000..655b454 --- /dev/null +++ b/iam/user/presentation/user.admin.controller.ts @@ -0,0 +1,25 @@ +import { Controller, Get, Query, UseGuards } from '@nestjs/common'; +import { ApiTags } from '@nestjs/swagger'; +import { GetAllUsersUseCase } from '../application/get-all/get-all-users.use-case'; +import { AuthGuard } from '@nestjs/passport'; +import { RolesGuard } from 'iam/auth/auth-core/infrastructure/guard/role.guard'; +import { Roles } from 'src/shared/core/presentation/role.decorator'; +import { Role } from 'iam/auth/auth-core/domain/value-object/role'; +import { GetAllUsersRequestDto } from './dto/request/get-all-users.request.dto'; + +@ApiTags('admin-user') +@Controller('admin/user') +export class UserAdminController { + constructor(private readonly getAllUsersUseCase: GetAllUsersUseCase) {} + + @Get() + @UseGuards(AuthGuard('jwt-access'), RolesGuard) + @Roles(Role.ADMIN) + async getAll(@Query() query: GetAllUsersRequestDto) { + return await this.getAllUsersUseCase.execute({ + pageSize: query.pageSize, + cursorId: query.cursorId, + cursorDate: query.cursorDate ? new Date(query.cursorDate) : undefined, + }); + } +} diff --git a/iam/user/presentation/user.controller.ts b/iam/user/presentation/user.controller.ts index 492c73f..98aa4ee 100644 --- a/iam/user/presentation/user.controller.ts +++ b/iam/user/presentation/user.controller.ts @@ -22,7 +22,7 @@ export class UserController { ) {} @Delete('me') - @UseGuards(AuthGuard('jwt-access'), RolesGuard) + @UseGuards(AuthGuard('jwt-user-access'), RolesGuard) @Roles(Role.USER) @UserDocs('deleteUser') async deleteUser(@User() user: UserPayload, @Res() res: Response) { @@ -36,7 +36,7 @@ export class UserController { } @Get('me') - @UseGuards(AuthGuard('jwt-access'), RolesGuard) + @UseGuards(AuthGuard('jwt-user-access'), RolesGuard) @Roles(Role.USER) @UserDocs('getUser') async getMyInfo(@User() user: UserPayload): Promise { diff --git a/iam/user/user.module.ts b/iam/user/user.module.ts index 154a4ac..d5be601 100644 --- a/iam/user/user.module.ts +++ b/iam/user/user.module.ts @@ -11,8 +11,10 @@ import { USER_READER } from './domain/user.reader'; import { UserReaderImpl } from './infrastructure/user.reader.impl'; import { GetUserUseCase } from './application/get/get-user.use-case'; import { UserEntity } from './infrastructure/user.entity'; +import { GetAllUsersUseCase } from './application/get-all/get-all-users.use-case'; +import { UserAdminController } from './presentation/user.admin.controller'; -const useCases = [DeleteUserUseCase, CreateUserUseCase, GetUserUseCase]; +const useCases = [DeleteUserUseCase, CreateUserUseCase, GetUserUseCase, GetAllUsersUseCase]; @Module({ imports: [MikroOrmModule.forFeature([UserEntity]), SharedModule, CqrsModule], @@ -28,6 +30,6 @@ const useCases = [DeleteUserUseCase, CreateUserUseCase, GetUserUseCase]; }, ], exports: [...useCases], - controllers: [UserController], + controllers: [UserController, UserAdminController], }) export class UserModule {} diff --git a/package.json b/package.json index 5cc058a..de75834 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "start": "nest start", "start:dev": "nest start --watch", "start:debug": "nest start --debug --watch", - "start:prod": "node dist/main", + "start:prod": "node dist/src/main", "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", "test": "jest", "test:watch": "jest --watch", @@ -35,7 +35,7 @@ "@nestjs/cqrs": "^11.0.3", "@nestjs/jwt": "^11.0.2", "@nestjs/passport": "^11.0.5", - "@nestjs/platform-express": "^11.1.9", + "@nestjs/platform-express": "^11.1.11", "@nestjs/swagger": "^11.2.3", "@sapphire/snowflake": "^3.5.5", "@types/passport-jwt": "^4.0.1", @@ -76,7 +76,7 @@ "jest": "^30.2.0", "prettier": "^3.4.2", "source-map-support": "^0.5.21", - "supertest": "^7.1.4", + "supertest": "^7.2.2", "ts-jest": "^29.4.0", "ts-loader": "^9.5.2", "ts-node": "^10.9.2", diff --git a/src/article/command/presentation/article.command.controller.ts b/src/article/command/presentation/article.command.controller.ts index b714287..e4419ce 100644 --- a/src/article/command/presentation/article.command.controller.ts +++ b/src/article/command/presentation/article.command.controller.ts @@ -51,7 +51,7 @@ export class OrganizationArticleCommandController { ) {} @Post() - @UseGuards(AuthGuard('jwt-access'), RolesGuard) + @UseGuards(AuthGuard('jwt-organization-access'), RolesGuard) @Roles(Role.ORGANIZATION) @ArticleCommandDocs('create') async createArticle( @@ -62,7 +62,7 @@ export class OrganizationArticleCommandController { } @Patch(':id') - @UseGuards(AuthGuard('jwt-access'), RolesGuard) + @UseGuards(AuthGuard('jwt-organization-access'), RolesGuard) @Roles(Role.ORGANIZATION) @ArticleCommandDocs('update') async updateArticle( @@ -74,7 +74,7 @@ export class OrganizationArticleCommandController { } @Delete(':id') - @UseGuards(AuthGuard('jwt-access'), RolesGuard) + @UseGuards(AuthGuard('jwt-organization-access'), RolesGuard) @Roles(Role.ORGANIZATION) @ArticleCommandDocs('delete') async delete(@Organization() organization: OrganizationPayload, @Param('id') id: string): Promise { diff --git a/src/article/query/article.query.module.ts b/src/article/query/article.query.module.ts index 1027392..6e37f75 100644 --- a/src/article/query/article.query.module.ts +++ b/src/article/query/article.query.module.ts @@ -10,15 +10,22 @@ import { ArticleQueryRepositoryImpl } from './infrastructure/article.query.repos import { MediaEntity } from 'src/media/command/infrastructure/media.entity'; import { ARTICLE_READER } from './organization/domain/article.reader'; import { ArticleReaderImpl } from './organization/infrastructure/article.reader.impl'; -import { ArticleOrganizationViewController } from './organization/presentation/article.view.controller'; +import { + ArticleAdminViewController, + ArticleOrganizationViewController, +} from './organization/presentation/article.view.controller'; import { GetOrganizationArticleListUseCase } from './organization/application/article-list/get-article-list.use-case'; import { ArticleViewEntity } from './organization/infrastructure/article.view.entity'; +import { GetArticleSummariesUseCase } from './organization/application/article-summary/get-article-summaries.use-case'; +import { GetArticleAdminUseCase } from './organization/application/article/get-article.use-case'; const usecases = [ GetArticleDetailUseCase, GetArticleListUseCase, GetArticleSearchUseCase, GetOrganizationArticleListUseCase, + GetArticleSummariesUseCase, + GetArticleAdminUseCase, ]; @Module({ @@ -34,6 +41,6 @@ const usecases = [ useClass: ArticleReaderImpl, }, ], - controllers: [ArticleQueryController, ArticleOrganizationViewController], + controllers: [ArticleQueryController, ArticleOrganizationViewController, ArticleAdminViewController], }) export class ArticleQueryModule {} diff --git a/src/article/query/organization/application/article-summary/get-article-summaries.query.ts b/src/article/query/organization/application/article-summary/get-article-summaries.query.ts new file mode 100644 index 0000000..c005608 --- /dev/null +++ b/src/article/query/organization/application/article-summary/get-article-summaries.query.ts @@ -0,0 +1,7 @@ +export class GetArticleSummariesQuery { + constructor( + public readonly pageSize: number, + public readonly cursorId?: string, + public readonly cursorDate?: Date, + ) {} +} diff --git a/src/article/query/organization/application/article-summary/get-article-summaries.result.ts b/src/article/query/organization/application/article-summary/get-article-summaries.result.ts new file mode 100644 index 0000000..396043e --- /dev/null +++ b/src/article/query/organization/application/article-summary/get-article-summaries.result.ts @@ -0,0 +1,8 @@ +import { ArticleSummaryModel } from '../../domain/article-summary.model'; + +export class GetArticleSummariesResult { + articles: ArticleSummaryModel[]; + cursorId: string | null; + cursorDate: string | null; + hasNext: boolean; +} diff --git a/src/article/query/organization/application/article-summary/get-article-summaries.use-case.ts b/src/article/query/organization/application/article-summary/get-article-summaries.use-case.ts new file mode 100644 index 0000000..c280796 --- /dev/null +++ b/src/article/query/organization/application/article-summary/get-article-summaries.use-case.ts @@ -0,0 +1,34 @@ +import { Inject, Injectable } from '@nestjs/common'; +import { ARTICLE_READER, ArticleReader } from '../../domain/article.reader'; +import { GetArticleSummariesQuery } from './get-article-summaries.query'; +import { GetArticleSummariesResult } from './get-article-summaries.result'; + +@Injectable() +export class GetArticleSummariesUseCase { + constructor( + @Inject(ARTICLE_READER) + private readonly articleReader: ArticleReader, + ) {} + + async execute(query: GetArticleSummariesQuery): Promise { + const { pageSize, cursorId, cursorDate } = query; + const articleSummaries = await this.articleReader.findAllByCursor(pageSize, cursorId, cursorDate); + // 다음 페이지 여부 확인 + const hasNext = articleSummaries.length > pageSize; + + // 실제 반환할 데이터 (마지막 +1개는 제거) + const articles = hasNext ? articleSummaries.slice(0, pageSize) : articleSummaries; + + // 다음 커서 정보 추출 + const lastItem = articles[articles.length - 1]; + const nextCursorId = hasNext && lastItem ? lastItem.id : null; + const nextCursorDate = hasNext && lastItem ? lastItem.createdAt : null; + + return { + articles, + cursorId: nextCursorId, + cursorDate: nextCursorDate, + hasNext, + }; + } +} diff --git a/src/article/query/organization/application/article/get-article.query.ts b/src/article/query/organization/application/article/get-article.query.ts new file mode 100644 index 0000000..2982247 --- /dev/null +++ b/src/article/query/organization/application/article/get-article.query.ts @@ -0,0 +1,3 @@ +export class GetArticleAdminQuery { + constructor(public readonly articleId: string) {} +} diff --git a/src/article/query/organization/application/article/get-article.use-case.ts b/src/article/query/organization/application/article/get-article.use-case.ts new file mode 100644 index 0000000..15b499a --- /dev/null +++ b/src/article/query/organization/application/article/get-article.use-case.ts @@ -0,0 +1,18 @@ +import { Inject, Injectable } from '@nestjs/common'; +import { GetArticleAdminQuery } from './get-article.query'; +import { ARTICLE_READER, ArticleReader } from '../../domain/article.reader'; +import { ArticleModel } from '../../domain/article.model'; + +@Injectable() +export class GetArticleAdminUseCase { + constructor( + @Inject(ARTICLE_READER) + private readonly articleReader: ArticleReader, + ) {} + + async execute(query: GetArticleAdminQuery): Promise { + const { articleId } = query; + + return await this.articleReader.findById(articleId); + } +} diff --git a/src/article/query/organization/domain/article-summary.model.ts b/src/article/query/organization/domain/article-summary.model.ts new file mode 100644 index 0000000..3f256d3 --- /dev/null +++ b/src/article/query/organization/domain/article-summary.model.ts @@ -0,0 +1,39 @@ +import { ApiProperty } from '@nestjs/swagger'; + +export class ArticleSummaryModel { + @ApiProperty({ + example: '21231423423', + description: '게시글 ID', + }) + id: string; + + @ApiProperty({ + example: '제목', + description: '게시글 제목', + }) + title: string; + + @ApiProperty({ + example: '고려대학교', + description: '게시글 작성자', + }) + organization: string; + + @ApiProperty({ + example: '[태그1, 태그2]', + description: '게시글 태그 목록', + }) + tags: string[]; + + @ApiProperty({ + example: 100, + description: '조회 수', + }) + viewCount: number; + + @ApiProperty({ + example: '2023-10-01T00:00:00Z', + description: '게시글 생성 시간', + }) + createdAt: string; +} diff --git a/src/article/query/organization/domain/article.model.ts b/src/article/query/organization/domain/article.model.ts index 6564b7c..1432f0c 100644 --- a/src/article/query/organization/domain/article.model.ts +++ b/src/article/query/organization/domain/article.model.ts @@ -25,6 +25,18 @@ export class ArticleModel { }) organization: string; + @ApiProperty({ + example: '게시글 설명입니다.', + description: '게시글 설명', + }) + description: string; + + @ApiProperty({ + example: '고려대학교', + description: '위치', + }) + location: string; + @ApiProperty({ example: 'https://example.com/thumbnail.jpg', description: '썸네일 이미지 경로', @@ -75,6 +87,12 @@ export class ArticleModel { }) registrationEndAt?: string; + @ApiProperty({ + example: 'https://example.com/register', + description: '등록 URL', + }) + registrationUrl?: string; + @ApiProperty({ example: '2023-08-01T12:00:00Z', description: '게시글 생성 시간', diff --git a/src/article/query/organization/domain/article.reader.ts b/src/article/query/organization/domain/article.reader.ts index 49eb6e9..874da87 100644 --- a/src/article/query/organization/domain/article.reader.ts +++ b/src/article/query/organization/domain/article.reader.ts @@ -1,7 +1,10 @@ +import { ArticleSummaryModel } from './article-summary.model'; import { ArticleModel } from './article.model'; export interface ArticleReader { + findById(articleId: string): Promise; findAllByOrganizationId(organizationId: string): Promise; + findAllByCursor(pageSize: number, cursorId?: string, cursorDate?: Date): Promise; } export const ARTICLE_READER = 'ARTICLE_READER'; diff --git a/src/article/query/organization/infrastructure/article.reader.impl.ts b/src/article/query/organization/infrastructure/article.reader.impl.ts index f9fd33a..7463ae9 100644 --- a/src/article/query/organization/infrastructure/article.reader.impl.ts +++ b/src/article/query/organization/infrastructure/article.reader.impl.ts @@ -3,7 +3,8 @@ import { ArticleViewEntity } from './article.view.entity'; import { EntityRepository } from '@mikro-orm/mysql'; import { ArticleReader } from '../domain/article.reader'; import { ArticleModel } from '../domain/article.model'; -import { ArticleViewMapper } from './article.view.mapper'; +import { ArticleSummaryViewMapper, ArticleViewMapper } from './article.view.mapper'; +import { ArticleSummaryModel } from '../domain/article-summary.model'; export class ArticleReaderImpl implements ArticleReader { constructor( @@ -11,9 +12,34 @@ export class ArticleReaderImpl implements ArticleReader { private readonly ormRepository: EntityRepository, ) {} + async findById(articleId: string): Promise { + const article = await this.ormRepository.findOneOrFail({ id: articleId }); + return ArticleViewMapper.toModel(article); + } + async findAllByOrganizationId(organizationId: string): Promise { const articles = await this.ormRepository.find({ organizationId }, { orderBy: { createdAt: 'DESC' } }); return articles.map((article) => ArticleViewMapper.toModel(article)); } + + async findAllByCursor(pageSize: number, cursorId?: string, cursorDate?: Date): Promise { + const qb = this.ormRepository.createQueryBuilder('a'); + + if (cursorDate && cursorId) { + qb.where({ + $or: [ + { createdAt: { $lt: cursorDate } }, + { + $and: [{ createdAt: cursorDate }, { id: { $lt: cursorId } }], + }, + ], + }); + } + qb.orderBy({ createdAt: 'DESC', id: 'DESC' }).limit(pageSize + 1); + + const result = await qb.getResultList(); + + return result.map((article) => ArticleSummaryViewMapper.toModel(article)); + } } diff --git a/src/article/query/organization/infrastructure/article.view.entity.ts b/src/article/query/organization/infrastructure/article.view.entity.ts index 7f949d0..60f44bf 100644 --- a/src/article/query/organization/infrastructure/article.view.entity.ts +++ b/src/article/query/organization/infrastructure/article.view.entity.ts @@ -7,6 +7,8 @@ import { Entity, Property } from '@mikro-orm/core'; a.organization_id, a.title, a.organization, + a.description, + a.location, m.media_path AS thumbnail_path, a.scrap_count, a.view_count, @@ -41,6 +43,12 @@ export class ArticleViewEntity { @Property() organization: string; + @Property() + description: string; + + @Property() + location: string; + @Property() scrapCount: number; diff --git a/src/article/query/organization/infrastructure/article.view.mapper.ts b/src/article/query/organization/infrastructure/article.view.mapper.ts index 50481fc..b70cce6 100644 --- a/src/article/query/organization/infrastructure/article.view.mapper.ts +++ b/src/article/query/organization/infrastructure/article.view.mapper.ts @@ -1,3 +1,4 @@ +import { ArticleSummaryModel } from '../domain/article-summary.model'; import { ArticleModel } from '../domain/article.model'; import { ArticleViewEntity } from './article.view.entity'; @@ -8,6 +9,8 @@ export class ArticleViewMapper { model.organizationId = entity.organizationId; model.title = entity.title; model.organization = entity.organization; + model.description = entity.description; + model.location = entity.location; model.thumbnailPath = entity.thumbnailPath; model.scrapCount = entity.scrapCount; model.viewCount = entity.viewCount; @@ -21,3 +24,17 @@ export class ArticleViewMapper { return model; } } + +export class ArticleSummaryViewMapper { + static toModel(entity: ArticleViewEntity): ArticleSummaryModel { + const model = new ArticleSummaryModel(); + model.id = entity.id; + model.title = entity.title; + model.organization = entity.organization; + model.tags = entity.tags ? entity.tags.split(',').map((tag) => tag.trim()) : []; + model.viewCount = entity.viewCount; + model.createdAt = entity.createdAt.toISOString(); + + return model; + } +} diff --git a/src/article/query/organization/presentation/article.view.controller.ts b/src/article/query/organization/presentation/article.view.controller.ts index 47fb491..11f28b7 100644 --- a/src/article/query/organization/presentation/article.view.controller.ts +++ b/src/article/query/organization/presentation/article.view.controller.ts @@ -1,4 +1,4 @@ -import { Controller, Get, UseGuards } from '@nestjs/common'; +import { Controller, Get, Param, Query, UseGuards } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; import { Organization, OrganizationPayload } from 'src/shared/core/presentation/organization.decorator'; import { ArticleModel } from '../domain/article.model'; @@ -8,6 +8,9 @@ import { Roles } from 'src/shared/core/presentation/role.decorator'; import { OrganizationArticleViewDocs } from './article.view.docs'; import { RolesGuard } from 'iam/auth/auth-core/infrastructure/guard/role.guard'; import { Role } from 'iam/auth/auth-core/domain/value-object/role'; +import { GetArticleSummariesUseCase } from '../application/article-summary/get-article-summaries.use-case'; +import { GetArticleSummariesRequestDto } from './dto/request/get-article-summaries.request.dto'; +import { GetArticleAdminUseCase } from '../application/article/get-article.use-case'; @ApiTags('organization-article') @Controller('organization/article') @@ -15,10 +18,37 @@ export class ArticleOrganizationViewController { constructor(private readonly getOrganizationArticleListUseCase: GetOrganizationArticleListUseCase) {} @Get() - @UseGuards(AuthGuard('jwt-access'), RolesGuard) + @UseGuards(AuthGuard('jwt-organization-access'), RolesGuard) @Roles(Role.ORGANIZATION) @OrganizationArticleViewDocs('list') async getArticleList(@Organization() organization: OrganizationPayload): Promise { return await this.getOrganizationArticleListUseCase.execute({ organizationId: organization.organizationId }); } } + +@ApiTags('admin-article') +@Controller('admin/article') +export class ArticleAdminViewController { + constructor( + private readonly getArticleSummariesUseCase: GetArticleSummariesUseCase, + private readonly getArticleAdminUseCase: GetArticleAdminUseCase, + ) {} + + @Get() + @UseGuards(AuthGuard('jwt-admin-access'), RolesGuard) + @Roles(Role.ADMIN) + async getArticleSummaries(@Query() query: GetArticleSummariesRequestDto) { + return await this.getArticleSummariesUseCase.execute({ + pageSize: query.pageSize, + cursorId: query.cursorId, + cursorDate: query.cursorDate ? new Date(query.cursorDate) : undefined, + }); + } + + @Get(':articleId') + @UseGuards(AuthGuard('jwt-admin-access'), RolesGuard) + @Roles(Role.ADMIN) + async getArticle(@Param('articleId') articleId: string) { + return await this.getArticleAdminUseCase.execute({ articleId }); + } +} diff --git a/src/article/query/organization/presentation/dto/request/get-article-summaries.request.dto.ts b/src/article/query/organization/presentation/dto/request/get-article-summaries.request.dto.ts new file mode 100644 index 0000000..d132d04 --- /dev/null +++ b/src/article/query/organization/presentation/dto/request/get-article-summaries.request.dto.ts @@ -0,0 +1,18 @@ +import { Type } from 'class-transformer'; +import { IsDateString, IsInt, IsOptional, IsString, Min } from 'class-validator'; + +export class GetArticleSummariesRequestDto { + @IsOptional() + @Type(() => Number) // 문자열을 숫자로 변환 + @IsInt() + @Min(1) + pageSize: number = 10; + + @IsOptional() + @IsString() + cursorId?: string; + + @IsOptional() + @IsDateString() + cursorDate?: string; +} diff --git a/src/scrap/command/presentation/scrap.command.controller.ts b/src/scrap/command/presentation/scrap.command.controller.ts index 142e183..0421671 100644 --- a/src/scrap/command/presentation/scrap.command.controller.ts +++ b/src/scrap/command/presentation/scrap.command.controller.ts @@ -15,14 +15,14 @@ export class ScrapCommandController { ) {} @Post(':id') - @UseGuards(AuthGuard('jwt-access')) + @UseGuards(AuthGuard('jwt-user-access')) @ScrapCommandDocs('addScrap') async addScrap(@Param('id') articleId: string, @User() user: UserPayload) { await this.addScrapHandler.execute({ articleId, userId: user.userId }); } @Delete(':id') - @UseGuards(AuthGuard('jwt-access')) + @UseGuards(AuthGuard('jwt-user-access')) @ScrapCommandDocs('deleteScrap') async deleteScrap(@Param('id') articleId: string, @User() user: UserPayload) { await this.deleteScrapHandler.execute({ articleId, userId: user.userId }); diff --git a/src/scrap/query/presentation/scrap.query.controller.ts b/src/scrap/query/presentation/scrap.query.controller.ts index 7e6b029..a6c9685 100644 --- a/src/scrap/query/presentation/scrap.query.controller.ts +++ b/src/scrap/query/presentation/scrap.query.controller.ts @@ -19,14 +19,14 @@ export class ScrapQueryController { ) {} @Get('search') - @UseGuards(AuthGuard('jwt-access')) + @UseGuards(AuthGuard('jwt-user-access')) @ScrapQueryDocs('searchScrap') async getScrapSearch(@User() user: UserPayload, @Query() reqDto: GetScrapSearchRequestDto) { return await this.getScrapSearchUseCase.execute(user.userId, reqDto); } @Get() - @UseGuards(AuthGuard('jwt-access')) + @UseGuards(AuthGuard('jwt-user-access')) @ScrapQueryDocs('getMyScrap') async getMyScrap(@User() user: UserPayload, @Query() reqDto: GetMyScrapRequestDto) { const userId = user.userId; @@ -36,7 +36,7 @@ export class ScrapQueryController { } @Get('article/:id') - @UseGuards(AuthGuard('jwt-access')) + @UseGuards(AuthGuard('jwt-user-access')) @ScrapQueryDocs('checkScrap') async checkScrap(@Param('id') articleId: string, @User() user: UserPayload) { return await this.checkScrapUseCase.execute({ articleId, userId: user.userId }); diff --git a/src/shared/config/cookie.config.ts b/src/shared/config/cookie.config.ts index 01659a0..dcbef6a 100644 --- a/src/shared/config/cookie.config.ts +++ b/src/shared/config/cookie.config.ts @@ -5,7 +5,7 @@ export const accessTokenCookieOptions: CookieOptions = { httpOnly: true, secure: true, sameSite: 'none', - maxAge: 60 * 60 * 1000, // 1 hour + maxAge: 3 * 60 * 60 * 1000, // 3 hour path: '/', domain: process.env.FRONTEND_DOMAIN, }; diff --git a/src/shared/core/presentation/admin.decorator.ts b/src/shared/core/presentation/admin.decorator.ts new file mode 100644 index 0000000..2cb487e --- /dev/null +++ b/src/shared/core/presentation/admin.decorator.ts @@ -0,0 +1,15 @@ +import { createParamDecorator, ExecutionContext } from '@nestjs/common'; +import { Request } from 'express'; +import { JwtPayload } from 'iam/auth/auth-core/infrastructure/jwt/jwt-payload'; + +export interface AdminPayload { + adminId: string; + jti: string; +} + +export const Admin = createParamDecorator((data: unknown, ctx: ExecutionContext): AdminPayload => { + const request = ctx.switchToHttp().getRequest(); + const { sub, jti } = request.user as JwtPayload; + + return { adminId: sub, jti }; +}); diff --git a/src/shared/exception/custom-exception-code.ts b/src/shared/exception/custom-exception-code.ts index d481e78..d8c9a74 100644 --- a/src/shared/exception/custom-exception-code.ts +++ b/src/shared/exception/custom-exception-code.ts @@ -52,12 +52,21 @@ export enum CustomExceptionCode { AUTH_ORGANIZATION_INVALID_REFRESH_TOKEN = 'AUTH_ORGANIZATION_INVALID_REFRESH_TOKEN', AUTH_ORGANIZATION_INVALID_ACCESS_TOKEN = 'AUTH_ORGANIZATION_INVALID_ACCESS_TOKEN', AUTH_ORGANIZATION_NOT_FOUND = 'AUTH_ORGANIZATION_NOT_FOUND', - AUTH_ORGANIZATION_INVALID_PASSWORD = 'AUTH_ORGANIZATION_INVALID_PASSWORD', + AUTH_INVALID_PASSWORD = 'AUTH_INVALID_PASSWORD', + AUTH_INVALID_CURRENT_PASSWORD = 'AUTH_INVALID_CURRENT_PASSWORD', // Organization ORGANIZATION_INVALID_NAME_LENGTH = 'ORGANIZATION_INVALID_NAME_LENGTH', ORGANIZATION_INVALID_CONTACT_FORMAT = 'ORGANIZATION_INVALID_CONTACT_FORMAT', ORGANIZATION_NOT_FOUND = 'ORGANIZATION_NOT_FOUND', + + // Admin + ADMIN_INVALID_NAME_LENGTH = 'ADMIN_INVALID_NAME_LENGTH', + ADMIN_NOT_FOUND = 'ADMIN_NOT_FOUND', + + // Auth Admin + AUTH_ADMIN_NOT_FOUND = 'AUTH_ADMIN_NOT_FOUND', + AUTH_ADMIN_ALREADY_EXISTS = 'AUTH_ADMIN_ALREADY_EXISTS', } export const ExceptionInfo: Record = { @@ -240,11 +249,15 @@ export const ExceptionInfo: Record { }); it('/ (GET)', () => { - return request(app.getHttpServer()) - .get('/') - .expect(200) - .expect('Hello World!'); + return request(app.getHttpServer()).get('/').expect(200).expect('Hello World!'); }); }); diff --git a/yarn.lock b/yarn.lock index 67f8cec..72c6c1d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,21 +7,21 @@ resolved "https://registry.yarnpkg.com/@amplitude/analytics-connector/-/analytics-connector-1.6.4.tgz#8a811ff5c8ee46bdfea0e8f61c7578769b5778ed" integrity sha512-SpIv0IQMNIq6SH3UqFGiaZyGSc7PBZwRdq7lvP0pBxW8i4Ny+8zwI0pV+VMfMHQwWY3wdIbWw5WQphNjpdq1/Q== -"@amplitude/analytics-core@2.33.0": - version "2.33.0" - resolved "https://registry.yarnpkg.com/@amplitude/analytics-core/-/analytics-core-2.33.0.tgz#347047f4243cd5b76e120e6fe1b2b5e266e1ecb3" - integrity sha512-56m0R12TjZ41D2YIghb/XNHSdL4CurAVyRT3L2FD+9DCFfbgjfT8xhDBnsZtA+aBkb6Yak1EGUojGBunfAm2/A== +"@amplitude/analytics-core@2.35.0": + version "2.35.0" + resolved "https://registry.yarnpkg.com/@amplitude/analytics-core/-/analytics-core-2.35.0.tgz#ba56bd6826f016db762ce54368a6e38f9c55907a" + integrity sha512-7RmHYELXCGu8yuO9D6lEXiqkMtiC5sePNhCWmwuP30dneDYHtH06gaYvAFH/YqOFuE6enwEEJfFYtcaPhyiqtA== dependencies: "@amplitude/analytics-connector" "^1.6.4" tslib "^2.4.1" zen-observable-ts "^1.1.0" "@amplitude/analytics-node@^1.5.14": - version "1.5.26" - resolved "https://registry.yarnpkg.com/@amplitude/analytics-node/-/analytics-node-1.5.26.tgz#f02b7de31c0cdd9923f65a5db6de2cc6ea6d29e2" - integrity sha512-0ewJ+u+IDCjFFDl+YRlILEcFFhbUUTq3Gh2qcxsl/rRwuQY+13H4q+1c+FOMShb5KZfvj//rk60+ZPOOG3YDAg== + version "1.5.29" + resolved "https://registry.yarnpkg.com/@amplitude/analytics-node/-/analytics-node-1.5.29.tgz#d16d0a5b876820295c0ad6cb3cef6ea7ddd53aa6" + integrity sha512-Rz8mWMUSQVdP0lTCWI4nmcmbdPYLnhv9hgEf6xgopO9UV4Y3qavhsk4aiD3n+FGD/RBxRa8eKuoNlw6iy5h6Qw== dependencies: - "@amplitude/analytics-core" "2.33.0" + "@amplitude/analytics-core" "2.35.0" tslib "^2.4.1" "@angular-devkit/core@19.2.17": @@ -151,538 +151,547 @@ tslib "^2.6.2" "@aws-sdk/client-s3@^3.820.0": - version "3.946.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.946.0.tgz#462ca31b0ffdf9c77e990a794004ff5bcc6e0672" - integrity sha512-Y3ww3yd1wzmS2r3qgH3jg4MxCTdeNrae2J1BmdV+IW/2R2gFWJva5U5GbS6KUSUxanJBRG7gd8uOIi1b0EMOng== + version "3.965.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.965.0.tgz#4b64c49b9344727c82f936fce76e723aef2230ad" + integrity sha512-BTeaaU1iK0BfatTCrtYjNkIHCoZH256qOI18l9bK4z6mVOgpHkYN4RvOu+NnKgyX58n+HWfOuhtKUD4OE33Vdw== dependencies: "@aws-crypto/sha1-browser" "5.2.0" "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.946.0" - "@aws-sdk/credential-provider-node" "3.946.0" - "@aws-sdk/middleware-bucket-endpoint" "3.936.0" - "@aws-sdk/middleware-expect-continue" "3.936.0" - "@aws-sdk/middleware-flexible-checksums" "3.946.0" - "@aws-sdk/middleware-host-header" "3.936.0" - "@aws-sdk/middleware-location-constraint" "3.936.0" - "@aws-sdk/middleware-logger" "3.936.0" - "@aws-sdk/middleware-recursion-detection" "3.936.0" - "@aws-sdk/middleware-sdk-s3" "3.946.0" - "@aws-sdk/middleware-ssec" "3.936.0" - "@aws-sdk/middleware-user-agent" "3.946.0" - "@aws-sdk/region-config-resolver" "3.936.0" - "@aws-sdk/signature-v4-multi-region" "3.946.0" - "@aws-sdk/types" "3.936.0" - "@aws-sdk/util-endpoints" "3.936.0" - "@aws-sdk/util-user-agent-browser" "3.936.0" - "@aws-sdk/util-user-agent-node" "3.946.0" - "@smithy/config-resolver" "^4.4.3" - "@smithy/core" "^3.18.7" - "@smithy/eventstream-serde-browser" "^4.2.5" - "@smithy/eventstream-serde-config-resolver" "^4.3.5" - "@smithy/eventstream-serde-node" "^4.2.5" - "@smithy/fetch-http-handler" "^5.3.6" - "@smithy/hash-blob-browser" "^4.2.6" - "@smithy/hash-node" "^4.2.5" - "@smithy/hash-stream-node" "^4.2.5" - "@smithy/invalid-dependency" "^4.2.5" - "@smithy/md5-js" "^4.2.5" - "@smithy/middleware-content-length" "^4.2.5" - "@smithy/middleware-endpoint" "^4.3.14" - "@smithy/middleware-retry" "^4.4.14" - "@smithy/middleware-serde" "^4.2.6" - "@smithy/middleware-stack" "^4.2.5" - "@smithy/node-config-provider" "^4.3.5" - "@smithy/node-http-handler" "^4.4.5" - "@smithy/protocol-http" "^5.3.5" - "@smithy/smithy-client" "^4.9.10" - "@smithy/types" "^4.9.0" - "@smithy/url-parser" "^4.2.5" + "@aws-sdk/core" "3.965.0" + "@aws-sdk/credential-provider-node" "3.965.0" + "@aws-sdk/middleware-bucket-endpoint" "3.965.0" + "@aws-sdk/middleware-expect-continue" "3.965.0" + "@aws-sdk/middleware-flexible-checksums" "3.965.0" + "@aws-sdk/middleware-host-header" "3.965.0" + "@aws-sdk/middleware-location-constraint" "3.965.0" + "@aws-sdk/middleware-logger" "3.965.0" + "@aws-sdk/middleware-recursion-detection" "3.965.0" + "@aws-sdk/middleware-sdk-s3" "3.965.0" + "@aws-sdk/middleware-ssec" "3.965.0" + "@aws-sdk/middleware-user-agent" "3.965.0" + "@aws-sdk/region-config-resolver" "3.965.0" + "@aws-sdk/signature-v4-multi-region" "3.965.0" + "@aws-sdk/types" "3.965.0" + "@aws-sdk/util-endpoints" "3.965.0" + "@aws-sdk/util-user-agent-browser" "3.965.0" + "@aws-sdk/util-user-agent-node" "3.965.0" + "@smithy/config-resolver" "^4.4.5" + "@smithy/core" "^3.20.0" + "@smithy/eventstream-serde-browser" "^4.2.7" + "@smithy/eventstream-serde-config-resolver" "^4.3.7" + "@smithy/eventstream-serde-node" "^4.2.7" + "@smithy/fetch-http-handler" "^5.3.8" + "@smithy/hash-blob-browser" "^4.2.8" + "@smithy/hash-node" "^4.2.7" + "@smithy/hash-stream-node" "^4.2.7" + "@smithy/invalid-dependency" "^4.2.7" + "@smithy/md5-js" "^4.2.7" + "@smithy/middleware-content-length" "^4.2.7" + "@smithy/middleware-endpoint" "^4.4.1" + "@smithy/middleware-retry" "^4.4.17" + "@smithy/middleware-serde" "^4.2.8" + "@smithy/middleware-stack" "^4.2.7" + "@smithy/node-config-provider" "^4.3.7" + "@smithy/node-http-handler" "^4.4.7" + "@smithy/protocol-http" "^5.3.7" + "@smithy/smithy-client" "^4.10.2" + "@smithy/types" "^4.11.0" + "@smithy/url-parser" "^4.2.7" "@smithy/util-base64" "^4.3.0" "@smithy/util-body-length-browser" "^4.2.0" "@smithy/util-body-length-node" "^4.2.1" - "@smithy/util-defaults-mode-browser" "^4.3.13" - "@smithy/util-defaults-mode-node" "^4.2.16" - "@smithy/util-endpoints" "^3.2.5" - "@smithy/util-middleware" "^4.2.5" - "@smithy/util-retry" "^4.2.5" - "@smithy/util-stream" "^4.5.6" + "@smithy/util-defaults-mode-browser" "^4.3.16" + "@smithy/util-defaults-mode-node" "^4.2.19" + "@smithy/util-endpoints" "^3.2.7" + "@smithy/util-middleware" "^4.2.7" + "@smithy/util-retry" "^4.2.7" + "@smithy/util-stream" "^4.5.8" "@smithy/util-utf8" "^4.2.0" - "@smithy/util-waiter" "^4.2.5" + "@smithy/util-waiter" "^4.2.7" tslib "^2.6.2" -"@aws-sdk/client-sso@3.946.0": - version "3.946.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.946.0.tgz#2ecfe3864f67155eff64fd2312ab46ae30ad77d6" - integrity sha512-kGAs5iIVyUz4p6TX3pzG5q3cNxXnVpC4pwRC6DCSaSv9ozyPjc2d74FsK4fZ+J+ejtvCdJk72uiuQtWJc86Wuw== +"@aws-sdk/client-sso@3.965.0": + version "3.965.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.965.0.tgz#ff0727525041943a9aeda97ff778f3f368537eef" + integrity sha512-iv2tr+n4aZ+nPUFFvG00hISPuEd4DU+1/Q8rPAYKXsM+vEPJ2nAnP5duUOa2fbOLIUCRxX3dcQaQaghVHDHzQw== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.946.0" - "@aws-sdk/middleware-host-header" "3.936.0" - "@aws-sdk/middleware-logger" "3.936.0" - "@aws-sdk/middleware-recursion-detection" "3.936.0" - "@aws-sdk/middleware-user-agent" "3.946.0" - "@aws-sdk/region-config-resolver" "3.936.0" - "@aws-sdk/types" "3.936.0" - "@aws-sdk/util-endpoints" "3.936.0" - "@aws-sdk/util-user-agent-browser" "3.936.0" - "@aws-sdk/util-user-agent-node" "3.946.0" - "@smithy/config-resolver" "^4.4.3" - "@smithy/core" "^3.18.7" - "@smithy/fetch-http-handler" "^5.3.6" - "@smithy/hash-node" "^4.2.5" - "@smithy/invalid-dependency" "^4.2.5" - "@smithy/middleware-content-length" "^4.2.5" - "@smithy/middleware-endpoint" "^4.3.14" - "@smithy/middleware-retry" "^4.4.14" - "@smithy/middleware-serde" "^4.2.6" - "@smithy/middleware-stack" "^4.2.5" - "@smithy/node-config-provider" "^4.3.5" - "@smithy/node-http-handler" "^4.4.5" - "@smithy/protocol-http" "^5.3.5" - "@smithy/smithy-client" "^4.9.10" - "@smithy/types" "^4.9.0" - "@smithy/url-parser" "^4.2.5" + "@aws-sdk/core" "3.965.0" + "@aws-sdk/middleware-host-header" "3.965.0" + "@aws-sdk/middleware-logger" "3.965.0" + "@aws-sdk/middleware-recursion-detection" "3.965.0" + "@aws-sdk/middleware-user-agent" "3.965.0" + "@aws-sdk/region-config-resolver" "3.965.0" + "@aws-sdk/types" "3.965.0" + "@aws-sdk/util-endpoints" "3.965.0" + "@aws-sdk/util-user-agent-browser" "3.965.0" + "@aws-sdk/util-user-agent-node" "3.965.0" + "@smithy/config-resolver" "^4.4.5" + "@smithy/core" "^3.20.0" + "@smithy/fetch-http-handler" "^5.3.8" + "@smithy/hash-node" "^4.2.7" + "@smithy/invalid-dependency" "^4.2.7" + "@smithy/middleware-content-length" "^4.2.7" + "@smithy/middleware-endpoint" "^4.4.1" + "@smithy/middleware-retry" "^4.4.17" + "@smithy/middleware-serde" "^4.2.8" + "@smithy/middleware-stack" "^4.2.7" + "@smithy/node-config-provider" "^4.3.7" + "@smithy/node-http-handler" "^4.4.7" + "@smithy/protocol-http" "^5.3.7" + "@smithy/smithy-client" "^4.10.2" + "@smithy/types" "^4.11.0" + "@smithy/url-parser" "^4.2.7" "@smithy/util-base64" "^4.3.0" "@smithy/util-body-length-browser" "^4.2.0" "@smithy/util-body-length-node" "^4.2.1" - "@smithy/util-defaults-mode-browser" "^4.3.13" - "@smithy/util-defaults-mode-node" "^4.2.16" - "@smithy/util-endpoints" "^3.2.5" - "@smithy/util-middleware" "^4.2.5" - "@smithy/util-retry" "^4.2.5" + "@smithy/util-defaults-mode-browser" "^4.3.16" + "@smithy/util-defaults-mode-node" "^4.2.19" + "@smithy/util-endpoints" "^3.2.7" + "@smithy/util-middleware" "^4.2.7" + "@smithy/util-retry" "^4.2.7" "@smithy/util-utf8" "^4.2.0" tslib "^2.6.2" -"@aws-sdk/core@3.946.0": - version "3.946.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.946.0.tgz#61ba7b8c3f27f04496231fdc9485df5bceae4e89" - integrity sha512-u2BkbLLVbMFrEiXrko2+S6ih5sUZPlbVyRPtXOqMHlCyzr70sE8kIiD6ba223rQeIFPcYfW/wHc6k4ihW2xxVg== - dependencies: - "@aws-sdk/types" "3.936.0" - "@aws-sdk/xml-builder" "3.930.0" - "@smithy/core" "^3.18.7" - "@smithy/node-config-provider" "^4.3.5" - "@smithy/property-provider" "^4.2.5" - "@smithy/protocol-http" "^5.3.5" - "@smithy/signature-v4" "^5.3.5" - "@smithy/smithy-client" "^4.9.10" - "@smithy/types" "^4.9.0" +"@aws-sdk/core@3.965.0": + version "3.965.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.965.0.tgz#b151ecc47a7861074b823079bb9217b09dce4769" + integrity sha512-aq9BhQxdHit8UUJ9C0im9TtuKeK0pT6NXmNJxMTCFeStI7GG7ImIsSislg3BZTIifVg1P6VLdzMyz9de85iutQ== + dependencies: + "@aws-sdk/types" "3.965.0" + "@aws-sdk/xml-builder" "3.965.0" + "@smithy/core" "^3.20.0" + "@smithy/node-config-provider" "^4.3.7" + "@smithy/property-provider" "^4.2.7" + "@smithy/protocol-http" "^5.3.7" + "@smithy/signature-v4" "^5.3.7" + "@smithy/smithy-client" "^4.10.2" + "@smithy/types" "^4.11.0" "@smithy/util-base64" "^4.3.0" - "@smithy/util-middleware" "^4.2.5" + "@smithy/util-middleware" "^4.2.7" "@smithy/util-utf8" "^4.2.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-env@3.946.0": - version "3.946.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.946.0.tgz#d2fff69989f98b562c285dbe0d6dc2715fea5f6f" - integrity sha512-P4l+K6wX1tf8LmWUvZofdQ+BgCNyk6Tb9u1H10npvqpuCD+dCM4pXIBq3PQcv/juUBOvLGGREo+Govuh3lfD0Q== +"@aws-sdk/crc64-nvme@3.965.0": + version "3.965.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/crc64-nvme/-/crc64-nvme-3.965.0.tgz#c51c032b73f5d6e532a849f34c5e7c9eea69b7e3" + integrity sha512-9FbIyJ/Zz1AdEIrb0+Pn7wRi+F/0Y566ooepg0hDyHUzRV3ZXKjOlu3wJH3YwTz2UkdwQmldfUos2yDJps7RyA== dependencies: - "@aws-sdk/core" "3.946.0" - "@aws-sdk/types" "3.936.0" - "@smithy/property-provider" "^4.2.5" - "@smithy/types" "^4.9.0" + "@smithy/types" "^4.11.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-http@3.946.0": - version "3.946.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.946.0.tgz#7befebf44880454563bbb14dd14113f1c7d19ae9" - integrity sha512-/zeOJ6E7dGZQ/l2k7KytEoPJX0APIhwt0A79hPf/bUpMF4dDs2P6JmchDrotk0a0Y/MIdNF8sBQ/MEOPnBiYoQ== - dependencies: - "@aws-sdk/core" "3.946.0" - "@aws-sdk/types" "3.936.0" - "@smithy/fetch-http-handler" "^5.3.6" - "@smithy/node-http-handler" "^4.4.5" - "@smithy/property-provider" "^4.2.5" - "@smithy/protocol-http" "^5.3.5" - "@smithy/smithy-client" "^4.9.10" - "@smithy/types" "^4.9.0" - "@smithy/util-stream" "^4.5.6" +"@aws-sdk/credential-provider-env@3.965.0": + version "3.965.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.965.0.tgz#2312482be96381cd8c4271e7092b11d04a475da8" + integrity sha512-mdGnaIjMxTIjsb70dEj3VsWPWpoq1V5MWzBSfJq2H8zgMBXjn6d5/qHP8HMf53l9PrsgqzMpXGv3Av549A2x1g== + dependencies: + "@aws-sdk/core" "3.965.0" + "@aws-sdk/types" "3.965.0" + "@smithy/property-provider" "^4.2.7" + "@smithy/types" "^4.11.0" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-http@3.965.0": + version "3.965.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.965.0.tgz#fc1d682befbd53d84ee2dbf6e9b15f21e3cc4cf6" + integrity sha512-YuGQel9EgA/z25oeLM+GYYQS750+8AESvr7ZEmVnRPL0sg+K3DmGqdv+9gFjFd0UkLjTlC/jtbP2cuY6UcPiHQ== + dependencies: + "@aws-sdk/core" "3.965.0" + "@aws-sdk/types" "3.965.0" + "@smithy/fetch-http-handler" "^5.3.8" + "@smithy/node-http-handler" "^4.4.7" + "@smithy/property-provider" "^4.2.7" + "@smithy/protocol-http" "^5.3.7" + "@smithy/smithy-client" "^4.10.2" + "@smithy/types" "^4.11.0" + "@smithy/util-stream" "^4.5.8" tslib "^2.6.2" -"@aws-sdk/credential-provider-ini@3.946.0": - version "3.946.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.946.0.tgz#0fb5e76f066b5ebbbf98121af6fb9ffd01ae072c" - integrity sha512-Pdgcra3RivWj/TuZmfFaHbqsvvgnSKO0CxlRUMMr0PgBiCnUhyl+zBktdNOeGsOPH2fUzQpYhcUjYUgVSdcSDQ== - dependencies: - "@aws-sdk/core" "3.946.0" - "@aws-sdk/credential-provider-env" "3.946.0" - "@aws-sdk/credential-provider-http" "3.946.0" - "@aws-sdk/credential-provider-login" "3.946.0" - "@aws-sdk/credential-provider-process" "3.946.0" - "@aws-sdk/credential-provider-sso" "3.946.0" - "@aws-sdk/credential-provider-web-identity" "3.946.0" - "@aws-sdk/nested-clients" "3.946.0" - "@aws-sdk/types" "3.936.0" - "@smithy/credential-provider-imds" "^4.2.5" - "@smithy/property-provider" "^4.2.5" - "@smithy/shared-ini-file-loader" "^4.4.0" - "@smithy/types" "^4.9.0" +"@aws-sdk/credential-provider-ini@3.965.0": + version "3.965.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.965.0.tgz#9b55505877fb3b78ace662bf0b7094c70da60cc1" + integrity sha512-xRo72Prer5s0xYVSCxCymVIRSqrVlevK5cmU0GWq9yJtaBNpnx02jwdJg80t/Ni7pgbkQyFWRMcq38c1tc6M/w== + dependencies: + "@aws-sdk/core" "3.965.0" + "@aws-sdk/credential-provider-env" "3.965.0" + "@aws-sdk/credential-provider-http" "3.965.0" + "@aws-sdk/credential-provider-login" "3.965.0" + "@aws-sdk/credential-provider-process" "3.965.0" + "@aws-sdk/credential-provider-sso" "3.965.0" + "@aws-sdk/credential-provider-web-identity" "3.965.0" + "@aws-sdk/nested-clients" "3.965.0" + "@aws-sdk/types" "3.965.0" + "@smithy/credential-provider-imds" "^4.2.7" + "@smithy/property-provider" "^4.2.7" + "@smithy/shared-ini-file-loader" "^4.4.2" + "@smithy/types" "^4.11.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-login@3.946.0": - version "3.946.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-login/-/credential-provider-login-3.946.0.tgz#da3eb3f59d9d09ae9c2a2a07d7c4eca00b10929e" - integrity sha512-5iqLNc15u2Zx+7jOdQkIbP62N7n2031tw5hkmIG0DLnozhnk64osOh2CliiOE9x3c4P9Pf4frAwgyy9GzNTk2g== - dependencies: - "@aws-sdk/core" "3.946.0" - "@aws-sdk/nested-clients" "3.946.0" - "@aws-sdk/types" "3.936.0" - "@smithy/property-provider" "^4.2.5" - "@smithy/protocol-http" "^5.3.5" - "@smithy/shared-ini-file-loader" "^4.4.0" - "@smithy/types" "^4.9.0" +"@aws-sdk/credential-provider-login@3.965.0": + version "3.965.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-login/-/credential-provider-login-3.965.0.tgz#51d870135d53782093d7724ac554adbb3e5ea7ca" + integrity sha512-43/H8Qku8LHyugbhLo8kjD+eauhybCeVkmrnvWl8bXNHJP7xi1jCdtBQJKKJqiIHZws4MOEwkji8kFdAVRCe6g== + dependencies: + "@aws-sdk/core" "3.965.0" + "@aws-sdk/nested-clients" "3.965.0" + "@aws-sdk/types" "3.965.0" + "@smithy/property-provider" "^4.2.7" + "@smithy/protocol-http" "^5.3.7" + "@smithy/shared-ini-file-loader" "^4.4.2" + "@smithy/types" "^4.11.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-node@3.946.0": - version "3.946.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.946.0.tgz#c544df6010abf2c609ab7e44de872dc663e7db02" - integrity sha512-I7URUqnBPng1a5y81OImxrwERysZqMBREG6svhhGeZgxmqcpAZ8z5ywILeQXdEOCuuES8phUp/ojzxFjPXp/eA== - dependencies: - "@aws-sdk/credential-provider-env" "3.946.0" - "@aws-sdk/credential-provider-http" "3.946.0" - "@aws-sdk/credential-provider-ini" "3.946.0" - "@aws-sdk/credential-provider-process" "3.946.0" - "@aws-sdk/credential-provider-sso" "3.946.0" - "@aws-sdk/credential-provider-web-identity" "3.946.0" - "@aws-sdk/types" "3.936.0" - "@smithy/credential-provider-imds" "^4.2.5" - "@smithy/property-provider" "^4.2.5" - "@smithy/shared-ini-file-loader" "^4.4.0" - "@smithy/types" "^4.9.0" +"@aws-sdk/credential-provider-node@3.965.0": + version "3.965.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.965.0.tgz#147277bc7130cba720d565e729c449018e0c451f" + integrity sha512-cRxmMHF+Zh2lkkkEVduKl+8OQdtg/DhYA69+/7SPSQURlgyjFQGlRQ58B7q8abuNlrGT3sV+UzeOylZpJbV61Q== + dependencies: + "@aws-sdk/credential-provider-env" "3.965.0" + "@aws-sdk/credential-provider-http" "3.965.0" + "@aws-sdk/credential-provider-ini" "3.965.0" + "@aws-sdk/credential-provider-process" "3.965.0" + "@aws-sdk/credential-provider-sso" "3.965.0" + "@aws-sdk/credential-provider-web-identity" "3.965.0" + "@aws-sdk/types" "3.965.0" + "@smithy/credential-provider-imds" "^4.2.7" + "@smithy/property-provider" "^4.2.7" + "@smithy/shared-ini-file-loader" "^4.4.2" + "@smithy/types" "^4.11.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-process@3.946.0": - version "3.946.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.946.0.tgz#d9b1d78215a53deb1da34fc208f9a471800f202f" - integrity sha512-GtGHX7OGqIeVQ3DlVm5RRF43Qmf3S1+PLJv9svrdvAhAdy2bUb044FdXXqrtSsIfpzTKlHgQUiRo5MWLd35Ntw== +"@aws-sdk/credential-provider-process@3.965.0": + version "3.965.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.965.0.tgz#3180204c906c1fcc0d3c154d313f271f9e1d5f0d" + integrity sha512-gmkPmdiR0yxnTzLPDb7rwrDhGuCUjtgnj8qWP+m0gSz/W43rR4jRPVEf6DUX2iC+ImQhxo3NFhuB3V42Kzo3TQ== dependencies: - "@aws-sdk/core" "3.946.0" - "@aws-sdk/types" "3.936.0" - "@smithy/property-provider" "^4.2.5" - "@smithy/shared-ini-file-loader" "^4.4.0" - "@smithy/types" "^4.9.0" + "@aws-sdk/core" "3.965.0" + "@aws-sdk/types" "3.965.0" + "@smithy/property-provider" "^4.2.7" + "@smithy/shared-ini-file-loader" "^4.4.2" + "@smithy/types" "^4.11.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-sso@3.946.0": - version "3.946.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.946.0.tgz#b76c057b91b9c6779516dde03e61467fb1cd67f1" - integrity sha512-LeGSSt2V5iwYey1ENGY75RmoDP3bA2iE/py8QBKW8EDA8hn74XBLkprhrK5iccOvU3UGWY8WrEKFAFGNjJOL9g== - dependencies: - "@aws-sdk/client-sso" "3.946.0" - "@aws-sdk/core" "3.946.0" - "@aws-sdk/token-providers" "3.946.0" - "@aws-sdk/types" "3.936.0" - "@smithy/property-provider" "^4.2.5" - "@smithy/shared-ini-file-loader" "^4.4.0" - "@smithy/types" "^4.9.0" +"@aws-sdk/credential-provider-sso@3.965.0": + version "3.965.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.965.0.tgz#08b561b2690a5604b96d26e1d630d50e8c478fa8" + integrity sha512-N01AYvtCqG3Wo/s/LvYt19ity18/FqggiXT+elAs3X9Om/Wfx+hw9G+i7jaDmy+/xewmv8AdQ2SK5Q30dXw/Fw== + dependencies: + "@aws-sdk/client-sso" "3.965.0" + "@aws-sdk/core" "3.965.0" + "@aws-sdk/token-providers" "3.965.0" + "@aws-sdk/types" "3.965.0" + "@smithy/property-provider" "^4.2.7" + "@smithy/shared-ini-file-loader" "^4.4.2" + "@smithy/types" "^4.11.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-web-identity@3.946.0": - version "3.946.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.946.0.tgz#ff8a600d3fdc25ed446e1af8993f2800b2fccbe3" - integrity sha512-ocBCvjWfkbjxElBI1QUxOnHldsNhoU0uOICFvuRDAZAoxvypJHN3m5BJkqb7gqorBbcv3LRgmBdEnWXOAvq+7Q== - dependencies: - "@aws-sdk/core" "3.946.0" - "@aws-sdk/nested-clients" "3.946.0" - "@aws-sdk/types" "3.936.0" - "@smithy/property-provider" "^4.2.5" - "@smithy/shared-ini-file-loader" "^4.4.0" - "@smithy/types" "^4.9.0" +"@aws-sdk/credential-provider-web-identity@3.965.0": + version "3.965.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.965.0.tgz#ccebeae664b3fd3d7f1e9b4b41ef1886f90d6258" + integrity sha512-T4gMZ2JzXnfxe1oTD+EDGLSxFfk1+WkLZdiHXEMZp8bFI1swP/3YyDFXI+Ib9Uq1JhnAmrCXtOnkicKEhDkdhQ== + dependencies: + "@aws-sdk/core" "3.965.0" + "@aws-sdk/nested-clients" "3.965.0" + "@aws-sdk/types" "3.965.0" + "@smithy/property-provider" "^4.2.7" + "@smithy/shared-ini-file-loader" "^4.4.2" + "@smithy/types" "^4.11.0" tslib "^2.6.2" -"@aws-sdk/middleware-bucket-endpoint@3.936.0": - version "3.936.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.936.0.tgz#3c2d9935a2a388fb74f8318d620e2da38d360970" - integrity sha512-XLSVVfAorUxZh6dzF+HTOp4R1B5EQcdpGcPliWr0KUj2jukgjZEcqbBmjyMF/p9bmyQsONX80iURF1HLAlW0qg== +"@aws-sdk/middleware-bucket-endpoint@3.965.0": + version "3.965.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.965.0.tgz#4691dbc2e3d92629d3f03c0668a65ab59fb08b97" + integrity sha512-gbdv3Dl8l8xmg4oH60fXvfDyTxfx28w5/Hxdymx3vurM07tAyd4qld8zEXejnSpraTo45QcHRtk5auELIMfeag== dependencies: - "@aws-sdk/types" "3.936.0" - "@aws-sdk/util-arn-parser" "3.893.0" - "@smithy/node-config-provider" "^4.3.5" - "@smithy/protocol-http" "^5.3.5" - "@smithy/types" "^4.9.0" + "@aws-sdk/types" "3.965.0" + "@aws-sdk/util-arn-parser" "3.965.0" + "@smithy/node-config-provider" "^4.3.7" + "@smithy/protocol-http" "^5.3.7" + "@smithy/types" "^4.11.0" "@smithy/util-config-provider" "^4.2.0" tslib "^2.6.2" -"@aws-sdk/middleware-expect-continue@3.936.0": - version "3.936.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.936.0.tgz#da1ce8a8b9af61192131a1c0a54bcab2a8a0e02f" - integrity sha512-Eb4ELAC23bEQLJmUMYnPWcjD3FZIsmz2svDiXEcxRkQU9r7NRID7pM7C5NPH94wOfiCk0b2Y8rVyFXW0lGQwbA== +"@aws-sdk/middleware-expect-continue@3.965.0": + version "3.965.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.965.0.tgz#b5636e46c9c658c9ee0ed41b010b4c9c69b3ad6f" + integrity sha512-UBxVytsmhEmFwkBnt+aV0eAJ7uc+ouNokCqMBrQ7Oc5A77qhlcHfOgXIKz2SxqsiYTsDq+a0lWFM/XpyRWraqA== dependencies: - "@aws-sdk/types" "3.936.0" - "@smithy/protocol-http" "^5.3.5" - "@smithy/types" "^4.9.0" + "@aws-sdk/types" "3.965.0" + "@smithy/protocol-http" "^5.3.7" + "@smithy/types" "^4.11.0" tslib "^2.6.2" -"@aws-sdk/middleware-flexible-checksums@3.946.0": - version "3.946.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.946.0.tgz#a2b99eac1223286fffee418e2b5bc907a65718b1" - integrity sha512-HJA7RIWsnxcChyZ1hNF/3JICkYCqDonxoeG8FkrmLRBknZ8WVdJiPD420/UwrWaa5F2MuTDA92jxk77rI09h1w== +"@aws-sdk/middleware-flexible-checksums@3.965.0": + version "3.965.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.965.0.tgz#6c762eb02c152492979b4fb40ca8294cd3aaf2ad" + integrity sha512-5rzEW08trcpHMe6jkQyYc4PL1KG/H7BbnySFSzhih+r/gktQEiE36sb1BNf7av9I0Vk2Ccmt7wocB5PIT7GDkQ== dependencies: "@aws-crypto/crc32" "5.2.0" "@aws-crypto/crc32c" "5.2.0" "@aws-crypto/util" "5.2.0" - "@aws-sdk/core" "3.946.0" - "@aws-sdk/types" "3.936.0" + "@aws-sdk/core" "3.965.0" + "@aws-sdk/crc64-nvme" "3.965.0" + "@aws-sdk/types" "3.965.0" "@smithy/is-array-buffer" "^4.2.0" - "@smithy/node-config-provider" "^4.3.5" - "@smithy/protocol-http" "^5.3.5" - "@smithy/types" "^4.9.0" - "@smithy/util-middleware" "^4.2.5" - "@smithy/util-stream" "^4.5.6" + "@smithy/node-config-provider" "^4.3.7" + "@smithy/protocol-http" "^5.3.7" + "@smithy/types" "^4.11.0" + "@smithy/util-middleware" "^4.2.7" + "@smithy/util-stream" "^4.5.8" "@smithy/util-utf8" "^4.2.0" tslib "^2.6.2" -"@aws-sdk/middleware-host-header@3.936.0": - version "3.936.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.936.0.tgz#ef1144d175f1f499afbbd92ad07e24f8ccc9e9ce" - integrity sha512-tAaObaAnsP1XnLGndfkGWFuzrJYuk9W0b/nLvol66t8FZExIAf/WdkT2NNAWOYxljVs++oHnyHBCxIlaHrzSiw== +"@aws-sdk/middleware-host-header@3.965.0": + version "3.965.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.965.0.tgz#3de254300a49633c65f767248b6a68571f869e96" + integrity sha512-SfpSYqoPOAmdb3DBsnNsZ0vix+1VAtkUkzXM79JL3R5IfacpyKE2zytOgVAQx/FjhhlpSTwuXd+LRhUEVb3MaA== dependencies: - "@aws-sdk/types" "3.936.0" - "@smithy/protocol-http" "^5.3.5" - "@smithy/types" "^4.9.0" + "@aws-sdk/types" "3.965.0" + "@smithy/protocol-http" "^5.3.7" + "@smithy/types" "^4.11.0" tslib "^2.6.2" -"@aws-sdk/middleware-location-constraint@3.936.0": - version "3.936.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.936.0.tgz#1f79ba7d2506f12b806689f22d687fb05db3614e" - integrity sha512-SCMPenDtQMd9o5da9JzkHz838w3327iqXk3cbNnXWqnNRx6unyW8FL0DZ84gIY12kAyVHz5WEqlWuekc15ehfw== +"@aws-sdk/middleware-location-constraint@3.965.0": + version "3.965.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.965.0.tgz#afda3f3f68725262c13e91a578a9d0186ae01e9f" + integrity sha512-07T1rwAarQs33mVg5U28AsSdLB5JUXu9yBTBmspFGajKVsEahIyntf53j9mAXF1N2KR0bNdP0J4A0kst4t43UQ== dependencies: - "@aws-sdk/types" "3.936.0" - "@smithy/types" "^4.9.0" + "@aws-sdk/types" "3.965.0" + "@smithy/types" "^4.11.0" tslib "^2.6.2" -"@aws-sdk/middleware-logger@3.936.0": - version "3.936.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.936.0.tgz#691093bebb708b994be10f19358e8699af38a209" - integrity sha512-aPSJ12d3a3Ea5nyEnLbijCaaYJT2QjQ9iW+zGh5QcZYXmOGWbKVyPSxmVOboZQG+c1M8t6d2O7tqrwzIq8L8qw== +"@aws-sdk/middleware-logger@3.965.0": + version "3.965.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.965.0.tgz#81eb6f075df979fa071347140dfba93cb87b5c9b" + integrity sha512-gjUvJRZT1bUABKewnvkj51LAynFrfz2h5DYAg5/2F4Utx6UOGByTSr9Rq8JCLbURvvzAbCtcMkkIJRxw+8Zuzw== dependencies: - "@aws-sdk/types" "3.936.0" - "@smithy/types" "^4.9.0" + "@aws-sdk/types" "3.965.0" + "@smithy/types" "^4.11.0" tslib "^2.6.2" -"@aws-sdk/middleware-recursion-detection@3.936.0": - version "3.936.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.936.0.tgz#141b6c92c1aa42bcd71aa854e0783b4f28e87a30" - integrity sha512-l4aGbHpXM45YNgXggIux1HgsCVAvvBoqHPkqLnqMl9QVapfuSTjJHfDYDsx1Xxct6/m7qSMUzanBALhiaGO2fA== +"@aws-sdk/middleware-recursion-detection@3.965.0": + version "3.965.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.965.0.tgz#82e92b7d1200e86e1a0643a0dca942bd63c9c355" + integrity sha512-6dvD+18Ni14KCRu+tfEoNxq1sIGVp9tvoZDZ7aMvpnA7mDXuRLrOjRQ/TAZqXwr9ENKVGyxcPl0cRK8jk1YWjA== dependencies: - "@aws-sdk/types" "3.936.0" - "@aws/lambda-invoke-store" "^0.2.0" - "@smithy/protocol-http" "^5.3.5" - "@smithy/types" "^4.9.0" + "@aws-sdk/types" "3.965.0" + "@aws/lambda-invoke-store" "^0.2.2" + "@smithy/protocol-http" "^5.3.7" + "@smithy/types" "^4.11.0" tslib "^2.6.2" -"@aws-sdk/middleware-sdk-s3@3.946.0": - version "3.946.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.946.0.tgz#1157eb981519aa2d7ace5df21163d7c20b5b27df" - integrity sha512-0UTFmFd8PX2k/jLu/DBmR+mmLQWAtUGHYps9Rjx3dcXNwaMLaa/39NoV3qn7Dwzfpqc6JZlZzBk+NDOCJIHW9g== - dependencies: - "@aws-sdk/core" "3.946.0" - "@aws-sdk/types" "3.936.0" - "@aws-sdk/util-arn-parser" "3.893.0" - "@smithy/core" "^3.18.7" - "@smithy/node-config-provider" "^4.3.5" - "@smithy/protocol-http" "^5.3.5" - "@smithy/signature-v4" "^5.3.5" - "@smithy/smithy-client" "^4.9.10" - "@smithy/types" "^4.9.0" +"@aws-sdk/middleware-sdk-s3@3.965.0": + version "3.965.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.965.0.tgz#6abae7dc82f7d6e776d033d208283f69184a6ee9" + integrity sha512-dXEgnojaaVRl+OlOx35mg3rYEbfffIN4X6tLmIfDnaKz0hMaDMvsE9jJXb/vBvokbdO1sVB27/2FEM4ttLSLnw== + dependencies: + "@aws-sdk/core" "3.965.0" + "@aws-sdk/types" "3.965.0" + "@aws-sdk/util-arn-parser" "3.965.0" + "@smithy/core" "^3.20.0" + "@smithy/node-config-provider" "^4.3.7" + "@smithy/protocol-http" "^5.3.7" + "@smithy/signature-v4" "^5.3.7" + "@smithy/smithy-client" "^4.10.2" + "@smithy/types" "^4.11.0" "@smithy/util-config-provider" "^4.2.0" - "@smithy/util-middleware" "^4.2.5" - "@smithy/util-stream" "^4.5.6" + "@smithy/util-middleware" "^4.2.7" + "@smithy/util-stream" "^4.5.8" "@smithy/util-utf8" "^4.2.0" tslib "^2.6.2" -"@aws-sdk/middleware-ssec@3.936.0": - version "3.936.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.936.0.tgz#7a56e6946a86ce4f4489459e5188091116e8ddba" - integrity sha512-/GLC9lZdVp05ozRik5KsuODR/N7j+W+2TbfdFL3iS+7un+gnP6hC8RDOZd6WhpZp7drXQ9guKiTAxkZQwzS8DA== +"@aws-sdk/middleware-ssec@3.965.0": + version "3.965.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.965.0.tgz#8e290e2297f19e451c1b4af69bb118ccdcc2a695" + integrity sha512-dke++CTw26y+a2D1DdVuZ4+2TkgItdx6TeuE0zOl4lsqXGvTBUG4eaIZalt7ZOAW5ys2pbDOk1bPuh4opoD3pQ== dependencies: - "@aws-sdk/types" "3.936.0" - "@smithy/types" "^4.9.0" + "@aws-sdk/types" "3.965.0" + "@smithy/types" "^4.11.0" tslib "^2.6.2" -"@aws-sdk/middleware-user-agent@3.946.0": - version "3.946.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.946.0.tgz#520e977ff528306e5587af648d9f08fe8021afcf" - integrity sha512-7QcljCraeaWQNuqmOoAyZs8KpZcuhPiqdeeKoRd397jVGNRehLFsZbIMOvwaluUDFY11oMyXOkQEERe1Zo2fCw== - dependencies: - "@aws-sdk/core" "3.946.0" - "@aws-sdk/types" "3.936.0" - "@aws-sdk/util-endpoints" "3.936.0" - "@smithy/core" "^3.18.7" - "@smithy/protocol-http" "^5.3.5" - "@smithy/types" "^4.9.0" +"@aws-sdk/middleware-user-agent@3.965.0": + version "3.965.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.965.0.tgz#d32760303030c4049d6aa3304af3e1b008275f07" + integrity sha512-RBEYVGgu/WeAt+H/qLrGc+t8LqAUkbyvh3wBfTiuAD+uBcWsKnvnB1iSBX75FearC0fmoxzXRUc0PMxMdqpjJQ== + dependencies: + "@aws-sdk/core" "3.965.0" + "@aws-sdk/types" "3.965.0" + "@aws-sdk/util-endpoints" "3.965.0" + "@smithy/core" "^3.20.0" + "@smithy/protocol-http" "^5.3.7" + "@smithy/types" "^4.11.0" tslib "^2.6.2" -"@aws-sdk/nested-clients@3.946.0": - version "3.946.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/nested-clients/-/nested-clients-3.946.0.tgz#30c4c0da0f14450cf6512f061c141406c480501d" - integrity sha512-rjAtEguukeW8mlyEQMQI56vxFoyWlaNwowmz1p1rav948SUjtrzjHAp4TOQWhibb7AR7BUTHBCgIcyCRjBEf4g== +"@aws-sdk/nested-clients@3.965.0": + version "3.965.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/nested-clients/-/nested-clients-3.965.0.tgz#0a760bd2bb40b12d4dc9d4c34e85c1ada1c5b77d" + integrity sha512-muNVUjUEU+/KLFrLzQ8PMXyw4+a/MP6t4GIvwLtyx/kH0rpSy5s0YmqacMXheuIe6F/5QT8uksXGNAQenitkGQ== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.946.0" - "@aws-sdk/middleware-host-header" "3.936.0" - "@aws-sdk/middleware-logger" "3.936.0" - "@aws-sdk/middleware-recursion-detection" "3.936.0" - "@aws-sdk/middleware-user-agent" "3.946.0" - "@aws-sdk/region-config-resolver" "3.936.0" - "@aws-sdk/types" "3.936.0" - "@aws-sdk/util-endpoints" "3.936.0" - "@aws-sdk/util-user-agent-browser" "3.936.0" - "@aws-sdk/util-user-agent-node" "3.946.0" - "@smithy/config-resolver" "^4.4.3" - "@smithy/core" "^3.18.7" - "@smithy/fetch-http-handler" "^5.3.6" - "@smithy/hash-node" "^4.2.5" - "@smithy/invalid-dependency" "^4.2.5" - "@smithy/middleware-content-length" "^4.2.5" - "@smithy/middleware-endpoint" "^4.3.14" - "@smithy/middleware-retry" "^4.4.14" - "@smithy/middleware-serde" "^4.2.6" - "@smithy/middleware-stack" "^4.2.5" - "@smithy/node-config-provider" "^4.3.5" - "@smithy/node-http-handler" "^4.4.5" - "@smithy/protocol-http" "^5.3.5" - "@smithy/smithy-client" "^4.9.10" - "@smithy/types" "^4.9.0" - "@smithy/url-parser" "^4.2.5" + "@aws-sdk/core" "3.965.0" + "@aws-sdk/middleware-host-header" "3.965.0" + "@aws-sdk/middleware-logger" "3.965.0" + "@aws-sdk/middleware-recursion-detection" "3.965.0" + "@aws-sdk/middleware-user-agent" "3.965.0" + "@aws-sdk/region-config-resolver" "3.965.0" + "@aws-sdk/types" "3.965.0" + "@aws-sdk/util-endpoints" "3.965.0" + "@aws-sdk/util-user-agent-browser" "3.965.0" + "@aws-sdk/util-user-agent-node" "3.965.0" + "@smithy/config-resolver" "^4.4.5" + "@smithy/core" "^3.20.0" + "@smithy/fetch-http-handler" "^5.3.8" + "@smithy/hash-node" "^4.2.7" + "@smithy/invalid-dependency" "^4.2.7" + "@smithy/middleware-content-length" "^4.2.7" + "@smithy/middleware-endpoint" "^4.4.1" + "@smithy/middleware-retry" "^4.4.17" + "@smithy/middleware-serde" "^4.2.8" + "@smithy/middleware-stack" "^4.2.7" + "@smithy/node-config-provider" "^4.3.7" + "@smithy/node-http-handler" "^4.4.7" + "@smithy/protocol-http" "^5.3.7" + "@smithy/smithy-client" "^4.10.2" + "@smithy/types" "^4.11.0" + "@smithy/url-parser" "^4.2.7" "@smithy/util-base64" "^4.3.0" "@smithy/util-body-length-browser" "^4.2.0" "@smithy/util-body-length-node" "^4.2.1" - "@smithy/util-defaults-mode-browser" "^4.3.13" - "@smithy/util-defaults-mode-node" "^4.2.16" - "@smithy/util-endpoints" "^3.2.5" - "@smithy/util-middleware" "^4.2.5" - "@smithy/util-retry" "^4.2.5" + "@smithy/util-defaults-mode-browser" "^4.3.16" + "@smithy/util-defaults-mode-node" "^4.2.19" + "@smithy/util-endpoints" "^3.2.7" + "@smithy/util-middleware" "^4.2.7" + "@smithy/util-retry" "^4.2.7" "@smithy/util-utf8" "^4.2.0" tslib "^2.6.2" -"@aws-sdk/region-config-resolver@3.936.0": - version "3.936.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.936.0.tgz#b02f20c4d62973731d42da1f1239a27fbbe53c0a" - integrity sha512-wOKhzzWsshXGduxO4pqSiNyL9oUtk4BEvjWm9aaq6Hmfdoydq6v6t0rAGHWPjFwy9z2haovGRi3C8IxdMB4muw== +"@aws-sdk/region-config-resolver@3.965.0": + version "3.965.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.965.0.tgz#1fc2a0abdd17ea5ab35828c15c6e1f0240961bbe" + integrity sha512-RoMhu9ly2B0coxn8ctXosPP2WmDD0MkQlZGLjoYHQUOCBmty5qmCxOqBmBDa6wbWbB8xKtMQ/4VXloQOgzjHXg== dependencies: - "@aws-sdk/types" "3.936.0" - "@smithy/config-resolver" "^4.4.3" - "@smithy/node-config-provider" "^4.3.5" - "@smithy/types" "^4.9.0" + "@aws-sdk/types" "3.965.0" + "@smithy/config-resolver" "^4.4.5" + "@smithy/node-config-provider" "^4.3.7" + "@smithy/types" "^4.11.0" tslib "^2.6.2" "@aws-sdk/s3-request-presigner@^3.820.0": - version "3.946.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.946.0.tgz#7566de436dc5e91ace5c836a021f2fe1baf65547" - integrity sha512-NPNCGW84ZEYCKhN+XkY307eumlBq/E0vWU0iYhVVq7i5cjnA2wwLenKyYp/+0FpXvv83MC/jT9BVB5XMNu4RUw== - dependencies: - "@aws-sdk/signature-v4-multi-region" "3.946.0" - "@aws-sdk/types" "3.936.0" - "@aws-sdk/util-format-url" "3.936.0" - "@smithy/middleware-endpoint" "^4.3.14" - "@smithy/protocol-http" "^5.3.5" - "@smithy/smithy-client" "^4.9.10" - "@smithy/types" "^4.9.0" + version "3.965.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.965.0.tgz#dde35c1b8d3e706a219faec9b5f139ccc6a1bcce" + integrity sha512-aQ9vvXjeoQsAaRHS18l8doY+E/6mmNMSDMU6eJsSUDgvgGRMHhsKjiVh7DJGbZRRogdrES4KAfx6raIB4kBz5Q== + dependencies: + "@aws-sdk/signature-v4-multi-region" "3.965.0" + "@aws-sdk/types" "3.965.0" + "@aws-sdk/util-format-url" "3.965.0" + "@smithy/middleware-endpoint" "^4.4.1" + "@smithy/protocol-http" "^5.3.7" + "@smithy/smithy-client" "^4.10.2" + "@smithy/types" "^4.11.0" tslib "^2.6.2" -"@aws-sdk/signature-v4-multi-region@3.946.0": - version "3.946.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.946.0.tgz#616dc86ced2e5c36530d46a94f0c2f943053b249" - integrity sha512-61FZ685lKiJuQ06g6U7K3PL9EwKCxNm51wNlxyKV57nnl1GrLD0NC8O3/hDNkCQLNBArT9y3IXl2H7TtIxP8Jg== +"@aws-sdk/signature-v4-multi-region@3.965.0": + version "3.965.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.965.0.tgz#0a9d1f35bf895efe87660f72fb7c6454dac475d9" + integrity sha512-hgbAThbsUrWtNpFBQxzXevIfd5Qgr4TLbXY1AIbmpSX9fPVC114pdieRMpopJ0fYaJ7v5/blTiS6wzVdXleZ/w== dependencies: - "@aws-sdk/middleware-sdk-s3" "3.946.0" - "@aws-sdk/types" "3.936.0" - "@smithy/protocol-http" "^5.3.5" - "@smithy/signature-v4" "^5.3.5" - "@smithy/types" "^4.9.0" + "@aws-sdk/middleware-sdk-s3" "3.965.0" + "@aws-sdk/types" "3.965.0" + "@smithy/protocol-http" "^5.3.7" + "@smithy/signature-v4" "^5.3.7" + "@smithy/types" "^4.11.0" tslib "^2.6.2" -"@aws-sdk/token-providers@3.946.0": - version "3.946.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.946.0.tgz#4f0e1f7c6fdcab7a6b1cd9aec84fbcccee2260af" - integrity sha512-a5c+rM6CUPX2ExmUZ3DlbLlS5rQr4tbdoGcgBsjnAHiYx8MuMNAI+8M7wfjF13i2yvUQj5WEIddvLpayfEZj9g== - dependencies: - "@aws-sdk/core" "3.946.0" - "@aws-sdk/nested-clients" "3.946.0" - "@aws-sdk/types" "3.936.0" - "@smithy/property-provider" "^4.2.5" - "@smithy/shared-ini-file-loader" "^4.4.0" - "@smithy/types" "^4.9.0" +"@aws-sdk/token-providers@3.965.0": + version "3.965.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.965.0.tgz#c759e73a38004a7a1011b7f38365ead433a726a7" + integrity sha512-aR0qxg0b8flkXJVE+CM1gzo7uJ57md50z2eyCwofC0QIz5Y0P7/7vvb9/dmUQt6eT9XRN5iRcUqq2IVxVDvJOw== + dependencies: + "@aws-sdk/core" "3.965.0" + "@aws-sdk/nested-clients" "3.965.0" + "@aws-sdk/types" "3.965.0" + "@smithy/property-provider" "^4.2.7" + "@smithy/shared-ini-file-loader" "^4.4.2" + "@smithy/types" "^4.11.0" tslib "^2.6.2" -"@aws-sdk/types@3.936.0", "@aws-sdk/types@^3.222.0": - version "3.936.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.936.0.tgz#ecd3a4bec1a1bd4df834ab21fe52a76e332dc27a" - integrity sha512-uz0/VlMd2pP5MepdrHizd+T+OKfyK4r3OA9JI+L/lPKg0YFQosdJNCKisr6o70E3dh8iMpFYxF1UN/4uZsyARg== +"@aws-sdk/types@3.965.0", "@aws-sdk/types@^3.222.0": + version "3.965.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.965.0.tgz#629f4d729cfc9c60047da912d450aa0b76e3afb9" + integrity sha512-jvodoJdMavvg8faN7co58vVJRO5MVep4JFPRzUNCzpJ98BDqWDk/ad045aMJcmxkLzYLS2UAnUmqjJ/tUPNlzQ== dependencies: - "@smithy/types" "^4.9.0" + "@smithy/types" "^4.11.0" tslib "^2.6.2" -"@aws-sdk/util-arn-parser@3.893.0": - version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-arn-parser/-/util-arn-parser-3.893.0.tgz#fcc9b792744b9da597662891c2422dda83881d8d" - integrity sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA== +"@aws-sdk/util-arn-parser@3.965.0": + version "3.965.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-arn-parser/-/util-arn-parser-3.965.0.tgz#85d5fa58824bec65dd16b101caaba7101bb75909" + integrity sha512-bNGKr5Tct28jGLkL8xIkGu7swpDgBpkTVbGaofhzr/X80iclbOv656RGxhMpDvmc4S9UuQnqLRXyceNFNF2V7Q== dependencies: tslib "^2.6.2" -"@aws-sdk/util-endpoints@3.936.0": - version "3.936.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.936.0.tgz#81c00be8cfd4f966e05defd739a720ce2c888ddf" - integrity sha512-0Zx3Ntdpu+z9Wlm7JKUBOzS9EunwKAb4KdGUQQxDqh5Lc3ta5uBoub+FgmVuzwnmBu9U1Os8UuwVTH0Lgu+P5w== +"@aws-sdk/util-endpoints@3.965.0": + version "3.965.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.965.0.tgz#f5b22ae9a2de6e7506f00079edf92cf764f278f6" + integrity sha512-WqSCB0XIsGUwZWvrYkuoofi2vzoVHqyeJ2kN+WyoOsxPLTiQSBIoqm/01R/qJvoxwK/gOOF7su9i84Vw2NQQpQ== dependencies: - "@aws-sdk/types" "3.936.0" - "@smithy/types" "^4.9.0" - "@smithy/url-parser" "^4.2.5" - "@smithy/util-endpoints" "^3.2.5" + "@aws-sdk/types" "3.965.0" + "@smithy/types" "^4.11.0" + "@smithy/url-parser" "^4.2.7" + "@smithy/util-endpoints" "^3.2.7" tslib "^2.6.2" -"@aws-sdk/util-format-url@3.936.0": - version "3.936.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-format-url/-/util-format-url-3.936.0.tgz#66070d028d2db66729face62d75468bea4c25eee" - integrity sha512-MS5eSEtDUFIAMHrJaMERiHAvDPdfxc/T869ZjDNFAIiZhyc037REw0aoTNeimNXDNy2txRNZJaAUn/kE4RwN+g== +"@aws-sdk/util-format-url@3.965.0": + version "3.965.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-format-url/-/util-format-url-3.965.0.tgz#7b32137c115599cb6531ae133f7718dbdb0a5f2b" + integrity sha512-KiplV4xYGXdNCcz5eRP8WfAejT5EkE2gQxC4IY6WsuxYprzQKsnGaAzEQ+giR5GgQLIRBkPaWT0xHEYkMiCQ1Q== dependencies: - "@aws-sdk/types" "3.936.0" - "@smithy/querystring-builder" "^4.2.5" - "@smithy/types" "^4.9.0" + "@aws-sdk/types" "3.965.0" + "@smithy/querystring-builder" "^4.2.7" + "@smithy/types" "^4.11.0" tslib "^2.6.2" "@aws-sdk/util-locate-window@^3.0.0": - version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.893.0.tgz#5df15f24e1edbe12ff1fe8906f823b51cd53bae8" - integrity sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg== + version "3.965.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.965.0.tgz#0eae409c8479597ed6a19b44af72f0c9aa2a54c3" + integrity sha512-9LJFand4bIoOjOF4x3wx0UZYiFZRo4oUauxQSiEX2dVg+5qeBOJSjp2SeWykIE6+6frCZ5wvWm2fGLK8D32aJw== dependencies: tslib "^2.6.2" -"@aws-sdk/util-user-agent-browser@3.936.0": - version "3.936.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.936.0.tgz#cbfcaeaba6d843b060183638699c0f20dcaed774" - integrity sha512-eZ/XF6NxMtu+iCma58GRNRxSq4lHo6zHQLOZRIeL/ghqYJirqHdenMOwrzPettj60KWlv827RVebP9oNVrwZbw== +"@aws-sdk/util-user-agent-browser@3.965.0": + version "3.965.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.965.0.tgz#37f75ba21827566401f56274fb0f7be99a37c0da" + integrity sha512-Xiza/zMntQGpkd2dETQeAK8So1pg5+STTzpcdGWxj5q0jGO5ayjqT/q1Q7BrsX5KIr6PvRkl9/V7lLCv04wGjQ== dependencies: - "@aws-sdk/types" "3.936.0" - "@smithy/types" "^4.9.0" + "@aws-sdk/types" "3.965.0" + "@smithy/types" "^4.11.0" bowser "^2.11.0" tslib "^2.6.2" -"@aws-sdk/util-user-agent-node@3.946.0": - version "3.946.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.946.0.tgz#97504220643572b2cd05ad705cb640a85a4e5831" - integrity sha512-a2UwwvzbK5AxHKUBupfg4s7VnkqRAHjYsuezHnKCniczmT4HZfP1NnfwwvLKEH8qaTrwenxjKSfq4UWmWkvG+Q== +"@aws-sdk/util-user-agent-node@3.965.0": + version "3.965.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.965.0.tgz#67fa31e3de9a9f9f7aa449a235785eda0f82315a" + integrity sha512-kokIHUfNT3/P55E4fUJJrFHuuA9BbjFKUIxoLrd3UaRfdafT0ScRfg2eaZie6arf60EuhlUIZH0yALxttMEjxQ== dependencies: - "@aws-sdk/middleware-user-agent" "3.946.0" - "@aws-sdk/types" "3.936.0" - "@smithy/node-config-provider" "^4.3.5" - "@smithy/types" "^4.9.0" + "@aws-sdk/middleware-user-agent" "3.965.0" + "@aws-sdk/types" "3.965.0" + "@smithy/node-config-provider" "^4.3.7" + "@smithy/types" "^4.11.0" tslib "^2.6.2" -"@aws-sdk/xml-builder@3.930.0": - version "3.930.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.930.0.tgz#949a35219ca52cc769ffbfbf38f3324178ba74f9" - integrity sha512-YIfkD17GocxdmlUVc3ia52QhcWuRIUJonbF8A2CYfcWNV3HzvAqpcPeC0bYUhkK+8e8YO1ARnLKZQE0TlwzorA== +"@aws-sdk/xml-builder@3.965.0": + version "3.965.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.965.0.tgz#f4aa21591c6d365e639e54b664cc39572732951e" + integrity sha512-Tcod25/BTupraQwtb+Q+GX8bmEZfxIFjjJ/AvkhUZsZlkPeVluzq1uu3Oeqf145DCdMjzLIN6vab5MrykbDP+g== dependencies: - "@smithy/types" "^4.9.0" + "@smithy/types" "^4.11.0" fast-xml-parser "5.2.5" tslib "^2.6.2" -"@aws/lambda-invoke-store@^0.2.0": +"@aws/lambda-invoke-store@^0.2.2": version "0.2.2" resolved "https://registry.yarnpkg.com/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.2.tgz#b00f7d6aedfe832ef6c84488f3a422cce6a47efa" integrity sha512-C0NBLsIqzDIae8HFw9YIrIBsbc0xTiOtt7fAukGPnqQ/+zZNaq+4jhuccltK0QuWHBnNm/a6kLIRA6GFiM10eg== @@ -955,10 +964,10 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@borewit/text-codec@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@borewit/text-codec/-/text-codec-0.1.1.tgz#7e7f27092473d5eabcffef693a849f2cc48431da" - integrity sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA== +"@borewit/text-codec@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@borewit/text-codec/-/text-codec-0.2.1.tgz#5d171538907a8cb395fdc2eb5e8f7947d96c7f2f" + integrity sha512-k7vvKPbf7J2fZ5klGRD9AeKfUvojuZIQ3BT5u7Jfv+puwXkUBUT5PVyMDfJZpy30CBDXGMgw7fguK/lpOMBvgw== "@colors/colors@1.5.0": version "1.5.0" @@ -973,17 +982,17 @@ "@jridgewell/trace-mapping" "0.3.9" "@emnapi/core@^1.4.3": - version "1.7.1" - resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.7.1.tgz#3a79a02dbc84f45884a1806ebb98e5746bdfaac4" - integrity sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg== + version "1.8.1" + resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.8.1.tgz#fd9efe721a616288345ffee17a1f26ac5dd01349" + integrity sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg== dependencies: "@emnapi/wasi-threads" "1.1.0" tslib "^2.4.0" "@emnapi/runtime@^1.4.3": - version "1.7.1" - resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.7.1.tgz#a73784e23f5d57287369c808197288b52276b791" - integrity sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA== + version "1.8.1" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.8.1.tgz#550fa7e3c0d49c5fb175a116e8cd70614f9a22a5" + integrity sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg== dependencies: tslib "^2.4.0" @@ -994,14 +1003,14 @@ dependencies: tslib "^2.4.0" -"@eslint-community/eslint-utils@^4.7.0", "@eslint-community/eslint-utils@^4.8.0": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz#7308df158e064f0dd8b8fdb58aa14fa2a7f913b3" - integrity sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g== +"@eslint-community/eslint-utils@^4.8.0", "@eslint-community/eslint-utils@^4.9.1": + version "4.9.1" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz#4e90af67bc51ddee6cdef5284edf572ec376b595" + integrity sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ== dependencies: eslint-visitor-keys "^3.4.3" -"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.12.1": +"@eslint-community/regexpp@^4.12.1", "@eslint-community/regexpp@^4.12.2": version "4.12.2" resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz#bccdf615bcf7b6e8db830ec0b8d21c9a25de597b" integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== @@ -1051,10 +1060,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@9.39.1", "@eslint/js@^9.18.0": - version "9.39.1" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.39.1.tgz#0dd59c3a9f40e3f1882975c321470969243e0164" - integrity sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw== +"@eslint/js@9.39.2", "@eslint/js@^9.18.0": + version "9.39.2" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.39.2.tgz#2d4b8ec4c3ea13c1b3748e0c97ecd766bdd80599" + integrity sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA== "@eslint/object-schema@^2.1.7": version "2.1.7" @@ -1591,46 +1600,46 @@ integrity sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA== "@mikro-orm/cli@^6.4.12": - version "6.6.1" - resolved "https://registry.yarnpkg.com/@mikro-orm/cli/-/cli-6.6.1.tgz#899351e15b20dd30f97a79c69d8094602510c03e" - integrity sha512-cvnAfbcjZJAb0viTgcBir0glD/HnDV5DUGZdQpRGioSplHlEXrvV+Z6MGX2ebYB5xfGzxLpKJ11lf+tLo7PqkQ== + version "6.6.3" + resolved "https://registry.yarnpkg.com/@mikro-orm/cli/-/cli-6.6.3.tgz#ae22dd55a2d594aa0dab73081ba9ace7e695c6ad" + integrity sha512-uc3Fbhiknmp0zDLvTWdmrJZfeJIryXE1wAei0Qeo8WxF8P0cczuHwz6KASKmnTya8KxQ2AyUDDnjbS+zSQfHaw== dependencies: "@jercle/yargonaut" "1.1.5" - "@mikro-orm/core" "6.6.1" - "@mikro-orm/knex" "6.6.1" - fs-extra "11.3.2" + "@mikro-orm/core" "6.6.3" + "@mikro-orm/knex" "6.6.3" + fs-extra "11.3.3" tsconfig-paths "4.2.0" yargs "17.7.2" -"@mikro-orm/core@6.6.1", "@mikro-orm/core@^6.4.12": - version "6.6.1" - resolved "https://registry.yarnpkg.com/@mikro-orm/core/-/core-6.6.1.tgz#1aaba11cac6863925d2090b2a32982643a2de63e" - integrity sha512-MoxktUDHam+VuE3vSxAQ0TSfKqxh4pdH7/W0s5i6TBftrwMMTlTLBaYxfoBGm6PVXiuPtmr/yyMRpDfr06X1FQ== +"@mikro-orm/core@6.6.3", "@mikro-orm/core@^6.4.12": + version "6.6.3" + resolved "https://registry.yarnpkg.com/@mikro-orm/core/-/core-6.6.3.tgz#ff5daad1b462f1ba7861982c03f3c60819f79bf2" + integrity sha512-C+7Oa/Cu96SerosTvdhi/AbjFFJ3oJWdKKbRWf1TQj4qHW4btPNTDcJjN++AKE1ptFFJy43mmIzCzAAAxrwEoQ== dependencies: dataloader "2.2.3" dotenv "17.2.3" esprima "4.0.1" - fs-extra "11.3.2" + fs-extra "11.3.3" globby "11.1.0" - mikro-orm "6.6.1" + mikro-orm "6.6.3" reflect-metadata "0.2.2" -"@mikro-orm/knex@6.6.1": - version "6.6.1" - resolved "https://registry.yarnpkg.com/@mikro-orm/knex/-/knex-6.6.1.tgz#5a932bb7fb2fbce6916eefb438f0f7a6a893ac67" - integrity sha512-fclNi9NOCGyzqCMq5HTm1j+hzrwdDWyK8wjz2e0f/AiUYA8kqC92WzPD7bq91eJAsiGIEVXBW5tT2q0xc8cnLQ== +"@mikro-orm/knex@6.6.3": + version "6.6.3" + resolved "https://registry.yarnpkg.com/@mikro-orm/knex/-/knex-6.6.3.tgz#0b39842c52ff9e3ee2af287ee5850b297034cb50" + integrity sha512-XJ2otkg3ORIxvzv6yHqgVRJeN6kQ+C428DFt1cel7ydbhFt92OwYWUtDd121qYg4/1wEpcBCi7QoN1AHVOMoGA== dependencies: - fs-extra "11.3.2" + fs-extra "11.3.3" knex "3.1.0" sqlstring "2.3.3" "@mikro-orm/mysql@^6.4.12": - version "6.6.1" - resolved "https://registry.yarnpkg.com/@mikro-orm/mysql/-/mysql-6.6.1.tgz#bf1b498841f99c08653f5d9e86c1b1b129f5d8b0" - integrity sha512-clhMwdT2AJqwoYvYmSYlAWON2NUYZXM4zOPfM9JLGXKTVQYUx9kxTBlhAT4VCk1b0tu43p9XexcS/Re4AvQnDw== + version "6.6.3" + resolved "https://registry.yarnpkg.com/@mikro-orm/mysql/-/mysql-6.6.3.tgz#5b7c7cb16299b9845febc7a63b1e20c42a3f114d" + integrity sha512-3nzYCFSeLWSBn5SqRH4YAJ1yxihX8A9cy7apWNEkGsSX0ghHp3pBAAr5GzhY8vXnr6qw+saBODdP5cCizeU/Wg== dependencies: - "@mikro-orm/knex" "6.6.1" - mysql2 "3.15.3" + "@mikro-orm/knex" "6.6.3" + mysql2 "3.16.0" "@mikro-orm/nestjs@^6.1.1": version "6.1.1" @@ -1638,9 +1647,9 @@ integrity sha512-aluD3eTeuCvIePDk5UBanHIhu1zAJQXqWAg47MZdHJmFkNuXn62DCXbD2c4X5TCpKW/m0zjba22ilyZ/AFG9qg== "@mikro-orm/reflection@^6.4.16": - version "6.6.1" - resolved "https://registry.yarnpkg.com/@mikro-orm/reflection/-/reflection-6.6.1.tgz#a3702843da051396214103752ea0fb8af21cd7a0" - integrity sha512-orHgTQULcuDoaK8EwZG50GTHduvWMvg0ymBnu+KAaY8b6FpNKJ1W9zVQN1e3mqqO1OfSfLmqlxUCLcFW67EiKQ== + version "6.6.3" + resolved "https://registry.yarnpkg.com/@mikro-orm/reflection/-/reflection-6.6.3.tgz#487b88c44637ca6cfe41a9317df33b597cc215b2" + integrity sha512-q/JsYg5S9M6LD3oQNGAhFAWSUEkwBkwycRSx8NJIIDdUgLS4AyJb/piN2mA9YQYz5RSjitS8tDae9GCkIUnDxQ== dependencies: globby "11.1.0" ts-morph "27.0.2" @@ -1787,12 +1796,12 @@ webpack-node-externals "3.0.0" "@nestjs/common@^11.0.1": - version "11.1.9" - resolved "https://registry.yarnpkg.com/@nestjs/common/-/common-11.1.9.tgz#8b8a29931040b6c65943337b3ca9cdf42dc31282" - integrity sha512-zDntUTReRbAThIfSp3dQZ9kKqI+LjgLp5YZN5c1bgNRDuoeLySAoZg46Bg1a+uV8TMgIRziHocglKGNzr6l+bQ== + version "11.1.11" + resolved "https://registry.yarnpkg.com/@nestjs/common/-/common-11.1.11.tgz#7ab20a2c91c4c2c43794bfc92177121d0a946ce5" + integrity sha512-R/+A8XFqLgN8zNs2twhrOaE7dJbRQhdPX3g46am4RT/x8xGLqDphrXkUIno4cGUZHxbczChBAaAPTdPv73wDZA== dependencies: uid "2.0.2" - file-type "21.1.0" + file-type "21.2.0" iterare "1.2.1" load-esm "1.0.3" tslib "2.8.1" @@ -1807,9 +1816,9 @@ lodash "4.17.21" "@nestjs/core@^11.0.1": - version "11.1.9" - resolved "https://registry.yarnpkg.com/@nestjs/core/-/core-11.1.9.tgz#7a77ded789709e194c4f118e3d9bf5182136b076" - integrity sha512-a00B0BM4X+9z+t3UxJqIZlemIwCQdYoPKrMcM+ky4z3pkqqG1eTWexjs+YXpGObnLnjtMPVKWlcZHp3adDYvUw== + version "11.1.11" + resolved "https://registry.yarnpkg.com/@nestjs/core/-/core-11.1.11.tgz#9eae7e488c45a443685567c1555ae3cd739d12fe" + integrity sha512-H9i+zT3RvHi7tDc+lCmWHJ3ustXveABCr+Vcpl96dNOxgmrx4elQSTC4W93Mlav2opfLV+p0UTHY6L+bpUA4zA== dependencies: uid "2.0.2" "@nuxt/opencollective" "0.4.1" @@ -1841,13 +1850,13 @@ resolved "https://registry.yarnpkg.com/@nestjs/passport/-/passport-11.0.5.tgz#dd3e506c2fb7ddc80fd1321c01cc1a0ca6d6b609" integrity sha512-ulQX6mbjlws92PIM15Naes4F4p2JoxGnIJuUsdXQPT+Oo2sqQmENEZXM7eYuimocfHnKlcfZOuyzbA33LwUlOQ== -"@nestjs/platform-express@^11.1.9": - version "11.1.9" - resolved "https://registry.yarnpkg.com/@nestjs/platform-express/-/platform-express-11.1.9.tgz#f3a8c0e0aba6f90584812c9ec1e2025563187b50" - integrity sha512-GVd3+0lO0mJq2m1kl9hDDnVrX3Nd4oH3oDfklz0pZEVEVS0KVSp63ufHq2Lu9cyPdSBuelJr9iPm2QQ1yX+Kmw== +"@nestjs/platform-express@^11.1.11": + version "11.1.11" + resolved "https://registry.yarnpkg.com/@nestjs/platform-express/-/platform-express-11.1.11.tgz#dfb77659cbc45ef8903de5a48927a56cb7c7d1b2" + integrity sha512-kyABSskdMRIAMWL0SlbwtDy4yn59RL4HDdwHDz/fxWuv7/53YP8Y2DtV3/sHqY5Er0msMVTZrM38MjqXhYL7gw== dependencies: cors "2.8.5" - express "5.1.0" + express "5.2.1" multer "2.0.2" path-to-regexp "8.3.0" tslib "2.8.1" @@ -1864,21 +1873,21 @@ pluralize "8.0.0" "@nestjs/swagger@^11.2.3": - version "11.2.3" - resolved "https://registry.yarnpkg.com/@nestjs/swagger/-/swagger-11.2.3.tgz#979fbc87fedee0b71d9af181cafe9dbe3e4bd976" - integrity sha512-a0xFfjeqk69uHIUpP8u0ryn4cKuHdra2Ug96L858i0N200Hxho+n3j+TlQXyOF4EstLSGjTfxI1Xb2E1lUxeNg== + version "11.2.4" + resolved "https://registry.yarnpkg.com/@nestjs/swagger/-/swagger-11.2.4.tgz#78e8186c1798de295f05545cfccc045b4c59fe82" + integrity sha512-7MLqtHfD2qfhZUyg13FyX6liwigtXUL8gHXq7PaBcGo9cu8QWDDT//Fn3qzJx59+Wh+Ly/Zn+prCMpskPI5nrQ== dependencies: "@microsoft/tsdoc" "0.16.0" "@nestjs/mapped-types" "2.1.0" js-yaml "4.1.1" lodash "4.17.21" path-to-regexp "8.3.0" - swagger-ui-dist "5.30.2" + swagger-ui-dist "5.31.0" "@nestjs/testing@^11.0.1": - version "11.1.9" - resolved "https://registry.yarnpkg.com/@nestjs/testing/-/testing-11.1.9.tgz#f94fbd1042936a9f1f577a32dba76dbc4fa4ec94" - integrity sha512-UFxerBDdb0RUNxQNj25pvkvNE7/vxKhXYWBt3QuwBFnYISzRIzhVlyIqLfoV5YI3zV0m0Nn4QAn1KM0zzwfEng== + version "11.1.11" + resolved "https://registry.yarnpkg.com/@nestjs/testing/-/testing-11.1.11.tgz#eac6c6b14d7e2ab7d734b46abb47ffae216bb3a8" + integrity sha512-Po2aZKXlxuySDEh3Gi05LJ7/BtfTAPRZ3KPTrbpNrTmgGr3rFgEGYpQwN50wXYw0pywoICiFLZSZ/qXsplf6NA== dependencies: tslib "2.8.1" @@ -1943,9 +1952,9 @@ integrity sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ== "@sinclair/typebox@^0.34.0": - version "0.34.41" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.34.41.tgz#aa51a6c1946df2c5a11494a2cdb9318e026db16c" - integrity sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g== + version "0.34.47" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.34.47.tgz#61b684d8a20d2890b9f1f7b0d4f76b4b39f5bc0d" + integrity sha512-ZGIBQ+XDvO5JQku9wmwtabcVTHJsgSWAHYtVuM9pBNNR5E88v6Jcj/llpmsjivig5X8A8HHOb4/mbEKPS5EvAw== "@sindresorhus/is@^5.2.0": version "5.6.0" @@ -1966,12 +1975,12 @@ dependencies: "@sinonjs/commons" "^3.0.1" -"@smithy/abort-controller@^4.2.5": - version "4.2.5" - resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-4.2.5.tgz#3386e8fff5a8d05930996d891d06803f2b7e5e2c" - integrity sha512-j7HwVkBw68YW8UmFRcjZOmssE77Rvk0GWAIN1oFBhsaovQmZWYCIcGa9/pwRB0ExI8Sk9MWNALTjftjHZea7VA== +"@smithy/abort-controller@^4.2.7": + version "4.2.7" + resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-4.2.7.tgz#b475e8d7bb1aeee45fdc8d984c35e6ca9bb0428c" + integrity sha512-rzMY6CaKx2qxrbYbqjXWS0plqEy7LOdKHS0bg4ixJ6aoGDPNUcLWk/FRNuCILh7GKLG9TFUXYYeQQldMBBwuyw== dependencies: - "@smithy/types" "^4.9.0" + "@smithy/types" "^4.11.0" tslib "^2.6.2" "@smithy/chunked-blob-reader-native@^4.2.1": @@ -1989,136 +1998,136 @@ dependencies: tslib "^2.6.2" -"@smithy/config-resolver@^4.4.3": - version "4.4.3" - resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-4.4.3.tgz#37b0e3cba827272e92612e998a2b17e841e20bab" - integrity sha512-ezHLe1tKLUxDJo2LHtDuEDyWXolw8WGOR92qb4bQdWq/zKenO5BvctZGrVJBK08zjezSk7bmbKFOXIVyChvDLw== +"@smithy/config-resolver@^4.4.5": + version "4.4.5" + resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-4.4.5.tgz#35e792b6db00887bdd029df9b41780ca005d064b" + integrity sha512-HAGoUAFYsUkoSckuKbCPayECeMim8pOu+yLy1zOxt1sifzEbrsRpYa+mKcMdiHKMeiqOibyPG0sFJnmaV/OGEg== dependencies: - "@smithy/node-config-provider" "^4.3.5" - "@smithy/types" "^4.9.0" + "@smithy/node-config-provider" "^4.3.7" + "@smithy/types" "^4.11.0" "@smithy/util-config-provider" "^4.2.0" - "@smithy/util-endpoints" "^3.2.5" - "@smithy/util-middleware" "^4.2.5" + "@smithy/util-endpoints" "^3.2.7" + "@smithy/util-middleware" "^4.2.7" tslib "^2.6.2" -"@smithy/core@^3.18.7": - version "3.18.7" - resolved "https://registry.yarnpkg.com/@smithy/core/-/core-3.18.7.tgz#88c67b9474eadf51a632e2956c8756d36c7072c8" - integrity sha512-axG9MvKhMWOhFbvf5y2DuyTxQueO0dkedY9QC3mAfndLosRI/9LJv8WaL0mw7ubNhsO4IuXX9/9dYGPFvHrqlw== +"@smithy/core@^3.20.0", "@smithy/core@^3.20.1": + version "3.20.1" + resolved "https://registry.yarnpkg.com/@smithy/core/-/core-3.20.1.tgz#9a1e2dc77367b91d356ad26967074783467e6909" + integrity sha512-wOboSEdQ85dbKAJ0zL+wQ6b0HTSBRhtGa0PYKysQXkRg+vK0tdCRRVruiFM2QMprkOQwSYOnwF4og96PAaEGag== dependencies: - "@smithy/middleware-serde" "^4.2.6" - "@smithy/protocol-http" "^5.3.5" - "@smithy/types" "^4.9.0" + "@smithy/middleware-serde" "^4.2.8" + "@smithy/protocol-http" "^5.3.7" + "@smithy/types" "^4.11.0" "@smithy/util-base64" "^4.3.0" "@smithy/util-body-length-browser" "^4.2.0" - "@smithy/util-middleware" "^4.2.5" - "@smithy/util-stream" "^4.5.6" + "@smithy/util-middleware" "^4.2.7" + "@smithy/util-stream" "^4.5.8" "@smithy/util-utf8" "^4.2.0" "@smithy/uuid" "^1.1.0" tslib "^2.6.2" -"@smithy/credential-provider-imds@^4.2.5": - version "4.2.5" - resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.5.tgz#5acbcd1d02ae31700c2f027090c202d7315d70d3" - integrity sha512-BZwotjoZWn9+36nimwm/OLIcVe+KYRwzMjfhd4QT7QxPm9WY0HiOV8t/Wlh+HVUif0SBVV7ksq8//hPaBC/okQ== +"@smithy/credential-provider-imds@^4.2.7": + version "4.2.7" + resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.7.tgz#bfbbf797599c3944509ef4c9690a5c960e153ef5" + integrity sha512-CmduWdCiILCRNbQWFR0OcZlUPVtyE49Sr8yYL0rZQ4D/wKxiNzBNS/YHemvnbkIWj623fplgkexUd/c9CAKdoA== dependencies: - "@smithy/node-config-provider" "^4.3.5" - "@smithy/property-provider" "^4.2.5" - "@smithy/types" "^4.9.0" - "@smithy/url-parser" "^4.2.5" + "@smithy/node-config-provider" "^4.3.7" + "@smithy/property-provider" "^4.2.7" + "@smithy/types" "^4.11.0" + "@smithy/url-parser" "^4.2.7" tslib "^2.6.2" -"@smithy/eventstream-codec@^4.2.5": - version "4.2.5" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-codec/-/eventstream-codec-4.2.5.tgz#331b3f23528137cb5f4ad861de7f34ddff68c62b" - integrity sha512-Ogt4Zi9hEbIP17oQMd68qYOHUzmH47UkK7q7Gl55iIm9oKt27MUGrC5JfpMroeHjdkOliOA4Qt3NQ1xMq/nrlA== +"@smithy/eventstream-codec@^4.2.7": + version "4.2.7" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-codec/-/eventstream-codec-4.2.7.tgz#8f8bba50fb1871d98e0cda28b0842ade6ee72021" + integrity sha512-DrpkEoM3j9cBBWhufqBwnbbn+3nf1N9FP6xuVJ+e220jbactKuQgaZwjwP5CP1t+O94brm2JgVMD2atMGX3xIQ== dependencies: "@aws-crypto/crc32" "5.2.0" - "@smithy/types" "^4.9.0" + "@smithy/types" "^4.11.0" "@smithy/util-hex-encoding" "^4.2.0" tslib "^2.6.2" -"@smithy/eventstream-serde-browser@^4.2.5": - version "4.2.5" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.5.tgz#54a680006539601ce71306d8bf2946e3462a47b3" - integrity sha512-HohfmCQZjppVnKX2PnXlf47CW3j92Ki6T/vkAT2DhBR47e89pen3s4fIa7otGTtrVxmj7q+IhH0RnC5kpR8wtw== +"@smithy/eventstream-serde-browser@^4.2.7": + version "4.2.7" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.7.tgz#9270fff07c53c51b2d1cff9ce6227f2a01f8424d" + integrity sha512-ujzPk8seYoDBmABDE5YqlhQZAXLOrtxtJLrbhHMKjBoG5b4dK4i6/mEU+6/7yXIAkqOO8sJ6YxZl+h0QQ1IJ7g== dependencies: - "@smithy/eventstream-serde-universal" "^4.2.5" - "@smithy/types" "^4.9.0" + "@smithy/eventstream-serde-universal" "^4.2.7" + "@smithy/types" "^4.11.0" tslib "^2.6.2" -"@smithy/eventstream-serde-config-resolver@^4.3.5": - version "4.3.5" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.5.tgz#d1490aa127f43ac242495fa6e2e5833e1949a481" - integrity sha512-ibjQjM7wEXtECiT6my1xfiMH9IcEczMOS6xiCQXoUIYSj5b1CpBbJ3VYbdwDy8Vcg5JHN7eFpOCGk8nyZAltNQ== +"@smithy/eventstream-serde-config-resolver@^4.3.7": + version "4.3.7" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.7.tgz#a57b74a230767171a232eca4bbf6283c3107bb9c" + integrity sha512-x7BtAiIPSaNaWuzm24Q/mtSkv+BrISO/fmheiJ39PKRNH3RmH2Hph/bUKSOBOBC9unqfIYDhKTHwpyZycLGPVQ== dependencies: - "@smithy/types" "^4.9.0" + "@smithy/types" "^4.11.0" tslib "^2.6.2" -"@smithy/eventstream-serde-node@^4.2.5": - version "4.2.5" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.5.tgz#7dd64e0ba64fa930959f3d5b7995c310573ecaf3" - integrity sha512-+elOuaYx6F2H6x1/5BQP5ugv12nfJl66GhxON8+dWVUEDJ9jah/A0tayVdkLRP0AeSac0inYkDz5qBFKfVp2Gg== +"@smithy/eventstream-serde-node@^4.2.7": + version "4.2.7" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.7.tgz#4b0a306ef81bf1854c437322443e22f69845e7c7" + integrity sha512-roySCtHC5+pQq5lK4be1fZ/WR6s/AxnPaLfCODIPArtN2du8s5Ot4mKVK3pPtijL/L654ws592JHJ1PbZFF6+A== dependencies: - "@smithy/eventstream-serde-universal" "^4.2.5" - "@smithy/types" "^4.9.0" + "@smithy/eventstream-serde-universal" "^4.2.7" + "@smithy/types" "^4.11.0" tslib "^2.6.2" -"@smithy/eventstream-serde-universal@^4.2.5": - version "4.2.5" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.5.tgz#34189de45cf5e1d9cb59978e94b76cc210fa984f" - integrity sha512-G9WSqbST45bmIFaeNuP/EnC19Rhp54CcVdX9PDL1zyEB514WsDVXhlyihKlGXnRycmHNmVv88Bvvt4EYxWef/Q== +"@smithy/eventstream-serde-universal@^4.2.7": + version "4.2.7" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.7.tgz#11ec67a86c8297d153ce3bc9505715ed80058c34" + integrity sha512-QVD+g3+icFkThoy4r8wVFZMsIP08taHVKjE6Jpmz8h5CgX/kk6pTODq5cht0OMtcapUx+xrPzUTQdA+TmO0m1g== dependencies: - "@smithy/eventstream-codec" "^4.2.5" - "@smithy/types" "^4.9.0" + "@smithy/eventstream-codec" "^4.2.7" + "@smithy/types" "^4.11.0" tslib "^2.6.2" -"@smithy/fetch-http-handler@^5.3.6": - version "5.3.6" - resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.6.tgz#d9dcb8d8ca152918224492f4d1cc1b50df93ae13" - integrity sha512-3+RG3EA6BBJ/ofZUeTFJA7mHfSYrZtQIrDP9dI8Lf7X6Jbos2jptuLrAAteDiFVrmbEmLSuRG/bUKzfAXk7dhg== +"@smithy/fetch-http-handler@^5.3.8": + version "5.3.8" + resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.8.tgz#092a1b6dfdf5981853c7b0d98ebf048cc5e56c2b" + integrity sha512-h/Fi+o7mti4n8wx1SR6UHWLaakwHRx29sizvp8OOm7iqwKGFneT06GCSFhml6Bha5BT6ot5pj3CYZnCHhGC2Rg== dependencies: - "@smithy/protocol-http" "^5.3.5" - "@smithy/querystring-builder" "^4.2.5" - "@smithy/types" "^4.9.0" + "@smithy/protocol-http" "^5.3.7" + "@smithy/querystring-builder" "^4.2.7" + "@smithy/types" "^4.11.0" "@smithy/util-base64" "^4.3.0" tslib "^2.6.2" -"@smithy/hash-blob-browser@^4.2.6": - version "4.2.6" - resolved "https://registry.yarnpkg.com/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.6.tgz#53d5ae0a069ae4a93abbc7165efe341dca0f9489" - integrity sha512-8P//tA8DVPk+3XURk2rwcKgYwFvwGwmJH/wJqQiSKwXZtf/LiZK+hbUZmPj/9KzM+OVSwe4o85KTp5x9DUZTjw== +"@smithy/hash-blob-browser@^4.2.8": + version "4.2.8" + resolved "https://registry.yarnpkg.com/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.8.tgz#9748338e2d0e0bceecbee64739d71591c61924ff" + integrity sha512-07InZontqsM1ggTCPSRgI7d8DirqRrnpL7nIACT4PW0AWrgDiHhjGZzbAE5UtRSiU0NISGUYe7/rri9ZeWyDpw== dependencies: "@smithy/chunked-blob-reader" "^5.2.0" "@smithy/chunked-blob-reader-native" "^4.2.1" - "@smithy/types" "^4.9.0" + "@smithy/types" "^4.11.0" tslib "^2.6.2" -"@smithy/hash-node@^4.2.5": - version "4.2.5" - resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-4.2.5.tgz#fb751ec4a4c6347612458430f201f878adc787f6" - integrity sha512-DpYX914YOfA3UDT9CN1BM787PcHfWRBB43fFGCYrZFUH0Jv+5t8yYl+Pd5PW4+QzoGEDvn5d5QIO4j2HyYZQSA== +"@smithy/hash-node@^4.2.7": + version "4.2.7" + resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-4.2.7.tgz#74a3d3ed8d47ecbe68d19e79af1d23f5abbb7253" + integrity sha512-PU/JWLTBCV1c8FtB8tEFnY4eV1tSfBc7bDBADHfn1K+uRbPgSJ9jnJp0hyjiFN2PMdPzxsf1Fdu0eo9fJ760Xw== dependencies: - "@smithy/types" "^4.9.0" + "@smithy/types" "^4.11.0" "@smithy/util-buffer-from" "^4.2.0" "@smithy/util-utf8" "^4.2.0" tslib "^2.6.2" -"@smithy/hash-stream-node@^4.2.5": - version "4.2.5" - resolved "https://registry.yarnpkg.com/@smithy/hash-stream-node/-/hash-stream-node-4.2.5.tgz#f200e6b755cb28f03968c199231774c3ad33db28" - integrity sha512-6+do24VnEyvWcGdHXomlpd0m8bfZePpUKBy7m311n+JuRwug8J4dCanJdTymx//8mi0nlkflZBvJe+dEO/O12Q== +"@smithy/hash-stream-node@^4.2.7": + version "4.2.7" + resolved "https://registry.yarnpkg.com/@smithy/hash-stream-node/-/hash-stream-node-4.2.7.tgz#4a0122edd3ea6a63866823d476af5afd1bd541e2" + integrity sha512-ZQVoAwNYnFMIbd4DUc517HuwNelJUY6YOzwqrbcAgCnVn+79/OK7UjwA93SPpdTOpKDVkLIzavWm/Ck7SmnDPQ== dependencies: - "@smithy/types" "^4.9.0" + "@smithy/types" "^4.11.0" "@smithy/util-utf8" "^4.2.0" tslib "^2.6.2" -"@smithy/invalid-dependency@^4.2.5": - version "4.2.5" - resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-4.2.5.tgz#58d997e91e7683ffc59882d8fcb180ed9aa9c7dd" - integrity sha512-2L2erASEro1WC5nV+plwIMxrTXpvpfzl4e+Nre6vBVRR2HKeGGcvpJyyL3/PpiSg+cJG2KpTmZmq934Olb6e5A== +"@smithy/invalid-dependency@^4.2.7": + version "4.2.7" + resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-4.2.7.tgz#0afcc586db3032f94f3c1ea1054665b16f793b16" + integrity sha512-ncvgCr9a15nPlkhIUx3CU4d7E7WEuVJOV7fS7nnK2hLtPK9tYRBkMHQbhXU1VvvKeBm/O0x26OEoBq+ngFpOEQ== dependencies: - "@smithy/types" "^4.9.0" + "@smithy/types" "^4.11.0" tslib "^2.6.2" "@smithy/is-array-buffer@^2.2.0": @@ -2135,180 +2144,180 @@ dependencies: tslib "^2.6.2" -"@smithy/md5-js@^4.2.5": - version "4.2.5" - resolved "https://registry.yarnpkg.com/@smithy/md5-js/-/md5-js-4.2.5.tgz#ca16f138dd0c4e91a61d3df57e8d4d15d1ddc97e" - integrity sha512-Bt6jpSTMWfjCtC0s79gZ/WZ1w90grfmopVOWqkI2ovhjpD5Q2XRXuecIPB9689L2+cCySMbaXDhBPU56FKNDNg== +"@smithy/md5-js@^4.2.7": + version "4.2.7" + resolved "https://registry.yarnpkg.com/@smithy/md5-js/-/md5-js-4.2.7.tgz#6d13a753a505532fbf78a083adc1bef532bb7e34" + integrity sha512-Wv6JcUxtOLTnxvNjDnAiATUsk8gvA6EeS8zzHig07dotpByYsLot+m0AaQEniUBjx97AC41MQR4hW0baraD1Xw== dependencies: - "@smithy/types" "^4.9.0" + "@smithy/types" "^4.11.0" "@smithy/util-utf8" "^4.2.0" tslib "^2.6.2" -"@smithy/middleware-content-length@^4.2.5": - version "4.2.5" - resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-4.2.5.tgz#a6942ce2d7513b46f863348c6c6a8177e9ace752" - integrity sha512-Y/RabVa5vbl5FuHYV2vUCwvh/dqzrEY/K2yWPSqvhFUwIY0atLqO4TienjBXakoy4zrKAMCZwg+YEqmH7jaN7A== +"@smithy/middleware-content-length@^4.2.7": + version "4.2.7" + resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-4.2.7.tgz#d9968dc1a6ac3aea9f05a92a900f231e72ba3fbc" + integrity sha512-GszfBfCcvt7kIbJ41LuNa5f0wvQCHhnGx/aDaZJCCT05Ld6x6U2s0xsc/0mBFONBZjQJp2U/0uSJ178OXOwbhg== dependencies: - "@smithy/protocol-http" "^5.3.5" - "@smithy/types" "^4.9.0" + "@smithy/protocol-http" "^5.3.7" + "@smithy/types" "^4.11.0" tslib "^2.6.2" -"@smithy/middleware-endpoint@^4.3.14": - version "4.3.14" - resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-4.3.14.tgz#da145b02f6a5d073595111bf73fa31da16e73773" - integrity sha512-v0q4uTKgBM8dsqGjqsabZQyH85nFaTnFcgpWU1uydKFsdyyMzfvOkNum9G7VK+dOP01vUnoZxIeRiJ6uD0kjIg== - dependencies: - "@smithy/core" "^3.18.7" - "@smithy/middleware-serde" "^4.2.6" - "@smithy/node-config-provider" "^4.3.5" - "@smithy/shared-ini-file-loader" "^4.4.0" - "@smithy/types" "^4.9.0" - "@smithy/url-parser" "^4.2.5" - "@smithy/util-middleware" "^4.2.5" +"@smithy/middleware-endpoint@^4.4.1", "@smithy/middleware-endpoint@^4.4.2": + version "4.4.2" + resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.2.tgz#4b33728b015e6f1e38b5d0e87ea2b46e017f7a17" + integrity sha512-mqpAdux0BNmZu/SqkFhQEnod4fX23xxTvU2LUpmKp0JpSI+kPYCiHJMmzREr8yxbNxKL2/DU1UZm9i++ayU+2g== + dependencies: + "@smithy/core" "^3.20.1" + "@smithy/middleware-serde" "^4.2.8" + "@smithy/node-config-provider" "^4.3.7" + "@smithy/shared-ini-file-loader" "^4.4.2" + "@smithy/types" "^4.11.0" + "@smithy/url-parser" "^4.2.7" + "@smithy/util-middleware" "^4.2.7" tslib "^2.6.2" -"@smithy/middleware-retry@^4.4.14": - version "4.4.14" - resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-4.4.14.tgz#92e503946314278614f608537d77a04db6d7b810" - integrity sha512-Z2DG8Ej7FyWG1UA+7HceINtSLzswUgs2np3sZX0YBBxCt+CXG4QUxv88ZDS3+2/1ldW7LqtSY1UO/6VQ1pND8Q== - dependencies: - "@smithy/node-config-provider" "^4.3.5" - "@smithy/protocol-http" "^5.3.5" - "@smithy/service-error-classification" "^4.2.5" - "@smithy/smithy-client" "^4.9.10" - "@smithy/types" "^4.9.0" - "@smithy/util-middleware" "^4.2.5" - "@smithy/util-retry" "^4.2.5" +"@smithy/middleware-retry@^4.4.17": + version "4.4.18" + resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-4.4.18.tgz#26604c9ff6927f3d3070f1c7e81e9245cf0248ca" + integrity sha512-E5hulijA59nBk/zvcwVMaS7FG7Y4l6hWA9vrW018r+8kiZef4/ETQaPI4oY+3zsy9f6KqDv3c4VKtO4DwwgpCg== + dependencies: + "@smithy/node-config-provider" "^4.3.7" + "@smithy/protocol-http" "^5.3.7" + "@smithy/service-error-classification" "^4.2.7" + "@smithy/smithy-client" "^4.10.3" + "@smithy/types" "^4.11.0" + "@smithy/util-middleware" "^4.2.7" + "@smithy/util-retry" "^4.2.7" "@smithy/uuid" "^1.1.0" tslib "^2.6.2" -"@smithy/middleware-serde@^4.2.6": - version "4.2.6" - resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-4.2.6.tgz#7e710f43206e13a8c081a372b276e7b2c51bff5b" - integrity sha512-VkLoE/z7e2g8pirwisLz8XJWedUSY8my/qrp81VmAdyrhi94T+riBfwP+AOEEFR9rFTSonC/5D2eWNmFabHyGQ== +"@smithy/middleware-serde@^4.2.8": + version "4.2.8" + resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-4.2.8.tgz#57f1baa98899fd96f4737465b3a363acf1963e0a" + integrity sha512-8rDGYen5m5+NV9eHv9ry0sqm2gI6W7mc1VSFMtn6Igo25S507/HaOX9LTHAS2/J32VXD0xSzrY0H5FJtOMS4/w== dependencies: - "@smithy/protocol-http" "^5.3.5" - "@smithy/types" "^4.9.0" + "@smithy/protocol-http" "^5.3.7" + "@smithy/types" "^4.11.0" tslib "^2.6.2" -"@smithy/middleware-stack@^4.2.5": - version "4.2.5" - resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-4.2.5.tgz#2d13415ed3561c882594c8e6340b801d9a2eb222" - integrity sha512-bYrutc+neOyWxtZdbB2USbQttZN0mXaOyYLIsaTbJhFsfpXyGWUxJpEuO1rJ8IIJm2qH4+xJT0mxUSsEDTYwdQ== +"@smithy/middleware-stack@^4.2.7": + version "4.2.7" + resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-4.2.7.tgz#39d7bdf3a403b3d1f82caad71be66bfe7d88a790" + integrity sha512-bsOT0rJ+HHlZd9crHoS37mt8qRRN/h9jRve1SXUhVbkRzu0QaNYZp1i1jha4n098tsvROjcwfLlfvcFuJSXEsw== dependencies: - "@smithy/types" "^4.9.0" + "@smithy/types" "^4.11.0" tslib "^2.6.2" -"@smithy/node-config-provider@^4.3.5": - version "4.3.5" - resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-4.3.5.tgz#c09137a79c2930dcc30e6c8bb4f2608d72c1e2c9" - integrity sha512-UTurh1C4qkVCtqggI36DGbLB2Kv8UlcFdMXDcWMbqVY2uRg0XmT9Pb4Vj6oSQ34eizO1fvR0RnFV4Axw4IrrAg== +"@smithy/node-config-provider@^4.3.7": + version "4.3.7" + resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-4.3.7.tgz#c023fa857b008c314f621fb5b124724c157b2fd3" + integrity sha512-7r58wq8sdOcrwWe+klL9y3bc4GW1gnlfnFOuL7CXa7UzfhzhxKuzNdtqgzmTV+53lEp9NXh5hY/S4UgjLOzPfw== dependencies: - "@smithy/property-provider" "^4.2.5" - "@smithy/shared-ini-file-loader" "^4.4.0" - "@smithy/types" "^4.9.0" + "@smithy/property-provider" "^4.2.7" + "@smithy/shared-ini-file-loader" "^4.4.2" + "@smithy/types" "^4.11.0" tslib "^2.6.2" -"@smithy/node-http-handler@^4.4.5": - version "4.4.5" - resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-4.4.5.tgz#2aea598fdf3dc4e32667d673d48abd4a073665f4" - integrity sha512-CMnzM9R2WqlqXQGtIlsHMEZfXKJVTIrqCNoSd/QpAyp+Dw0a1Vps13l6ma1fH8g7zSPNsA59B/kWgeylFuA/lw== +"@smithy/node-http-handler@^4.4.7": + version "4.4.7" + resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-4.4.7.tgz#ebdb6c10e8d203af22429987ed795b105e4e848f" + integrity sha512-NELpdmBOO6EpZtWgQiHjoShs1kmweaiNuETUpuup+cmm/xJYjT4eUjfhrXRP4jCOaAsS3c3yPsP3B+K+/fyPCQ== dependencies: - "@smithy/abort-controller" "^4.2.5" - "@smithy/protocol-http" "^5.3.5" - "@smithy/querystring-builder" "^4.2.5" - "@smithy/types" "^4.9.0" + "@smithy/abort-controller" "^4.2.7" + "@smithy/protocol-http" "^5.3.7" + "@smithy/querystring-builder" "^4.2.7" + "@smithy/types" "^4.11.0" tslib "^2.6.2" -"@smithy/property-provider@^4.2.5": - version "4.2.5" - resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-4.2.5.tgz#f75dc5735d29ca684abbc77504be9246340a43f0" - integrity sha512-8iLN1XSE1rl4MuxvQ+5OSk/Zb5El7NJZ1td6Tn+8dQQHIjp59Lwl6bd0+nzw6SKm2wSSriH2v/I9LPzUic7EOg== +"@smithy/property-provider@^4.2.7": + version "4.2.7" + resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-4.2.7.tgz#cd0044e13495cf4064b3a6ed3299e5f549ba7513" + integrity sha512-jmNYKe9MGGPoSl/D7JDDs1C8b3dC8f/w78LbaVfoTtWy4xAd5dfjaFG9c9PWPihY4ggMQNQSMtzU77CNgAJwmA== dependencies: - "@smithy/types" "^4.9.0" + "@smithy/types" "^4.11.0" tslib "^2.6.2" -"@smithy/protocol-http@^5.3.5": - version "5.3.5" - resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-5.3.5.tgz#a8f4296dd6d190752589e39ee95298d5c65a60db" - integrity sha512-RlaL+sA0LNMp03bf7XPbFmT5gN+w3besXSWMkA8rcmxLSVfiEXElQi4O2IWwPfxzcHkxqrwBFMbngB8yx/RvaQ== +"@smithy/protocol-http@^5.3.7": + version "5.3.7" + resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-5.3.7.tgz#2a58a1dfdb7cc90a8c79f081b5b6cf96d888891a" + integrity sha512-1r07pb994I20dD/c2seaZhoCuNYm0rWrvBxhCQ70brNh11M5Ml2ew6qJVo0lclB3jMIXirD4s2XRXRe7QEi0xA== dependencies: - "@smithy/types" "^4.9.0" + "@smithy/types" "^4.11.0" tslib "^2.6.2" -"@smithy/querystring-builder@^4.2.5": - version "4.2.5" - resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-4.2.5.tgz#00cafa5a4055600ab8058e26db42f580146b91f3" - integrity sha512-y98otMI1saoajeik2kLfGyRp11e5U/iJYH/wLCh3aTV/XutbGT9nziKGkgCaMD1ghK7p6htHMm6b6scl9JRUWg== +"@smithy/querystring-builder@^4.2.7": + version "4.2.7" + resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-4.2.7.tgz#92ada986c6026a56b26e36c64bcea6ece68d0ecb" + integrity sha512-eKONSywHZxK4tBxe2lXEysh8wbBdvDWiA+RIuaxZSgCMmA0zMgoDpGLJhnyj+c0leOQprVnXOmcB4m+W9Rw7sg== dependencies: - "@smithy/types" "^4.9.0" + "@smithy/types" "^4.11.0" "@smithy/util-uri-escape" "^4.2.0" tslib "^2.6.2" -"@smithy/querystring-parser@^4.2.5": - version "4.2.5" - resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-4.2.5.tgz#61d2e77c62f44196590fa0927dbacfbeaffe8c53" - integrity sha512-031WCTdPYgiQRYNPXznHXof2YM0GwL6SeaSyTH/P72M1Vz73TvCNH2Nq8Iu2IEPq9QP2yx0/nrw5YmSeAi/AjQ== +"@smithy/querystring-parser@^4.2.7": + version "4.2.7" + resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-4.2.7.tgz#4c645b8164d7c17270b60fc2e0f5098ae3bf0fad" + integrity sha512-3X5ZvzUHmlSTHAXFlswrS6EGt8fMSIxX/c3Rm1Pni3+wYWB6cjGocmRIoqcQF9nU5OgGmL0u7l9m44tSUpfj9w== dependencies: - "@smithy/types" "^4.9.0" + "@smithy/types" "^4.11.0" tslib "^2.6.2" -"@smithy/service-error-classification@^4.2.5": - version "4.2.5" - resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-4.2.5.tgz#a64eb78e096e59cc71141e3fea2b4194ce59b4fd" - integrity sha512-8fEvK+WPE3wUAcDvqDQG1Vk3ANLR8Px979te96m84CbKAjBVf25rPYSzb4xU4hlTyho7VhOGnh5i62D/JVF0JQ== +"@smithy/service-error-classification@^4.2.7": + version "4.2.7" + resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-4.2.7.tgz#bcad2f16874187135d24ab588a3bb4424b073d89" + integrity sha512-YB7oCbukqEb2Dlh3340/8g8vNGbs/QsNNRms+gv3N2AtZz9/1vSBx6/6tpwQpZMEJFs7Uq8h4mmOn48ZZ72MkA== dependencies: - "@smithy/types" "^4.9.0" + "@smithy/types" "^4.11.0" -"@smithy/shared-ini-file-loader@^4.4.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.0.tgz#a2f8282f49982f00bafb1fa8cb7fc188a202a594" - integrity sha512-5WmZ5+kJgJDjwXXIzr1vDTG+RhF9wzSODQBfkrQ2VVkYALKGvZX1lgVSxEkgicSAFnFhPj5rudJV0zoinqS0bA== +"@smithy/shared-ini-file-loader@^4.4.2": + version "4.4.2" + resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.2.tgz#8fa1b459de485b11185fe8c64182e3205a280ba9" + integrity sha512-M7iUUff/KwfNunmrgtqBfvZSzh3bmFgv/j/t1Y1dQ+8dNo34br1cqVEqy6v0mYEgi0DkGO7Xig0AnuOaEGVlcg== dependencies: - "@smithy/types" "^4.9.0" + "@smithy/types" "^4.11.0" tslib "^2.6.2" -"@smithy/signature-v4@^5.3.5": - version "5.3.5" - resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-5.3.5.tgz#13ab710653f9f16c325ee7e0a102a44f73f2643f" - integrity sha512-xSUfMu1FT7ccfSXkoLl/QRQBi2rOvi3tiBZU2Tdy3I6cgvZ6SEi9QNey+lqps/sJRnogIS+lq+B1gxxbra2a/w== +"@smithy/signature-v4@^5.3.7": + version "5.3.7" + resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-5.3.7.tgz#20fe4e8e9abea413b1bdbf8560e74ad7cdee65cf" + integrity sha512-9oNUlqBlFZFOSdxgImA6X5GFuzE7V2H7VG/7E70cdLhidFbdtvxxt81EHgykGK5vq5D3FafH//X+Oy31j3CKOg== dependencies: "@smithy/is-array-buffer" "^4.2.0" - "@smithy/protocol-http" "^5.3.5" - "@smithy/types" "^4.9.0" + "@smithy/protocol-http" "^5.3.7" + "@smithy/types" "^4.11.0" "@smithy/util-hex-encoding" "^4.2.0" - "@smithy/util-middleware" "^4.2.5" + "@smithy/util-middleware" "^4.2.7" "@smithy/util-uri-escape" "^4.2.0" "@smithy/util-utf8" "^4.2.0" tslib "^2.6.2" -"@smithy/smithy-client@^4.9.10": - version "4.9.10" - resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-4.9.10.tgz#a395bbc6ccf35cdbae44ce024909b6c5aec06283" - integrity sha512-Jaoz4Jw1QYHc1EFww/E6gVtNjhoDU+gwRKqXP6C3LKYqqH2UQhP8tMP3+t/ePrhaze7fhLE8vS2q6vVxBANFTQ== - dependencies: - "@smithy/core" "^3.18.7" - "@smithy/middleware-endpoint" "^4.3.14" - "@smithy/middleware-stack" "^4.2.5" - "@smithy/protocol-http" "^5.3.5" - "@smithy/types" "^4.9.0" - "@smithy/util-stream" "^4.5.6" +"@smithy/smithy-client@^4.10.2", "@smithy/smithy-client@^4.10.3": + version "4.10.3" + resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-4.10.3.tgz#d49ce7597d90daf062295b3607d06be86c428708" + integrity sha512-EfECiO/0fAfb590LBnUe7rI5ux7XfquQ8LBzTe7gxw0j9QW/q8UT/EHWHlxV/+jhQ3+Ssga9uUYXCQgImGMbNg== + dependencies: + "@smithy/core" "^3.20.1" + "@smithy/middleware-endpoint" "^4.4.2" + "@smithy/middleware-stack" "^4.2.7" + "@smithy/protocol-http" "^5.3.7" + "@smithy/types" "^4.11.0" + "@smithy/util-stream" "^4.5.8" tslib "^2.6.2" -"@smithy/types@^4.9.0": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@smithy/types/-/types-4.9.0.tgz#c6636ddfa142e1ddcb6e4cf5f3e1a628d420486f" - integrity sha512-MvUbdnXDTwykR8cB1WZvNNwqoWVaTRA0RLlLmf/cIFNMM2cKWz01X4Ly6SMC4Kks30r8tT3Cty0jmeWfiuyHTA== +"@smithy/types@^4.11.0": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@smithy/types/-/types-4.11.0.tgz#c02f6184dcb47c4f0b387a32a7eca47956cc09f1" + integrity sha512-mlrmL0DRDVe3mNrjTcVcZEgkFmufITfUAPBEA+AHYiIeYyJebso/He1qLbP3PssRe22KUzLRpQSdBPbXdgZ2VA== dependencies: tslib "^2.6.2" -"@smithy/url-parser@^4.2.5": - version "4.2.5" - resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-4.2.5.tgz#2fea006108f17f7761432c7ef98d6aa003421487" - integrity sha512-VaxMGsilqFnK1CeBX+LXnSuaMx4sTL/6znSZh2829txWieazdVxr54HmiyTsIbpOTLcf5nYpq9lpzmwRdxj6rQ== +"@smithy/url-parser@^4.2.7": + version "4.2.7" + resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-4.2.7.tgz#3137e6f190c446dc8d89271c35f46a2e704bca19" + integrity sha512-/RLtVsRV4uY3qPWhBDsjwahAtt3x2IsMGnP5W1b2VZIe+qgCqkLxI1UOHDZp1Q1QSOrdOR32MF3Ph2JfWT1VHg== dependencies: - "@smithy/querystring-parser" "^4.2.5" - "@smithy/types" "^4.9.0" + "@smithy/querystring-parser" "^4.2.7" + "@smithy/types" "^4.11.0" tslib "^2.6.2" "@smithy/util-base64@^4.3.0": @@ -2357,36 +2366,36 @@ dependencies: tslib "^2.6.2" -"@smithy/util-defaults-mode-browser@^4.3.13": - version "4.3.13" - resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.13.tgz#51e3cadfe772882f941f1dff07d2f8b7acb9c21e" - integrity sha512-hlVLdAGrVfyNei+pKIgqDTxfu/ZI2NSyqj4IDxKd5bIsIqwR/dSlkxlPaYxFiIaDVrBy0he8orsFy+Cz119XvA== +"@smithy/util-defaults-mode-browser@^4.3.16": + version "4.3.17" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.17.tgz#9de8fa0de4922f0b84b0326658db2f83e0dc38d5" + integrity sha512-dwN4GmivYF1QphnP3xJESXKtHvkkvKHSZI8GrSKMVoENVSKW2cFPRYC4ZgstYjUHdR3zwaDkIaTDIp26JuY7Cw== dependencies: - "@smithy/property-provider" "^4.2.5" - "@smithy/smithy-client" "^4.9.10" - "@smithy/types" "^4.9.0" + "@smithy/property-provider" "^4.2.7" + "@smithy/smithy-client" "^4.10.3" + "@smithy/types" "^4.11.0" tslib "^2.6.2" -"@smithy/util-defaults-mode-node@^4.2.16": - version "4.2.16" - resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.16.tgz#ab4abdebae65e8628473d1493b1de5f82aa0eec9" - integrity sha512-F1t22IUiJLHrxW9W1CQ6B9PN+skZ9cqSuzB18Eh06HrJPbjsyZ7ZHecAKw80DQtyGTRcVfeukKaCRYebFwclbg== - dependencies: - "@smithy/config-resolver" "^4.4.3" - "@smithy/credential-provider-imds" "^4.2.5" - "@smithy/node-config-provider" "^4.3.5" - "@smithy/property-provider" "^4.2.5" - "@smithy/smithy-client" "^4.9.10" - "@smithy/types" "^4.9.0" +"@smithy/util-defaults-mode-node@^4.2.19": + version "4.2.20" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.20.tgz#ebd322fe527c60298d0e0fcf5253e7a61446af81" + integrity sha512-VD/I4AEhF1lpB3B//pmOIMBNLMrtdMXwy9yCOfa2QkJGDr63vH3RqPbSAKzoGMov3iryCxTXCxSsyGmEB8PDpg== + dependencies: + "@smithy/config-resolver" "^4.4.5" + "@smithy/credential-provider-imds" "^4.2.7" + "@smithy/node-config-provider" "^4.3.7" + "@smithy/property-provider" "^4.2.7" + "@smithy/smithy-client" "^4.10.3" + "@smithy/types" "^4.11.0" tslib "^2.6.2" -"@smithy/util-endpoints@^3.2.5": - version "3.2.5" - resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-3.2.5.tgz#9e0fc34e38ddfbbc434d23a38367638dc100cb14" - integrity sha512-3O63AAWu2cSNQZp+ayl9I3NapW1p1rR5mlVHcF6hAB1dPZUQFfRPYtplWX/3xrzWthPGj5FqB12taJJCfH6s8A== +"@smithy/util-endpoints@^3.2.7": + version "3.2.7" + resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-3.2.7.tgz#78cd5dd4aac8d9977f49d256d1e3418a09cade72" + integrity sha512-s4ILhyAvVqhMDYREeTS68R43B1V5aenV5q/V1QpRQJkCXib5BPRo4s7uNdzGtIKxaPHCfU/8YkvPAEvTpxgspg== dependencies: - "@smithy/node-config-provider" "^4.3.5" - "@smithy/types" "^4.9.0" + "@smithy/node-config-provider" "^4.3.7" + "@smithy/types" "^4.11.0" tslib "^2.6.2" "@smithy/util-hex-encoding@^4.2.0": @@ -2396,31 +2405,31 @@ dependencies: tslib "^2.6.2" -"@smithy/util-middleware@^4.2.5": - version "4.2.5" - resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-4.2.5.tgz#1ace865afe678fd4b0f9217197e2fe30178d4835" - integrity sha512-6Y3+rvBF7+PZOc40ybeZMcGln6xJGVeY60E7jy9Mv5iKpMJpHgRE6dKy9ScsVxvfAYuEX4Q9a65DQX90KaQ3bA== +"@smithy/util-middleware@^4.2.7": + version "4.2.7" + resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-4.2.7.tgz#1cae2c4fd0389ac858d29f7170c33b4443e83524" + integrity sha512-i1IkpbOae6NvIKsEeLLM9/2q4X+M90KV3oCFgWQI4q0Qz+yUZvsr+gZPdAEAtFhWQhAHpTsJO8DRJPuwVyln+w== dependencies: - "@smithy/types" "^4.9.0" + "@smithy/types" "^4.11.0" tslib "^2.6.2" -"@smithy/util-retry@^4.2.5": - version "4.2.5" - resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-4.2.5.tgz#70fe4fbbfb9ad43a9ce2ba4ed111ff7b30d7b333" - integrity sha512-GBj3+EZBbN4NAqJ/7pAhsXdfzdlznOh8PydUijy6FpNIMnHPSMO2/rP4HKu+UFeikJxShERk528oy7GT79YiJg== +"@smithy/util-retry@^4.2.7": + version "4.2.7" + resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-4.2.7.tgz#4abb0d85fbd766757d4569227a68d7caa3a7b8bb" + integrity sha512-SvDdsQyF5CIASa4EYVT02LukPHVzAgUA4kMAuZ97QJc2BpAqZfA4PINB8/KOoCXEw9tsuv/jQjMeaHFvxdLNGg== dependencies: - "@smithy/service-error-classification" "^4.2.5" - "@smithy/types" "^4.9.0" + "@smithy/service-error-classification" "^4.2.7" + "@smithy/types" "^4.11.0" tslib "^2.6.2" -"@smithy/util-stream@^4.5.6": - version "4.5.6" - resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-4.5.6.tgz#ebee9e52adeb6f88337778b2f3356a2cc615298c" - integrity sha512-qWw/UM59TiaFrPevefOZ8CNBKbYEP6wBAIlLqxn3VAIo9rgnTNc4ASbVrqDmhuwI87usnjhdQrxodzAGFFzbRQ== +"@smithy/util-stream@^4.5.8": + version "4.5.8" + resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-4.5.8.tgz#f3c79ff0720ebbae5b90e15be5482b4eeb297882" + integrity sha512-ZnnBhTapjM0YPGUSmOs0Mcg/Gg87k503qG4zU2v/+Js2Gu+daKOJMeqcQns8ajepY8tgzzfYxl6kQyZKml6O2w== dependencies: - "@smithy/fetch-http-handler" "^5.3.6" - "@smithy/node-http-handler" "^4.4.5" - "@smithy/types" "^4.9.0" + "@smithy/fetch-http-handler" "^5.3.8" + "@smithy/node-http-handler" "^4.4.7" + "@smithy/types" "^4.11.0" "@smithy/util-base64" "^4.3.0" "@smithy/util-buffer-from" "^4.2.0" "@smithy/util-hex-encoding" "^4.2.0" @@ -2450,13 +2459,13 @@ "@smithy/util-buffer-from" "^4.2.0" tslib "^2.6.2" -"@smithy/util-waiter@^4.2.5": - version "4.2.5" - resolved "https://registry.yarnpkg.com/@smithy/util-waiter/-/util-waiter-4.2.5.tgz#e527816edae20ec5f68b25685f4b21d93424ea86" - integrity sha512-Dbun99A3InifQdIrsXZ+QLcC0PGBPAdrl4cj1mTgJvyc9N2zf7QSxg8TBkzsCmGJdE3TLbO9ycwpY0EkWahQ/g== +"@smithy/util-waiter@^4.2.7": + version "4.2.7" + resolved "https://registry.yarnpkg.com/@smithy/util-waiter/-/util-waiter-4.2.7.tgz#1865defa25e4812c3e338447587332fb316421d8" + integrity sha512-vHJFXi9b7kUEpHWUCY3Twl+9NPOZvQ0SAi+Ewtn48mbiJk4JY9MZmKQjGB4SCvVb9WPiSphZJYY6RIbs+grrzw== dependencies: - "@smithy/abort-controller" "^4.2.5" - "@smithy/types" "^4.9.0" + "@smithy/abort-controller" "^4.2.7" + "@smithy/types" "^4.11.0" tslib "^2.6.2" "@smithy/uuid@^1.1.0": @@ -2481,74 +2490,74 @@ source-map "^0.7.3" tinyglobby "^0.2.13" -"@swc/core-darwin-arm64@1.15.3": - version "1.15.3" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.3.tgz#bd0bd3ab7730e3ffa64cf200c0ed7c572cbaba97" - integrity sha512-AXfeQn0CvcQ4cndlIshETx6jrAM45oeUrK8YeEY6oUZU/qzz0Id0CyvlEywxkWVC81Ajpd8TQQ1fW5yx6zQWkQ== - -"@swc/core-darwin-x64@1.15.3": - version "1.15.3" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.15.3.tgz#502b1e1c680df6b962265ca81a0c1a23e6ff070f" - integrity sha512-p68OeCz1ui+MZYG4wmfJGvcsAcFYb6Sl25H9TxWl+GkBgmNimIiRdnypK9nBGlqMZAcxngNPtnG3kEMNnvoJ2A== - -"@swc/core-linux-arm-gnueabihf@1.15.3": - version "1.15.3" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.3.tgz#e32cc6a2e06a75060d6f598ba2ca6f96c5c0cc43" - integrity sha512-Nuj5iF4JteFgwrai97mUX+xUOl+rQRHqTvnvHMATL/l9xE6/TJfPBpd3hk/PVpClMXG3Uvk1MxUFOEzM1JrMYg== - -"@swc/core-linux-arm64-gnu@1.15.3": - version "1.15.3" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.3.tgz#9b9861bc44059e393d4baf98b3cd3d6c4ea6f521" - integrity sha512-2Nc/s8jE6mW2EjXWxO/lyQuLKShcmTrym2LRf5Ayp3ICEMX6HwFqB1EzDhwoMa2DcUgmnZIalesq2lG3krrUNw== - -"@swc/core-linux-arm64-musl@1.15.3": - version "1.15.3" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.3.tgz#f6388743e5a159018bd468e8f710940b2614384b" - integrity sha512-j4SJniZ/qaZ5g8op+p1G9K1z22s/EYGg1UXIb3+Cg4nsxEpF5uSIGEE4mHUfA70L0BR9wKT2QF/zv3vkhfpX4g== - -"@swc/core-linux-x64-gnu@1.15.3": - version "1.15.3" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.3.tgz#15fea551c7a3aeb1bdc3ad5c652d73c9321ddba8" - integrity sha512-aKttAZnz8YB1VJwPQZtyU8Uk0BfMP63iDMkvjhJzRZVgySmqt/apWSdnoIcZlUoGheBrcqbMC17GGUmur7OT5A== - -"@swc/core-linux-x64-musl@1.15.3": - version "1.15.3" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.3.tgz#d3f17bab4ffcadbb47f135e6a14d6f3e401af289" - integrity sha512-oe8FctPu1gnUsdtGJRO2rvOUIkkIIaHqsO9xxN0bTR7dFTlPTGi2Fhk1tnvXeyAvCPxLIcwD8phzKg6wLv9yug== - -"@swc/core-win32-arm64-msvc@1.15.3": - version "1.15.3" - resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.3.tgz#9da386df7fed00b3473bcf4281ff3fcd14726d2c" - integrity sha512-L9AjzP2ZQ/Xh58e0lTRMLvEDrcJpR7GwZqAtIeNLcTK7JVE+QineSyHp0kLkO1rttCHyCy0U74kDTj0dRz6raA== - -"@swc/core-win32-ia32-msvc@1.15.3": - version "1.15.3" - resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.3.tgz#c398d4f0f10ffec2151a79733ee1ce86a945a1ea" - integrity sha512-B8UtogMzErUPDWUoKONSVBdsgKYd58rRyv2sHJWKOIMCHfZ22FVXICR4O/VwIYtlnZ7ahERcjayBHDlBZpR0aw== - -"@swc/core-win32-x64-msvc@1.15.3": - version "1.15.3" - resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.3.tgz#715596b034a654c82b03ef734a9b44c29bcd3a68" - integrity sha512-SpZKMR9QBTecHeqpzJdYEfgw30Oo8b/Xl6rjSzBt1g0ZsXyy60KLXrp6IagQyfTYqNYE/caDvwtF2FPn7pomog== +"@swc/core-darwin-arm64@1.15.8": + version "1.15.8" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.8.tgz#f565a2744ee840389eba800f1bd454a5ab5c8235" + integrity sha512-M9cK5GwyWWRkRGwwCbREuj6r8jKdES/haCZ3Xckgkl8MUQJZA3XB7IXXK1IXRNeLjg6m7cnoMICpXv1v1hlJOg== + +"@swc/core-darwin-x64@1.15.8": + version "1.15.8" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.15.8.tgz#52e1bb71fddca37d8c18dcfc33d4117e9de11789" + integrity sha512-j47DasuOvXl80sKJHSi2X25l44CMc3VDhlJwA7oewC1nV1VsSzwX+KOwE5tLnfORvVJJyeiXgJORNYg4jeIjYQ== + +"@swc/core-linux-arm-gnueabihf@1.15.8": + version "1.15.8" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.8.tgz#19586971697767c465bbecaed96940e03a12ac5c" + integrity sha512-siAzDENu2rUbwr9+fayWa26r5A9fol1iORG53HWxQL1J8ym4k7xt9eME0dMPXlYZDytK5r9sW8zEA10F2U3Xwg== + +"@swc/core-linux-arm64-gnu@1.15.8": + version "1.15.8" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.8.tgz#22a55b71cfff34cddd772619aa4ca2bf913032cb" + integrity sha512-o+1y5u6k2FfPYbTRUPvurwzNt5qd0NTumCTFscCNuBksycloXY16J8L+SMW5QRX59n4Hp9EmFa3vpvNHRVv1+Q== + +"@swc/core-linux-arm64-musl@1.15.8": + version "1.15.8" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.8.tgz#ce5a26ff25ab76fb699e7171b90884cfe63c1841" + integrity sha512-koiCqL09EwOP1S2RShCI7NbsQuG6r2brTqUYE7pV7kZm9O17wZ0LSz22m6gVibpwEnw8jI3IE1yYsQTVpluALw== + +"@swc/core-linux-x64-gnu@1.15.8": + version "1.15.8" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.8.tgz#cbacd43d4971fe6e4d41b8d8051ea1a8aabf40e5" + integrity sha512-4p6lOMU3bC+Vd5ARtKJ/FxpIC5G8v3XLoPEZ5s7mLR8h7411HWC/LmTXDHcrSXRC55zvAVia1eldy6zDLz8iFQ== + +"@swc/core-linux-x64-musl@1.15.8": + version "1.15.8" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.8.tgz#6317cf3b75fde62c88faec3750e3aeb9bec83b3d" + integrity sha512-z3XBnbrZAL+6xDGAhJoN4lOueIxC/8rGrJ9tg+fEaeqLEuAtHSW2QHDHxDwkxZMjuF/pZ6MUTjHjbp8wLbuRLA== + +"@swc/core-win32-arm64-msvc@1.15.8": + version "1.15.8" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.8.tgz#3a25a4d530e62be5b6b938b7eca70af117b34832" + integrity sha512-djQPJ9Rh9vP8GTS/Df3hcc6XP6xnG5c8qsngWId/BLA9oX6C7UzCPAn74BG/wGb9a6j4w3RINuoaieJB3t+7iQ== + +"@swc/core-win32-ia32-msvc@1.15.8": + version "1.15.8" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.8.tgz#1c7a3ba04216ce3b0a00b4c742e8e3bff9ff8b14" + integrity sha512-/wfAgxORg2VBaUoFdytcVBVCgf1isWZIEXB9MZEUty4wwK93M/PxAkjifOho9RN3WrM3inPLabICRCEgdHpKKQ== + +"@swc/core-win32-x64-msvc@1.15.8": + version "1.15.8" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.8.tgz#5bdcbe3fc0e0ccbae8abc9285a661a1bc3bdd65a" + integrity sha512-GpMePrh9Sl4d61o4KAHOOv5is5+zt6BEXCOCgs/H0FLGeii7j9bWDE8ExvKFy2GRRZVNR1ugsnzaGWHKM6kuzA== "@swc/core@^1.10.7": - version "1.15.3" - resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.15.3.tgz#2d0a5c4ac4c180c3dbf2f6d5d958b9fcbaa9755f" - integrity sha512-Qd8eBPkUFL4eAONgGjycZXj1jFCBW8Fd+xF0PzdTlBCWQIV1xnUT7B93wUANtW3KGjl3TRcOyxwSx/u/jyKw/Q== + version "1.15.8" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.15.8.tgz#818abeab1cc57546a773b11dec4edd8ab26ae687" + integrity sha512-T8keoJjXaSUoVBCIjgL6wAnhADIb09GOELzKg10CjNg+vLX48P93SME6jTfte9MZIm5m+Il57H3rTSk/0kzDUw== dependencies: "@swc/counter" "^0.1.3" "@swc/types" "^0.1.25" optionalDependencies: - "@swc/core-darwin-arm64" "1.15.3" - "@swc/core-darwin-x64" "1.15.3" - "@swc/core-linux-arm-gnueabihf" "1.15.3" - "@swc/core-linux-arm64-gnu" "1.15.3" - "@swc/core-linux-arm64-musl" "1.15.3" - "@swc/core-linux-x64-gnu" "1.15.3" - "@swc/core-linux-x64-musl" "1.15.3" - "@swc/core-win32-arm64-msvc" "1.15.3" - "@swc/core-win32-ia32-msvc" "1.15.3" - "@swc/core-win32-x64-msvc" "1.15.3" + "@swc/core-darwin-arm64" "1.15.8" + "@swc/core-darwin-x64" "1.15.8" + "@swc/core-linux-arm-gnueabihf" "1.15.8" + "@swc/core-linux-arm64-gnu" "1.15.8" + "@swc/core-linux-arm64-musl" "1.15.8" + "@swc/core-linux-x64-gnu" "1.15.8" + "@swc/core-linux-x64-musl" "1.15.8" + "@swc/core-win32-arm64-msvc" "1.15.8" + "@swc/core-win32-ia32-msvc" "1.15.8" + "@swc/core-win32-x64-msvc" "1.15.8" "@swc/counter@^0.1.3": version "0.1.3" @@ -2578,14 +2587,13 @@ fflate "^0.8.2" token-types "^6.0.0" -"@tokenizer/inflate@^0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@tokenizer/inflate/-/inflate-0.3.1.tgz#f0b9162741e8e4c5fa0c56764a049355ad29e1f4" - integrity sha512-4oeoZEBQdLdt5WmP/hx1KZ6D3/Oid/0cUb2nk4F0pTDAWy+KCH3/EnAkZF/bvckWo8I33EqBm01lIPgmgc8rCA== +"@tokenizer/inflate@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@tokenizer/inflate/-/inflate-0.4.1.tgz#fa6cdb8366151b3cc8426bf9755c1ea03a2fba08" + integrity sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA== dependencies: - debug "^4.4.1" - fflate "^0.8.2" - token-types "^6.0.0" + debug "^4.4.3" + token-types "^6.1.1" "@tokenizer/token@^0.3.0": version "0.3.0" @@ -2801,16 +2809,16 @@ "@types/express" "*" "@types/node@*": - version "24.10.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-24.10.1.tgz#91e92182c93db8bd6224fca031e2370cef9a8f01" - integrity sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ== + version "25.0.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-25.0.3.tgz#79b9ac8318f373fbfaaf6e2784893efa9701f269" + integrity sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA== dependencies: undici-types "~7.16.0" "@types/node@^22.10.7": - version "22.19.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.19.1.tgz#1188f1ddc9f46b4cc3aec76749050b4e1f459b7b" - integrity sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ== + version "22.19.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.19.3.tgz#8dfde7630d7a8528dc9b34db23d34f764467c02c" + integrity sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA== dependencies: undici-types "~6.21.0" @@ -2912,101 +2920,100 @@ resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.3.tgz#781d360c282436494b32fe7d9f7f8e64b3118aa3" integrity sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw== -"@typescript-eslint/eslint-plugin@8.48.1": - version "8.48.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.48.1.tgz#c772d1dbdd97cfddf85f5a161a97783233643631" - integrity sha512-X63hI1bxl5ohelzr0LY5coufyl0LJNthld+abwxpCoo6Gq+hSqhKwci7MUWkXo67mzgUK6YFByhmaHmUcuBJmA== - dependencies: - "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "8.48.1" - "@typescript-eslint/type-utils" "8.48.1" - "@typescript-eslint/utils" "8.48.1" - "@typescript-eslint/visitor-keys" "8.48.1" - graphemer "^1.4.0" - ignore "^7.0.0" +"@typescript-eslint/eslint-plugin@8.52.0": + version "8.52.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.52.0.tgz#9a9f1d2ee974ed77a8b1bda94e77123f697ee8b4" + integrity sha512-okqtOgqu2qmZJ5iN4TWlgfF171dZmx2FzdOv2K/ixL2LZWDStL8+JgQerI2sa8eAEfoydG9+0V96m7V+P8yE1Q== + dependencies: + "@eslint-community/regexpp" "^4.12.2" + "@typescript-eslint/scope-manager" "8.52.0" + "@typescript-eslint/type-utils" "8.52.0" + "@typescript-eslint/utils" "8.52.0" + "@typescript-eslint/visitor-keys" "8.52.0" + ignore "^7.0.5" natural-compare "^1.4.0" - ts-api-utils "^2.1.0" - -"@typescript-eslint/parser@8.48.1": - version "8.48.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.48.1.tgz#4e3c66d9ec20683ec142417fafeadab61c479c3f" - integrity sha512-PC0PDZfJg8sP7cmKe6L3QIL8GZwU5aRvUFedqSIpw3B+QjRSUZeeITC2M5XKeMXEzL6wccN196iy3JLwKNvDVA== - dependencies: - "@typescript-eslint/scope-manager" "8.48.1" - "@typescript-eslint/types" "8.48.1" - "@typescript-eslint/typescript-estree" "8.48.1" - "@typescript-eslint/visitor-keys" "8.48.1" - debug "^4.3.4" - -"@typescript-eslint/project-service@8.48.1": - version "8.48.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.48.1.tgz#cfe1741613b9112d85ae766de9e09b27a7d3f2f1" - integrity sha512-HQWSicah4s9z2/HifRPQ6b6R7G+SBx64JlFQpgSSHWPKdvCZX57XCbszg/bapbRsOEv42q5tayTYcEFpACcX1w== - dependencies: - "@typescript-eslint/tsconfig-utils" "^8.48.1" - "@typescript-eslint/types" "^8.48.1" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@8.48.1": - version "8.48.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.48.1.tgz#8bc70643e7cca57864b1ff95dd350fc27756bec0" - integrity sha512-rj4vWQsytQbLxC5Bf4XwZ0/CKd362DkWMUkviT7DCS057SK64D5lH74sSGzhI6PDD2HCEq02xAP9cX68dYyg1w== - dependencies: - "@typescript-eslint/types" "8.48.1" - "@typescript-eslint/visitor-keys" "8.48.1" - -"@typescript-eslint/tsconfig-utils@8.48.1", "@typescript-eslint/tsconfig-utils@^8.48.1": - version "8.48.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.48.1.tgz#68139ce2d258f984e2b33a95389158f1212af646" - integrity sha512-k0Jhs4CpEffIBm6wPaCXBAD7jxBtrHjrSgtfCjUvPp9AZ78lXKdTR8fxyZO5y4vWNlOvYXRtngSZNSn+H53Jkw== - -"@typescript-eslint/type-utils@8.48.1": - version "8.48.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.48.1.tgz#955bd3ddd648450f0a627925ff12ade63fb7516d" - integrity sha512-1jEop81a3LrJQLTf/1VfPQdhIY4PlGDBc/i67EVWObrtvcziysbLN3oReexHOM6N3jyXgCrkBsZpqwH0hiDOQg== - dependencies: - "@typescript-eslint/types" "8.48.1" - "@typescript-eslint/typescript-estree" "8.48.1" - "@typescript-eslint/utils" "8.48.1" - debug "^4.3.4" - ts-api-utils "^2.1.0" - -"@typescript-eslint/types@8.48.1", "@typescript-eslint/types@^8.48.1": - version "8.48.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.48.1.tgz#a9ff808f5f798f28767d5c0b015a88fa7ce46bd7" - integrity sha512-+fZ3LZNeiELGmimrujsDCT4CRIbq5oXdHe7chLiW8qzqyPMnn1puNstCrMNVAqwcl2FdIxkuJ4tOs/RFDBVc/Q== - -"@typescript-eslint/typescript-estree@8.48.1": - version "8.48.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.48.1.tgz#0d0e31fc47c5796c6463ab50cde19e1718d465b1" - integrity sha512-/9wQ4PqaefTK6POVTjJaYS0bynCgzh6ClJHGSBj06XEHjkfylzB+A3qvyaXnErEZSaxhIo4YdyBgq6j4RysxDg== - dependencies: - "@typescript-eslint/project-service" "8.48.1" - "@typescript-eslint/tsconfig-utils" "8.48.1" - "@typescript-eslint/types" "8.48.1" - "@typescript-eslint/visitor-keys" "8.48.1" - debug "^4.3.4" - minimatch "^9.0.4" - semver "^7.6.0" + ts-api-utils "^2.4.0" + +"@typescript-eslint/parser@8.52.0": + version "8.52.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.52.0.tgz#9fae9f5f13ebb1c8f31a50c34381bfd6bf96a05f" + integrity sha512-iIACsx8pxRnguSYhHiMn2PvhvfpopO9FXHyn1mG5txZIsAaB6F0KwbFnUQN3KCiG3Jcuad/Cao2FAs1Wp7vAyg== + dependencies: + "@typescript-eslint/scope-manager" "8.52.0" + "@typescript-eslint/types" "8.52.0" + "@typescript-eslint/typescript-estree" "8.52.0" + "@typescript-eslint/visitor-keys" "8.52.0" + debug "^4.4.3" + +"@typescript-eslint/project-service@8.52.0": + version "8.52.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.52.0.tgz#5fb4c16af4eda6d74c70cbc62f5d3f77b96e4cbe" + integrity sha512-xD0MfdSdEmeFa3OmVqonHi+Cciab96ls1UhIF/qX/O/gPu5KXD0bY9lu33jj04fjzrXHcuvjBcBC+D3SNSadaw== + dependencies: + "@typescript-eslint/tsconfig-utils" "^8.52.0" + "@typescript-eslint/types" "^8.52.0" + debug "^4.4.3" + +"@typescript-eslint/scope-manager@8.52.0": + version "8.52.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.52.0.tgz#9884ff690fad30380ccabfb08af1ac200af6b4e5" + integrity sha512-ixxqmmCcc1Nf8S0mS0TkJ/3LKcC8mruYJPOU6Ia2F/zUUR4pApW7LzrpU3JmtePbRUTes9bEqRc1Gg4iyRnDzA== + dependencies: + "@typescript-eslint/types" "8.52.0" + "@typescript-eslint/visitor-keys" "8.52.0" + +"@typescript-eslint/tsconfig-utils@8.52.0", "@typescript-eslint/tsconfig-utils@^8.52.0": + version "8.52.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.52.0.tgz#0296751c22ed05c83787a6eaec65ae221bd8b8ed" + integrity sha512-jl+8fzr/SdzdxWJznq5nvoI7qn2tNYV/ZBAEcaFMVXf+K6jmXvAFrgo/+5rxgnL152f//pDEAYAhhBAZGrVfwg== + +"@typescript-eslint/type-utils@8.52.0": + version "8.52.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.52.0.tgz#6e554113f8a074cf9b2faa818d2ebfccb867d6c5" + integrity sha512-JD3wKBRWglYRQkAtsyGz1AewDu3mTc7NtRjR/ceTyGoPqmdS5oCdx/oZMWD5Zuqmo6/MpsYs0wp6axNt88/2EQ== + dependencies: + "@typescript-eslint/types" "8.52.0" + "@typescript-eslint/typescript-estree" "8.52.0" + "@typescript-eslint/utils" "8.52.0" + debug "^4.4.3" + ts-api-utils "^2.4.0" + +"@typescript-eslint/types@8.52.0", "@typescript-eslint/types@^8.52.0": + version "8.52.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.52.0.tgz#1eb0a16b324824bc23b89d109a267c38c9213c4a" + integrity sha512-LWQV1V4q9V4cT4H5JCIx3481iIFxH1UkVk+ZkGGAV1ZGcjGI9IoFOfg3O6ywz8QqCDEp7Inlg6kovMofsNRaGg== + +"@typescript-eslint/typescript-estree@8.52.0": + version "8.52.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.52.0.tgz#2ad7721c671be2127951286cb7f44c4ce55b0591" + integrity sha512-XP3LClsCc0FsTK5/frGjolyADTh3QmsLp6nKd476xNI9CsSsLnmn4f0jrzNoAulmxlmNIpeXuHYeEQv61Q6qeQ== + dependencies: + "@typescript-eslint/project-service" "8.52.0" + "@typescript-eslint/tsconfig-utils" "8.52.0" + "@typescript-eslint/types" "8.52.0" + "@typescript-eslint/visitor-keys" "8.52.0" + debug "^4.4.3" + minimatch "^9.0.5" + semver "^7.7.3" tinyglobby "^0.2.15" - ts-api-utils "^2.1.0" + ts-api-utils "^2.4.0" -"@typescript-eslint/utils@8.48.1": - version "8.48.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.48.1.tgz#6cf7b99e0943b33a983ef687b9a86b65578b5c32" - integrity sha512-fAnhLrDjiVfey5wwFRwrweyRlCmdz5ZxXz2G/4cLn0YDLjTapmN4gcCsTBR1N2rWnZSDeWpYtgLDsJt+FpmcwA== +"@typescript-eslint/utils@8.52.0": + version "8.52.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.52.0.tgz#b249be8264899b80d996fa353b4b84da4662f962" + integrity sha512-wYndVMWkweqHpEpwPhwqE2lnD2DxC6WVLupU/DOt/0/v+/+iQbbzO3jOHjmBMnhu0DgLULvOaU4h4pwHYi2oRQ== dependencies: - "@eslint-community/eslint-utils" "^4.7.0" - "@typescript-eslint/scope-manager" "8.48.1" - "@typescript-eslint/types" "8.48.1" - "@typescript-eslint/typescript-estree" "8.48.1" + "@eslint-community/eslint-utils" "^4.9.1" + "@typescript-eslint/scope-manager" "8.52.0" + "@typescript-eslint/types" "8.52.0" + "@typescript-eslint/typescript-estree" "8.52.0" -"@typescript-eslint/visitor-keys@8.48.1": - version "8.48.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.48.1.tgz#247d4fe6dcc044f45b7f1c15110bf95e5d73b334" - integrity sha512-BmxxndzEWhE4TIEEMBs8lP3MBWN3jFPs/p6gPm/wkv02o41hI6cq9AuSmGAaTTHPtA1FTi2jBre4A9rm5ZmX+Q== +"@typescript-eslint/visitor-keys@8.52.0": + version "8.52.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.52.0.tgz#50361c48a6302676230fe498f80f6decce4bf673" + integrity sha512-ink3/Zofus34nmBsPjow63FP5M7IGff0RKAgqR6+CFpdk22M7aLwC9gOcLGYqr7MczLPzZVERW9hRog3O4n1sQ== dependencies: - "@typescript-eslint/types" "8.48.1" + "@typescript-eslint/types" "8.52.0" eslint-visitor-keys "^4.2.1" "@ungap/structured-clone@^1.3.0": @@ -3609,9 +3616,9 @@ base64-js@^1.3.1: integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== baseline-browser-mapping@^2.9.0: - version "2.9.3" - resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.9.3.tgz#5eaccdbbe2006e55ec9978a0ccacd59eb785215c" - integrity sha512-8QdH6czo+G7uBsNo0GiUfouPN1lRzKdJTGnKXwe12gkFbnnOUaUKGN55dMkfy+mnxmvjwl9zcI4VncczcVXDhA== + version "2.9.12" + resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.9.12.tgz#fbed5f37edf24b708e6e0b1fb26c70982a577dfc" + integrity sha512-Mij6Lij93pTAIsSYy5cyBQ975Qh9uLEc5rwGTpomiZeXZL9yIS6uORJakb3ScHgfs0serMMfIbXzokPMuEiRyw== bcrypt@^6.0.0: version "6.0.0" @@ -3647,10 +3654,10 @@ bl@^4.1.0: inherits "^2.0.4" readable-stream "^3.4.0" -body-parser@^2.2.0, body-parser@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-2.2.1.tgz#6df606b0eb0a6e3f783dde91dde182c24c82438c" - integrity sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw== +body-parser@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-2.2.2.tgz#1a32cdb966beaf68de50a9dfbe5b58f83cb8890c" + integrity sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA== dependencies: bytes "^3.1.2" content-type "^1.0.5" @@ -3658,7 +3665,7 @@ body-parser@^2.2.0, body-parser@^2.2.1: http-errors "^2.0.0" iconv-lite "^0.7.0" on-finished "^2.4.1" - qs "^6.14.0" + qs "^6.14.1" raw-body "^3.0.1" type-is "^2.0.1" @@ -3799,9 +3806,9 @@ camelcase@^6.3.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001759: - version "1.0.30001759" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001759.tgz#d569e7b010372c6b0ca3946e30dada0a2e9d5006" - integrity sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw== + version "1.0.30001763" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001763.tgz#9397446dd110b1aeadb0df249c41b2ece7f90f09" + integrity sha512-mh/dGtq56uN98LlNX9qdbKnzINhX0QzhiWBFEkFfsFO4QyCvL8YegrJAazCwXIeqkIob8BlZPGM3xdnY+sgmvQ== chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" @@ -3839,9 +3846,9 @@ ci-info@^4.2.0: integrity sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA== cjs-module-lexer@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-2.1.1.tgz#bff23b0609cc9afa428bd35f1918f7d03b448562" - integrity sha512-+CmxIZ/L2vNcEfvNtLdU0ZQ6mbq3FZnwAP2PPTiKP+1QOoKwlKlPgb8UKV0Dds7QVaMnHm+FwSft2VB0s/SLjQ== + version "2.2.0" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz#b3ca5101843389259ade7d88c77bd06ce55849ca" + integrity sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ== class-transformer@^0.5.1: version "0.5.1" @@ -4035,7 +4042,7 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -cookie-signature@^1.2.1: +cookie-signature@^1.2.1, cookie-signature@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.2.2.tgz#57c7fc3cc293acab9fec54d73e15690ebe4a1793" integrity sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg== @@ -4099,7 +4106,7 @@ debug@4.3.4: dependencies: ms "2.1.2" -debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@^4.3.7, debug@^4.4.0, debug@^4.4.1, debug@^4.4.3: +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.7, debug@^4.4.0, debug@^4.4.3: version "4.4.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== @@ -4114,9 +4121,9 @@ decompress-response@^6.0.0: mimic-response "^3.1.0" dedent@^1.6.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.7.0.tgz#c1f9445335f0175a96587be245a282ff451446ca" - integrity sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ== + version "1.7.1" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.7.1.tgz#364661eea3d73f3faba7089214420ec2f8f13e15" + integrity sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg== deep-is@^0.1.3: version "0.1.4" @@ -4234,9 +4241,9 @@ ee-first@1.1.1: integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== electron-to-chromium@^1.5.263: - version "1.5.266" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.266.tgz#41ed029b3cf641c4ee071de42954b36dca8f5f4e" - integrity sha512-kgWEglXvkEfMH7rxP5OSZZwnaDWT7J9EoZCujhnpLbfi0bbNtRkgdX2E3gt0Uer11c61qCYktB3hwkAS325sJg== + version "1.5.267" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz#5d84f2df8cdb6bfe7e873706bb21bd4bfb574dc7" + integrity sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw== emittery@^0.13.1: version "0.13.1" @@ -4259,9 +4266,9 @@ encodeurl@^2.0.0: integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== enhanced-resolve@^5.0.0, enhanced-resolve@^5.17.3, enhanced-resolve@^5.7.0: - version "5.18.3" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz#9b5f4c5c076b8787c78fe540392ce76a88855b44" - integrity sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww== + version "5.18.4" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz#c22d33055f3952035ce6a144ce092447c525f828" + integrity sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -4365,9 +4372,9 @@ eslint-visitor-keys@^4.2.1: integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== eslint@^9.39.1: - version "9.39.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.39.1.tgz#be8bf7c6de77dcc4252b5a8dcb31c2efff74a6e5" - integrity sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g== + version "9.39.2" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.39.2.tgz#cb60e6d16ab234c0f8369a3fe7cc87967faf4b6c" + integrity sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw== dependencies: "@eslint-community/eslint-utils" "^4.8.0" "@eslint-community/regexpp" "^4.12.1" @@ -4375,7 +4382,7 @@ eslint@^9.39.1: "@eslint/config-helpers" "^0.4.2" "@eslint/core" "^0.17.0" "@eslint/eslintrc" "^3.3.1" - "@eslint/js" "9.39.1" + "@eslint/js" "9.39.2" "@eslint/plugin-kit" "^0.4.1" "@humanfs/node" "^0.16.6" "@humanwhocodes/module-importer" "^1.0.1" @@ -4424,9 +4431,9 @@ esprima@4.0.1, esprima@^4.0.0, esprima@^4.0.1: integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" - integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== + version "1.7.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.7.0.tgz#08d048f261f0ddedb5bae95f46809463d9c9496d" + integrity sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g== dependencies: estraverse "^5.1.0" @@ -4501,40 +4508,7 @@ expect@30.2.0, expect@^30.0.0: jest-mock "30.2.0" jest-util "30.2.0" -express@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/express/-/express-5.1.0.tgz#d31beaf715a0016f0d53f47d3b4d7acf28c75cc9" - integrity sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA== - dependencies: - accepts "^2.0.0" - body-parser "^2.2.0" - content-disposition "^1.0.0" - content-type "^1.0.5" - cookie "^0.7.1" - cookie-signature "^1.2.1" - debug "^4.4.0" - encodeurl "^2.0.0" - escape-html "^1.0.3" - etag "^1.8.1" - finalhandler "^2.1.0" - fresh "^2.0.0" - http-errors "^2.0.0" - merge-descriptors "^2.0.0" - mime-types "^3.0.0" - on-finished "^2.4.1" - once "^1.4.0" - parseurl "^1.3.3" - proxy-addr "^2.0.7" - qs "^6.14.0" - range-parser "^1.2.1" - router "^2.2.0" - send "^1.1.0" - serve-static "^2.2.0" - statuses "^2.0.1" - type-is "^2.0.1" - vary "^1.1.2" - -express@^5.2.1: +express@5.2.1, express@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/express/-/express-5.2.1.tgz#8f21d15b6d327f92b4794ecf8cb08a72f956ac04" integrity sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw== @@ -4637,9 +4611,9 @@ fast-xml-parser@5.2.5: strnum "^2.1.0" fastq@^1.6.0: - version "1.19.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.19.1.tgz#d50eaba803c8846a883c16492821ebcd2cda55f5" - integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== + version "1.20.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.20.1.tgz#ca750a10dc925bc8b18839fd203e3ef4b3ced675" + integrity sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw== dependencies: reusify "^1.0.4" @@ -4674,14 +4648,14 @@ file-entry-cache@^8.0.0: dependencies: flat-cache "^4.0.0" -file-type@21.1.0: - version "21.1.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-21.1.0.tgz#fb659aca041d3313bf2ae5336eeb008a2e0aa229" - integrity sha512-boU4EHmP3JXkwDo4uhyBhTt5pPstxB6eEXKJBu2yu2l7aAMMm7QQYQEzssJmKReZYrFdFOJS8koVo6bXIBGDqA== +file-type@21.2.0: + version "21.2.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-21.2.0.tgz#153f7d7d4279ba440f84ae80fd99cdd27fba788c" + integrity sha512-vCYBgFOrJQLoTzDyAXAL/RFfKnXXpUYt4+tipVy26nJJhT7ftgGETf2tAQF59EEL61i3MrorV/PG6tf7LJK7eg== dependencies: - "@tokenizer/inflate" "^0.3.1" - strtok3 "^10.3.1" - token-types "^6.0.0" + "@tokenizer/inflate" "^0.4.1" + strtok3 "^10.3.4" + token-types "^6.1.1" uint8array-extras "^1.4.0" file-type@^20.5.0: @@ -4797,7 +4771,7 @@ form-data-encoder@^2.1.2: resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-2.1.4.tgz#261ea35d2a70d48d30ec7a9603130fa5515e9cd5" integrity sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw== -form-data@^4.0.0, form-data@^4.0.4: +form-data@^4.0.0, form-data@^4.0.4, form-data@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.5.tgz#b49e48858045ff4cbf6b03e1805cebcad3679053" integrity sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w== @@ -4827,10 +4801,10 @@ fresh@^2.0.0: resolved "https://registry.yarnpkg.com/fresh/-/fresh-2.0.0.tgz#8dd7df6a1b3a1b3a5cf186c05a5dd267622635a4" integrity sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A== -fs-extra@11.3.2: - version "11.3.2" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.2.tgz#c838aeddc6f4a8c74dd15f85e11fe5511bfe02a4" - integrity sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A== +fs-extra@11.3.3: + version "11.3.3" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.3.tgz#a27da23b72524e81ac6c3815cc0179b8c74c59ee" + integrity sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg== dependencies: graceful-fs "^4.2.0" jsonfile "^6.0.1" @@ -5022,11 +4996,6 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - handlebars@^4.7.8: version "4.7.8" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" @@ -5073,7 +5042,7 @@ http-cache-semantics@^4.1.1: resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz#205f4db64f8562b76a4ff9235aa5279839a09dd5" integrity sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ== -http-errors@^2.0.0, http-errors@~2.0.1: +http-errors@^2.0.0, http-errors@^2.0.1, http-errors@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.1.tgz#36d2f65bc909c8790018dd36fb4d93da6caae06b" integrity sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ== @@ -5098,9 +5067,9 @@ human-signals@^2.1.0: integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== iconv-lite@^0.7.0, iconv-lite@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.7.0.tgz#c50cd80e6746ca8115eb98743afa81aa0e147a3e" - integrity sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ== + version "0.7.1" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.7.1.tgz#d4af1d2092f2bb05aab6296e5e7cd286d2f15432" + integrity sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" @@ -5114,7 +5083,7 @@ ignore@^5.2.0: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== -ignore@^7.0.0: +ignore@^7.0.5: version "7.0.5" resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.5.tgz#4cb5f6cd7d4c7ab0365738c7aea888baa6d7efd9" integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== @@ -5813,9 +5782,9 @@ levn@^0.4.1: type-check "~0.4.0" libphonenumber-js@^1.11.1: - version "1.12.31" - resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.12.31.tgz#3cdb45641c6b77228dd1238f3d810c3bb5d91199" - integrity sha512-Z3IhgVgrqO1S5xPYM3K5XwbkDasU67/Vys4heW+lfSBALcUZjeIIzI8zCLifY+OCzSq+fpDdywMDa7z+4srJPQ== + version "1.12.33" + resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.12.33.tgz#c92ca21e5fe081ed978e8a3331511842f08fd5df" + integrity sha512-r9kw4OA6oDO4dPXkOrXTkArQAafIKAU71hChInV4FxZ69dxCfbwQGDPzqR5/vea94wU705/3AZroEbSoeVWrQw== lines-and-columns@^1.1.6: version "1.2.4" @@ -5931,12 +5900,7 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -lru-cache@^7.14.1: - version "7.18.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" - integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== - -lru.min@^1.0.0: +lru.min@^1.0.0, lru.min@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/lru.min/-/lru.min-1.1.3.tgz#c8c3d001dfb4cbe5b8d1f4bea207d4a320e5d76f" integrity sha512-Lkk/vx6ak3rYkRR0Nhu4lFUT2VDnQSxBe8Hbl7f36358p6ow8Bnvr8lrLt98H8J1aGxfhbX4Fs5tYg2+FTwr5Q== @@ -6017,10 +5981,10 @@ micromatch@^4.0.0, micromatch@^4.0.8: braces "^3.0.3" picomatch "^2.3.1" -mikro-orm@6.6.1: - version "6.6.1" - resolved "https://registry.yarnpkg.com/mikro-orm/-/mikro-orm-6.6.1.tgz#e3183241c51a14c9c7e39ea98081e7cca50881bc" - integrity sha512-AaYXM3M4/X/Jum/RlZXuI7QngQX8DhyY4LM5phV01PFMtFZAvKHzRr62IrOJVtmJiKYKEHWmEYpuc+bD4169Zg== +mikro-orm@6.6.3: + version "6.6.3" + resolved "https://registry.yarnpkg.com/mikro-orm/-/mikro-orm-6.6.3.tgz#e27a280a0e6e3195a4f814ebdc55a02edbbb3427" + integrity sha512-q+ixWxBUQNGBQNp6ncg5+5tZ8hsvzJ0yh+Qme4qgjUP5+sGA6e8iBD2QSO4EQIi1RfRUxIoQvDJs/1GTDnmdHg== mime-db@1.52.0: version "1.52.0" @@ -6039,7 +6003,7 @@ mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.24: dependencies: mime-db "1.52.0" -mime-types@^3.0.0, mime-types@^3.0.1: +mime-types@^3.0.0, mime-types@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-3.0.2.tgz#39002d4182575d5af036ffa118100f2524b2e2ab" integrity sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A== @@ -6080,7 +6044,7 @@ minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -minimatch@^9.0.3, minimatch@^9.0.4: +minimatch@^9.0.3, minimatch@^9.0.4, minimatch@^9.0.5: version "9.0.5" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== @@ -6132,10 +6096,10 @@ mute-stream@^2.0.0: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-2.0.0.tgz#a5446fc0c512b71c83c44d908d5c7b7b4c493b2b" integrity sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA== -mysql2@3.15.3, mysql2@^3.14.0: - version "3.15.3" - resolved "https://registry.yarnpkg.com/mysql2/-/mysql2-3.15.3.tgz#f0348d9c7401bb98cb1f45ffc5a773b109f70808" - integrity sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg== +mysql2@3.16.0, mysql2@^3.14.0: + version "3.16.0" + resolved "https://registry.yarnpkg.com/mysql2/-/mysql2-3.16.0.tgz#f296336b3ddba00fe061c7ca7ada2ddf8689c17e" + integrity sha512-AEGW7QLLSuSnjCS4pk3EIqOmogegmze9h8EyrndavUQnIUcfkVal/sK7QznE+a3bc6rzPbAiui9Jcb+96tPwYA== dependencies: aws-ssl-profiles "^1.1.1" denque "^2.1.0" @@ -6148,11 +6112,11 @@ mysql2@3.15.3, mysql2@^3.14.0: sqlstring "^2.3.2" named-placeholders@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/named-placeholders/-/named-placeholders-1.1.3.tgz#df595799a36654da55dda6152ba7a137ad1d9351" - integrity sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w== + version "1.1.6" + resolved "https://registry.yarnpkg.com/named-placeholders/-/named-placeholders-1.1.6.tgz#c50c6920b43f258f59c16add1e56654f5cc02bb5" + integrity sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w== dependencies: - lru-cache "^7.14.1" + lru.min "^1.1.0" napi-postinstall@^0.3.0: version "0.3.4" @@ -6212,9 +6176,9 @@ normalize-path@^3.0.0: integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== normalize-url@^8.0.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.1.0.tgz#d33504f67970decf612946fd4880bc8c0983486d" - integrity sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w== + version "8.1.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.1.1.tgz#751a20c8520e5725404c06015fea21d7567f25ef" + integrity sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ== npm-run-path@^4.0.1: version "4.0.1" @@ -6496,9 +6460,9 @@ prelude-ls@^1.2.1: integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== prettier-linter-helpers@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" - integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + version "1.0.1" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz#6a31f88a4bad6c7adda253de12ba4edaea80ebcd" + integrity sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg== dependencies: fast-diff "^1.1.2" @@ -6539,10 +6503,10 @@ pure-rand@^7.0.0: resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-7.0.1.tgz#6f53a5a9e3e4a47445822af96821ca509ed37566" integrity sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ== -qs@^6.11.2, qs@^6.14.0: - version "6.14.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.0.tgz#c63fa40680d2c5c941412a0e899c89af60c0a930" - integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w== +qs@^6.14.0, qs@^6.14.1: + version "6.14.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.1.tgz#a41d85b9d3902f31d27861790506294881871159" + integrity sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ== dependencies: side-channel "^1.1.0" @@ -6755,27 +6719,27 @@ semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.4, semver@^7.3.5, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.7.2, semver@^7.7.3: +semver@^7.3.4, semver@^7.3.5, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4, semver@^7.7.2, semver@^7.7.3: version "7.7.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.3.tgz#4b5f4143d007633a8dc671cd0a6ef9147b8bb946" integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== send@^1.1.0, send@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/send/-/send-1.2.0.tgz#32a7554fb777b831dfa828370f773a3808d37212" - integrity sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw== + version "1.2.1" + resolved "https://registry.yarnpkg.com/send/-/send-1.2.1.tgz#9eab743b874f3550f40a26867bf286ad60d3f3ed" + integrity sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ== dependencies: - debug "^4.3.5" + debug "^4.4.3" encodeurl "^2.0.0" escape-html "^1.0.3" etag "^1.8.1" fresh "^2.0.0" - http-errors "^2.0.0" - mime-types "^3.0.1" + http-errors "^2.0.1" + mime-types "^3.0.2" ms "^2.1.3" on-finished "^2.4.1" range-parser "^1.2.1" - statuses "^2.0.1" + statuses "^2.0.2" seq-queue@^0.0.5: version "0.0.5" @@ -6790,9 +6754,9 @@ serialize-javascript@^6.0.2: randombytes "^2.1.0" serve-static@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-2.2.0.tgz#9c02564ee259bdd2251b82d659a2e7e1938d66f9" - integrity sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ== + version "2.2.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-2.2.1.tgz#7f186a4a4e5f5b663ad7a4294ff1bf37cf0e98a9" + integrity sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw== dependencies: encodeurl "^2.0.0" escape-html "^1.0.3" @@ -6933,7 +6897,7 @@ stack-utils@^2.0.6: dependencies: escape-string-regexp "^2.0.0" -statuses@^2.0.1, statuses@~2.0.2: +statuses@^2.0.1, statuses@^2.0.2, statuses@~2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.2.tgz#8f75eecef765b5e1cfcdc080da59409ed424e382" integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== @@ -7044,39 +7008,40 @@ strip-json-comments@^3.1.1: integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== strnum@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/strnum/-/strnum-2.1.1.tgz#cf2a6e0cf903728b8b2c4b971b7e36b4e82d46ab" - integrity sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw== + version "2.1.2" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-2.1.2.tgz#a5e00ba66ab25f9cafa3726b567ce7a49170937a" + integrity sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ== -strtok3@^10.2.0, strtok3@^10.3.1: +strtok3@^10.2.0, strtok3@^10.3.4: version "10.3.4" resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-10.3.4.tgz#793ebd0d59df276a085586134b73a406e60be9c1" integrity sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg== dependencies: "@tokenizer/token" "^0.3.0" -superagent@^10.2.3: - version "10.2.3" - resolved "https://registry.yarnpkg.com/superagent/-/superagent-10.2.3.tgz#d1e4986f2caac423c37e38077f9073ccfe73a59b" - integrity sha512-y/hkYGeXAj7wUMjxRbB21g/l6aAEituGXM9Rwl4o20+SX3e8YOSV6BxFXl+dL3Uk0mjSL3kCbNkwURm8/gEDig== +superagent@^10.3.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/superagent/-/superagent-10.3.0.tgz#ff1e39e7976b63f8084291d65f5bfbbbbd156989" + integrity sha512-B+4Ik7ROgVKrQsXTV0Jwp2u+PXYLSlqtDAhYnkkD+zn3yg8s/zjA2MeGayPoY/KICrbitwneDHrjSotxKL+0XQ== dependencies: component-emitter "^1.3.1" cookiejar "^2.1.4" debug "^4.3.7" fast-safe-stringify "^2.1.1" - form-data "^4.0.4" + form-data "^4.0.5" formidable "^3.5.4" methods "^1.1.2" mime "2.6.0" - qs "^6.11.2" + qs "^6.14.1" -supertest@^7.1.4: - version "7.1.4" - resolved "https://registry.yarnpkg.com/supertest/-/supertest-7.1.4.tgz#3175e2539f517ca72fdc7992ffff35b94aca7d34" - integrity sha512-tjLPs7dVyqgItVFirHYqe2T+MfWc2VOBQ8QFKKbWTA3PU7liZR8zoSpAi/C1k1ilm9RsXIKYf197oap9wXGVYg== +supertest@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/supertest/-/supertest-7.2.2.tgz#dac3ee25a2aa59942a7f641e50c838a7c8819204" + integrity sha512-oK8WG9diS3DlhdUkcFn4tkNIiIbBx9lI2ClF8K+b2/m8Eyv47LSawxUzZQSNKUrVb2KsqeTDCcjAAVPYaSLVTA== dependencies: + cookie-signature "^1.2.2" methods "^1.1.2" - superagent "^10.2.3" + superagent "^10.3.0" supports-color@^7.1.0: version "7.2.0" @@ -7097,10 +7062,10 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -swagger-ui-dist@5.30.2: - version "5.30.2" - resolved "https://registry.yarnpkg.com/swagger-ui-dist/-/swagger-ui-dist-5.30.2.tgz#b146c5bd92cc712340f8847b546ea64d785efeb2" - integrity sha512-HWCg1DTNE/Nmapt+0m2EPXFwNKNeKK4PwMjkwveN/zn1cV2Kxi9SURd+m0SpdcSgWEK/O64sf8bzXdtUhigtHA== +swagger-ui-dist@5.31.0: + version "5.31.0" + resolved "https://registry.yarnpkg.com/swagger-ui-dist/-/swagger-ui-dist-5.31.0.tgz#a2529f844c83b7e85c2caaf2c64a8277dd71db98" + integrity sha512-zSUTIck02fSga6rc0RZP3b7J7wgHXwLea8ZjgLA3Vgnb8QeOl3Wou2/j5QkzSGeoz6HusP/coYuJl33aQxQZpg== dependencies: "@scarf/scarf" "=1.4.0" @@ -7136,9 +7101,9 @@ tarn@^3.0.2: integrity sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ== terser-webpack-plugin@^5.3.11: - version "5.3.15" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.15.tgz#0a26860b765eaffa8e840170aabc5b3a3f6f6bb9" - integrity sha512-PGkOdpRFK+rb1TzVz+msVhw4YMRT9txLF4kRqvJhGhCM324xuR3REBSHALN+l+sAhKUmz0aotnjp5D+P83mLhQ== + version "5.3.16" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz#741e448cc3f93d8026ebe4f7ef9e4afacfd56330" + integrity sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q== dependencies: "@jridgewell/trace-mapping" "^0.3.25" jest-worker "^27.4.5" @@ -7207,19 +7172,19 @@ toidentifier@~1.0.1: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== -token-types@^6.0.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/token-types/-/token-types-6.1.1.tgz#85bd0ada82939b9178ecd5285881a538c4c00fdd" - integrity sha512-kh9LVIWH5CnL63Ipf0jhlBIy0UsrMj/NJDfpsy1SqOXlLKEVyXXYrnFxFT1yOOYVGBSApeVnjPw/sBz5BfEjAQ== +token-types@^6.0.0, token-types@^6.1.1: + version "6.1.2" + resolved "https://registry.yarnpkg.com/token-types/-/token-types-6.1.2.tgz#18d0fd59b996d421f9f83914d6101c201bd08129" + integrity sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww== dependencies: - "@borewit/text-codec" "^0.1.0" + "@borewit/text-codec" "^0.2.1" "@tokenizer/token" "^0.3.0" ieee754 "^1.2.1" -ts-api-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.1.0.tgz#595f7094e46eed364c13fd23e75f9513d29baf91" - integrity sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ== +ts-api-utils@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.4.0.tgz#2690579f96d2790253bdcf1ca35d569ad78f9ad8" + integrity sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA== ts-jest@^29.4.0: version "29.4.6" @@ -7343,14 +7308,14 @@ typedarray@^0.0.6: integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== typescript-eslint@^8.34.1: - version "8.48.1" - resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.48.1.tgz#436028540f5859755687b8b1b28e19ed9194aaad" - integrity sha512-FbOKN1fqNoXp1hIl5KYpObVrp0mCn+CLgn479nmu2IsRMrx2vyv74MmsBLVlhg8qVwNFGbXSp8fh1zp8pEoC2A== + version "8.52.0" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.52.0.tgz#b8c156b6f2b4dee202a85712ff6a37f614476413" + integrity sha512-atlQQJ2YkO4pfTVQmQ+wvYQwexPDOIgo+RaVcD7gHgzy/IQA+XTyuxNM9M9TVXvttkF7koBHmcwisKdOAf2EcA== dependencies: - "@typescript-eslint/eslint-plugin" "8.48.1" - "@typescript-eslint/parser" "8.48.1" - "@typescript-eslint/typescript-estree" "8.48.1" - "@typescript-eslint/utils" "8.48.1" + "@typescript-eslint/eslint-plugin" "8.52.0" + "@typescript-eslint/parser" "8.52.0" + "@typescript-eslint/typescript-estree" "8.52.0" + "@typescript-eslint/utils" "8.52.0" typescript@5.9.3, typescript@^5.7.3: version "5.9.3" @@ -7430,9 +7395,9 @@ unrs-resolver@^1.7.11: "@unrs/resolver-binding-win32-x64-msvc" "1.11.1" update-browserslist-db@^1.2.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.2.2.tgz#cfb4358afa08b3d5731a2ecd95eebf4ddef8033e" - integrity sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA== + version "1.2.3" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz#64d76db58713136acbeb4c49114366cc6cc2e80d" + integrity sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w== dependencies: escalade "^3.2.0" picocolors "^1.1.1" @@ -7474,9 +7439,9 @@ v8-to-istanbul@^9.0.1: convert-source-map "^2.0.0" validator@^13.15.20: - version "13.15.23" - resolved "https://registry.yarnpkg.com/validator/-/validator-13.15.23.tgz#59a874f84e4594588e3409ab1edbe64e96d0c62d" - integrity sha512-4yoz1kEWqUjzi5zsPbAS/903QXSYp0UOtHsPpp7p9rHAw/W+dkInskAE386Fat3oKRROwO98d9ZB0G4cObgUyw== + version "13.15.26" + resolved "https://registry.yarnpkg.com/validator/-/validator-13.15.26.tgz#36c3deeab30e97806a658728a155c66fcaa5b944" + integrity sha512-spH26xU080ydGggxRyR1Yhcbgx+j3y5jbNXk/8L+iRvdIEQ4uTRH2Sgf2dokud6Q4oAtsbNvJ1Ft+9xmm6IZcA== vary@^1, vary@^1.1.2: version "1.1.2" @@ -7491,9 +7456,9 @@ walker@^1.0.8: makeerror "1.0.12" watchpack@^2.4.4: - version "2.4.4" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.4.tgz#473bda72f0850453da6425081ea46fc0d7602947" - integrity sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA== + version "2.5.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.5.0.tgz#fa115d5ccaa4bf3aa594f586257c0bc4768939fd" + integrity sha512-e6vZvY6xboSwLz2GD36c16+O/2Z6fKvIf4pOXptw2rY9MVwE/TXc6RGqxD3I3x0a28lwBY7DE+76uTPSsBrrCA== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2"