From a821e37028ba6e36290a291087a4dad3915efd4d Mon Sep 17 00:00:00 2001 From: Philipinho <16838612+Philipinho@users.noreply.github.com> Date: Sat, 16 Mar 2024 22:58:12 +0000 Subject: [PATCH] Refactoring * Refactor workspace membership system * Create setup endpoint * Use Passport.js * Several updates and fixes --- apps/client/package.json | 56 +- apps/server/package.json | 77 +- apps/server/src/app.module.ts | 2 +- .../core/attachment/attachment.controller.ts | 14 +- .../src/core/attachment/attachment.module.ts | 4 +- .../src/core/attachment/attachment.service.ts | 2 +- apps/server/src/core/auth/auth.controller.ts | 34 +- apps/server/src/core/auth/auth.module.ts | 13 +- apps/server/src/core/auth/auth.utils.ts | 8 + .../core/auth/dto/create-admin-user.dto.ts | 15 + .../{user => auth}/dto/create-user.dto.ts | 3 +- apps/server/src/core/auth/dto/jwt-payload.ts | 16 + apps/server/src/core/auth/guards/jwt.guard.ts | 55 - .../src/core/auth/guards/setup.guard.ts | 14 + .../src/core/auth/services/auth.service.ts | 35 +- .../src/core/auth/services/signup.service.ts | 121 + .../src/core/auth/services/token.service.ts | 34 +- .../src/core/auth/strategies/jwt.strategy.ts | 64 + .../casl/abilities/casl-ability.factory.ts | 17 +- .../src/core/casl/guards/policies.guard.ts | 4 +- .../src/core/comment/comment.controller.ts | 11 +- .../server/src/core/comment/comment.module.ts | 3 +- apps/server/src/core/core.module.ts | 19 +- .../core/group/entities/group-user.entity.ts | 2 +- .../server/src/core/group/group.controller.ts | 26 +- apps/server/src/core/group/group.module.ts | 3 +- .../core/group/services/group-user.service.ts | 6 +- .../src/core/group/services/group.service.ts | 8 +- apps/server/src/core/page/page.controller.ts | 10 +- apps/server/src/core/page/page.module.ts | 2 - .../src/core/search/search.controller.ts | 8 +- apps/server/src/core/search/search.module.ts | 3 +- .../src/core/space/dto/create-space.dto.ts | 4 + .../server/src/core/space/dto/space-id.dto.ts | 8 + .../core/space/entities/space-user.entity.ts | 3 +- .../src/core/space/entities/space.entity.ts | 15 +- .../space/repositories/space.repository.ts | 8 +- .../server/src/core/space/space.controller.ts | 57 +- apps/server/src/core/space/space.module.ts | 3 +- apps/server/src/core/space/space.service.ts | 143 +- .../src/core/user/dto/update-user.dto.ts | 2 +- .../src/core/user/entities/user.entity.ts | 32 +- .../core/user/repositories/user.repository.ts | 26 +- apps/server/src/core/user/user.controller.ts | 18 +- apps/server/src/core/user/user.module.ts | 7 +- .../server/src/core/user/user.service.spec.ts | 4 +- apps/server/src/core/user/user.service.ts | 97 +- .../controllers/workspace.controller.ts | 88 +- .../src/core/workspace/dto/invitation.dto.ts | 4 +- .../entities/workspace-user.entity.ts | 52 - .../workspace/entities/workspace.entity.ts | 24 +- .../repositories/workspace-user.repository.ts | 10 - .../repositories/workspace.repository.ts | 21 +- .../services/workspace-invitation.service.ts | 60 +- .../services/workspace-user.service.ts | 190 +- .../workspace/services/workspace.service.ts | 256 +- .../src/core/workspace/workspace.module.ts | 14 +- .../1710168946001-RefactorWorkspaceUser.ts | 22 + .../1710371336371-AddDeletedAtToWorkspace.ts | 14 + ...1710377632898-RemoveUniqueFromUserEmail.ts | 14 + .../1710517114813-AddDefaultRoles.ts | 22 + .../migrations/1710530661379-UniqueUser.ts | 14 + .../migrations/1710615517137-SpaceSlug.ts | 16 + .../src/decorators/auth-user.decorator.ts | 13 +- .../decorators/auth-workspace.decorator.ts | 8 + .../decorators/current-workspace.decorator.ts | 17 - .../src/environment/environment.service.ts | 11 + apps/server/src/guards/jwt-auth.guard.ts | 35 + apps/server/src/helpers/db.helper.ts | 2 +- apps/server/src/helpers/types/permission.ts | 16 + .../workspace.util.ts => helpers/utils.ts} | 0 .../storage/constants/storage.constants.ts | 0 .../storage/drivers/index.ts | 0 .../storage/drivers/local.driver.ts | 0 .../storage/drivers/s3.driver.ts | 0 .../storage/interfaces/index.ts | 0 .../interfaces/storage-driver.interface.ts | 0 .../storage/interfaces/storage.interface.ts | 0 .../storage/providers/storage.provider.ts | 0 .../storage/storage.module.ts | 0 .../storage/storage.service.spec.ts | 0 .../storage/storage.service.ts | 0 .../storage/storage.utils.ts | 0 .../src/middlewares/domain.middleware.ts | 41 + apps/server/tsconfig.json | 2 +- package.json | 8 +- pnpm-lock.yaml | 2920 +++++++++-------- 87 files changed, 2703 insertions(+), 2307 deletions(-) create mode 100644 apps/server/src/core/auth/auth.utils.ts create mode 100644 apps/server/src/core/auth/dto/create-admin-user.dto.ts rename apps/server/src/core/{user => auth}/dto/create-user.dto.ts (88%) create mode 100644 apps/server/src/core/auth/dto/jwt-payload.ts delete mode 100644 apps/server/src/core/auth/guards/jwt.guard.ts create mode 100644 apps/server/src/core/auth/guards/setup.guard.ts create mode 100644 apps/server/src/core/auth/services/signup.service.ts create mode 100644 apps/server/src/core/auth/strategies/jwt.strategy.ts create mode 100644 apps/server/src/core/space/dto/space-id.dto.ts delete mode 100644 apps/server/src/core/workspace/entities/workspace-user.entity.ts delete mode 100644 apps/server/src/core/workspace/repositories/workspace-user.repository.ts create mode 100644 apps/server/src/database/migrations/1710168946001-RefactorWorkspaceUser.ts create mode 100644 apps/server/src/database/migrations/1710371336371-AddDeletedAtToWorkspace.ts create mode 100644 apps/server/src/database/migrations/1710377632898-RemoveUniqueFromUserEmail.ts create mode 100644 apps/server/src/database/migrations/1710517114813-AddDefaultRoles.ts create mode 100644 apps/server/src/database/migrations/1710530661379-UniqueUser.ts create mode 100644 apps/server/src/database/migrations/1710615517137-SpaceSlug.ts create mode 100644 apps/server/src/decorators/auth-workspace.decorator.ts delete mode 100644 apps/server/src/decorators/current-workspace.decorator.ts create mode 100644 apps/server/src/guards/jwt-auth.guard.ts create mode 100644 apps/server/src/helpers/types/permission.ts rename apps/server/src/{core/workspace/workspace.util.ts => helpers/utils.ts} (100%) rename apps/server/src/{core => integrations}/storage/constants/storage.constants.ts (100%) rename apps/server/src/{core => integrations}/storage/drivers/index.ts (100%) rename apps/server/src/{core => integrations}/storage/drivers/local.driver.ts (100%) rename apps/server/src/{core => integrations}/storage/drivers/s3.driver.ts (100%) rename apps/server/src/{core => integrations}/storage/interfaces/index.ts (100%) rename apps/server/src/{core => integrations}/storage/interfaces/storage-driver.interface.ts (100%) rename apps/server/src/{core => integrations}/storage/interfaces/storage.interface.ts (100%) rename apps/server/src/{core => integrations}/storage/providers/storage.provider.ts (100%) rename apps/server/src/{core => integrations}/storage/storage.module.ts (100%) rename apps/server/src/{core => integrations}/storage/storage.service.spec.ts (100%) rename apps/server/src/{core => integrations}/storage/storage.service.ts (100%) rename apps/server/src/{core => integrations}/storage/storage.utils.ts (100%) create mode 100644 apps/server/src/middlewares/domain.middleware.ts diff --git a/apps/client/package.json b/apps/client/package.json index e463d14..57075dd 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -11,49 +11,49 @@ "dependencies": { "@emoji-mart/data": "^1.1.2", "@emoji-mart/react": "^1.1.1", - "@mantine/core": "^7.4.2", - "@mantine/form": "^7.4.2", - "@mantine/hooks": "^7.4.2", - "@mantine/modals": "^7.4.2", - "@mantine/notifications": "^7.4.2", - "@mantine/spotlight": "^7.4.2", - "@tabler/icons-react": "^2.46.0", - "@tanstack/react-query": "^5.17.19", - "axios": "^1.6.5", + "@mantine/core": "^7.6.2", + "@mantine/form": "^7.6.2", + "@mantine/hooks": "^7.6.2", + "@mantine/modals": "^7.6.2", + "@mantine/notifications": "^7.6.2", + "@mantine/spotlight": "^7.6.2", + "@tabler/icons-react": "^3.1.0", + "@tanstack/react-query": "^5.28.4", + "axios": "^1.6.8", "clsx": "^2.1.0", - "date-fns": "^3.3.1", + "date-fns": "^3.5.0", "emoji-mart": "^5.5.2", - "jotai": "^2.6.2", - "jotai-optics": "^0.3.1", + "jotai": "^2.7.1", + "jotai-optics": "^0.3.2", "js-cookie": "^3.0.5", "react": "^18.2.0", "react-arborist": "^3.4.0", "react-dom": "^18.2.0", - "react-router-dom": "^6.21.3", - "socket.io-client": "^4.7.4", + "react-router-dom": "^6.22.3", + "socket.io-client": "^4.7.5", "tippy.js": "^6.3.7", "uuid": "^9.0.1", "zod": "^3.22.4" }, "devDependencies": { - "@tanstack/eslint-plugin-query": "^5.17.20", + "@tanstack/eslint-plugin-query": "^5.27.7", "@types/js-cookie": "^3.0.6", - "@types/node": "20.11.5", - "@types/react": "^18.2.48", - "@types/react-dom": "^18.2.18", - "@types/uuid": "^9.0.7", - "@typescript-eslint/eslint-plugin": "^6.19.0", - "@typescript-eslint/parser": "^6.19.0", + "@types/node": "20.11.28", + "@types/react": "^18.2.66", + "@types/react-dom": "^18.2.22", + "@types/uuid": "^9.0.8", + "@typescript-eslint/eslint-plugin": "^7.2.0", + "@typescript-eslint/parser": "^7.2.0", "@vitejs/plugin-react": "^4.2.1", - "eslint": "^8.56.0", + "eslint": "^8.57.0", "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.5", + "eslint-plugin-react-refresh": "^0.4.6", "optics-ts": "^2.4.1", - "postcss": "^8.4.33", - "postcss-preset-mantine": "^1.12.3", + "postcss": "^8.4.35", + "postcss-preset-mantine": "^1.13.0", "postcss-simple-vars": "^7.0.1", - "prettier": "^3.2.4", - "typescript": "^5.3.3", - "vite": "^5.0.12" + "prettier": "^3.2.5", + "typescript": "^5.4.2", + "vite": "^5.1.6" } } diff --git a/apps/server/package.json b/apps/server/package.json index c6f3fbe..aa42744 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -26,67 +26,70 @@ "migration:show": "pnpm run typeorm migration:show" }, "dependencies": { - "@aws-sdk/client-s3": "^3.456.0", - "@aws-sdk/s3-request-presigner": "^3.456.0", + "@aws-sdk/client-s3": "^3.535.0", + "@aws-sdk/s3-request-presigner": "^3.535.0", "@casl/ability": "^6.7.0", "@fastify/multipart": "^8.1.0", - "@fastify/static": "^6.12.0", - "@nestjs/common": "^10.3.0", - "@nestjs/config": "^3.1.1", - "@nestjs/core": "^10.3.0", + "@fastify/static": "^7.0.1", + "@nestjs/common": "^10.3.3", + "@nestjs/config": "^3.2.0", + "@nestjs/core": "^10.3.3", "@nestjs/jwt": "^10.2.0", - "@nestjs/mapped-types": "^2.0.4", - "@nestjs/platform-fastify": "^10.3.0", - "@nestjs/platform-socket.io": "^10.3.0", - "@nestjs/serve-static": "^4.0.0", - "@nestjs/typeorm": "^10.0.1", - "@nestjs/websockets": "^10.3.0", + "@nestjs/mapped-types": "^2.0.5", + "@nestjs/passport": "^10.0.3", + "@nestjs/platform-fastify": "^10.3.3", + "@nestjs/platform-socket.io": "^10.3.3", + "@nestjs/serve-static": "^4.0.1", + "@nestjs/typeorm": "^10.0.2", + "@nestjs/websockets": "^10.3.3", "bcrypt": "^5.1.1", "bytes": "^3.1.2", "class-transformer": "^0.5.1", - "class-validator": "^0.14.0", - "fastify": "^4.25.2", - "fs-extra": "^11.1.1", + "class-validator": "^0.14.1", + "fastify": "^4.26.2", + "fs-extra": "^11.2.0", "mime-types": "^2.1.35", + "passport-jwt": "^4.0.1", "pg": "^8.11.3", - "pg-tsquery": "^8.4.1", - "reflect-metadata": "^0.1.13", + "pg-tsquery": "^8.4.2", + "reflect-metadata": "^0.2.1", "rxjs": "^7.8.1", "sanitize-filename-ts": "^1.0.2", "slugify": "^1.6.6", - "socket.io": "^4.7.2", - "typeorm": "^0.3.17", + "socket.io": "^4.7.5", + "typeorm": "^0.3.20", "uuid": "^9.0.1", - "ws": "^8.14.2" + "ws": "^8.16.0" }, "devDependencies": { - "@nestjs/cli": "^10.2.1", - "@nestjs/schematics": "^10.0.3", - "@nestjs/testing": "^10.3.0", + "@nestjs/cli": "^10.3.2", + "@nestjs/schematics": "^10.1.1", + "@nestjs/testing": "^10.3.3", "@types/bcrypt": "^5.0.2", "@types/bytes": "^3.1.4", "@types/debounce": "^1.2.4", "@types/fs-extra": "^11.0.4", - "@types/jest": "^29.5.10", + "@types/jest": "^29.5.12", "@types/mime-types": "^2.1.4", - "@types/node": "^20.10.0", - "@types/supertest": "^2.0.16", - "@types/uuid": "^9.0.7", + "@types/node": "^20.11.28", + "@types/passport-jwt": "^4.0.1", + "@types/supertest": "^6.0.2", + "@types/uuid": "^9.0.8", "@types/ws": "^8.5.10", - "@typescript-eslint/eslint-plugin": "^5.62.0", - "@typescript-eslint/parser": "^5.62.0", - "eslint": "^8.54.0", - "eslint-config-prettier": "^8.10.0", - "eslint-plugin-prettier": "^4.2.1", + "@typescript-eslint/eslint-plugin": "^7.2.0", + "@typescript-eslint/parser": "^7.2.0", + "eslint": "^8.57.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.1.3", "jest": "^29.7.0", - "prettier": "^2.8.8", + "prettier": "^3.2.5", "source-map-support": "^0.5.21", - "supertest": "^6.3.3", - "ts-jest": "^29.1.1", + "supertest": "^6.3.4", + "ts-jest": "^29.1.2", "ts-loader": "^9.5.1", - "ts-node": "^10.9.1", + "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", - "typescript": "^5.3.2" + "typescript": "^5.4.2" }, "jest": { "moduleFileExtensions": [ diff --git a/apps/server/src/app.module.ts b/apps/server/src/app.module.ts index 6b7a2a2..e541990 100644 --- a/apps/server/src/app.module.ts +++ b/apps/server/src/app.module.ts @@ -17,7 +17,7 @@ import { join } from 'path'; CollaborationModule, WsModule, ServeStaticModule.forRoot({ - rootPath: join(__dirname, '..', '..', 'client/dist'), + rootPath: join(__dirname, '..', '..', '..', 'client/dist'), }), ], controllers: [AppController], diff --git a/apps/server/src/core/attachment/attachment.controller.ts b/apps/server/src/core/attachment/attachment.controller.ts index e688c7b..d57e1c2 100644 --- a/apps/server/src/core/attachment/attachment.controller.ts +++ b/apps/server/src/core/attachment/attachment.controller.ts @@ -12,18 +12,18 @@ import { import { AttachmentService } from './attachment.service'; import { FastifyReply, FastifyRequest } from 'fastify'; import { AttachmentInterceptor } from './attachment.interceptor'; -import { JwtGuard } from '../auth/guards/jwt.guard'; import * as bytes from 'bytes'; import { AuthUser } from '../../decorators/auth-user.decorator'; import { User } from '../user/entities/user.entity'; -import { CurrentWorkspace } from '../../decorators/current-workspace.decorator'; +import { AuthWorkspace } from '../../decorators/auth-workspace.decorator'; import { Workspace } from '../workspace/entities/workspace.entity'; +import { JwtAuthGuard } from '../../guards/jwt-auth.guard'; @Controller('attachments') export class AttachmentController { constructor(private readonly attachmentService: AttachmentService) {} - @UseGuards(JwtGuard) + @UseGuards(JwtAuthGuard) @HttpCode(HttpStatus.CREATED) @Post('upload/avatar') @UseInterceptors(AttachmentInterceptor) @@ -50,7 +50,7 @@ export class AttachmentController { } } - @UseGuards(JwtGuard) + @UseGuards(JwtAuthGuard) @HttpCode(HttpStatus.CREATED) @Post('upload/workspace-logo') @UseInterceptors(AttachmentInterceptor) @@ -58,7 +58,7 @@ export class AttachmentController { @Req() req: FastifyRequest, @Res() res: FastifyReply, @AuthUser() user: User, - @CurrentWorkspace() workspace: Workspace, + @AuthWorkspace() workspace: Workspace, ) { const maxFileSize = bytes('5MB'); @@ -79,7 +79,7 @@ export class AttachmentController { } } - @UseGuards(JwtGuard) + @UseGuards(JwtAuthGuard) @HttpCode(HttpStatus.CREATED) @Post('upload/file') @UseInterceptors(AttachmentInterceptor) @@ -87,7 +87,7 @@ export class AttachmentController { @Req() req: FastifyRequest, @Res() res: FastifyReply, @AuthUser() user: User, - @CurrentWorkspace() workspace: Workspace, + @AuthWorkspace() workspace: Workspace, ) { const maxFileSize = bytes('20MB'); diff --git a/apps/server/src/core/attachment/attachment.module.ts b/apps/server/src/core/attachment/attachment.module.ts index 8a7906c..8e5df45 100644 --- a/apps/server/src/core/attachment/attachment.module.ts +++ b/apps/server/src/core/attachment/attachment.module.ts @@ -1,11 +1,10 @@ import { Module } from '@nestjs/common'; import { AttachmentService } from './attachment.service'; import { AttachmentController } from './attachment.controller'; -import { StorageModule } from '../storage/storage.module'; +import { StorageModule } from '../../integrations/storage/storage.module'; import { TypeOrmModule } from '@nestjs/typeorm'; import { Attachment } from './entities/attachment.entity'; import { AttachmentRepository } from './repositories/attachment.repository'; -import { AuthModule } from '../auth/auth.module'; import { UserModule } from '../user/user.module'; import { WorkspaceModule } from '../workspace/workspace.module'; @@ -13,7 +12,6 @@ import { WorkspaceModule } from '../workspace/workspace.module'; imports: [ TypeOrmModule.forFeature([Attachment]), StorageModule, - AuthModule, UserModule, WorkspaceModule, ], diff --git a/apps/server/src/core/attachment/attachment.service.ts b/apps/server/src/core/attachment/attachment.service.ts index b50c16f..d7c78d5 100644 --- a/apps/server/src/core/attachment/attachment.service.ts +++ b/apps/server/src/core/attachment/attachment.service.ts @@ -1,5 +1,5 @@ import { BadRequestException, Injectable } from '@nestjs/common'; -import { StorageService } from '../storage/storage.service'; +import { StorageService } from '../../integrations/storage/storage.service'; import { MultipartFile } from '@fastify/multipart'; import { AttachmentRepository } from './repositories/attachment.repository'; import { Attachment } from './entities/attachment.entity'; diff --git a/apps/server/src/core/auth/auth.controller.ts b/apps/server/src/core/auth/auth.controller.ts index 65becf9..f34f5a7 100644 --- a/apps/server/src/core/auth/auth.controller.ts +++ b/apps/server/src/core/auth/auth.controller.ts @@ -1,27 +1,47 @@ import { Body, Controller, - Get, HttpCode, HttpStatus, + NotFoundException, Post, + Req, + UseGuards, } from '@nestjs/common'; import { LoginDto } from './dto/login.dto'; import { AuthService } from './services/auth.service'; -import { CreateUserDto } from '../user/dto/create-user.dto'; +import { CreateUserDto } from './dto/create-user.dto'; +import { SetupGuard } from './guards/setup.guard'; +import { EnvironmentService } from '../../environment/environment.service'; +import { CreateAdminUserDto } from './dto/create-admin-user.dto'; @Controller('auth') export class AuthController { - constructor(private authService: AuthService) {} + constructor( + private authService: AuthService, + private environmentService: EnvironmentService, + ) {} + @HttpCode(HttpStatus.OK) @Post('login') - async login(@Body() loginInput: LoginDto) { - return await this.authService.login(loginInput); + async login(@Req() req, @Body() loginInput: LoginDto) { + return this.authService.login(loginInput, req.raw.workspaceId); } @HttpCode(HttpStatus.OK) @Post('register') - async register(@Body() createUserDto: CreateUserDto) { - return await this.authService.register(createUserDto); + async register(@Req() req, @Body() createUserDto: CreateUserDto) { + return this.authService.register(createUserDto, req.raw.workspaceId); + } + + @UseGuards(SetupGuard) + @HttpCode(HttpStatus.OK) + @Post('setup') + async setupWorkspace( + @Req() req, + @Body() createAdminUserDto: CreateAdminUserDto, + ) { + if (this.environmentService.isCloud()) throw new NotFoundException(); + return this.authService.setup(createAdminUserDto); } } diff --git a/apps/server/src/core/auth/auth.module.ts b/apps/server/src/core/auth/auth.module.ts index 6041b07..5f2fcff 100644 --- a/apps/server/src/core/auth/auth.module.ts +++ b/apps/server/src/core/auth/auth.module.ts @@ -4,13 +4,17 @@ import { AuthService } from './services/auth.service'; import { JwtModule } from '@nestjs/jwt'; import { EnvironmentService } from '../../environment/environment.service'; import { TokenService } from './services/token.service'; +import { JwtStrategy } from './strategies/jwt.strategy'; +import { WorkspaceModule } from '../workspace/workspace.module'; +import { SignupService } from './services/signup.service'; +import { UserModule } from '../user/user.module'; +import { SpaceModule } from '../space/space.module'; @Module({ imports: [ JwtModule.registerAsync({ useFactory: async (environmentService: EnvironmentService) => { return { - global: true, secret: environmentService.getJwtSecret(), signOptions: { expiresIn: environmentService.getJwtTokenExpiresIn(), @@ -18,10 +22,13 @@ import { TokenService } from './services/token.service'; }; }, inject: [EnvironmentService], - }), + } as any), + UserModule, + WorkspaceModule, + SpaceModule, ], controllers: [AuthController], - providers: [AuthService, TokenService], + providers: [AuthService, SignupService, TokenService, JwtStrategy], exports: [TokenService], }) export class AuthModule {} diff --git a/apps/server/src/core/auth/auth.utils.ts b/apps/server/src/core/auth/auth.utils.ts new file mode 100644 index 0000000..308f1a9 --- /dev/null +++ b/apps/server/src/core/auth/auth.utils.ts @@ -0,0 +1,8 @@ +import * as bcrypt from 'bcrypt'; + +export async function comparePasswordHash( + plainPassword: string, + passwordHash: string, +): Promise { + return bcrypt.compare(plainPassword, passwordHash); +} diff --git a/apps/server/src/core/auth/dto/create-admin-user.dto.ts b/apps/server/src/core/auth/dto/create-admin-user.dto.ts new file mode 100644 index 0000000..c85cd3c --- /dev/null +++ b/apps/server/src/core/auth/dto/create-admin-user.dto.ts @@ -0,0 +1,15 @@ +import { IsNotEmpty, IsString, MaxLength, MinLength } from 'class-validator'; +import { CreateUserDto } from './create-user.dto'; + +export class CreateAdminUserDto extends CreateUserDto { + @IsNotEmpty() + @MinLength(3) + @MaxLength(35) + name: string; + + @IsNotEmpty() + @MinLength(4) + @MaxLength(35) + @IsString() + workspaceName: string; +} diff --git a/apps/server/src/core/user/dto/create-user.dto.ts b/apps/server/src/core/auth/dto/create-user.dto.ts similarity index 88% rename from apps/server/src/core/user/dto/create-user.dto.ts rename to apps/server/src/core/auth/dto/create-user.dto.ts index 92c1a45..0cd477e 100644 --- a/apps/server/src/core/user/dto/create-user.dto.ts +++ b/apps/server/src/core/auth/dto/create-user.dto.ts @@ -2,13 +2,14 @@ import { IsEmail, IsNotEmpty, IsOptional, - IsString, + IsString, MaxLength, MinLength, } from 'class-validator'; export class CreateUserDto { @IsOptional() @MinLength(3) + @MaxLength(35) @IsString() name: string; diff --git a/apps/server/src/core/auth/dto/jwt-payload.ts b/apps/server/src/core/auth/dto/jwt-payload.ts new file mode 100644 index 0000000..660cf6c --- /dev/null +++ b/apps/server/src/core/auth/dto/jwt-payload.ts @@ -0,0 +1,16 @@ +export enum JwtType { + ACCESS = 'access', + REFRESH = 'refresh', +} +export type JwtPayload = { + sub: string; + email: string; + workspaceId: string; + type: 'access'; +}; + +export type JwtRefreshPayload = { + sub: string; + workspaceId: string; + type: 'refresh'; +}; diff --git a/apps/server/src/core/auth/guards/jwt.guard.ts b/apps/server/src/core/auth/guards/jwt.guard.ts deleted file mode 100644 index 1277557..0000000 --- a/apps/server/src/core/auth/guards/jwt.guard.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { - CanActivate, - ExecutionContext, - Injectable, - UnauthorizedException, -} from '@nestjs/common'; -import { TokenService } from '../services/token.service'; -import { UserService } from '../../user/user.service'; -import { Reflector } from '@nestjs/core'; -import { IS_PUBLIC_KEY } from '../../../decorators/public.decorator'; - -@Injectable() -export class JwtGuard implements CanActivate { - constructor( - private tokenService: TokenService, - private userService: UserService, - private reflector: Reflector, - ) {} - async canActivate(context: ExecutionContext): Promise { - const isPublic = this.reflector.getAllAndOverride(IS_PUBLIC_KEY, [ - context.getHandler(), - context.getClass(), - ]); - - if (isPublic) { - return true; - } - - const request = context.switchToHttp().getRequest(); - const token: string = await this.tokenService.extractTokenFromHeader( - request, - ); - - if (!token) { - throw new UnauthorizedException('Invalid jwt token'); - } - - let payload; - - try { - payload = await this.tokenService.verifyJwt(token); - } catch (error) { - throw new UnauthorizedException('Could not verify jwt token'); - } - - try { - //fetch user and current workspace data from db - request['user'] = await this.userService.getUserInstance(payload.sub); - } catch (error) { - throw new UnauthorizedException('Failed to fetch auth user'); - } - - return true; - } -} diff --git a/apps/server/src/core/auth/guards/setup.guard.ts b/apps/server/src/core/auth/guards/setup.guard.ts new file mode 100644 index 0000000..534b937 --- /dev/null +++ b/apps/server/src/core/auth/guards/setup.guard.ts @@ -0,0 +1,14 @@ +import { CanActivate, ForbiddenException, Injectable } from '@nestjs/common'; +import { WorkspaceRepository } from '../../workspace/repositories/workspace.repository'; + +@Injectable() +export class SetupGuard implements CanActivate { + constructor(private workspaceRepository: WorkspaceRepository) {} + async canActivate(): Promise { + const workspaceCount = await this.workspaceRepository.count(); + if (workspaceCount > 0) { + throw new ForbiddenException('Workspace setup already completed.'); + } + return true; + } +} diff --git a/apps/server/src/core/auth/services/auth.service.ts b/apps/server/src/core/auth/services/auth.service.ts index 0471920..06bbc61 100644 --- a/apps/server/src/core/auth/services/auth.service.ts +++ b/apps/server/src/core/auth/services/auth.service.ts @@ -1,38 +1,57 @@ import { Injectable, UnauthorizedException } from '@nestjs/common'; import { LoginDto } from '../dto/login.dto'; import { User } from '../../user/entities/user.entity'; -import { CreateUserDto } from '../../user/dto/create-user.dto'; +import { CreateUserDto } from '../dto/create-user.dto'; import { UserService } from '../../user/user.service'; import { TokenService } from './token.service'; import { TokensDto } from '../dto/tokens.dto'; +import { UserRepository } from '../../user/repositories/user.repository'; +import { comparePasswordHash } from '../auth.utils'; +import { SignupService } from './signup.service'; +import { CreateAdminUserDto } from '../dto/create-admin-user.dto'; @Injectable() export class AuthService { constructor( private userService: UserService, + private signupService: SignupService, private tokenService: TokenService, + private userRepository: UserRepository, ) {} - async login(loginDto: LoginDto) { - const user: User = await this.userService.findByEmail(loginDto.email); - const invalidCredentialsMessage = 'email or password does not match'; + async login(loginDto: LoginDto, workspaceId: string) { + const user = await this.userRepository.findOneByEmail( + loginDto.email, + workspaceId, + ); if ( !user || - !(await this.userService.compareHash(loginDto.password, user.password)) + !(await comparePasswordHash(loginDto.password, user.password)) ) { - throw new UnauthorizedException(invalidCredentialsMessage); + throw new UnauthorizedException('email or password does not match'); } user.lastLoginAt = new Date(); + await this.userRepository.save(user); + + const tokens: TokensDto = await this.tokenService.generateTokens(user); + return { tokens }; + } + + async register(createUserDto: CreateUserDto, workspaceId: string) { + const user: User = await this.signupService.signup( + createUserDto, + workspaceId, + ); const tokens: TokensDto = await this.tokenService.generateTokens(user); return { tokens }; } - async register(createUserDto: CreateUserDto) { - const user: User = await this.userService.create(createUserDto); + async setup(createAdminUserDto: CreateAdminUserDto) { + const user: User = await this.signupService.firstSetup(createAdminUserDto); const tokens: TokensDto = await this.tokenService.generateTokens(user); diff --git a/apps/server/src/core/auth/services/signup.service.ts b/apps/server/src/core/auth/services/signup.service.ts new file mode 100644 index 0000000..b867f55 --- /dev/null +++ b/apps/server/src/core/auth/services/signup.service.ts @@ -0,0 +1,121 @@ +import { BadRequestException, Injectable } from '@nestjs/common'; +import { CreateUserDto } from '../dto/create-user.dto'; +import { DataSource, EntityManager } from 'typeorm'; +import { User } from '../../user/entities/user.entity'; +import { transactionWrapper } from '../../../helpers/db.helper'; +import { UserRepository } from '../../user/repositories/user.repository'; +import { WorkspaceRepository } from '../../workspace/repositories/workspace.repository'; +import { WorkspaceService } from '../../workspace/services/workspace.service'; +import { CreateWorkspaceDto } from '../../workspace/dto/create-workspace.dto'; +import { Workspace } from '../../workspace/entities/workspace.entity'; +import { SpaceService } from '../../space/space.service'; +import { CreateAdminUserDto } from '../dto/create-admin-user.dto'; + +@Injectable() +export class SignupService { + constructor( + private userRepository: UserRepository, + private workspaceRepository: WorkspaceRepository, + private workspaceService: WorkspaceService, + private spaceService: SpaceService, + private dataSource: DataSource, + ) {} + + prepareUser(createUserDto: CreateUserDto): User { + const user = new User(); + user.name = createUserDto.name || createUserDto.email.split('@')[0]; + user.email = createUserDto.email.toLowerCase(); + user.password = createUserDto.password; + user.locale = 'en'; + user.lastLoginAt = new Date(); + return user; + } + + async createUser( + createUserDto: CreateUserDto, + manager?: EntityManager, + ): Promise { + return await transactionWrapper( + async (transactionManager: EntityManager) => { + let user = this.prepareUser(createUserDto); + user = await transactionManager.save(user); + + return user; + }, + this.dataSource, + manager, + ); + } + + async signup( + createUserDto: CreateUserDto, + workspaceId: string, + manager?: EntityManager, + ): Promise { + const userCheck = await this.userRepository.findOneByEmail( + createUserDto.email, + workspaceId, + ); + if (userCheck) { + throw new BadRequestException('You have an account on this workspace'); + } + + return await transactionWrapper( + async (manager: EntityManager) => { + // create user + const user = await this.createUser(createUserDto, manager); + + // add user to workspace + await this.workspaceService.addUserToWorkspace( + user, + workspaceId, + undefined, + manager, + ); + return user; + }, + this.dataSource, + manager, + ); + } + + async createWorkspace( + user: User, + workspaceName, + manager?: EntityManager, + ): Promise { + return await transactionWrapper( + async (manager: EntityManager) => { + // for cloud + const workspaceData: CreateWorkspaceDto = { + name: workspaceName, + // hostname: '', // generate + }; + + return await this.workspaceService.create(user, workspaceData, manager); + }, + this.dataSource, + manager, + ); + } + + async firstSetup( + createAdminUserDto: CreateAdminUserDto, + manager?: EntityManager, + ): Promise { + return await transactionWrapper( + async (manager: EntityManager) => { + // create user + const user = await this.createUser(createAdminUserDto, manager); + await this.createWorkspace( + user, + createAdminUserDto.workspaceName, + manager, + ); + return user; + }, + this.dataSource, + manager, + ); + } +} diff --git a/apps/server/src/core/auth/services/token.service.ts b/apps/server/src/core/auth/services/token.service.ts index aeb1b13..4493dc6 100644 --- a/apps/server/src/core/auth/services/token.service.ts +++ b/apps/server/src/core/auth/services/token.service.ts @@ -2,10 +2,8 @@ import { Injectable } from '@nestjs/common'; import { JwtService } from '@nestjs/jwt'; import { EnvironmentService } from '../../../environment/environment.service'; import { User } from '../../user/entities/user.entity'; -import { FastifyRequest } from 'fastify'; import { TokensDto } from '../dto/tokens.dto'; - -export type JwtPayload = { sub: string; email: string }; +import { JwtPayload, JwtRefreshPayload, JwtType } from '../dto/jwt-payload'; @Injectable() export class TokenService { @@ -13,31 +11,37 @@ export class TokenService { private jwtService: JwtService, private environmentService: EnvironmentService, ) {} - async generateJwt(user: User): Promise { + + async generateAccessToken(user: User): Promise { const payload: JwtPayload = { sub: user.id, email: user.email, + workspaceId: user.workspaceId, + type: JwtType.ACCESS, }; - return await this.jwtService.signAsync(payload); + return this.jwtService.sign(payload); + } + + async generateRefreshToken(userId: string, workspaceId): Promise { + const payload: JwtRefreshPayload = { + sub: userId, + workspaceId, + type: JwtType.REFRESH, + }; + const expiresIn = '30d'; // todo: fix + return this.jwtService.sign(payload, { expiresIn }); } async generateTokens(user: User): Promise { return { - accessToken: await this.generateJwt(user), - refreshToken: null, + accessToken: await this.generateAccessToken(user), + refreshToken: await this.generateRefreshToken(user.id, user.workspaceId), }; } async verifyJwt(token: string) { - return await this.jwtService.verifyAsync(token, { + return this.jwtService.verifyAsync(token, { secret: this.environmentService.getJwtSecret(), }); } - - async extractTokenFromHeader( - request: FastifyRequest, - ): Promise { - const [type, token] = request.headers.authorization?.split(' ') ?? []; - return type === 'Bearer' ? token : undefined; - } } diff --git a/apps/server/src/core/auth/strategies/jwt.strategy.ts b/apps/server/src/core/auth/strategies/jwt.strategy.ts new file mode 100644 index 0000000..18dcb3e --- /dev/null +++ b/apps/server/src/core/auth/strategies/jwt.strategy.ts @@ -0,0 +1,64 @@ +import { + BadRequestException, + Injectable, + UnauthorizedException, +} from '@nestjs/common'; +import { PassportStrategy } from '@nestjs/passport'; +import { ExtractJwt, Strategy } from 'passport-jwt'; +import { EnvironmentService } from '../../../environment/environment.service'; +import { JwtPayload, JwtType } from '../dto/jwt-payload'; +import { AuthService } from '../services/auth.service'; +import { UserRepository } from '../../user/repositories/user.repository'; +import { UserService } from '../../user/user.service'; +import { WorkspaceRepository } from '../../workspace/repositories/workspace.repository'; + +@Injectable() +export class JwtStrategy extends PassportStrategy(Strategy, 'jwt') { + constructor( + private authService: AuthService, + private userService: UserService, + private userRepository: UserRepository, + private workspaceRepository: WorkspaceRepository, + private readonly environmentService: EnvironmentService, + ) { + super({ + jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), + ignoreExpiration: false, + secretOrKey: environmentService.getJwtSecret(), + passReqToCallback: true, + }); + } + + async validate(req, payload: JwtPayload) { + // CLOUD ENV + if (this.environmentService.isCloud()) { + if (req.raw.workspaceId && req.raw.workspaceId !== payload.workspaceId) { + throw new BadRequestException('Workspace does not match'); + } + } + + if (!payload.workspaceId || payload.type !== JwtType.ACCESS) { + throw new UnauthorizedException(); + } + + const workspace = await this.workspaceRepository.findById( + payload.workspaceId, + ); + + if (!workspace) { + throw new UnauthorizedException(); + } + const user = await this.userRepository.findOne({ + where: { + id: payload.sub, + workspaceId: payload.workspaceId, + }, + }); + + if (!user) { + throw new UnauthorizedException(); + } + + return { user, workspace }; + } +} diff --git a/apps/server/src/core/casl/abilities/casl-ability.factory.ts b/apps/server/src/core/casl/abilities/casl-ability.factory.ts index b36b835..d0862fe 100644 --- a/apps/server/src/core/casl/abilities/casl-ability.factory.ts +++ b/apps/server/src/core/casl/abilities/casl-ability.factory.ts @@ -9,9 +9,8 @@ import { import { User } from '../../user/entities/user.entity'; import { Action } from '../ability.action'; import { Workspace } from '../../workspace/entities/workspace.entity'; -import { WorkspaceUser } from '../../workspace/entities/workspace-user.entity'; import { WorkspaceInvitation } from '../../workspace/entities/workspace-invitation.entity'; -import { Role } from '../../../helpers/types/permission'; +import { UserRole } from '../../../helpers/types/permission'; import { Group } from '../../group/entities/group.entity'; import { GroupUser } from '../../group/entities/group-user.entity'; import { Attachment } from '../../attachment/entities/attachment.entity'; @@ -23,7 +22,6 @@ import { Comment } from '../../comment/entities/comment.entity'; export type Subjects = | InferSubjects< | typeof Workspace - | typeof WorkspaceUser | typeof WorkspaceInvitation | typeof Space | typeof SpaceUser @@ -34,6 +32,7 @@ export type Subjects = | typeof Page | typeof User > + | 'workspaceUser' | 'all'; export type AppAbility = MongoAbility<[Action, Subjects]>; @@ -42,13 +41,13 @@ export default class CaslAbilityFactory { createForWorkspace(user: User, workspace: Workspace) { const { can, build } = new AbilityBuilder(createMongoAbility); - const userRole = workspace?.workspaceUser.role; - console.log(userRole); + const userRole = user.role; - if (userRole === Role.OWNER) { + if (userRole === UserRole.OWNER || userRole === UserRole.ADMIN) { // Workspace Users can([Action.Manage], Workspace); - can([Action.Manage], WorkspaceUser); + can([Action.Manage], 'workspaceUser'); + can([Action.Manage], WorkspaceInvitation); // Groups @@ -59,8 +58,8 @@ export default class CaslAbilityFactory { can([Action.Manage], Attachment); } - if (userRole === Role.MEMBER) { - can([Action.Read], WorkspaceUser); + if (userRole === UserRole.MEMBER) { + // can([Action.Read], WorkspaceUser); // Groups can([Action.Read], Group); diff --git a/apps/server/src/core/casl/guards/policies.guard.ts b/apps/server/src/core/casl/guards/policies.guard.ts index 6215160..2ba18e0 100644 --- a/apps/server/src/core/casl/guards/policies.guard.ts +++ b/apps/server/src/core/casl/guards/policies.guard.ts @@ -21,8 +21,8 @@ export class PoliciesGuard implements CanActivate { ) || []; const request = context.switchToHttp().getRequest(); - const user = request['user'].user; - const workspace = request['user'].workspace; + const user = request.user.user; + const workspace = request.user.workspace; const ability = this.caslAbilityFactory.createForWorkspace(user, workspace); diff --git a/apps/server/src/core/comment/comment.controller.ts b/apps/server/src/core/comment/comment.controller.ts index 83354e7..2e4646f 100644 --- a/apps/server/src/core/comment/comment.controller.ts +++ b/apps/server/src/core/comment/comment.controller.ts @@ -9,16 +9,15 @@ import { import { CommentService } from './comment.service'; import { CreateCommentDto } from './dto/create-comment.dto'; import { UpdateCommentDto } from './dto/update-comment.dto'; -import { JwtGuard } from '../auth/guards/jwt.guard'; import { CommentsInput, SingleCommentInput } from './dto/comments.input'; import { ResolveCommentDto } from './dto/resolve-comment.dto'; -import { WorkspaceService } from '../workspace/services/workspace.service'; import { AuthUser } from '../../decorators/auth-user.decorator'; import { User } from '../user/entities/user.entity'; -import { CurrentWorkspace } from '../../decorators/current-workspace.decorator'; +import { AuthWorkspace } from '../../decorators/auth-workspace.decorator'; import { Workspace } from '../workspace/entities/workspace.entity'; +import { JwtAuthGuard } from '../../guards/jwt-auth.guard'; -@UseGuards(JwtGuard) +@UseGuards(JwtAuthGuard) @Controller('comments') export class CommentController { constructor(private readonly commentService: CommentService) {} @@ -28,7 +27,7 @@ export class CommentController { async create( @Body() createCommentDto: CreateCommentDto, @AuthUser() user: User, - @CurrentWorkspace() workspace: Workspace, + @AuthWorkspace() workspace: Workspace, ) { return this.commentService.create(user.id, workspace.id, createCommentDto); } @@ -40,7 +39,7 @@ export class CommentController { } @HttpCode(HttpStatus.OK) - @Post('view') + @Post('info') findOne(@Body() input: SingleCommentInput) { return this.commentService.findWithCreator(input.id); } diff --git a/apps/server/src/core/comment/comment.module.ts b/apps/server/src/core/comment/comment.module.ts index 23f5a0c..a394984 100644 --- a/apps/server/src/core/comment/comment.module.ts +++ b/apps/server/src/core/comment/comment.module.ts @@ -3,12 +3,11 @@ import { CommentService } from './comment.service'; import { CommentController } from './comment.controller'; import { CommentRepository } from './repositories/comment.repository'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { AuthModule } from '../auth/auth.module'; import { Comment } from './entities/comment.entity'; import { PageModule } from '../page/page.module'; @Module({ - imports: [TypeOrmModule.forFeature([Comment]), AuthModule, PageModule], + imports: [TypeOrmModule.forFeature([Comment]), PageModule], controllers: [CommentController], providers: [CommentService, CommentRepository], exports: [CommentService, CommentRepository], diff --git a/apps/server/src/core/core.module.ts b/apps/server/src/core/core.module.ts index 75eb031..0e0ab3f 100644 --- a/apps/server/src/core/core.module.ts +++ b/apps/server/src/core/core.module.ts @@ -1,9 +1,14 @@ -import { Module } from '@nestjs/common'; +import { + MiddlewareConsumer, + Module, + NestModule, + RequestMethod, +} from '@nestjs/common'; import { UserModule } from './user/user.module'; import { AuthModule } from './auth/auth.module'; import { WorkspaceModule } from './workspace/workspace.module'; import { PageModule } from './page/page.module'; -import { StorageModule } from './storage/storage.module'; +import { StorageModule } from '../integrations/storage/storage.module'; import { AttachmentModule } from './attachment/attachment.module'; import { EnvironmentModule } from '../environment/environment.module'; import { CommentModule } from './comment/comment.module'; @@ -11,6 +16,7 @@ import { SearchModule } from './search/search.module'; import { SpaceModule } from './space/space.module'; import { GroupModule } from './group/group.module'; import { CaslModule } from './casl/casl.module'; +import { DomainMiddleware } from '../middlewares/domain.middleware'; @Module({ imports: [ @@ -29,4 +35,11 @@ import { CaslModule } from './casl/casl.module'; CaslModule, ], }) -export class CoreModule {} +export class CoreModule implements NestModule { + configure(consumer: MiddlewareConsumer) { + consumer + .apply(DomainMiddleware) + .exclude({ path: 'auth/setup', method: RequestMethod.POST }) + .forRoutes('*'); + } +} diff --git a/apps/server/src/core/group/entities/group-user.entity.ts b/apps/server/src/core/group/entities/group-user.entity.ts index c1cd53d..cd13b5c 100644 --- a/apps/server/src/core/group/entities/group-user.entity.ts +++ b/apps/server/src/core/group/entities/group-user.entity.ts @@ -20,7 +20,7 @@ export class GroupUser { @Column() userId: string; - @ManyToOne(() => User, (user) => user.workspaceUsers, { + @ManyToOne(() => User, (user) => user.groups, { onDelete: 'CASCADE', }) @JoinColumn({ name: 'userId' }) diff --git a/apps/server/src/core/group/group.controller.ts b/apps/server/src/core/group/group.controller.ts index c48fbd4..0bb2653 100644 --- a/apps/server/src/core/group/group.controller.ts +++ b/apps/server/src/core/group/group.controller.ts @@ -8,9 +8,8 @@ import { } from '@nestjs/common'; import { GroupService } from './services/group.service'; import { CreateGroupDto } from './dto/create-group.dto'; -import { JwtGuard } from '../auth/guards/jwt.guard'; import { AuthUser } from '../../decorators/auth-user.decorator'; -import { CurrentWorkspace } from '../../decorators/current-workspace.decorator'; +import { AuthWorkspace } from '../../decorators/auth-workspace.decorator'; import { User } from '../user/entities/user.entity'; import { Workspace } from '../workspace/entities/workspace.entity'; import { GroupUserService } from './services/group-user.service'; @@ -25,8 +24,9 @@ import { GroupUser } from './entities/group-user.entity'; import { PoliciesGuard } from '../casl/guards/policies.guard'; import { CheckPolicies } from '../casl/decorators/policies.decorator'; import { AppAbility } from '../casl/abilities/casl-ability.factory'; +import { JwtAuthGuard } from '../../guards/jwt-auth.guard'; -@UseGuards(JwtGuard) +@UseGuards(JwtAuthGuard) @Controller('groups') export class GroupController { constructor( @@ -39,21 +39,21 @@ export class GroupController { getWorkspaceGroups( @Body() pagination: PaginationOptions, @AuthUser() user: User, - @CurrentWorkspace() workspace: Workspace, + @AuthWorkspace() workspace: Workspace, ) { - return this.groupService.getGroupsInWorkspace(workspace.id, pagination); + return this.groupService.getWorkspaceGroups(workspace.id, pagination); } @UseGuards(PoliciesGuard) @CheckPolicies((ability: AppAbility) => ability.can(Action.Read, Group)) @HttpCode(HttpStatus.OK) - @Post('/details') + @Post('/info') getGroup( @Body() groupIdDto: GroupIdDto, @AuthUser() user: User, - @CurrentWorkspace() workspace: Workspace, + @AuthWorkspace() workspace: Workspace, ) { - return this.groupService.getGroup(groupIdDto.groupId, workspace.id); + return this.groupService.getGroupInfo(groupIdDto.groupId, workspace.id); } @UseGuards(PoliciesGuard) @@ -63,7 +63,7 @@ export class GroupController { createGroup( @Body() createGroupDto: CreateGroupDto, @AuthUser() user: User, - @CurrentWorkspace() workspace: Workspace, + @AuthWorkspace() workspace: Workspace, ) { return this.groupService.createGroup(user, workspace.id, createGroupDto); } @@ -75,7 +75,7 @@ export class GroupController { updateGroup( @Body() updateGroupDto: UpdateGroupDto, @AuthUser() user: User, - @CurrentWorkspace() workspace: Workspace, + @AuthWorkspace() workspace: Workspace, ) { return this.groupService.updateGroup(workspace.id, updateGroupDto); } @@ -87,7 +87,7 @@ export class GroupController { getGroupMembers( @Body() groupIdDto: GroupIdDto, @Body() pagination: PaginationOptions, - @CurrentWorkspace() workspace: Workspace, + @AuthWorkspace() workspace: Workspace, ) { return this.groupUserService.getGroupUsers( groupIdDto.groupId, @@ -103,7 +103,7 @@ export class GroupController { addGroupMember( @Body() addGroupUserDto: AddGroupUserDto, @AuthUser() user: User, - @CurrentWorkspace() workspace: Workspace, + @AuthWorkspace() workspace: Workspace, ) { return this.groupUserService.addUserToGroup( addGroupUserDto.userId, @@ -134,7 +134,7 @@ export class GroupController { deleteGroup( @Body() groupIdDto: GroupIdDto, @AuthUser() user: User, - @CurrentWorkspace() workspace: Workspace, + @AuthWorkspace() workspace: Workspace, ) { return this.groupService.deleteGroup(groupIdDto.groupId, workspace.id); } diff --git a/apps/server/src/core/group/group.module.ts b/apps/server/src/core/group/group.module.ts index 8095f70..46d1752 100644 --- a/apps/server/src/core/group/group.module.ts +++ b/apps/server/src/core/group/group.module.ts @@ -2,7 +2,6 @@ import { Module } from '@nestjs/common'; import { GroupService } from './services/group.service'; import { GroupController } from './group.controller'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { AuthModule } from '../auth/auth.module'; import { Group } from './entities/group.entity'; import { GroupUser } from './entities/group-user.entity'; import { GroupRepository } from './respositories/group.repository'; @@ -10,7 +9,7 @@ import { GroupUserRepository } from './respositories/group-user.repository'; import { GroupUserService } from './services/group-user.service'; @Module({ - imports: [TypeOrmModule.forFeature([Group, GroupUser]), AuthModule], + imports: [TypeOrmModule.forFeature([Group, GroupUser])], controllers: [GroupController], providers: [ GroupService, diff --git a/apps/server/src/core/group/services/group-user.service.ts b/apps/server/src/core/group/services/group-user.service.ts index f42272e..e41507b 100644 --- a/apps/server/src/core/group/services/group-user.service.ts +++ b/apps/server/src/core/group/services/group-user.service.ts @@ -6,7 +6,6 @@ import { import { DataSource, EntityManager } from 'typeorm'; import { GroupUserRepository } from '../respositories/group-user.repository'; import { PaginationOptions } from '../../../helpers/pagination/pagination-options'; -import { WorkspaceUser } from '../../workspace/entities/workspace-user.entity'; import { transactionWrapper } from '../../../helpers/db.helper'; import { User } from '../../user/entities/user.entity'; import { GroupUser } from '../entities/group-user.entity'; @@ -55,9 +54,10 @@ export class GroupUserService { groupId: string, workspaceId: string, manager?: EntityManager, - ): Promise { + ): Promise { let addedUser; + /* await transactionWrapper( async (manager) => { const group = await manager.findOneBy(Group, { @@ -106,7 +106,7 @@ export class GroupUserService { this.dataSource, manager, ); - +*/ return addedUser; } diff --git a/apps/server/src/core/group/services/group.service.ts b/apps/server/src/core/group/services/group.service.ts index 084ed3e..3182b20 100644 --- a/apps/server/src/core/group/services/group.service.ts +++ b/apps/server/src/core/group/services/group.service.ts @@ -49,7 +49,7 @@ export class GroupService { return await this.groupRepository.save(group); } - async getGroup(groupId: string, workspaceId: string): Promise { + async getGroupInfo(groupId: string, workspaceId: string): Promise { const group = await this.groupRepository .createQueryBuilder('group') .where('group.id = :groupId', { groupId }) @@ -68,11 +68,11 @@ export class GroupService { return group; } - async getGroupsInWorkspace( + async getWorkspaceGroups( workspaceId: string, paginationOptions: PaginationOptions, ): Promise> { - const [groupsInWorkspace, count] = await this.groupRepository + const [groups, count] = await this.groupRepository .createQueryBuilder('group') .where('group.workspaceId = :workspaceId', { workspaceId }) .loadRelationCountAndMap( @@ -86,7 +86,7 @@ export class GroupService { const paginationMeta = new PaginationMetaDto({ count, paginationOptions }); - return new PaginatedResult(groupsInWorkspace, paginationMeta); + return new PaginatedResult(groups, paginationMeta); } async deleteGroup(groupId: string, workspaceId: string): Promise { diff --git a/apps/server/src/core/page/page.controller.ts b/apps/server/src/core/page/page.controller.ts index 810451b..33e7773 100644 --- a/apps/server/src/core/page/page.controller.ts +++ b/apps/server/src/core/page/page.controller.ts @@ -9,7 +9,6 @@ import { import { PageService } from './services/page.service'; import { CreatePageDto } from './dto/create-page.dto'; import { UpdatePageDto } from './dto/update-page.dto'; -import { JwtGuard } from '../auth/guards/jwt.guard'; import { MovePageDto } from './dto/move-page.dto'; import { PageDetailsDto } from './dto/page-details.dto'; import { DeletePageDto } from './dto/delete-page.dto'; @@ -19,10 +18,11 @@ import { HistoryDetailsDto } from './dto/history-details.dto'; import { PageHistoryDto } from './dto/page-history.dto'; import { AuthUser } from '../../decorators/auth-user.decorator'; import { User } from '../user/entities/user.entity'; -import { CurrentWorkspace } from '../../decorators/current-workspace.decorator'; +import { AuthWorkspace } from '../../decorators/auth-workspace.decorator'; import { Workspace } from '../workspace/entities/workspace.entity'; +import { JwtAuthGuard } from '../../guards/jwt-auth.guard'; -@UseGuards(JwtGuard) +@UseGuards(JwtAuthGuard) @Controller('pages') export class PageController { constructor( @@ -32,7 +32,7 @@ export class PageController { ) {} @HttpCode(HttpStatus.OK) - @Post('/details') + @Post('/info') async getPage(@Body() input: PageDetailsDto) { return this.pageService.findOne(input.id); } @@ -42,7 +42,7 @@ export class PageController { async create( @Body() createPageDto: CreatePageDto, @AuthUser() user: User, - @CurrentWorkspace() workspace: Workspace, + @AuthWorkspace() workspace: Workspace, ) { return this.pageService.create(user.id, workspace.id, createPageDto); } diff --git a/apps/server/src/core/page/page.module.ts b/apps/server/src/core/page/page.module.ts index 9229c80..6792307 100644 --- a/apps/server/src/core/page/page.module.ts +++ b/apps/server/src/core/page/page.module.ts @@ -4,7 +4,6 @@ import { PageController } from './page.controller'; import { TypeOrmModule } from '@nestjs/typeorm'; import { Page } from './entities/page.entity'; import { PageRepository } from './repositories/page.repository'; -import { AuthModule } from '../auth/auth.module'; import { WorkspaceModule } from '../workspace/workspace.module'; import { PageOrderingService } from './services/page-ordering.service'; import { PageOrdering } from './entities/page-ordering.entity'; @@ -15,7 +14,6 @@ import { PageHistoryRepository } from './repositories/page-history.repository'; @Module({ imports: [ TypeOrmModule.forFeature([Page, PageOrdering, PageHistory]), - AuthModule, WorkspaceModule, ], controllers: [PageController], diff --git a/apps/server/src/core/search/search.controller.ts b/apps/server/src/core/search/search.controller.ts index 9b67563..60eeefc 100644 --- a/apps/server/src/core/search/search.controller.ts +++ b/apps/server/src/core/search/search.controller.ts @@ -7,13 +7,13 @@ import { Query, UseGuards, } from '@nestjs/common'; -import { JwtGuard } from '../auth/guards/jwt.guard'; import { SearchService } from './search.service'; import { SearchDTO } from './dto/search.dto'; -import { CurrentWorkspace } from '../../decorators/current-workspace.decorator'; +import { AuthWorkspace } from '../../decorators/auth-workspace.decorator'; import { Workspace } from '../workspace/entities/workspace.entity'; +import { JwtAuthGuard } from '../../guards/jwt-auth.guard'; -@UseGuards(JwtGuard) +@UseGuards(JwtAuthGuard) @Controller('search') export class SearchController { constructor(private readonly searchService: SearchService) {} @@ -23,7 +23,7 @@ export class SearchController { async pageSearch( @Query('type') type: string, @Body() searchDto: SearchDTO, - @CurrentWorkspace() workspace: Workspace, + @AuthWorkspace() workspace: Workspace, ) { if (!type || type === 'page') { return this.searchService.searchPage( diff --git a/apps/server/src/core/search/search.module.ts b/apps/server/src/core/search/search.module.ts index a268ef0..c6ef9ab 100644 --- a/apps/server/src/core/search/search.module.ts +++ b/apps/server/src/core/search/search.module.ts @@ -1,11 +1,10 @@ import { Module } from '@nestjs/common'; import { SearchController } from './search.controller'; import { SearchService } from './search.service'; -import { AuthModule } from '../auth/auth.module'; import { PageModule } from '../page/page.module'; @Module({ - imports: [AuthModule, PageModule], + imports: [PageModule], controllers: [SearchController], providers: [SearchService], }) diff --git a/apps/server/src/core/space/dto/create-space.dto.ts b/apps/server/src/core/space/dto/create-space.dto.ts index 0f59c0e..a22e6d6 100644 --- a/apps/server/src/core/space/dto/create-space.dto.ts +++ b/apps/server/src/core/space/dto/create-space.dto.ts @@ -9,4 +9,8 @@ export class CreateSpaceDto { @IsOptional() @IsString() description?: string; + + @IsOptional() + @IsString() + slug?: string; } diff --git a/apps/server/src/core/space/dto/space-id.dto.ts b/apps/server/src/core/space/dto/space-id.dto.ts new file mode 100644 index 0000000..06accf1 --- /dev/null +++ b/apps/server/src/core/space/dto/space-id.dto.ts @@ -0,0 +1,8 @@ +import { IsNotEmpty, IsString, IsUUID } from 'class-validator'; + +export class SpaceIdDto { + @IsString() + @IsNotEmpty() + @IsUUID() + spaceId: string; +} diff --git a/apps/server/src/core/space/entities/space-user.entity.ts b/apps/server/src/core/space/entities/space-user.entity.ts index 94d719a..4592ae7 100644 --- a/apps/server/src/core/space/entities/space-user.entity.ts +++ b/apps/server/src/core/space/entities/space-user.entity.ts @@ -20,7 +20,7 @@ export class SpaceUser { @Column() userId: string; - @ManyToOne(() => User, (user) => user.spaceUsers, { + @ManyToOne(() => User, (user) => user.spaces, { onDelete: 'CASCADE', }) @JoinColumn({ name: 'userId' }) @@ -32,7 +32,6 @@ export class SpaceUser { @ManyToOne(() => Space, (space) => space.spaceUsers, { onDelete: 'CASCADE', }) - @JoinColumn({ name: 'spaceId' }) space: Space; @Column({ length: 100, nullable: true }) diff --git a/apps/server/src/core/space/entities/space.entity.ts b/apps/server/src/core/space/entities/space.entity.ts index 6083281..5d6903c 100644 --- a/apps/server/src/core/space/entities/space.entity.ts +++ b/apps/server/src/core/space/entities/space.entity.ts @@ -6,14 +6,17 @@ import { ManyToOne, OneToMany, PrimaryGeneratedColumn, + Unique, UpdateDateColumn, } from 'typeorm'; import { User } from '../../user/entities/user.entity'; import { Workspace } from '../../workspace/entities/workspace.entity'; import { SpaceUser } from './space-user.entity'; import { Page } from '../../page/entities/page.entity'; +import { SpacePrivacy, SpaceRole } from '../../../helpers/types/permission'; @Entity('spaces') +@Unique(['slug', 'workspaceId']) export class Space { @PrimaryGeneratedColumn('uuid') id: string; @@ -24,11 +27,17 @@ export class Space { @Column({ type: 'text', nullable: true }) description: string; + @Column({ nullable: true }) + slug: string; + @Column({ length: 255, nullable: true }) icon: string; - @Column({ length: 255, nullable: true, unique: true }) - hostname: string; + @Column({ length: 100, default: SpacePrivacy.OPEN }) + privacy: string; + + @Column({ length: 100, default: SpaceRole.WRITER }) + defaultRole: string; @Column() creatorId: string; @@ -46,7 +55,7 @@ export class Space { @JoinColumn({ name: 'workspaceId' }) workspace: Workspace; - @OneToMany(() => SpaceUser, (workspaceUser) => workspaceUser.space) + @OneToMany(() => SpaceUser, (spaceUser) => spaceUser.space) spaceUsers: SpaceUser[]; @OneToMany(() => Page, (page) => page.space) diff --git a/apps/server/src/core/space/repositories/space.repository.ts b/apps/server/src/core/space/repositories/space.repository.ts index 4e5e89b..c805f46 100644 --- a/apps/server/src/core/space/repositories/space.repository.ts +++ b/apps/server/src/core/space/repositories/space.repository.ts @@ -8,7 +8,11 @@ export class SpaceRepository extends Repository { super(Space, dataSource.createEntityManager()); } - async findById(spaceId: string) { - return this.findOneBy({ id: spaceId }); + async findById(spaceId: string, workspaceId: string): Promise { + const queryBuilder = this.dataSource.createQueryBuilder(Space, 'space'); + return await queryBuilder + .where('space.id = :id', { id: spaceId }) + .andWhere('space.workspaceId = :workspaceId', { workspaceId }) + .getOne(); } } diff --git a/apps/server/src/core/space/space.controller.ts b/apps/server/src/core/space/space.controller.ts index d2fa7b8..cd55736 100644 --- a/apps/server/src/core/space/space.controller.ts +++ b/apps/server/src/core/space/space.controller.ts @@ -1,29 +1,72 @@ import { + Body, Controller, HttpCode, HttpStatus, Post, UseGuards, } from '@nestjs/common'; -import { JwtGuard } from '../auth/guards/jwt.guard'; import { SpaceService } from './space.service'; import { AuthUser } from '../../decorators/auth-user.decorator'; import { User } from '../user/entities/user.entity'; -import { CurrentWorkspace } from '../../decorators/current-workspace.decorator'; +import { AuthWorkspace } from '../../decorators/auth-workspace.decorator'; import { Workspace } from '../workspace/entities/workspace.entity'; +import { JwtAuthGuard } from '../../guards/jwt-auth.guard'; +import { SpaceIdDto } from './dto/space-id.dto'; +import { PaginationOptions } from '../../helpers/pagination/pagination-options'; -@UseGuards(JwtGuard) +@UseGuards(JwtAuthGuard) @Controller('spaces') export class SpaceController { constructor(private readonly spaceService: SpaceService) {} - // get all spaces user is a member of @HttpCode(HttpStatus.OK) @Post('/') - async getUserSpaces( + async getWorkspaceSpaces( + @Body() + pagination: PaginationOptions, @AuthUser() user: User, - @CurrentWorkspace() workspace: Workspace, + @AuthWorkspace() workspace: Workspace, ) { - return this.spaceService.getUserSpacesInWorkspace(user.id, workspace.id); + // TODO: only show spaces user can see. e.g open and private with user being a member + return this.spaceService.getWorkspaceSpaces(workspace.id, pagination); + } + + // get all spaces user is a member of + @HttpCode(HttpStatus.OK) + @Post('user') + async getUserSpaces( + @Body() + pagination: PaginationOptions, + @AuthUser() user: User, + @AuthWorkspace() workspace: Workspace, + ) { + return this.spaceService.getUserSpaces(user.id, workspace.id, pagination); + } + + @HttpCode(HttpStatus.OK) + @Post('info') + async getSpaceInfo( + @Body() spaceIdDto: SpaceIdDto, + @AuthUser() user: User, + @AuthWorkspace() workspace: Workspace, + ) { + return this.spaceService.getSpaceInfo(spaceIdDto.spaceId, workspace.id); + } + + @HttpCode(HttpStatus.OK) + @Post('members') + async getSpaceMembers( + @Body() spaceIdDto: SpaceIdDto, + @Body() + pagination: PaginationOptions, + @AuthUser() user: User, + @AuthWorkspace() workspace: Workspace, + ) { + return this.spaceService.getSpaceUsers( + spaceIdDto.spaceId, + workspace.id, + pagination, + ); } } diff --git a/apps/server/src/core/space/space.module.ts b/apps/server/src/core/space/space.module.ts index a69a0c1..303435c 100644 --- a/apps/server/src/core/space/space.module.ts +++ b/apps/server/src/core/space/space.module.ts @@ -3,13 +3,12 @@ import { SpaceService } from './space.service'; import { SpaceController } from './space.controller'; import { TypeOrmModule } from '@nestjs/typeorm'; import { Space } from './entities/space.entity'; -import { AuthModule } from '../auth/auth.module'; import { SpaceUser } from './entities/space-user.entity'; import { SpaceRepository } from './repositories/space.repository'; import { SpaceUserRepository } from './repositories/space-user.repository'; @Module({ - imports: [TypeOrmModule.forFeature([Space, SpaceUser]), AuthModule], + imports: [TypeOrmModule.forFeature([Space, SpaceUser])], controllers: [SpaceController], providers: [SpaceService, SpaceRepository, SpaceUserRepository], exports: [SpaceService, SpaceRepository, SpaceUserRepository], diff --git a/apps/server/src/core/space/space.service.ts b/apps/server/src/core/space/space.service.ts index 5062f01..6de8b09 100644 --- a/apps/server/src/core/space/space.service.ts +++ b/apps/server/src/core/space/space.service.ts @@ -5,14 +5,15 @@ import { } from '@nestjs/common'; import { CreateSpaceDto } from './dto/create-space.dto'; import { Space } from './entities/space.entity'; -import { plainToInstance } from 'class-transformer'; import { SpaceRepository } from './repositories/space.repository'; import { SpaceUserRepository } from './repositories/space-user.repository'; import { SpaceUser } from './entities/space-user.entity'; import { transactionWrapper } from '../../helpers/db.helper'; import { DataSource, EntityManager } from 'typeorm'; -import { WorkspaceUser } from '../workspace/entities/workspace-user.entity'; import { User } from '../user/entities/user.entity'; +import { PaginationOptions } from '../../helpers/pagination/pagination-options'; +import { PaginationMetaDto } from '../../helpers/pagination/pagination-meta-dto'; +import { PaginatedResult } from '../../helpers/pagination/paginated-result'; @Injectable() export class SpaceService { @@ -24,33 +25,26 @@ export class SpaceService { async create( userId: string, - workspaceId, + workspaceId: string, createSpaceDto?: CreateSpaceDto, manager?: EntityManager, - ) { - let space: Space; - - await transactionWrapper( + ): Promise { + return await transactionWrapper( async (manager: EntityManager) => { - if (createSpaceDto) { - space = plainToInstance(Space, createSpaceDto); - } else { - space = new Space(); - } - + const space = new Space(); + space.name = createSpaceDto.name ?? 'untitled space '; + space.description = createSpaceDto.description ?? ''; space.creatorId = userId; space.workspaceId = workspaceId; - space.name = createSpaceDto?.name ?? 'untitled space'; - space.description = createSpaceDto?.description ?? null; + space.slug = space.name.toLowerCase(); // TODO: fix - space = await manager.save(space); + await manager.save(space); + return space; }, this.dataSource, manager, ); - - return space; } async addUserToSpace( @@ -60,27 +54,15 @@ export class SpaceService { workspaceId, manager?: EntityManager, ): Promise { - let addedUser: SpaceUser; - - await transactionWrapper( + return await transactionWrapper( async (manager: EntityManager) => { const userExists = await manager.exists(User, { - where: { id: userId }, + where: { id: userId, workspaceId }, }); if (!userExists) { throw new NotFoundException('User not found'); } - // only workspace users can be added to workspace spaces - const workspaceUser = await manager.findOneBy(WorkspaceUser, { - userId: userId, - workspaceId: workspaceId, - }); - - if (!workspaceUser) { - throw new NotFoundException('User is not a member of this workspace'); - } - const existingSpaceUser = await manager.findOneBy(SpaceUser, { userId: userId, spaceId: spaceId, @@ -94,27 +76,106 @@ export class SpaceService { spaceUser.userId = userId; spaceUser.spaceId = spaceId; spaceUser.role = role; + await manager.save(spaceUser); - addedUser = await manager.save(spaceUser); + return spaceUser; }, this.dataSource, manager, ); - - return addedUser; } - async getUserSpacesInWorkspace(userId: string, workspaceId: string) { - const spaces = await this.spaceUserRepository.find({ - relations: ['space'], + async getSpaceInfo(spaceId: string, workspaceId: string): Promise { + const space = await this.spaceRepository + .createQueryBuilder('space') + .where('space.id = :spaceId', { spaceId }) + .andWhere('space.workspaceId = :workspaceId', { workspaceId }) + .loadRelationCountAndMap( + 'space.userCount', + 'space.spaceUsers', + 'spaceUsers', + ) + .getOne(); + + if (!space) { + throw new NotFoundException('Space not found'); + } + + return space; + } + + async getWorkspaceSpaces( + workspaceId: string, + paginationOptions: PaginationOptions, + ): Promise> { + const [spaces, count] = await this.spaceRepository + .createQueryBuilder('space') + .where('space.workspaceId = :workspaceId', { workspaceId }) + .loadRelationCountAndMap( + 'space.userCount', + 'space.spaceUsers', + 'spaceUsers', + ) + .take(paginationOptions.limit) + .skip(paginationOptions.skip) + .getManyAndCount(); + + const paginationMeta = new PaginationMetaDto({ count, paginationOptions }); + + return new PaginatedResult(spaces, paginationMeta); + } + + async getUserSpaces( + userId: string, + workspaceId: string, + paginationOptions: PaginationOptions, + ) { + const [userSpaces, count] = await this.spaceUserRepository + .createQueryBuilder('spaceUser') + .leftJoinAndSelect('spaceUser.space', 'space') + .where('spaceUser.userId = :userId', { userId }) + .andWhere('space.workspaceId = :workspaceId', { workspaceId }) + .loadRelationCountAndMap( + 'space.userCount', + 'space.spaceUsers', + 'spaceUsers', + ) + .take(paginationOptions.limit) + .skip(paginationOptions.skip) + .getManyAndCount(); + + const spaces = userSpaces.map((userSpace) => userSpace.space); + + const paginationMeta = new PaginationMetaDto({ count, paginationOptions }); + return new PaginatedResult(spaces, paginationMeta); + } + + async getSpaceUsers( + spaceId: string, + workspaceId: string, + paginationOptions: PaginationOptions, + ) { + const [spaceUsers, count] = await this.spaceUserRepository.findAndCount({ + relations: ['user'], where: { - userId: userId, space: { - workspaceId: workspaceId, + id: spaceId, + workspaceId, }, }, + take: paginationOptions.limit, + skip: paginationOptions.skip, }); - return spaces.map((userSpace: SpaceUser) => userSpace.space); + const users = spaceUsers.map((spaceUser) => { + delete spaceUser.user.password; + return { + ...spaceUser.user, + spaceRole: spaceUser.role, + }; + }); + + const paginationMeta = new PaginationMetaDto({ count, paginationOptions }); + return new PaginatedResult(users, paginationMeta); } } diff --git a/apps/server/src/core/user/dto/update-user.dto.ts b/apps/server/src/core/user/dto/update-user.dto.ts index fe40a07..46e9078 100644 --- a/apps/server/src/core/user/dto/update-user.dto.ts +++ b/apps/server/src/core/user/dto/update-user.dto.ts @@ -1,5 +1,5 @@ import { PartialType } from '@nestjs/mapped-types'; -import { CreateUserDto } from './create-user.dto'; +import { CreateUserDto } from '../../auth/dto/create-user.dto'; import { IsOptional, IsString } from 'class-validator'; export class UpdateUserDto extends PartialType(CreateUserDto) { diff --git a/apps/server/src/core/user/entities/user.entity.ts b/apps/server/src/core/user/entities/user.entity.ts index 18a8daa..4ab1607 100644 --- a/apps/server/src/core/user/entities/user.entity.ts +++ b/apps/server/src/core/user/entities/user.entity.ts @@ -3,19 +3,22 @@ import { Column, CreateDateColumn, Entity, + ManyToOne, OneToMany, PrimaryGeneratedColumn, + Unique, UpdateDateColumn, } from 'typeorm'; import * as bcrypt from 'bcrypt'; import { Workspace } from '../../workspace/entities/workspace.entity'; -import { WorkspaceUser } from '../../workspace/entities/workspace-user.entity'; import { Page } from '../../page/entities/page.entity'; import { Comment } from '../../comment/entities/comment.entity'; import { Space } from '../../space/entities/space.entity'; import { SpaceUser } from '../../space/entities/space-user.entity'; +import { Group } from '../../group/entities/group.entity'; @Entity('users') +@Unique(['email', 'workspaceId']) export class User { @PrimaryGeneratedColumn('uuid') id: string; @@ -23,7 +26,7 @@ export class User { @Column({ length: 255, nullable: true }) name: string; - @Column({ length: 255, unique: true }) + @Column({ length: 255 }) email: string; @Column({ nullable: true }) @@ -35,6 +38,15 @@ export class User { @Column({ nullable: true }) avatarUrl: string; + @Column({ nullable: true, length: 100 }) + role: string; + + @Column({ nullable: true }) + workspaceId: string; + + @ManyToOne(() => Workspace, (workspace) => workspace.users) + workspace: Workspace; + @Column({ length: 100, nullable: true }) locale: string; @@ -56,11 +68,8 @@ export class User { @UpdateDateColumn() updatedAt: Date; - @OneToMany(() => Workspace, (workspace) => workspace.creator) - workspaces: Workspace[]; - - @OneToMany(() => WorkspaceUser, (workspaceUser) => workspaceUser.user) - workspaceUsers: WorkspaceUser[]; + @OneToMany(() => Group, (group) => group.creator) + groups: Group[]; @OneToMany(() => Page, (page) => page.creator) createdPages: Page[]; @@ -69,10 +78,10 @@ export class User { comments: Comment[]; @OneToMany(() => Space, (space) => space.creator) - spaces: Space[]; + createdSpaces: Space[]; @OneToMany(() => SpaceUser, (spaceUser) => spaceUser.user) - spaceUsers: SpaceUser[]; + spaces: SpaceUser[]; toJSON() { delete this.password; @@ -85,8 +94,3 @@ export class User { this.password = await bcrypt.hash(this.password, saltRounds); } } - -export type UserRole = { - role: string; -}; -export type UserWithRole = User & UserRole; diff --git a/apps/server/src/core/user/repositories/user.repository.ts b/apps/server/src/core/user/repositories/user.repository.ts index 4d6a66c..41ddbf7 100644 --- a/apps/server/src/core/user/repositories/user.repository.ts +++ b/apps/server/src/core/user/repositories/user.repository.ts @@ -7,11 +7,29 @@ export class UserRepository extends Repository { constructor(private dataSource: DataSource) { super(User, dataSource.createEntityManager()); } - async findByEmail(email: string) { - return this.findOneBy({ email: email }); + async findByEmail(email: string): Promise { + const queryBuilder = this.dataSource.createQueryBuilder(User, 'user'); + return await queryBuilder.where('user.email = :email', { email }).getOne(); } - async findById(userId: string) { - return this.findOneBy({ id: userId }); + async findById(userId: string): Promise { + const queryBuilder = this.dataSource.createQueryBuilder(User, 'user'); + return await queryBuilder.where('user.id = :id', { id: userId }).getOne(); + } + + async findOneByEmail(email: string, workspaceId: string): Promise { + const queryBuilder = this.dataSource.createQueryBuilder(User, 'user'); + return await queryBuilder + .where('user.email = :email', { email }) + .andWhere('user.workspaceId = :workspaceId', { workspaceId }) + .getOne(); + } + + async findOneByIdx(userId: string, workspaceId: string): Promise { + const queryBuilder = this.dataSource.createQueryBuilder(User, 'user'); + return await queryBuilder + .where('user.id = :id', { id: userId }) + .andWhere('user.workspaceId = :workspaceId', { workspaceId }) + .getOne(); } } diff --git a/apps/server/src/core/user/user.controller.ts b/apps/server/src/core/user/user.controller.ts index 67c177d..1a9bd72 100644 --- a/apps/server/src/core/user/user.controller.ts +++ b/apps/server/src/core/user/user.controller.ts @@ -1,20 +1,19 @@ import { + Body, Controller, - UseGuards, HttpCode, HttpStatus, - UnauthorizedException, Post, - Body, + UnauthorizedException, + UseGuards, } from '@nestjs/common'; import { UserService } from './user.service'; -import { JwtGuard } from '../auth/guards/jwt.guard'; import { User } from './entities/user.entity'; -import { Workspace } from '../workspace/entities/workspace.entity'; import { UpdateUserDto } from './dto/update-user.dto'; import { AuthUser } from '../../decorators/auth-user.decorator'; +import { JwtAuthGuard } from '../../guards/jwt-auth.guard'; -@UseGuards(JwtGuard) +@UseGuards(JwtAuthGuard) @Controller('users') export class UserController { constructor(private readonly userService: UserService) {} @@ -28,16 +27,13 @@ export class UserController { throw new UnauthorizedException('Invalid user'); } - return { user }; + return user; } @HttpCode(HttpStatus.OK) @Post('info') async getUserInfo(@AuthUser() user: User) { - const data: { workspace: Workspace; user: User } = - await this.userService.getUserInstance(user.id); - - return data; + return await this.userService.getUserInstance(user.id); } @HttpCode(HttpStatus.OK) diff --git a/apps/server/src/core/user/user.module.ts b/apps/server/src/core/user/user.module.ts index 07cd196..4dfc3a3 100644 --- a/apps/server/src/core/user/user.module.ts +++ b/apps/server/src/core/user/user.module.ts @@ -1,15 +1,12 @@ -import { Global, Module } from '@nestjs/common'; +import { Module } from '@nestjs/common'; import { UserService } from './user.service'; import { UserController } from './user.controller'; import { TypeOrmModule } from '@nestjs/typeorm'; import { User } from './entities/user.entity'; import { UserRepository } from './repositories/user.repository'; -import { AuthModule } from '../auth/auth.module'; -import { WorkspaceModule } from '../workspace/workspace.module'; -@Global() @Module({ - imports: [TypeOrmModule.forFeature([User]), AuthModule, WorkspaceModule], + imports: [TypeOrmModule.forFeature([User])], controllers: [UserController], providers: [UserService, UserRepository], exports: [UserService, UserRepository], diff --git a/apps/server/src/core/user/user.service.spec.ts b/apps/server/src/core/user/user.service.spec.ts index ebcff17..d5d33bc 100644 --- a/apps/server/src/core/user/user.service.spec.ts +++ b/apps/server/src/core/user/user.service.spec.ts @@ -3,7 +3,7 @@ import { UserService } from './user.service'; import { UserRepository } from './repositories/user.repository'; import { User } from './entities/user.entity'; import { BadRequestException } from '@nestjs/common'; -import { CreateUserDto } from './dto/create-user.dto'; +import { CreateUserDto } from '../auth/dto/create-user.dto'; describe('UserService', () => { let userService: UserService; @@ -63,7 +63,7 @@ describe('UserService', () => { lastLoginIp: null, }; - userRepository.findByEmail.mockResolvedValue(undefined); + //userRepository.findByEmail.mockResolvedValue(undefined); userRepository.save.mockResolvedValue(savedUser); const result = await userService.create(createUserDto); diff --git a/apps/server/src/core/user/user.service.ts b/apps/server/src/core/user/user.service.ts index 51af6ee..1616d64 100644 --- a/apps/server/src/core/user/user.service.ts +++ b/apps/server/src/core/user/user.service.ts @@ -3,92 +3,31 @@ import { Injectable, NotFoundException, } from '@nestjs/common'; -import { CreateUserDto } from './dto/create-user.dto'; import { UpdateUserDto } from './dto/update-user.dto'; import { User } from './entities/user.entity'; import { UserRepository } from './repositories/user.repository'; -import { plainToInstance } from 'class-transformer'; -import * as bcrypt from 'bcrypt'; -import { WorkspaceService } from '../workspace/services/workspace.service'; -import { DataSource, EntityManager } from 'typeorm'; -import { transactionWrapper } from '../../helpers/db.helper'; -import { CreateWorkspaceDto } from '../workspace/dto/create-workspace.dto'; -import { Workspace } from '../workspace/entities/workspace.entity'; - -export type UserWithWorkspace = { - user: User; - workspace: Workspace; -}; @Injectable() export class UserService { - constructor( - private userRepository: UserRepository, - private workspaceService: WorkspaceService, - private dataSource: DataSource, - ) {} - async create( - createUserDto: CreateUserDto, - manager?: EntityManager, - ): Promise { - let user: User; - - const existingUser: User = await this.findByEmail(createUserDto.email); - - if (existingUser) { - throw new BadRequestException('A user with this email already exists'); - } - - await transactionWrapper( - async (manager: EntityManager) => { - user = plainToInstance(User, createUserDto); - user.locale = 'en'; - user.lastLoginAt = new Date(); - user.name = createUserDto.email.split('@')[0]; - - user = await manager.save(User, user); - - const createWorkspaceDto: CreateWorkspaceDto = { - name: 'My Workspace', - }; - - await this.workspaceService.createOrJoinWorkspace( - user.id, - createWorkspaceDto, - manager, - ); - }, - this.dataSource, - manager, - ); - - return user; - } - - async getUserInstance(userId: string): Promise { - const user: User = await this.findById(userId); - - if (!user) { - throw new NotFoundException('User not found'); - } - - let workspace; - - try { - workspace = await this.workspaceService.getUserCurrentWorkspace(userId); - } catch (error) { - //console.log(error); - } - - return { user, workspace }; - } + constructor(private userRepository: UserRepository) {} async findById(userId: string) { return this.userRepository.findById(userId); } - async findByEmail(email: string) { - return this.userRepository.findByEmail(email); + async getUserInstance(userId: string): Promise { + const user: User = await this.userRepository.findOne({ + relations: ['workspace'], + where: { + id: userId, + }, + }); + + if (!user) { + throw new NotFoundException('User not found'); + } + + return user; } async update(userId: string, updateUserDto: UpdateUserDto) { @@ -101,6 +40,7 @@ export class UserService { user.name = updateUserDto.name; } + // todo need workspace scoping if (updateUserDto.email && user.email != updateUserDto.email) { if (await this.userRepository.findByEmail(updateUserDto.email)) { throw new BadRequestException('A user with this email already exists'); @@ -114,11 +54,4 @@ export class UserService { return this.userRepository.save(user); } - - async compareHash( - plainPassword: string, - passwordHash: string, - ): Promise { - return await bcrypt.compare(plainPassword, passwordHash); - } } diff --git a/apps/server/src/core/workspace/controllers/workspace.controller.ts b/apps/server/src/core/workspace/controllers/workspace.controller.ts index 3d0e168..969c8a0 100644 --- a/apps/server/src/core/workspace/controllers/workspace.controller.ts +++ b/apps/server/src/core/workspace/controllers/workspace.controller.ts @@ -7,18 +7,14 @@ import { UseGuards, } from '@nestjs/common'; import { WorkspaceService } from '../services/workspace.service'; -import { JwtGuard } from '../../auth/guards/jwt.guard'; import { UpdateWorkspaceDto } from '../dto/update-workspace.dto'; import { DeleteWorkspaceDto } from '../dto/delete-workspace.dto'; import { UpdateWorkspaceUserRoleDto } from '../dto/update-workspace-user-role.dto'; -import { RemoveWorkspaceUserDto } from '../dto/remove-workspace-user.dto'; -import { AddWorkspaceUserDto } from '../dto/add-workspace-user.dto'; import { AuthUser } from '../../../decorators/auth-user.decorator'; import { User } from '../../user/entities/user.entity'; -import { CurrentWorkspace } from '../../../decorators/current-workspace.decorator'; +import { AuthWorkspace } from '../../../decorators/auth-workspace.decorator'; import { Workspace } from '../entities/workspace.entity'; import { PaginationOptions } from '../../../helpers/pagination/pagination-options'; -import { WorkspaceUserService } from '../services/workspace-user.service'; import { WorkspaceInvitationService } from '../services/workspace-invitation.service'; import { Public } from '../../../decorators/public.decorator'; import { @@ -27,14 +23,15 @@ import { RevokeInviteDto, } from '../dto/invitation.dto'; import { Action } from '../../casl/ability.action'; -import { WorkspaceUser } from '../entities/workspace-user.entity'; import { WorkspaceInvitation } from '../entities/workspace-invitation.entity'; import { CheckPolicies } from '../../casl/decorators/policies.decorator'; import { AppAbility } from '../../casl/abilities/casl-ability.factory'; import { PoliciesGuard } from '../../casl/guards/policies.guard'; +import { WorkspaceUserService } from '../services/workspace-user.service'; +import { JwtAuthGuard } from '../../../guards/jwt-auth.guard'; -@UseGuards(JwtGuard) -@Controller('workspaces') +@UseGuards(JwtAuthGuard) +@Controller('workspace') export class WorkspaceController { constructor( private readonly workspaceService: WorkspaceService, @@ -43,33 +40,21 @@ export class WorkspaceController { ) {} @HttpCode(HttpStatus.OK) - @Post('/') - async getUserWorkspaces( - @Body() - pagination: PaginationOptions, + @Post('/info') + async getWorkspace( @AuthUser() user: User, + @AuthWorkspace() workspace: Workspace, ) { - return this.workspaceService.getUserWorkspaces(user.id, pagination); + return this.workspaceService.getWorkspaceInfo(workspace.id); } - /* - @HttpCode(HttpStatus.OK) - @Post('create') - async createWorkspace( - @Body() createWorkspaceDto: CreateWorkspaceDto, - @AuthUser() user: User, - ) { - return this.workspaceService.create(user.id, createWorkspaceDto); - } - */ - @UseGuards(PoliciesGuard) @CheckPolicies((ability: AppAbility) => ability.can(Action.Manage, Workspace)) @HttpCode(HttpStatus.OK) @Post('update') async updateWorkspace( @Body() updateWorkspaceDto: UpdateWorkspaceDto, - @CurrentWorkspace() workspace: Workspace, + @AuthWorkspace() workspace: Workspace, ) { return this.workspaceService.update(workspace.id, updateWorkspaceDto); } @@ -79,19 +64,19 @@ export class WorkspaceController { @HttpCode(HttpStatus.OK) @Post('delete') async deleteWorkspace(@Body() deleteWorkspaceDto: DeleteWorkspaceDto) { - return this.workspaceService.delete(deleteWorkspaceDto); + // return this.workspaceService.delete(deleteWorkspaceDto); } @UseGuards(PoliciesGuard) @CheckPolicies((ability: AppAbility) => - ability.can(Action.Read, WorkspaceUser), + ability.can(Action.Read, 'workspaceUser'), ) @HttpCode(HttpStatus.OK) @Post('members') async getWorkspaceMembers( @Body() pagination: PaginationOptions, - @CurrentWorkspace() workspace: Workspace, + @AuthWorkspace() workspace: Workspace, ) { return this.workspaceUserService.getWorkspaceUsers( workspace.id, @@ -100,48 +85,25 @@ export class WorkspaceController { } @UseGuards(PoliciesGuard) - @CheckPolicies((ability: AppAbility) => - ability.can(Action.Manage, WorkspaceUser), - ) + // @CheckPolicies((ability: AppAbility) => + // ability.can(Action.Manage, 'WorkspaceUser'), + // ) @HttpCode(HttpStatus.OK) - @Post('members/add') - async addWorkspaceMember( - @Body() addWorkspaceUserDto: AddWorkspaceUserDto, - @CurrentWorkspace() workspace: Workspace, - ) { - return this.workspaceUserService.addUserToWorkspace( - addWorkspaceUserDto.userId, - workspace.id, - addWorkspaceUserDto.role, - ); + @Post('members/deactivate') + async deactivateWorkspaceMember() { + return this.workspaceUserService.deactivateUser(); } @UseGuards(PoliciesGuard) @CheckPolicies((ability: AppAbility) => - ability.can(Action.Manage, WorkspaceUser), - ) - @HttpCode(HttpStatus.OK) - @Post('members/remove') - async removeWorkspaceMember( - @Body() removeWorkspaceUserDto: RemoveWorkspaceUserDto, - @CurrentWorkspace() workspace: Workspace, - ) { - return this.workspaceUserService.removeUserFromWorkspace( - removeWorkspaceUserDto.userId, - workspace.id, - ); - } - - @UseGuards(PoliciesGuard) - @CheckPolicies((ability: AppAbility) => - ability.can(Action.Manage, WorkspaceUser), + ability.can(Action.Manage, 'workspaceUser'), ) @HttpCode(HttpStatus.OK) @Post('members/role') async updateWorkspaceMemberRole( @Body() workspaceUserRoleDto: UpdateWorkspaceUserRoleDto, @AuthUser() authUser: User, - @CurrentWorkspace() workspace: Workspace, + @AuthWorkspace() workspace: Workspace, ) { return this.workspaceUserService.updateWorkspaceUserRole( authUser, @@ -159,7 +121,7 @@ export class WorkspaceController { async inviteUser( @Body() inviteUserDto: InviteUserDto, @AuthUser() authUser: User, - @CurrentWorkspace() workspace: Workspace, + @AuthWorkspace() workspace: Workspace, ) { return this.workspaceInvitationService.createInvitation( authUser, @@ -172,9 +134,9 @@ export class WorkspaceController { @HttpCode(HttpStatus.OK) @Post('invite/accept') async acceptInvite(@Body() acceptInviteDto: AcceptInviteDto) { - return this.workspaceInvitationService.acceptInvitation( - acceptInviteDto.invitationId, - ); + // return this.workspaceInvitationService.acceptInvitation( + // acceptInviteDto.invitationId, + //); } // TODO: authorize permission with guards diff --git a/apps/server/src/core/workspace/dto/invitation.dto.ts b/apps/server/src/core/workspace/dto/invitation.dto.ts index 58870e7..6c6ed47 100644 --- a/apps/server/src/core/workspace/dto/invitation.dto.ts +++ b/apps/server/src/core/workspace/dto/invitation.dto.ts @@ -1,5 +1,5 @@ import { IsEmail, IsEnum, IsOptional, IsString, IsUUID } from 'class-validator'; -import { WorkspaceUserRole } from '../entities/workspace-user.entity'; +import { UserRole } from '../../../helpers/types/permission'; export class InviteUserDto { @IsString() @@ -9,7 +9,7 @@ export class InviteUserDto { @IsEmail() email: string; - @IsEnum(WorkspaceUserRole) + @IsEnum(UserRole) role: string; } diff --git a/apps/server/src/core/workspace/entities/workspace-user.entity.ts b/apps/server/src/core/workspace/entities/workspace-user.entity.ts deleted file mode 100644 index 353a390..0000000 --- a/apps/server/src/core/workspace/entities/workspace-user.entity.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { - Entity, - PrimaryGeneratedColumn, - Column, - CreateDateColumn, - UpdateDateColumn, - ManyToOne, - JoinColumn, - Unique, -} from 'typeorm'; -import { Workspace } from './workspace.entity'; -import { User } from '../../user/entities/user.entity'; - -@Entity('workspace_users') -@Unique(['workspaceId', 'userId']) -export class WorkspaceUser { - @PrimaryGeneratedColumn('uuid') - id: string; - - @Column() - userId: string; - - @ManyToOne(() => User, (user) => user.workspaceUsers, { - onDelete: 'CASCADE', - }) - @JoinColumn({ name: 'userId' }) - user: User; - - @Column() - workspaceId: string; - - @ManyToOne(() => Workspace, (workspace) => workspace.workspaceUsers, { - onDelete: 'CASCADE', - }) - @JoinColumn({ name: 'workspaceId' }) - workspace: Workspace; - - @Column({ length: 100, nullable: true }) - role: string; - - @CreateDateColumn() - createdAt: Date; - - @UpdateDateColumn() - updatedAt: Date; -} - -export enum WorkspaceUserRole { - OWNER = 'owner', - ADMIN = 'admin', - MEMBER = 'member', -} diff --git a/apps/server/src/core/workspace/entities/workspace.entity.ts b/apps/server/src/core/workspace/entities/workspace.entity.ts index d891108..c41b52f 100644 --- a/apps/server/src/core/workspace/entities/workspace.entity.ts +++ b/apps/server/src/core/workspace/entities/workspace.entity.ts @@ -4,18 +4,18 @@ import { Column, CreateDateColumn, UpdateDateColumn, - ManyToOne, OneToMany, JoinColumn, OneToOne, + DeleteDateColumn, } from 'typeorm'; import { User } from '../../user/entities/user.entity'; -import { WorkspaceUser } from './workspace-user.entity'; import { Page } from '../../page/entities/page.entity'; import { WorkspaceInvitation } from './workspace-invitation.entity'; import { Comment } from '../../comment/entities/comment.entity'; import { Space } from '../../space/entities/space.entity'; import { Group } from '../../group/entities/group.entity'; +import { UserRole } from '../../../helpers/types/permission'; @Entity('workspaces') export class Workspace { @@ -46,12 +46,15 @@ export class Workspace { @Column({ type: 'jsonb', nullable: true }) settings: any; - @Column() + @Column({ default: UserRole.MEMBER }) + defaultRole: string; + + @Column({ nullable: true, type: 'uuid' }) creatorId: string; - @ManyToOne(() => User, (user) => user.workspaces) - @JoinColumn({ name: 'creatorId' }) - creator: User; + //@ManyToOne(() => User, (user) => user.workspaces) + // @JoinColumn({ name: 'creatorId' }) + // creator: User; @Column({ nullable: true }) defaultSpaceId: string; @@ -66,8 +69,11 @@ export class Workspace { @UpdateDateColumn() updatedAt: Date; - @OneToMany(() => WorkspaceUser, (workspaceUser) => workspaceUser.workspace) - workspaceUsers: WorkspaceUser[]; + @DeleteDateColumn() + deletedAt: Date; + + @OneToMany(() => User, (user) => user.workspace) + users: []; @OneToMany( () => WorkspaceInvitation, @@ -87,5 +93,5 @@ export class Workspace { @OneToMany(() => Group, (group) => group.workspace) groups: []; - workspaceUser?: WorkspaceUser; + // workspaceUser?: WorkspaceUser; } diff --git a/apps/server/src/core/workspace/repositories/workspace-user.repository.ts b/apps/server/src/core/workspace/repositories/workspace-user.repository.ts deleted file mode 100644 index b8bd5fc..0000000 --- a/apps/server/src/core/workspace/repositories/workspace-user.repository.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Injectable } from '@nestjs/common'; -import { DataSource, Repository } from 'typeorm'; -import { WorkspaceUser } from '../entities/workspace-user.entity'; - -@Injectable() -export class WorkspaceUserRepository extends Repository { - constructor(private dataSource: DataSource) { - super(WorkspaceUser, dataSource.createEntityManager()); - } -} diff --git a/apps/server/src/core/workspace/repositories/workspace.repository.ts b/apps/server/src/core/workspace/repositories/workspace.repository.ts index f833e7c..d953803 100644 --- a/apps/server/src/core/workspace/repositories/workspace.repository.ts +++ b/apps/server/src/core/workspace/repositories/workspace.repository.ts @@ -8,7 +8,24 @@ export class WorkspaceRepository extends Repository { super(Workspace, dataSource.createEntityManager()); } - async findById(workspaceId: string) { - return this.findOneBy({ id: workspaceId }); + async findById(workspaceId: string): Promise { + // see: https://github.com/typeorm/typeorm/issues/9316 + const queryBuilder = this.dataSource.createQueryBuilder( + Workspace, + 'workspace', + ); + return await queryBuilder + .where('workspace.id = :id', { id: workspaceId }) + .getOne(); + } + + async findFirst(): Promise { + const createdWorkspace = await this.find({ + order: { + createdAt: 'ASC', + }, + take: 1, + }); + return createdWorkspace[0]; } } diff --git a/apps/server/src/core/workspace/services/workspace-invitation.service.ts b/apps/server/src/core/workspace/services/workspace-invitation.service.ts index e2f38f4..a3b0f03 100644 --- a/apps/server/src/core/workspace/services/workspace-invitation.service.ts +++ b/apps/server/src/core/workspace/services/workspace-invitation.service.ts @@ -3,10 +3,11 @@ import { WorkspaceInvitationRepository } from '../repositories/workspace-invitat import { WorkspaceInvitation } from '../entities/workspace-invitation.entity'; import { User } from '../../user/entities/user.entity'; import { WorkspaceService } from './workspace.service'; -import { WorkspaceUserService } from './workspace-user.service'; -import { WorkspaceUserRole } from '../entities/workspace-user.entity'; import { UserService } from '../../user/user.service'; import { InviteUserDto } from '../dto/invitation.dto'; +import { WorkspaceUserService } from './workspace-user.service'; +import { UserRole } from '../../../helpers/types/permission'; +import { UserRepository } from '../../user/repositories/user.repository'; @Injectable() export class WorkspaceInvitationService { @@ -15,6 +16,7 @@ export class WorkspaceInvitationService { private workspaceService: WorkspaceService, private workspaceUserService: WorkspaceUserService, private userService: UserService, + private userRepository: UserRepository, ) {} async findInvitedUserByEmail( @@ -32,37 +34,17 @@ export class WorkspaceInvitationService { workspaceId: string, inviteUserDto: InviteUserDto, ): Promise { - const authUserMembership = - await this.workspaceUserService.findWorkspaceUser( - authUser.id, + // check if invited user is already a workspace member + const invitedUser = + await this.workspaceUserService.findWorkspaceUserByEmail( + inviteUserDto.email, workspaceId, ); - if (!authUserMembership) { - throw new BadRequestException('Inviting user must be a workspace member'); - } - - if (authUserMembership.role != WorkspaceUserRole.OWNER) { - throw new BadRequestException( - 'Only workspace owners can invite new members', - ); - } - - const invitedUser = await this.userService.findByEmail(inviteUserDto.email); - - // check if invited user is already a workspace member if (invitedUser) { - const invitedUserMembership = - await this.workspaceUserService.findWorkspaceUser( - invitedUser.id, - workspaceId, - ); - - if (invitedUserMembership) { - throw new BadRequestException( - 'This user already a member of this workspace', - ); - } + throw new BadRequestException( + 'User is already a member of this workspace', + ); } // check if user was already invited @@ -72,7 +54,7 @@ export class WorkspaceInvitationService { ); if (existingInvitation) { - throw new BadRequestException('This user has already been invited'); + throw new BadRequestException('User has already been invited'); } const invitation = new WorkspaceInvitation(); @@ -97,14 +79,22 @@ export class WorkspaceInvitationService { // TODO: to be completed - // check if user is in the system already - const invitedUser = await this.userService.findByEmail(invitation.email); + // check if user is already a member + const invitedUser = + await this.workspaceUserService.findWorkspaceUserByEmail( + invitation.email, + invitation.workspaceId, + ); if (invitedUser) { - // fetch the workspace - // add the user to the workspace + throw new BadRequestException( + 'User is already a member of this workspace', + ); } - return invitation; + // add create account for user + // add the user to the workspace + + return null; } async revokeInvitation(invitationId: string): Promise { diff --git a/apps/server/src/core/workspace/services/workspace-user.service.ts b/apps/server/src/core/workspace/services/workspace-user.service.ts index d54a8c2..86ee60f 100644 --- a/apps/server/src/core/workspace/services/workspace-user.service.ts +++ b/apps/server/src/core/workspace/services/workspace-user.service.ts @@ -1,69 +1,34 @@ -import { - BadRequestException, - Injectable, - NotFoundException, -} from '@nestjs/common'; -import { WorkspaceUserRepository } from '../repositories/workspace-user.repository'; -import { - WorkspaceUser, - WorkspaceUserRole, -} from '../entities/workspace-user.entity'; -import { Workspace } from '../entities/workspace.entity'; +import { BadRequestException, Injectable } from '@nestjs/common'; import { UpdateWorkspaceUserRoleDto } from '../dto/update-workspace-user-role.dto'; import { PaginationOptions } from '../../../helpers/pagination/pagination-options'; import { PaginationMetaDto } from '../../../helpers/pagination/pagination-meta-dto'; import { PaginatedResult } from '../../../helpers/pagination/paginated-result'; import { User } from '../../user/entities/user.entity'; -import { DataSource, EntityManager } from 'typeorm'; -import { transactionWrapper } from '../../../helpers/db.helper'; +import { WorkspaceRepository } from '../repositories/workspace.repository'; +import { UserRepository } from '../../user/repositories/user.repository'; +import { UserRole } from '../../../helpers/types/permission'; @Injectable() export class WorkspaceUserService { constructor( - private workspaceUserRepository: WorkspaceUserRepository, - private dataSource: DataSource, + private workspaceRepository: WorkspaceRepository, + private userRepository: UserRepository, ) {} - async addUserToWorkspace( - userId: string, + async getWorkspaceUsers( workspaceId: string, - role: string, - manager?: EntityManager, - ): Promise { - let addedUser; - - await transactionWrapper( - async (manager) => { - const userExists = await manager.exists(User, { - where: { id: userId }, - }); - if (!userExists) { - throw new NotFoundException('User not found'); - } - - const existingWorkspaceUser = await manager.findOneBy(WorkspaceUser, { - userId: userId, - workspaceId: workspaceId, - }); - - if (existingWorkspaceUser) { - throw new BadRequestException( - 'User is already a member of this workspace', - ); - } - - const workspaceUser = new WorkspaceUser(); - workspaceUser.userId = userId; - workspaceUser.workspaceId = workspaceId; - workspaceUser.role = role; - - addedUser = await manager.save(workspaceUser); + paginationOptions: PaginationOptions, + ): Promise> { + const [workspaceUsers, count] = await this.userRepository.findAndCount({ + where: { + workspaceId, }, - this.dataSource, - manager, - ); + take: paginationOptions.limit, + skip: paginationOptions.skip, + }); - return addedUser; + const paginationMeta = new PaginationMetaDto({ count, paginationOptions }); + return new PaginatedResult(workspaceUsers, paginationMeta); } async updateWorkspaceUserRole( @@ -80,16 +45,14 @@ export class WorkspaceUserService { return workspaceUser; } - const workspaceOwnerCount = await this.workspaceUserRepository.count({ + const workspaceOwnerCount = await this.userRepository.count({ where: { - role: WorkspaceUserRole.OWNER, + role: UserRole.OWNER, + workspaceId, }, }); - if ( - workspaceUser.role === WorkspaceUserRole.OWNER && - workspaceOwnerCount === 1 - ) { + if (workspaceUser.role === UserRole.OWNER && workspaceOwnerCount === 1) { throw new BadRequestException( 'There must be at least one workspace owner', ); @@ -97,105 +60,26 @@ export class WorkspaceUserService { workspaceUser.role = workspaceUserRoleDto.role; - return this.workspaceUserRepository.save(workspaceUser); + return this.userRepository.save(workspaceUser); } - async removeUserFromWorkspace( - userId: string, - workspaceId: string, - ): Promise { - const workspaceUser = await this.findAndValidateWorkspaceUser( - userId, - workspaceId, - ); + async deactivateUser(): Promise { + return 'todo'; + } - const workspaceOwnerCount = await this.workspaceUserRepository.count({ - where: { - role: WorkspaceUserRole.OWNER, - }, - }); - - if ( - workspaceUser.role === WorkspaceUserRole.OWNER && - workspaceOwnerCount === 1 - ) { - throw new BadRequestException( - 'There must be at least one workspace owner', - ); - } - - await this.workspaceUserRepository.delete({ - userId, + async findWorkspaceUser(userId: string, workspaceId: string): Promise { + return await this.userRepository.findOneBy({ + id: userId, workspaceId, }); } - async getUserWorkspaces( - userId: string, - paginationOptions: PaginationOptions, - ): Promise> { - const [workspaces, count] = await this.workspaceUserRepository.findAndCount( - { - where: { userId: userId }, - relations: ['workspace'], - take: paginationOptions.limit, - skip: paginationOptions.skip, - }, - ); - - const userWorkspaces = workspaces.map( - (userWorkspace: WorkspaceUser) => userWorkspace.workspace, - ); - - const paginationMeta = new PaginationMetaDto({ count, paginationOptions }); - return new PaginatedResult(userWorkspaces, paginationMeta); - } - - async getWorkspaceUsers( + async findWorkspaceUserByEmail( + email: string, workspaceId: string, - paginationOptions: PaginationOptions, - ): Promise> { - const [workspaceUsers, count] = - await this.workspaceUserRepository.findAndCount({ - relations: ['user'], - where: { - workspace: { - id: workspaceId, - }, - }, - take: paginationOptions.limit, - skip: paginationOptions.skip, - }); - - const users = workspaceUsers.map((workspaceUser) => { - workspaceUser.user.password = ''; - return { - ...workspaceUser.user, - role: workspaceUser.role, - }; - }); - - const paginationMeta = new PaginationMetaDto({ count, paginationOptions }); - return new PaginatedResult(users, paginationMeta); - } - - async getUserRoleInWorkspace( - userId: string, - workspaceId: string, - ): Promise { - const workspaceUser = await this.findAndValidateWorkspaceUser( - userId, - workspaceId, - ); - return workspaceUser.role ? workspaceUser.role : null; - } - - async findWorkspaceUser( - userId: string, - workspaceId: string, - ): Promise { - return await this.workspaceUserRepository.findOneBy({ - userId, + ): Promise { + return await this.userRepository.findOneBy({ + email: email, workspaceId, }); } @@ -203,13 +87,13 @@ export class WorkspaceUserService { async findAndValidateWorkspaceUser( userId: string, workspaceId: string, - ): Promise { - const workspaceUser = await this.findWorkspaceUser(userId, workspaceId); + ): Promise { + const user = await this.findWorkspaceUser(userId, workspaceId); - if (!workspaceUser) { + if (!user) { throw new BadRequestException('Workspace member not found'); } - return workspaceUser; + return user; } } diff --git a/apps/server/src/core/workspace/services/workspace.service.ts b/apps/server/src/core/workspace/services/workspace.service.ts index 6a8e581..74566c3 100644 --- a/apps/server/src/core/workspace/services/workspace.service.ts +++ b/apps/server/src/core/workspace/services/workspace.service.ts @@ -1,32 +1,31 @@ -import { Injectable, NotFoundException } from '@nestjs/common'; +import { + BadRequestException, + Injectable, + NotFoundException, +} from '@nestjs/common'; import { CreateWorkspaceDto } from '../dto/create-workspace.dto'; import { WorkspaceRepository } from '../repositories/workspace.repository'; -import { WorkspaceUserRepository } from '../repositories/workspace-user.repository'; -import { - WorkspaceUser, - WorkspaceUserRole, -} from '../entities/workspace-user.entity'; import { Workspace } from '../entities/workspace.entity'; -import { plainToInstance } from 'class-transformer'; -import { v4 as uuid } from 'uuid'; +import { v4 as uuidv4 } from 'uuid'; import { UpdateWorkspaceDto } from '../dto/update-workspace.dto'; import { DeleteWorkspaceDto } from '../dto/delete-workspace.dto'; import { SpaceService } from '../../space/space.service'; -import { PaginationOptions } from '../../../helpers/pagination/pagination-options'; -import { PaginationMetaDto } from '../../../helpers/pagination/pagination-meta-dto'; -import { PaginatedResult } from '../../../helpers/pagination/paginated-result'; import { DataSource, EntityManager } from 'typeorm'; import { transactionWrapper } from '../../../helpers/db.helper'; import { CreateSpaceDto } from '../../space/dto/create-space.dto'; -import { WorkspaceUserService } from './workspace-user.service'; +import { UserRepository } from '../../user/repositories/user.repository'; +import { SpaceRole, UserRole } from '../../../helpers/types/permission'; +import { User } from '../../user/entities/user.entity'; +import { EnvironmentService } from '../../../environment/environment.service'; +import { Space } from '../../space/entities/space.entity'; @Injectable() export class WorkspaceService { constructor( private workspaceRepository: WorkspaceRepository, - private workspaceUserRepository: WorkspaceUserRepository, + private userRepository: UserRepository, private spaceService: SpaceService, - private workspaceUserService: WorkspaceUserService, + private environmentService: EnvironmentService, private dataSource: DataSource, ) {} @@ -35,115 +34,118 @@ export class WorkspaceService { return this.workspaceRepository.findById(workspaceId); } - async save(workspace: Workspace) { - return this.workspaceRepository.save(workspace); - } + async getWorkspaceInfo(workspaceId: string): Promise { + const space = await this.workspaceRepository + .createQueryBuilder('workspace') + .where('workspace.id = :workspaceId', { workspaceId }) + .loadRelationCountAndMap( + 'workspace.userCount', + 'workspace.users', + 'workspaceUsers', + ) + .getOne(); - async createOrJoinWorkspace( - userId, - createWorkspaceDto?: CreateWorkspaceDto, - manager?: EntityManager, - ) { - await transactionWrapper( - async (manager: EntityManager) => { - const workspaceCount = await manager - .createQueryBuilder(Workspace, 'workspace') - .getCount(); + if (!space) { + throw new NotFoundException('Workspace not found'); + } - if (workspaceCount === 0) { - // create first workspace and add user to workspace as owner - const createdWorkspace = await this.create( - userId, - createWorkspaceDto ?? null, - manager, - ); - await this.workspaceUserService.addUserToWorkspace( - userId, - createdWorkspace.id, - WorkspaceUserRole.OWNER, - manager, - ); - - // create default space and add user to it too. - const createdSpace = await this.spaceService.create( - userId, - createdWorkspace.id, - { name: 'General' } as CreateSpaceDto, - manager, - ); - - await this.spaceService.addUserToSpace( - userId, - createdSpace.id, - WorkspaceUserRole.OWNER, - createdWorkspace.id, - manager, - ); - - createdWorkspace.defaultSpaceId = createdSpace.id; - await manager.save(createdWorkspace); - } else { - // limited to single workspace - // fetch the oldest workspace and add user to it - const firstWorkspace = await manager.find(Workspace, { - order: { - createdAt: 'ASC', - }, - take: 1, - }); - - // add user to workspace and default space - - await this.workspaceUserService.addUserToWorkspace( - userId, - firstWorkspace[0].id, - WorkspaceUserRole.MEMBER, - manager, - ); - - await this.spaceService.addUserToSpace( - userId, - firstWorkspace[0].defaultSpaceId, - WorkspaceUserRole.MEMBER, - firstWorkspace[0].id, - manager, - ); - } - }, - this.dataSource, - manager, - ); + return space; } async create( - userId: string, - createWorkspaceDto?: CreateWorkspaceDto, + user: User, + createWorkspaceDto: CreateWorkspaceDto, manager?: EntityManager, ): Promise { - let workspace: Workspace; - - await transactionWrapper( + return await transactionWrapper( async (manager) => { - if (createWorkspaceDto) { - workspace = plainToInstance(Workspace, createWorkspaceDto); - } else { - workspace = new Workspace(); - } - - workspace.inviteCode = uuid(); - workspace.creatorId = userId; - - //if (workspace.name && !workspace.hostname?.trim()) { - // workspace.hostname = generateHostname(createWorkspaceDto.name); - // } + let workspace = new Workspace(); + workspace.name = createWorkspaceDto.name; + workspace.hostname = createWorkspaceDto?.hostname; + workspace.description = createWorkspaceDto.description; + workspace.inviteCode = uuidv4(); + workspace.creatorId = user.id; workspace = await manager.save(workspace); + + user.workspaceId = workspace.id; + user.role = UserRole.OWNER; + await manager.save(user); + + // create default space + const spaceData: CreateSpaceDto = { + name: 'General', + }; + + // create default space + const createdSpace = await this.spaceService.create( + user.id, + workspace.id, + spaceData, + manager, + ); + + // and add user to it too. + await this.spaceService.addUserToSpace( + user.id, + createdSpace.id, + SpaceRole.OWNER, + workspace.id, + manager, + ); + + workspace.defaultSpaceId = createdSpace.id; + await manager.save(workspace); + return workspace; }, this.dataSource, manager, ); + } - return workspace; + async addUserToWorkspace( + user: User, + workspaceId, + assignedRole?: UserRole, + manager?: EntityManager, + ): Promise { + return await transactionWrapper( + async (manager: EntityManager) => { + const workspace = await manager.findOneBy(Workspace, { + id: workspaceId, + }); + + if (!workspace) { + throw new BadRequestException('Workspace does not exist'); + } + + user.role = assignedRole ?? workspace.defaultRole; + user.workspaceId = workspace.id; + await manager.save(user); + + const space = await manager.findOneBy(Space, { + id: workspace.defaultSpaceId, + workspaceId, + }); + + if (!space) { + throw new NotFoundException('Space not found'); + } + + // add user to default space + await this.spaceService.addUserToSpace( + user.id, + space.id, + space.defaultRole, + workspace.id, + manager, + ); + + return workspace; + }, + this.dataSource, + manager, + ); } async update( @@ -178,42 +180,4 @@ export class WorkspaceService { // remove all existing users from workspace // delete workspace } - - async getUserCurrentWorkspace(userId: string): Promise { - const userWorkspace = await this.workspaceUserRepository.findOne({ - relations: ['workspace'], - where: { userId: userId }, - order: { - createdAt: 'ASC', - }, - }); - - if (!userWorkspace) { - throw new NotFoundException('No workspace found for this user'); - } - - const { workspace, ...workspaceUser } = userWorkspace; - return { ...workspace, workspaceUser } as Workspace; - } - - async getUserWorkspaces( - userId: string, - paginationOptions: PaginationOptions, - ): Promise> { - const [workspaces, count] = await this.workspaceUserRepository.findAndCount( - { - where: { userId: userId }, - relations: ['workspace'], - take: paginationOptions.limit, - skip: paginationOptions.skip, - }, - ); - - const userWorkspaces = workspaces.map( - (userWorkspace: WorkspaceUser) => userWorkspace.workspace, - ); - - const paginationMeta = new PaginationMetaDto({ count, paginationOptions }); - return new PaginatedResult(userWorkspaces, paginationMeta); - } } diff --git a/apps/server/src/core/workspace/workspace.module.ts b/apps/server/src/core/workspace/workspace.module.ts index 89790f1..8eeea9b 100644 --- a/apps/server/src/core/workspace/workspace.module.ts +++ b/apps/server/src/core/workspace/workspace.module.ts @@ -4,20 +4,17 @@ import { WorkspaceController } from './controllers/workspace.controller'; import { WorkspaceRepository } from './repositories/workspace.repository'; import { TypeOrmModule } from '@nestjs/typeorm'; import { Workspace } from './entities/workspace.entity'; -import { WorkspaceUser } from './entities/workspace-user.entity'; import { WorkspaceInvitation } from './entities/workspace-invitation.entity'; -import { WorkspaceUserRepository } from './repositories/workspace-user.repository'; -import { AuthModule } from '../auth/auth.module'; import { SpaceModule } from '../space/space.module'; -import { WorkspaceUserService } from './services/workspace-user.service'; import { WorkspaceInvitationService } from './services/workspace-invitation.service'; import { WorkspaceInvitationRepository } from './repositories/workspace-invitation.repository'; +import { WorkspaceUserService } from './services/workspace-user.service'; +import { UserModule } from '../user/user.module'; @Module({ imports: [ - TypeOrmModule.forFeature([Workspace, WorkspaceUser, WorkspaceInvitation]), - AuthModule, - SpaceModule, + TypeOrmModule.forFeature([Workspace, WorkspaceInvitation]), + SpaceModule, UserModule ], controllers: [WorkspaceController], providers: [ @@ -25,9 +22,8 @@ import { WorkspaceInvitationRepository } from './repositories/workspace-invitati WorkspaceUserService, WorkspaceInvitationService, WorkspaceRepository, - WorkspaceUserRepository, WorkspaceInvitationRepository, ], - exports: [WorkspaceService, WorkspaceRepository, WorkspaceUserRepository], + exports: [WorkspaceService, WorkspaceRepository], }) export class WorkspaceModule {} diff --git a/apps/server/src/database/migrations/1710168946001-RefactorWorkspaceUser.ts b/apps/server/src/database/migrations/1710168946001-RefactorWorkspaceUser.ts new file mode 100644 index 0000000..c543773 --- /dev/null +++ b/apps/server/src/database/migrations/1710168946001-RefactorWorkspaceUser.ts @@ -0,0 +1,22 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class RefactorWorkspaceUser1710168946001 implements MigrationInterface { + name = 'RefactorWorkspaceUser1710168946001' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "workspaces" DROP CONSTRAINT "FK_2aab2dd12dc65eb183d99b953e0"`); + await queryRunner.query(`ALTER TABLE "users" ADD "role" character varying(100)`); + await queryRunner.query(`ALTER TABLE "users" ADD "workspaceId" uuid`); + await queryRunner.query(`ALTER TABLE "workspaces" ALTER COLUMN "creatorId" DROP NOT NULL`); + await queryRunner.query(`ALTER TABLE "users" ADD CONSTRAINT "FK_949fea12b7977a8b2f483bf802a" FOREIGN KEY ("workspaceId") REFERENCES "workspaces"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "users" DROP CONSTRAINT "FK_949fea12b7977a8b2f483bf802a"`); + await queryRunner.query(`ALTER TABLE "workspaces" ALTER COLUMN "creatorId" SET NOT NULL`); + await queryRunner.query(`ALTER TABLE "users" DROP COLUMN "workspaceId"`); + await queryRunner.query(`ALTER TABLE "users" DROP COLUMN "role"`); + await queryRunner.query(`ALTER TABLE "workspaces" ADD CONSTRAINT "FK_2aab2dd12dc65eb183d99b953e0" FOREIGN KEY ("creatorId") REFERENCES "users"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`); + } + +} diff --git a/apps/server/src/database/migrations/1710371336371-AddDeletedAtToWorkspace.ts b/apps/server/src/database/migrations/1710371336371-AddDeletedAtToWorkspace.ts new file mode 100644 index 0000000..d555424 --- /dev/null +++ b/apps/server/src/database/migrations/1710371336371-AddDeletedAtToWorkspace.ts @@ -0,0 +1,14 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class AddDeletedAtToWorkspace1710371336371 implements MigrationInterface { + name = 'AddDeletedAtToWorkspace1710371336371' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "workspaces" ADD "deletedAt" TIMESTAMP`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "workspaces" DROP COLUMN "deletedAt"`); + } + +} diff --git a/apps/server/src/database/migrations/1710377632898-RemoveUniqueFromUserEmail.ts b/apps/server/src/database/migrations/1710377632898-RemoveUniqueFromUserEmail.ts new file mode 100644 index 0000000..1fd8180 --- /dev/null +++ b/apps/server/src/database/migrations/1710377632898-RemoveUniqueFromUserEmail.ts @@ -0,0 +1,14 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class RemoveUniqueFromUserEmail1710377632898 implements MigrationInterface { + name = 'RemoveUniqueFromUserEmail1710377632898' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "users" DROP CONSTRAINT "UQ_97672ac88f789774dd47f7c8be3"`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "users" ADD CONSTRAINT "UQ_97672ac88f789774dd47f7c8be3" UNIQUE ("email")`); + } + +} diff --git a/apps/server/src/database/migrations/1710517114813-AddDefaultRoles.ts b/apps/server/src/database/migrations/1710517114813-AddDefaultRoles.ts new file mode 100644 index 0000000..827cc46 --- /dev/null +++ b/apps/server/src/database/migrations/1710517114813-AddDefaultRoles.ts @@ -0,0 +1,22 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class AddDefaultRoles1710517114813 implements MigrationInterface { + name = 'AddDefaultRoles1710517114813' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "spaces" DROP CONSTRAINT "UQ_4f0a029f6eefd773fde2143b261"`); + await queryRunner.query(`ALTER TABLE "spaces" DROP COLUMN "hostname"`); + await queryRunner.query(`ALTER TABLE "spaces" ADD "privacy" character varying(100) NOT NULL DEFAULT 'open'`); + await queryRunner.query(`ALTER TABLE "spaces" ADD "defaultRole" character varying(100) NOT NULL DEFAULT 'writer'`); + await queryRunner.query(`ALTER TABLE "workspaces" ADD "defaultRole" character varying NOT NULL DEFAULT 'member'`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "workspaces" DROP COLUMN "defaultRole"`); + await queryRunner.query(`ALTER TABLE "spaces" DROP COLUMN "defaultRole"`); + await queryRunner.query(`ALTER TABLE "spaces" DROP COLUMN "privacy"`); + await queryRunner.query(`ALTER TABLE "spaces" ADD "hostname" character varying(255)`); + await queryRunner.query(`ALTER TABLE "spaces" ADD CONSTRAINT "UQ_4f0a029f6eefd773fde2143b261" UNIQUE ("hostname")`); + } + +} diff --git a/apps/server/src/database/migrations/1710530661379-UniqueUser.ts b/apps/server/src/database/migrations/1710530661379-UniqueUser.ts new file mode 100644 index 0000000..483e81b --- /dev/null +++ b/apps/server/src/database/migrations/1710530661379-UniqueUser.ts @@ -0,0 +1,14 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class UniqueUser1710530661379 implements MigrationInterface { + name = 'UniqueUser1710530661379' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "users" ADD CONSTRAINT "UQ_b368db80982a952e3071e008a2c" UNIQUE ("email", "workspaceId")`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "users" DROP CONSTRAINT "UQ_b368db80982a952e3071e008a2c"`); + } + +} diff --git a/apps/server/src/database/migrations/1710615517137-SpaceSlug.ts b/apps/server/src/database/migrations/1710615517137-SpaceSlug.ts new file mode 100644 index 0000000..6a556d8 --- /dev/null +++ b/apps/server/src/database/migrations/1710615517137-SpaceSlug.ts @@ -0,0 +1,16 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class SpaceSlug1710615517137 implements MigrationInterface { + name = 'SpaceSlug1710615517137' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "spaces" ADD "slug" character varying`); + await queryRunner.query(`ALTER TABLE "spaces" ADD CONSTRAINT "UQ_c58549749e7a141746940d01f39" UNIQUE ("slug", "workspaceId")`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "spaces" DROP CONSTRAINT "UQ_c58549749e7a141746940d01f39"`); + await queryRunner.query(`ALTER TABLE "spaces" DROP COLUMN "slug"`); + } + +} diff --git a/apps/server/src/decorators/auth-user.decorator.ts b/apps/server/src/decorators/auth-user.decorator.ts index 4d68373..34e7177 100644 --- a/apps/server/src/decorators/auth-user.decorator.ts +++ b/apps/server/src/decorators/auth-user.decorator.ts @@ -1,17 +1,8 @@ -import { - createParamDecorator, - ExecutionContext, - UnauthorizedException, -} from '@nestjs/common'; +import { createParamDecorator, ExecutionContext } from '@nestjs/common'; export const AuthUser = createParamDecorator( (data: unknown, ctx: ExecutionContext) => { const request = ctx.switchToHttp().getRequest(); - - if (!request['user'] || !request['user'].user) { - throw new UnauthorizedException(); - } - - return request['user'] ? request['user'].user : undefined; + return request.user.user; }, ); diff --git a/apps/server/src/decorators/auth-workspace.decorator.ts b/apps/server/src/decorators/auth-workspace.decorator.ts new file mode 100644 index 0000000..51529c2 --- /dev/null +++ b/apps/server/src/decorators/auth-workspace.decorator.ts @@ -0,0 +1,8 @@ +import { createParamDecorator, ExecutionContext } from '@nestjs/common'; + +export const AuthWorkspace = createParamDecorator( + (data: unknown, ctx: ExecutionContext) => { + const request = ctx.switchToHttp().getRequest(); + return request.user.workspace; + }, +); diff --git a/apps/server/src/decorators/current-workspace.decorator.ts b/apps/server/src/decorators/current-workspace.decorator.ts deleted file mode 100644 index 05bedf4..0000000 --- a/apps/server/src/decorators/current-workspace.decorator.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { - createParamDecorator, - ExecutionContext, - UnauthorizedException, -} from '@nestjs/common'; - -export const CurrentWorkspace = createParamDecorator( - (data: unknown, ctx: ExecutionContext) => { - const request = ctx.switchToHttp().getRequest(); - - if (!request['user'] || !request['user'].workspace) { - throw new UnauthorizedException('Workspace not found'); - } - - return request['user'] ? request['user'].workspace : undefined; - }, -); diff --git a/apps/server/src/environment/environment.service.ts b/apps/server/src/environment/environment.service.ts index 2c28ce8..5dc9897 100644 --- a/apps/server/src/environment/environment.service.ts +++ b/apps/server/src/environment/environment.service.ts @@ -59,4 +59,15 @@ export class EnvironmentService { getAwsS3UsePathStyleEndpoint(): boolean { return this.configService.get('AWS_S3_USE_PATH_STYLE_ENDPOINT'); } + + isCloud(): boolean { + const cloudConfig = this.configService + .get('CLOUD', 'false') + .toLowerCase(); + return cloudConfig === 'true'; + } + + isSelfHosted(): boolean { + return !this.isCloud(); + } } diff --git a/apps/server/src/guards/jwt-auth.guard.ts b/apps/server/src/guards/jwt-auth.guard.ts new file mode 100644 index 0000000..7b618c8 --- /dev/null +++ b/apps/server/src/guards/jwt-auth.guard.ts @@ -0,0 +1,35 @@ +import { + ExecutionContext, + Injectable, + UnauthorizedException, +} from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; +import { IS_PUBLIC_KEY } from '../decorators/public.decorator'; +import { Reflector } from '@nestjs/core'; + +@Injectable() +export class JwtAuthGuard extends AuthGuard('jwt') { + constructor(private reflector: Reflector) { + super(); + } + + canActivate(context: ExecutionContext) { + const isPublic = this.reflector.getAllAndOverride(IS_PUBLIC_KEY, [ + context.getHandler(), + context.getClass(), + ]); + + if (isPublic) { + return true; + } + + return super.canActivate(context); + } + + handleRequest(err: any, user: any, info: any) { + if (err || !user) { + throw err || new UnauthorizedException(); + } + return user; + } +} diff --git a/apps/server/src/helpers/db.helper.ts b/apps/server/src/helpers/db.helper.ts index 0a269fa..850aa35 100644 --- a/apps/server/src/helpers/db.helper.ts +++ b/apps/server/src/helpers/db.helper.ts @@ -4,7 +4,7 @@ export async function transactionWrapper( operation: (...args) => any, datasource: DataSource, entityManager: EntityManager, -) { +): Promise { if (entityManager) { return await operation(entityManager); } else { diff --git a/apps/server/src/helpers/types/permission.ts b/apps/server/src/helpers/types/permission.ts new file mode 100644 index 0000000..4e8ddc2 --- /dev/null +++ b/apps/server/src/helpers/types/permission.ts @@ -0,0 +1,16 @@ +export enum UserRole { + OWNER = 'owner', + ADMIN = 'admin', // can have owner permissions but cannot delete workspace + MEMBER = 'member', +} + +export enum SpaceRole { + OWNER = 'owner', // can add members, remove, and delete space + WRITER = 'writer', // can read and write pages in space + READER = 'reader', // can only read pages in space +} + +export enum SpacePrivacy { + OPEN = 'open', // any workspace member can see and join. + PRIVATE = 'private', // only added space users can see +} diff --git a/apps/server/src/core/workspace/workspace.util.ts b/apps/server/src/helpers/utils.ts similarity index 100% rename from apps/server/src/core/workspace/workspace.util.ts rename to apps/server/src/helpers/utils.ts diff --git a/apps/server/src/core/storage/constants/storage.constants.ts b/apps/server/src/integrations/storage/constants/storage.constants.ts similarity index 100% rename from apps/server/src/core/storage/constants/storage.constants.ts rename to apps/server/src/integrations/storage/constants/storage.constants.ts diff --git a/apps/server/src/core/storage/drivers/index.ts b/apps/server/src/integrations/storage/drivers/index.ts similarity index 100% rename from apps/server/src/core/storage/drivers/index.ts rename to apps/server/src/integrations/storage/drivers/index.ts diff --git a/apps/server/src/core/storage/drivers/local.driver.ts b/apps/server/src/integrations/storage/drivers/local.driver.ts similarity index 100% rename from apps/server/src/core/storage/drivers/local.driver.ts rename to apps/server/src/integrations/storage/drivers/local.driver.ts diff --git a/apps/server/src/core/storage/drivers/s3.driver.ts b/apps/server/src/integrations/storage/drivers/s3.driver.ts similarity index 100% rename from apps/server/src/core/storage/drivers/s3.driver.ts rename to apps/server/src/integrations/storage/drivers/s3.driver.ts diff --git a/apps/server/src/core/storage/interfaces/index.ts b/apps/server/src/integrations/storage/interfaces/index.ts similarity index 100% rename from apps/server/src/core/storage/interfaces/index.ts rename to apps/server/src/integrations/storage/interfaces/index.ts diff --git a/apps/server/src/core/storage/interfaces/storage-driver.interface.ts b/apps/server/src/integrations/storage/interfaces/storage-driver.interface.ts similarity index 100% rename from apps/server/src/core/storage/interfaces/storage-driver.interface.ts rename to apps/server/src/integrations/storage/interfaces/storage-driver.interface.ts diff --git a/apps/server/src/core/storage/interfaces/storage.interface.ts b/apps/server/src/integrations/storage/interfaces/storage.interface.ts similarity index 100% rename from apps/server/src/core/storage/interfaces/storage.interface.ts rename to apps/server/src/integrations/storage/interfaces/storage.interface.ts diff --git a/apps/server/src/core/storage/providers/storage.provider.ts b/apps/server/src/integrations/storage/providers/storage.provider.ts similarity index 100% rename from apps/server/src/core/storage/providers/storage.provider.ts rename to apps/server/src/integrations/storage/providers/storage.provider.ts diff --git a/apps/server/src/core/storage/storage.module.ts b/apps/server/src/integrations/storage/storage.module.ts similarity index 100% rename from apps/server/src/core/storage/storage.module.ts rename to apps/server/src/integrations/storage/storage.module.ts diff --git a/apps/server/src/core/storage/storage.service.spec.ts b/apps/server/src/integrations/storage/storage.service.spec.ts similarity index 100% rename from apps/server/src/core/storage/storage.service.spec.ts rename to apps/server/src/integrations/storage/storage.service.spec.ts diff --git a/apps/server/src/core/storage/storage.service.ts b/apps/server/src/integrations/storage/storage.service.ts similarity index 100% rename from apps/server/src/core/storage/storage.service.ts rename to apps/server/src/integrations/storage/storage.service.ts diff --git a/apps/server/src/core/storage/storage.utils.ts b/apps/server/src/integrations/storage/storage.utils.ts similarity index 100% rename from apps/server/src/core/storage/storage.utils.ts rename to apps/server/src/integrations/storage/storage.utils.ts diff --git a/apps/server/src/middlewares/domain.middleware.ts b/apps/server/src/middlewares/domain.middleware.ts new file mode 100644 index 0000000..239c08f --- /dev/null +++ b/apps/server/src/middlewares/domain.middleware.ts @@ -0,0 +1,41 @@ +import { Injectable, NestMiddleware, NotFoundException } from '@nestjs/common'; +import { FastifyRequest, FastifyReply } from 'fastify'; +import { WorkspaceRepository } from '../core/workspace/repositories/workspace.repository'; +import { EnvironmentService } from '../environment/environment.service'; + +@Injectable() +export class DomainMiddleware implements NestMiddleware { + constructor( + private workspaceRepository: WorkspaceRepository, + private environmentService: EnvironmentService, + ) {} + async use( + req: FastifyRequest['raw'], + res: FastifyReply['raw'], + next: () => void, + ) { + if (this.environmentService.isSelfHosted()) { + const workspace = await this.workspaceRepository.findFirst(); + if (!workspace) { + throw new NotFoundException('Workspace not found'); + } + + (req as any).workspaceId = workspace.id; + } else if (this.environmentService.isCloud()) { + const header = req.headers.host; + const subdomain = header.split('.')[0]; + + const workspace = await this.workspaceRepository.findOneBy({ + hostname: subdomain, + }); + + if (!workspace) { + throw new NotFoundException('Workspace not found'); + } + + (req as any).workspaceId = workspace.id; + } + + next(); + } +} diff --git a/apps/server/tsconfig.json b/apps/server/tsconfig.json index 95f5641..3b92ed7 100644 --- a/apps/server/tsconfig.json +++ b/apps/server/tsconfig.json @@ -16,6 +16,6 @@ "noImplicitAny": false, "strictBindCallApply": false, "forceConsistentCasingInFileNames": false, - "noFallthroughCasesInSwitch": false + "noFallthroughCasesInSwitch": false, } } diff --git a/package.json b/package.json index 77f5bcf..75b8bdd 100644 --- a/package.json +++ b/package.json @@ -7,9 +7,9 @@ }, "dependencies": { "@docmost/editor-ext": "workspace:*", - "@hocuspocus/provider": "^2.9.0", - "@hocuspocus/server": "^2.9.0", - "@hocuspocus/transformer": "^2.9.0", + "@hocuspocus/provider": "^2.11.3", + "@hocuspocus/server": "^2.11.3", + "@hocuspocus/transformer": "^2.11.3", "@tiptap/extension-code-block": "^2.1.12", "@tiptap/extension-collaboration": "^2.1.12", "@tiptap/extension-collaboration-cursor": "^2.1.12", @@ -37,7 +37,7 @@ "@tiptap/starter-kit": "^2.1.12", "@tiptap/suggestion": "^2.1.12", "y-indexeddb": "^9.0.12", - "yjs": "^13.6.10" + "yjs": "^13.6.14" }, "devDependencies": { "@nx/js": "17.2.8", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c268143..1452ff0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,14 +12,14 @@ importers: specifier: workspace:* version: link:packages/editor-ext '@hocuspocus/provider': - specifier: ^2.9.0 - version: 2.9.0(y-protocols@1.0.6)(yjs@13.6.10) + specifier: ^2.11.3 + version: 2.11.3(y-protocols@1.0.6)(yjs@13.6.14) '@hocuspocus/server': - specifier: ^2.9.0 - version: 2.9.0(y-protocols@1.0.6)(yjs@13.6.10) + specifier: ^2.11.3 + version: 2.11.3(y-protocols@1.0.6)(yjs@13.6.14) '@hocuspocus/transformer': - specifier: ^2.9.0 - version: 2.9.0(@tiptap/pm@2.1.16)(y-prosemirror@1.2.2)(yjs@13.6.10) + specifier: ^2.11.3 + version: 2.11.3(@tiptap/pm@2.1.16)(y-prosemirror@1.2.2)(yjs@13.6.14) '@tiptap/extension-code-block': specifier: ^2.1.12 version: 2.1.16(@tiptap/core@2.1.16)(@tiptap/pm@2.1.16) @@ -100,14 +100,14 @@ importers: version: 2.1.16(@tiptap/core@2.1.16)(@tiptap/pm@2.1.16) y-indexeddb: specifier: ^9.0.12 - version: 9.0.12(yjs@13.6.10) + version: 9.0.12(yjs@13.6.14) yjs: - specifier: ^13.6.10 - version: 13.6.10 + specifier: ^13.6.14 + version: 13.6.14 devDependencies: '@nx/js': specifier: 17.2.8 - version: 17.2.8(@types/node@20.11.5)(nx@17.2.8)(typescript@5.3.3) + version: 17.2.8(@types/node@20.11.28)(nx@17.2.8)(typescript@5.4.2) nx: specifier: 17.2.8 version: 17.2.8 @@ -121,47 +121,47 @@ importers: specifier: ^1.1.1 version: 1.1.1(emoji-mart@5.5.2)(react@18.2.0) '@mantine/core': - specifier: ^7.4.2 - version: 7.4.2(@mantine/hooks@7.4.2)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) + specifier: ^7.6.2 + version: 7.6.2(@mantine/hooks@7.6.2)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0) '@mantine/form': - specifier: ^7.4.2 - version: 7.4.2(react@18.2.0) + specifier: ^7.6.2 + version: 7.6.2(react@18.2.0) '@mantine/hooks': - specifier: ^7.4.2 - version: 7.4.2(react@18.2.0) + specifier: ^7.6.2 + version: 7.6.2(react@18.2.0) '@mantine/modals': - specifier: ^7.4.2 - version: 7.4.2(@mantine/core@7.4.2)(@mantine/hooks@7.4.2)(react-dom@18.2.0)(react@18.2.0) + specifier: ^7.6.2 + version: 7.6.2(@mantine/core@7.6.2)(@mantine/hooks@7.6.2)(react-dom@18.2.0)(react@18.2.0) '@mantine/notifications': - specifier: ^7.4.2 - version: 7.4.2(@mantine/core@7.4.2)(@mantine/hooks@7.4.2)(react-dom@18.2.0)(react@18.2.0) + specifier: ^7.6.2 + version: 7.6.2(@mantine/core@7.6.2)(@mantine/hooks@7.6.2)(react-dom@18.2.0)(react@18.2.0) '@mantine/spotlight': - specifier: ^7.4.2 - version: 7.4.2(@mantine/core@7.4.2)(@mantine/hooks@7.4.2)(react-dom@18.2.0)(react@18.2.0) + specifier: ^7.6.2 + version: 7.6.2(@mantine/core@7.6.2)(@mantine/hooks@7.6.2)(react-dom@18.2.0)(react@18.2.0) '@tabler/icons-react': - specifier: ^2.46.0 - version: 2.46.0(react@18.2.0) + specifier: ^3.1.0 + version: 3.1.0(react@18.2.0) '@tanstack/react-query': - specifier: ^5.17.19 - version: 5.17.19(react@18.2.0) + specifier: ^5.28.4 + version: 5.28.4(react@18.2.0) axios: - specifier: ^1.6.5 - version: 1.6.5 + specifier: ^1.6.8 + version: 1.6.8 clsx: specifier: ^2.1.0 version: 2.1.0 date-fns: - specifier: ^3.3.1 - version: 3.3.1 + specifier: ^3.5.0 + version: 3.5.0 emoji-mart: specifier: ^5.5.2 version: 5.5.2 jotai: - specifier: ^2.6.2 - version: 2.6.2(@types/react@18.2.48)(react@18.2.0) + specifier: ^2.7.1 + version: 2.7.1(@types/react@18.2.66)(react@18.2.0) jotai-optics: - specifier: ^0.3.1 - version: 0.3.1(jotai@2.6.2)(optics-ts@2.4.1) + specifier: ^0.3.2 + version: 0.3.2(jotai@2.7.1)(optics-ts@2.4.1) js-cookie: specifier: ^3.0.5 version: 3.0.5 @@ -170,16 +170,16 @@ importers: version: 18.2.0 react-arborist: specifier: ^3.4.0 - version: 3.4.0(@types/node@20.11.5)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) + version: 3.4.0(@types/node@20.11.28)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0) react-dom: specifier: ^18.2.0 version: 18.2.0(react@18.2.0) react-router-dom: - specifier: ^6.21.3 - version: 6.21.3(react-dom@18.2.0)(react@18.2.0) + specifier: ^6.22.3 + version: 6.22.3(react-dom@18.2.0)(react@18.2.0) socket.io-client: - specifier: ^4.7.4 - version: 4.7.4 + specifier: ^4.7.5 + version: 4.7.5 tippy.js: specifier: ^6.3.7 version: 6.3.7 @@ -191,71 +191,71 @@ importers: version: 3.22.4 devDependencies: '@tanstack/eslint-plugin-query': - specifier: ^5.17.20 - version: 5.17.20(eslint@8.56.0)(typescript@5.3.3) + specifier: ^5.27.7 + version: 5.27.7(eslint@8.57.0)(typescript@5.4.2) '@types/js-cookie': specifier: ^3.0.6 version: 3.0.6 '@types/node': - specifier: 20.11.5 - version: 20.11.5 + specifier: 20.11.28 + version: 20.11.28 '@types/react': - specifier: ^18.2.48 - version: 18.2.48 + specifier: ^18.2.66 + version: 18.2.66 '@types/react-dom': - specifier: ^18.2.18 - version: 18.2.18 + specifier: ^18.2.22 + version: 18.2.22 '@types/uuid': - specifier: ^9.0.7 - version: 9.0.7 + specifier: ^9.0.8 + version: 9.0.8 '@typescript-eslint/eslint-plugin': - specifier: ^6.19.0 - version: 6.19.0(@typescript-eslint/parser@6.19.0)(eslint@8.56.0)(typescript@5.3.3) + specifier: ^7.2.0 + version: 7.2.0(@typescript-eslint/parser@7.2.0)(eslint@8.57.0)(typescript@5.4.2) '@typescript-eslint/parser': - specifier: ^6.19.0 - version: 6.19.0(eslint@8.56.0)(typescript@5.3.3) + specifier: ^7.2.0 + version: 7.2.0(eslint@8.57.0)(typescript@5.4.2) '@vitejs/plugin-react': specifier: ^4.2.1 - version: 4.2.1(vite@5.0.12) + version: 4.2.1(vite@5.1.6) eslint: - specifier: ^8.56.0 - version: 8.56.0 + specifier: ^8.57.0 + version: 8.57.0 eslint-plugin-react-hooks: specifier: ^4.6.0 - version: 4.6.0(eslint@8.56.0) + version: 4.6.0(eslint@8.57.0) eslint-plugin-react-refresh: - specifier: ^0.4.5 - version: 0.4.5(eslint@8.56.0) + specifier: ^0.4.6 + version: 0.4.6(eslint@8.57.0) optics-ts: specifier: ^2.4.1 version: 2.4.1 postcss: - specifier: ^8.4.33 - version: 8.4.33 + specifier: ^8.4.35 + version: 8.4.35 postcss-preset-mantine: - specifier: ^1.12.3 - version: 1.12.3(postcss@8.4.33) + specifier: ^1.13.0 + version: 1.13.0(postcss@8.4.35) postcss-simple-vars: specifier: ^7.0.1 - version: 7.0.1(postcss@8.4.33) + version: 7.0.1(postcss@8.4.35) prettier: - specifier: ^3.2.4 - version: 3.2.4 + specifier: ^3.2.5 + version: 3.2.5 typescript: - specifier: ^5.3.3 - version: 5.3.3 + specifier: ^5.4.2 + version: 5.4.2 vite: - specifier: ^5.0.12 - version: 5.0.12(@types/node@20.11.5) + specifier: ^5.1.6 + version: 5.1.6(@types/node@20.11.28) apps/server: dependencies: '@aws-sdk/client-s3': - specifier: ^3.456.0 - version: 3.485.0 + specifier: ^3.535.0 + version: 3.535.0 '@aws-sdk/s3-request-presigner': - specifier: ^3.456.0 - version: 3.485.0 + specifier: ^3.535.0 + version: 3.535.0 '@casl/ability': specifier: ^6.7.0 version: 6.7.0 @@ -263,38 +263,41 @@ importers: specifier: ^8.1.0 version: 8.1.0 '@fastify/static': - specifier: ^6.12.0 - version: 6.12.0 + specifier: ^7.0.1 + version: 7.0.1 '@nestjs/common': - specifier: ^10.3.0 - version: 10.3.0(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) + specifier: ^10.3.3 + version: 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) '@nestjs/config': - specifier: ^3.1.1 - version: 3.1.1(@nestjs/common@10.3.0)(reflect-metadata@0.1.14) + specifier: ^3.2.0 + version: 3.2.0(@nestjs/common@10.3.3)(rxjs@7.8.1) '@nestjs/core': - specifier: ^10.3.0 - version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/websockets@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) + specifier: ^10.3.3 + version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/websockets@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) '@nestjs/jwt': specifier: ^10.2.0 - version: 10.2.0(@nestjs/common@10.3.0) + version: 10.2.0(@nestjs/common@10.3.3) '@nestjs/mapped-types': - specifier: ^2.0.4 - version: 2.0.4(@nestjs/common@10.3.0)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.14) + specifier: ^2.0.5 + version: 2.0.5(@nestjs/common@10.3.3)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1) + '@nestjs/passport': + specifier: ^10.0.3 + version: 10.0.3(@nestjs/common@10.3.3)(passport@0.7.0) '@nestjs/platform-fastify': - specifier: ^10.3.0 - version: 10.3.0(@fastify/static@6.12.0)(@nestjs/common@10.3.0)(@nestjs/core@10.3.0) + specifier: ^10.3.3 + version: 10.3.3(@fastify/static@7.0.1)(@nestjs/common@10.3.3)(@nestjs/core@10.3.3) '@nestjs/platform-socket.io': - specifier: ^10.3.0 - version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/websockets@10.3.0)(rxjs@7.8.1) + specifier: ^10.3.3 + version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/websockets@10.3.3)(rxjs@7.8.1) '@nestjs/serve-static': - specifier: ^4.0.0 - version: 4.0.0(@fastify/static@6.12.0)(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(fastify@4.25.2) + specifier: ^4.0.1 + version: 4.0.1(@fastify/static@7.0.1)(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(fastify@4.26.2) '@nestjs/typeorm': - specifier: ^10.0.1 - version: 10.0.1(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1)(typeorm@0.3.19) + specifier: ^10.0.2 + version: 10.0.2(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1)(typeorm@0.3.20) '@nestjs/websockets': - specifier: ^10.3.0 - version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(@nestjs/platform-socket.io@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) + specifier: ^10.3.3 + version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(@nestjs/platform-socket.io@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) bcrypt: specifier: ^5.1.1 version: 5.1.1 @@ -305,26 +308,29 @@ importers: specifier: ^0.5.1 version: 0.5.1 class-validator: - specifier: ^0.14.0 - version: 0.14.0 + specifier: ^0.14.1 + version: 0.14.1 fastify: - specifier: ^4.25.2 - version: 4.25.2 + specifier: ^4.26.2 + version: 4.26.2 fs-extra: - specifier: ^11.1.1 + specifier: ^11.2.0 version: 11.2.0 mime-types: specifier: ^2.1.35 version: 2.1.35 + passport-jwt: + specifier: ^4.0.1 + version: 4.0.1 pg: specifier: ^8.11.3 version: 8.11.3 pg-tsquery: - specifier: ^8.4.1 - version: 8.4.1 + specifier: ^8.4.2 + version: 8.4.2 reflect-metadata: - specifier: ^0.1.13 - version: 0.1.14 + specifier: ^0.2.1 + version: 0.2.1 rxjs: specifier: ^7.8.1 version: 7.8.1 @@ -335,27 +341,27 @@ importers: specifier: ^1.6.6 version: 1.6.6 socket.io: - specifier: ^4.7.2 - version: 4.7.3 + specifier: ^4.7.5 + version: 4.7.5 typeorm: - specifier: ^0.3.17 - version: 0.3.19(pg@8.11.3)(ts-node@10.9.2) + specifier: ^0.3.20 + version: 0.3.20(pg@8.11.3)(ts-node@10.9.2) uuid: specifier: ^9.0.1 version: 9.0.1 ws: - specifier: ^8.14.2 + specifier: ^8.16.0 version: 8.16.0 devDependencies: '@nestjs/cli': - specifier: ^10.2.1 - version: 10.3.0 + specifier: ^10.3.2 + version: 10.3.2 '@nestjs/schematics': - specifier: ^10.0.3 - version: 10.1.0(chokidar@3.5.3)(typescript@5.3.3) + specifier: ^10.1.1 + version: 10.1.1(typescript@5.4.2) '@nestjs/testing': - specifier: ^10.3.0 - version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0) + specifier: ^10.3.3 + version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3) '@types/bcrypt': specifier: ^5.0.2 version: 5.0.2 @@ -369,65 +375,68 @@ importers: specifier: ^11.0.4 version: 11.0.4 '@types/jest': - specifier: ^29.5.10 - version: 29.5.11 + specifier: ^29.5.12 + version: 29.5.12 '@types/mime-types': specifier: ^2.1.4 version: 2.1.4 '@types/node': - specifier: ^20.10.0 - version: 20.10.0 + specifier: ^20.11.28 + version: 20.11.28 + '@types/passport-jwt': + specifier: ^4.0.1 + version: 4.0.1 '@types/supertest': - specifier: ^2.0.16 - version: 2.0.16 + specifier: ^6.0.2 + version: 6.0.2 '@types/uuid': - specifier: ^9.0.7 - version: 9.0.7 + specifier: ^9.0.8 + version: 9.0.8 '@types/ws': specifier: ^8.5.10 version: 8.5.10 '@typescript-eslint/eslint-plugin': - specifier: ^5.62.0 - version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.56.0)(typescript@5.3.3) + specifier: ^7.2.0 + version: 7.2.0(@typescript-eslint/parser@7.2.0)(eslint@8.57.0)(typescript@5.4.2) '@typescript-eslint/parser': - specifier: ^5.62.0 - version: 5.62.0(eslint@8.56.0)(typescript@5.3.3) + specifier: ^7.2.0 + version: 7.2.0(eslint@8.57.0)(typescript@5.4.2) eslint: - specifier: ^8.54.0 - version: 8.56.0 + specifier: ^8.57.0 + version: 8.57.0 eslint-config-prettier: - specifier: ^8.10.0 - version: 8.10.0(eslint@8.56.0) + specifier: ^9.1.0 + version: 9.1.0(eslint@8.57.0) eslint-plugin-prettier: - specifier: ^4.2.1 - version: 4.2.1(eslint-config-prettier@8.10.0)(eslint@8.56.0)(prettier@2.8.8) + specifier: ^5.1.3 + version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5) jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.10.0)(ts-node@10.9.2) + version: 29.7.0(@types/node@20.11.28)(ts-node@10.9.2) prettier: - specifier: ^2.8.8 - version: 2.8.8 + specifier: ^3.2.5 + version: 3.2.5 source-map-support: specifier: ^0.5.21 version: 0.5.21 supertest: - specifier: ^6.3.3 - version: 6.3.3 + specifier: ^6.3.4 + version: 6.3.4 ts-jest: - specifier: ^29.1.1 - version: 29.1.1(@babel/core@7.23.7)(jest@29.7.0)(typescript@5.3.3) + specifier: ^29.1.2 + version: 29.1.2(@babel/core@7.23.7)(jest@29.7.0)(typescript@5.4.2) ts-loader: specifier: ^9.5.1 - version: 9.5.1(typescript@5.3.3)(webpack@5.89.0) + version: 9.5.1(typescript@5.4.2)(webpack@5.89.0) ts-node: - specifier: ^10.9.1 - version: 10.9.2(@types/node@20.10.0)(typescript@5.3.3) + specifier: ^10.9.2 + version: 10.9.2(@types/node@20.11.28)(typescript@5.4.2) tsconfig-paths: specifier: ^4.2.0 version: 4.2.0 typescript: - specifier: ^5.3.2 - version: 5.3.3 + specifier: ^5.4.2 + version: 5.4.2 packages/editor-ext: {} @@ -446,8 +455,8 @@ packages: '@jridgewell/trace-mapping': 0.3.20 dev: true - /@angular-devkit/core@17.0.9(chokidar@3.5.3): - resolution: {integrity: sha512-r5jqwpWOgowqe9KSDqJ3iSbmsEt2XPjSvRG4DSI2T9s31bReoMtreo8b7wkRa2B3hbcDnstFbn8q27VvJDqRaQ==} + /@angular-devkit/core@17.1.2(chokidar@3.6.0): + resolution: {integrity: sha512-ku+/W/HMCBacSWFppenr9y6Lx8mDuTuQvn1IkTyBLiJOpWnzgVbx9kHDeaDchGa1PwLlJUBBrv27t3qgJOIDPw==} engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: chokidar: ^3.5.2 @@ -457,33 +466,33 @@ packages: dependencies: ajv: 8.12.0 ajv-formats: 2.1.1(ajv@8.12.0) - chokidar: 3.5.3 + chokidar: 3.6.0 jsonc-parser: 3.2.0 picomatch: 3.0.1 rxjs: 7.8.1 source-map: 0.7.4 dev: true - /@angular-devkit/schematics-cli@17.0.9(chokidar@3.5.3): - resolution: {integrity: sha512-tznzzB26sy8jVUlV9HhXcbFYZcIIFMAiDMOuyLko2LZFjfoqW+OPvwa1mwAQwvVVSQZVAKvdndFhzwyl/axwFQ==} + /@angular-devkit/schematics-cli@17.1.2(chokidar@3.6.0): + resolution: {integrity: sha512-bvXykYzSST05qFdlgIzUguNOb3z0hCa8HaTwtqdmQo9aFPf+P+/AC56I64t1iTchMjQtf3JrBQhYM25gUdcGbg==} engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} hasBin: true dependencies: - '@angular-devkit/core': 17.0.9(chokidar@3.5.3) - '@angular-devkit/schematics': 17.0.9(chokidar@3.5.3) + '@angular-devkit/core': 17.1.2(chokidar@3.6.0) + '@angular-devkit/schematics': 17.1.2(chokidar@3.6.0) ansi-colors: 4.1.3 - inquirer: 9.2.11 + inquirer: 9.2.12 symbol-observable: 4.0.0 yargs-parser: 21.1.1 transitivePeerDependencies: - chokidar dev: true - /@angular-devkit/schematics@17.0.9(chokidar@3.5.3): - resolution: {integrity: sha512-5ti7g45F2KjDJS0DbgnOGI1GyKxGpn4XsKTYJFJrSAWj6VpuvPy/DINRrXNuRVo09VPEkqA+IW7QwaG9icptQg==} + /@angular-devkit/schematics@17.1.2(chokidar@3.6.0): + resolution: {integrity: sha512-8S9RuM8olFN/gwN+mjbuF1CwHX61f0i59EGXz9tXLnKRUTjsRR+8vVMTAmX0dvVAT5fJTG/T69X+HX7FeumdqA==} engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} dependencies: - '@angular-devkit/core': 17.0.9(chokidar@3.5.3) + '@angular-devkit/core': 17.1.2(chokidar@3.6.0) jsonc-parser: 3.2.0 magic-string: 0.30.5 ora: 5.4.1 @@ -496,7 +505,7 @@ packages: resolution: {integrity: sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==} dependencies: '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.485.0 + '@aws-sdk/types': 3.535.0 tslib: 1.14.1 dev: false @@ -504,7 +513,7 @@ packages: resolution: {integrity: sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w==} dependencies: '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.485.0 + '@aws-sdk/types': 3.535.0 tslib: 1.14.1 dev: false @@ -520,7 +529,7 @@ packages: '@aws-crypto/ie11-detection': 3.0.0 '@aws-crypto/supports-web-crypto': 3.0.0 '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.485.0 + '@aws-sdk/types': 3.535.0 '@aws-sdk/util-locate-window': 3.465.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 @@ -533,7 +542,7 @@ packages: '@aws-crypto/sha256-js': 3.0.0 '@aws-crypto/supports-web-crypto': 3.0.0 '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.485.0 + '@aws-sdk/types': 3.535.0 '@aws-sdk/util-locate-window': 3.465.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 @@ -543,7 +552,7 @@ packages: resolution: {integrity: sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==} dependencies: '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.485.0 + '@aws-sdk/types': 3.535.0 tslib: 1.14.1 dev: false @@ -556,501 +565,548 @@ packages: /@aws-crypto/util@3.0.0: resolution: {integrity: sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==} dependencies: - '@aws-sdk/types': 3.485.0 + '@aws-sdk/types': 3.535.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 dev: false - /@aws-sdk/client-s3@3.485.0: - resolution: {integrity: sha512-Vh8FRiXekwu1sSdfhS/wpNzjIljPmIXrUdEapR7EmaIwditR+mTTzNS+7y69YdPQhVEE2u9QxRlo4Eg1e1jD3w==} + /@aws-sdk/client-s3@3.535.0: + resolution: {integrity: sha512-qcFCP9a695ZvAbm+hRMyfE2PjqnSkq0Bl57X7z8gHUg4TIjKJHTP7mtND21A4YaWigegQL6OA5kMXMZbCcugLA==} engines: {node: '>=14.0.0'} dependencies: '@aws-crypto/sha1-browser': 3.0.0 '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sts': 3.485.0 - '@aws-sdk/core': 3.485.0 - '@aws-sdk/credential-provider-node': 3.485.0 - '@aws-sdk/middleware-bucket-endpoint': 3.485.0 - '@aws-sdk/middleware-expect-continue': 3.485.0 - '@aws-sdk/middleware-flexible-checksums': 3.485.0 - '@aws-sdk/middleware-host-header': 3.485.0 - '@aws-sdk/middleware-location-constraint': 3.485.0 - '@aws-sdk/middleware-logger': 3.485.0 - '@aws-sdk/middleware-recursion-detection': 3.485.0 - '@aws-sdk/middleware-sdk-s3': 3.485.0 - '@aws-sdk/middleware-signing': 3.485.0 - '@aws-sdk/middleware-ssec': 3.485.0 - '@aws-sdk/middleware-user-agent': 3.485.0 - '@aws-sdk/region-config-resolver': 3.485.0 - '@aws-sdk/signature-v4-multi-region': 3.485.0 - '@aws-sdk/types': 3.485.0 - '@aws-sdk/util-endpoints': 3.485.0 - '@aws-sdk/util-user-agent-browser': 3.485.0 - '@aws-sdk/util-user-agent-node': 3.485.0 - '@aws-sdk/xml-builder': 3.485.0 - '@smithy/config-resolver': 2.0.23 - '@smithy/core': 1.2.2 - '@smithy/eventstream-serde-browser': 2.0.16 - '@smithy/eventstream-serde-config-resolver': 2.0.16 - '@smithy/eventstream-serde-node': 2.0.16 - '@smithy/fetch-http-handler': 2.3.2 - '@smithy/hash-blob-browser': 2.0.17 - '@smithy/hash-node': 2.0.18 - '@smithy/hash-stream-node': 2.0.18 - '@smithy/invalid-dependency': 2.0.16 - '@smithy/md5-js': 2.0.18 - '@smithy/middleware-content-length': 2.0.18 - '@smithy/middleware-endpoint': 2.3.0 - '@smithy/middleware-retry': 2.0.26 - '@smithy/middleware-serde': 2.0.16 - '@smithy/middleware-stack': 2.0.10 - '@smithy/node-config-provider': 2.1.9 - '@smithy/node-http-handler': 2.2.2 - '@smithy/protocol-http': 3.0.12 - '@smithy/smithy-client': 2.2.1 - '@smithy/types': 2.8.0 - '@smithy/url-parser': 2.0.16 - '@smithy/util-base64': 2.0.1 - '@smithy/util-body-length-browser': 2.0.1 - '@smithy/util-body-length-node': 2.1.0 - '@smithy/util-defaults-mode-browser': 2.0.24 - '@smithy/util-defaults-mode-node': 2.0.32 - '@smithy/util-endpoints': 1.0.8 - '@smithy/util-retry': 2.0.9 - '@smithy/util-stream': 2.0.24 - '@smithy/util-utf8': 2.0.2 - '@smithy/util-waiter': 2.0.16 - fast-xml-parser: 4.2.5 + '@aws-sdk/client-sts': 3.535.0(@aws-sdk/credential-provider-node@3.535.0) + '@aws-sdk/core': 3.535.0 + '@aws-sdk/credential-provider-node': 3.535.0 + '@aws-sdk/middleware-bucket-endpoint': 3.535.0 + '@aws-sdk/middleware-expect-continue': 3.535.0 + '@aws-sdk/middleware-flexible-checksums': 3.535.0 + '@aws-sdk/middleware-host-header': 3.535.0 + '@aws-sdk/middleware-location-constraint': 3.535.0 + '@aws-sdk/middleware-logger': 3.535.0 + '@aws-sdk/middleware-recursion-detection': 3.535.0 + '@aws-sdk/middleware-sdk-s3': 3.535.0 + '@aws-sdk/middleware-signing': 3.535.0 + '@aws-sdk/middleware-ssec': 3.535.0 + '@aws-sdk/middleware-user-agent': 3.535.0 + '@aws-sdk/region-config-resolver': 3.535.0 + '@aws-sdk/signature-v4-multi-region': 3.535.0 + '@aws-sdk/types': 3.535.0 + '@aws-sdk/util-endpoints': 3.535.0 + '@aws-sdk/util-user-agent-browser': 3.535.0 + '@aws-sdk/util-user-agent-node': 3.535.0 + '@aws-sdk/xml-builder': 3.535.0 + '@smithy/config-resolver': 2.2.0 + '@smithy/core': 1.4.0 + '@smithy/eventstream-serde-browser': 2.2.0 + '@smithy/eventstream-serde-config-resolver': 2.2.0 + '@smithy/eventstream-serde-node': 2.2.0 + '@smithy/fetch-http-handler': 2.5.0 + '@smithy/hash-blob-browser': 2.2.0 + '@smithy/hash-node': 2.2.0 + '@smithy/hash-stream-node': 2.2.0 + '@smithy/invalid-dependency': 2.2.0 + '@smithy/md5-js': 2.2.0 + '@smithy/middleware-content-length': 2.2.0 + '@smithy/middleware-endpoint': 2.5.0 + '@smithy/middleware-retry': 2.2.0 + '@smithy/middleware-serde': 2.3.0 + '@smithy/middleware-stack': 2.2.0 + '@smithy/node-config-provider': 2.3.0 + '@smithy/node-http-handler': 2.5.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/smithy-client': 2.5.0 + '@smithy/types': 2.12.0 + '@smithy/url-parser': 2.2.0 + '@smithy/util-base64': 2.3.0 + '@smithy/util-body-length-browser': 2.2.0 + '@smithy/util-body-length-node': 2.3.0 + '@smithy/util-defaults-mode-browser': 2.2.0 + '@smithy/util-defaults-mode-node': 2.3.0 + '@smithy/util-endpoints': 1.2.0 + '@smithy/util-retry': 2.2.0 + '@smithy/util-stream': 2.2.0 + '@smithy/util-utf8': 2.3.0 + '@smithy/util-waiter': 2.2.0 tslib: 2.6.2 transitivePeerDependencies: - aws-crt dev: false - /@aws-sdk/client-sso@3.485.0: - resolution: {integrity: sha512-apN2bEn0PZs0jD4jAfvwO3dlWqw9YIQJ6TAudM1bd3S5vzWqlBBcLfQpK6taHoQaI+WqgUWXLuOf7gRFbGXKPg==} + /@aws-sdk/client-sso-oidc@3.535.0(@aws-sdk/credential-provider-node@3.535.0): + resolution: {integrity: sha512-M2cG4EQXDpAJQyq33ORIr6abmdX9p9zX0ssVy8XwFNB7lrgoIKxuVoGL+fX+XMgecl24x7ELz6b4QlILOevbCw==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@aws-sdk/credential-provider-node': ^3.535.0 + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/client-sts': 3.535.0(@aws-sdk/credential-provider-node@3.535.0) + '@aws-sdk/core': 3.535.0 + '@aws-sdk/credential-provider-node': 3.535.0 + '@aws-sdk/middleware-host-header': 3.535.0 + '@aws-sdk/middleware-logger': 3.535.0 + '@aws-sdk/middleware-recursion-detection': 3.535.0 + '@aws-sdk/middleware-user-agent': 3.535.0 + '@aws-sdk/region-config-resolver': 3.535.0 + '@aws-sdk/types': 3.535.0 + '@aws-sdk/util-endpoints': 3.535.0 + '@aws-sdk/util-user-agent-browser': 3.535.0 + '@aws-sdk/util-user-agent-node': 3.535.0 + '@smithy/config-resolver': 2.2.0 + '@smithy/core': 1.4.0 + '@smithy/fetch-http-handler': 2.5.0 + '@smithy/hash-node': 2.2.0 + '@smithy/invalid-dependency': 2.2.0 + '@smithy/middleware-content-length': 2.2.0 + '@smithy/middleware-endpoint': 2.5.0 + '@smithy/middleware-retry': 2.2.0 + '@smithy/middleware-serde': 2.3.0 + '@smithy/middleware-stack': 2.2.0 + '@smithy/node-config-provider': 2.3.0 + '@smithy/node-http-handler': 2.5.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/smithy-client': 2.5.0 + '@smithy/types': 2.12.0 + '@smithy/url-parser': 2.2.0 + '@smithy/util-base64': 2.3.0 + '@smithy/util-body-length-browser': 2.2.0 + '@smithy/util-body-length-node': 2.3.0 + '@smithy/util-defaults-mode-browser': 2.2.0 + '@smithy/util-defaults-mode-node': 2.3.0 + '@smithy/util-endpoints': 1.2.0 + '@smithy/util-middleware': 2.2.0 + '@smithy/util-retry': 2.2.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/client-sso@3.535.0: + resolution: {integrity: sha512-h9eQRdFnjDRVBnPJIKXuX7D+isSAioIfZPC4PQwsL5BscTRlk4c90DX0R0uk64YUtp7LZu8TNtrosFZ/1HtTrQ==} engines: {node: '>=14.0.0'} dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/core': 3.485.0 - '@aws-sdk/middleware-host-header': 3.485.0 - '@aws-sdk/middleware-logger': 3.485.0 - '@aws-sdk/middleware-recursion-detection': 3.485.0 - '@aws-sdk/middleware-user-agent': 3.485.0 - '@aws-sdk/region-config-resolver': 3.485.0 - '@aws-sdk/types': 3.485.0 - '@aws-sdk/util-endpoints': 3.485.0 - '@aws-sdk/util-user-agent-browser': 3.485.0 - '@aws-sdk/util-user-agent-node': 3.485.0 - '@smithy/config-resolver': 2.0.23 - '@smithy/core': 1.2.2 - '@smithy/fetch-http-handler': 2.3.2 - '@smithy/hash-node': 2.0.18 - '@smithy/invalid-dependency': 2.0.16 - '@smithy/middleware-content-length': 2.0.18 - '@smithy/middleware-endpoint': 2.3.0 - '@smithy/middleware-retry': 2.0.26 - '@smithy/middleware-serde': 2.0.16 - '@smithy/middleware-stack': 2.0.10 - '@smithy/node-config-provider': 2.1.9 - '@smithy/node-http-handler': 2.2.2 - '@smithy/protocol-http': 3.0.12 - '@smithy/smithy-client': 2.2.1 - '@smithy/types': 2.8.0 - '@smithy/url-parser': 2.0.16 - '@smithy/util-base64': 2.0.1 - '@smithy/util-body-length-browser': 2.0.1 - '@smithy/util-body-length-node': 2.1.0 - '@smithy/util-defaults-mode-browser': 2.0.24 - '@smithy/util-defaults-mode-node': 2.0.32 - '@smithy/util-endpoints': 1.0.8 - '@smithy/util-retry': 2.0.9 - '@smithy/util-utf8': 2.0.2 + '@aws-sdk/core': 3.535.0 + '@aws-sdk/middleware-host-header': 3.535.0 + '@aws-sdk/middleware-logger': 3.535.0 + '@aws-sdk/middleware-recursion-detection': 3.535.0 + '@aws-sdk/middleware-user-agent': 3.535.0 + '@aws-sdk/region-config-resolver': 3.535.0 + '@aws-sdk/types': 3.535.0 + '@aws-sdk/util-endpoints': 3.535.0 + '@aws-sdk/util-user-agent-browser': 3.535.0 + '@aws-sdk/util-user-agent-node': 3.535.0 + '@smithy/config-resolver': 2.2.0 + '@smithy/core': 1.4.0 + '@smithy/fetch-http-handler': 2.5.0 + '@smithy/hash-node': 2.2.0 + '@smithy/invalid-dependency': 2.2.0 + '@smithy/middleware-content-length': 2.2.0 + '@smithy/middleware-endpoint': 2.5.0 + '@smithy/middleware-retry': 2.2.0 + '@smithy/middleware-serde': 2.3.0 + '@smithy/middleware-stack': 2.2.0 + '@smithy/node-config-provider': 2.3.0 + '@smithy/node-http-handler': 2.5.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/smithy-client': 2.5.0 + '@smithy/types': 2.12.0 + '@smithy/url-parser': 2.2.0 + '@smithy/util-base64': 2.3.0 + '@smithy/util-body-length-browser': 2.2.0 + '@smithy/util-body-length-node': 2.3.0 + '@smithy/util-defaults-mode-browser': 2.2.0 + '@smithy/util-defaults-mode-node': 2.3.0 + '@smithy/util-endpoints': 1.2.0 + '@smithy/util-middleware': 2.2.0 + '@smithy/util-retry': 2.2.0 + '@smithy/util-utf8': 2.3.0 tslib: 2.6.2 transitivePeerDependencies: - aws-crt dev: false - /@aws-sdk/client-sts@3.485.0: - resolution: {integrity: sha512-PI4q36kVF0fpIPZyeQhrwwJZ6SRkOGvU3rX5Qn4b5UY5X+Ct1aLhqSX8/OB372UZIcnh6eSvERu8POHleDO7Jw==} + /@aws-sdk/client-sts@3.535.0(@aws-sdk/credential-provider-node@3.535.0): + resolution: {integrity: sha512-ii9OOm3TJwP3JmO1IVJXKWIShVKPl0VtdlgROc/SkDglO/kuAw9eDdlROgc+qbFl+gm6bBTguOVTUXt3tS3flw==} engines: {node: '>=14.0.0'} + peerDependencies: + '@aws-sdk/credential-provider-node': ^3.535.0 dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/core': 3.485.0 - '@aws-sdk/credential-provider-node': 3.485.0 - '@aws-sdk/middleware-host-header': 3.485.0 - '@aws-sdk/middleware-logger': 3.485.0 - '@aws-sdk/middleware-recursion-detection': 3.485.0 - '@aws-sdk/middleware-user-agent': 3.485.0 - '@aws-sdk/region-config-resolver': 3.485.0 - '@aws-sdk/types': 3.485.0 - '@aws-sdk/util-endpoints': 3.485.0 - '@aws-sdk/util-user-agent-browser': 3.485.0 - '@aws-sdk/util-user-agent-node': 3.485.0 - '@smithy/config-resolver': 2.0.23 - '@smithy/core': 1.2.2 - '@smithy/fetch-http-handler': 2.3.2 - '@smithy/hash-node': 2.0.18 - '@smithy/invalid-dependency': 2.0.16 - '@smithy/middleware-content-length': 2.0.18 - '@smithy/middleware-endpoint': 2.3.0 - '@smithy/middleware-retry': 2.0.26 - '@smithy/middleware-serde': 2.0.16 - '@smithy/middleware-stack': 2.0.10 - '@smithy/node-config-provider': 2.1.9 - '@smithy/node-http-handler': 2.2.2 - '@smithy/protocol-http': 3.0.12 - '@smithy/smithy-client': 2.2.1 - '@smithy/types': 2.8.0 - '@smithy/url-parser': 2.0.16 - '@smithy/util-base64': 2.0.1 - '@smithy/util-body-length-browser': 2.0.1 - '@smithy/util-body-length-node': 2.1.0 - '@smithy/util-defaults-mode-browser': 2.0.24 - '@smithy/util-defaults-mode-node': 2.0.32 - '@smithy/util-endpoints': 1.0.8 - '@smithy/util-middleware': 2.0.9 - '@smithy/util-retry': 2.0.9 - '@smithy/util-utf8': 2.0.2 + '@aws-sdk/core': 3.535.0 + '@aws-sdk/credential-provider-node': 3.535.0 + '@aws-sdk/middleware-host-header': 3.535.0 + '@aws-sdk/middleware-logger': 3.535.0 + '@aws-sdk/middleware-recursion-detection': 3.535.0 + '@aws-sdk/middleware-user-agent': 3.535.0 + '@aws-sdk/region-config-resolver': 3.535.0 + '@aws-sdk/types': 3.535.0 + '@aws-sdk/util-endpoints': 3.535.0 + '@aws-sdk/util-user-agent-browser': 3.535.0 + '@aws-sdk/util-user-agent-node': 3.535.0 + '@smithy/config-resolver': 2.2.0 + '@smithy/core': 1.4.0 + '@smithy/fetch-http-handler': 2.5.0 + '@smithy/hash-node': 2.2.0 + '@smithy/invalid-dependency': 2.2.0 + '@smithy/middleware-content-length': 2.2.0 + '@smithy/middleware-endpoint': 2.5.0 + '@smithy/middleware-retry': 2.2.0 + '@smithy/middleware-serde': 2.3.0 + '@smithy/middleware-stack': 2.2.0 + '@smithy/node-config-provider': 2.3.0 + '@smithy/node-http-handler': 2.5.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/smithy-client': 2.5.0 + '@smithy/types': 2.12.0 + '@smithy/url-parser': 2.2.0 + '@smithy/util-base64': 2.3.0 + '@smithy/util-body-length-browser': 2.2.0 + '@smithy/util-body-length-node': 2.3.0 + '@smithy/util-defaults-mode-browser': 2.2.0 + '@smithy/util-defaults-mode-node': 2.3.0 + '@smithy/util-endpoints': 1.2.0 + '@smithy/util-middleware': 2.2.0 + '@smithy/util-retry': 2.2.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/core@3.535.0: + resolution: {integrity: sha512-+Yusa9HziuaEDta1UaLEtMAtmgvxdxhPn7jgfRY6PplqAqgsfa5FR83sxy5qr2q7xjQTwHtV4MjQVuOjG9JsLw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/core': 1.4.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/signature-v4': 2.2.0 + '@smithy/smithy-client': 2.5.0 + '@smithy/types': 2.12.0 fast-xml-parser: 4.2.5 tslib: 2.6.2 + dev: false + + /@aws-sdk/credential-provider-env@3.535.0: + resolution: {integrity: sha512-XppwO8c0GCGSAvdzyJOhbtktSEaShg14VJKg8mpMa1XcgqzmcqqHQjtDWbx5rZheY1VdpXZhpEzJkB6LpQejpA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.535.0 + '@smithy/property-provider': 2.2.0 + '@smithy/types': 2.12.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/credential-provider-http@3.535.0: + resolution: {integrity: sha512-kdj1wCmOMZ29jSlUskRqN04S6fJ4dvt0Nq9Z32SA6wO7UG8ht6Ot9h/au/eTWJM3E1somZ7D771oK7dQt9b8yw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.535.0 + '@smithy/fetch-http-handler': 2.5.0 + '@smithy/node-http-handler': 2.5.0 + '@smithy/property-provider': 2.2.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/smithy-client': 2.5.0 + '@smithy/types': 2.12.0 + '@smithy/util-stream': 2.2.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/credential-provider-ini@3.535.0(@aws-sdk/credential-provider-node@3.535.0): + resolution: {integrity: sha512-bm3XOYlyCjtAb8eeHXLrxqRxYVRw2Iqv9IufdJb4gM13TbNSYniUT1WKaHxGIZ5p+FuNlXVhvk1OpHFM13+gXA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/client-sts': 3.535.0(@aws-sdk/credential-provider-node@3.535.0) + '@aws-sdk/credential-provider-env': 3.535.0 + '@aws-sdk/credential-provider-process': 3.535.0 + '@aws-sdk/credential-provider-sso': 3.535.0(@aws-sdk/credential-provider-node@3.535.0) + '@aws-sdk/credential-provider-web-identity': 3.535.0(@aws-sdk/credential-provider-node@3.535.0) + '@aws-sdk/types': 3.535.0 + '@smithy/credential-provider-imds': 2.3.0 + '@smithy/property-provider': 2.2.0 + '@smithy/shared-ini-file-loader': 2.4.0 + '@smithy/types': 2.12.0 + tslib: 2.6.2 transitivePeerDependencies: + - '@aws-sdk/credential-provider-node' - aws-crt dev: false - /@aws-sdk/core@3.485.0: - resolution: {integrity: sha512-Yvi80DQcbjkYCft471ClE3HuetuNVqntCs6eFOomDcrJaqdOFrXv2kJAxky84MRA/xb7bGlDGAPbTuj1ICputg==} + /@aws-sdk/credential-provider-node@3.535.0: + resolution: {integrity: sha512-6JXp/EuL6euUkH5k4d+lQFF6gBwukrcCOWfNHCmq14mNJf/cqT3HAX1VMtWFRSK20am0IxfYQGccb0/nZykdKg==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/core': 1.2.2 - '@smithy/protocol-http': 3.0.12 - '@smithy/signature-v4': 2.0.19 - '@smithy/smithy-client': 2.2.1 - '@smithy/types': 2.8.0 - tslib: 2.6.2 - dev: false - - /@aws-sdk/credential-provider-env@3.485.0: - resolution: {integrity: sha512-3XkFgwVU1XOB33dV7t9BKJ/ptdl2iS+0dxE7ecq8aqT2/gsfKmLCae1G17P8WmdD3z0kMDTvnqM2aWgUnSOkmg==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/types': 3.485.0 - '@smithy/property-provider': 2.0.17 - '@smithy/types': 2.8.0 - tslib: 2.6.2 - dev: false - - /@aws-sdk/credential-provider-ini@3.485.0: - resolution: {integrity: sha512-cFYF/Bdw7EnT4viSxYpNIv3IBkri/Yb+JpQXl8uDq7bfVJfAN5qZmK07vRkg08xL6TC4F41wshhMSAucGdTwIw==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/credential-provider-env': 3.485.0 - '@aws-sdk/credential-provider-process': 3.485.0 - '@aws-sdk/credential-provider-sso': 3.485.0 - '@aws-sdk/credential-provider-web-identity': 3.485.0 - '@aws-sdk/types': 3.485.0 - '@smithy/credential-provider-imds': 2.1.5 - '@smithy/property-provider': 2.0.17 - '@smithy/shared-ini-file-loader': 2.2.8 - '@smithy/types': 2.8.0 + '@aws-sdk/credential-provider-env': 3.535.0 + '@aws-sdk/credential-provider-http': 3.535.0 + '@aws-sdk/credential-provider-ini': 3.535.0(@aws-sdk/credential-provider-node@3.535.0) + '@aws-sdk/credential-provider-process': 3.535.0 + '@aws-sdk/credential-provider-sso': 3.535.0(@aws-sdk/credential-provider-node@3.535.0) + '@aws-sdk/credential-provider-web-identity': 3.535.0(@aws-sdk/credential-provider-node@3.535.0) + '@aws-sdk/types': 3.535.0 + '@smithy/credential-provider-imds': 2.3.0 + '@smithy/property-provider': 2.2.0 + '@smithy/shared-ini-file-loader': 2.4.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 transitivePeerDependencies: - aws-crt dev: false - /@aws-sdk/credential-provider-node@3.485.0: - resolution: {integrity: sha512-2DwzO2azkSzngifKDT61W/DL0tSzewuaFHiLJWdfc8Et3mdAQJ9x3KAj8u7XFpjIcGNqk7FiKjN+zeGUuNiEhA==} + /@aws-sdk/credential-provider-process@3.535.0: + resolution: {integrity: sha512-9O1OaprGCnlb/kYl8RwmH7Mlg8JREZctB8r9sa1KhSsWFq/SWO0AuJTyowxD7zL5PkeS4eTvzFFHWCa3OO5epA==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/credential-provider-env': 3.485.0 - '@aws-sdk/credential-provider-ini': 3.485.0 - '@aws-sdk/credential-provider-process': 3.485.0 - '@aws-sdk/credential-provider-sso': 3.485.0 - '@aws-sdk/credential-provider-web-identity': 3.485.0 - '@aws-sdk/types': 3.485.0 - '@smithy/credential-provider-imds': 2.1.5 - '@smithy/property-provider': 2.0.17 - '@smithy/shared-ini-file-loader': 2.2.8 - '@smithy/types': 2.8.0 + '@aws-sdk/types': 3.535.0 + '@smithy/property-provider': 2.2.0 + '@smithy/shared-ini-file-loader': 2.4.0 + '@smithy/types': 2.12.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/credential-provider-sso@3.535.0(@aws-sdk/credential-provider-node@3.535.0): + resolution: {integrity: sha512-2Dw0YIr8ETdFpq65CC4zK8ZIEbX78rXoNRZXUGNQW3oSKfL0tj8O8ErY6kg1IdEnYbGnEQ35q6luZ5GGNKLgDg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/client-sso': 3.535.0 + '@aws-sdk/token-providers': 3.535.0(@aws-sdk/credential-provider-node@3.535.0) + '@aws-sdk/types': 3.535.0 + '@smithy/property-provider': 2.2.0 + '@smithy/shared-ini-file-loader': 2.4.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 transitivePeerDependencies: + - '@aws-sdk/credential-provider-node' - aws-crt dev: false - /@aws-sdk/credential-provider-process@3.485.0: - resolution: {integrity: sha512-X9qS6ZO/rDKYDgWqD1YmSX7sAUUHax9HbXlgGiTTdtfhZvQh1ZmnH6wiPu5WNliafHZFtZT2W07kgrDLPld/Ug==} + /@aws-sdk/credential-provider-web-identity@3.535.0(@aws-sdk/credential-provider-node@3.535.0): + resolution: {integrity: sha512-t2/JWrKY0H66A7JW7CqX06/DG2YkJddikt5ymdQvx/Q7dRMJ3d+o/vgjoKr7RvEx/pNruCeyM1599HCvwrVMrg==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.485.0 - '@smithy/property-provider': 2.0.17 - '@smithy/shared-ini-file-loader': 2.2.8 - '@smithy/types': 2.8.0 - tslib: 2.6.2 - dev: false - - /@aws-sdk/credential-provider-sso@3.485.0: - resolution: {integrity: sha512-l0oC8GTrWh+LFQQfSmG1Jai1PX7Mhj9arb/CaS1/tmeZE0hgIXW++tvljYs/Dds4LGXUlaWG+P7BrObf6OyIXA==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/client-sso': 3.485.0 - '@aws-sdk/token-providers': 3.485.0 - '@aws-sdk/types': 3.485.0 - '@smithy/property-provider': 2.0.17 - '@smithy/shared-ini-file-loader': 2.2.8 - '@smithy/types': 2.8.0 + '@aws-sdk/client-sts': 3.535.0(@aws-sdk/credential-provider-node@3.535.0) + '@aws-sdk/types': 3.535.0 + '@smithy/property-provider': 2.2.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 transitivePeerDependencies: + - '@aws-sdk/credential-provider-node' - aws-crt dev: false - /@aws-sdk/credential-provider-web-identity@3.485.0: - resolution: {integrity: sha512-WpBFZFE0iXtnibH5POMEKITj/hR0YV5l2n9p8BEvKjdJ63s3Xke1RN20ZdIyKDaRDwj8adnKDgNPEnAKdS4kLw==} + /@aws-sdk/middleware-bucket-endpoint@3.535.0: + resolution: {integrity: sha512-7sijlfQsc4UO9Fsl11mU26Y5f9E7g6UoNg/iJUBpC5pgvvmdBRO5UEhbB/gnqvOEPsBXyhmfzbstebq23Qdz7A==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.485.0 - '@smithy/property-provider': 2.0.17 - '@smithy/types': 2.8.0 + '@aws-sdk/types': 3.535.0 + '@aws-sdk/util-arn-parser': 3.535.0 + '@smithy/node-config-provider': 2.3.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/types': 2.12.0 + '@smithy/util-config-provider': 2.3.0 tslib: 2.6.2 dev: false - /@aws-sdk/middleware-bucket-endpoint@3.485.0: - resolution: {integrity: sha512-DptPuprsx9V1LH91ZvC/7a7B1UnuSAIi1ArJHlHqJL1ISo6sH1oeXP6KRa0tj8biGMDIx0b22wg8EEpFePMy3w==} + /@aws-sdk/middleware-expect-continue@3.535.0: + resolution: {integrity: sha512-hFKyqUBky0NWCVku8iZ9+PACehx0p6vuMw5YnZf8FVgHP0fode0b/NwQY6UY7oor/GftvRsAlRUAWGNFEGUpwA==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.485.0 - '@aws-sdk/util-arn-parser': 3.465.0 - '@smithy/node-config-provider': 2.1.9 - '@smithy/protocol-http': 3.0.12 - '@smithy/types': 2.8.0 - '@smithy/util-config-provider': 2.1.0 + '@aws-sdk/types': 3.535.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 dev: false - /@aws-sdk/middleware-expect-continue@3.485.0: - resolution: {integrity: sha512-rOwJJWM1/ydwSiJJ1l/X5h91u2Xzb8/CwOW6ZY+E8iZA0HDCtlJnKNlhHb+NHGtDamd4+1qdGSRtPQevyS58Cg==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/types': 3.485.0 - '@smithy/protocol-http': 3.0.12 - '@smithy/types': 2.8.0 - tslib: 2.6.2 - dev: false - - /@aws-sdk/middleware-flexible-checksums@3.485.0: - resolution: {integrity: sha512-5+OmVMbEwl1LDdWbaJxoSViw6vuMsdDQgASFUM37aG46q1zWSiPU171IXutEAFZZXN/t0HcOFi0AmNrS0o+dkQ==} + /@aws-sdk/middleware-flexible-checksums@3.535.0: + resolution: {integrity: sha512-rBIzldY9jjRATxICDX7t77aW6ctqmVDgnuAOgbVT5xgHftt4o7PGWKoMvl/45hYqoQgxVFnCBof9bxkqSBebVA==} engines: {node: '>=14.0.0'} dependencies: '@aws-crypto/crc32': 3.0.0 '@aws-crypto/crc32c': 3.0.0 - '@aws-sdk/types': 3.485.0 - '@smithy/is-array-buffer': 2.0.0 - '@smithy/protocol-http': 3.0.12 - '@smithy/types': 2.8.0 - '@smithy/util-utf8': 2.0.2 + '@aws-sdk/types': 3.535.0 + '@smithy/is-array-buffer': 2.2.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/types': 2.12.0 + '@smithy/util-utf8': 2.3.0 tslib: 2.6.2 dev: false - /@aws-sdk/middleware-host-header@3.485.0: - resolution: {integrity: sha512-1mAUX9dQNGo2RIKseVj7SI/D5abQJQ/Os8hQ0NyVAyyVYF+Yjx5PphKgfhM5yoBwuwZUl6q71XPYEGNx7be6SA==} + /@aws-sdk/middleware-host-header@3.535.0: + resolution: {integrity: sha512-0h6TWjBWtDaYwHMQJI9ulafeS4lLaw1vIxRjbpH0svFRt6Eve+Sy8NlVhECfTU2hNz/fLubvrUxsXoThaLBIew==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.485.0 - '@smithy/protocol-http': 3.0.12 - '@smithy/types': 2.8.0 + '@aws-sdk/types': 3.535.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 dev: false - /@aws-sdk/middleware-location-constraint@3.485.0: - resolution: {integrity: sha512-Mrp4chtYliqCUSVjzLYPcZCPGmhL4QM7o6NhHBdA6omaIGdn4pJqFwN5ELZoWJDZMKyfrKi6s6u97jR9VtEXRg==} + /@aws-sdk/middleware-location-constraint@3.535.0: + resolution: {integrity: sha512-SxfS9wfidUZZ+WnlKRTCRn3h+XTsymXRXPJj8VV6hNRNeOwzNweoG3YhQbTowuuNfXf89m9v6meYkBBtkdacKw==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.485.0 - '@smithy/types': 2.8.0 + '@aws-sdk/types': 3.535.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 dev: false - /@aws-sdk/middleware-logger@3.485.0: - resolution: {integrity: sha512-O8IgJ0LHi5wTs5GlpI7nqmmSSagkVdd1shpGgQWY2h0kMSCII8CJZHBG97dlFFpGTvx5EDlhPNek7rl/6F4dRw==} + /@aws-sdk/middleware-logger@3.535.0: + resolution: {integrity: sha512-huNHpONOrEDrdRTvSQr1cJiRMNf0S52NDXtaPzdxiubTkP+vni2MohmZANMOai/qT0olmEVX01LhZ0ZAOgmg6A==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.485.0 - '@smithy/types': 2.8.0 + '@aws-sdk/types': 3.535.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 dev: false - /@aws-sdk/middleware-recursion-detection@3.485.0: - resolution: {integrity: sha512-ZeVNATGNFcqkWDut3luVszROTUzkU5u+rJpB/xmeMoenlDAjPRiHt/ca3WkI5wAnIJ1VSNGpD2sOFLMCH+EWag==} + /@aws-sdk/middleware-recursion-detection@3.535.0: + resolution: {integrity: sha512-am2qgGs+gwqmR4wHLWpzlZ8PWhm4ktj5bYSgDrsOfjhdBlWNxvPoID9/pDAz5RWL48+oH7I6SQzMqxXsFDikrw==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.485.0 - '@smithy/protocol-http': 3.0.12 - '@smithy/types': 2.8.0 + '@aws-sdk/types': 3.535.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 dev: false - /@aws-sdk/middleware-sdk-s3@3.485.0: - resolution: {integrity: sha512-3769c4e3UtvaNU5T6dHxhjGI1kEXymldqiP1PMZMX2jVffwSGhbvyLq0Kl6+9Jr51fj2oXN6Tex+8J9+5dzTgQ==} + /@aws-sdk/middleware-sdk-s3@3.535.0: + resolution: {integrity: sha512-/dLG/E3af6ohxkQ5GBHT8tZfuPIg6eItKxCXuulvYj0Tqgf3Mb+xTsvSkxQsJF06RS4sH7Qsg/PnB8ZfrJrXpg==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.485.0 - '@aws-sdk/util-arn-parser': 3.465.0 - '@smithy/node-config-provider': 2.1.9 - '@smithy/protocol-http': 3.0.12 - '@smithy/signature-v4': 2.0.19 - '@smithy/smithy-client': 2.2.1 - '@smithy/types': 2.8.0 - '@smithy/util-config-provider': 2.1.0 + '@aws-sdk/types': 3.535.0 + '@aws-sdk/util-arn-parser': 3.535.0 + '@smithy/node-config-provider': 2.3.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/signature-v4': 2.2.0 + '@smithy/smithy-client': 2.5.0 + '@smithy/types': 2.12.0 + '@smithy/util-config-provider': 2.3.0 tslib: 2.6.2 dev: false - /@aws-sdk/middleware-signing@3.485.0: - resolution: {integrity: sha512-41xzT2p1sOibhsLkdE5rwPJkNbBtKD8Gp36/ySfu0KE415wfXKacElSVxAaBw39/j7iSWDYqqybeEYbAzk+3GQ==} + /@aws-sdk/middleware-signing@3.535.0: + resolution: {integrity: sha512-Rb4sfus1Gc5paRl9JJgymJGsb/i3gJKK/rTuFZICdd1PBBE5osIOHP5CpzWYBtc5LlyZE1a2QoxPMCyG+QUGPw==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.485.0 - '@smithy/property-provider': 2.0.17 - '@smithy/protocol-http': 3.0.12 - '@smithy/signature-v4': 2.0.19 - '@smithy/types': 2.8.0 - '@smithy/util-middleware': 2.0.9 + '@aws-sdk/types': 3.535.0 + '@smithy/property-provider': 2.2.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/signature-v4': 2.2.0 + '@smithy/types': 2.12.0 + '@smithy/util-middleware': 2.2.0 tslib: 2.6.2 dev: false - /@aws-sdk/middleware-ssec@3.485.0: - resolution: {integrity: sha512-A59WTC0egT8zLnRzB+yWKq2AonugD1DgN4710RG70JY5XUmx5TYdECbUrVeG/zhNIKbBLLFjRcVk2uo4OZcgIA==} + /@aws-sdk/middleware-ssec@3.535.0: + resolution: {integrity: sha512-QAQ++9my7VZzusUPOFcUMdhTnjpGRyy/OvPC+jg9usdfcaSZeQbfzbdaVBalcm2Wt+1qxh3LZSTS+LxKikm02Q==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.485.0 - '@smithy/types': 2.8.0 + '@aws-sdk/types': 3.535.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 dev: false - /@aws-sdk/middleware-user-agent@3.485.0: - resolution: {integrity: sha512-CddCVOn+OPQ0CcchketIg+WF6v+MDLAf3GOYTR2htUxxIm7HABuRd6R3kvQ5Jny9CV8gMt22G1UZITsFexSJlQ==} + /@aws-sdk/middleware-user-agent@3.535.0: + resolution: {integrity: sha512-Uvb2WJ+zdHdCOtsWVPI/M0BcfNrjOYsicDZWtaljucRJKLclY5gNWwD+RwIC+8b5TvfnVOlH+N5jhvpi5Impog==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.485.0 - '@aws-sdk/util-endpoints': 3.485.0 - '@smithy/protocol-http': 3.0.12 - '@smithy/types': 2.8.0 + '@aws-sdk/types': 3.535.0 + '@aws-sdk/util-endpoints': 3.535.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 dev: false - /@aws-sdk/region-config-resolver@3.485.0: - resolution: {integrity: sha512-2FB2EQ0sIE+YgFqGtkE1lDIMIL6nYe6MkOHBwBM7bommadKIrbbr2L22bPZGs3ReTsxiJabjzxbuCAVhrpHmhg==} + /@aws-sdk/region-config-resolver@3.535.0: + resolution: {integrity: sha512-IXOznDiaItBjsQy4Fil0kzX/J3HxIOknEphqHbOfUf+LpA5ugcsxuQQONrbEQusCBnfJyymrldBvBhFmtlU9Wg==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/node-config-provider': 2.1.9 - '@smithy/types': 2.8.0 - '@smithy/util-config-provider': 2.1.0 - '@smithy/util-middleware': 2.0.9 + '@aws-sdk/types': 3.535.0 + '@smithy/node-config-provider': 2.3.0 + '@smithy/types': 2.12.0 + '@smithy/util-config-provider': 2.3.0 + '@smithy/util-middleware': 2.2.0 tslib: 2.6.2 dev: false - /@aws-sdk/s3-request-presigner@3.485.0: - resolution: {integrity: sha512-5TCyl1H/PdBH0XDSILb9y1d/fU+tDEQ7Fkqeb2gIYENDG09dX68TtcZVGs0sMZtC9CLUFpmEp8R/3LtfuoeY6w==} + /@aws-sdk/s3-request-presigner@3.535.0: + resolution: {integrity: sha512-lO8uVkiXUuAu3qvLxXoToLrWp7afxH8JzX+acYxWLQdQE10LIFykKGX3NEysCA9YkyCRwEfplqaJKiVQAC3fOw==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/signature-v4-multi-region': 3.485.0 - '@aws-sdk/types': 3.485.0 - '@aws-sdk/util-format-url': 3.485.0 - '@smithy/middleware-endpoint': 2.3.0 - '@smithy/protocol-http': 3.0.12 - '@smithy/smithy-client': 2.2.1 - '@smithy/types': 2.8.0 + '@aws-sdk/signature-v4-multi-region': 3.535.0 + '@aws-sdk/types': 3.535.0 + '@aws-sdk/util-format-url': 3.535.0 + '@smithy/middleware-endpoint': 2.5.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/smithy-client': 2.5.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 dev: false - /@aws-sdk/signature-v4-multi-region@3.485.0: - resolution: {integrity: sha512-168ipXkbG75l9cKQmsBtx/4+AYjGsBoy724bXosW13t2/l/E3IzJAYUjDROiK0JXVMG85xAnGWbFwZkjxVXzrQ==} + /@aws-sdk/signature-v4-multi-region@3.535.0: + resolution: {integrity: sha512-tqCsEsEj8icW0SAh3NvyhRUq54Gz2pu4NM2tOSrFp7SO55heUUaRLSzYteNZCTOupH//AAaZvbN/UUTO/DrOog==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/middleware-sdk-s3': 3.485.0 - '@aws-sdk/types': 3.485.0 - '@smithy/protocol-http': 3.0.12 - '@smithy/signature-v4': 2.0.19 - '@smithy/types': 2.8.0 + '@aws-sdk/middleware-sdk-s3': 3.535.0 + '@aws-sdk/types': 3.535.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/signature-v4': 2.2.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 dev: false - /@aws-sdk/token-providers@3.485.0: - resolution: {integrity: sha512-kOXA1WKIVIFNRqHL8ynVZ3hCKLsgnEmGr2iDR6agDNw5fYIlCO/6N2xR6QdGcLTvUUbwOlz4OvKLUQnWMKAnnA==} + /@aws-sdk/token-providers@3.535.0(@aws-sdk/credential-provider-node@3.535.0): + resolution: {integrity: sha512-4g+l/B9h1H/SiDtFRosW3pMwc+3PTXljZit+5NUBcET2XqcdUyHmgj3lBdu+CJ9CHdIMggRalYMAFXnRFe3Psg==} engines: {node: '>=14.0.0'} dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/middleware-host-header': 3.485.0 - '@aws-sdk/middleware-logger': 3.485.0 - '@aws-sdk/middleware-recursion-detection': 3.485.0 - '@aws-sdk/middleware-user-agent': 3.485.0 - '@aws-sdk/region-config-resolver': 3.485.0 - '@aws-sdk/types': 3.485.0 - '@aws-sdk/util-endpoints': 3.485.0 - '@aws-sdk/util-user-agent-browser': 3.485.0 - '@aws-sdk/util-user-agent-node': 3.485.0 - '@smithy/config-resolver': 2.0.23 - '@smithy/fetch-http-handler': 2.3.2 - '@smithy/hash-node': 2.0.18 - '@smithy/invalid-dependency': 2.0.16 - '@smithy/middleware-content-length': 2.0.18 - '@smithy/middleware-endpoint': 2.3.0 - '@smithy/middleware-retry': 2.0.26 - '@smithy/middleware-serde': 2.0.16 - '@smithy/middleware-stack': 2.0.10 - '@smithy/node-config-provider': 2.1.9 - '@smithy/node-http-handler': 2.2.2 - '@smithy/property-provider': 2.0.17 - '@smithy/protocol-http': 3.0.12 - '@smithy/shared-ini-file-loader': 2.2.8 - '@smithy/smithy-client': 2.2.1 - '@smithy/types': 2.8.0 - '@smithy/url-parser': 2.0.16 - '@smithy/util-base64': 2.0.1 - '@smithy/util-body-length-browser': 2.0.1 - '@smithy/util-body-length-node': 2.1.0 - '@smithy/util-defaults-mode-browser': 2.0.24 - '@smithy/util-defaults-mode-node': 2.0.32 - '@smithy/util-endpoints': 1.0.8 - '@smithy/util-retry': 2.0.9 - '@smithy/util-utf8': 2.0.2 + '@aws-sdk/client-sso-oidc': 3.535.0(@aws-sdk/credential-provider-node@3.535.0) + '@aws-sdk/types': 3.535.0 + '@smithy/property-provider': 2.2.0 + '@smithy/shared-ini-file-loader': 2.4.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 transitivePeerDependencies: + - '@aws-sdk/credential-provider-node' - aws-crt dev: false - /@aws-sdk/types@3.485.0: - resolution: {integrity: sha512-+QW32YQdvZRDOwrAQPo/qCyXoSjgXB6RwJwCwkd8ebJXRXw6tmGKIHaZqYHt/LtBymvnaBgBBADNa4+qFvlOFw==} + /@aws-sdk/types@3.535.0: + resolution: {integrity: sha512-aY4MYfduNj+sRR37U7XxYR8wemfbKP6lx00ze2M2uubn7mZotuVrWYAafbMSXrdEMSToE5JDhr28vArSOoLcSg==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/types': 2.8.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 dev: false - /@aws-sdk/util-arn-parser@3.465.0: - resolution: {integrity: sha512-zOJ82vzDJFqBX9yZBlNeHHrul/kpx/DCoxzW5UBbZeb26kfV53QhMSoEmY8/lEbBqlqargJ/sgRC845GFhHNQw==} + /@aws-sdk/util-arn-parser@3.535.0: + resolution: {integrity: sha512-smVo29nUPAOprp8Z5Y3GHuhiOtw6c8/EtLCm5AVMtRsTPw4V414ZXL2H66tzmb5kEeSzQlbfBSBEdIFZoxO9kg==} engines: {node: '>=14.0.0'} dependencies: tslib: 2.6.2 dev: false - /@aws-sdk/util-endpoints@3.485.0: - resolution: {integrity: sha512-dTd642F7nJisApF8YjniqQ6U59CP/DCtar11fXf1nG9YNBCBsNNVw5ZfZb5nSNzaIdy27mQioWTCV18JEj1mxg==} + /@aws-sdk/util-endpoints@3.535.0: + resolution: {integrity: sha512-c8TlaQsiPchOOmTTR6qvHCO2O7L7NJwlKWAoQJ2GqWDZuC5es/fyuF2rp1h+ZRrUVraUomS0YdGkAmaDC7hJQg==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.485.0 - '@smithy/util-endpoints': 1.0.8 + '@aws-sdk/types': 3.535.0 + '@smithy/types': 2.12.0 + '@smithy/util-endpoints': 1.2.0 tslib: 2.6.2 dev: false - /@aws-sdk/util-format-url@3.485.0: - resolution: {integrity: sha512-CW82AQ8UD88jhI2OyAgT5yA8NH2KE0mgludRXYDT5uvwj6nlA7c2B+c2UJwbkMdlsUZip/XvN+jFoRR7AJH1GQ==} + /@aws-sdk/util-format-url@3.535.0: + resolution: {integrity: sha512-ElbNkm0bddu53CuW44Iuux1ZbTV50fydbSh/4ypW3LrmUvHx193ogj0HXQ7X26kmmo9rXcsrLdM92yIeTjidVg==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.485.0 - '@smithy/querystring-builder': 2.0.16 - '@smithy/types': 2.8.0 + '@aws-sdk/types': 3.535.0 + '@smithy/querystring-builder': 2.2.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 dev: false @@ -1061,17 +1117,17 @@ packages: tslib: 2.6.2 dev: false - /@aws-sdk/util-user-agent-browser@3.485.0: - resolution: {integrity: sha512-QliWbjg0uOhGTcWgWTKPMY0SBi07g253DjwrCINT1auqDrdQPxa10xozpZExBYjAK2KuhYDNUzni127ae6MHOw==} + /@aws-sdk/util-user-agent-browser@3.535.0: + resolution: {integrity: sha512-RWMcF/xV5n+nhaA/Ff5P3yNP3Kur/I+VNZngog4TEs92oB/nwOdAg/2JL8bVAhUbMrjTjpwm7PItziYFQoqyig==} dependencies: - '@aws-sdk/types': 3.485.0 - '@smithy/types': 2.8.0 + '@aws-sdk/types': 3.535.0 + '@smithy/types': 2.12.0 bowser: 2.11.0 tslib: 2.6.2 dev: false - /@aws-sdk/util-user-agent-node@3.485.0: - resolution: {integrity: sha512-QF+aQ9jnDlPUlFBxBRqOylPf86xQuD3aEPpOErR+50qJawVvKa94uiAFdvtI9jv6hnRZmuFsTj2rsyytnbAYBA==} + /@aws-sdk/util-user-agent-node@3.535.0: + resolution: {integrity: sha512-dRek0zUuIT25wOWJlsRm97nTkUlh1NDcLsQZIN2Y8KxhwoXXWtJs5vaDPT+qAg+OpcNj80i1zLR/CirqlFg/TQ==} engines: {node: '>=14.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -1079,9 +1135,9 @@ packages: aws-crt: optional: true dependencies: - '@aws-sdk/types': 3.485.0 - '@smithy/node-config-provider': 2.1.9 - '@smithy/types': 2.8.0 + '@aws-sdk/types': 3.535.0 + '@smithy/node-config-provider': 2.3.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 dev: false @@ -1091,11 +1147,11 @@ packages: tslib: 2.6.2 dev: false - /@aws-sdk/xml-builder@3.485.0: - resolution: {integrity: sha512-xQexPM6LINOIkf3NLFywplcbApifZRMWFN41TDWYSNgCUa5uC9fntfenw8N/HTx1n+McRCWSAFBTjDqY/2OLCQ==} + /@aws-sdk/xml-builder@3.535.0: + resolution: {integrity: sha512-VXAq/Jz8KIrU84+HqsOJhIKZqG0PNTdi6n6PFQ4xJf44ZQHD/5C7ouH4qCFX5XgZXcgbRIcMVVYGC6Jye0dRng==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/types': 2.8.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 dev: false @@ -2622,13 +2678,13 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.56.0 + eslint: 8.57.0 eslint-visitor-keys: 3.4.3 dev: true @@ -2654,8 +2710,8 @@ packages: - supports-color dev: true - /@eslint/js@8.56.0: - resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==} + /@eslint/js@8.57.0: + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true @@ -2679,11 +2735,11 @@ packages: text-decoding: 1.0.0 dev: false - /@fastify/cors@8.4.2: - resolution: {integrity: sha512-IVynbcPG9eWiJ0P/A1B+KynmiU/yTYbu3ooBUSIeHfca/N1XLb9nIJVCws+YTr2q63MA8Y6QLeXQczEv4npM9g==} + /@fastify/cors@9.0.1: + resolution: {integrity: sha512-YY9Ho3ovI+QHIL2hW+9X4XqQjXLjJqsU+sMV/xFsxZkE8p3GNnYVFpoOxF7SsP5ZL76gwvbo3V9L+FIekBGU4Q==} dependencies: fastify-plugin: 4.5.1 - mnemonist: 0.39.5 + mnemonist: 0.39.6 dev: false /@fastify/deepmerge@1.3.0: @@ -2737,15 +2793,15 @@ packages: mime: 3.0.0 dev: false - /@fastify/static@6.12.0: - resolution: {integrity: sha512-KK1B84E6QD/FcQWxDI2aiUCwHxMJBI1KeCUzm1BwYpPY1b742+jeKruGHP2uOluuM6OkBPI8CIANrXcCRtC2oQ==} + /@fastify/static@7.0.1: + resolution: {integrity: sha512-i1p/nELMknAisNfnjo7yhfoUOdKzA+n92QaMirv2NkZrJ1Wl12v2nyTYlDwPN8XoStMBAnRK/Kx6zKmfrXUPXw==} dependencies: '@fastify/accept-negotiator': 1.1.0 '@fastify/send': 2.1.0 content-disposition: 0.5.4 fastify-plugin: 4.5.1 - glob: 8.1.0 - p-limit: 3.1.0 + fastq: 1.17.1 + glob: 10.3.10 dev: false /@floating-ui/core@1.5.3: @@ -2754,32 +2810,32 @@ packages: '@floating-ui/utils': 0.2.1 dev: false - /@floating-ui/dom@1.5.4: - resolution: {integrity: sha512-jByEsHIY+eEdCjnTVu+E3ephzTOzkQ8hgUfGwos+bg7NlH33Zc5uO+QHz1mrQUOgIKKDD1RtS201P9NvAfq3XQ==} + /@floating-ui/dom@1.6.3: + resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==} dependencies: '@floating-ui/core': 1.5.3 '@floating-ui/utils': 0.2.1 dev: false - /@floating-ui/react-dom@2.0.5(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-UsBK30Bg+s6+nsgblXtZmwHhgS2vmbuQK22qgt2pTQM6M3X6H1+cQcLXqgRY3ihVLcZJE6IvqDQozhsnIVqK/Q==} + /@floating-ui/react-dom@2.0.8(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: - '@floating-ui/dom': 1.5.4 + '@floating-ui/dom': 1.6.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@floating-ui/react@0.24.8(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-AuYeDoaR8jtUlUXtZ1IJ/6jtBkGnSpJXbGNzokBL87VDJ8opMq1Bgrc0szhK482ReQY6KZsMoZCVSb4xwalkBA==} + /@floating-ui/react@0.26.9(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-p86wynZJVEkEq2BBjY/8p2g3biQ6TlgT4o/3KgFKyTWoJLU1GZ8wpctwRqtkEl2tseYA+kw7dBAIDFcednfI5w==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: - '@floating-ui/react-dom': 2.0.5(react-dom@18.2.0)(react@18.2.0) - aria-hidden: 1.2.3 + '@floating-ui/react-dom': 2.0.8(react-dom@18.2.0)(react@18.2.0) + '@floating-ui/utils': 0.2.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) tabbable: 6.2.0 @@ -2789,50 +2845,50 @@ packages: resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} dev: false - /@hocuspocus/common@2.9.0: - resolution: {integrity: sha512-VHqxf1Qov4PULmoevRV4hEyxfEGNtdCMDQTU0C1C6ZR6ImDAqnpuzzcxH5ppkZZiiSZwDWxMxxegFt2e3alDEA==} + /@hocuspocus/common@2.11.3: + resolution: {integrity: sha512-w3UZpW6ZVYIHPEFzZJV3yn1d3EZaXf2m2zU53pwj0AyTBmVD7kB9ZiD6twc9A7NNB1dkqD8c58PbD42+pnNiKQ==} dependencies: lib0: 0.2.88 dev: false - /@hocuspocus/provider@2.9.0(y-protocols@1.0.6)(yjs@13.6.10): - resolution: {integrity: sha512-ZMXX0+jbmB5V7n9RVTtxgWexOs3uwMUxTz9JcGNyUWpLGebSHQppT36eR0cNUhhqO3Kz5HBv2dg8egwGKpT5aQ==} + /@hocuspocus/provider@2.11.3(y-protocols@1.0.6)(yjs@13.6.14): + resolution: {integrity: sha512-MvwA6TUrh7aXK4TwzJVkq60+iYkEkLIGjSOaGTxZfyDrgE70awmDiE4QlZ0e5lGc+T6/c6ct+asduP7nc3NHXw==} peerDependencies: y-protocols: ^1.0.6 yjs: ^13.6.8 dependencies: - '@hocuspocus/common': 2.9.0 + '@hocuspocus/common': 2.11.3 '@lifeomic/attempt': 3.0.3 lib0: 0.2.88 ws: 8.16.0 - y-protocols: 1.0.6(yjs@13.6.10) - yjs: 13.6.10 + y-protocols: 1.0.6(yjs@13.6.14) + yjs: 13.6.14 transitivePeerDependencies: - bufferutil - utf-8-validate dev: false - /@hocuspocus/server@2.9.0(y-protocols@1.0.6)(yjs@13.6.10): - resolution: {integrity: sha512-wqkFFn8zUGJxRUbk2vyh/BKut+VdyaAMs1yORvQbs/DEde6kzNmbgSpCqk6rcQGdfulx5Pr63QtMrzSvvcbBYQ==} + /@hocuspocus/server@2.11.3(y-protocols@1.0.6)(yjs@13.6.14): + resolution: {integrity: sha512-1Vdy4RtJcpffs5I4Ey3M8ulu2f6AbpSDmK4YFG8k3O4EJT7HDSO3Ib5STiRBxlr2LncJeVa2ikwlvwQotsWqew==} peerDependencies: y-protocols: ^1.0.6 yjs: ^13.6.8 dependencies: - '@hocuspocus/common': 2.9.0 + '@hocuspocus/common': 2.11.3 async-lock: 1.4.1 kleur: 4.1.5 lib0: 0.2.88 uuid: 9.0.1 ws: 8.16.0 - y-protocols: 1.0.6(yjs@13.6.10) - yjs: 13.6.10 + y-protocols: 1.0.6(yjs@13.6.14) + yjs: 13.6.14 transitivePeerDependencies: - bufferutil - utf-8-validate dev: false - /@hocuspocus/transformer@2.9.0(@tiptap/pm@2.1.16)(y-prosemirror@1.2.2)(yjs@13.6.10): - resolution: {integrity: sha512-Xij/9WQYvMHnK6J59y+lZ0QDCwu+kqUXdfeBBx6sM6XHFubaWF84pVEBxAT3X4SXjZxm372GnOszKTozhScjDw==} + /@hocuspocus/transformer@2.11.3(@tiptap/pm@2.1.16)(y-prosemirror@1.2.2)(yjs@13.6.14): + resolution: {integrity: sha512-xwvweF0P1T8MjD+Dw/2nwqi0ctL9a+JO/HIYDXqcCn1OJ956jrblRfMGJhXqXUjUd17qAxeBPiPh9gjtceQNig==} peerDependencies: '@tiptap/pm': ^2.1.12 y-prosemirror: ^1.2.1 @@ -2841,15 +2897,15 @@ packages: '@tiptap/core': 2.1.16(@tiptap/pm@2.1.16) '@tiptap/pm': 2.1.16 '@tiptap/starter-kit': 2.1.16(@tiptap/pm@2.1.16) - y-prosemirror: 1.2.2(prosemirror-model@1.19.4)(prosemirror-state@1.4.3)(prosemirror-view@1.32.7)(y-protocols@1.0.6)(yjs@13.6.10) - yjs: 13.6.10 + y-prosemirror: 1.2.2(prosemirror-model@1.19.4)(prosemirror-state@1.4.3)(prosemirror-view@1.32.7)(y-protocols@1.0.6)(yjs@13.6.14) + yjs: 13.6.14 dev: false - /@humanwhocodes/config-array@0.11.13: - resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} + /@humanwhocodes/config-array@0.11.14: + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} dependencies: - '@humanwhocodes/object-schema': 2.0.1 + '@humanwhocodes/object-schema': 2.0.2 debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: @@ -2861,8 +2917,8 @@ packages: engines: {node: '>=12.22'} dev: true - /@humanwhocodes/object-schema@2.0.1: - resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} + /@humanwhocodes/object-schema@2.0.2: + resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} dev: true /@isaacs/cliui@8.0.2: @@ -2897,7 +2953,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.11.5 + '@types/node': 20.11.28 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -2918,14 +2974,14 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.5 + '@types/node': 20.11.28 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.11.5)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@20.11.28)(ts-node@10.9.2) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -2953,7 +3009,7 @@ packages: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.5 + '@types/node': 20.11.28 jest-mock: 29.7.0 dev: true @@ -2980,7 +3036,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.11.5 + '@types/node': 20.11.28 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -3013,7 +3069,7 @@ packages: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.20 - '@types/node': 20.11.5 + '@types/node': 20.11.28 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -3101,7 +3157,7 @@ packages: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.11.5 + '@types/node': 20.11.28 '@types/yargs': 17.0.32 chalk: 4.1.2 dev: true @@ -3167,28 +3223,28 @@ packages: engines: {node: '>=8'} dev: false - /@mantine/core@7.4.2(@mantine/hooks@7.4.2)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-kXmq7NjSd1AsOIzqPwQhA7SeZS9hrbARRqhRwr4LLR3NKps9hLmVto441DnpHH/D27eL9gGLSl4GRIdogjX6mg==} + /@mantine/core@7.6.2(@mantine/hooks@7.6.2)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-qmZhmQVc7ZZ8EKKhPkGuZbfBnLXR0xE45ikxfx+1E6/8hLY5Ypr4nWqh5Pk6p3b+K71yYnBqlbNXbtHLQH0h3g==} peerDependencies: - '@mantine/hooks': 7.4.2 + '@mantine/hooks': 7.6.2 react: ^18.2.0 react-dom: ^18.2.0 dependencies: - '@floating-ui/react': 0.24.8(react-dom@18.2.0)(react@18.2.0) - '@mantine/hooks': 7.4.2(react@18.2.0) - clsx: 2.0.0 + '@floating-ui/react': 0.26.9(react-dom@18.2.0)(react@18.2.0) + '@mantine/hooks': 7.6.2(react@18.2.0) + clsx: 2.1.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-number-format: 5.3.1(react-dom@18.2.0)(react@18.2.0) - react-remove-scroll: 2.5.7(@types/react@18.2.48)(react@18.2.0) - react-textarea-autosize: 8.5.3(@types/react@18.2.48)(react@18.2.0) - type-fest: 3.13.1 + react-remove-scroll: 2.5.7(@types/react@18.2.66)(react@18.2.0) + react-textarea-autosize: 8.5.3(@types/react@18.2.66)(react@18.2.0) + type-fest: 4.12.0 transitivePeerDependencies: - '@types/react' dev: false - /@mantine/form@7.4.2(react@18.2.0): - resolution: {integrity: sha512-zlacaHazqmB9NBOp3pHE8+nDlNKUnT02QbV6q4/CNitAlfqDwbB8u9tWKsSU3E0QF6s5oAzcTY+apyD/nWgfrA==} + /@mantine/form@7.6.2(react@18.2.0): + resolution: {integrity: sha512-a5jHPdU3UXvqeAsAvv+OBrwAy/dxiAxCsMlyRrc9JyKCMLEkQ5cQ6FAiHx5vkGG49hy+VgFWLLt8+kWlgqphsQ==} peerDependencies: react: ^18.2.0 dependencies: @@ -3197,61 +3253,61 @@ packages: react: 18.2.0 dev: false - /@mantine/hooks@7.4.2(react@18.2.0): - resolution: {integrity: sha512-tNtn/SNOtSmjLQmIk4S5nsTJjV84Oj0AUYRrAN78HHw3bfWp6bdWbgYPtPEH9e6iFJfdxiX0hrLfWqROalAsbQ==} + /@mantine/hooks@7.6.2(react@18.2.0): + resolution: {integrity: sha512-ZrOgrZHoIGCDKrr2/9njDgK0al+jjusYQFlmR0YyEFyRtgY6eNSI4zuYLcAPx1haHmUm5RsLBrqY6Iy/TLdGXA==} peerDependencies: react: ^18.2.0 dependencies: react: 18.2.0 dev: false - /@mantine/modals@7.4.2(@mantine/core@7.4.2)(@mantine/hooks@7.4.2)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-j1EgDuGDT5vbpO8VLup5p+NAJZWhmyDewpnPuRAe/TQZTht8ZDInXmgO3CJ5m5CwrhCIEeN+aUw0+ZQrPDouRg==} + /@mantine/modals@7.6.2(@mantine/core@7.6.2)(@mantine/hooks@7.6.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-k+lrq+ZTBobP1oNzKEiBtYeefc3wsQjx/T+29SF+m3pir9bqZZ0/0IbEIUMFyqYKhhMjB8DU9+tq5NAPqri7Vg==} peerDependencies: - '@mantine/core': 7.4.2 - '@mantine/hooks': 7.4.2 + '@mantine/core': 7.6.2 + '@mantine/hooks': 7.6.2 react: ^18.2.0 react-dom: ^18.2.0 dependencies: - '@mantine/core': 7.4.2(@mantine/hooks@7.4.2)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) - '@mantine/hooks': 7.4.2(react@18.2.0) + '@mantine/core': 7.6.2(@mantine/hooks@7.6.2)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0) + '@mantine/hooks': 7.6.2(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@mantine/notifications@7.4.2(@mantine/core@7.4.2)(@mantine/hooks@7.4.2)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-lOIv9x+ifb2HyW3SE2UYEWzeQoKVptBR9HCB1m+KUzZiJ5pnBrujWluBzhqYghShr/wykc4Rf4L0hx39egCP9g==} + /@mantine/notifications@7.6.2(@mantine/core@7.6.2)(@mantine/hooks@7.6.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-vLs6Y5nnxHipGkA5TSsxgjeus0N9uS+0+E9KZ5OG5QEtz7BdOsKPtNmytsQzBN8P8fjttFImhhoSUOLpYv0xtA==} peerDependencies: - '@mantine/core': 7.4.2 - '@mantine/hooks': 7.4.2 + '@mantine/core': 7.6.2 + '@mantine/hooks': 7.6.2 react: ^18.2.0 react-dom: ^18.2.0 dependencies: - '@mantine/core': 7.4.2(@mantine/hooks@7.4.2)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) - '@mantine/hooks': 7.4.2(react@18.2.0) - '@mantine/store': 7.4.2(react@18.2.0) + '@mantine/core': 7.6.2(@mantine/hooks@7.6.2)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0) + '@mantine/hooks': 7.6.2(react@18.2.0) + '@mantine/store': 7.6.2(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0) dev: false - /@mantine/spotlight@7.4.2(@mantine/core@7.4.2)(@mantine/hooks@7.4.2)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-107+o7HNIWotSXtcdGlCOQlSiuow5OUeC7yA+2qBGsI/OPOjNEjda4gvgFsf+zH4CN1s0eieBUQ7FG1EoBR8Lw==} + /@mantine/spotlight@7.6.2(@mantine/core@7.6.2)(@mantine/hooks@7.6.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-66VOzAe5M6jUBGt/Z2eWMdCJP+r9NpuUsoI0I5rjDfMDWyUAZOX6a/FS2CzTfDyAmnMGVwWqJZw+DCftIKOMVQ==} peerDependencies: - '@mantine/core': 7.4.2 - '@mantine/hooks': 7.4.2 + '@mantine/core': 7.6.2 + '@mantine/hooks': 7.6.2 react: ^18.2.0 react-dom: ^18.2.0 dependencies: - '@mantine/core': 7.4.2(@mantine/hooks@7.4.2)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) - '@mantine/hooks': 7.4.2(react@18.2.0) - '@mantine/store': 7.4.2(react@18.2.0) + '@mantine/core': 7.6.2(@mantine/hooks@7.6.2)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0) + '@mantine/hooks': 7.6.2(react@18.2.0) + '@mantine/store': 7.6.2(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@mantine/store@7.4.2(react@18.2.0): - resolution: {integrity: sha512-XGGAKu3oUMmnpw8USe4La+T+oSVqsIhYKDjKPxRs5iQ9GKPtxwabAqBXEkPHA1y/txrsEaU5eJVu0ysyBbU4hQ==} + /@mantine/store@7.6.2(react@18.2.0): + resolution: {integrity: sha512-IEGbyIs7LIXYQtjR87GQPiw12klgsiKiqplGu9LekJb8uW/7XSRNs31ggqKmdF+cMWO/WyQhEXZdpWNib6tVOw==} peerDependencies: react: ^18.2.0 dependencies: @@ -3276,12 +3332,12 @@ packages: - supports-color dev: false - /@nestjs/cli@10.3.0: - resolution: {integrity: sha512-37h+wSDItY0NE/x3a/M9yb2cXzfsD4qoE26rHgFn592XXLelDN12wdnfn7dTIaiRZT7WOCdQ+BYP9mQikR4AsA==} + /@nestjs/cli@10.3.2: + resolution: {integrity: sha512-aWmD1GLluWrbuC4a1Iz/XBk5p74Uj6nIVZj6Ov03JbTfgtWqGFLtXuMetvzMiHxfrHehx/myt2iKAPRhKdZvTg==} engines: {node: '>= 16.14'} hasBin: true peerDependencies: - '@swc/cli': ^0.1.62 + '@swc/cli': ^0.1.62 || ^0.3.0 '@swc/core': ^1.3.62 peerDependenciesMeta: '@swc/cli': @@ -3289,15 +3345,15 @@ packages: '@swc/core': optional: true dependencies: - '@angular-devkit/core': 17.0.9(chokidar@3.5.3) - '@angular-devkit/schematics': 17.0.9(chokidar@3.5.3) - '@angular-devkit/schematics-cli': 17.0.9(chokidar@3.5.3) - '@nestjs/schematics': 10.1.0(chokidar@3.5.3)(typescript@5.3.3) + '@angular-devkit/core': 17.1.2(chokidar@3.6.0) + '@angular-devkit/schematics': 17.1.2(chokidar@3.6.0) + '@angular-devkit/schematics-cli': 17.1.2(chokidar@3.6.0) + '@nestjs/schematics': 10.1.1(chokidar@3.6.0)(typescript@5.3.3) chalk: 4.1.2 - chokidar: 3.5.3 + chokidar: 3.6.0 cli-table3: 0.6.3 commander: 4.1.1 - fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.3.3)(webpack@5.89.0) + fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.3.3)(webpack@5.90.1) glob: 10.3.10 inquirer: 8.2.6 node-emoji: 1.11.0 @@ -3309,7 +3365,7 @@ packages: tsconfig-paths: 4.2.0 tsconfig-paths-webpack-plugin: 4.1.0 typescript: 5.3.3 - webpack: 5.89.0 + webpack: 5.90.1 webpack-node-externals: 3.0.0 transitivePeerDependencies: - esbuild @@ -3317,12 +3373,12 @@ packages: - webpack-cli dev: true - /@nestjs/common@10.3.0(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.14)(rxjs@7.8.1): - resolution: {integrity: sha512-DGv34UHsZBxCM3H5QGE2XE/+oLJzz5+714JQjBhjD9VccFlQs3LRxo/epso4l7nJIiNlZkPyIUC8WzfU/5RTsQ==} + /@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1): + resolution: {integrity: sha512-LAkTe8/CF0uNWM0ecuDwUNTHCi1lVSITmmR4FQ6Ftz1E7ujQCnJ5pMRzd8JRN14vdBkxZZ8VbVF0BDUKoKNxMQ==} peerDependencies: class-transformer: '*' class-validator: '*' - reflect-metadata: ^0.1.12 + reflect-metadata: ^0.1.12 || ^0.2.0 rxjs: ^7.1.0 peerDependenciesMeta: class-transformer: @@ -3331,36 +3387,36 @@ packages: optional: true dependencies: class-transformer: 0.5.1 - class-validator: 0.14.0 + class-validator: 0.14.1 iterare: 1.2.1 - reflect-metadata: 0.1.14 + reflect-metadata: 0.2.1 rxjs: 7.8.1 tslib: 2.6.2 uid: 2.0.2 - /@nestjs/config@3.1.1(@nestjs/common@10.3.0)(reflect-metadata@0.1.14): - resolution: {integrity: sha512-qu5QlNiJdqQtOsnB6lx4JCXPQ96jkKUsOGd+JXfXwqJqZcOSAq6heNFg0opW4pq4J/VZoNwoo87TNnx9wthnqQ==} + /@nestjs/config@3.2.0(@nestjs/common@10.3.3)(rxjs@7.8.1): + resolution: {integrity: sha512-BpYRn57shg7CH35KGT6h+hT7ZucB6Qn2B3NBNdvhD4ApU8huS5pX/Wc2e/aO5trIha606Bz2a9t9/vbiuTBTww==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 - reflect-metadata: ^0.1.13 + rxjs: ^7.1.0 dependencies: - '@nestjs/common': 10.3.0(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) - dotenv: 16.3.1 + '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + dotenv: 16.4.1 dotenv-expand: 10.0.0 lodash: 4.17.21 - reflect-metadata: 0.1.14 - uuid: 9.0.0 + rxjs: 7.8.1 + uuid: 9.0.1 dev: false - /@nestjs/core@10.3.0(@nestjs/common@10.3.0)(@nestjs/websockets@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1): - resolution: {integrity: sha512-N06P5ncknW/Pm8bj964WvLIZn2gNhHliCBoAO1LeBvNImYkecqKcrmLbY49Fa1rmMfEM3MuBHeDys3edeuYAOA==} + /@nestjs/core@10.3.3(@nestjs/common@10.3.3)(@nestjs/websockets@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1): + resolution: {integrity: sha512-kxJWggQAPX3RuZx9JVec69eSLaYLNIox2emkZJpfBJ5Qq7cAq7edQIt1r4LGjTKq6kFubNTPsqhWf5y7yFRBPw==} requiresBuild: true peerDependencies: '@nestjs/common': ^10.0.0 '@nestjs/microservices': ^10.0.0 '@nestjs/platform-express': ^10.0.0 '@nestjs/websockets': ^10.0.0 - reflect-metadata: ^0.1.12 + reflect-metadata: ^0.1.12 || ^0.2.0 rxjs: ^7.1.0 peerDependenciesMeta: '@nestjs/microservices': @@ -3370,52 +3426,62 @@ packages: '@nestjs/websockets': optional: true dependencies: - '@nestjs/common': 10.3.0(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) - '@nestjs/websockets': 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(@nestjs/platform-socket.io@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) + '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/websockets': 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(@nestjs/platform-socket.io@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) '@nuxtjs/opencollective': 0.3.2 fast-safe-stringify: 2.1.1 iterare: 1.2.1 path-to-regexp: 3.2.0 - reflect-metadata: 0.1.14 + reflect-metadata: 0.2.1 rxjs: 7.8.1 tslib: 2.6.2 uid: 2.0.2 transitivePeerDependencies: - encoding - /@nestjs/jwt@10.2.0(@nestjs/common@10.3.0): + /@nestjs/jwt@10.2.0(@nestjs/common@10.3.3): resolution: {integrity: sha512-x8cG90SURkEiLOehNaN2aRlotxT0KZESUliOPKKnjWiyJOcWurkF3w345WOX0P4MgFzUjGoZ1Sy0aZnxeihT0g==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 dependencies: - '@nestjs/common': 10.3.0(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) + '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) '@types/jsonwebtoken': 9.0.5 jsonwebtoken: 9.0.2 dev: false - /@nestjs/mapped-types@2.0.4(@nestjs/common@10.3.0)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.14): - resolution: {integrity: sha512-xl+gUSp0B+ln1VSNoUftlglk8dfpUes3DHGxKZ5knuBxS5g2H/8p9/DSBOYWUfO5f4u9s6ffBPZ71WO+tbe5SA==} + /@nestjs/mapped-types@2.0.5(@nestjs/common@10.3.3)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1): + resolution: {integrity: sha512-bSJv4pd6EY99NX9CjBIyn4TVDoSit82DUZlL4I3bqNfy5Gt+gXTa86i3I/i0iIV9P4hntcGM5GyO+FhZAhxtyg==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 class-transformer: ^0.4.0 || ^0.5.0 class-validator: ^0.13.0 || ^0.14.0 - reflect-metadata: ^0.1.12 + reflect-metadata: ^0.1.12 || ^0.2.0 peerDependenciesMeta: class-transformer: optional: true class-validator: optional: true dependencies: - '@nestjs/common': 10.3.0(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) + '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) class-transformer: 0.5.1 - class-validator: 0.14.0 - reflect-metadata: 0.1.14 + class-validator: 0.14.1 + reflect-metadata: 0.2.1 dev: false - /@nestjs/platform-fastify@10.3.0(@fastify/static@6.12.0)(@nestjs/common@10.3.0)(@nestjs/core@10.3.0): - resolution: {integrity: sha512-ka4r/cPWM5y/dXoi9dj6pn1o3WLnfImy2bT3aYVasiDsJff2cd3h/ThugwxjdH0BHUpLSPnawEGzADAcO8Fqug==} + /@nestjs/passport@10.0.3(@nestjs/common@10.3.3)(passport@0.7.0): + resolution: {integrity: sha512-znJ9Y4S8ZDVY+j4doWAJ8EuuVO7SkQN3yOBmzxbGaXbvcSwFDAdGJ+OMCg52NdzIO4tQoN4pYKx8W6M0ArfFRQ==} peerDependencies: - '@fastify/static': ^6.0.0 + '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 + passport: ^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0 + dependencies: + '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + passport: 0.7.0 + dev: false + + /@nestjs/platform-fastify@10.3.3(@fastify/static@7.0.1)(@nestjs/common@10.3.3)(@nestjs/core@10.3.3): + resolution: {integrity: sha512-OTKcKGnWWrSk/nDl5bFmv2gcPhbF6nsU/EHxkh6tguc0YY4aopQR9GaodseJn8isEOtZzcx8UUBsnLTtqWKxaA==} + peerDependencies: + '@fastify/static': ^6.0.0 || ^7.0.0 '@fastify/view': ^7.0.0 || ^8.0.0 '@nestjs/common': ^10.0.0 '@nestjs/core': ^10.0.0 @@ -3425,13 +3491,13 @@ packages: '@fastify/view': optional: true dependencies: - '@fastify/cors': 8.4.2 + '@fastify/cors': 9.0.1 '@fastify/formbody': 7.4.0 '@fastify/middie': 8.3.0 - '@fastify/static': 6.12.0 - '@nestjs/common': 10.3.0(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) - '@nestjs/core': 10.3.0(@nestjs/common@10.3.0)(@nestjs/websockets@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) - fastify: 4.25.1 + '@fastify/static': 7.0.1 + '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/core': 10.3.3(@nestjs/common@10.3.3)(@nestjs/websockets@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) + fastify: 4.26.0 light-my-request: 5.11.0 path-to-regexp: 3.2.0 tslib: 2.6.2 @@ -3439,40 +3505,55 @@ packages: - supports-color dev: false - /@nestjs/platform-socket.io@10.3.0(@nestjs/common@10.3.0)(@nestjs/websockets@10.3.0)(rxjs@7.8.1): - resolution: {integrity: sha512-Rdpk9OdsvJfsmVRtg4/0+cUdvOgBEb3F4zo2r4SBgxb0eaR3BHbhbXTJH/U7NvREIvvYbtSNoWI+h2taUEkXwg==} + /@nestjs/platform-socket.io@10.3.3(@nestjs/common@10.3.3)(@nestjs/websockets@10.3.3)(rxjs@7.8.1): + resolution: {integrity: sha512-QqM9BMTdYPvXOqx3oWrv130HOtc2krPvfgqgDsPWkBLfR+TssrA5QDaTW8HSjEQAfmugvHwhEAAU4+yXRl6tKg==} peerDependencies: '@nestjs/common': ^10.0.0 '@nestjs/websockets': ^10.0.0 rxjs: ^7.1.0 dependencies: - '@nestjs/common': 10.3.0(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) - '@nestjs/websockets': 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(@nestjs/platform-socket.io@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) + '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/websockets': 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(@nestjs/platform-socket.io@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) rxjs: 7.8.1 - socket.io: 4.7.2 + socket.io: 4.7.4 tslib: 2.6.2 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - /@nestjs/schematics@10.1.0(chokidar@3.5.3)(typescript@5.3.3): - resolution: {integrity: sha512-HQWvD3F7O0Sv3qHS2jineWxPLmBTLlyjT6VdSw2EAIXulitmV+ErxB3TCVQQORlNkl5p5cwRYWyBaOblDbNFIQ==} + /@nestjs/schematics@10.1.1(chokidar@3.6.0)(typescript@5.3.3): + resolution: {integrity: sha512-o4lfCnEeIkfJhGBbLZxTuVWcGuqDCFwg5OrvpgRUBM7vI/vONvKKiB5riVNpO+JqXoH0I42NNeDb0m4V5RREig==} peerDependencies: typescript: '>=4.8.2' dependencies: - '@angular-devkit/core': 17.0.9(chokidar@3.5.3) - '@angular-devkit/schematics': 17.0.9(chokidar@3.5.3) + '@angular-devkit/core': 17.1.2(chokidar@3.6.0) + '@angular-devkit/schematics': 17.1.2(chokidar@3.6.0) comment-json: 4.2.3 - jsonc-parser: 3.2.0 + jsonc-parser: 3.2.1 pluralize: 8.0.0 typescript: 5.3.3 transitivePeerDependencies: - chokidar dev: true - /@nestjs/serve-static@4.0.0(@fastify/static@6.12.0)(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(fastify@4.25.2): - resolution: {integrity: sha512-8cTrNV2ngdHIjiLNsXePnw0+KY1ThrZGz/WeyAG5gIvmZNDbnZBOrPoYlKL+MOzlXlQStxR5jKLYmn+nJeoncQ==} + /@nestjs/schematics@10.1.1(typescript@5.4.2): + resolution: {integrity: sha512-o4lfCnEeIkfJhGBbLZxTuVWcGuqDCFwg5OrvpgRUBM7vI/vONvKKiB5riVNpO+JqXoH0I42NNeDb0m4V5RREig==} + peerDependencies: + typescript: '>=4.8.2' + dependencies: + '@angular-devkit/core': 17.1.2(chokidar@3.6.0) + '@angular-devkit/schematics': 17.1.2(chokidar@3.6.0) + comment-json: 4.2.3 + jsonc-parser: 3.2.1 + pluralize: 8.0.0 + typescript: 5.4.2 + transitivePeerDependencies: + - chokidar + dev: true + + /@nestjs/serve-static@4.0.1(@fastify/static@7.0.1)(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(fastify@4.26.2): + resolution: {integrity: sha512-AoOrVdAe+WmsceuCcA8nWmKUYmaOsg9pqBCbIj7PS4W3XdikJQMtfxgSIoOlyUksZdhTBFjHqKh0Yhpj6pulwQ==} peerDependencies: '@fastify/static': ^6.5.0 '@nestjs/common': ^9.0.0 || ^10.0.0 @@ -3487,15 +3568,15 @@ packages: fastify: optional: true dependencies: - '@fastify/static': 6.12.0 - '@nestjs/common': 10.3.0(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) - '@nestjs/core': 10.3.0(@nestjs/common@10.3.0)(@nestjs/websockets@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) - fastify: 4.25.2 + '@fastify/static': 7.0.1 + '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/core': 10.3.3(@nestjs/common@10.3.3)(@nestjs/websockets@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) + fastify: 4.26.2 path-to-regexp: 0.2.5 dev: false - /@nestjs/testing@10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0): - resolution: {integrity: sha512-8DM+bw1qASCvaEnoHUQhypCOf54+G5R21MeFBMvnSk5DtKaWVZuzDP2GjLeYCpTH19WeP6LrrjHv3rX2LKU02A==} + /@nestjs/testing@10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3): + resolution: {integrity: sha512-kX20GfjAImL5grd/i69uD/x7sc00BaqGcP2dRG3ilqshQUuy5DOmspLCr3a2C8xmVU7kzK4spT0oTxhe6WcCAA==} peerDependencies: '@nestjs/common': ^10.0.0 '@nestjs/core': ^10.0.0 @@ -3507,46 +3588,46 @@ packages: '@nestjs/platform-express': optional: true dependencies: - '@nestjs/common': 10.3.0(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) - '@nestjs/core': 10.3.0(@nestjs/common@10.3.0)(@nestjs/websockets@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) + '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/core': 10.3.3(@nestjs/common@10.3.3)(@nestjs/websockets@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) tslib: 2.6.2 dev: true - /@nestjs/typeorm@10.0.1(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1)(typeorm@0.3.19): - resolution: {integrity: sha512-YVFYL7D25VAVp5/G+KLXIgsRfYomA+VaFZBpm2rtwrrBOmkXNrxr7kuI2bBBO/Xy4kKBDe6wbvIVVFeEA7/ngA==} + /@nestjs/typeorm@10.0.2(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1)(typeorm@0.3.20): + resolution: {integrity: sha512-H738bJyydK4SQkRCTeh1aFBxoO1E9xdL/HaLGThwrqN95os5mEyAtK7BLADOS+vldP4jDZ2VQPLj4epWwRqCeQ==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 '@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0 - reflect-metadata: ^0.1.13 + reflect-metadata: ^0.1.13 || ^0.2.0 rxjs: ^7.2.0 typeorm: ^0.3.0 dependencies: - '@nestjs/common': 10.3.0(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) - '@nestjs/core': 10.3.0(@nestjs/common@10.3.0)(@nestjs/websockets@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) - reflect-metadata: 0.1.14 + '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/core': 10.3.3(@nestjs/common@10.3.3)(@nestjs/websockets@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) + reflect-metadata: 0.2.1 rxjs: 7.8.1 - typeorm: 0.3.19(pg@8.11.3)(ts-node@10.9.2) + typeorm: 0.3.20(pg@8.11.3)(ts-node@10.9.2) uuid: 9.0.1 dev: false - /@nestjs/websockets@10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(@nestjs/platform-socket.io@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1): - resolution: {integrity: sha512-1cqh46s4iHLytExSWcvp/58pMZFAT7pQ59IAYQCSZz5xFq0lEGxd36C982KyROQIHfno8E+FWm71UhgVTwKsyA==} + /@nestjs/websockets@10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(@nestjs/platform-socket.io@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1): + resolution: {integrity: sha512-cR5cB0bLS87vd0iu7Nud/4x2EH1Vs0aIgwGWd0eH/5SAw0rrDNU81PiOde+rnMXETbxvSVfOZuLRyn7/WQtGUg==} peerDependencies: '@nestjs/common': ^10.0.0 '@nestjs/core': ^10.0.0 '@nestjs/platform-socket.io': ^10.0.0 - reflect-metadata: ^0.1.12 + reflect-metadata: ^0.1.12 || ^0.2.0 rxjs: ^7.1.0 peerDependenciesMeta: '@nestjs/platform-socket.io': optional: true dependencies: - '@nestjs/common': 10.3.0(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) - '@nestjs/core': 10.3.0(@nestjs/common@10.3.0)(@nestjs/websockets@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) - '@nestjs/platform-socket.io': 10.3.0(@nestjs/common@10.3.0)(@nestjs/websockets@10.3.0)(rxjs@7.8.1) + '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/core': 10.3.3(@nestjs/common@10.3.3)(@nestjs/websockets@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/platform-socket.io': 10.3.3(@nestjs/common@10.3.3)(@nestjs/websockets@10.3.3)(rxjs@7.8.1) iterare: 1.2.1 object-hash: 3.0.0 - reflect-metadata: 0.1.14 + reflect-metadata: 0.2.1 rxjs: 7.8.1 tslib: 2.6.2 @@ -3568,7 +3649,7 @@ packages: engines: {node: '>= 8'} dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.16.0 + fastq: 1.17.1 dev: true /@nrwl/devkit@17.2.8(nx@17.2.8): @@ -3579,10 +3660,10 @@ packages: - nx dev: true - /@nrwl/js@17.2.8(@types/node@20.11.5)(nx@17.2.8)(typescript@5.3.3): + /@nrwl/js@17.2.8(@types/node@20.11.28)(nx@17.2.8)(typescript@5.4.2): resolution: {integrity: sha512-ZfTGNSmSBqvEfP8NOfOHcnqKwhXsfqBrN4IhthQR02sqTA9GkrjSfSUtcGXY01fUitsNUDOn6RZjgX6UysDCXg==} dependencies: - '@nx/js': 17.2.8(@types/node@20.11.5)(nx@17.2.8)(typescript@5.3.3) + '@nx/js': 17.2.8(@types/node@20.11.28)(nx@17.2.8)(typescript@5.4.2) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -3644,7 +3725,7 @@ packages: tslib: 2.6.2 dev: true - /@nx/js@17.2.8(@types/node@20.11.5)(nx@17.2.8)(typescript@5.3.3): + /@nx/js@17.2.8(@types/node@20.11.28)(nx@17.2.8)(typescript@5.4.2): resolution: {integrity: sha512-M91tw9tfSnkoC8pZaC9wNxrgaFU4MeQcgdT08ievaroo77kH4RheySsU1uNc0J58Jk4X4315wu/X7Bf/35m0Mw==} peerDependencies: verdaccio: ^5.0.4 @@ -3659,10 +3740,10 @@ packages: '@babel/preset-env': 7.23.8(@babel/core@7.23.7) '@babel/preset-typescript': 7.23.3(@babel/core@7.23.7) '@babel/runtime': 7.23.7 - '@nrwl/js': 17.2.8(@types/node@20.11.5)(nx@17.2.8)(typescript@5.3.3) + '@nrwl/js': 17.2.8(@types/node@20.11.28)(nx@17.2.8)(typescript@5.4.2) '@nx/devkit': 17.2.8(nx@17.2.8) '@nx/workspace': 17.2.8 - '@phenomnomnominal/tsquery': 5.0.1(typescript@5.3.3) + '@phenomnomnominal/tsquery': 5.0.1(typescript@5.4.2) babel-plugin-const-enum: 1.2.0(@babel/core@7.23.7) babel-plugin-macros: 2.8.0 babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.23.7) @@ -3679,7 +3760,7 @@ packages: ora: 5.3.0 semver: 7.5.3 source-map-support: 0.5.19 - ts-node: 10.9.1(@types/node@20.11.5)(typescript@5.3.3) + ts-node: 10.9.1(@types/node@20.11.28)(typescript@5.4.2) tsconfig-paths: 4.2.0 tslib: 2.6.2 transitivePeerDependencies: @@ -3800,13 +3881,13 @@ packages: - debug dev: true - /@phenomnomnominal/tsquery@5.0.1(typescript@5.3.3): + /@phenomnomnominal/tsquery@5.0.1(typescript@5.4.2): resolution: {integrity: sha512-3nVv+e2FQwsW8Aw6qTU6f+1rfcJ3hrcnvH/mu9i8YhxO+9sqbOfpL8m6PbET5+xKOlz/VSbp0RoYWYCtIsnmuA==} peerDependencies: typescript: ^3 || ^4 || ^5 dependencies: esquery: 1.5.0 - typescript: 5.3.3 + typescript: 5.4.2 dev: true /@pkgjs/parseargs@0.11.0: @@ -3815,6 +3896,11 @@ packages: requiresBuild: true optional: true + /@pkgr/core@0.1.1: + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + dev: true + /@popperjs/core@2.11.8: resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} dev: false @@ -3859,8 +3945,8 @@ packages: type-fest: 2.19.0 dev: false - /@remix-run/router@1.14.2: - resolution: {integrity: sha512-ACXpdMM9hmKZww21yEqWwiLws/UPLhNKvimN8RrYSqPSvB3ov7sLvAcfvaxePeLvccTQKGdkDIhLYApZVDFuKg==} + /@remix-run/router@1.15.3: + resolution: {integrity: sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==} engines: {node: '>=14.0.0'} dev: false @@ -3984,458 +4070,459 @@ packages: '@sinonjs/commons': 3.0.0 dev: true - /@smithy/abort-controller@2.0.16: - resolution: {integrity: sha512-4foO7738k8kM9flMHu3VLabqu7nPgvIj8TB909S0CnKx0YZz/dcDH3pZ/4JHdatfxlZdKF1JWOYCw9+v3HVVsw==} + /@smithy/abort-controller@2.2.0: + resolution: {integrity: sha512-wRlta7GuLWpTqtFfGo+nZyOO1vEvewdNR1R4rTxpC8XU6vG/NDyrFBhwLZsqg1NUoR1noVaXJPC/7ZK47QCySw==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/types': 2.8.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 dev: false - /@smithy/chunked-blob-reader-native@2.0.1: - resolution: {integrity: sha512-N2oCZRglhWKm7iMBu7S6wDzXirjAofi7tAd26cxmgibRYOBS4D3hGfmkwCpHdASZzwZDD8rluh0Rcqw1JeZDRw==} + /@smithy/chunked-blob-reader-native@2.2.0: + resolution: {integrity: sha512-VNB5+1oCgX3Fzs072yuRsUoC2N4Zg/LJ11DTxX3+Qu+Paa6AmbIF0E9sc2wthz9Psrk/zcOlTCyuposlIhPjZQ==} dependencies: - '@smithy/util-base64': 2.0.1 + '@smithy/util-base64': 2.3.0 tslib: 2.6.2 dev: false - /@smithy/chunked-blob-reader@2.0.0: - resolution: {integrity: sha512-k+J4GHJsMSAIQPChGBrjEmGS+WbPonCXesoqP9fynIqjn7rdOThdH8FAeCmokP9mxTYKQAKoHCLPzNlm6gh7Wg==} + /@smithy/chunked-blob-reader@2.2.0: + resolution: {integrity: sha512-3GJNvRwXBGdkDZZOGiziVYzDpn4j6zfyULHMDKAGIUo72yHALpE9CbhfQp/XcLNVoc1byfMpn6uW5H2BqPjgaQ==} dependencies: tslib: 2.6.2 dev: false - /@smithy/config-resolver@2.0.23: - resolution: {integrity: sha512-XakUqgtP2YY8Mi+Nlif5BiqJgWdvfxJafSpOSQeCOMizu+PUhE4fBQSy6xFcR+eInrwVadaABNxoJyGUMn15ew==} + /@smithy/config-resolver@2.2.0: + resolution: {integrity: sha512-fsiMgd8toyUba6n1WRmr+qACzXltpdDkPTAaDqc8QqPBUzO+/JKwL6bUBseHVi8tu9l+3JOK+tSf7cay+4B3LA==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/node-config-provider': 2.1.9 - '@smithy/types': 2.8.0 - '@smithy/util-config-provider': 2.1.0 - '@smithy/util-middleware': 2.0.9 + '@smithy/node-config-provider': 2.3.0 + '@smithy/types': 2.12.0 + '@smithy/util-config-provider': 2.3.0 + '@smithy/util-middleware': 2.2.0 tslib: 2.6.2 dev: false - /@smithy/core@1.2.2: - resolution: {integrity: sha512-uLjrskLT+mWb0emTR5QaiAIxVEU7ndpptDaVDrTwwhD+RjvHhjIiGQ3YL5jKk1a5VSDQUA2RGkXvJ6XKRcz6Dg==} + /@smithy/core@1.4.0: + resolution: {integrity: sha512-uu9ZDI95Uij4qk+L6kyFjdk11zqBkcJ3Lv0sc6jZrqHvLyr0+oeekD3CnqMafBn/5PRI6uv6ulW3kNLRBUHeVw==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/middleware-endpoint': 2.3.0 - '@smithy/middleware-retry': 2.0.26 - '@smithy/middleware-serde': 2.0.16 - '@smithy/protocol-http': 3.0.12 - '@smithy/smithy-client': 2.2.1 - '@smithy/types': 2.8.0 - '@smithy/util-middleware': 2.0.9 + '@smithy/middleware-endpoint': 2.5.0 + '@smithy/middleware-retry': 2.2.0 + '@smithy/middleware-serde': 2.3.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/smithy-client': 2.5.0 + '@smithy/types': 2.12.0 + '@smithy/util-middleware': 2.2.0 tslib: 2.6.2 dev: false - /@smithy/credential-provider-imds@2.1.5: - resolution: {integrity: sha512-VfvE6Wg1MUWwpTZFBnUD7zxvPhLY8jlHCzu6bCjlIYoWgXCDzZAML76IlZUEf45nib3rjehnFgg0s1rgsuN/bg==} + /@smithy/credential-provider-imds@2.3.0: + resolution: {integrity: sha512-BWB9mIukO1wjEOo1Ojgl6LrG4avcaC7T/ZP6ptmAaW4xluhSIPZhY+/PI5YKzlk+jsm+4sQZB45Bt1OfMeQa3w==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/node-config-provider': 2.1.9 - '@smithy/property-provider': 2.0.17 - '@smithy/types': 2.8.0 - '@smithy/url-parser': 2.0.16 + '@smithy/node-config-provider': 2.3.0 + '@smithy/property-provider': 2.2.0 + '@smithy/types': 2.12.0 + '@smithy/url-parser': 2.2.0 tslib: 2.6.2 dev: false - /@smithy/eventstream-codec@2.0.16: - resolution: {integrity: sha512-umYh5pdCE9GHgiMAH49zu9wXWZKNHHdKPm/lK22WYISTjqu29SepmpWNmPiBLy/yUu4HFEGJHIFrDWhbDlApaw==} + /@smithy/eventstream-codec@2.2.0: + resolution: {integrity: sha512-8janZoJw85nJmQZc4L8TuePp2pk1nxLgkxIR0TUjKJ5Dkj5oelB9WtiSSGXCQvNsJl0VSTvK/2ueMXxvpa9GVw==} dependencies: '@aws-crypto/crc32': 3.0.0 - '@smithy/types': 2.8.0 - '@smithy/util-hex-encoding': 2.0.0 + '@smithy/types': 2.12.0 + '@smithy/util-hex-encoding': 2.2.0 tslib: 2.6.2 dev: false - /@smithy/eventstream-serde-browser@2.0.16: - resolution: {integrity: sha512-W+BdiN728R57KuZOcG0GczpIOEFf8S5RP/OdVH7T3FMCy8HU2bBU0vB5xZZR5c00VRdoeWrohNv3XlHoZuGRoA==} + /@smithy/eventstream-serde-browser@2.2.0: + resolution: {integrity: sha512-UaPf8jKbcP71BGiO0CdeLmlg+RhWnlN8ipsMSdwvqBFigl5nil3rHOI/5GE3tfiuX8LvY5Z9N0meuU7Rab7jWw==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/eventstream-serde-universal': 2.0.16 - '@smithy/types': 2.8.0 + '@smithy/eventstream-serde-universal': 2.2.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 dev: false - /@smithy/eventstream-serde-config-resolver@2.0.16: - resolution: {integrity: sha512-8qrE4nh+Tg6m1SMFK8vlzoK+8bUFTlIhXidmmQfASMninXW3Iu0T0bI4YcIk4nLznHZdybQ0qGydIanvVZxzVg==} + /@smithy/eventstream-serde-config-resolver@2.2.0: + resolution: {integrity: sha512-RHhbTw/JW3+r8QQH7PrganjNCiuiEZmpi6fYUAetFfPLfZ6EkiA08uN3EFfcyKubXQxOwTeJRZSQmDDCdUshaA==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/types': 2.8.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 dev: false - /@smithy/eventstream-serde-node@2.0.16: - resolution: {integrity: sha512-NRNQuOa6mQdFSkqzY0IV37swHWx0SEoKxFtUfdZvfv0AVQPlSw4N7E3kcRSCpnHBr1kCuWWirdDlWcjWuD81MA==} + /@smithy/eventstream-serde-node@2.2.0: + resolution: {integrity: sha512-zpQMtJVqCUMn+pCSFcl9K/RPNtQE0NuMh8sKpCdEHafhwRsjP50Oq/4kMmvxSRy6d8Jslqd8BLvDngrUtmN9iA==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/eventstream-serde-universal': 2.0.16 - '@smithy/types': 2.8.0 + '@smithy/eventstream-serde-universal': 2.2.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 dev: false - /@smithy/eventstream-serde-universal@2.0.16: - resolution: {integrity: sha512-ZyLnGaYQMLc75j9kKEVMJ3X6bdBE9qWxhZdTXM5RIltuytxJC3FaOhawBxjE+IL1enmWSIohHGZCm/pLwEliQA==} + /@smithy/eventstream-serde-universal@2.2.0: + resolution: {integrity: sha512-pvoe/vvJY0mOpuF84BEtyZoYfbehiFj8KKWk1ds2AT0mTLYFVs+7sBJZmioOFdBXKd48lfrx1vumdPdmGlCLxA==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/eventstream-codec': 2.0.16 - '@smithy/types': 2.8.0 + '@smithy/eventstream-codec': 2.2.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 dev: false - /@smithy/fetch-http-handler@2.3.2: - resolution: {integrity: sha512-O9R/OlnAOTsnysuSDjt0v2q6DcSvCz5cCFC/CFAWWcLyBwJDeFyGTCTszgpQTb19+Fi8uRwZE5/3ziAQBFeDMQ==} + /@smithy/fetch-http-handler@2.5.0: + resolution: {integrity: sha512-BOWEBeppWhLn/no/JxUL/ghTfANTjT7kg3Ww2rPqTUY9R4yHPXxJ9JhMe3Z03LN3aPwiwlpDIUcVw1xDyHqEhw==} dependencies: - '@smithy/protocol-http': 3.0.12 - '@smithy/querystring-builder': 2.0.16 - '@smithy/types': 2.8.0 - '@smithy/util-base64': 2.0.1 + '@smithy/protocol-http': 3.3.0 + '@smithy/querystring-builder': 2.2.0 + '@smithy/types': 2.12.0 + '@smithy/util-base64': 2.3.0 tslib: 2.6.2 dev: false - /@smithy/hash-blob-browser@2.0.17: - resolution: {integrity: sha512-/mPpv1sRiRDdjO4zZuO8be6eeabmg5AVgKDfnmmqkpBtRyMGSJb968fjRuHt+FRAsIGywgIKJFmUUAYjhsi1oQ==} + /@smithy/hash-blob-browser@2.2.0: + resolution: {integrity: sha512-SGPoVH8mdXBqrkVCJ1Hd1X7vh1zDXojNN1yZyZTZsCno99hVue9+IYzWDjq/EQDDXxmITB0gBmuyPh8oAZSTcg==} dependencies: - '@smithy/chunked-blob-reader': 2.0.0 - '@smithy/chunked-blob-reader-native': 2.0.1 - '@smithy/types': 2.8.0 + '@smithy/chunked-blob-reader': 2.2.0 + '@smithy/chunked-blob-reader-native': 2.2.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 dev: false - /@smithy/hash-node@2.0.18: - resolution: {integrity: sha512-gN2JFvAgnZCyDN9rJgcejfpK0uPPJrSortVVVVWsru9whS7eQey6+gj2eM5ln2i6rHNntIXzal1Fm9XOPuoaKA==} + /@smithy/hash-node@2.2.0: + resolution: {integrity: sha512-zLWaC/5aWpMrHKpoDF6nqpNtBhlAYKF/7+9yMN7GpdR8CzohnWfGtMznPybnwSS8saaXBMxIGwJqR4HmRp6b3g==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/types': 2.8.0 - '@smithy/util-buffer-from': 2.0.0 - '@smithy/util-utf8': 2.0.2 + '@smithy/types': 2.12.0 + '@smithy/util-buffer-from': 2.2.0 + '@smithy/util-utf8': 2.3.0 tslib: 2.6.2 dev: false - /@smithy/hash-stream-node@2.0.18: - resolution: {integrity: sha512-OuFk+ITpv8CtxGjQcS8GA04faNycu9UMm6YobvQzjeEoXZ0dLF6sRfuzD+3S8RHPKpTyLuXtKG1+GiJycZ5TcA==} + /@smithy/hash-stream-node@2.2.0: + resolution: {integrity: sha512-aT+HCATOSRMGpPI7bi7NSsTNVZE/La9IaxLXWoVAYMxHT5hGO3ZOGEMZQg8A6nNL+pdFGtZQtND1eoY084HgHQ==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/types': 2.8.0 - '@smithy/util-utf8': 2.0.2 + '@smithy/types': 2.12.0 + '@smithy/util-utf8': 2.3.0 tslib: 2.6.2 dev: false - /@smithy/invalid-dependency@2.0.16: - resolution: {integrity: sha512-apEHakT/kmpNo1VFHP4W/cjfeP9U0x5qvfsLJubgp7UM/gq4qYp0GbqdE7QhsjUaYvEnrftRqs7+YrtWreV0wA==} + /@smithy/invalid-dependency@2.2.0: + resolution: {integrity: sha512-nEDASdbKFKPXN2O6lOlTgrEEOO9NHIeO+HVvZnkqc8h5U9g3BIhWsvzFo+UcUbliMHvKNPD/zVxDrkP1Sbgp8Q==} dependencies: - '@smithy/types': 2.8.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 dev: false - /@smithy/is-array-buffer@2.0.0: - resolution: {integrity: sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==} + /@smithy/is-array-buffer@2.2.0: + resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} engines: {node: '>=14.0.0'} dependencies: tslib: 2.6.2 dev: false - /@smithy/md5-js@2.0.18: - resolution: {integrity: sha512-bHwZ8/m6RbERQdVW5rJ2LzeW8qxfXv6Q/S7Fiudhso4pWRrksqLx3nsGZw7bmqqfN4zLqkxydxSa9+4c7s5zxg==} + /@smithy/md5-js@2.2.0: + resolution: {integrity: sha512-M26XTtt9IIusVMOWEAhIvFIr9jYj4ISPPGJROqw6vXngO3IYJCnVVSMFn4Tx1rUTG5BiKJNg9u2nxmBiZC5IlQ==} dependencies: - '@smithy/types': 2.8.0 - '@smithy/util-utf8': 2.0.2 + '@smithy/types': 2.12.0 + '@smithy/util-utf8': 2.3.0 tslib: 2.6.2 dev: false - /@smithy/middleware-content-length@2.0.18: - resolution: {integrity: sha512-ZJ9uKPTfxYheTKSKYB+GCvcj+izw9WGzRLhjn8n254q0jWLojUzn7Vw0l4R/Gq7Wdpf/qmk/ptD+6CCXHNVCaw==} + /@smithy/middleware-content-length@2.2.0: + resolution: {integrity: sha512-5bl2LG1Ah/7E5cMSC+q+h3IpVHMeOkG0yLRyQT1p2aMJkSrZG7RlXHPuAgb7EyaFeidKEnnd/fNaLLaKlHGzDQ==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/protocol-http': 3.0.12 - '@smithy/types': 2.8.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 dev: false - /@smithy/middleware-endpoint@2.3.0: - resolution: {integrity: sha512-VsOAG2YQ8ykjSmKO+CIXdJBIWFo6AAvG6Iw95BakBTqk66/4BI7XyqLevoNSq/lZ6NgZv24sLmrcIN+fLDWBCg==} + /@smithy/middleware-endpoint@2.5.0: + resolution: {integrity: sha512-OBhI9ZEAG8Xen0xsFJwwNOt44WE2CWkfYIxTognC8x42Lfsdf0VN/wCMqpdkySMDio/vts10BiovAxQp0T0faA==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/middleware-serde': 2.0.16 - '@smithy/node-config-provider': 2.1.9 - '@smithy/shared-ini-file-loader': 2.2.8 - '@smithy/types': 2.8.0 - '@smithy/url-parser': 2.0.16 - '@smithy/util-middleware': 2.0.9 + '@smithy/middleware-serde': 2.3.0 + '@smithy/node-config-provider': 2.3.0 + '@smithy/shared-ini-file-loader': 2.4.0 + '@smithy/types': 2.12.0 + '@smithy/url-parser': 2.2.0 + '@smithy/util-middleware': 2.2.0 tslib: 2.6.2 dev: false - /@smithy/middleware-retry@2.0.26: - resolution: {integrity: sha512-Qzpxo0U5jfNiq9iD38U3e2bheXwvTEX4eue9xruIvEgh+UKq6dKuGqcB66oBDV7TD/mfoJi9Q/VmaiqwWbEp7A==} + /@smithy/middleware-retry@2.2.0: + resolution: {integrity: sha512-PsjDOLpbevgn37yJbawmfVoanru40qVA8UEf2+YA1lvOefmhuhL6ZbKtGsLAWDRnE1OlAmedsbA/htH6iSZjNA==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/node-config-provider': 2.1.9 - '@smithy/protocol-http': 3.0.12 - '@smithy/service-error-classification': 2.0.9 - '@smithy/smithy-client': 2.2.1 - '@smithy/types': 2.8.0 - '@smithy/util-middleware': 2.0.9 - '@smithy/util-retry': 2.0.9 + '@smithy/node-config-provider': 2.3.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/service-error-classification': 2.1.5 + '@smithy/smithy-client': 2.5.0 + '@smithy/types': 2.12.0 + '@smithy/util-middleware': 2.2.0 + '@smithy/util-retry': 2.2.0 tslib: 2.6.2 uuid: 8.3.2 dev: false - /@smithy/middleware-serde@2.0.16: - resolution: {integrity: sha512-5EAd4t30pcc4M8TSSGq7q/x5IKrxfXR5+SrU4bgxNy7RPHQo2PSWBUco9C+D9Tfqp/JZvprRpK42dnupZafk2g==} + /@smithy/middleware-serde@2.3.0: + resolution: {integrity: sha512-sIADe7ojwqTyvEQBe1nc/GXB9wdHhi9UwyX0lTyttmUWDJLP655ZYE1WngnNyXREme8I27KCaUhyhZWRXL0q7Q==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/types': 2.8.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 dev: false - /@smithy/middleware-stack@2.0.10: - resolution: {integrity: sha512-I2rbxctNq9FAPPEcuA1ntZxkTKOPQFy7YBPOaD/MLg1zCvzv21CoNxR0py6J8ZVC35l4qE4nhxB0f7TF5/+Ldw==} + /@smithy/middleware-stack@2.2.0: + resolution: {integrity: sha512-Qntc3jrtwwrsAC+X8wms8zhrTr0sFXnyEGhZd9sLtsJ/6gGQKFzNB+wWbOcpJd7BR8ThNCoKt76BuQahfMvpeA==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/types': 2.8.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 dev: false - /@smithy/node-config-provider@2.1.9: - resolution: {integrity: sha512-tUyW/9xrRy+s7RXkmQhgYkAPMpTIF8izK4orhHjNFEKR3QZiOCbWB546Y8iB/Fpbm3O9+q0Af9rpywLKJOwtaQ==} + /@smithy/node-config-provider@2.3.0: + resolution: {integrity: sha512-0elK5/03a1JPWMDPaS726Iw6LpQg80gFut1tNpPfxFuChEEklo2yL823V94SpTZTxmKlXFtFgsP55uh3dErnIg==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/property-provider': 2.0.17 - '@smithy/shared-ini-file-loader': 2.2.8 - '@smithy/types': 2.8.0 + '@smithy/property-provider': 2.2.0 + '@smithy/shared-ini-file-loader': 2.4.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 dev: false - /@smithy/node-http-handler@2.2.2: - resolution: {integrity: sha512-XO58TO/Eul/IBQKFKaaBtXJi0ItEQQCT+NI4IiKHCY/4KtqaUT6y/wC1EvDqlA9cP7Dyjdj7FdPs4DyynH3u7g==} + /@smithy/node-http-handler@2.5.0: + resolution: {integrity: sha512-mVGyPBzkkGQsPoxQUbxlEfRjrj6FPyA3u3u2VXGr9hT8wilsoQdZdvKpMBFMB8Crfhv5dNkKHIW0Yyuc7eABqA==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/abort-controller': 2.0.16 - '@smithy/protocol-http': 3.0.12 - '@smithy/querystring-builder': 2.0.16 - '@smithy/types': 2.8.0 + '@smithy/abort-controller': 2.2.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/querystring-builder': 2.2.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 dev: false - /@smithy/property-provider@2.0.17: - resolution: {integrity: sha512-+VkeZbVu7qtQ2DjI48Qwaf9fPOr3gZIwxQpuLJgRRSkWsdSvmaTCxI3gzRFKePB63Ts9r4yjn4HkxSCSkdWmcQ==} + /@smithy/property-provider@2.2.0: + resolution: {integrity: sha512-+xiil2lFhtTRzXkx8F053AV46QnIw6e7MV8od5Mi68E1ICOjCeCHw2XfLnDEUHnT9WGUIkwcqavXjfwuJbGlpg==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/types': 2.8.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 dev: false - /@smithy/protocol-http@3.0.12: - resolution: {integrity: sha512-Xz4iaqLiaBfbQpB9Hgi3VcZYbP7xRDXYhd8XWChh4v94uw7qwmvlxdU5yxzfm6ACJM66phHrTbS5TVvj5uQ72w==} + /@smithy/protocol-http@3.3.0: + resolution: {integrity: sha512-Xy5XK1AFWW2nlY/biWZXu6/krgbaf2dg0q492D8M5qthsnU2H+UgFeZLbM76FnH7s6RO/xhQRkj+T6KBO3JzgQ==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/types': 2.8.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 dev: false - /@smithy/querystring-builder@2.0.16: - resolution: {integrity: sha512-Q/GsJT0C0mijXMRs7YhZLLCP5FcuC4797lYjKQkME5CZohnLC4bEhylAd2QcD3gbMKNjCw8+T2I27WKiV/wToA==} + /@smithy/querystring-builder@2.2.0: + resolution: {integrity: sha512-L1kSeviUWL+emq3CUVSgdogoM/D9QMFaqxL/dd0X7PCNWmPXqt+ExtrBjqT0V7HLN03Vs9SuiLrG3zy3JGnE5A==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/types': 2.8.0 - '@smithy/util-uri-escape': 2.0.0 + '@smithy/types': 2.12.0 + '@smithy/util-uri-escape': 2.2.0 tslib: 2.6.2 dev: false - /@smithy/querystring-parser@2.0.16: - resolution: {integrity: sha512-c4ueAuL6BDYKWpkubjrQthZKoC3L5kql5O++ovekNxiexRXTlLIVlCR4q3KziOktLIw66EU9SQljPXd/oN6Okg==} + /@smithy/querystring-parser@2.2.0: + resolution: {integrity: sha512-BvHCDrKfbG5Yhbpj4vsbuPV2GgcpHiAkLeIlcA1LtfpMz3jrqizP1+OguSNSj1MwBHEiN+jwNisXLGdajGDQJA==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/types': 2.8.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 dev: false - /@smithy/service-error-classification@2.0.9: - resolution: {integrity: sha512-0K+8GvtwI7VkGmmInPydM2XZyBfIqLIbfR7mDQ+oPiz8mIinuHbV6sxOLdvX1Jv/myk7XTK9orgt3tuEpBu/zg==} + /@smithy/service-error-classification@2.1.5: + resolution: {integrity: sha512-uBDTIBBEdAQryvHdc5W8sS5YX7RQzF683XrHePVdFmAgKiMofU15FLSM0/HU03hKTnazdNRFa0YHS7+ArwoUSQ==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/types': 2.8.0 + '@smithy/types': 2.12.0 dev: false - /@smithy/shared-ini-file-loader@2.2.8: - resolution: {integrity: sha512-E62byatbwSWrtq9RJ7xN40tqrRKDGrEL4EluyNpaIDvfvet06a/QC58oHw2FgVaEgkj0tXZPjZaKrhPfpoU0qw==} + /@smithy/shared-ini-file-loader@2.4.0: + resolution: {integrity: sha512-WyujUJL8e1B6Z4PBfAqC/aGY1+C7T0w20Gih3yrvJSk97gpiVfB+y7c46T4Nunk+ZngLq0rOIdeVeIklk0R3OA==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/types': 2.8.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 dev: false - /@smithy/signature-v4@2.0.19: - resolution: {integrity: sha512-nwc3JihdM+kcJjtORv/n7qRHN2Kfh7S2RJI2qr8pz9UcY5TD8rSCRGQ0g81HgyS3jZ5X9U/L4p014P3FonBPhg==} + /@smithy/signature-v4@2.2.0: + resolution: {integrity: sha512-+B5TNzj/fRZzVW3z8UUJOkNx15+4E0CLuvJmJUA1JUIZFp3rdJ/M2H5r2SqltaVPXL0oIxv/6YK92T9TsFGbFg==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/eventstream-codec': 2.0.16 - '@smithy/is-array-buffer': 2.0.0 - '@smithy/types': 2.8.0 - '@smithy/util-hex-encoding': 2.0.0 - '@smithy/util-middleware': 2.0.9 - '@smithy/util-uri-escape': 2.0.0 - '@smithy/util-utf8': 2.0.2 + '@smithy/eventstream-codec': 2.2.0 + '@smithy/is-array-buffer': 2.2.0 + '@smithy/types': 2.12.0 + '@smithy/util-hex-encoding': 2.2.0 + '@smithy/util-middleware': 2.2.0 + '@smithy/util-uri-escape': 2.2.0 + '@smithy/util-utf8': 2.3.0 tslib: 2.6.2 dev: false - /@smithy/smithy-client@2.2.1: - resolution: {integrity: sha512-SpD7FLK92XV2fon2hMotaNDa2w5VAy5/uVjP9WFmjGSgWM8pTPVkHcDl1yFs5Z8LYbij0FSz+DbCBK6i+uXXUA==} + /@smithy/smithy-client@2.5.0: + resolution: {integrity: sha512-DDXWHWdimtS3y/Kw1Jo46KQ0ZYsDKcldFynQERUGBPDpkW1lXOTHy491ALHjwfiBQvzsVKVxl5+ocXNIgJuX4g==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/middleware-endpoint': 2.3.0 - '@smithy/middleware-stack': 2.0.10 - '@smithy/protocol-http': 3.0.12 - '@smithy/types': 2.8.0 - '@smithy/util-stream': 2.0.24 + '@smithy/middleware-endpoint': 2.5.0 + '@smithy/middleware-stack': 2.2.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/types': 2.12.0 + '@smithy/util-stream': 2.2.0 tslib: 2.6.2 dev: false - /@smithy/types@2.8.0: - resolution: {integrity: sha512-h9sz24cFgt/W1Re22OlhQKmUZkNh244ApgRsUDYinqF8R+QgcsBIX344u2j61TPshsTz3CvL6HYU1DnQdsSrHA==} + /@smithy/types@2.12.0: + resolution: {integrity: sha512-QwYgloJ0sVNBeBuBs65cIkTbfzV/Q6ZNPCJ99EICFEdJYG50nGIY/uYXp+TbsdJReIuPr0a0kXmCvren3MbRRw==} engines: {node: '>=14.0.0'} dependencies: tslib: 2.6.2 dev: false - /@smithy/url-parser@2.0.16: - resolution: {integrity: sha512-Wfz5WqAoRT91TjRy1JeLR0fXtkIXHGsMbgzKFTx7E68SrZ55TB8xoG+vm11Ru4gheFTMXjAjwAxv1jQdC+pAQA==} + /@smithy/url-parser@2.2.0: + resolution: {integrity: sha512-hoA4zm61q1mNTpksiSWp2nEl1dt3j726HdRhiNgVJQMj7mLp7dprtF57mOB6JvEk/x9d2bsuL5hlqZbBuHQylQ==} dependencies: - '@smithy/querystring-parser': 2.0.16 - '@smithy/types': 2.8.0 + '@smithy/querystring-parser': 2.2.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 dev: false - /@smithy/util-base64@2.0.1: - resolution: {integrity: sha512-DlI6XFYDMsIVN+GH9JtcRp3j02JEVuWIn/QOZisVzpIAprdsxGveFed0bjbMRCqmIFe8uetn5rxzNrBtIGrPIQ==} + /@smithy/util-base64@2.3.0: + resolution: {integrity: sha512-s3+eVwNeJuXUwuMbusncZNViuhv2LjVJ1nMwTqSA0XAC7gjKhqqxRdJPhR8+YrkoZ9IiIbFk/yK6ACe/xlF+hw==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/util-buffer-from': 2.0.0 + '@smithy/util-buffer-from': 2.2.0 + '@smithy/util-utf8': 2.3.0 tslib: 2.6.2 dev: false - /@smithy/util-body-length-browser@2.0.1: - resolution: {integrity: sha512-NXYp3ttgUlwkaug4bjBzJ5+yIbUbUx8VsSLuHZROQpoik+gRkIBeEG9MPVYfvPNpuXb/puqodeeUXcKFe7BLOQ==} + /@smithy/util-body-length-browser@2.2.0: + resolution: {integrity: sha512-dtpw9uQP7W+n3vOtx0CfBD5EWd7EPdIdsQnWTDoFf77e3VUf05uA7R7TGipIo8e4WL2kuPdnsr3hMQn9ziYj5w==} dependencies: tslib: 2.6.2 dev: false - /@smithy/util-body-length-node@2.1.0: - resolution: {integrity: sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==} + /@smithy/util-body-length-node@2.3.0: + resolution: {integrity: sha512-ITWT1Wqjubf2CJthb0BuT9+bpzBfXeMokH/AAa5EJQgbv9aPMVfnM76iFIZVFf50hYXGbtiV71BHAthNWd6+dw==} engines: {node: '>=14.0.0'} dependencies: tslib: 2.6.2 dev: false - /@smithy/util-buffer-from@2.0.0: - resolution: {integrity: sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==} + /@smithy/util-buffer-from@2.2.0: + resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/is-array-buffer': 2.0.0 + '@smithy/is-array-buffer': 2.2.0 tslib: 2.6.2 dev: false - /@smithy/util-config-provider@2.1.0: - resolution: {integrity: sha512-S6V0JvvhQgFSGLcJeT1CBsaTR03MM8qTuxMH9WPCCddlSo2W0V5jIHimHtIQALMLEDPGQ0ROSRr/dU0O+mxiQg==} + /@smithy/util-config-provider@2.3.0: + resolution: {integrity: sha512-HZkzrRcuFN1k70RLqlNK4FnPXKOpkik1+4JaBoHNJn+RnJGYqaa3c5/+XtLOXhlKzlRgNvyaLieHTW2VwGN0VQ==} engines: {node: '>=14.0.0'} dependencies: tslib: 2.6.2 dev: false - /@smithy/util-defaults-mode-browser@2.0.24: - resolution: {integrity: sha512-TsP5mBuLgO2C21+laNG2nHYZEyUdkbGURv2tHvSuQQxLz952MegX95uwdxOY2jR2H4GoKuVRfdJq7w4eIjGYeg==} + /@smithy/util-defaults-mode-browser@2.2.0: + resolution: {integrity: sha512-2okTdZaCBvOJszAPU/KSvlimMe35zLOKbQpHhamFJmR7t95HSe0K3C92jQPjKY3PmDBD+7iMkOnuW05F5OlF4g==} engines: {node: '>= 10.0.0'} dependencies: - '@smithy/property-provider': 2.0.17 - '@smithy/smithy-client': 2.2.1 - '@smithy/types': 2.8.0 + '@smithy/property-provider': 2.2.0 + '@smithy/smithy-client': 2.5.0 + '@smithy/types': 2.12.0 bowser: 2.11.0 tslib: 2.6.2 dev: false - /@smithy/util-defaults-mode-node@2.0.32: - resolution: {integrity: sha512-d0S33dXA2cq1NyorVMroMrEtqKMr3MlyLITcfTBf9pXiigYiPMOtbSI7czHIfDbuVuM89Cg0urAgpt73QV9mPQ==} + /@smithy/util-defaults-mode-node@2.3.0: + resolution: {integrity: sha512-hfKXnNLmsW9cmLb/JXKIvtuO6Cf4SuqN5PN1C2Ru/TBIws+m1wSgb+A53vo0r66xzB6E82inKG2J7qtwdi+Kkw==} engines: {node: '>= 10.0.0'} dependencies: - '@smithy/config-resolver': 2.0.23 - '@smithy/credential-provider-imds': 2.1.5 - '@smithy/node-config-provider': 2.1.9 - '@smithy/property-provider': 2.0.17 - '@smithy/smithy-client': 2.2.1 - '@smithy/types': 2.8.0 + '@smithy/config-resolver': 2.2.0 + '@smithy/credential-provider-imds': 2.3.0 + '@smithy/node-config-provider': 2.3.0 + '@smithy/property-provider': 2.2.0 + '@smithy/smithy-client': 2.5.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 dev: false - /@smithy/util-endpoints@1.0.8: - resolution: {integrity: sha512-l8zVuyZZ61IzZBYp5NWvsAhbaAjYkt0xg9R4xUASkg5SEeTT2meHOJwJHctKMFUXe4QZbn9fR2MaBYjP2119+w==} + /@smithy/util-endpoints@1.2.0: + resolution: {integrity: sha512-BuDHv8zRjsE5zXd3PxFXFknzBG3owCpjq8G3FcsXW3CykYXuEqM3nTSsmLzw5q+T12ZYuDlVUZKBdpNbhVtlrQ==} engines: {node: '>= 14.0.0'} dependencies: - '@smithy/node-config-provider': 2.1.9 - '@smithy/types': 2.8.0 + '@smithy/node-config-provider': 2.3.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 dev: false - /@smithy/util-hex-encoding@2.0.0: - resolution: {integrity: sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==} + /@smithy/util-hex-encoding@2.2.0: + resolution: {integrity: sha512-7iKXR+/4TpLK194pVjKiasIyqMtTYJsgKgM242Y9uzt5dhHnUDvMNb+3xIhRJ9QhvqGii/5cRUt4fJn3dtXNHQ==} engines: {node: '>=14.0.0'} dependencies: tslib: 2.6.2 dev: false - /@smithy/util-middleware@2.0.9: - resolution: {integrity: sha512-PnCnBJ07noMX1lMDTEefmxSlusWJUiLfrme++MfK5TD0xz8NYmakgoXy5zkF/16zKGmiwOeKAztWT/Vjk1KRIQ==} + /@smithy/util-middleware@2.2.0: + resolution: {integrity: sha512-L1qpleXf9QD6LwLCJ5jddGkgWyuSvWBkJwWAZ6kFkdifdso+sk3L3O1HdmPvCdnCK3IS4qWyPxev01QMnfHSBw==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/types': 2.8.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 dev: false - /@smithy/util-retry@2.0.9: - resolution: {integrity: sha512-46BFWe9RqB6g7f4mxm3W3HlqknqQQmWHKlhoqSFZuGNuiDU5KqmpebMbvC3tjTlUkqn4xa2Z7s3Hwb0HNs5scw==} + /@smithy/util-retry@2.2.0: + resolution: {integrity: sha512-q9+pAFPTfftHXRytmZ7GzLFFrEGavqapFc06XxzZFcSIGERXMerXxCitjOG1prVDR9QdjqotF40SWvbqcCpf8g==} engines: {node: '>= 14.0.0'} dependencies: - '@smithy/service-error-classification': 2.0.9 - '@smithy/types': 2.8.0 + '@smithy/service-error-classification': 2.1.5 + '@smithy/types': 2.12.0 tslib: 2.6.2 dev: false - /@smithy/util-stream@2.0.24: - resolution: {integrity: sha512-hRpbcRrOxDriMVmbya+Mv77VZVupxRAsfxVDKS54XuiURhdiwCUXJP0X1iJhHinuUf6n8pBF0MkG9C8VooMnWw==} + /@smithy/util-stream@2.2.0: + resolution: {integrity: sha512-17faEXbYWIRst1aU9SvPZyMdWmqIrduZjVOqCPMIsWFNxs5yQQgFrJL6b2SdiCzyW9mJoDjFtgi53xx7EH+BXA==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/fetch-http-handler': 2.3.2 - '@smithy/node-http-handler': 2.2.2 - '@smithy/types': 2.8.0 - '@smithy/util-base64': 2.0.1 - '@smithy/util-buffer-from': 2.0.0 - '@smithy/util-hex-encoding': 2.0.0 - '@smithy/util-utf8': 2.0.2 + '@smithy/fetch-http-handler': 2.5.0 + '@smithy/node-http-handler': 2.5.0 + '@smithy/types': 2.12.0 + '@smithy/util-base64': 2.3.0 + '@smithy/util-buffer-from': 2.2.0 + '@smithy/util-hex-encoding': 2.2.0 + '@smithy/util-utf8': 2.3.0 tslib: 2.6.2 dev: false - /@smithy/util-uri-escape@2.0.0: - resolution: {integrity: sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==} + /@smithy/util-uri-escape@2.2.0: + resolution: {integrity: sha512-jtmJMyt1xMD/d8OtbVJ2gFZOSKc+ueYJZPW20ULW1GOp/q/YIM0wNh+u8ZFao9UaIGz4WoPW8hC64qlWLIfoDA==} engines: {node: '>=14.0.0'} dependencies: tslib: 2.6.2 dev: false - /@smithy/util-utf8@2.0.2: - resolution: {integrity: sha512-qOiVORSPm6Ce4/Yu6hbSgNHABLP2VMv8QOC3tTDNHHlWY19pPyc++fBTbZPtx6egPXi4HQxKDnMxVxpbtX2GoA==} + /@smithy/util-utf8@2.3.0: + resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/util-buffer-from': 2.0.0 + '@smithy/util-buffer-from': 2.2.0 tslib: 2.6.2 dev: false - /@smithy/util-waiter@2.0.16: - resolution: {integrity: sha512-5i4YONHQ6HoUWDd+X0frpxTXxSXgJhUFl+z0iMy/zpUmVeCQY2or3Vss6DzHKKMMQL4pmVHpQm9WayHDorFdZg==} + /@smithy/util-waiter@2.2.0: + resolution: {integrity: sha512-IHk53BVw6MPMi2Gsn+hCng8rFA3ZmR3Rk7GllxDUW9qFJl/hiSvskn7XldkECapQVkIg/1dHpMAxI9xSTaLLSA==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/abort-controller': 2.0.16 - '@smithy/types': 2.8.0 + '@smithy/abort-controller': 2.2.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 dev: false @@ -4446,42 +4533,41 @@ packages: resolution: {integrity: sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==} dev: false - /@tabler/icons-react@2.46.0(react@18.2.0): - resolution: {integrity: sha512-X8MRxuslIOFqMjAo+GvUZDpjlOwNYNJTuOsHXf/NBvVI6ygqUf0FUNsDLLA5fQ6k6KtRwxMlgGB+eR8ZG1UP0g==} + /@tabler/icons-react@3.1.0(react@18.2.0): + resolution: {integrity: sha512-k/WTlax2vbj/LpxvaJ+BmaLAAhVUgyLj4Ftgaczz66tUSNzqrAZXCFdOU7cRMYPNVBqyqE2IdQd2rzzhDEJvkw==} peerDependencies: - react: ^16.5.1 || ^17.0.0 || ^18.0.0 + react: '>= 16' dependencies: - '@tabler/icons': 2.46.0 - prop-types: 15.8.1 + '@tabler/icons': 3.1.0 react: 18.2.0 dev: false - /@tabler/icons@2.46.0: - resolution: {integrity: sha512-Q5G8Pj5IO+Uhc6pszpu5/hGYY018JwEzzvmuqr+gKJtfIvAHA3umpwUilMRLEy89p+WCP+YsDhicMhfBCCv1qA==} + /@tabler/icons@3.1.0: + resolution: {integrity: sha512-CpZGyS1IVJKFcv88yZ2sYZIpWWhQ6oy76BQKQ5SF0fGgOqgyqKdBGG/YGyyMW632on37MX7VqQIMTzN/uQqmFg==} dev: false - /@tanstack/eslint-plugin-query@5.17.20(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-Jxu/GV7JqDgI6HMP8wQqc5a8efe0GaXoc0qCI+YjVBWEaWh8+T+wF5Ywha44gVraaEGlqkEhYmZrykg6dUG3OA==} + /@tanstack/eslint-plugin-query@5.27.7(eslint@8.57.0)(typescript@5.4.2): + resolution: {integrity: sha512-I0bQGypBu7gmbjHhRPglZRnYZObiXu7JotDxqRJfjr8sP5YiCx2zm+qbQClrgUGER++Hx4EA4suL7hSiBMWgJg==} peerDependencies: eslint: ^8.0.0 dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.56.0)(typescript@5.3.3) - eslint: 8.56.0 + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.2) + eslint: 8.57.0 transitivePeerDependencies: - supports-color - typescript dev: true - /@tanstack/query-core@5.17.19: - resolution: {integrity: sha512-Lzw8FUtnLCc9Jwz0sw9xOjZB+/mCCmJev38v2wHMUl/ioXNIhnNWeMxu0NKUjIhAd62IRB3eAtvxAGDJ55UkyA==} + /@tanstack/query-core@5.28.4: + resolution: {integrity: sha512-uQZqOFqLWUvXNIQZ63XdKzg22NtHzgCBUfDmjDHi3BoF+nUYeBNvMi/xFPtFrMhqRzG2Ir4mYaGsWZzmiEjXpA==} dev: false - /@tanstack/react-query@5.17.19(react@18.2.0): - resolution: {integrity: sha512-qaQENB6/03Gj3dFZGvdmUoqeUGlGm7P1p0RmaR04Bf1Ib1T9lLGimcC9T3oCFbrx0b2ZF21ngjFZNjj9uPJMcg==} + /@tanstack/react-query@5.28.4(react@18.2.0): + resolution: {integrity: sha512-BErcoB/QQG6YwLSUKnaGxF+lSc270RH2w3kMBpG0i4YzDCsFs2pdxPX1WVknQvFk9bNgukMb158hc2Zb4SdwSA==} peerDependencies: react: ^18.0.0 dependencies: - '@tanstack/query-core': 5.17.19 + '@tanstack/query-core': 5.28.4 react: 18.2.0 dev: false @@ -4553,7 +4639,7 @@ packages: y-prosemirror: ^1.2.1 dependencies: '@tiptap/core': 2.1.16(@tiptap/pm@2.1.16) - y-prosemirror: 1.2.2(prosemirror-model@1.19.4)(prosemirror-state@1.4.3)(prosemirror-view@1.32.7)(y-protocols@1.0.6)(yjs@13.6.10) + y-prosemirror: 1.2.2(prosemirror-model@1.19.4)(prosemirror-state@1.4.3)(prosemirror-view@1.32.7)(y-protocols@1.0.6)(yjs@13.6.14) dev: false /@tiptap/extension-collaboration@2.1.16(@tiptap/core@2.1.16)(@tiptap/pm@2.1.16)(y-prosemirror@1.2.2): @@ -4565,7 +4651,7 @@ packages: dependencies: '@tiptap/core': 2.1.16(@tiptap/pm@2.1.16) '@tiptap/pm': 2.1.16 - y-prosemirror: 1.2.2(prosemirror-model@1.19.4)(prosemirror-state@1.4.3)(prosemirror-view@1.32.7)(y-protocols@1.0.6)(yjs@13.6.10) + y-prosemirror: 1.2.2(prosemirror-model@1.19.4)(prosemirror-state@1.4.3)(prosemirror-view@1.32.7)(y-protocols@1.0.6)(yjs@13.6.14) dev: false /@tiptap/extension-color@2.1.16(@tiptap/core@2.1.16)(@tiptap/extension-text-style@2.1.16): @@ -4946,13 +5032,26 @@ packages: /@types/bcrypt@5.0.2: resolution: {integrity: sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ==} dependencies: - '@types/node': 20.11.5 + '@types/node': 20.11.28 + dev: true + + /@types/body-parser@1.19.5: + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + dependencies: + '@types/connect': 3.4.38 + '@types/node': 20.11.28 dev: true /@types/bytes@3.1.4: resolution: {integrity: sha512-A0uYgOj3zNc4hNjHc5lYUfJQ/HVyBXiUMKdXd7ysclaE6k9oJdavQzODHuwjpUu2/boCP8afjQYi8z/GtvNCWA==} dev: true + /@types/connect@3.4.38: + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + dependencies: + '@types/node': 20.11.28 + dev: true + /@types/cookie@0.4.1: resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} @@ -4963,7 +5062,7 @@ packages: /@types/cors@2.8.17: resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} dependencies: - '@types/node': 20.11.5 + '@types/node': 20.11.28 /@types/debounce@1.2.4: resolution: {integrity: sha512-jBqiORIzKDOToaF63Fm//haOCHuwQuLa2202RK4MozpA6lh93eCBc+/8+wZn5OzjJt3ySdc+74SXWXB55Ewtyw==} @@ -4987,17 +5086,39 @@ packages: resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} dev: true + /@types/express-serve-static-core@4.17.43: + resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==} + dependencies: + '@types/node': 20.11.28 + '@types/qs': 6.9.12 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + dev: true + + /@types/express@4.17.21: + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 4.17.43 + '@types/qs': 6.9.12 + '@types/serve-static': 1.15.5 + dev: true + /@types/fs-extra@11.0.4: resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} dependencies: '@types/jsonfile': 6.1.4 - '@types/node': 20.11.5 + '@types/node': 20.11.28 dev: true /@types/graceful-fs@4.1.9: resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} dependencies: - '@types/node': 20.11.5 + '@types/node': 20.11.28 + dev: true + + /@types/http-errors@2.0.4: + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} dev: true /@types/istanbul-lib-coverage@2.0.6: @@ -5016,8 +5137,8 @@ packages: '@types/istanbul-lib-report': 3.0.3 dev: true - /@types/jest@29.5.11: - resolution: {integrity: sha512-S2mHmYIVe13vrm6q4kN6fLYYAka15ALQki/vgDC3mIukEOx8WJlv0kQPM+d4w8Gp6u0uSdKND04IlTXBv0rwnQ==} + /@types/jest@29.5.12: + resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} dependencies: expect: 29.7.0 pretty-format: 29.7.0 @@ -5034,14 +5155,13 @@ packages: /@types/jsonfile@6.1.4: resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} dependencies: - '@types/node': 20.11.5 + '@types/node': 20.11.28 dev: true /@types/jsonwebtoken@9.0.5: resolution: {integrity: sha512-VRLSGzik+Unrup6BsouBeHsf4d1hOEgYWTm/7Nmw1sXoN1+tRly/Gy/po3yeahnP4jfnQWWAhQAqcNfH7ngOkA==} dependencies: - '@types/node': 20.11.5 - dev: false + '@types/node': 20.11.28 /@types/methods@1.1.4: resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} @@ -5051,13 +5171,16 @@ packages: resolution: {integrity: sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==} dev: true - /@types/node@20.10.0: - resolution: {integrity: sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ==} - dependencies: - undici-types: 5.26.5 + /@types/mime@1.3.5: + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + dev: true - /@types/node@20.11.5: - resolution: {integrity: sha512-g557vgQjUUfN76MZAN/dt1z3dzcUsimuysco0KeluHgrPdJXkP/XdAURgyO2W9fZWHRtRBiVKzKn8vyOAwlG+w==} + /@types/mime@3.0.4: + resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} + dev: true + + /@types/node@20.11.28: + resolution: {integrity: sha512-M/GPWVS2wLkSkNHVeLkrF2fD5Lx5UC4PxA0uZcKc6QqbIQUJyW1jVjueJYi1z8n0I5PxYrtpnPnWglE+y9A0KA==} dependencies: undici-types: 5.26.5 @@ -5073,17 +5196,45 @@ packages: resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} dev: true + /@types/passport-jwt@4.0.1: + resolution: {integrity: sha512-Y0Ykz6nWP4jpxgEUYq8NoVZeCQPo1ZndJLfapI249g1jHChvRfZRO/LS3tqu26YgAS/laI1qx98sYGz0IalRXQ==} + dependencies: + '@types/jsonwebtoken': 9.0.5 + '@types/passport-strategy': 0.2.38 + dev: true + + /@types/passport-strategy@0.2.38: + resolution: {integrity: sha512-GC6eMqqojOooq993Tmnmp7AUTbbQSgilyvpCYQjT+H6JfG/g6RGc7nXEniZlp0zyKJ0WUdOiZWLBZft9Yug1uA==} + dependencies: + '@types/express': 4.17.21 + '@types/passport': 1.0.16 + dev: true + + /@types/passport@1.0.16: + resolution: {integrity: sha512-FD0qD5hbPWQzaM0wHUnJ/T0BBCJBxCeemtnCwc/ThhTg3x9jfrAcRUmj5Dopza+MfFS9acTe3wk7rcVnRIp/0A==} + dependencies: + '@types/express': 4.17.21 + dev: true + /@types/prop-types@15.7.11: resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} - /@types/react-dom@18.2.18: - resolution: {integrity: sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==} - dependencies: - '@types/react': 18.2.48 + /@types/qs@6.9.12: + resolution: {integrity: sha512-bZcOkJ6uWrL0Qb2NAWKa7TBU+mJHPzhx9jjLL1KHF+XpzEcR7EXHvjbHlGtR/IsP1vyPrehuS6XqkmaePy//mg==} dev: true - /@types/react@18.2.48: - resolution: {integrity: sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w==} + /@types/range-parser@1.2.7: + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + dev: true + + /@types/react-dom@18.2.22: + resolution: {integrity: sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ==} + dependencies: + '@types/react': 18.2.66 + dev: true + + /@types/react@18.2.66: + resolution: {integrity: sha512-OYTmMI4UigXeFMF/j4uv0lBBEbongSgptPrHBxqME44h9+yNov+oL6Z3ocJKo0WyXR84sQUNeyIp9MRfckvZpg==} dependencies: '@types/prop-types': 15.7.11 '@types/scheduler': 0.16.8 @@ -5096,6 +5247,21 @@ packages: resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} dev: true + /@types/send@0.17.4: + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + dependencies: + '@types/mime': 1.3.5 + '@types/node': 20.11.28 + dev: true + + /@types/serve-static@1.15.5: + resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} + dependencies: + '@types/http-errors': 2.0.4 + '@types/mime': 3.0.4 + '@types/node': 20.11.28 + dev: true + /@types/stack-utils@2.0.3: resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} dev: true @@ -5105,12 +5271,13 @@ packages: dependencies: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 - '@types/node': 20.11.5 + '@types/node': 20.11.28 dev: true - /@types/supertest@2.0.16: - resolution: {integrity: sha512-6c2ogktZ06tr2ENoZivgm7YnprnhYE4ZoXGMY+oA7IuAf17M8FWvujXZGmxLv8y0PTyts4x5A+erSwVUFA8XSg==} + /@types/supertest@6.0.2: + resolution: {integrity: sha512-137ypx2lk/wTQbW6An6safu9hXmajAifU/s7szAHLN/FeIm5w7yR0Wkl9fdJMRSHwOn4HLAI0DaB2TOORuhPDg==} dependencies: + '@types/methods': 1.1.4 '@types/superagent': 8.1.1 dev: true @@ -5118,17 +5285,17 @@ packages: resolution: {integrity: sha512-5eQEtSCoESnh2FsiLTxE121IiE60hnMqcb435fShf4bpLRjEu1Eoekht23y6zXS9Ts3l+Szu3TARnTsA0GkOkQ==} dev: false - /@types/uuid@9.0.7: - resolution: {integrity: sha512-WUtIVRUZ9i5dYXefDEAI7sh9/O7jGvHg7Df/5O/gtH3Yabe5odI3UWopVR1qbPXQtvOxWu3mM4XxlYeZtMWF4g==} + /@types/uuid@9.0.8: + resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} dev: true - /@types/validator@13.11.7: - resolution: {integrity: sha512-q0JomTsJ2I5Mv7dhHhQLGjMvX0JJm5dyZ1DXQySIUzU1UlwzB8bt+R6+LODUbz0UDIOvEzGc28tk27gBJw2N8Q==} + /@types/validator@13.11.9: + resolution: {integrity: sha512-FCTsikRozryfayPuiI46QzH3fnrOoctTjvOYZkho9BTFLCOZ2rgZJHMOVgCOfttjPJcgOx52EpkY0CMfy87MIw==} /@types/ws@8.5.10: resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} dependencies: - '@types/node': 20.11.5 + '@types/node': 20.11.28 dev: true /@types/yargs-parser@21.0.3: @@ -5141,193 +5308,104 @@ packages: '@types/yargs-parser': 21.0.3 dev: true - /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 5.62.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/utils': 5.62.0(eslint@8.56.0)(typescript@5.3.3) - debug: 4.3.4 - eslint: 8.56.0 - graphemer: 1.4.0 - ignore: 5.3.0 - natural-compare-lite: 1.4.0 - semver: 7.5.4 - tsutils: 3.21.0(typescript@5.3.3) - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/eslint-plugin@6.19.0(@typescript-eslint/parser@6.19.0)(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-DUCUkQNklCQYnrBSSikjVChdc84/vMPDQSgJTHBZ64G9bA9w0Crc0rd2diujKbTdp6w2J47qkeHQLoi0rpLCdg==} + /@typescript-eslint/eslint-plugin@7.2.0(@typescript-eslint/parser@7.2.0)(eslint@8.57.0)(typescript@5.4.2): + resolution: {integrity: sha512-mdekAHOqS9UjlmyF/LSs6AIEvfceV749GFxoBAjwAv0nkevfKHWQFDMcBZWUiIC5ft6ePWivXoS36aKQ0Cy3sw==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 6.19.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/scope-manager': 6.19.0 - '@typescript-eslint/type-utils': 6.19.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/utils': 6.19.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 6.19.0 + '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/scope-manager': 7.2.0 + '@typescript-eslint/type-utils': 7.2.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/utils': 7.2.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/visitor-keys': 7.2.0 debug: 4.3.4 - eslint: 8.56.0 + eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.0 natural-compare: 1.4.0 semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.3.3) - typescript: 5.3.3 + ts-api-utils: 1.0.3(typescript@5.4.2) + typescript: 5.4.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3) - debug: 4.3.4 - eslint: 8.56.0 - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/parser@6.19.0(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-1DyBLG5SH7PYCd00QlroiW60YJ4rWMuUGa/JBV0iZuqi4l4IK3twKPq5ZkEebmGqRjXWVgsUzfd3+nZveewgow==} + /@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2): + resolution: {integrity: sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint: ^8.56.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 6.19.0 - '@typescript-eslint/types': 6.19.0 - '@typescript-eslint/typescript-estree': 6.19.0(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 6.19.0 + '@typescript-eslint/scope-manager': 7.2.0 + '@typescript-eslint/types': 7.2.0 + '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.4.2) + '@typescript-eslint/visitor-keys': 7.2.0 debug: 4.3.4 - eslint: 8.56.0 - typescript: 5.3.3 + eslint: 8.57.0 + typescript: 5.4.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager@5.62.0: - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - dev: true - - /@typescript-eslint/scope-manager@6.19.0: - resolution: {integrity: sha512-dO1XMhV2ehBI6QN8Ufi7I10wmUovmLU0Oru3n5LVlM2JuzB4M+dVphCPLkVpKvGij2j/pHBWuJ9piuXx+BhzxQ==} + /@typescript-eslint/scope-manager@6.21.0: + resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.19.0 - '@typescript-eslint/visitor-keys': 6.19.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 dev: true - /@typescript-eslint/type-utils@5.62.0(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + /@typescript-eslint/scope-manager@7.2.0: + resolution: {integrity: sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==} + engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3) - '@typescript-eslint/utils': 5.62.0(eslint@8.56.0)(typescript@5.3.3) - debug: 4.3.4 - eslint: 8.56.0 - tsutils: 3.21.0(typescript@5.3.3) - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color + '@typescript-eslint/types': 7.2.0 + '@typescript-eslint/visitor-keys': 7.2.0 dev: true - /@typescript-eslint/type-utils@6.19.0(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-mcvS6WSWbjiSxKCwBcXtOM5pRkPQ6kcDds/juxcy/727IQr3xMEcwr/YLHW2A2+Fp5ql6khjbKBzOyjuPqGi/w==} + /@typescript-eslint/type-utils@7.2.0(eslint@8.57.0)(typescript@5.4.2): + resolution: {integrity: sha512-xHi51adBHo9O9330J8GQYQwrKBqbIPJGZZVQTHHmy200hvkLZFWJIFtAG/7IYTWUyun6DE6w5InDReePJYJlJA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint: ^8.56.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 6.19.0(typescript@5.3.3) - '@typescript-eslint/utils': 6.19.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.4.2) + '@typescript-eslint/utils': 7.2.0(eslint@8.57.0)(typescript@5.4.2) debug: 4.3.4 - eslint: 8.56.0 - ts-api-utils: 1.0.3(typescript@5.3.3) - typescript: 5.3.3 + eslint: 8.57.0 + ts-api-utils: 1.0.3(typescript@5.4.2) + typescript: 5.4.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types@5.62.0: - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /@typescript-eslint/types@6.19.0: - resolution: {integrity: sha512-lFviGV/vYhOy3m8BJ/nAKoAyNhInTdXpftonhWle66XHAtT1ouBlkjL496b5H5hb8dWXHwtypTqgtb/DEa+j5A==} + /@typescript-eslint/types@6.21.0: + resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/typescript-estree@5.62.0(typescript@5.3.3): - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.4 - tsutils: 3.21.0(typescript@5.3.3) - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color + /@typescript-eslint/types@7.2.0: + resolution: {integrity: sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==} + engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/typescript-estree@6.19.0(typescript@5.3.3): - resolution: {integrity: sha512-o/zefXIbbLBZ8YJ51NlkSAt2BamrK6XOmuxSR3hynMIzzyMY33KuJ9vuMdFSXW+H0tVvdF9qBPTHA91HDb4BIQ==} + /@typescript-eslint/typescript-estree@6.21.0(typescript@5.4.2): + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' @@ -5335,71 +5413,92 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 6.19.0 - '@typescript-eslint/visitor-keys': 6.19.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.3.3) - typescript: 5.3.3 + ts-api-utils: 1.0.3(typescript@5.4.2) + typescript: 5.4.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@5.62.0(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/typescript-estree@7.2.0(typescript@5.4.2): + resolution: {integrity: sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.6 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3) - eslint: 8.56.0 - eslint-scope: 5.1.1 + '@typescript-eslint/types': 7.2.0 + '@typescript-eslint/visitor-keys': 7.2.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.4.2) + typescript: 5.4.2 transitivePeerDependencies: - supports-color - - typescript dev: true - /@typescript-eslint/utils@6.19.0(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-QR41YXySiuN++/dC9UArYOg4X86OAYP83OWTewpVx5ct1IZhjjgTLocj7QNxGhWoTqknsgpl7L+hGygCO+sdYw==} + /@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.4.2): + resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.6 - '@typescript-eslint/scope-manager': 6.19.0 - '@typescript-eslint/types': 6.19.0 - '@typescript-eslint/typescript-estree': 6.19.0(typescript@5.3.3) - eslint: 8.56.0 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.2) + eslint: 8.57.0 semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys@5.62.0: - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/utils@7.2.0(eslint@8.57.0)(typescript@5.4.2): + resolution: {integrity: sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^8.56.0 dependencies: - '@typescript-eslint/types': 5.62.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.6 + '@typescript-eslint/scope-manager': 7.2.0 + '@typescript-eslint/types': 7.2.0 + '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.4.2) + eslint: 8.57.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@6.21.0: + resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.21.0 eslint-visitor-keys: 3.4.3 dev: true - /@typescript-eslint/visitor-keys@6.19.0: - resolution: {integrity: sha512-hZaUCORLgubBvtGpp1JEFEazcuEdfxta9j4iUwdSAr7mEsYYAp3EAUyCZk3VEEqGj6W+AV4uWyrDGtrlawAsgQ==} + /@typescript-eslint/visitor-keys@7.2.0: + resolution: {integrity: sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.19.0 + '@typescript-eslint/types': 7.2.0 eslint-visitor-keys: 3.4.3 dev: true @@ -5431,7 +5530,7 @@ packages: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} dev: true - /@vitejs/plugin-react@4.2.1(vite@5.0.12): + /@vitejs/plugin-react@4.2.1(vite@5.1.6): resolution: {integrity: sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -5442,7 +5541,7 @@ packages: '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.23.7) '@types/babel__core': 7.20.5 react-refresh: 0.14.0 - vite: 5.0.12(@types/node@20.11.5) + vite: 5.1.6(@types/node@20.11.28) transitivePeerDependencies: - supports-color dev: true @@ -5763,13 +5862,6 @@ packages: /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - /aria-hidden@1.2.3: - resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} - engines: {node: '>=10'} - dependencies: - tslib: 2.6.2 - dev: false - /array-timsort@1.0.3: resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} dev: true @@ -5799,20 +5891,21 @@ packages: engines: {node: '>=8.0.0'} dev: false - /avvio@8.2.1: - resolution: {integrity: sha512-TAlMYvOuwGyLK3PfBb5WKBXZmXz2fVCgv23d6zZFdle/q3gPjmxBaeuC0pY0Dzs5PWMSgfqqEZkrye19GlDTgw==} + /avvio@8.3.0: + resolution: {integrity: sha512-VBVH0jubFr9LdFASy/vNtm5giTrnbVquWBhT0fyizuNK2rQ7e7ONU2plZQWUNqtE1EmxFEb+kbSkFRkstiaS9Q==} dependencies: + '@fastify/error': 3.4.1 archy: 1.0.0 debug: 4.3.4 - fastq: 1.16.0 + fastq: 1.17.1 transitivePeerDependencies: - supports-color dev: false - /axios@1.6.5: - resolution: {integrity: sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==} + /axios@1.6.8: + resolution: {integrity: sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==} dependencies: - follow-redirects: 1.15.4 + follow-redirects: 1.15.6 form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -6146,8 +6239,8 @@ packages: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: true - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + /chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} dependencies: anymatch: 3.1.3 @@ -6183,10 +6276,10 @@ packages: /class-transformer@0.5.1: resolution: {integrity: sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==} - /class-validator@0.14.0: - resolution: {integrity: sha512-ct3ltplN8I9fOwUd8GrP8UQixwff129BkEtuWDKL5W45cQuLd19xqmTLu5ge78YDm/fdje6FMt0hGOhl0lii3A==} + /class-validator@0.14.1: + resolution: {integrity: sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==} dependencies: - '@types/validator': 13.11.7 + '@types/validator': 13.11.9 libphonenumber-js: 1.10.53 validator: 13.11.0 @@ -6260,11 +6353,6 @@ packages: engines: {node: '>=0.8'} dev: true - /clsx@2.0.0: - resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} - engines: {node: '>=6'} - dev: false - /clsx@2.1.0: resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} engines: {node: '>=6'} @@ -6419,7 +6507,7 @@ packages: typescript: 5.3.3 dev: true - /create-jest@29.7.0(@types/node@20.10.0)(ts-node@10.9.2): + /create-jest@29.7.0(@types/node@20.11.28)(ts-node@10.9.2): resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -6428,7 +6516,7 @@ packages: chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.10.0)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@20.11.28)(ts-node@10.9.2) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -6471,8 +6559,8 @@ packages: resolution: {integrity: sha512-4FbVrHDwfOASx7uQVxeiCTo7ggSdYZbqs8lH+WU6ViypPlDbe9y6IP5VVUDQBv9DcnyaiPT5XT0UWHgJ64zLeQ==} dev: false - /date-fns@3.3.1: - resolution: {integrity: sha512-y8e109LYGgoQDveiEBD3DYXKba1jWf5BA8YU1FL5Tvm0BTdEfy54WLCwnuYWZNnzzvALy/QQ4Hov+Q9RVRv+Zw==} + /date-fns@3.5.0: + resolution: {integrity: sha512-a+DwyXn7NOfdJireCzAA0B9p7jIXEu/Q9JKCyMYvH6+0vPUNbQceA0neXrdfJ/xzl3mhOh5vibQQ3936Tssm6A==} dev: false /dayjs@1.11.10: @@ -6617,6 +6705,11 @@ packages: resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} engines: {node: '>=12'} + /dotenv@16.4.1: + resolution: {integrity: sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==} + engines: {node: '>=12'} + dev: false + /duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} dev: true @@ -6687,7 +6780,7 @@ packages: dependencies: '@types/cookie': 0.4.1 '@types/cors': 2.8.17 - '@types/node': 20.11.5 + '@types/node': 20.11.28 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.4.2 @@ -6788,47 +6881,51 @@ packages: engines: {node: '>=12'} dev: true - /eslint-config-prettier@8.10.0(eslint@8.56.0): - resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} + /eslint-config-prettier@9.1.0(eslint@8.57.0): + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.56.0 + eslint: 8.57.0 dev: true - /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0)(eslint@8.56.0)(prettier@2.8.8): - resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} - engines: {node: '>=12.0.0'} + /eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5): + resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==} + engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: - eslint: '>=7.28.0' + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' eslint-config-prettier: '*' - prettier: '>=2.0.0' + prettier: '>=3.0.0' peerDependenciesMeta: + '@types/eslint': + optional: true eslint-config-prettier: optional: true dependencies: - eslint: 8.56.0 - eslint-config-prettier: 8.10.0(eslint@8.56.0) - prettier: 2.8.8 + eslint: 8.57.0 + eslint-config-prettier: 9.1.0(eslint@8.57.0) + prettier: 3.2.5 prettier-linter-helpers: 1.0.0 + synckit: 0.8.8 dev: true - /eslint-plugin-react-hooks@4.6.0(eslint@8.56.0): + /eslint-plugin-react-hooks@4.6.0(eslint@8.57.0): resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 dependencies: - eslint: 8.56.0 + eslint: 8.57.0 dev: true - /eslint-plugin-react-refresh@0.4.5(eslint@8.56.0): - resolution: {integrity: sha512-D53FYKJa+fDmZMtriODxvhwrO+IOqrxoEo21gMA0sjHdU6dPVH4OhyFip9ypl8HOF5RV5KdTo+rBQLvnY2cO8w==} + /eslint-plugin-react-refresh@0.4.6(eslint@8.57.0): + resolution: {integrity: sha512-NjGXdm7zgcKRkKMua34qVO9doI7VOxZ6ancSvBELJSSoX97jyndXcSoa8XBh69JoB31dNz3EEzlMcizZl7LaMA==} peerDependencies: eslint: '>=7' dependencies: - eslint: 8.56.0 + eslint: 8.57.0 dev: true /eslint-scope@5.1.1: @@ -6852,16 +6949,16 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint@8.56.0: - resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} + /eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@eslint-community/regexpp': 4.10.0 '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.56.0 - '@humanwhocodes/config-array': 0.11.13 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 '@ungap/structured-clone': 1.2.0 @@ -7078,17 +7175,17 @@ packages: resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==} dev: false - /fastify@4.25.1: - resolution: {integrity: sha512-D8d0rv61TwqoAS7lom2tvIlgVMlx88lLsiwXyWNjA7CU/LC/mx/Gp2WAlC0S/ABq19U+y/aRvYFG5xLUu2aMrg==} + /fastify@4.26.0: + resolution: {integrity: sha512-Fq/7ziWKc6pYLYLIlCRaqJqEVTIZ5tZYfcW/mDK2AQ9v/sqjGFpj0On0/7hU50kbPVjLO4de+larPA1WwPZSfw==} dependencies: '@fastify/ajv-compiler': 3.5.0 '@fastify/error': 3.4.1 '@fastify/fast-json-stringify-compiler': 4.3.0 abstract-logging: 2.0.1 - avvio: 8.2.1 + avvio: 8.3.0 fast-content-type-parse: 1.1.0 fast-json-stringify: 5.10.0 - find-my-way: 7.7.0 + find-my-way: 8.1.0 light-my-request: 5.11.0 pino: 8.17.2 process-warning: 3.0.0 @@ -7101,17 +7198,17 @@ packages: - supports-color dev: false - /fastify@4.25.2: - resolution: {integrity: sha512-SywRouGleDHvRh054onj+lEZnbC1sBCLkR0UY3oyJwjD4BdZJUrxBqfkfCaqn74pVCwBaRHGuL3nEWeHbHzAfw==} + /fastify@4.26.2: + resolution: {integrity: sha512-90pjTuPGrfVKtdpLeLzND5nyC4woXZN5VadiNQCicj/iJU4viNHKhsAnb7jmv1vu2IzkLXyBiCzdWuzeXgQ5Ug==} dependencies: '@fastify/ajv-compiler': 3.5.0 '@fastify/error': 3.4.1 '@fastify/fast-json-stringify-compiler': 4.3.0 abstract-logging: 2.0.1 - avvio: 8.2.1 + avvio: 8.3.0 fast-content-type-parse: 1.1.0 fast-json-stringify: 5.10.0 - find-my-way: 7.7.0 + find-my-way: 8.1.0 light-my-request: 5.11.0 pino: 8.17.2 process-warning: 3.0.0 @@ -7124,8 +7221,8 @@ packages: - supports-color dev: false - /fastq@1.16.0: - resolution: {integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==} + /fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} dependencies: reusify: 1.0.4 @@ -7170,8 +7267,8 @@ packages: to-regex-range: 5.0.1 dev: true - /find-my-way@7.7.0: - resolution: {integrity: sha512-+SrHpvQ52Q6W9f3wJoJBbAQULJuNEEQwBvlvYwACDhBTLOTMiQ0HYWh4+vC3OivGP2ENcTI1oKlFA2OepJNjhQ==} + /find-my-way@8.1.0: + resolution: {integrity: sha512-41QwjCGcVTODUmLLqTMeoHeiozbMXYMAE1CKFiDyi9zVZ2Vjh0yz3MF0WQZoIb+cmzP/XlbFjlF2NtJmvZHznA==} engines: {node: '>=14'} dependencies: fast-deep-equal: 3.1.3 @@ -7213,8 +7310,8 @@ packages: resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} dev: true - /follow-redirects@1.15.4: - resolution: {integrity: sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==} + /follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -7229,7 +7326,7 @@ packages: cross-spawn: 7.0.3 signal-exit: 4.1.0 - /fork-ts-checker-webpack-plugin@9.0.2(typescript@5.3.3)(webpack@5.89.0): + /fork-ts-checker-webpack-plugin@9.0.2(typescript@5.3.3)(webpack@5.90.1): resolution: {integrity: sha512-Uochze2R8peoN1XqlSi/rGUkDQpRogtLFocP9+PGu68zk1BDAKXfdeCdyVZpgTk8V8WFVQXdEz426VKjXLO1Gg==} engines: {node: '>=12.13.0', yarn: '>=1.0.0'} peerDependencies: @@ -7238,7 +7335,7 @@ packages: dependencies: '@babel/code-frame': 7.23.5 chalk: 4.1.2 - chokidar: 3.5.3 + chokidar: 3.6.0 cosmiconfig: 8.3.6(typescript@5.3.3) deepmerge: 4.3.1 fs-extra: 10.1.0 @@ -7249,7 +7346,7 @@ packages: semver: 7.5.4 tapable: 2.2.1 typescript: 5.3.3 - webpack: 5.89.0 + webpack: 5.90.1 dev: true /form-data@4.0.0: @@ -7419,17 +7516,6 @@ packages: once: 1.4.0 path-is-absolute: 1.0.1 - /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - dev: false - /glob@9.3.5: resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} engines: {node: '>=16 || 14 >=14.17'} @@ -7637,8 +7723,8 @@ packages: wrap-ansi: 6.2.0 dev: true - /inquirer@9.2.11: - resolution: {integrity: sha512-B2LafrnnhbRzCWfAdOXisUzL89Kg8cVJlYmhqoi3flSiV/TveO+nsXwgKr9h9PIo+J1hz7nBSk6gegRIMBBf7g==} + /inquirer@9.2.12: + resolution: {integrity: sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==} engines: {node: '>=14.18.0'} dependencies: '@ljharb/through': 2.3.11 @@ -7880,7 +7966,7 @@ packages: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.5 + '@types/node': 20.11.28 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.1 @@ -7901,7 +7987,7 @@ packages: - supports-color dev: true - /jest-cli@29.7.0(@types/node@20.10.0)(ts-node@10.9.2): + /jest-cli@29.7.0(@types/node@20.11.28)(ts-node@10.9.2): resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -7915,10 +8001,10 @@ packages: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.10.0)(ts-node@10.9.2) + create-jest: 29.7.0(@types/node@20.11.28)(ts-node@10.9.2) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@20.10.0)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@20.11.28)(ts-node@10.9.2) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -7929,7 +8015,7 @@ packages: - ts-node dev: true - /jest-config@29.7.0(@types/node@20.10.0)(ts-node@10.9.2): + /jest-config@29.7.0(@types/node@20.11.28)(ts-node@10.9.2): resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -7944,7 +8030,7 @@ packages: '@babel/core': 7.23.7 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.10.0 + '@types/node': 20.11.28 babel-jest: 29.7.0(@babel/core@7.23.7) chalk: 4.1.2 ci-info: 3.9.0 @@ -7964,48 +8050,7 @@ packages: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.2(@types/node@20.10.0)(typescript@5.3.3) - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - dev: true - - /jest-config@29.7.0(@types/node@20.11.5)(ts-node@10.9.2): - resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - dependencies: - '@babel/core': 7.23.7 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.11.5 - babel-jest: 29.7.0(@babel/core@7.23.7) - chalk: 4.1.2 - ci-info: 3.9.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - ts-node: 10.9.2(@types/node@20.10.0)(typescript@5.3.3) + ts-node: 10.9.2(@types/node@20.11.28)(typescript@5.4.2) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -8046,7 +8091,7 @@ packages: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.5 + '@types/node': 20.11.28 jest-mock: 29.7.0 jest-util: 29.7.0 dev: true @@ -8062,7 +8107,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 20.11.5 + '@types/node': 20.11.28 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -8113,7 +8158,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.11.5 + '@types/node': 20.11.28 jest-util: 29.7.0 dev: true @@ -8168,7 +8213,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.5 + '@types/node': 20.11.28 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -8199,7 +8244,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.5 + '@types/node': 20.11.28 chalk: 4.1.2 cjs-module-lexer: 1.2.3 collect-v8-coverage: 1.0.2 @@ -8251,7 +8296,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.11.5 + '@types/node': 20.11.28 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -8276,7 +8321,7 @@ packages: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.5 + '@types/node': 20.11.28 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -8288,7 +8333,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 20.11.5 + '@types/node': 20.11.28 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true @@ -8297,13 +8342,13 @@ packages: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 20.11.5 + '@types/node': 20.11.28 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true - /jest@29.7.0(@types/node@20.10.0)(ts-node@10.9.2): + /jest@29.7.0(@types/node@20.11.28)(ts-node@10.9.2): resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -8316,7 +8361,7 @@ packages: '@jest/core': 29.7.0(ts-node@10.9.2) '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@20.10.0)(ts-node@10.9.2) + jest-cli: 29.7.0(@types/node@20.11.28)(ts-node@10.9.2) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -8324,18 +8369,18 @@ packages: - ts-node dev: true - /jotai-optics@0.3.1(jotai@2.6.2)(optics-ts@2.4.1): - resolution: {integrity: sha512-KibUx9IneM2hGWGIYGs/v0KCxU985lg7W2c6dt5RodJCB2XPbmok8rkkLmdVk9+fKsn2shkPMi+AG8XzHgB3+w==} + /jotai-optics@0.3.2(jotai@2.7.1)(optics-ts@2.4.1): + resolution: {integrity: sha512-RH6SvqU5hmkVqnHmaqf9zBXvIAs4jLxkDHS4fr5ljuBKHs8+HQ02v+9hX7ahTppxx6dUb0GGUE80jQKJ0kFTLw==} peerDependencies: jotai: '>=1.11.0' optics-ts: '*' dependencies: - jotai: 2.6.2(@types/react@18.2.48)(react@18.2.0) + jotai: 2.7.1(@types/react@18.2.66)(react@18.2.0) optics-ts: 2.4.1 dev: false - /jotai@2.6.2(@types/react@18.2.48)(react@18.2.0): - resolution: {integrity: sha512-kl4KguU1Fr+tFiLi3A3h9qPEzhvLTTDA10DO3QZAz6k7BEaQJ+qvSBwolzonnfNI4QzEovyQfUqVgnRxfnnQVQ==} + /jotai@2.7.1(@types/react@18.2.66)(react@18.2.0): + resolution: {integrity: sha512-bsaTPn02nFgWNP6cBtg/htZhCu4s0wxqoklRHePp6l/vlsypR9eLn7diRliwXYWMXDpPvW/LLA2afI8vwgFFaw==} engines: {node: '>=12.20.0'} peerDependencies: '@types/react': '>=17.0.0' @@ -8346,7 +8391,7 @@ packages: react: optional: true dependencies: - '@types/react': 18.2.48 + '@types/react': 18.2.66 react: 18.2.0 dev: false @@ -8419,6 +8464,10 @@ packages: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} dev: true + /jsonc-parser@3.2.1: + resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + dev: true + /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: @@ -8744,6 +8793,7 @@ packages: engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 + dev: true /minimatch@8.0.4: resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} @@ -8803,8 +8853,8 @@ packages: hasBin: true dev: false - /mnemonist@0.39.5: - resolution: {integrity: sha512-FPUtkhtJ0efmEFGpU14x7jGbTB+s18LrzRL2KgoWz9YvcY3cPomz8tih01GbHwnGk/OmkOKfqd/RAQoc8Lm7DQ==} + /mnemonist@0.39.6: + resolution: {integrity: sha512-A/0v5Z59y63US00cRSLiloEIw3t5G+MiKz4BhX21FI+YBJXBOGW0ohFxTxO08dsOYlzxo87T7vGfZKYp2bcAWA==} dependencies: obliterator: 2.0.4 dev: false @@ -8839,10 +8889,6 @@ packages: hasBin: true dev: true - /natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - dev: true - /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true @@ -8948,7 +8994,7 @@ packages: '@yarnpkg/lockfile': 1.1.0 '@yarnpkg/parsers': 3.0.0-rc.46 '@zkochan/js-yaml': 0.0.6 - axios: 1.6.5 + axios: 1.6.8 chalk: 4.1.2 cli-cursor: 3.1.0 cli-spinners: 2.6.1 @@ -9114,6 +9160,7 @@ packages: engines: {node: '>=10'} dependencies: yocto-queue: 0.1.0 + dev: true /p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} @@ -9169,6 +9216,27 @@ packages: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} dev: false + /passport-jwt@4.0.1: + resolution: {integrity: sha512-UCKMDYhNuGOBE9/9Ycuoyh7vP6jpeTp/+sfMJl7nLff/t6dps+iaeE0hhNkKN8/HZHcJ7lCdOyDxHdDoxoSvdQ==} + dependencies: + jsonwebtoken: 9.0.2 + passport-strategy: 1.0.0 + dev: false + + /passport-strategy@1.0.0: + resolution: {integrity: sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==} + engines: {node: '>= 0.4.0'} + dev: false + + /passport@0.7.0: + resolution: {integrity: sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==} + engines: {node: '>= 0.4.0'} + dependencies: + passport-strategy: 1.0.0 + pause: 0.0.1 + utils-merge: 1.0.1 + dev: false + /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -9209,6 +9277,10 @@ packages: engines: {node: '>=8'} dev: true + /pause@0.0.1: + resolution: {integrity: sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==} + dev: false + /pg-cloudflare@1.1.1: resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} requiresBuild: true @@ -9236,8 +9308,8 @@ packages: resolution: {integrity: sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==} dev: false - /pg-tsquery@8.4.1: - resolution: {integrity: sha512-GoeRhw6o4Bpt7awdUwHq6ITOw40IWSrb5IC2qR6dF9ZECtHFGdSpnjHOl9Rumd8Rx12kLI2T9TGV0gvxD5pFgA==} + /pg-tsquery@8.4.2: + resolution: {integrity: sha512-waJSlBIKE+shDhuDpuQglTH6dG5zakDhnrnxu8XB8V5c7yoDSuy4pOxY6t2dyoxTjaKMcMmlByJN7n9jx9eqMA==} engines: {node: '>=10'} dev: false @@ -9337,47 +9409,47 @@ packages: engines: {node: '>=4'} dev: true - /postcss-js@4.0.1(postcss@8.4.33): + /postcss-js@4.0.1(postcss@8.4.35): resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} engines: {node: ^12 || ^14 || >= 16} peerDependencies: postcss: ^8.4.21 dependencies: camelcase-css: 2.0.1 - postcss: 8.4.33 + postcss: 8.4.35 dev: true - /postcss-mixins@9.0.4(postcss@8.4.33): + /postcss-mixins@9.0.4(postcss@8.4.35): resolution: {integrity: sha512-XVq5jwQJDRu5M1XGkdpgASqLk37OqkH4JCFDXl/Dn7janOJjCTEKL+36cnRVy7bMtoBzALfO7bV7nTIsFnUWLA==} engines: {node: '>=14.0'} peerDependencies: postcss: ^8.2.14 dependencies: fast-glob: 3.3.2 - postcss: 8.4.33 - postcss-js: 4.0.1(postcss@8.4.33) - postcss-simple-vars: 7.0.1(postcss@8.4.33) - sugarss: 4.0.1(postcss@8.4.33) + postcss: 8.4.35 + postcss-js: 4.0.1(postcss@8.4.35) + postcss-simple-vars: 7.0.1(postcss@8.4.35) + sugarss: 4.0.1(postcss@8.4.35) dev: true - /postcss-nested@6.0.1(postcss@8.4.33): + /postcss-nested@6.0.1(postcss@8.4.35): resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.2.14 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-selector-parser: 6.0.15 dev: true - /postcss-preset-mantine@1.12.3(postcss@8.4.33): - resolution: {integrity: sha512-cCwowf20mIyRXnV1cSVoMGfhYgy8ZqFJWsEJthdMZ3n7LijjucE9l/HO47gv5gAtr9nY1MkaEkpWS7ulhSTbSg==} + /postcss-preset-mantine@1.13.0(postcss@8.4.35): + resolution: {integrity: sha512-1bv/mQz2K+/FixIMxYd83BYH7PusDZaI7LpUtKbb1l/5N5w6t1p/V9ONHfRJeeAZyfa6Xc+AtR+95VKdFXRH1g==} peerDependencies: postcss: '>=8.0.0' dependencies: - postcss: 8.4.33 - postcss-mixins: 9.0.4(postcss@8.4.33) - postcss-nested: 6.0.1(postcss@8.4.33) + postcss: 8.4.35 + postcss-mixins: 9.0.4(postcss@8.4.35) + postcss-nested: 6.0.1(postcss@8.4.35) dev: true /postcss-selector-parser@6.0.15: @@ -9388,17 +9460,17 @@ packages: util-deprecate: 1.0.2 dev: true - /postcss-simple-vars@7.0.1(postcss@8.4.33): + /postcss-simple-vars@7.0.1(postcss@8.4.35): resolution: {integrity: sha512-5GLLXaS8qmzHMOjVxqkk1TZPf1jMqesiI7qLhnlyERalG0sMbHIbJqrcnrpmZdKCLglHnRHoEBB61RtGTsj++A==} engines: {node: '>=14.0'} peerDependencies: postcss: ^8.2.1 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 dev: true - /postcss@8.4.33: - resolution: {integrity: sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==} + /postcss@8.4.35: + resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 @@ -9440,14 +9512,8 @@ packages: fast-diff: 1.3.0 dev: true - /prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - dev: true - - /prettier@3.2.4: - resolution: {integrity: sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==} + /prettier@3.2.5: + resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} engines: {node: '>=14'} hasBin: true dev: true @@ -9683,14 +9749,14 @@ packages: safe-buffer: 5.2.1 dev: true - /react-arborist@3.4.0(@types/node@20.11.5)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0): + /react-arborist@3.4.0(@types/node@20.11.28)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-QI46oRGXJr0oaQfqqVobIiIoqPp5Y5gM69D2A2P7uHVif+X75XWnScR5drC7YDKgJ4CXVaDeFwnYKOWRRfncMg==} peerDependencies: react: '>= 16.14' react-dom: '>= 16.14' dependencies: react: 18.2.0 - react-dnd: 14.0.5(@types/node@20.11.5)(@types/react@18.2.48)(react@18.2.0) + react-dnd: 14.0.5(@types/node@20.11.28)(@types/react@18.2.66)(react@18.2.0) react-dnd-html5-backend: 14.1.0 react-dom: 18.2.0(react@18.2.0) react-window: 1.8.10(react-dom@18.2.0)(react@18.2.0) @@ -9708,7 +9774,7 @@ packages: dnd-core: 14.0.1 dev: false - /react-dnd@14.0.5(@types/node@20.11.5)(@types/react@18.2.48)(react@18.2.0): + /react-dnd@14.0.5(@types/node@20.11.28)(@types/react@18.2.66)(react@18.2.0): resolution: {integrity: sha512-9i1jSgbyVw0ELlEVt/NkCUkxy1hmhJOkePoCH713u75vzHGyXhPDm28oLfc2NMSBjZRM1Y+wRjHXJT3sPrTy+A==} peerDependencies: '@types/hoist-non-react-statics': '>= 3.3.1' @@ -9725,8 +9791,8 @@ packages: dependencies: '@react-dnd/invariant': 2.0.0 '@react-dnd/shallowequal': 2.0.0 - '@types/node': 20.11.5 - '@types/react': 18.2.48 + '@types/node': 20.11.28 + '@types/react': 18.2.66 dnd-core: 14.0.1 fast-deep-equal: 3.1.3 hoist-non-react-statics: 3.3.2 @@ -9767,7 +9833,7 @@ packages: engines: {node: '>=0.10.0'} dev: true - /react-remove-scroll-bar@2.3.4(@types/react@18.2.48)(react@18.2.0): + /react-remove-scroll-bar@2.3.4(@types/react@18.2.66)(react@18.2.0): resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} engines: {node: '>=10'} peerDependencies: @@ -9777,13 +9843,13 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.48 + '@types/react': 18.2.66 react: 18.2.0 - react-style-singleton: 2.2.1(@types/react@18.2.48)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.66)(react@18.2.0) tslib: 2.6.2 dev: false - /react-remove-scroll@2.5.7(@types/react@18.2.48)(react@18.2.0): + /react-remove-scroll@2.5.7(@types/react@18.2.66)(react@18.2.0): resolution: {integrity: sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==} engines: {node: '>=10'} peerDependencies: @@ -9793,39 +9859,39 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.48 + '@types/react': 18.2.66 react: 18.2.0 - react-remove-scroll-bar: 2.3.4(@types/react@18.2.48)(react@18.2.0) - react-style-singleton: 2.2.1(@types/react@18.2.48)(react@18.2.0) + react-remove-scroll-bar: 2.3.4(@types/react@18.2.66)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.66)(react@18.2.0) tslib: 2.6.2 - use-callback-ref: 1.3.1(@types/react@18.2.48)(react@18.2.0) - use-sidecar: 1.1.2(@types/react@18.2.48)(react@18.2.0) + use-callback-ref: 1.3.1(@types/react@18.2.66)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.2.66)(react@18.2.0) dev: false - /react-router-dom@6.21.3(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-kNzubk7n4YHSrErzjLK72j0B5i969GsuCGazRl3G6j1zqZBLjuSlYBdVdkDOgzGdPIffUOc9nmgiadTEVoq91g==} + /react-router-dom@6.22.3(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw==} engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' react-dom: '>=16.8' dependencies: - '@remix-run/router': 1.14.2 + '@remix-run/router': 1.15.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-router: 6.21.3(react@18.2.0) + react-router: 6.22.3(react@18.2.0) dev: false - /react-router@6.21.3(react@18.2.0): - resolution: {integrity: sha512-a0H638ZXULv1OdkmiK6s6itNhoy33ywxmUFT/xtSoVyf9VnC7n7+VT4LjVzdIHSaF5TIh9ylUgxMXksHTgGrKg==} + /react-router@6.22.3(react@18.2.0): + resolution: {integrity: sha512-dr2eb3Mj5zK2YISHK++foM9w4eBnO23eKnZEDs7c880P6oKbrjz/Svg9+nxqtHQK+oMW4OtjZca0RqPglXxguQ==} engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' dependencies: - '@remix-run/router': 1.14.2 + '@remix-run/router': 1.15.3 react: 18.2.0 dev: false - /react-style-singleton@2.2.1(@types/react@18.2.48)(react@18.2.0): + /react-style-singleton@2.2.1(@types/react@18.2.66)(react@18.2.0): resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} engines: {node: '>=10'} peerDependencies: @@ -9835,14 +9901,14 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.48 + '@types/react': 18.2.66 get-nonce: 1.0.1 invariant: 2.2.4 react: 18.2.0 tslib: 2.6.2 dev: false - /react-textarea-autosize@8.5.3(@types/react@18.2.48)(react@18.2.0): + /react-textarea-autosize@8.5.3(@types/react@18.2.66)(react@18.2.0): resolution: {integrity: sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ==} engines: {node: '>=10'} peerDependencies: @@ -9851,7 +9917,7 @@ packages: '@babel/runtime': 7.23.7 react: 18.2.0 use-composed-ref: 1.3.0(react@18.2.0) - use-latest: 1.2.1(@types/react@18.2.48)(react@18.2.0) + use-latest: 1.2.1(@types/react@18.2.66)(react@18.2.0) transitivePeerDependencies: - '@types/react' dev: false @@ -9938,8 +10004,8 @@ packages: resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==} dev: false - /reflect-metadata@0.1.14: - resolution: {integrity: sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==} + /reflect-metadata@0.2.1: + resolution: {integrity: sha512-i5lLI6iw9AU3Uu4szRNPPEkomnkjRTaVt9hy/bn5g/oSzekBSMeLZblcjP74AW0vBabqERLLIrz+gR8QYR54Tw==} /regenerate-unicode-properties@10.1.1: resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} @@ -10262,8 +10328,8 @@ packages: - bufferutil - utf-8-validate - /socket.io-client@4.7.4: - resolution: {integrity: sha512-wh+OkeF0rAVCrABWQBaEjLfb7DVPotMbu0cgWgyR0v6eA4EoVnAwcIeIbcdTE3GT/H3kbdLl7OoH2+asoDRIIg==} + /socket.io-client@4.7.5: + resolution: {integrity: sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==} engines: {node: '>=10.0.0'} dependencies: '@socket.io/component-emitter': 3.1.0 @@ -10285,8 +10351,8 @@ packages: transitivePeerDependencies: - supports-color - /socket.io@4.7.2: - resolution: {integrity: sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw==} + /socket.io@4.7.4: + resolution: {integrity: sha512-DcotgfP1Zg9iP/dH9zvAQcWrE0TtbMVwXmlV4T4mqsvY+gw+LqUGPfx2AoVyRk0FLME+GQhufDMyacFmw7ksqw==} engines: {node: '>=10.2.0'} dependencies: accepts: 1.3.8 @@ -10301,8 +10367,8 @@ packages: - supports-color - utf-8-validate - /socket.io@4.7.3: - resolution: {integrity: sha512-SE+UIQXBQE+GPG2oszWMlsEmWtHVqw/h1VrYJGK5/MC7CH5p58N448HwIrtREcvR4jfdOJAY4ieQfxMr55qbbw==} + /socket.io@4.7.5: + resolution: {integrity: sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==} engines: {node: '>=10.2.0'} dependencies: accepts: 1.3.8 @@ -10461,13 +10527,13 @@ packages: through: 2.3.8 dev: true - /sugarss@4.0.1(postcss@8.4.33): + /sugarss@4.0.1(postcss@8.4.35): resolution: {integrity: sha512-WCjS5NfuVJjkQzK10s8WOBY+hhDxxNt/N6ZaGwxFZ+wN3/lKKFSaaKUNecULcTTvE4urLcKaZFQD8vO0mOZujw==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.3.3 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 dev: true /superagent@8.1.2: @@ -10488,8 +10554,8 @@ packages: - supports-color dev: true - /supertest@6.3.3: - resolution: {integrity: sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA==} + /supertest@6.3.4: + resolution: {integrity: sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw==} engines: {node: '>=6.4.0'} dependencies: methods: 1.1.2 @@ -10528,6 +10594,14 @@ packages: engines: {node: '>=0.10'} dev: true + /synckit@0.8.8: + resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} + engines: {node: ^14.18.0 || >=16.0.0} + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.6.2 + dev: true + /tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} dev: false @@ -10584,6 +10658,30 @@ packages: webpack: 5.89.0 dev: true + /terser-webpack-plugin@5.3.10(webpack@5.90.1): + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.20 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.1 + terser: 5.26.0 + webpack: 5.90.1 + dev: true + /terser@5.26.0: resolution: {integrity: sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==} engines: {node: '>=10'} @@ -10700,18 +10798,18 @@ packages: utf8-byte-length: 1.0.4 dev: false - /ts-api-utils@1.0.3(typescript@5.3.3): + /ts-api-utils@1.0.3(typescript@5.4.2): resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} engines: {node: '>=16.13.0'} peerDependencies: typescript: '>=4.2.0' dependencies: - typescript: 5.3.3 + typescript: 5.4.2 dev: true - /ts-jest@29.1.1(@babel/core@7.23.7)(jest@29.7.0)(typescript@5.3.3): - resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /ts-jest@29.1.2(@babel/core@7.23.7)(jest@29.7.0)(typescript@5.4.2): + resolution: {integrity: sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==} + engines: {node: ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@babel/core': '>=7.0.0-beta.0 <8' @@ -10733,17 +10831,17 @@ packages: '@babel/core': 7.23.7 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.10.0)(ts-node@10.9.2) + jest: 29.7.0(@types/node@20.11.28)(ts-node@10.9.2) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.5.4 - typescript: 5.3.3 + typescript: 5.4.2 yargs-parser: 21.1.1 dev: true - /ts-loader@9.5.1(typescript@5.3.3)(webpack@5.89.0): + /ts-loader@9.5.1(typescript@5.4.2)(webpack@5.89.0): resolution: {integrity: sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==} engines: {node: '>=12.0.0'} peerDependencies: @@ -10755,11 +10853,11 @@ packages: micromatch: 4.0.5 semver: 7.5.4 source-map: 0.7.4 - typescript: 5.3.3 + typescript: 5.4.2 webpack: 5.89.0 dev: true - /ts-node@10.9.1(@types/node@20.11.5)(typescript@5.3.3): + /ts-node@10.9.1(@types/node@20.11.28)(typescript@5.4.2): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -10778,19 +10876,19 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.11.5 + '@types/node': 20.11.28 acorn: 8.11.3 acorn-walk: 8.3.1 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.3.3 + typescript: 5.4.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 dev: true - /ts-node@10.9.2(@types/node@20.10.0)(typescript@5.3.3): + /ts-node@10.9.2(@types/node@20.11.28)(typescript@5.4.2): resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: @@ -10809,14 +10907,14 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.10.0 + '@types/node': 20.11.28 acorn: 8.11.3 acorn-walk: 8.3.1 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.3.3 + typescript: 5.4.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 @@ -10840,20 +10938,11 @@ packages: /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: false /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - /tsutils@3.21.0(typescript@5.3.3): - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - dependencies: - tslib: 1.14.1 - typescript: 5.3.3 - dev: true - /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -10881,14 +10970,14 @@ packages: engines: {node: '>=12.20'} dev: false - /type-fest@3.13.1: - resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} - engines: {node: '>=14.16'} + /type-fest@4.12.0: + resolution: {integrity: sha512-5Y2/pp2wtJk8o08G0CMkuFPCO354FGwk/vbidxrdhRGZfd0tFnb4Qb8anp9XxXriwBgVPjdWbKpGl4J9lJY2jQ==} + engines: {node: '>=16'} dev: false - /typeorm@0.3.19(pg@8.11.3)(ts-node@10.9.2): - resolution: {integrity: sha512-OGelrY5qEoAU80mR1iyvmUHiKCPUydL6xp6bebXzS7jyv/X70Gp/jBWRAfF4qGOfy2A7orMiGRfwsBUNbEL65g==} - engines: {node: '>= 12.9.0'} + /typeorm@0.3.20(pg@8.11.3)(ts-node@10.9.2): + resolution: {integrity: sha512-sJ0T08dV5eoZroaq9uPKBoNcGslHBR4E4y+EBHs//SiGbblGe7IeduP/IH4ddCcj0qp3PHwDwGnuvqEAnKlq/Q==} + engines: {node: '>=16.13.0'} hasBin: true peerDependencies: '@google-cloud/spanner': ^5.18.0 @@ -10955,9 +11044,9 @@ packages: glob: 10.3.10 mkdirp: 2.1.6 pg: 8.11.3 - reflect-metadata: 0.1.14 + reflect-metadata: 0.2.1 sha.js: 2.4.11 - ts-node: 10.9.2(@types/node@20.10.0)(typescript@5.3.3) + ts-node: 10.9.2(@types/node@20.11.28)(typescript@5.4.2) tslib: 2.6.2 uuid: 9.0.1 yargs: 17.7.2 @@ -10969,6 +11058,12 @@ packages: resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} engines: {node: '>=14.17'} hasBin: true + dev: true + + /typescript@5.4.2: + resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} + engines: {node: '>=14.17'} + hasBin: true /uc.micro@2.0.0: resolution: {integrity: sha512-DffL94LsNOccVn4hyfRe5rdKa273swqeA5DJpMOeFmEn1wCDc7nAbbB0gXlgBCL7TNzeTv6G7XVWzan7iJtfig==} @@ -11026,7 +11121,7 @@ packages: dependencies: punycode: 2.3.1 - /use-callback-ref@1.3.1(@types/react@18.2.48)(react@18.2.0): + /use-callback-ref@1.3.1(@types/react@18.2.66)(react@18.2.0): resolution: {integrity: sha512-Lg4Vx1XZQauB42Hw3kK7JM6yjVjgFmFC5/Ab797s79aARomD2nEErc4mCgM8EZrARLmmbWpi5DGCadmK50DcAQ==} engines: {node: '>=10'} peerDependencies: @@ -11036,7 +11131,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.48 + '@types/react': 18.2.66 react: 18.2.0 tslib: 2.6.2 dev: false @@ -11049,7 +11144,7 @@ packages: react: 18.2.0 dev: false - /use-isomorphic-layout-effect@1.1.2(@types/react@18.2.48)(react@18.2.0): + /use-isomorphic-layout-effect@1.1.2(@types/react@18.2.66)(react@18.2.0): resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} peerDependencies: '@types/react': '*' @@ -11058,11 +11153,11 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.48 + '@types/react': 18.2.66 react: 18.2.0 dev: false - /use-latest@1.2.1(@types/react@18.2.48)(react@18.2.0): + /use-latest@1.2.1(@types/react@18.2.66)(react@18.2.0): resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==} peerDependencies: '@types/react': '*' @@ -11071,12 +11166,12 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.48 + '@types/react': 18.2.66 react: 18.2.0 - use-isomorphic-layout-effect: 1.1.2(@types/react@18.2.48)(react@18.2.0) + use-isomorphic-layout-effect: 1.1.2(@types/react@18.2.66)(react@18.2.0) dev: false - /use-sidecar@1.1.2(@types/react@18.2.48)(react@18.2.0): + /use-sidecar@1.1.2(@types/react@18.2.66)(react@18.2.0): resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} engines: {node: '>=10'} peerDependencies: @@ -11086,7 +11181,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.48 + '@types/react': 18.2.66 detect-node-es: 1.1.0 react: 18.2.0 tslib: 2.6.2 @@ -11107,13 +11202,13 @@ packages: /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - /uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true + /utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} dev: false - /uuid@9.0.0: - resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} + /uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true dev: false @@ -11149,8 +11244,8 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - /vite@5.0.12(@types/node@20.11.5): - resolution: {integrity: sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==} + /vite@5.1.6(@types/node@20.11.28): + resolution: {integrity: sha512-yYIAZs9nVfRJ/AiOLCA91zzhjsHUgMjB+EigzFb6W2XTLO8JixBCKCjvhKZaye+NKYHCrkv3Oh50dH9EdLU2RA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -11177,9 +11272,9 @@ packages: terser: optional: true dependencies: - '@types/node': 20.11.5 + '@types/node': 20.11.28 esbuild: 0.19.11 - postcss: 8.4.33 + postcss: 8.4.35 rollup: 4.9.4 optionalDependencies: fsevents: 2.3.3 @@ -11262,6 +11357,46 @@ packages: - uglify-js dev: true + /webpack@5.90.1: + resolution: {integrity: sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.5 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/wasm-edit': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + acorn: 8.11.3 + acorn-import-assertions: 1.9.0(acorn@8.11.3) + browserslist: 4.22.2 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.15.0 + es-module-lexer: 1.4.1 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.10(webpack@5.90.1) + watchpack: 2.4.0 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + dev: true + /whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} dependencies: @@ -11352,17 +11487,17 @@ packages: engines: {node: '>=0.4'} dev: false - /y-indexeddb@9.0.12(yjs@13.6.10): + /y-indexeddb@9.0.12(yjs@13.6.14): resolution: {integrity: sha512-9oCFRSPPzBK7/w5vOkJBaVCQZKHXB/v6SIT+WYhnJxlEC61juqG0hBrAf+y3gmSMLFLwICNH9nQ53uscuse6Hg==} engines: {node: '>=16.0.0', npm: '>=8.0.0'} peerDependencies: yjs: ^13.0.0 dependencies: lib0: 0.2.88 - yjs: 13.6.10 + yjs: 13.6.14 dev: false - /y-prosemirror@1.2.2(prosemirror-model@1.19.4)(prosemirror-state@1.4.3)(prosemirror-view@1.32.7)(y-protocols@1.0.6)(yjs@13.6.10): + /y-prosemirror@1.2.2(prosemirror-model@1.19.4)(prosemirror-state@1.4.3)(prosemirror-view@1.32.7)(y-protocols@1.0.6)(yjs@13.6.14): resolution: {integrity: sha512-hHdnIAhfa8mIoLWtTkMDb6RBzN3lye1QVkaZwVm58sledAA1zTl+yyEtgkrY/sdH6SaQL0rsLj61zHjgr5D0HQ==} engines: {node: '>=16.0.0', npm: '>=8.0.0'} peerDependencies: @@ -11376,18 +11511,18 @@ packages: prosemirror-model: 1.19.4 prosemirror-state: 1.4.3 prosemirror-view: 1.32.7 - y-protocols: 1.0.6(yjs@13.6.10) - yjs: 13.6.10 + y-protocols: 1.0.6(yjs@13.6.14) + yjs: 13.6.14 dev: false - /y-protocols@1.0.6(yjs@13.6.10): + /y-protocols@1.0.6(yjs@13.6.14): resolution: {integrity: sha512-vHRF2L6iT3rwj1jub/K5tYcTT/mEYDUppgNPXwp8fmLpui9f7Yeq3OEtTLVF012j39QnV+KEQpNqoN7CWU7Y9Q==} engines: {node: '>=16.0.0', npm: '>=8.0.0'} peerDependencies: yjs: ^13.0.0 dependencies: lib0: 0.2.88 - yjs: 13.6.10 + yjs: 13.6.14 dev: false /y18n@5.0.8: @@ -11440,8 +11575,8 @@ packages: y18n: 5.0.8 yargs-parser: 21.1.1 - /yjs@13.6.10: - resolution: {integrity: sha512-1JcyQek1vaMyrDm7Fqfa+pvHg/DURSbVo4VmeN7wjnTKB/lZrfIPhdCj7d8sboK6zLfRBJXegTjc9JlaDd8/Zw==} + /yjs@13.6.14: + resolution: {integrity: sha512-D+7KcUr0j+vBCUSKXXEWfA+bG4UQBviAwP3gYBhkstkgwy5+8diOPMx0iqLIOxNo/HxaREUimZRxqHGAHCL2BQ==} engines: {node: '>=16.0.0', npm: '>=8.0.0'} dependencies: lib0: 0.2.88 @@ -11454,6 +11589,7 @@ packages: /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + dev: true /zeed-dom@0.9.26: resolution: {integrity: sha512-HWjX8rA3Y/RI32zby3KIN1D+mgskce+She4K7kRyyx62OiVxJ5FnYm8vWq0YVAja3Tf2S1M0XAc6O2lRFcMgcQ==}