diff --git a/.gitignore b/.gitignore index 5718a8931..810bd25e2 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ uploadedFles/exports uploadedFles/import uploadedFles/export nats-server.conf +temp diff --git a/apps/agent-provisioning/src/agent-provisioning.module.ts b/apps/agent-provisioning/src/agent-provisioning.module.ts index 829667fc9..f013669cc 100644 --- a/apps/agent-provisioning/src/agent-provisioning.module.ts +++ b/apps/agent-provisioning/src/agent-provisioning.module.ts @@ -3,11 +3,11 @@ import { AgentProvisioningController } from './agent-provisioning.controller'; import { AgentProvisioningService } from './agent-provisioning.service'; import { ClientsModule, Transport } from '@nestjs/microservices'; import { ConfigModule } from '@nestjs/config'; -import { getNatsOptions } from '@credebl/common/nats.config'; +import { getNatsOptions } from '@credebl/common/nats/nats.config'; import { CommonConstants, MICRO_SERVICE_NAME } from '@credebl/common/common.constant'; import { GlobalConfigModule } from '@credebl/config/global-config.module'; import { LoggerModule } from '@credebl/logger/logger.module'; -import { ContextInterceptorModule } from '@credebl/context/contextInterceptorModule'; +import { ContextInterceptorModule } from '@credebl/common/utils/context/contextInterceptorModule'; import { ConfigModule as PlatformConfig } from '@credebl/config/config.module'; @Module({ imports: [ diff --git a/apps/agent-provisioning/src/agent-provisioning.service.ts b/apps/agent-provisioning/src/agent-provisioning.service.ts index 92d382358..066a5d208 100644 --- a/apps/agent-provisioning/src/agent-provisioning.service.ts +++ b/apps/agent-provisioning/src/agent-provisioning.service.ts @@ -2,7 +2,7 @@ import { Injectable, Logger, NotFoundException } from '@nestjs/common'; import { RpcException } from '@nestjs/microservices'; import { IWalletProvision } from './interface/agent-provisioning.interfaces'; import * as dotenv from 'dotenv'; -import { AgentType } from '@credebl/enum/enum'; +import { AgentType } from '@credebl/common/enum/enum'; import * as fs from 'fs'; import { exec } from 'child_process'; dotenv.config(); diff --git a/apps/agent-provisioning/src/index.ts b/apps/agent-provisioning/src/index.ts new file mode 100644 index 000000000..43906e1a3 --- /dev/null +++ b/apps/agent-provisioning/src/index.ts @@ -0,0 +1,4 @@ +export * from './agent-provisioning.controller'; +export * from './agent-provisioning.module'; +export * from './agent-provisioning.service'; +export * from './main'; diff --git a/apps/agent-provisioning/src/interface/agent-provisioning.interfaces.ts b/apps/agent-provisioning/src/interface/agent-provisioning.interfaces.ts index f82b31cca..37d952810 100644 --- a/apps/agent-provisioning/src/interface/agent-provisioning.interfaces.ts +++ b/apps/agent-provisioning/src/interface/agent-provisioning.interfaces.ts @@ -1,5 +1,5 @@ /* eslint-disable quotes */ -import { AgentType } from "@credebl/enum/enum"; +import { AgentType } from "@credebl/common/enum/enum"; export interface IWalletProvision { orgId: string; diff --git a/apps/agent-provisioning/src/interface/index.ts b/apps/agent-provisioning/src/interface/index.ts new file mode 100644 index 000000000..e1dac7334 --- /dev/null +++ b/apps/agent-provisioning/src/interface/index.ts @@ -0,0 +1 @@ +export * from './agent-provisioning.interfaces'; diff --git a/apps/agent-provisioning/src/main.ts b/apps/agent-provisioning/src/main.ts index 4e9a61f80..f3c8ccea4 100644 --- a/apps/agent-provisioning/src/main.ts +++ b/apps/agent-provisioning/src/main.ts @@ -1,11 +1,11 @@ import { NestFactory } from '@nestjs/core'; -import { HttpExceptionFilter } from 'libs/http-exception.filter'; +import { HttpExceptionFilter } from '@credebl/common/utils/handlers/http-exception.filter'; import { Logger } from '@nestjs/common'; import { MicroserviceOptions, Transport } from '@nestjs/microservices'; import { AgentProvisioningModule } from './agent-provisioning.module'; -import { getNatsOptions } from '@credebl/common/nats.config'; +import { getNatsOptions } from '@credebl/common/nats/nats.config'; import { CommonConstants } from '@credebl/common/common.constant'; -import NestjsLoggerServiceAdapter from '@credebl/logger/nestjsLoggerServiceAdapter'; +import { NestjsLoggerServiceAdapter } from '@credebl/logger/nestjsLoggerServiceAdapter'; const logger = new Logger(); async function bootstrap(): Promise { diff --git a/apps/agent-provisioning/test/index.ts b/apps/agent-provisioning/test/index.ts new file mode 100644 index 000000000..6a7011609 --- /dev/null +++ b/apps/agent-provisioning/test/index.ts @@ -0,0 +1 @@ +export * from './app.e2e-spec'; diff --git a/apps/agent-provisioning/tsconfig.app.json b/apps/agent-provisioning/tsconfig.app.json index bd244d42c..b9efc34d2 100644 --- a/apps/agent-provisioning/tsconfig.app.json +++ b/apps/agent-provisioning/tsconfig.app.json @@ -1,8 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "declaration": false, - "outDir": "../../dist/apps/agent-provisioning" + "outDir": "./dist/apps/", //agent-provisioning/" }, "include": ["src/**/*"], "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] diff --git a/apps/agent-service/src/agent-service.controller.ts b/apps/agent-service/src/agent-service.controller.ts index d368781cd..e339c698f 100644 --- a/apps/agent-service/src/agent-service.controller.ts +++ b/apps/agent-service/src/agent-service.controller.ts @@ -25,8 +25,8 @@ import { } from './interface/agent-service.interface'; import { user } from '@prisma/client'; import { InvitationMessage } from '@credebl/common/interfaces/agent-service.interface'; -import { AgentSpinUpStatus } from '@credebl/enum/enum'; import { SignDataDto } from '../../api-gateway/src/agent-service/dto/agent-service.dto'; +import { AgentSpinUpStatus } from '@credebl/common/enum/enum'; @Controller() export class AgentServiceController { diff --git a/apps/agent-service/src/agent-service.module.ts b/apps/agent-service/src/agent-service.module.ts index d8fe46193..1d0380685 100644 --- a/apps/agent-service/src/agent-service.module.ts +++ b/apps/agent-service/src/agent-service.module.ts @@ -9,14 +9,14 @@ import { ConfigModule } from '@nestjs/config'; import { ConnectionService } from 'apps/connection/src/connection.service'; import { ConnectionRepository } from 'apps/connection/src/connection.repository'; import { CacheModule } from '@nestjs/cache-manager'; -import { getNatsOptions } from '@credebl/common/nats.config'; -import { UserActivityRepository } from 'libs/user-activity/repositories'; +import { getNatsOptions } from '@credebl/common/nats/nats.config'; +import { UserActivityRepository } from '@credebl/user-activity/repositories'; import { CommonConstants, MICRO_SERVICE_NAME } from '@credebl/common/common.constant'; import { LoggerModule } from '@credebl/logger/logger.module'; import { ConfigModule as PlatformConfig } from '@credebl/config/config.module'; import { GlobalConfigModule } from '@credebl/config/global-config.module'; -import { ContextInterceptorModule } from '@credebl/context/contextInterceptorModule'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { ContextInterceptorModule } from '@credebl/common/utils/context/contextInterceptorModule'; +import { NATSClient } from '@credebl/common/nats/NATSClient'; @Module({ diff --git a/apps/agent-service/src/agent-service.service.ts b/apps/agent-service/src/agent-service.service.ts index 4a61dba6f..cc31969c3 100644 --- a/apps/agent-service/src/agent-service.service.ts +++ b/apps/agent-service/src/agent-service.service.ts @@ -56,28 +56,33 @@ import { OrgDid, IBasicMessage } from './interface/agent-service.interface'; -import { AgentSpinUpStatus, AgentType, DidMethod, Ledgers, OrgAgentType, PromiseResult } from '@credebl/enum/enum'; +import { AgentSpinUpStatus, AgentType, DidMethod, Ledgers, OrgAgentType, PromiseResult } from '@credebl/common/enum/enum'; import { AgentServiceRepository } from './repositories/agent-service.repository'; import { Prisma, RecordType, ledgers, org_agents, organisation, platform_config, user } from '@prisma/client'; import { CommonConstants } from '@credebl/common/common.constant'; import { CommonService } from '@credebl/common'; -import { GetSchemaAgentRedirection } from 'apps/ledger/src/schema/schema.interface'; +import { GetSchemaAgentRedirection } from '@credebl/ledger/src/schema/schema.interface'; import { ConnectionService } from 'apps/connection/src/connection.service'; -import { ResponseMessages } from '@credebl/common/response-messages'; +import { ResponseMessages } from '@credebl/common/utils/response-messages'; import { Socket, io } from 'socket.io-client'; import { WebSocketGateway } from '@nestjs/websockets'; -import * as retry from 'async-retry'; +import retry from 'async-retry'; import { Cache } from 'cache-manager'; import { CACHE_MANAGER } from '@nestjs/cache-manager'; import { ledgerName } from '@credebl/common/cast.helper'; +import { IProofPresentationDetails } from '@credebl/common/interfaces/verification.interface'; +import { IConnectionDetailsById } from 'apps/api-gateway/src/interfaces/IConnectionSearch.interface'; +import { ledgerName } from '@credebl/common/utils/helpers/cast.helper'; import { InvitationMessage } from '@credebl/common/interfaces/agent-service.interface'; import * as CryptoJS from 'crypto-js'; -import { UserActivityRepository } from 'libs/user-activity/repositories'; +import { UserActivityRepository } from '@credebl/user-activity/repositories'; import { PrismaService } from '@credebl/prisma-service'; import { from } from 'rxjs'; import { NATSClient } from '@credebl/common/NATSClient'; import { SignDataDto } from '../../api-gateway/src/agent-service/dto/agent-service.dto'; import { IVerificationMethod } from 'apps/organization/interfaces/organization.interface'; +import { NATSClient } from '@credebl/common/nats/NATSClient'; + @Injectable() @WebSocketGateway() export class AgentServiceService { diff --git a/apps/agent-service/src/index.ts b/apps/agent-service/src/index.ts new file mode 100644 index 000000000..74f9e47f5 --- /dev/null +++ b/apps/agent-service/src/index.ts @@ -0,0 +1,4 @@ +export * from './agent-service.controller'; +export * from './agent-service.module'; +export * from './agent-service.service'; +export * from './main'; diff --git a/apps/agent-service/src/interface/agent-service.interface.ts b/apps/agent-service/src/interface/agent-service.interface.ts index b4927f98c..82d8ca9d9 100644 --- a/apps/agent-service/src/interface/agent-service.interface.ts +++ b/apps/agent-service/src/interface/agent-service.interface.ts @@ -1,4 +1,4 @@ -import { AgentSpinUpStatus } from '@credebl/enum/enum'; +import { AgentSpinUpStatus } from '@credebl/common/enum/enum'; import { Prisma } from '@prisma/client'; import { UserRoleOrgPermsDto } from 'apps/api-gateway/src/dtos/user-role-org-perms.dto'; diff --git a/apps/agent-service/src/interface/index.ts b/apps/agent-service/src/interface/index.ts new file mode 100644 index 000000000..fb14a1fb2 --- /dev/null +++ b/apps/agent-service/src/interface/index.ts @@ -0,0 +1 @@ +export * from './agent-service.interface'; diff --git a/apps/agent-service/src/main.ts b/apps/agent-service/src/main.ts index 292253c1c..ae3a4e694 100644 --- a/apps/agent-service/src/main.ts +++ b/apps/agent-service/src/main.ts @@ -1,14 +1,14 @@ -import { HttpExceptionFilter } from 'libs/http-exception.filter'; +import { HttpExceptionFilter } from '@credebl/common/utils/handlers/http-exception.filter'; import { Logger } from '@nestjs/common'; import { NestFactory } from '@nestjs/core'; import { AgentServiceModule } from './agent-service.module'; import { AgentServiceService } from './agent-service.service'; import { IAgentSpinupDto, IUserRequestInterface } from './interface/agent-service.interface'; import { MicroserviceOptions, Transport } from '@nestjs/microservices'; -import { getNatsOptions } from '@credebl/common/nats.config'; +import { getNatsOptions } from '@credebl/common/nats/nats.config'; import { CommonConstants } from '@credebl/common/common.constant'; -import { Ledgers } from '@credebl/enum/enum'; -import NestjsLoggerServiceAdapter from '@credebl/logger/nestjsLoggerServiceAdapter'; +import { Ledgers } from '@credebl/common/enum/enum'; +import { NestjsLoggerServiceAdapter } from '@credebl/logger/nestjsLoggerServiceAdapter'; const logger = new Logger(); diff --git a/apps/agent-service/src/repositories/index.ts b/apps/agent-service/src/repositories/index.ts new file mode 100644 index 000000000..7d506616e --- /dev/null +++ b/apps/agent-service/src/repositories/index.ts @@ -0,0 +1 @@ +export * from './agent-service.repository'; diff --git a/apps/agent-service/test/index.ts b/apps/agent-service/test/index.ts new file mode 100644 index 000000000..6a7011609 --- /dev/null +++ b/apps/agent-service/test/index.ts @@ -0,0 +1 @@ +export * from './app.e2e-spec'; diff --git a/apps/agent-service/tsconfig.app.json b/apps/agent-service/tsconfig.app.json index 93e89a6b9..4439eec47 100644 --- a/apps/agent-service/tsconfig.app.json +++ b/apps/agent-service/tsconfig.app.json @@ -1,8 +1,8 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "declaration": false, - "outDir": "../../dist/apps/agent-service" + + "outDir": "./dist/apps/", //agent-service/" }, "include": ["src/**/*"], "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] diff --git a/apps/api-gateway/package.json b/apps/api-gateway/package.json new file mode 100644 index 000000000..f2cb69b1b --- /dev/null +++ b/apps/api-gateway/package.json @@ -0,0 +1,59 @@ +{ + "name": "@credebl/api-gateway", + "version": "2.0.0", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "license": "Apache-2.0", + "files": [ + "dist" + ], + "scripts": { + "start": "ts-node src/main.ts", + "clean": "rimraf ./dist", + "compile": "tsc -p tsconfig.app.json", + "build": "pnpm run clean && pnpm run compile", + "generate": "npx prisma generate --schema=node_modules/@credebl/prisma-service/prisma/schema.prisma", + "cleanup": "rm -rf node_modules dist pnpm-lock.yaml && rm -rf ~/.cache/prisma ~/.pnpm-store" + }, + "peerDependencies": { + "@prisma/client": "^5.22.0" + }, + "dependencies": { + "@credebl/aws": "file:../../credebl-aws-2.0.0.tgz", + "@credebl/common": "file:../../credebl-common-2.0.0.tgz", + "@credebl/logger": "file:../../credebl-logger-2.0.0.tgz", + "@credebl/prisma-service": "file:../../credebl-prisma-service-2.0.0.tgz", + "@credebl/user-management": "file:../../credebl-user-management-2.0.0.tgz", + "@nestjs/common": "^10.4.20", + "@nestjs/core": "^10.4.20", + "@nestjs/microservices": "^10.4.20", + "@nestjs/passport": "^10.0.3", + "@nestjs/platform-socket.io": "^10.4.20", + "@nestjs/websockets": "^10.4.20", + "cache-manager-redis-store": "^2.0.0", + "class-transformer": "^0.5.1", + "class-validator": "^0.14.2", + "dotenv": "^16.6.1", + "express": "^4.21.2", + "fs": "0.0.1-security", + "@nestjs/swagger": "^7.4.2", + "swagger-ui-express": "^5.0.1", + "helmet": "^7.2.0", + "jsonwebtoken": "^9.0.2", + "jwks-rsa": "^3.2.0", + "nats": "^2.29.3", + "nestjs-rate-limiter": "^3.1.0", + "passport-jwt": "^4.0.1", + "path": "^0.12.7", + "qrcode": "^1.5.4", + "rxjs": "^7.8.2", + "uuid": "^9.0.1" + }, + "resolutions": { + "@credebl/aws": "file:../../credebl-aws-2.0.0.tgz", + "@credebl/common": "file:../../credebl-common-2.0.0.tgz", + "@credebl/logger": "file:../../credebl-logger-2.0.0.tgz", + "@credebl/prisma-service": "file:../../credebl-prisma-service-2.0.0.tgz", + "@credebl/user-management": "file:../../credebl-user-management-2.0.0.tgz" + } +} diff --git a/apps/api-gateway/src/agent-service/agent-service.controller.spec.ts b/apps/api-gateway/src/agent-service/agent-service.controller.spec.ts deleted file mode 100644 index c873b7321..000000000 --- a/apps/api-gateway/src/agent-service/agent-service.controller.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { AgentController } from './agent.controller'; - -describe('Agent Controller', () => { - let controller: AgentController; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - controllers: [AgentController] - }).compile(); - - controller = module.get(AgentController); - }); - - it('should be defined', () => { - expect(controller).toBeDefined(); - }); -}); diff --git a/apps/api-gateway/src/agent-service/agent-service.controller.ts b/apps/api-gateway/src/agent-service/agent-service.controller.ts index 2bd780ecc..ad8d622b5 100644 --- a/apps/api-gateway/src/agent-service/agent-service.controller.ts +++ b/apps/api-gateway/src/agent-service/agent-service.controller.ts @@ -28,23 +28,23 @@ import { import { AuthGuard } from '@nestjs/passport'; import { ApiResponseDto } from '../dtos/apiResponse.dto'; import { ForbiddenErrorDto } from '../dtos/forbidden-error.dto'; -import { ResponseMessages } from '@credebl/common/response-messages'; -import { AgentService } from './agent-service.service'; -import IResponseType, { IResponse } from '@credebl/common/interfaces/response.interface'; +import { ResponseMessages } from '@credebl/common'; +import { AgentServiceService } from './agent-service.service'; +import { IResponseType, IResponse } from '@credebl/common'; import { AgentSpinupDto, SignDataDto, VerifySignatureDto } from './dto/agent-service.dto'; import { Response } from 'express'; // eslint-disable-next-line @typescript-eslint/no-unused-vars -import { user } from '@prisma/client'; +import { user } from '@credebl/prisma-service'; import { CreateTenantDto } from './dto/create-tenant.dto'; import { User } from '../authz/decorators/user.decorator'; -import { CustomExceptionFilter } from 'apps/api-gateway/common/exception-handler'; +import { CustomExceptionFilter } from '../common'; import { Roles } from '../authz/decorators/roles.decorator'; -import { OrgRoles } from 'libs/org-roles/enums'; +import { OrgRoles } from '@credebl/common'; import { OrgRolesGuard } from '../authz/guards/org-roles.guard'; -import { Validator } from '@credebl/common/validator'; +import { Validator } from '@credebl/common'; import { CreateWalletDto } from './dto/create-wallet.dto'; import { CreateNewDidDto } from './dto/create-new-did.dto'; -import { AgentSpinupValidator, TrimStringParamPipe } from '@credebl/common/cast.helper'; +import { AgentSpinupValidator, TrimStringParamPipe } from '@credebl/common'; import { AgentConfigureDto } from './dto/agent-configure.dto'; import { UnauthorizedErrorDto } from '../dtos/unauthorized-error.dto'; import { IVerifySignature } from './interface/agent-service.interface'; @@ -57,8 +57,8 @@ const seedLength = 32; @ApiBearerAuth() @ApiUnauthorizedResponse({ status: HttpStatus.UNAUTHORIZED, description: 'Unauthorized', type: UnauthorizedErrorDto }) @ApiForbiddenResponse({ status: HttpStatus.FORBIDDEN, description: 'Forbidden', type: ForbiddenErrorDto }) -export class AgentController { - constructor(private readonly agentService: AgentService) {} +export class AgentServiceController { + constructor(private readonly agentService: AgentServiceService) {} private readonly logger = new Logger(); /** diff --git a/apps/api-gateway/src/agent-service/agent-service.module.ts b/apps/api-gateway/src/agent-service/agent-service.module.ts index 0fa2da620..f01dda3c0 100644 --- a/apps/api-gateway/src/agent-service/agent-service.module.ts +++ b/apps/api-gateway/src/agent-service/agent-service.module.ts @@ -1,14 +1,12 @@ -import { Module } from '@nestjs/common'; +import { Module, DynamicModule, Provider } from '@nestjs/common'; import { HttpModule } from '@nestjs/axios'; import { ClientsModule, Transport } from '@nestjs/microservices'; -import { CommonModule } from '../../../../libs/common/src/common.module'; -import { CommonService } from '../../../../libs/common/src/common.service'; import { ConfigModule } from '@nestjs/config'; -import { AgentController } from './agent-service.controller'; -import { AgentService } from './agent-service.service'; -import { getNatsOptions } from '@credebl/common/nats.config'; -import { CommonConstants } from '@credebl/common/common.constant'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { AgentServiceController } from './agent-service.controller'; +import { AgentServiceService } from './agent-service.service'; +import { CommonModule, CommonService, getNatsOptions } from '@credebl/common'; +import { CommonConstants } from '@credebl/common'; +import { NATSClient } from '@credebl/common'; @Module({ imports: [ @@ -19,12 +17,38 @@ import { NATSClient } from '@credebl/common/NATSClient'; name: 'NATS_CLIENT', transport: Transport.NATS, options: getNatsOptions(CommonConstants.AGENT_SERVICE, process.env.API_GATEWAY_NKEY_SEED) - }, CommonModule ]) ], - controllers: [AgentController], - providers: [AgentService, CommonService, NATSClient] + controllers: [AgentServiceController], + providers: [AgentServiceService, CommonService, NATSClient] }) -export class AgentModule { } +export class AgentServiceModule { + static register( + overrides: Provider[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + controllerOverrides: any[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + importedModules: any[] = [] + ): DynamicModule { + return { + module: AgentServiceModule, + imports: [ + HttpModule, + ConfigModule.forRoot(), + ClientsModule.register([ + { + name: 'NATS_CLIENT', + transport: Transport.NATS, + options: getNatsOptions(CommonConstants.AGENT_SERVICE, process.env.API_GATEWAY_NKEY_SEED) + }, + CommonModule + ]), + ...importedModules + ], + controllers: controllerOverrides.length ? controllerOverrides : [AgentServiceController], + providers: [AgentServiceService, CommonService, NATSClient, ...overrides] + }; + } +} diff --git a/apps/api-gateway/src/agent-service/agent-service.service.ts b/apps/api-gateway/src/agent-service/agent-service.service.ts index 557027f7a..613cf2f23 100644 --- a/apps/api-gateway/src/agent-service/agent-service.service.ts +++ b/apps/api-gateway/src/agent-service/agent-service.service.ts @@ -1,7 +1,7 @@ import { Injectable, Inject } from '@nestjs/common'; import { ClientProxy } from '@nestjs/microservices'; -import { user } from '@prisma/client'; -import { BaseService } from 'libs/service/base.service'; +import { user } from '@credebl/prisma-service'; +import { BaseService } from '@credebl/common'; import { AgentSpinupDto } from './dto/agent-service.dto'; import { CreateTenantDto } from './dto/create-tenant.dto'; import { AgentSpinUpSatus, IWalletRecord } from './interface/agent-service.interface'; @@ -9,10 +9,10 @@ import { AgentStatus } from './interface/agent-service.interface'; import { CreateDidDto } from './dto/create-did.dto'; import { CreateWalletDto } from './dto/create-wallet.dto'; import { AgentConfigureDto } from './dto/agent-configure.dto'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { NATSClient } from '@credebl/common'; @Injectable() -export class AgentService extends BaseService { +export class AgentServiceService extends BaseService { constructor( @Inject('NATS_CLIENT') private readonly agentServiceProxy: ClientProxy, private readonly natsClient: NATSClient diff --git a/apps/api-gateway/src/agent-service/agent.service.spec.ts b/apps/api-gateway/src/agent-service/agent.service.spec.ts deleted file mode 100644 index 2b7709ccc..000000000 --- a/apps/api-gateway/src/agent-service/agent.service.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { AgentService } from './agent.service'; - -describe('AgentService', () => { - let service: AgentService; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - providers: [AgentService] - }).compile(); - - service = module.get(AgentService); - }); - - it('should be defined', () => { - expect(service).toBeDefined(); - }); -}); diff --git a/apps/api-gateway/src/agent-service/dto/agent-configure.dto.ts b/apps/api-gateway/src/agent-service/dto/agent-configure.dto.ts index a9ae783c5..501491215 100644 --- a/apps/api-gateway/src/agent-service/dto/agent-configure.dto.ts +++ b/apps/api-gateway/src/agent-service/dto/agent-configure.dto.ts @@ -1,4 +1,4 @@ -import { IsHostPortOrDomain, trim } from '@credebl/common/cast.helper'; +import { IsHostPortOrDomain, trim } from '@credebl/common'; import { ApiProperty } from '@nestjs/swagger'; import { Transform } from 'class-transformer'; import { IsNotEmpty, IsString, Matches, MaxLength, MinLength } from 'class-validator'; diff --git a/apps/api-gateway/src/agent-service/dto/agent-service.dto.ts b/apps/api-gateway/src/agent-service/dto/agent-service.dto.ts index 140bc5fcd..92500003b 100644 --- a/apps/api-gateway/src/agent-service/dto/agent-service.dto.ts +++ b/apps/api-gateway/src/agent-service/dto/agent-service.dto.ts @@ -1,4 +1,4 @@ -import { trim } from '@credebl/common/cast.helper'; +import { trim } from '@credebl/common'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { Transform, Type } from 'class-transformer'; import { @@ -21,8 +21,8 @@ import { ValidatorConstraintInterface } from 'class-validator'; import { CreateDidDto } from './create-did.dto'; -import { KeyType } from '@credebl/enum/enum'; -import { RewriteValidationOptions } from '@credebl/common/custom-overrideable-validation-pipe'; +import { KeyType } from '@credebl/common'; +import { RewriteValidationOptions } from '@credebl/common/dist'; import { BadRequestException } from '@nestjs/common'; const regex = /^[a-zA-Z0-9 ]*$/; export class AgentSpinupDto extends CreateDidDto { diff --git a/apps/api-gateway/src/agent-service/dto/create-did.dto.ts b/apps/api-gateway/src/agent-service/dto/create-did.dto.ts index 1dda2d25a..d7c38a4aa 100644 --- a/apps/api-gateway/src/agent-service/dto/create-did.dto.ts +++ b/apps/api-gateway/src/agent-service/dto/create-did.dto.ts @@ -1,71 +1,70 @@ -import { trim } from '@credebl/common/cast.helper'; +import { trim } from '@credebl/common'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { Transform } from 'class-transformer'; import { MaxLength, IsString, Matches, IsNotEmpty, IsOptional } from 'class-validator'; export class CreateDidDto { + @ApiProperty({ example: '000000000000000000000000000Seed1' }) + @MaxLength(32, { message: 'seed must be at most 32 characters.' }) + @Transform(({ value }) => trim(value)) + @IsOptional() + @ApiPropertyOptional() + @IsString({ message: 'seed must be in string format.' }) + @Matches(/^\S*$/, { + message: 'Spaces are not allowed in seed' + }) + seed?: string; - @ApiProperty({ example: '000000000000000000000000000Seed1' }) - @MaxLength(32, { message: 'seed must be at most 32 characters.' }) - @Transform(({ value }) => trim(value)) - @IsOptional() - @ApiPropertyOptional() - @IsString({ message: 'seed must be in string format.' }) - @Matches(/^\S*$/, { - message: 'Spaces are not allowed in seed' - }) - seed?: string; + @ApiProperty({ example: 'ed25519' }) + @IsNotEmpty({ message: 'key type is required' }) + @Transform(({ value }) => trim(value)) + @IsString({ message: 'key type be in string format.' }) + keyType: string; - @ApiProperty({ example: 'ed25519'}) - @IsNotEmpty({ message: 'key type is required' }) - @Transform(({ value }) => trim(value)) - @IsString({ message: 'key type be in string format.' }) - keyType: string; + @ApiProperty({ example: 'indy' }) + @IsNotEmpty({ message: 'method is required' }) + @Transform(({ value }) => trim(value)) + @IsString({ message: 'method must be in string format.' }) + method: string; - @ApiProperty({ example: 'indy'}) - @IsNotEmpty({ message: 'method is required' }) - @Transform(({ value }) => trim(value)) - @IsString({ message: 'method must be in string format.' }) - method: string; + @ApiPropertyOptional({ example: 'bcovrin:testnet' }) + @IsOptional() + @Transform(({ value }) => trim(value)) + @IsString({ message: 'network must be in string format.' }) + network?: string; - @ApiPropertyOptional({example: 'bcovrin:testnet'}) - @IsOptional() - @Transform(({ value }) => trim(value)) - @IsString({ message: 'network must be in string format.' }) - network?: string; + @ApiPropertyOptional({ example: 'www.github.com' }) + @IsOptional() + @Transform(({ value }) => trim(value)) + @IsString({ message: 'domain must be in string format.' }) + domain?: string; - @ApiPropertyOptional({example: 'www.github.com'}) - @IsOptional() - @Transform(({ value }) => trim(value)) - @IsString({ message: 'domain must be in string format.' }) - domain?: string; + @ApiPropertyOptional({ example: 'endorser' }) + @IsOptional() + @Transform(({ value }) => trim(value)) + @IsString({ message: 'role must be in string format.' }) + role?: string; - @ApiPropertyOptional({example: 'endorser'}) - @IsOptional() - @Transform(({ value }) => trim(value)) - @IsString({ message: 'role must be in string format.' }) - role?: string; + @ApiPropertyOptional({ example: '' }) + @IsOptional() + @IsString({ message: 'private key must be in string format.' }) + @Transform(({ value }) => trim(value)) + privatekey?: string; - @ApiPropertyOptional({example: ''}) - @IsOptional() - @IsString({ message: 'private key must be in string format.' }) - @Transform(({ value }) => trim(value)) - privatekey?: string; + @ApiPropertyOptional({ example: 'http://localhost:6006/docs' }) + @IsOptional() + @IsString({ message: 'endpoint must be in string format.' }) + endpoint?: string; - @ApiPropertyOptional({example: 'http://localhost:6006/docs'}) - @IsOptional() - @IsString({ message: 'endpoint must be in string format.' }) - endpoint?: string; + @ApiPropertyOptional({ example: 'XzFjo1RTZ2h9UVFCnPUyaQ' }) + @IsOptional() + @Transform(({ value }) => trim(value)) + @IsString({ message: 'did must be in string format.' }) + did?: string; - @ApiPropertyOptional({ example: 'XzFjo1RTZ2h9UVFCnPUyaQ' }) - @IsOptional() - @Transform(({ value }) => trim(value)) - @IsString({ message: 'did must be in string format.' }) - did?: string; - - @ApiPropertyOptional({example: 'did:indy:bcovrin:testnet:UEeW111G1tYo1nEkPwMcF'}) - @IsOptional() - @Transform(({ value }) => trim(value)) - @IsString({ message: 'endorser did must be in string format.' }) - endorserDid?: string; -} \ No newline at end of file + @ApiPropertyOptional({ example: 'did:indy:bcovrin:testnet:UEeW111G1tYo1nEkPwMcF' }) + @IsOptional() + @Transform(({ value }) => trim(value)) + @IsString({ message: 'endorser did must be in string format.' }) + endorserDid?: string; +} diff --git a/apps/api-gateway/src/agent-service/dto/create-tenant.dto.ts b/apps/api-gateway/src/agent-service/dto/create-tenant.dto.ts index e26131431..0e43532eb 100644 --- a/apps/api-gateway/src/agent-service/dto/create-tenant.dto.ts +++ b/apps/api-gateway/src/agent-service/dto/create-tenant.dto.ts @@ -1,28 +1,27 @@ -import { trim } from '@credebl/common/cast.helper'; +import { trim } from '@credebl/common'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { Transform } from 'class-transformer'; import { MaxLength, IsString, MinLength, IsOptional } from 'class-validator'; import { CreateDidDto } from './create-did.dto'; export class CreateTenantDto extends CreateDidDto { - @ApiProperty() - @MaxLength(25, { message: 'Maximum length for label must be 25 characters.' }) - @IsString({ message: 'label must be in string format.' }) - @Transform(({ value }) => trim(value)) - @MinLength(2, { message: 'Minimum length for label must be 2 characters.' }) - label: string; + @ApiProperty() + @MaxLength(25, { message: 'Maximum length for label must be 25 characters.' }) + @IsString({ message: 'label must be in string format.' }) + @Transform(({ value }) => trim(value)) + @MinLength(2, { message: 'Minimum length for label must be 2 characters.' }) + label: string; - @ApiProperty({ example: 'ojIckSD2jqNzOqIrAGzL' }) - @IsOptional() - @ApiPropertyOptional() - @IsString({ message: 'did must be in string format.' }) - clientSocketId?: string; + @ApiProperty({ example: 'ojIckSD2jqNzOqIrAGzL' }) + @IsOptional() + @ApiPropertyOptional() + @IsString({ message: 'did must be in string format.' }) + clientSocketId?: string; - @ApiProperty({ example: 'XzFjo1RTZ2h9UVFCnPUyaQ' }) - @IsOptional() - @ApiPropertyOptional() - @IsString({ message: 'did must be in string format.' }) - did?: string; + @ApiProperty({ example: 'XzFjo1RTZ2h9UVFCnPUyaQ' }) + @IsOptional() + @ApiPropertyOptional() + @IsString({ message: 'did must be in string format.' }) + did?: string; - orgId: string; - -} \ No newline at end of file + orgId: string; +} diff --git a/apps/api-gateway/src/agent-service/dto/create-wallet.dto.ts b/apps/api-gateway/src/agent-service/dto/create-wallet.dto.ts index eec4ac54c..78f7ac0e1 100644 --- a/apps/api-gateway/src/agent-service/dto/create-wallet.dto.ts +++ b/apps/api-gateway/src/agent-service/dto/create-wallet.dto.ts @@ -1,28 +1,28 @@ -import { trim } from '@credebl/common/cast.helper'; +import { trim } from '@credebl/common'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { Transform } from 'class-transformer'; import { MaxLength, IsString, MinLength, IsNotEmpty, IsOptional } from 'class-validator'; export class CreateWalletDto { - @ApiProperty() - @MaxLength(25, { message: 'Maximum length for label must be 25 characters.' }) - @IsString({ message: 'label must be in string format.' }) - @Transform(({ value }) => trim(value)) - @IsNotEmpty({ message: 'label is required' }) - @MinLength(2, { message: 'Minimum length for label must be 2 characters.' }) - label: string; + @ApiProperty() + @MaxLength(25, { message: 'Maximum length for label must be 25 characters.' }) + @IsString({ message: 'label must be in string format.' }) + @Transform(({ value }) => trim(value)) + @IsNotEmpty({ message: 'label is required' }) + @MinLength(2, { message: 'Minimum length for label must be 2 characters.' }) + label: string; - @ApiProperty({ example: 'XzFjo1RTZ2h9UVFCnPUyaQ' }) - @IsOptional() - @ApiPropertyOptional() - @IsString({ message: 'did must be in string format.' }) - did?: string; + @ApiProperty({ example: 'XzFjo1RTZ2h9UVFCnPUyaQ' }) + @IsOptional() + @ApiPropertyOptional() + @IsString({ message: 'did must be in string format.' }) + did?: string; - @ApiProperty({ example: 'ojIckSD2jqNzOqIrAGzL' }) - @IsOptional() - @ApiPropertyOptional() - @IsString({ message: 'did must be in string format.' }) - clientSocketId?: string; + @ApiProperty({ example: 'ojIckSD2jqNzOqIrAGzL' }) + @IsOptional() + @ApiPropertyOptional() + @IsString({ message: 'did must be in string format.' }) + clientSocketId?: string; - orgId: string; -} \ No newline at end of file + orgId: string; +} diff --git a/apps/api-gateway/src/agent-service/dto/index.ts b/apps/api-gateway/src/agent-service/dto/index.ts new file mode 100644 index 000000000..ae30f60f0 --- /dev/null +++ b/apps/api-gateway/src/agent-service/dto/index.ts @@ -0,0 +1,8 @@ +export * from './agent-configure.dto'; +export * from './agent-service.dto'; +export * from './create-did.dto'; +export * from './create-new-did.dto'; +export * from './create-schema.dto'; +export * from './create-tenant.dto'; +export * from './create-wallet.dto'; +export * from './register-webhook-dto'; diff --git a/apps/api-gateway/src/agent-service/dto/register-webhook-dto.ts b/apps/api-gateway/src/agent-service/dto/register-webhook-dto.ts index 9ae6ee72a..5544b2b39 100644 --- a/apps/api-gateway/src/agent-service/dto/register-webhook-dto.ts +++ b/apps/api-gateway/src/agent-service/dto/register-webhook-dto.ts @@ -1,15 +1,14 @@ -import { trim } from '@credebl/common/cast.helper'; +import { trim } from '@credebl/common'; import { ApiProperty } from '@nestjs/swagger'; import { Transform } from 'class-transformer'; import { IsNotEmpty, IsString } from 'class-validator'; export class RegisterWebhookDto { + orgId: string; -orgId: string; - -@ApiProperty() -@Transform(({ value }) => trim(value)) -@IsNotEmpty({ message: 'webhookUrl is required.' }) -@IsString({ message: 'webhookUrl must be in string format.' }) -webhookUrl: string; + @ApiProperty() + @Transform(({ value }) => trim(value)) + @IsNotEmpty({ message: 'webhookUrl is required.' }) + @IsString({ message: 'webhookUrl must be in string format.' }) + webhookUrl: string; } diff --git a/apps/api-gateway/src/agent-service/index.ts b/apps/api-gateway/src/agent-service/index.ts new file mode 100644 index 000000000..c7112ea51 --- /dev/null +++ b/apps/api-gateway/src/agent-service/index.ts @@ -0,0 +1,5 @@ +export * from './agent-service.controller'; +export * from './agent-service.module'; +export * from './agent-service.service'; +export * from './dto'; +export * from './interface'; diff --git a/apps/api-gateway/src/agent-service/interface/index.ts b/apps/api-gateway/src/agent-service/interface/index.ts new file mode 100644 index 000000000..fb14a1fb2 --- /dev/null +++ b/apps/api-gateway/src/agent-service/interface/index.ts @@ -0,0 +1 @@ +export * from './agent-service.interface'; diff --git a/apps/api-gateway/src/agent/agent.controller.ts b/apps/api-gateway/src/agent/agent.controller.ts index 164437c87..0d397b175 100644 --- a/apps/api-gateway/src/agent/agent.controller.ts +++ b/apps/api-gateway/src/agent/agent.controller.ts @@ -16,34 +16,46 @@ import { HttpStatus } from '@nestjs/common'; import { AgentService } from './agent.service'; -import { ApiTags, ApiResponse, ApiOperation, ApiQuery, ApiBearerAuth, ApiParam, ApiUnauthorizedResponse, ApiForbiddenResponse, ApiExcludeEndpoint } from '@nestjs/swagger'; +import { + ApiTags, + ApiResponse, + ApiOperation, + ApiQuery, + ApiBearerAuth, + ApiParam, + ApiUnauthorizedResponse, + ApiForbiddenResponse, + ApiExcludeEndpoint +} from '@nestjs/swagger'; import { AuthGuard } from '@nestjs/passport'; import { WalletDetailsDto } from '../dtos/wallet-details.dto'; import { UnauthorizedErrorDto } from '../dtos/unauthorized-error.dto'; import { AgentActions } from '../dtos/enums'; import { RolesGuard } from '../authz/roles.guard'; -import { CommonConstants } from '@credebl/common/common.constant'; -import { booleanStatus, sortValue } from '../enum'; +import { CommonConstants } from '@credebl/common'; +import { booleanStatus } from '../enum'; import { ApiResponseDto } from '../dtos/apiResponse.dto'; import { ForbiddenErrorDto } from '../dtos/forbidden-error.dto'; -import { CommonService } from '@credebl/common'; +import { CommonService, SortValue } from '@credebl/common'; import { IUserRequestInterface } from '../interfaces/IUserRequestInterface'; import { User } from '../authz/decorators/user.decorator'; @ApiBearerAuth() @Controller('agent') export class AgentController { - constructor(private readonly agentService: AgentService, - private readonly commonService: CommonService) { } + constructor( + private readonly agentService: AgentService, + private readonly commonService: CommonService + ) {} private readonly logger = new Logger(); /** - * - * @param user - * @param _public - * @param verkey - * @param did + * + * @param user + * @param _public + * @param verkey + * @param did * @returns List of all the DID created for the current Cloud Agent. */ @Get('/wallet/did') @@ -68,8 +80,8 @@ export class AgentController { } /** - * - * @param user + * + * @param user * @returns Created DID */ @Post('/wallet/did/create') @@ -80,18 +92,16 @@ export class AgentController { @ApiResponse({ status: HttpStatus.CREATED, description: 'Success', type: ApiResponseDto }) @ApiUnauthorizedResponse({ status: HttpStatus.UNAUTHORIZED, description: 'Unauthorized', type: UnauthorizedErrorDto }) @ApiForbiddenResponse({ status: HttpStatus.FORBIDDEN, description: 'Forbidden', type: ForbiddenErrorDto }) - createLocalDid( - @User() user: any - ): Promise { + createLocalDid(@User() user: any): Promise { this.logger.log(`**** Create Local Did...`); return this.agentService.createLocalDid(user); } /** - * - * @param walletUserDetails - * @param user - * @returns + * + * @param walletUserDetails + * @param user + * @returns */ @Post('/wallet/provision') @ApiTags('agent') @@ -104,10 +114,7 @@ export class AgentController { @ApiResponse({ status: HttpStatus.CREATED, description: 'Success', type: ApiResponseDto }) @ApiUnauthorizedResponse({ status: HttpStatus.UNAUTHORIZED, description: 'Unauthorized', type: UnauthorizedErrorDto }) @ApiForbiddenResponse({ status: HttpStatus.FORBIDDEN, description: 'Forbidden', type: ForbiddenErrorDto }) - walletProvision( - @Body() walletUserDetails: WalletDetailsDto, - @User() user: object - ): Promise { + walletProvision(@Body() walletUserDetails: WalletDetailsDto, @User() user: object): Promise { this.logger.log(`**** Spin up the agent...${JSON.stringify(walletUserDetails)}`); const regex = new RegExp('^[a-zA-Z0-9]+$'); @@ -115,7 +122,7 @@ export class AgentController { this.logger.error(`Wallet name in wrong format.`); throw new BadRequestException(`Please enter valid wallet name, It allows only alphanumeric values`); } - const decryptedPassword = this.commonService.decryptPassword(walletUserDetails.walletPassword); + const decryptedPassword = this.commonService.decryptPassword(walletUserDetails.walletPassword); walletUserDetails.walletPassword = decryptedPassword; return this.agentService.walletProvision(walletUserDetails, user); } @@ -131,16 +138,14 @@ export class AgentController { @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) @ApiUnauthorizedResponse({ status: HttpStatus.UNAUTHORIZED, description: 'Unauthorized', type: UnauthorizedErrorDto }) @ApiForbiddenResponse({ status: HttpStatus.FORBIDDEN, description: 'Forbidden', type: ForbiddenErrorDto }) - getPublicDid( - @User() user: any - ): Promise { + getPublicDid(@User() user: any): Promise { this.logger.log(`**** Fetch public Did...`); return this.agentService.getPublicDid(user); } /** * Description: Route for assign public DID - * @param did + * @param did */ @Get('/wallet/did/public/:id') @ApiTags('agent') @@ -150,10 +155,7 @@ export class AgentController { @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) @ApiUnauthorizedResponse({ status: HttpStatus.UNAUTHORIZED, description: 'Unauthorized', type: UnauthorizedErrorDto }) @ApiForbiddenResponse({ status: HttpStatus.FORBIDDEN, description: 'Forbidden', type: ForbiddenErrorDto }) - assignPublicDid( - @Param('id') id: number, - @User() user: any - ): Promise { + assignPublicDid(@Param('id') id: number, @User() user: any): Promise { this.logger.log(`**** Assign public DID...`); this.logger.log(`user: ${user.orgId} == id: ${Number(id)}`); @@ -165,26 +167,25 @@ export class AgentController { } } - /** * Description: Route for onboarding register role on ledger - * @param role - * @param alias - * @param verkey - * @param did + * @param role + * @param alias + * @param verkey + * @param did */ @Get('/ledger/register-nym/:id') @ApiTags('agent') @UseGuards(AuthGuard('jwt'), RolesGuard) @SetMetadata('permissions', [CommonConstants.PERMISSION_ORG_MGMT]) - @ApiOperation({ summary: 'Send a NYM registration to the ledger', description: 'Write the DID to the ledger to make that DID public.' }) + @ApiOperation({ + summary: 'Send a NYM registration to the ledger', + description: 'Write the DID to the ledger to make that DID public.' + }) @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) @ApiUnauthorizedResponse({ status: HttpStatus.UNAUTHORIZED, description: 'Unauthorized', type: UnauthorizedErrorDto }) @ApiForbiddenResponse({ status: HttpStatus.FORBIDDEN, description: 'Forbidden', type: ForbiddenErrorDto }) - registerNym( - @Param('id') id: string, - @User() user: IUserRequestInterface - ): Promise { + registerNym(@Param('id') id: string, @User() user: IUserRequestInterface): Promise { this.logger.log(`user: ${typeof user.orgId} == id: ${typeof Number(id)}`); if (user.orgId !== id) { @@ -255,7 +256,7 @@ export class AgentController { @ApiQuery({ name: 'page', required: false }) @ApiQuery({ name: 'search_text', required: false }) @ApiQuery({ name: 'status', required: false }) - @ApiQuery({ name: 'sortValue', enum: sortValue, required: false }) + @ApiQuery({ name: 'sortValue', enum: SortValue, required: false }) @ApiQuery({ name: 'status', enum: booleanStatus, required: false }) agentSpinupStatus( @Query('items_per_page') items_per_page: number, @@ -265,7 +266,6 @@ export class AgentController { @Query('status') status: any, @User() user: any ): Promise { - this.logger.log(`status: ${typeof status} ${status}`); items_per_page = items_per_page || 10; diff --git a/apps/api-gateway/src/agent/agent.module.ts b/apps/api-gateway/src/agent/agent.module.ts index a077d3615..79edd9886 100644 --- a/apps/api-gateway/src/agent/agent.module.ts +++ b/apps/api-gateway/src/agent/agent.module.ts @@ -1,13 +1,11 @@ -import { Module } from '@nestjs/common'; +import { Module, DynamicModule, Provider } from '@nestjs/common'; import { HttpModule } from '@nestjs/axios'; import { AgentController } from './agent.controller'; import { AgentService } from './agent.service'; import { ClientsModule } from '@nestjs/microservices'; -import { CommonModule } from '../../../../libs/common/src/common.module'; -import { CommonService } from '../../../../libs/common/src/common.service'; import { ConfigModule } from '@nestjs/config'; -import { commonNatsOptions } from 'libs/service/nats.options'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { commonNatsOptions } from '@credebl/common'; +import { NATSClient, CommonService, CommonModule } from '@credebl/common'; @Module({ imports: [ @@ -24,4 +22,30 @@ import { NATSClient } from '@credebl/common/NATSClient'; controllers: [AgentController], providers: [AgentService, CommonService, NATSClient] }) -export class AgentModule { } +export class AgentModule { + static register( + overrides: Provider[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + controllerOverrides: any[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + importedModules: any[] = [] + ): DynamicModule { + return { + module: AgentModule, + imports: [ + HttpModule, + ConfigModule.forRoot(), + ClientsModule.register([ + { + name: 'NATS_CLIENT', + ...commonNatsOptions('AGENT_SERVICE:REQUESTER') + }, + CommonModule + ]), + ...importedModules + ], + controllers: controllerOverrides.length ? controllerOverrides : [AgentController], + providers: [AgentService, CommonService, NATSClient, ...overrides] + }; + } +} diff --git a/apps/api-gateway/src/agent/agent.service.ts b/apps/api-gateway/src/agent/agent.service.ts index 7b4b63602..8eaca1ffc 100644 --- a/apps/api-gateway/src/agent/agent.service.ts +++ b/apps/api-gateway/src/agent/agent.service.ts @@ -5,10 +5,10 @@ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Injectable, Inject } from '@nestjs/common'; import { ClientProxy } from '@nestjs/microservices'; -import { BaseService } from 'libs/service/base.service'; +import { BaseService } from '@credebl/common'; import { WalletDetailsDto } from '../dtos/wallet-details.dto'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { NATSClient } from '@credebl/common'; @Injectable() export class AgentService extends BaseService { @@ -37,7 +37,8 @@ export class AgentService extends BaseService { */ createLocalDid(user: any) { this.logger.log('**** createLocalDid called...'); - return this.natsClient.sendNats(this.agentServiceProxy, 'create-local-did', user); + // return this.natsClient.sendNats(this.agentServiceProxy, 'create-local-did', user); + return this.natsClient.sendNats(this.agentServiceProxy, 'check-limit', { forwardTo: 'create-local-did' ,user}); } async walletProvision(walletUserDetails: WalletDetailsDto, user: any) { diff --git a/apps/api-gateway/src/agent/index.ts b/apps/api-gateway/src/agent/index.ts new file mode 100644 index 000000000..49cd719ce --- /dev/null +++ b/apps/api-gateway/src/agent/index.ts @@ -0,0 +1,3 @@ +export * from './agent.controller'; +export * from './agent.module'; +export * from './agent.service'; diff --git a/apps/api-gateway/src/app.module.ts b/apps/api-gateway/src/app.module.ts index 9994df54d..1c5810a06 100644 --- a/apps/api-gateway/src/app.module.ts +++ b/apps/api-gateway/src/app.module.ts @@ -1,6 +1,6 @@ -import { MiddlewareConsumer, Module, RequestMethod } from '@nestjs/common'; +import { DynamicModule, MiddlewareConsumer, Module, Provider, RequestMethod } from '@nestjs/common'; import { AgentController } from './agent/agent.controller'; -import { AgentModule } from './agent-service/agent-service.module'; +import { AgentServiceModule } from './agent-service/agent-service.module'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { AuthzMiddleware } from './authz/authz.middleware'; @@ -16,68 +16,87 @@ import { VerificationModule } from './verification/verification.module'; import { RevocationController } from './revocation/revocation.controller'; import { RevocationModule } from './revocation/revocation.module'; import { SchemaModule } from './schema/schema.module'; -// import { commonNatsOptions } from 'libs/service/nats.options'; import { UserModule } from './user/user.module'; import { ConnectionModule } from './connection/connection.module'; -import { getNatsOptions } from '@credebl/common/nats.config'; +import { getNatsOptions } from '@credebl/common'; import { CacheModule } from '@nestjs/cache-manager'; import * as redisStore from 'cache-manager-redis-store'; import { WebhookModule } from './webhook/webhook.module'; import { UtilitiesModule } from './utilities/utilities.module'; import { NotificationModule } from './notification/notification.module'; import { GeoLocationModule } from './geo-location/geo-location.module'; -import { CommonConstants, MICRO_SERVICE_NAME } from '@credebl/common/common.constant'; +import { CommonConstants, MICRO_SERVICE_NAME } from '@credebl/common'; import { CloudWalletModule } from './cloud-wallet/cloud-wallet.module'; -import { ContextModule } from '@credebl/context/contextModule'; -import { LoggerModule } from '@credebl/logger/logger.module'; -import { GlobalConfigModule } from '@credebl/config/global-config.module'; -import { ConfigModule as PlatformConfig } from '@credebl/config/config.module'; +import { ContextModule } from '@credebl/common'; +import { LoggerModule } from '@credebl/logger'; +import { GlobalConfigModule } from '@credebl/logger'; +import { ConfigModule as PlatformConfig } from '@credebl/logger'; +import { UserManagementModule } from '@credebl/user-management'; -@Module({ - imports: [ - ConfigModule.forRoot(), - ContextModule, - PlatformConfig, - LoggerModule, - ClientsModule.register([ - { - name: 'NATS_CLIENT', - transport: Transport.NATS, - options: getNatsOptions(CommonConstants.API_GATEWAY_SERVICE, process.env.API_GATEWAY_NKEY_SEED) - } - ]), - AgentModule, - PlatformModule, - AuthzModule, - CredentialDefinitionModule, - SchemaModule, - RevocationModule, - VerificationModule, - FidoModule, - OrganizationModule, - UserModule, - ConnectionModule, - IssuanceModule, - UtilitiesModule, - WebhookModule, - NotificationModule, - GlobalConfigModule, - CacheModule.register({ store: redisStore, host: process.env.REDIS_HOST, port: process.env.REDIS_PORT }), - GeoLocationModule, - CloudWalletModule - ], - controllers: [AppController], - providers: [ - AppService, - { - provide: MICRO_SERVICE_NAME, - useValue: 'APIGATEWAY' - } - ] -}) -export class AppModule { - configure(userContext: MiddlewareConsumer): void { - userContext +@Module({}) +export class APIGatewayModule { + static register( + overrides: Provider[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + controllerOverrides: any[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + importedModules: any[] = [] + ): DynamicModule { + return { + module: APIGatewayModule, + imports: [ + ConfigModule.forRoot(), + UserManagementModule, + ContextModule, + PlatformConfig, + LoggerModule, + GlobalConfigModule, + ClientsModule.register([ + { + name: 'NATS_CLIENT', + transport: Transport.NATS, + options: getNatsOptions(CommonConstants.API_GATEWAY_SERVICE, process.env.API_GATEWAY_NKEY_SEED) + } + ]), + AgentServiceModule, + PlatformModule, + AuthzModule, + CredentialDefinitionModule, + SchemaModule, + RevocationModule, + VerificationModule, + FidoModule, + OrganizationModule, + UserModule, + ConnectionModule, + IssuanceModule, + UtilitiesModule, + WebhookModule, + NotificationModule, + CloudWalletModule, + GeoLocationModule, + CacheModule.register({ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + store: redisStore as any, + host: process.env.REDIS_HOST, + port: process.env.REDIS_PORT + }), + ...importedModules + ], + controllers: controllerOverrides.length ? controllerOverrides : [AppController], + providers: [ + AppService, + { + provide: MICRO_SERVICE_NAME, + useValue: 'APIGATEWAY' + }, + ...overrides + ] + }; + } + + configure(consumer: MiddlewareConsumer): void { + consumer .apply(AuthzMiddleware) .exclude( { path: 'authz', method: RequestMethod.ALL }, diff --git a/apps/api-gateway/src/app.service.ts b/apps/api-gateway/src/app.service.ts index 095adb165..2e75d6130 100644 --- a/apps/api-gateway/src/app.service.ts +++ b/apps/api-gateway/src/app.service.ts @@ -1,6 +1,6 @@ import { Inject, Injectable } from '@nestjs/common'; import { ClientProxy } from '@nestjs/microservices'; -import { BaseService } from '../../../libs/service/base.service'; +import { BaseService } from '@credebl/common'; @Injectable() export class AppService extends BaseService { diff --git a/apps/api-gateway/src/authz/authz.controller.ts b/apps/api-gateway/src/authz/authz.controller.ts index 5821d6bed..8c9230358 100644 --- a/apps/api-gateway/src/authz/authz.controller.ts +++ b/apps/api-gateway/src/authz/authz.controller.ts @@ -12,43 +12,46 @@ import { UseFilters } from '@nestjs/common'; import { AuthzService } from './authz.service'; -import { CommonService } from '../../../../libs/common/src/common.service'; import { ApiBody, ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger'; import { ApiResponseDto } from '../dtos/apiResponse.dto'; import { UserEmailVerificationDto } from '../user/dto/create-user.dto'; -import IResponseType from '@credebl/common/interfaces/response.interface'; -import { ResponseMessages } from '@credebl/common/response-messages'; +import { ResponseType as IResponseType } from '@credebl/common'; +import { ResponseMessages, CommonService } from '@credebl/common'; import { Response } from 'express'; import { EmailVerificationDto } from '../user/dto/email-verify.dto'; import { AuthTokenResponse } from './dtos/auth-token-res.dto'; import { LoginUserDto } from '../user/dto/login-user.dto'; import { AddUserDetailsDto } from '../user/dto/add-user.dto'; -import { CustomExceptionFilter } from 'apps/api-gateway/common/exception-handler'; +import { CustomExceptionFilter } from '../common'; import { ResetPasswordDto } from './dtos/reset-password.dto'; import { ForgotPasswordDto } from './dtos/forgot-password.dto'; import { ResetTokenPasswordDto } from './dtos/reset-token-password'; import { RefreshTokenDto } from './dtos/refresh-token.dto'; - @Controller('auth') @ApiTags('auth') @UseFilters(CustomExceptionFilter) export class AuthzController { private logger = new Logger('AuthzController'); - constructor(private readonly authzService: AuthzService, - private readonly commonService: CommonService) { } + constructor( + private readonly authzService: AuthzService, + private readonly commonService: CommonService + ) {} /** * Verify user’s email address. - * + * * @param email The email address of the user. * @param verificationcode The verification code sent to the user's email. - * @returns Returns the email verification status. + * @returns Returns the email verification status. */ @Get('/verify') @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) - @ApiOperation({ summary: 'Verify user’s email', description: 'Checks if the provided verification code is valid for the given email.' }) + @ApiOperation({ + summary: 'Verify user’s email', + description: 'Checks if the provided verification code is valid for the given email.' + }) async verifyEmail(@Query() query: EmailVerificationDto, @Res() res: Response): Promise { await this.authzService.verifyEmail(query); const finalResponse: IResponseType = { @@ -60,11 +63,11 @@ export class AuthzController { } /** - * Sends a verification email to the user. - * - * @body UserEmailVerificationDto. - * @returns The status of the verification email. - */ + * Sends a verification email to the user. + * + * @body UserEmailVerificationDto. + * @returns The status of the verification email. + */ @Post('/verification-mail') @ApiResponse({ status: HttpStatus.CREATED, description: 'Created', type: ApiResponseDto }) @ApiOperation({ summary: 'Send verification email', description: 'Send verification email to new user' }) @@ -78,30 +81,32 @@ export class AuthzController { } /** - * Registers a new user on the platform. - * - * @body AddUserDetailsDto - * @returns User's registration status and user details - */ + * Registers a new user on the platform. + * + * @body AddUserDetailsDto + * @returns User's registration status and user details + */ @Post('/signup') @ApiResponse({ status: HttpStatus.CREATED, description: 'Created', type: ApiResponseDto }) - @ApiOperation({ summary: 'Register new user to platform', description: 'Register new user to platform with the provided details.' }) + @ApiOperation({ + summary: 'Register new user to platform', + description: 'Register new user to platform with the provided details.' + }) async addUserDetails(@Body() userInfo: AddUserDetailsDto, @Res() res: Response): Promise { const userData = await this.authzService.addUserDetails(userInfo); - const finalResponse = { - statusCode: HttpStatus.CREATED, - message: ResponseMessages.user.success.create, - data: userData - }; + const finalResponse = { + statusCode: HttpStatus.CREATED, + message: ResponseMessages.user.success.create, + data: userData + }; return res.status(HttpStatus.CREATED).json(finalResponse); - } /** - * Authenticates a user and returns an access token. - * - * @body LoginUserDto - * @returns User's access token details - */ + * Authenticates a user and returns an access token. + * + * @body LoginUserDto + * @returns User's access token details + */ @Post('/signin') @ApiOperation({ summary: 'Authenticate the user for the access', @@ -110,14 +115,13 @@ export class AuthzController { @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: AuthTokenResponse }) @ApiBody({ type: LoginUserDto }) async login(@Body() loginUserDto: LoginUserDto, @Res() res: Response): Promise { - if (loginUserDto.email) { const userData = await this.authzService.login(loginUserDto.email, loginUserDto.password); const finalResponse: IResponseType = { statusCode: HttpStatus.OK, message: ResponseMessages.user.success.login, - data: userData + data: userData as unknown as Record }; return res.status(HttpStatus.OK).json(finalResponse); @@ -126,36 +130,34 @@ export class AuthzController { } } - /** - * Resets user's password. - * - * @body ResetPasswordDto - * @returns The password reset status. - */ + * Resets user's password. + * + * @body ResetPasswordDto + * @returns The password reset status. + */ @Post('/reset-password') @ApiOperation({ summary: 'Reset password', description: 'Allows users to reset a new password which should be different form existing password.' - }) + }) @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) async resetPassword(@Body() resetPasswordDto: ResetPasswordDto, @Res() res: Response): Promise { - - const userData = await this.authzService.resetPassword(resetPasswordDto); - const finalResponse: IResponseType = { - statusCode: HttpStatus.OK, - message: ResponseMessages.user.success.resetPassword, - data: userData - }; - return res.status(HttpStatus.OK).json(finalResponse); + const userData = await this.authzService.resetPassword(resetPasswordDto); + const finalResponse: IResponseType = { + statusCode: HttpStatus.OK, + message: ResponseMessages.user.success.resetPassword, + data: userData as unknown as Record + }; + return res.status(HttpStatus.OK).json(finalResponse); } -/** - * Initiates the password reset process by sending a reset link to the user's email. - * - * @body ForgotPasswordDto - * @returns Status message indicating whether the reset link was sent successfully. - */ + /** + * Initiates the password reset process by sending a reset link to the user's email. + * + * @body ForgotPasswordDto + * @returns Status message indicating whether the reset link was sent successfully. + */ @Post('/forgot-password') @ApiOperation({ summary: 'Forgot password', @@ -163,23 +165,23 @@ export class AuthzController { }) @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) async forgotPassword(@Body() forgotPasswordDto: ForgotPasswordDto, @Res() res: Response): Promise { - const userData = await this.authzService.forgotPassword(forgotPasswordDto); - const finalResponse: IResponseType = { - statusCode: HttpStatus.OK, - message: ResponseMessages.user.success.resetPasswordLink, - data: userData - }; + const userData = await this.authzService.forgotPassword(forgotPasswordDto); + const finalResponse: IResponseType = { + statusCode: HttpStatus.OK, + message: ResponseMessages.user.success.resetPasswordLink, + data: userData as unknown as Record + }; - return res.status(HttpStatus.OK).json(finalResponse); + return res.status(HttpStatus.OK).json(finalResponse); } -/** - * Resets the user's password using a verification token. - * - * @param email The email address of the user. - * @body ResetTokenPasswordDto - * @returns Status message indicating whether the password reset was successful. - */ + /** + * Resets the user's password using a verification token. + * + * @param email The email address of the user. + * @body ResetTokenPasswordDto + * @returns Status message indicating whether the password reset was successful. + */ @Post('/password-reset/:email') @ApiOperation({ summary: 'Reset password with verification token', @@ -189,41 +191,38 @@ export class AuthzController { async resetNewPassword( @Param('email') email: string, @Body() resetTokenPasswordDto: ResetTokenPasswordDto, - @Res() res: Response): Promise { - resetTokenPasswordDto.email = email.trim(); - const userData = await this.authzService.resetNewPassword(resetTokenPasswordDto); - const finalResponse: IResponseType = { - statusCode: HttpStatus.OK, - message: ResponseMessages.user.success.resetPassword, - data: userData - }; - return res.status(HttpStatus.OK).json(finalResponse); + @Res() res: Response + ): Promise { + resetTokenPasswordDto.email = email.trim(); + const userData = await this.authzService.resetNewPassword(resetTokenPasswordDto); + const finalResponse: IResponseType = { + statusCode: HttpStatus.OK, + message: ResponseMessages.user.success.resetPassword, + data: userData as unknown as Record + }; + return res.status(HttpStatus.OK).json(finalResponse); } -/** - * Generates a new access token using a refresh token. - * - * @body RefreshTokenDto - * @returns New access token and its details. - */ + /** + * Generates a new access token using a refresh token. + * + * @body RefreshTokenDto + * @returns New access token and its details. + */ @Post('/refresh-token') @ApiOperation({ summary: 'Token from refresh token', description: 'Generates a new access token using a refresh token.' }) @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) - async refreshToken( - @Body() refreshTokenDto: RefreshTokenDto, - @Res() res: Response): Promise { - const tokenData = await this.authzService.refreshToken(refreshTokenDto.refreshToken); - const finalResponse: IResponseType = { - statusCode: HttpStatus.OK, - message: ResponseMessages.user.success.refreshToken, - data: tokenData - }; + async refreshToken(@Body() refreshTokenDto: RefreshTokenDto, @Res() res: Response): Promise { + const tokenData = await this.authzService.refreshToken(refreshTokenDto.refreshToken); + const finalResponse: IResponseType = { + statusCode: HttpStatus.OK, + message: ResponseMessages.user.success.refreshToken, + data: tokenData as unknown as Record + }; - return res.status(HttpStatus.OK).json(finalResponse); - + return res.status(HttpStatus.OK).json(finalResponse); } - -} \ No newline at end of file +} diff --git a/apps/api-gateway/src/authz/authz.middleware.ts b/apps/api-gateway/src/authz/authz.middleware.ts index fd961a937..0280f49a8 100644 --- a/apps/api-gateway/src/authz/authz.middleware.ts +++ b/apps/api-gateway/src/authz/authz.middleware.ts @@ -1,14 +1,8 @@ /* eslint-disable camelcase */ -import { - HttpException, - Injectable, - Logger, - NestMiddleware, - UnauthorizedException -} from '@nestjs/common'; +import { HttpException, Injectable, Logger, NestMiddleware, UnauthorizedException } from '@nestjs/common'; import { AuthzService } from './authz.service'; -import { CommonConstants } from '@credebl/common/common.constant'; +import { CommonConstants } from '@credebl/common'; import { ExtractJwt } from 'passport-jwt'; import { JwtService } from '@nestjs/jwt'; import { NextFunction } from 'express'; @@ -16,7 +10,7 @@ import { RequestingUser } from './dtos/requesting-user.dto'; @Injectable() export class AuthzMiddleware implements NestMiddleware { - constructor(private readonly authService: AuthzService) { } + constructor(private readonly authService: AuthzService) {} private readonly logger = new Logger('AuthzMiddleware'); /** @@ -27,11 +21,8 @@ export class AuthzMiddleware implements NestMiddleware { * @throws UnauthorizedException If the token is not found */ getPayload = (token: string): unknown => { - if (!token) { - throw new UnauthorizedException( - 'Authorization header does not contain a token' - ); + throw new UnauthorizedException('Authorization header does not contain a token'); } // ignore options since we don't need to verify here @@ -39,9 +30,7 @@ export class AuthzMiddleware implements NestMiddleware { const decoded = jwtService.decode(token, { complete: true }); if (!decoded) { - throw new UnauthorizedException( - 'Authorization header contains an invalid token' - ); + throw new UnauthorizedException('Authorization header contains an invalid token'); } return decoded['payload']; @@ -64,7 +53,7 @@ export class AuthzMiddleware implements NestMiddleware { const requestor = new RequestingUser(); const tenant = (await this.authService.getUserByKeycloakUserId(payload['sub']))?.response; - + if (tenant) { this.logger.log(`tenant this.authService.getUserByKeycloakUserId: ${tenant.keycloakUserId}`); this.logger.log(`tenant id: ${tenant.id}`); @@ -84,7 +73,6 @@ export class AuthzMiddleware implements NestMiddleware { if (item.organization.orgRole.id == CommonConstants.ORG_TENANT_ROLE) { this.logger.log(`In Tenant Org matched id : ${item.organization.id}`); tenantOrgInfo = item.organization; - } } @@ -97,10 +85,7 @@ export class AuthzMiddleware implements NestMiddleware { } else { requestor.email = payload['email']; - const userData - = ( - await this.authService.getUserByKeycloakUserId(payload['sub']) - )?.response; + const userData = (await this.authService.getUserByKeycloakUserId(payload['sub']))?.response; this.logger.debug(`User by keycloak ID ${userData.id}`); @@ -120,11 +105,7 @@ export class AuthzMiddleware implements NestMiddleware { next(); } catch (error) { - this.logger.error( - `RequestorMiddleware Error in middleware: ${error} ${JSON.stringify( - error - )}` - ); + this.logger.error(`RequestorMiddleware Error in middleware: ${error} ${JSON.stringify(error)}`); next(new HttpException(error, 500)); } } diff --git a/apps/api-gateway/src/authz/authz.module.ts b/apps/api-gateway/src/authz/authz.module.ts index 78b862ca0..ecaa1d1a7 100644 --- a/apps/api-gateway/src/authz/authz.module.ts +++ b/apps/api-gateway/src/authz/authz.module.ts @@ -3,23 +3,21 @@ import { ClientsModule, Transport } from '@nestjs/microservices'; import { AgentService } from '../agent/agent.service'; import { AuthzController } from './authz.controller'; import { AuthzService } from './authz.service'; -import { CommonModule } from '../../../../libs/common/src/common.module'; -import { CommonService } from '../../../../libs/common/src/common.service'; import { ConnectionService } from '../connection/connection.service'; import { HttpModule } from '@nestjs/axios'; import { JwtStrategy } from './jwt.strategy'; import { MobileJwtStrategy } from './mobile-jwt.strategy'; -import { Module } from '@nestjs/common'; +import { Module, DynamicModule, Provider } from '@nestjs/common'; import { PassportModule } from '@nestjs/passport'; import { SocketGateway } from './socket.gateway'; -import { SupabaseService } from '@credebl/supabase'; +import { SupabaseService } from '@credebl/user-management'; import { UserModule } from '../user/user.module'; import { UserService } from '../user/user.service'; import { VerificationService } from '../verification/verification.service'; -import { getNatsOptions } from '@credebl/common/nats.config'; +import { getNatsOptions } from '@credebl/common'; import { OrganizationService } from '../organization/organization.service'; -import { CommonConstants } from '@credebl/common/common.constant'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { CommonConstants, CommonService, CommonModule } from '@credebl/common'; +import { NATSClient } from '@credebl/common'; @Module({ imports: [ @@ -38,6 +36,7 @@ import { NATSClient } from '@credebl/common/NATSClient'; ]), UserModule ], + controllers: [AuthzController], providers: [ JwtStrategy, AuthzService, @@ -52,10 +51,52 @@ import { NATSClient } from '@credebl/common/NATSClient'; SupabaseService, OrganizationService ], - exports: [ - PassportModule, - AuthzService - ], - controllers: [AuthzController] + exports: [PassportModule, AuthzService] }) -export class AuthzModule { } \ No newline at end of file +export class AuthzModule { + static register( + overrides: Provider[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + controllerOverrides: any[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + importedModules: any[] = [] + ): DynamicModule { + return { + module: AuthzModule, + imports: [ + HttpModule, + PassportModule.register({ + defaultStrategy: 'jwt', + mobileStrategy: 'mobile-jwt' + }), + ClientsModule.register([ + { + name: 'NATS_CLIENT', + transport: Transport.NATS, + options: getNatsOptions(CommonConstants.AUTH_SERVICE, process.env.API_GATEWAY_NKEY_SEED) + }, + CommonModule + ]), + UserModule, + ...importedModules + ], + controllers: controllerOverrides.length ? controllerOverrides : [AuthzController], + providers: [ + JwtStrategy, + AuthzService, + MobileJwtStrategy, + SocketGateway, + NATSClient, + VerificationService, + ConnectionService, + AgentService, + CommonService, + UserService, + SupabaseService, + OrganizationService, + ...overrides + ], + exports: [PassportModule, AuthzService] + }; + } +} diff --git a/apps/api-gateway/src/authz/authz.service.ts b/apps/api-gateway/src/authz/authz.service.ts index 83d4d8358..84ded83d0 100644 --- a/apps/api-gateway/src/authz/authz.service.ts +++ b/apps/api-gateway/src/authz/authz.service.ts @@ -1,19 +1,21 @@ import { Injectable, Inject } from '@nestjs/common'; import { ClientProxy } from '@nestjs/microservices'; -import { BaseService } from '../../../../libs/service/base.service'; -import { - WebSocketGateway, - WebSocketServer - -} from '@nestjs/websockets'; +import { WebSocketGateway, WebSocketServer } from '@nestjs/websockets'; import { UserEmailVerificationDto } from '../user/dto/create-user.dto'; import { EmailVerificationDto } from '../user/dto/email-verify.dto'; import { AddUserDetailsDto } from '../user/dto/add-user.dto'; -import { IResetPasswordResponse, ISendVerificationEmail, ISignInUser, ISignUpUserResponse, IVerifyUserEmail } from '@credebl/common/interfaces/user.interface'; +import { + IResetPasswordResponse, + ISendVerificationEmail, + ISignInUser, + ISignUpUserResponse, + IVerifyUserEmail, + BaseService +} from '@credebl/common'; import { ResetPasswordDto } from './dtos/reset-password.dto'; import { ForgotPasswordDto } from './dtos/forgot-password.dto'; import { ResetTokenPasswordDto } from './dtos/reset-token-password'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { NATSClient } from '@credebl/common'; @Injectable() @WebSocketGateway() @@ -22,9 +24,8 @@ export class AuthzService extends BaseService { @WebSocketServer() server; constructor( @Inject('NATS_CLIENT') private readonly authServiceProxy: ClientProxy, - private readonly natsClient : NATSClient + private readonly natsClient: NATSClient ) { - super('AuthzService'); } @@ -47,11 +48,11 @@ export class AuthzService extends BaseService { const payload = { email, password, isPasskey }; return this.natsClient.sendNatsMessage(this.authServiceProxy, 'user-holder-login', payload); } - + async resetPassword(resetPasswordDto: ResetPasswordDto): Promise { return this.natsClient.sendNatsMessage(this.authServiceProxy, 'user-reset-password', resetPasswordDto); } - + async forgotPassword(forgotPasswordDto: ForgotPasswordDto): Promise { return this.natsClient.sendNatsMessage(this.authServiceProxy, 'user-forgot-password', forgotPasswordDto); } @@ -68,4 +69,4 @@ export class AuthzService extends BaseService { const payload = { userInfo }; return this.natsClient.sendNatsMessage(this.authServiceProxy, 'add-user', payload); } -} \ No newline at end of file +} diff --git a/apps/api-gateway/src/authz/decorators/index.ts b/apps/api-gateway/src/authz/decorators/index.ts new file mode 100644 index 000000000..4bd2de405 --- /dev/null +++ b/apps/api-gateway/src/authz/decorators/index.ts @@ -0,0 +1,3 @@ +export * from './get-user.decorator'; +export * from './roles.decorator'; +export * from './user.decorator'; diff --git a/apps/api-gateway/src/authz/decorators/roles.decorator.ts b/apps/api-gateway/src/authz/decorators/roles.decorator.ts index d6a2bd27b..84c9c5c1e 100644 --- a/apps/api-gateway/src/authz/decorators/roles.decorator.ts +++ b/apps/api-gateway/src/authz/decorators/roles.decorator.ts @@ -1,8 +1,10 @@ import { CustomDecorator } from '@nestjs/common'; -import { OrgRoles } from 'libs/org-roles/enums'; +import { OrgRoles } from '@credebl/common'; import { SetMetadata } from '@nestjs/common'; export const ROLES_KEY = 'roles'; export const Roles = (...roles: OrgRoles[]): CustomDecorator => SetMetadata(ROLES_KEY, roles); -export const Permissions = (...permissions: string[]): CustomDecorator => SetMetadata('permissions', permissions); -export const Subscriptions = (...subscriptions: string[]): CustomDecorator => SetMetadata('subscriptions', subscriptions); +export const Permissions = (...permissions: string[]): CustomDecorator => + SetMetadata('permissions', permissions); +export const Subscriptions = (...subscriptions: string[]): CustomDecorator => + SetMetadata('subscriptions', subscriptions); diff --git a/apps/api-gateway/src/authz/dtos/forgot-password.dto.ts b/apps/api-gateway/src/authz/dtos/forgot-password.dto.ts index e9bcfcaa2..5c7e3c731 100644 --- a/apps/api-gateway/src/authz/dtos/forgot-password.dto.ts +++ b/apps/api-gateway/src/authz/dtos/forgot-password.dto.ts @@ -2,37 +2,39 @@ import { IsEmail, IsNotEmpty, IsOptional, IsString, IsUrl } from 'class-validato import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { Transform } from 'class-transformer'; -import { trim } from '@credebl/common/cast.helper'; +import { trim } from '@credebl/common'; export class ForgotPasswordDto { - @ApiProperty({ example: 'awqx@yopmail.com' }) - @IsEmail({}, { message: 'Please provide a valid email' }) - @IsNotEmpty({ message: 'Email is required' }) - @IsString({ message: 'Email should be a string' }) - @Transform(({ value }) => trim(value)) - email: string; + @ApiProperty({ example: 'awqx@yopmail.com' }) + @IsEmail({}, { message: 'Please provide a valid email' }) + @IsNotEmpty({ message: 'Email is required' }) + @IsString({ message: 'Email should be a string' }) + @Transform(({ value }) => trim(value)) + email: string; - @ApiPropertyOptional({ example: 'https://example.com/logo.png' }) - @Transform(({ value }) => trim(value)) - @IsOptional() - @IsUrl({ - // eslint-disable-next-line camelcase - require_protocol: true, - // eslint-disable-next-line camelcase + @ApiPropertyOptional({ example: 'https://example.com/logo.png' }) + @Transform(({ value }) => trim(value)) + @IsOptional() + @IsUrl( + { + // eslint-disable-next-line camelcase + require_protocol: true, + // eslint-disable-next-line camelcase require_tld: true }, - { message: 'brandLogoUrl should be a valid URL' }) - brandLogoUrl?: string; + { message: 'brandLogoUrl should be a valid URL' } + ) + brandLogoUrl?: string; - @ApiPropertyOptional({ example: 'MyPlatform' }) - @Transform(({ value }) => trim(value)) - @IsOptional() - @IsString({ message: 'platformName should be string' }) - platformName?: string; + @ApiPropertyOptional({ example: 'MyPlatform' }) + @Transform(({ value }) => trim(value)) + @IsOptional() + @IsString({ message: 'platformName should be string' }) + platformName?: string; - @ApiPropertyOptional({ example: 'https://0.0.0.0:5000' }) - @Transform(({ value }) => trim(value)) - @IsOptional() - @IsString({ message: 'endpoint should be string' }) - endpoint?: string; -} \ No newline at end of file + @ApiPropertyOptional({ example: 'https://0.0.0.0:5000' }) + @Transform(({ value }) => trim(value)) + @IsOptional() + @IsString({ message: 'endpoint should be string' }) + endpoint?: string; +} diff --git a/apps/api-gateway/src/authz/dtos/index.ts b/apps/api-gateway/src/authz/dtos/index.ts new file mode 100644 index 000000000..fed4d6818 --- /dev/null +++ b/apps/api-gateway/src/authz/dtos/index.ts @@ -0,0 +1,10 @@ +export * from './auth-token-res.dto'; +export * from './client-login.dto'; +export * from './firebase-token.dto'; +export * from './forgot-password.dto'; +export * from './refresh-token.dto'; +export * from './requesting-user.dto'; +export * from './reset-password.dto'; +export * from './reset-token-password'; +export * from './user-login.dto'; +export * from './user-role-org-perms.dto'; diff --git a/apps/api-gateway/src/authz/dtos/refresh-token.dto.ts b/apps/api-gateway/src/authz/dtos/refresh-token.dto.ts index e9ad0f6fa..676832c19 100644 --- a/apps/api-gateway/src/authz/dtos/refresh-token.dto.ts +++ b/apps/api-gateway/src/authz/dtos/refresh-token.dto.ts @@ -2,13 +2,11 @@ import { IsNotEmpty } from 'class-validator'; import { ApiProperty } from '@nestjs/swagger'; import { Transform } from 'class-transformer'; -import { trim } from '@credebl/common/cast.helper'; +import { trim } from '@credebl/common'; export class RefreshTokenDto { - - @ApiProperty() - @Transform(({ value }) => trim(value)) - @IsNotEmpty({ message: 'refreshToken is required.' }) - refreshToken: string; - -} \ No newline at end of file + @ApiProperty() + @Transform(({ value }) => trim(value)) + @IsNotEmpty({ message: 'refreshToken is required.' }) + refreshToken: string; +} diff --git a/apps/api-gateway/src/authz/dtos/reset-password.dto.ts b/apps/api-gateway/src/authz/dtos/reset-password.dto.ts index f2fc18aa0..89aa2c0ef 100644 --- a/apps/api-gateway/src/authz/dtos/reset-password.dto.ts +++ b/apps/api-gateway/src/authz/dtos/reset-password.dto.ts @@ -2,24 +2,23 @@ import { IsEmail, IsNotEmpty, IsString } from 'class-validator'; import { ApiProperty } from '@nestjs/swagger'; import { Transform } from 'class-transformer'; -import { trim } from '@credebl/common/cast.helper'; +import { trim } from '@credebl/common'; export class ResetPasswordDto { - @ApiProperty({ example: 'awqx@yopmail.com' }) - @IsEmail({}, { message: 'Please provide a valid email' }) - @IsNotEmpty({ message: 'Email is required' }) - @IsString({ message: 'Email should be a string' }) - @Transform(({ value }) => trim(value)) - email: string; + @ApiProperty({ example: 'awqx@yopmail.com' }) + @IsEmail({}, { message: 'Please provide a valid email' }) + @IsNotEmpty({ message: 'Email is required' }) + @IsString({ message: 'Email should be a string' }) + @Transform(({ value }) => trim(value)) + email: string; - @ApiProperty() - @Transform(({ value }) => trim(value)) - @IsNotEmpty({ message: 'oldPassword is required.' }) - oldPassword: string; + @ApiProperty() + @Transform(({ value }) => trim(value)) + @IsNotEmpty({ message: 'oldPassword is required.' }) + oldPassword: string; - @ApiProperty() - @Transform(({ value }) => trim(value)) - @IsNotEmpty({ message: 'newPassword is required.' }) - newPassword?: string; - -} \ No newline at end of file + @ApiProperty() + @Transform(({ value }) => trim(value)) + @IsNotEmpty({ message: 'newPassword is required.' }) + newPassword?: string; +} diff --git a/apps/api-gateway/src/authz/dtos/reset-token-password.ts b/apps/api-gateway/src/authz/dtos/reset-token-password.ts index dfcecd59f..6ce80f699 100644 --- a/apps/api-gateway/src/authz/dtos/reset-token-password.ts +++ b/apps/api-gateway/src/authz/dtos/reset-token-password.ts @@ -2,21 +2,18 @@ import { IsNotEmpty } from 'class-validator'; import { ApiProperty } from '@nestjs/swagger'; import { Transform } from 'class-transformer'; -import { trim } from '@credebl/common/cast.helper'; +import { trim } from '@credebl/common'; export class ResetTokenPasswordDto { - - email: string; + email: string; - @ApiProperty() - @Transform(({ value }) => trim(value)) - @IsNotEmpty({ message: 'password is required.' }) - password: string; + @ApiProperty() + @Transform(({ value }) => trim(value)) + @IsNotEmpty({ message: 'password is required.' }) + password: string; - @ApiProperty() - @Transform(({ value }) => trim(value)) - @IsNotEmpty({ message: 'token is required.' }) - token: string; - - -} \ No newline at end of file + @ApiProperty() + @Transform(({ value }) => trim(value)) + @IsNotEmpty({ message: 'token is required.' }) + token: string; +} diff --git a/apps/api-gateway/src/authz/guards/index.ts b/apps/api-gateway/src/authz/guards/index.ts new file mode 100644 index 000000000..b2d279ef6 --- /dev/null +++ b/apps/api-gateway/src/authz/guards/index.ts @@ -0,0 +1,3 @@ +export * from './org-roles.guard'; +export * from './user-access-guard'; +export * from './user-role.guard'; diff --git a/apps/api-gateway/src/authz/guards/org-roles.guard.ts b/apps/api-gateway/src/authz/guards/org-roles.guard.ts index a5b9c5119..ad5f69f55 100644 --- a/apps/api-gateway/src/authz/guards/org-roles.guard.ts +++ b/apps/api-gateway/src/authz/guards/org-roles.guard.ts @@ -1,15 +1,14 @@ import { BadRequestException, CanActivate, ExecutionContext, ForbiddenException, Logger } from '@nestjs/common'; import { Injectable } from '@nestjs/common'; -import { OrgRoles } from 'libs/org-roles/enums'; +import { OrgRoles } from '@credebl/common'; import { ROLES_KEY } from '../decorators/roles.decorator'; import { Reflector } from '@nestjs/core'; -import { ResponseMessages } from '@credebl/common/response-messages'; +import { ResponseMessages } from '@credebl/common'; import { validate as isValidUUID } from 'uuid'; @Injectable() export class OrgRolesGuard implements CanActivate { - constructor(private reflector: Reflector) { } // eslint-disable-next-line array-callback-return - + constructor(private reflector: Reflector) {} // eslint-disable-next-line array-callback-return private logger = new Logger('Org Role Guard'); async canActivate(context: ExecutionContext): Promise { @@ -25,7 +24,7 @@ export class OrgRolesGuard implements CanActivate { const req = context.switchToHttp().getRequest(); const { user } = req; - + if (user?.userRole && user?.userRole.includes('holder')) { throw new ForbiddenException('This role is a holder.'); } @@ -36,22 +35,23 @@ export class OrgRolesGuard implements CanActivate { const orgId = req.params.orgId || req.query.orgId || req.body.orgId; - if (orgId) { - - if (!isValidUUID(orgId)) { - throw new BadRequestException(ResponseMessages.organisation.error.invalidOrgId); - } - - - if (user.hasOwnProperty('resource_access') && user.resource_access[orgId]) { - const orgRoles: string[] = user.resource_access[orgId].roles; - const roleAccess = requiredRoles.some((role) => orgRoles.includes(role)); - - if (!roleAccess) { - throw new ForbiddenException(ResponseMessages.organisation.error.roleNotMatch, { cause: new Error(), description: ResponseMessages.errorMessages.forbidden }); - } - return roleAccess; + if (orgId) { + if (!isValidUUID(orgId)) { + throw new BadRequestException(ResponseMessages.organisation.error.invalidOrgId); + } + + if (user.hasOwnProperty('resource_access') && user.resource_access[orgId]) { + const orgRoles: string[] = user.resource_access[orgId].roles; + const roleAccess = requiredRoles.some((role) => orgRoles.includes(role)); + + if (!roleAccess) { + throw new ForbiddenException(ResponseMessages.organisation.error.roleNotMatch, { + cause: new Error(), + description: ResponseMessages.errorMessages.forbidden + }); } + return roleAccess; + } const specificOrg = user.userOrgRoles.find((orgDetails) => { if (!orgDetails.orgId) { @@ -59,9 +59,12 @@ export class OrgRolesGuard implements CanActivate { } return orgDetails.orgId.toString().trim() === orgId.toString().trim(); }); - + if (!specificOrg) { - throw new ForbiddenException(ResponseMessages.organisation.error.orgNotMatch, { cause: new Error(), description: ResponseMessages.errorMessages.forbidden }); + throw new ForbiddenException(ResponseMessages.organisation.error.orgNotMatch, { + cause: new Error(), + description: ResponseMessages.errorMessages.forbidden + }); } user.selectedOrg = specificOrg; @@ -71,9 +74,7 @@ export class OrgRolesGuard implements CanActivate { return orgRoleItem.orgRole.name; } }); - - } else if (requiredRolesNames.includes(OrgRoles.PLATFORM_ADMIN)) { - + } else if (requiredRolesNames.includes(OrgRoles.PLATFORM_ADMIN)) { // eslint-disable-next-line array-callback-return const isPlatformAdmin = user.userOrgRoles.find((orgDetails) => { if (orgDetails.orgRole.name === OrgRoles.PLATFORM_ADMIN) { @@ -86,7 +87,6 @@ export class OrgRolesGuard implements CanActivate { } return false; - } else { throw new BadRequestException('Please provide valid orgId'); } @@ -94,9 +94,12 @@ export class OrgRolesGuard implements CanActivate { // Sending user friendly message if a user attempts to access an API that is inaccessible to their role const roleAccess = requiredRoles.some((role) => user.selectedOrg?.orgRoles.includes(role)); if (!roleAccess) { - throw new ForbiddenException(ResponseMessages.organisation.error.roleNotMatch, { cause: new Error(), description: ResponseMessages.errorMessages.forbidden }); + throw new ForbiddenException(ResponseMessages.organisation.error.roleNotMatch, { + cause: new Error(), + description: ResponseMessages.errorMessages.forbidden + }); } return roleAccess; } -} \ No newline at end of file +} diff --git a/apps/api-gateway/src/authz/index.ts b/apps/api-gateway/src/authz/index.ts new file mode 100644 index 000000000..857e64e9e --- /dev/null +++ b/apps/api-gateway/src/authz/index.ts @@ -0,0 +1,12 @@ +export * from './authz.controller'; +export * from './authz.middleware'; +export * from './authz.module'; +export * from './authz.service'; +export * from './jwt-payload.interface'; +export * from './jwt.strategy'; +export * from './mobile-jwt.strategy'; +export * from './roles.guard'; +export * from './guards'; +export * from './dtos'; +export * from './decorators'; +export * from './socket.gateway'; diff --git a/apps/api-gateway/src/authz/jwt.strategy.ts b/apps/api-gateway/src/authz/jwt.strategy.ts index a7bac5265..b015b6ef0 100644 --- a/apps/api-gateway/src/authz/jwt.strategy.ts +++ b/apps/api-gateway/src/authz/jwt.strategy.ts @@ -8,10 +8,10 @@ import { PassportStrategy } from '@nestjs/passport'; import { UserService } from '../user/user.service'; import * as jwt from 'jsonwebtoken'; import { passportJwtSecret } from 'jwks-rsa'; -import { CommonConstants } from '@credebl/common/common.constant'; +import { CommonConstants } from '@credebl/common'; import { OrganizationService } from '../organization/organization.service'; -import { IOrganization } from '@credebl/common/interfaces/organization.interface'; -import { ResponseMessages } from '@credebl/common/response-messages'; +import { IOrganization } from '@credebl/common'; +import { ResponseMessages } from '@credebl/common'; dotenv.config(); @@ -22,8 +22,7 @@ export class JwtStrategy extends PassportStrategy(Strategy) { constructor( private readonly usersService: UserService, private readonly organizationService: OrganizationService - ) { - + ) { super({ jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), secretOrKeyProvider: (request, jwtToken, done) => { @@ -49,26 +48,25 @@ export class JwtStrategy extends PassportStrategy(Strategy) { }); }, algorithms: ['RS256'] - }); + }); } async validate(payload: JwtPayload): Promise { - let userDetails = null; let userInfo; if (payload?.email) { userInfo = await this.usersService.getUserByUserIdInKeycloak(payload?.email); } - + if (payload.hasOwnProperty('client_id')) { const orgDetails: IOrganization = await this.organizationService.findOrganizationOwner(payload['client_id']); - + this.logger.log('Organization details fetched'); if (!orgDetails) { throw new NotFoundException(ResponseMessages.organisation.error.orgNotFound); } - + // eslint-disable-next-line prefer-destructuring const userOrgDetails = 0 < orgDetails.userOrgRoles.length && orgDetails.userOrgRoles[0]; @@ -83,11 +81,10 @@ export class JwtStrategy extends PassportStrategy(Strategy) { }); this.logger.log('User details set'); - } else { userDetails = await this.usersService.findUserinKeycloak(payload.sub); } - + if (!userDetails) { throw new NotFoundException(ResponseMessages.user.error.notFound); } diff --git a/apps/api-gateway/src/authz/mobile-jwt.strategy.ts b/apps/api-gateway/src/authz/mobile-jwt.strategy.ts index be5b49fc7..e036af911 100644 --- a/apps/api-gateway/src/authz/mobile-jwt.strategy.ts +++ b/apps/api-gateway/src/authz/mobile-jwt.strategy.ts @@ -2,13 +2,12 @@ import * as dotenv from 'dotenv'; import * as jwt from 'jsonwebtoken'; import { ExtractJwt, Strategy } from 'passport-jwt'; -import { BadRequestException, Injectable, Logger, UnauthorizedException } from '@nestjs/common'; +import { Injectable, Logger, UnauthorizedException } from '@nestjs/common'; -import { CommonConstants } from '@credebl/common/common.constant'; +import { CommonConstants } from '@credebl/common'; import { PassportStrategy } from '@nestjs/passport'; import { passportJwtSecret } from 'jwks-rsa'; dotenv.config(); -const logger = new Logger(); @Injectable() export class MobileJwtStrategy extends PassportStrategy(Strategy, 'mobile-jwt') { @@ -16,10 +15,9 @@ export class MobileJwtStrategy extends PassportStrategy(Strategy, 'mobile-jwt') constructor() { super({ - secretOrKeyProvider: (request, jwtToken, done) => { - const decodedToken: any = jwt.decode(jwtToken); - const audiance = decodedToken.iss.toString(); + const decodedToken = jwt.decode(jwtToken); + const audiance = decodedToken.iss.toString(); const jwtOptions = { cache: true, rateLimit: true, @@ -28,7 +26,7 @@ export class MobileJwtStrategy extends PassportStrategy(Strategy, 'mobile-jwt') }; const secretprovider = passportJwtSecret(jwtOptions); let certkey; - secretprovider(request, jwtToken, async (err, data) => { + secretprovider(request, jwtToken, async (err, data) => { certkey = data; done(null, certkey); }); @@ -38,14 +36,12 @@ export class MobileJwtStrategy extends PassportStrategy(Strategy, 'mobile-jwt') }); } + // eslint-disable-next-line @typescript-eslint/explicit-function-return-type, @typescript-eslint/no-explicit-any validate(payload: any) { if ('adeyaClient' !== payload.azp) { - throw new UnauthorizedException( - 'Authorization header contains an invalid token' - ); + throw new UnauthorizedException('Authorization header contains an invalid token'); } else { return payload; } - } } diff --git a/apps/api-gateway/src/boostrap.ts b/apps/api-gateway/src/boostrap.ts new file mode 100644 index 000000000..f2995abb2 --- /dev/null +++ b/apps/api-gateway/src/boostrap.ts @@ -0,0 +1,144 @@ +import * as dotenv from 'dotenv'; +import * as express from 'express'; +import helmet from 'helmet'; + +import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; +import { INestApplication, Logger, Provider, VERSION_NEUTRAL, VersioningType } from '@nestjs/common'; +import { APIGatewayModule } from './app.module'; +import { HttpAdapterHost, NestFactory, Reflector } from '@nestjs/core'; +import { + AllExceptionsFilter, + CommonConstants, + getNatsOptions, + NatsInterceptor, + UpdatableValidationPipe +} from '@credebl/common'; +import { NestjsLoggerServiceAdapter } from '@credebl/logger'; +import { MicroserviceOptions, Transport } from '@nestjs/microservices'; + +dotenv.config(); + +interface AppModuleRegisterOptions { + overrides: Provider[]; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + controllerOverrides: any[]; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + importedModules: any[]; +} + +export async function createApiGateway(options: AppModuleRegisterOptions): Promise { + // Call register and get a configured module + const moduleRef = APIGatewayModule.register(options.overrides, options.controllerOverrides, options.importedModules); + + const app = await NestFactory.create(moduleRef); + + app.useLogger(app.get(NestjsLoggerServiceAdapter)); + + app.connectMicroservice({ + transport: Transport.NATS, + options: getNatsOptions(CommonConstants.API_GATEWAY_SERVICE, process.env.API_GATEWAY_NKEY_SEED) + }); + + const expressApp = app.getHttpAdapter().getInstance(); + expressApp.set('x-powered-by', false); + app.use(express.json({ limit: '100mb' })); + app.use(express.urlencoded({ limit: '100mb', extended: true })); + + app.use((req, res, next) => { + try { + decodeURIComponent(req.path); + next(); + } catch { + return res.status(500).json({ message: 'Invalid URL' }); + } + }); + + const optionsBuilder = new DocumentBuilder() + .setTitle(`${process.env.PLATFORM_NAME}`) + .setDescription(`${process.env.PLATFORM_NAME} Platform APIs`) + .setVersion('1.0') + .addBearerAuth() + .addServer(`${process.env.PUBLIC_DEV_API_URL}`) + .addServer(`${process.env.PUBLIC_LOCALHOST_URL}`) + .addServer(`${process.env.PUBLIC_QA_API_URL}`) + .addServer(`${process.env.PUBLIC_PRODUCTION_API_URL}`) + .addServer(`${process.env.PUBLIC_SANDBOX_API_URL}`) + .addServer(`${process.env.API_GATEWAY_PROTOCOL}://${process.env.API_ENDPOINT}`) + .addServer(`${process.env.API_GATEWAY_PROTOCOL}://${process.env.API_GATEWAY_HOST}`); + + const swaggerOptions = optionsBuilder.build(); + + app.enableVersioning({ + type: VersioningType.URI, + defaultVersion: ['1'] + }); + + const document = SwaggerModule.createDocument(app, swaggerOptions); + SwaggerModule.setup('api', app, document); + + const httpAdapter = app.get(HttpAdapterHost); + app.useGlobalFilters(new AllExceptionsFilter(httpAdapter)); + + const { ENABLE_CORS_IP_LIST } = process.env || {}; + if (ENABLE_CORS_IP_LIST && '' !== ENABLE_CORS_IP_LIST) { + app.enableCors({ + origin: ENABLE_CORS_IP_LIST.split(','), + methods: 'GET,HEAD,PUT,PATCH,POST,DELETE', + credentials: true + }); + } + + app.enableVersioning({ + type: VersioningType.URI, + defaultVersion: ['1', VERSION_NEUTRAL] + }); + + const staticDirs = [ + 'uploadedFiles/holder-profile', + 'uploadedFiles/org-logo', + 'uploadedFiles/tenant-logo', + 'uploadedFiles/exports', + 'resources', + 'genesis-file', + 'invoice-pdf', + 'uploadedFiles/bulk-verification-templates', + 'uploadedFiles/import' + ]; + staticDirs.forEach((dir) => app.use(express.static(dir))); + + const reflector = app.get(Reflector); + app.useGlobalPipes(new UpdatableValidationPipe(reflector, { whitelist: true, transform: true })); + + app.use(helmet({ xssFilter: true })); + + app.useGlobalInterceptors(new NatsInterceptor()); + + return app; +} + +/** + * Create + start the API Gateway (both HTTP + microservices). + * Returns the started app. + */ +export async function bootstrapApiGateway( + host?: string | number, + options: AppModuleRegisterOptions = { + overrides: [], + controllerOverrides: [], + importedModules: [] + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any +): Promise> { + const port = process.env.API_GATEWAY_PORT ?? host ?? 5000; + const app = await createApiGateway(options); + + // start microservices first + await app.init(); // ensure all modules/microservices configured + await app.startAllMicroservices(); + + // start http server + await app.listen(Number(port), process.env.API_GATEWAY_HOST); + Logger.log(`API Gateway is listening on port ${port}`); + + return app; +} diff --git a/apps/api-gateway/src/cloud-wallet/cloud-wallet.controller.ts b/apps/api-gateway/src/cloud-wallet/cloud-wallet.controller.ts index 393cbb536..d51804f65 100644 --- a/apps/api-gateway/src/cloud-wallet/cloud-wallet.controller.ts +++ b/apps/api-gateway/src/cloud-wallet/cloud-wallet.controller.ts @@ -1,26 +1,61 @@ -import { IResponse } from '@credebl/common/interfaces/response.interface'; -import { ResponseMessages } from '@credebl/common/response-messages'; -import { Controller, Post, Logger, Body, HttpStatus, Res, UseFilters, UseGuards, Get, Param, Query, BadRequestException } from '@nestjs/common'; -import { ApiBearerAuth, ApiForbiddenResponse, ApiOperation, ApiQuery, ApiResponse, ApiTags, ApiUnauthorizedResponse } from '@nestjs/swagger'; +import { IResponse } from '@credebl/common'; +import { ResponseMessages } from '@credebl/common'; +import { + Controller, + Post, + Logger, + Body, + HttpStatus, + Res, + UseFilters, + UseGuards, + Get, + Param, + Query, + BadRequestException +} from '@nestjs/common'; +import { + ApiBearerAuth, + ApiForbiddenResponse, + ApiOperation, + ApiQuery, + ApiResponse, + ApiTags, + ApiUnauthorizedResponse +} from '@nestjs/swagger'; import { ForbiddenErrorDto } from '../dtos/forbidden-error.dto'; import { UnauthorizedErrorDto } from '../dtos/unauthorized-error.dto'; import { CloudWalletService } from './cloud-wallet.service'; -import { AcceptOfferDto, BasicMessageDTO, CreateCloudWalletDidDto, CreateCloudWalletDto, CredentialListDto, GetAllCloudWalletConnectionsDto, ReceiveInvitationUrlDTO } from './dtos/cloudWallet.dto'; +import { + AcceptOfferDto, + BasicMessageDTO, + CreateCloudWalletDidDto, + CreateCloudWalletDto, + CredentialListDto, + GetAllCloudWalletConnectionsDto, + ReceiveInvitationUrlDTO +} from './dtos/cloudWallet.dto'; import { Response } from 'express'; -import { CustomExceptionFilter } from 'apps/api-gateway/common/exception-handler'; +import { CustomExceptionFilter } from '../common'; import { ApiResponseDto } from '../dtos/apiResponse.dto'; import { CloudBaseWalletConfigureDto } from './dtos/configure-base-wallet.dto'; import { AuthGuard } from '@nestjs/passport'; import { User } from '../authz/decorators/user.decorator'; // eslint-disable-next-line @typescript-eslint/no-unused-vars -import { user } from '@prisma/client'; -import { Validator } from '@credebl/common/validator'; -import { CommonConstants } from '@credebl/common/common.constant'; +import { user } from '@credebl/prisma-service'; +import { Validator } from '@credebl/common'; +import { CommonConstants } from '@credebl/common'; import { UserRoleGuard } from '../authz/guards/user-role.guard'; import { AcceptProofRequestDto } from './dtos/accept-proof-request.dto'; -import { IBasicMessage, IConnectionDetailsById, ICredentialDetails, IGetProofPresentation, IGetProofPresentationById, IWalletDetailsForDidList } from '@credebl/common/interfaces/cloud-wallet.interface'; -import { CreateConnectionDto } from './dtos/create-connection.dto'; - +import { + IBasicMessage, + IConnectionDetailsById, + ICredentialDetails, + IGetProofPresentation, + IGetProofPresentationById, + IWalletDetailsForDidList +} from '@credebl/common'; +import { ClouWalletCreateConnectionDto } from './dtos/create-connection.dto'; @UseFilters(CustomExceptionFilter) @Controller() @@ -29,501 +64,557 @@ import { CreateConnectionDto } from './dtos/create-connection.dto'; @ApiUnauthorizedResponse({ status: HttpStatus.UNAUTHORIZED, description: 'Unauthorized', type: UnauthorizedErrorDto }) @ApiForbiddenResponse({ status: HttpStatus.FORBIDDEN, description: 'Forbidden', type: ForbiddenErrorDto }) export class CloudWalletController { - - private readonly logger = new Logger('cloud-wallet'); - constructor(private readonly cloudWalletService: CloudWalletService) { } - - /** - * Configure cloud base wallet - * @param cloudBaseWalletConfigure - * @param user - * @param res - * @returns success message - */ - @Post('/configure/base-wallet') - @ApiOperation({ summary: 'Configure Cloud Base Wallet', description: 'Endpoint to configure the base wallet for the cloud wallet service.' }) - @ApiResponse({ status: HttpStatus.CREATED, description: 'Base wallet configured successfully', type: ApiResponseDto }) - @UseGuards(AuthGuard('jwt')) - async configureBaseWallet( - @Res() res: Response, - @Body() cloudBaseWalletConfigure: CloudBaseWalletConfigureDto, - @User() user: user - ): Promise { - - const { id, email } = user; - - cloudBaseWalletConfigure.userId = id; - cloudBaseWalletConfigure.email = email; - - const configureBaseWalletData = await this.cloudWalletService.configureBaseWallet(cloudBaseWalletConfigure); - const finalResponse: IResponse = { - statusCode: HttpStatus.CREATED, - message: ResponseMessages.cloudWallet.success.configureBaseWallet, - data: configureBaseWalletData - }; - return res.status(HttpStatus.CREATED).json(finalResponse); - } - - /** - * Create cloud wallet - * @param cloudWalletDetails - * @param res - * @returns Success message and wallet details - */ - @Post('/create-wallet') - @ApiOperation({ summary: 'Create Cloud Wallet', description: 'Endpoint to create a new cloud wallet for the user.' }) - @ApiResponse({ status: HttpStatus.CREATED, description: 'Cloud wallet created successfully', type: ApiResponseDto }) - @ApiBearerAuth() - @UseGuards(AuthGuard('jwt'), UserRoleGuard) - async createCloudWallet( - @Res() res: Response, - @Body() cloudWalletDetails: CreateCloudWalletDto, - @User() user: user - ): Promise { - const {email, id} = user; - cloudWalletDetails.email = email; - cloudWalletDetails.userId = id; - const cloudWalletData = await this.cloudWalletService.createCloudWallet(cloudWalletDetails); - const finalResponse: IResponse = { - statusCode: HttpStatus.CREATED, - message: ResponseMessages.cloudWallet.success.create, - data: cloudWalletData - }; - return res.status(HttpStatus.CREATED).json(finalResponse); - - } - - /** - * Accept proof request - * @param acceptProofRequest - * @returns success message - */ - @Post('/proofs/accept-request') - @ApiOperation({ summary: 'Accept Proof Request', description: 'Endpoint to accept a proof request for the cloud wallet.' }) - @ApiResponse({ status: HttpStatus.CREATED, description: 'Proof request accepted successfully', type: ApiResponseDto }) - @UseGuards(AuthGuard('jwt'), UserRoleGuard) - async acceptProofRequest( - @Res() res: Response, - @Body() acceptProofRequest: AcceptProofRequestDto, - @User() user: user - ): Promise { - const { id, email } = user; - acceptProofRequest.userId = id; - acceptProofRequest.email = email; - - const acceptProofRequestDetails = await this.cloudWalletService.acceptProofRequest(acceptProofRequest); - const finalResponse: IResponse = { - statusCode: HttpStatus.CREATED, - message: ResponseMessages.cloudWallet.success.acceptProofRequest, - data: acceptProofRequestDetails - }; - return res.status(HttpStatus.CREATED).json(finalResponse); - } - - /** - * Get proof presentation by proof id - * @param proofRecordId - * @param res - * @returns success message - */ - @Get('/proofs/:proofRecordId') - @ApiOperation({ summary: 'Get Proof Presentation by ID', description: 'Endpoint to retrieve proof presentation details by proof record ID.' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Proof presentation retrieved successfully', type: ApiResponseDto }) - @UseGuards(AuthGuard('jwt'), UserRoleGuard) - async getProofById( - @Param('proofRecordId') proofRecordId: string, - @Res() res: Response, - @User() user: user - ): Promise { - const { id, email } = user; - - const proofPresentationByIdPayload: IGetProofPresentationById = { - userId: id, - email, - proofRecordId - }; - - const getProofDetails = await this.cloudWalletService.getProofById(proofPresentationByIdPayload); - const finalResponse: IResponse = { - statusCode: HttpStatus.OK, - message: ResponseMessages.cloudWallet.success.getProofById, - data: getProofDetails - }; - return res.status(HttpStatus.OK).json(finalResponse); - } - - /** - * Get proof presentations - * @param threadId - * @param res - * @returns success message - */ - @Get('/proofs') - @ApiOperation({ summary: 'Get Proof Presentations', description: 'Endpoint to retrieve all proof presentations, optionally filtered by thread ID.' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Proof presentations retrieved successfully', type: ApiResponseDto }) - @UseGuards(AuthGuard('jwt'), UserRoleGuard) - @ApiQuery({ - name: 'threadId', - required: false - }) - async getProofPresentation( - @Res() res: Response, - @User() user: user, - @Query('threadId') threadId?: string - ): Promise { - - const { id, email } = user; - - const proofPresentationPayload: IGetProofPresentation = { - userId: id, - email, - threadId - }; - - const getProofDetails = await this.cloudWalletService.getProofPresentation(proofPresentationPayload); - const finalResponse: IResponse = { - statusCode: HttpStatus.OK, - message: ResponseMessages.cloudWallet.success.getProofPresentation, - data: getProofDetails - }; - return res.status(HttpStatus.OK).json(finalResponse); - } - - /** - * Receive invitation by URL - * @param receiveInvitation - * @param res - * @returns Response from agent - */ - @Post('/receive-invitation-url') - @ApiOperation({ summary: 'Receive Invitation by URL', description: 'Endpoint to receive an invitation using a URL for the cloud wallet.' }) - @ApiResponse({ status: HttpStatus.CREATED, description: 'Invitation received successfully', type: ApiResponseDto }) - @ApiBearerAuth() - @UseGuards(AuthGuard('jwt'), UserRoleGuard) - async receiveInvitationByUrl( - @Res() res: Response, - @Body() receiveInvitation: ReceiveInvitationUrlDTO, - @User() user: user - ): Promise { - const {email, id} = user; - receiveInvitation.email = email; - receiveInvitation.userId = id; - const receiveInvitationData = await this.cloudWalletService.receiveInvitationByUrl(receiveInvitation); - const finalResponse: IResponse = { - statusCode: HttpStatus.CREATED, - message: ResponseMessages.cloudWallet.success.receive, - data: receiveInvitationData - }; - return res.status(HttpStatus.CREATED).json(finalResponse); - - } - - /** - * Accept offer - * @param acceptOffer - * @param res - * @returns Response from agent - */ - @Post('/accept-offer') - @ApiOperation({ summary: 'Accept Credential Offer', description: 'Endpoint to accept a credential offer for the cloud wallet.' }) - @ApiResponse({ status: HttpStatus.CREATED, description: 'Credential offer accepted successfully', type: ApiResponseDto }) - @ApiBearerAuth() - @UseGuards(AuthGuard('jwt'), UserRoleGuard) - async acceptOffer( - @Res() res: Response, - @Body() acceptOffer: AcceptOfferDto, - @User() user: user - ): Promise { - const {email, id} = user; - acceptOffer.email = email; - acceptOffer.userId = id; - const receiveInvitationData = await this.cloudWalletService.acceptOffer(acceptOffer); - const finalResponse: IResponse = { - statusCode: HttpStatus.CREATED, - message: ResponseMessages.cloudWallet.success.receive, - data: receiveInvitationData - }; - return res.status(HttpStatus.CREATED).json(finalResponse); - - } - - /** - * Create did - * @param createDidDto - * @param res - * @returns did - */ - @Post('/did') - @ApiOperation({ summary: 'Create DID', description: 'Endpoint to create a new DID (Decentralized Identifier) for the cloud wallet.' }) - @ApiResponse({ status: HttpStatus.CREATED, description: 'DID created successfully', type: ApiResponseDto }) - @ApiBearerAuth() - @UseGuards(AuthGuard('jwt'), UserRoleGuard) - async createDid( - @Body() createDidDto: CreateCloudWalletDidDto, - @User() user: user, - @Res() res: Response - ): Promise { - Validator.validateDid(createDidDto); - const {email, id} = user; - createDidDto.email = email; - createDidDto.userId = id; - if (createDidDto.seed && CommonConstants.SEED_LENGTH !== createDidDto.seed.length) { - throw new BadRequestException(ResponseMessages.agent.error.seedChar, { - cause: new Error(), - description: ResponseMessages.errorMessages.badRequest - }); - } - - const didDetails = await this.cloudWalletService.createDid(createDidDto); - - const finalResponse: IResponse = { - statusCode: HttpStatus.CREATED, - message: ResponseMessages.agent.success.createDid, - data: didDetails - }; - - return res.status(HttpStatus.CREATED).json(finalResponse); - } - - /** - * Get DID list by organization id - * @param res - * @returns DID list - */ - @Get('/did') - @ApiOperation({ summary: 'Get DID List', description: 'Endpoint to retrieve the list of DIDs associated with the cloud wallet.' }) - @ApiResponse({ status: HttpStatus.OK, description: 'DID list retrieved successfully', type: ApiResponseDto }) - @UseGuards(AuthGuard('jwt'), UserRoleGuard) - async getDidList( - @Res() res: Response, - @User() user: user - ): Promise { - const { id, email } = user; - - const walletDetails: IWalletDetailsForDidList = { - userId: id, - email - }; - - const didListDetails = await this.cloudWalletService.getDidList(walletDetails); - const finalResponse: IResponse = { - statusCode: HttpStatus.OK, - message: ResponseMessages.cloudWallet.success.didList, - data: didListDetails - }; - return res.status(HttpStatus.OK).json(finalResponse); - } - - /** - * Create connection invitation - * @param createConnection - * @param res - * @returns success message - */ - @Post('/connections/invitation') - @ApiOperation({ summary: 'Create Connection Invitation', description: 'Endpoint to create a connection invitation for the cloud wallet.' }) - @ApiResponse({ status: HttpStatus.CREATED, description: 'Connection invitation created successfully', type: ApiResponseDto }) - @UseGuards(AuthGuard('jwt'), UserRoleGuard) - async createConnection( - @Res() res: Response, - @Body() createConnection: CreateConnectionDto, - @User() user: user - ): Promise { - const { id, email } = user; - createConnection.userId = id; - createConnection.email = email; - - const createConnectionDetails = await this.cloudWalletService.createConnection(createConnection); - const finalResponse: IResponse = { - statusCode: HttpStatus.CREATED, - message: ResponseMessages.cloudWallet.success.createConnection, - data: createConnectionDetails - }; - return res.status(HttpStatus.CREATED).json(finalResponse); - } - - /** - * Get connection by connection id - * @param connectionId - * @param res - * @returns connection details - */ - @Get('/connection/:connectionId') - @ApiOperation({ summary: 'Get Connection by ID', description: 'Endpoint to retrieve connection details by connection ID.' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Connection details retrieved successfully', type: ApiResponseDto }) - @UseGuards(AuthGuard('jwt'), UserRoleGuard) - async getconnectionById( - @Param('connectionId') connectionId: string, - @Res() res: Response, - @User() user: user - ): Promise { - const { id, email } = user; - - const connectionDetails: IConnectionDetailsById = { - userId: id, - email, - connectionId - }; - - const connectionDetailResponse = await this.cloudWalletService.getconnectionById(connectionDetails); - const finalResponse: IResponse = { - statusCode: HttpStatus.OK, - message: ResponseMessages.cloudWallet.success.connectionById, - data: connectionDetailResponse - }; - return res.status(HttpStatus.OK).json(finalResponse); - } - - /** - * Get all wallet connections - * @param connectionListQueryOptions - * @param res - * @returns connection list - */ - @Get('/connections') - @ApiOperation({ summary: 'Get All Wallet Connections', description: 'Endpoint to retrieve all connections associated with the cloud wallet.' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Connections retrieved successfully', type: ApiResponseDto }) - @UseGuards(AuthGuard('jwt'), UserRoleGuard) - async getAllconnectionById( - @Query() connectionListQueryOptions: GetAllCloudWalletConnectionsDto, - @Res() res: Response, - @User() user: user - ): Promise { - const { id, email } = user; - - connectionListQueryOptions.userId = id; - connectionListQueryOptions.email = email; - - const connectionDetailResponse = await this.cloudWalletService.getAllconnectionById(connectionListQueryOptions); - const finalResponse: IResponse = { - statusCode: HttpStatus.OK, - message: ResponseMessages.cloudWallet.success.connectionList, - data: connectionDetailResponse - }; - return res.status(HttpStatus.OK).json(finalResponse); - } - - /** - * Get credential list by tenant id - * @param credentialListQueryOptions - * @param res - * @returns Credential list - */ - @Get('/credential') - @ApiOperation({ summary: 'Get Credential List', description: 'Endpoint to retrieve the list of credentials associated with the cloud wallet.' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Credential list retrieved successfully', type: ApiResponseDto }) - @UseGuards(AuthGuard('jwt'), UserRoleGuard) - async getCredentialList( - @Query() credentialListQueryOptions: CredentialListDto, - @Res() res: Response, - @User() user: user - ): Promise { - const { id, email } = user; - - credentialListQueryOptions.userId = id; - credentialListQueryOptions.email = email; - - const connectionDetailResponse = await this.cloudWalletService.getCredentialList(credentialListQueryOptions); - const finalResponse: IResponse = { - statusCode: HttpStatus.OK, - message: ResponseMessages.cloudWallet.success.credentials, - data: connectionDetailResponse - }; - return res.status(HttpStatus.OK).json(finalResponse); - } - - /** - * Get credential by credential record id - * @param credentialRecordId - * @param res - * @returns Credential details - */ - @Get('/credential/:credentialRecordId') - @ApiOperation({ summary: 'Get Credential by Record ID', description: 'Endpoint to retrieve credential details by credential record ID.' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Credential details retrieved successfully', type: ApiResponseDto }) - @UseGuards(AuthGuard('jwt'), UserRoleGuard) - async getCredentialByCredentialRecordId( - @Param('credentialRecordId') credentialRecordId: string, - @Res() res: Response, - @User() user: user - ): Promise { - const { id, email } = user; - - const credentialDetails: ICredentialDetails = { - userId: id, - email, - credentialRecordId - }; - - const connectionDetailResponse = await this.cloudWalletService.getCredentialByCredentialRecordId(credentialDetails); - const finalResponse: IResponse = { - statusCode: HttpStatus.OK, - message: ResponseMessages.cloudWallet.success.credentialByRecordId, - data: connectionDetailResponse - }; - return res.status(HttpStatus.OK).json(finalResponse); - } - - /** - * Get basic message by connection id - * @param connectionId - * @param res - * @returns Basic message details - */ - @Get('/basic-message/:connectionId') - @ApiOperation({ summary: 'Get Basic Message by Connection ID', description: 'Endpoint to retrieve basic message details by connection ID.' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Basic message details retrieved successfully', type: ApiResponseDto }) - @UseGuards(AuthGuard('jwt'), UserRoleGuard) - async getBasicMessageByConnectionId( - @Param('connectionId') connectionId: string, - @Res() res: Response, - @User() user: user - ): Promise { - const { id, email } = user; - - const connectionDetails: IBasicMessage = { - userId: id, - email, - connectionId - }; - - const basicMessageDetailResponse = await this.cloudWalletService.getBasicMessageByConnectionId(connectionDetails); - const finalResponse: IResponse = { - statusCode: HttpStatus.OK, - message: ResponseMessages.cloudWallet.success.basicMessageByConnectionId, - data: basicMessageDetailResponse - }; - return res.status(HttpStatus.OK).json(finalResponse); - } - - /** - * Send basic message - * @param connectionId - * @param messageDetails - * @param res - * @returns success message - */ - @Post('/basic-message/:connectionId') - @ApiOperation({ summary: 'Send Basic Message', description: 'Endpoint to send a basic message to a connection.' }) - @ApiResponse({ status: HttpStatus.CREATED, description: 'Basic message sent successfully', type: ApiResponseDto }) - @UseGuards(AuthGuard('jwt'), UserRoleGuard) - async sendBasicMessage( - @Param('connectionId') connectionId: string, - @Res() res: Response, - @Body() messageDetails: BasicMessageDTO, - @User() user: user - ): Promise { - const { id, email } = user; - messageDetails.userId = id; - messageDetails.email = email; - messageDetails.connectionId = connectionId; - const basicMessageDetails = await this.cloudWalletService.sendBasicMessage(messageDetails); - const finalResponse: IResponse = { - statusCode: HttpStatus.CREATED, - message: ResponseMessages.cloudWallet.success.basicMessage, - data: basicMessageDetails - }; - return res.status(HttpStatus.CREATED).json(finalResponse); + private readonly logger = new Logger('cloud-wallet'); + constructor(private readonly cloudWalletService: CloudWalletService) {} + + /** + * Configure cloud base wallet + * @param cloudBaseWalletConfigure + * @param user + * @param res + * @returns success message + */ + @Post('/configure/base-wallet') + @ApiOperation({ + summary: 'Configure Cloud Base Wallet', + description: 'Endpoint to configure the base wallet for the cloud wallet service.' + }) + @ApiResponse({ status: HttpStatus.CREATED, description: 'Base wallet configured successfully', type: ApiResponseDto }) + @UseGuards(AuthGuard('jwt')) + async configureBaseWallet( + @Res() res: Response, + @Body() cloudBaseWalletConfigure: CloudBaseWalletConfigureDto, + @User() user: user + ): Promise { + const { id, email } = user; + + cloudBaseWalletConfigure.userId = id; + cloudBaseWalletConfigure.email = email; + + const configureBaseWalletData = await this.cloudWalletService.configureBaseWallet(cloudBaseWalletConfigure); + const finalResponse: IResponse = { + statusCode: HttpStatus.CREATED, + message: ResponseMessages.cloudWallet.success.configureBaseWallet, + data: configureBaseWalletData + }; + return res.status(HttpStatus.CREATED).json(finalResponse); + } + + /** + * Create cloud wallet + * @param cloudWalletDetails + * @param res + * @returns Success message and wallet details + */ + @Post('/create-wallet') + @ApiOperation({ summary: 'Create Cloud Wallet', description: 'Endpoint to create a new cloud wallet for the user.' }) + @ApiResponse({ status: HttpStatus.CREATED, description: 'Cloud wallet created successfully', type: ApiResponseDto }) + @ApiBearerAuth() + @UseGuards(AuthGuard('jwt'), UserRoleGuard) + async createCloudWallet( + @Res() res: Response, + @Body() cloudWalletDetails: CreateCloudWalletDto, + @User() user: user + ): Promise { + const { email, id } = user; + cloudWalletDetails.email = email; + cloudWalletDetails.userId = id; + const cloudWalletData = await this.cloudWalletService.createCloudWallet(cloudWalletDetails); + const finalResponse: IResponse = { + statusCode: HttpStatus.CREATED, + message: ResponseMessages.cloudWallet.success.create, + data: cloudWalletData + }; + return res.status(HttpStatus.CREATED).json(finalResponse); + } + + /** + * Accept proof request + * @param acceptProofRequest + * @returns success message + */ + @Post('/proofs/accept-request') + @ApiOperation({ + summary: 'Accept Proof Request', + description: 'Endpoint to accept a proof request for the cloud wallet.' + }) + @ApiResponse({ status: HttpStatus.CREATED, description: 'Proof request accepted successfully', type: ApiResponseDto }) + @UseGuards(AuthGuard('jwt'), UserRoleGuard) + async acceptProofRequest( + @Res() res: Response, + @Body() acceptProofRequest: AcceptProofRequestDto, + @User() user: user + ): Promise { + const { id, email } = user; + acceptProofRequest.userId = id; + acceptProofRequest.email = email; + + const acceptProofRequestDetails = await this.cloudWalletService.acceptProofRequest(acceptProofRequest); + const finalResponse: IResponse = { + statusCode: HttpStatus.CREATED, + message: ResponseMessages.cloudWallet.success.acceptProofRequest, + data: acceptProofRequestDetails + }; + return res.status(HttpStatus.CREATED).json(finalResponse); + } + + /** + * Get proof presentation by proof id + * @param proofRecordId + * @param res + * @returns success message + */ + @Get('/proofs/:proofRecordId') + @ApiOperation({ + summary: 'Get Proof Presentation by ID', + description: 'Endpoint to retrieve proof presentation details by proof record ID.' + }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Proof presentation retrieved successfully', + type: ApiResponseDto + }) + @UseGuards(AuthGuard('jwt'), UserRoleGuard) + async getProofById( + @Param('proofRecordId') proofRecordId: string, + @Res() res: Response, + @User() user: user + ): Promise { + const { id, email } = user; + + const proofPresentationByIdPayload: IGetProofPresentationById = { + userId: id, + email, + proofRecordId + }; + + const getProofDetails = await this.cloudWalletService.getProofById(proofPresentationByIdPayload); + const finalResponse: IResponse = { + statusCode: HttpStatus.OK, + message: ResponseMessages.cloudWallet.success.getProofById, + data: getProofDetails + }; + return res.status(HttpStatus.OK).json(finalResponse); + } + + /** + * Get proof presentations + * @param threadId + * @param res + * @returns success message + */ + @Get('/proofs') + @ApiOperation({ + summary: 'Get Proof Presentations', + description: 'Endpoint to retrieve all proof presentations, optionally filtered by thread ID.' + }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Proof presentations retrieved successfully', + type: ApiResponseDto + }) + @UseGuards(AuthGuard('jwt'), UserRoleGuard) + @ApiQuery({ + name: 'threadId', + required: false + }) + async getProofPresentation( + @Res() res: Response, + @User() user: user, + @Query('threadId') threadId?: string + ): Promise { + const { id, email } = user; + + const proofPresentationPayload: IGetProofPresentation = { + userId: id, + email, + threadId + }; + + const getProofDetails = await this.cloudWalletService.getProofPresentation(proofPresentationPayload); + const finalResponse: IResponse = { + statusCode: HttpStatus.OK, + message: ResponseMessages.cloudWallet.success.getProofPresentation, + data: getProofDetails + }; + return res.status(HttpStatus.OK).json(finalResponse); + } + + /** + * Receive invitation by URL + * @param receiveInvitation + * @param res + * @returns Response from agent + */ + @Post('/receive-invitation-url') + @ApiOperation({ + summary: 'Receive Invitation by URL', + description: 'Endpoint to receive an invitation using a URL for the cloud wallet.' + }) + @ApiResponse({ status: HttpStatus.CREATED, description: 'Invitation received successfully', type: ApiResponseDto }) + @ApiBearerAuth() + @UseGuards(AuthGuard('jwt'), UserRoleGuard) + async receiveInvitationByUrl( + @Res() res: Response, + @Body() receiveInvitation: ReceiveInvitationUrlDTO, + @User() user: user + ): Promise { + const { email, id } = user; + receiveInvitation.email = email; + receiveInvitation.userId = id; + const receiveInvitationData = await this.cloudWalletService.receiveInvitationByUrl(receiveInvitation); + const finalResponse: IResponse = { + statusCode: HttpStatus.CREATED, + message: ResponseMessages.cloudWallet.success.receive, + data: receiveInvitationData + }; + return res.status(HttpStatus.CREATED).json(finalResponse); + } + + /** + * Accept offer + * @param acceptOffer + * @param res + * @returns Response from agent + */ + @Post('/accept-offer') + @ApiOperation({ + summary: 'Accept Credential Offer', + description: 'Endpoint to accept a credential offer for the cloud wallet.' + }) + @ApiResponse({ + status: HttpStatus.CREATED, + description: 'Credential offer accepted successfully', + type: ApiResponseDto + }) + @ApiBearerAuth() + @UseGuards(AuthGuard('jwt'), UserRoleGuard) + async acceptOffer(@Res() res: Response, @Body() acceptOffer: AcceptOfferDto, @User() user: user): Promise { + const { email, id } = user; + acceptOffer.email = email; + acceptOffer.userId = id; + const receiveInvitationData = await this.cloudWalletService.acceptOffer(acceptOffer); + const finalResponse: IResponse = { + statusCode: HttpStatus.CREATED, + message: ResponseMessages.cloudWallet.success.receive, + data: receiveInvitationData + }; + return res.status(HttpStatus.CREATED).json(finalResponse); + } + + /** + * Create did + * @param createDidDto + * @param res + * @returns did + */ + @Post('/did') + @ApiOperation({ + summary: 'Create DID', + description: 'Endpoint to create a new DID (Decentralized Identifier) for the cloud wallet.' + }) + @ApiResponse({ status: HttpStatus.CREATED, description: 'DID created successfully', type: ApiResponseDto }) + @ApiBearerAuth() + @UseGuards(AuthGuard('jwt'), UserRoleGuard) + async createDid( + @Body() createDidDto: CreateCloudWalletDidDto, + @User() user: user, + @Res() res: Response + ): Promise { + Validator.validateDid(createDidDto); + const { email, id } = user; + createDidDto.email = email; + createDidDto.userId = id; + if (createDidDto.seed && CommonConstants.SEED_LENGTH !== createDidDto.seed.length) { + throw new BadRequestException(ResponseMessages.agent.error.seedChar, { + cause: new Error(), + description: ResponseMessages.errorMessages.badRequest + }); } + const didDetails = await this.cloudWalletService.createDid(createDidDto); + + const finalResponse: IResponse = { + statusCode: HttpStatus.CREATED, + message: ResponseMessages.agent.success.createDid, + data: didDetails + }; + + return res.status(HttpStatus.CREATED).json(finalResponse); + } + + /** + * Get DID list by organization id + * @param res + * @returns DID list + */ + @Get('/did') + @ApiOperation({ + summary: 'Get DID List', + description: 'Endpoint to retrieve the list of DIDs associated with the cloud wallet.' + }) + @ApiResponse({ status: HttpStatus.OK, description: 'DID list retrieved successfully', type: ApiResponseDto }) + @UseGuards(AuthGuard('jwt'), UserRoleGuard) + async getDidList(@Res() res: Response, @User() user: user): Promise { + const { id, email } = user; + + const walletDetails: IWalletDetailsForDidList = { + userId: id, + email + }; + + const didListDetails = await this.cloudWalletService.getDidList(walletDetails); + const finalResponse: IResponse = { + statusCode: HttpStatus.OK, + message: ResponseMessages.cloudWallet.success.didList, + data: didListDetails + }; + return res.status(HttpStatus.OK).json(finalResponse); + } + + /** + * Create connection invitation + * @param createConnection + * @param res + * @returns success message + */ + @Post('/connections/invitation') + @ApiOperation({ + summary: 'Create Connection Invitation', + description: 'Endpoint to create a connection invitation for the cloud wallet.' + }) + @ApiResponse({ + status: HttpStatus.CREATED, + description: 'Connection invitation created successfully', + type: ApiResponseDto + }) + @UseGuards(AuthGuard('jwt'), UserRoleGuard) + async createConnection( + @Res() res: Response, + @Body() createConnection: ClouWalletCreateConnectionDto, + @User() user: user + ): Promise { + const { id, email } = user; + createConnection.userId = id; + createConnection.email = email; + + const createConnectionDetails = await this.cloudWalletService.createConnection(createConnection); + const finalResponse: IResponse = { + statusCode: HttpStatus.CREATED, + message: ResponseMessages.cloudWallet.success.createConnection, + data: createConnectionDetails + }; + return res.status(HttpStatus.CREATED).json(finalResponse); + } + + /** + * Get connection by connection id + * @param connectionId + * @param res + * @returns connection details + */ + @Get('/connection/:connectionId') + @ApiOperation({ + summary: 'Get Connection by ID', + description: 'Endpoint to retrieve connection details by connection ID.' + }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Connection details retrieved successfully', + type: ApiResponseDto + }) + @UseGuards(AuthGuard('jwt'), UserRoleGuard) + async getconnectionById( + @Param('connectionId') connectionId: string, + @Res() res: Response, + @User() user: user + ): Promise { + const { id, email } = user; + + const connectionDetails: IConnectionDetailsById = { + userId: id, + email, + connectionId + }; + + const connectionDetailResponse = await this.cloudWalletService.getconnectionById(connectionDetails); + const finalResponse: IResponse = { + statusCode: HttpStatus.OK, + message: ResponseMessages.cloudWallet.success.connectionById, + data: connectionDetailResponse + }; + return res.status(HttpStatus.OK).json(finalResponse); + } + + /** + * Get all wallet connections + * @param connectionListQueryOptions + * @param res + * @returns connection list + */ + @Get('/connections') + @ApiOperation({ + summary: 'Get All Wallet Connections', + description: 'Endpoint to retrieve all connections associated with the cloud wallet.' + }) + @ApiResponse({ status: HttpStatus.OK, description: 'Connections retrieved successfully', type: ApiResponseDto }) + @UseGuards(AuthGuard('jwt'), UserRoleGuard) + async getAllconnectionById( + @Query() connectionListQueryOptions: GetAllCloudWalletConnectionsDto, + @Res() res: Response, + @User() user: user + ): Promise { + const { id, email } = user; + + connectionListQueryOptions.userId = id; + connectionListQueryOptions.email = email; + + const connectionDetailResponse = await this.cloudWalletService.getAllconnectionById(connectionListQueryOptions); + const finalResponse: IResponse = { + statusCode: HttpStatus.OK, + message: ResponseMessages.cloudWallet.success.connectionList, + data: connectionDetailResponse + }; + return res.status(HttpStatus.OK).json(finalResponse); + } + + /** + * Get credential list by tenant id + * @param credentialListQueryOptions + * @param res + * @returns Credential list + */ + @Get('/credential') + @ApiOperation({ + summary: 'Get Credential List', + description: 'Endpoint to retrieve the list of credentials associated with the cloud wallet.' + }) + @ApiResponse({ status: HttpStatus.OK, description: 'Credential list retrieved successfully', type: ApiResponseDto }) + @UseGuards(AuthGuard('jwt'), UserRoleGuard) + async getCredentialList( + @Query() credentialListQueryOptions: CredentialListDto, + @Res() res: Response, + @User() user: user + ): Promise { + const { id, email } = user; + + credentialListQueryOptions.userId = id; + credentialListQueryOptions.email = email; + + const connectionDetailResponse = await this.cloudWalletService.getCredentialList(credentialListQueryOptions); + const finalResponse: IResponse = { + statusCode: HttpStatus.OK, + message: ResponseMessages.cloudWallet.success.credentials, + data: connectionDetailResponse + }; + return res.status(HttpStatus.OK).json(finalResponse); + } + + /** + * Get credential by credential record id + * @param credentialRecordId + * @param res + * @returns Credential details + */ + @Get('/credential/:credentialRecordId') + @ApiOperation({ + summary: 'Get Credential by Record ID', + description: 'Endpoint to retrieve credential details by credential record ID.' + }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Credential details retrieved successfully', + type: ApiResponseDto + }) + @UseGuards(AuthGuard('jwt'), UserRoleGuard) + async getCredentialByCredentialRecordId( + @Param('credentialRecordId') credentialRecordId: string, + @Res() res: Response, + @User() user: user + ): Promise { + const { id, email } = user; + + const credentialDetails: ICredentialDetails = { + userId: id, + email, + credentialRecordId + }; + + const connectionDetailResponse = await this.cloudWalletService.getCredentialByCredentialRecordId(credentialDetails); + const finalResponse: IResponse = { + statusCode: HttpStatus.OK, + message: ResponseMessages.cloudWallet.success.credentialByRecordId, + data: connectionDetailResponse + }; + return res.status(HttpStatus.OK).json(finalResponse); + } + + /** + * Get basic message by connection id + * @param connectionId + * @param res + * @returns Basic message details + */ + @Get('/basic-message/:connectionId') + @ApiOperation({ + summary: 'Get Basic Message by Connection ID', + description: 'Endpoint to retrieve basic message details by connection ID.' + }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Basic message details retrieved successfully', + type: ApiResponseDto + }) + @UseGuards(AuthGuard('jwt'), UserRoleGuard) + async getBasicMessageByConnectionId( + @Param('connectionId') connectionId: string, + @Res() res: Response, + @User() user: user + ): Promise { + const { id, email } = user; + + const connectionDetails: IBasicMessage = { + userId: id, + email, + connectionId + }; + + const basicMessageDetailResponse = await this.cloudWalletService.getBasicMessageByConnectionId(connectionDetails); + const finalResponse: IResponse = { + statusCode: HttpStatus.OK, + message: ResponseMessages.cloudWallet.success.basicMessageByConnectionId, + data: basicMessageDetailResponse + }; + return res.status(HttpStatus.OK).json(finalResponse); + } + + /** + * Send basic message + * @param connectionId + * @param messageDetails + * @param res + * @returns success message + */ + @Post('/basic-message/:connectionId') + @ApiOperation({ summary: 'Send Basic Message', description: 'Endpoint to send a basic message to a connection.' }) + @ApiResponse({ status: HttpStatus.CREATED, description: 'Basic message sent successfully', type: ApiResponseDto }) + @UseGuards(AuthGuard('jwt'), UserRoleGuard) + async sendBasicMessage( + @Param('connectionId') connectionId: string, + @Res() res: Response, + @Body() messageDetails: BasicMessageDTO, + @User() user: user + ): Promise { + const { id, email } = user; + messageDetails.userId = id; + messageDetails.email = email; + messageDetails.connectionId = connectionId; + const basicMessageDetails = await this.cloudWalletService.sendBasicMessage(messageDetails); + const finalResponse: IResponse = { + statusCode: HttpStatus.CREATED, + message: ResponseMessages.cloudWallet.success.basicMessage, + data: basicMessageDetails + }; + return res.status(HttpStatus.CREATED).json(finalResponse); + } } diff --git a/apps/api-gateway/src/cloud-wallet/cloud-wallet.module.ts b/apps/api-gateway/src/cloud-wallet/cloud-wallet.module.ts index fb43a467d..3a5e60873 100644 --- a/apps/api-gateway/src/cloud-wallet/cloud-wallet.module.ts +++ b/apps/api-gateway/src/cloud-wallet/cloud-wallet.module.ts @@ -1,25 +1,46 @@ -import { getNatsOptions } from '@credebl/common/nats.config'; +import { getNatsOptions } from '@credebl/common'; import { CloudWalletController } from './cloud-wallet.controller'; import { CloudWalletService } from './cloud-wallet.service'; -import { Module } from '@nestjs/common'; +import { DynamicModule, Module, Provider } from '@nestjs/common'; import { ClientsModule, Transport } from '@nestjs/microservices'; -import { CommonConstants } from '@credebl/common/common.constant'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { CommonConstants } from '@credebl/common'; +import { NATSClient } from '@credebl/common'; @Module({ - imports: [ - - ClientsModule.register([ - { - name: 'NATS_CLIENT', - transport: Transport.NATS, - options: getNatsOptions(CommonConstants.CLOUD_WALLET_SERVICE, process.env.API_GATEWAY_NKEY_SEED) - } - ]) - ], - controllers: [CloudWalletController], - providers: [CloudWalletService, NATSClient] + imports: [ + ClientsModule.register([ + { + name: 'NATS_CLIENT', + transport: Transport.NATS, + options: getNatsOptions(CommonConstants.CLOUD_WALLET_SERVICE, process.env.API_GATEWAY_NKEY_SEED) + } + ]) + ], + controllers: [CloudWalletController], + providers: [CloudWalletService, NATSClient] }) - export class CloudWalletModule { -} \ No newline at end of file + static register( + overrides: Provider[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + controllerOverrides: any[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + importedModules: any[] = [] + ): DynamicModule { + return { + module: CloudWalletModule, + imports: [ + ClientsModule.register([ + { + name: 'NATS_CLIENT', + transport: Transport.NATS, + options: getNatsOptions(CommonConstants.CLOUD_WALLET_SERVICE, process.env.API_GATEWAY_NKEY_SEED) + } + ]), + ...importedModules + ], + controllers: controllerOverrides.length ? controllerOverrides : [CloudWalletController], + providers: [CloudWalletService, NATSClient, ...overrides] + }; + } +} diff --git a/apps/api-gateway/src/cloud-wallet/cloud-wallet.service.ts b/apps/api-gateway/src/cloud-wallet/cloud-wallet.service.ts index 8fb55f4a3..d1a1f7e1c 100644 --- a/apps/api-gateway/src/cloud-wallet/cloud-wallet.service.ts +++ b/apps/api-gateway/src/cloud-wallet/cloud-wallet.service.ts @@ -1,106 +1,139 @@ - -import { IAcceptOffer, ICreateCloudWallet, ICreateCloudWalletDid, IReceiveInvitation, IAcceptProofRequest, IProofRequestRes, ICloudBaseWalletConfigure, IGetProofPresentation, IGetProofPresentationById, IGetStoredWalletInfo, IStoredWalletDetails, IWalletDetailsForDidList, IConnectionDetailsById, ITenantDetail, ICredentialDetails, ICreateConnection, IConnectionInvitationResponse, GetAllCloudWalletConnections, IBasicMessage, IBasicMessageDetails } from '@credebl/common/interfaces/cloud-wallet.interface'; -import { Inject, Injectable} from '@nestjs/common'; +import { + IAcceptOffer, + ICreateCloudWallet, + ICreateCloudWalletDid, + IReceiveInvitation, + IAcceptProofRequest, + IProofRequestRes, + ICloudBaseWalletConfigure, + IGetProofPresentation, + IGetProofPresentationById, + IGetStoredWalletInfo, + IStoredWalletDetails, + IWalletDetailsForDidList, + IConnectionDetailsById, + ITenantDetail, + ICredentialDetails, + ICreateConnection, + IConnectionInvitationResponse, + GetAllCloudWalletConnections, + IBasicMessage, + IBasicMessageDetails +} from '@credebl/common'; +import { Inject, Injectable } from '@nestjs/common'; import { ClientProxy } from '@nestjs/microservices'; -import { BaseService } from 'libs/service/base.service'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { BaseService } from '@credebl/common'; +import { NATSClient } from '@credebl/common'; @Injectable() export class CloudWalletService extends BaseService { - constructor(@Inject('NATS_CLIENT') private readonly cloudWalletServiceProxy: ClientProxy, private readonly natsClient : NATSClient) { + constructor( + @Inject('NATS_CLIENT') private readonly cloudWalletServiceProxy: ClientProxy, + private readonly natsClient: NATSClient + ) { super('CloudWalletServiceProxy'); } - configureBaseWallet( - cloudBaseWalletConfigure: ICloudBaseWalletConfigure - ): Promise { - return this.natsClient.sendNatsMessage(this.cloudWalletServiceProxy, 'configure-cloud-base-wallet', cloudBaseWalletConfigure); + configureBaseWallet(cloudBaseWalletConfigure: ICloudBaseWalletConfigure): Promise { + return this.natsClient.sendNatsMessage( + this.cloudWalletServiceProxy, + 'configure-cloud-base-wallet', + cloudBaseWalletConfigure + ); } - createConnection( - createConnection: ICreateConnection - ): Promise { - return this.natsClient.sendNatsMessage(this.cloudWalletServiceProxy, 'create-connection-by-holder', createConnection); + createConnection(createConnection: ICreateConnection): Promise { + return this.natsClient.sendNatsMessage( + this.cloudWalletServiceProxy, + 'create-connection-by-holder', + createConnection + ); } - acceptProofRequest( - acceptProofRequest: IAcceptProofRequest - ): Promise { - return this.natsClient.sendNatsMessage(this.cloudWalletServiceProxy, 'accept-proof-request-by-holder', acceptProofRequest); + acceptProofRequest(acceptProofRequest: IAcceptProofRequest): Promise { + return this.natsClient.sendNatsMessage( + this.cloudWalletServiceProxy, + 'accept-proof-request-by-holder', + acceptProofRequest + ); } - getProofById( - proofPresentationByIdPayload: IGetProofPresentationById - ): Promise { - return this.natsClient.sendNatsMessage(this.cloudWalletServiceProxy, 'get-proof-by-proof-id-holder', proofPresentationByIdPayload); + getProofById(proofPresentationByIdPayload: IGetProofPresentationById): Promise { + return this.natsClient.sendNatsMessage( + this.cloudWalletServiceProxy, + 'get-proof-by-proof-id-holder', + proofPresentationByIdPayload + ); } - getProofPresentation( - proofPresentationPayload: IGetProofPresentation - ): Promise { - return this.natsClient.sendNatsMessage(this.cloudWalletServiceProxy, 'get-proof-presentation-holder', proofPresentationPayload); + getProofPresentation(proofPresentationPayload: IGetProofPresentation): Promise { + return this.natsClient.sendNatsMessage( + this.cloudWalletServiceProxy, + 'get-proof-presentation-holder', + proofPresentationPayload + ); } - createCloudWallet( - cloudWalletDetails: ICreateCloudWallet - ): Promise { + createCloudWallet(cloudWalletDetails: ICreateCloudWallet): Promise { return this.natsClient.sendNatsMessage(this.cloudWalletServiceProxy, 'create-cloud-wallet', cloudWalletDetails); } - receiveInvitationByUrl( - ReceiveInvitationDetails: IReceiveInvitation - ): Promise { - return this.natsClient.sendNatsMessage(this.cloudWalletServiceProxy, 'receive-invitation-by-url', ReceiveInvitationDetails); + receiveInvitationByUrl(ReceiveInvitationDetails: IReceiveInvitation): Promise { + return this.natsClient.sendNatsMessage( + this.cloudWalletServiceProxy, + 'receive-invitation-by-url', + ReceiveInvitationDetails + ); } - acceptOffer( - acceptOfferDetails: IAcceptOffer - ): Promise { + acceptOffer(acceptOfferDetails: IAcceptOffer): Promise { return this.natsClient.sendNatsMessage(this.cloudWalletServiceProxy, 'accept-credential-offer', acceptOfferDetails); } - createDid(createDidDetails: ICreateCloudWalletDid): Promise { + createDid(createDidDetails: ICreateCloudWalletDid): Promise { return this.natsClient.sendNatsMessage(this.cloudWalletServiceProxy, 'create-cloud-wallet-did', createDidDetails); -} + } -getDidList( - walletDetails: IWalletDetailsForDidList -): Promise { - return this.natsClient.sendNatsMessage(this.cloudWalletServiceProxy, 'cloud-wallet-did-list', walletDetails); -} + getDidList(walletDetails: IWalletDetailsForDidList): Promise { + return this.natsClient.sendNatsMessage(this.cloudWalletServiceProxy, 'cloud-wallet-did-list', walletDetails); + } -getconnectionById( - connectionDetails: IConnectionDetailsById -): Promise { - return this.natsClient.sendNatsMessage(this.cloudWalletServiceProxy, 'get-cloud-wallet-connection-by-id', connectionDetails); -} -getAllconnectionById( - connectionDetails: GetAllCloudWalletConnections -): Promise { - return this.natsClient.sendNatsMessage(this.cloudWalletServiceProxy, 'get-all-cloud-wallet-connections-list-by-id', connectionDetails); -} + getconnectionById(connectionDetails: IConnectionDetailsById): Promise { + return this.natsClient.sendNatsMessage( + this.cloudWalletServiceProxy, + 'get-cloud-wallet-connection-by-id', + connectionDetails + ); + } + getAllconnectionById(connectionDetails: GetAllCloudWalletConnections): Promise { + return this.natsClient.sendNatsMessage( + this.cloudWalletServiceProxy, + 'get-all-cloud-wallet-connections-list-by-id', + connectionDetails + ); + } -getCredentialList( - tenantDetails: ITenantDetail -): Promise { - return this.natsClient.sendNatsMessage(this.cloudWalletServiceProxy, 'wallet-credential-by-id', tenantDetails); -} + getCredentialList(tenantDetails: ITenantDetail): Promise { + return this.natsClient.sendNatsMessage(this.cloudWalletServiceProxy, 'wallet-credential-by-id', tenantDetails); + } -getCredentialByCredentialRecordId( - credentialDetails: ICredentialDetails -): Promise { - return this.natsClient.sendNatsMessage(this.cloudWalletServiceProxy, 'wallet-credential-by-record-id', credentialDetails); -} + getCredentialByCredentialRecordId(credentialDetails: ICredentialDetails): Promise { + return this.natsClient.sendNatsMessage( + this.cloudWalletServiceProxy, + 'wallet-credential-by-record-id', + credentialDetails + ); + } -getBasicMessageByConnectionId( - connectionDetails: IBasicMessage -): Promise { - return this.natsClient.sendNatsMessage(this.cloudWalletServiceProxy, 'basic-message-list-by-connection-id', connectionDetails); -} + getBasicMessageByConnectionId(connectionDetails: IBasicMessage): Promise { + return this.natsClient.sendNatsMessage( + this.cloudWalletServiceProxy, + 'basic-message-list-by-connection-id', + connectionDetails + ); + } -sendBasicMessage( - messageDetails: IBasicMessageDetails -): Promise { - return this.natsClient.sendNatsMessage(this.cloudWalletServiceProxy, 'send-basic-message', messageDetails); -} + sendBasicMessage(messageDetails: IBasicMessageDetails): Promise { + return this.natsClient.sendNatsMessage(this.cloudWalletServiceProxy, 'send-basic-message', messageDetails); + } } diff --git a/apps/api-gateway/src/cloud-wallet/dtos/cloudWallet.dto.ts b/apps/api-gateway/src/cloud-wallet/dtos/cloudWallet.dto.ts index 4dde297c5..fe73bf2f3 100644 --- a/apps/api-gateway/src/cloud-wallet/dtos/cloudWallet.dto.ts +++ b/apps/api-gateway/src/cloud-wallet/dtos/cloudWallet.dto.ts @@ -1,217 +1,219 @@ import { IsBoolean, IsInt, IsNotEmpty, IsOptional, IsString, Matches, MaxLength } from 'class-validator'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; -import { IsNotSQLInjection, trim } from '@credebl/common/cast.helper'; +import { IsNotSQLInjection, trim } from '@credebl/common'; import { Transform } from 'class-transformer'; export class CreateCloudWalletDto { - @ApiProperty({ example: 'Credential Wallet', description: 'Cloud wallet label' }) - @IsString({ message: 'label must be a string' }) - @IsNotEmpty({ message: 'please provide valid label' }) - @Transform(({ value }) => trim(value)) - @IsNotSQLInjection({ message: 'label is required.' }) - label: string; - - @ApiProperty({ example: 'https://picsum.photos/200', description: 'Connection image URL' }) - @IsString({ message: 'Image URL must be a string' }) - @IsOptional() - @IsNotEmpty({ message: 'please provide valid image URL' }) - @Transform(({ value }) => trim(value)) - @IsNotSQLInjection({ message: 'Image URL is required.' }) - connectionImageUrl?: string; - - email?: string; - - userId?: string; + @ApiProperty({ example: 'Credential Wallet', description: 'Cloud wallet label' }) + @IsString({ message: 'label must be a string' }) + @IsNotEmpty({ message: 'please provide valid label' }) + @Transform(({ value }) => trim(value)) + @IsNotSQLInjection({ message: 'label is required.' }) + label: string; + + @ApiProperty({ example: 'https://picsum.photos/200', description: 'Connection image URL' }) + @IsString({ message: 'Image URL must be a string' }) + @IsOptional() + @IsNotEmpty({ message: 'please provide valid image URL' }) + @Transform(({ value }) => trim(value)) + @IsNotSQLInjection({ message: 'Image URL is required.' }) + connectionImageUrl?: string; + + email?: string; + userId?: string; } export class ReceiveInvitationUrlDTO { - @ApiPropertyOptional() - @IsString({ message: 'alias must be a string' }) - @IsOptional() - @IsNotEmpty({ message: 'please provide valid alias' }) - @Transform(({ value }) => trim(value)) - @IsNotSQLInjection({ message: 'alias is required.' }) - alias?: string; - - @ApiPropertyOptional() - @IsString({ message: 'label must be a string' }) - @IsOptional() - @IsNotEmpty({ message: 'please provide valid label' }) - @Transform(({ value }) => trim(value)) - @IsNotSQLInjection({ message: 'label is required.' }) - label?: string; - - @ApiPropertyOptional() - @IsString({ message: 'Image URL must be a string' }) - @IsOptional() - @IsNotEmpty({ message: 'please provide valid image URL' }) - @Transform(({ value }) => trim(value)) - @IsNotSQLInjection({ message: 'Image URL is required.' }) - imageUrl?: string; - - @ApiPropertyOptional() - @IsBoolean({ message: 'autoAcceptConnection must be a boolean' }) - @Transform(({ value }) => trim(value)) - @IsOptional() - autoAcceptConnection?: boolean; - - @ApiPropertyOptional() - @IsBoolean({ message: 'autoAcceptInvitation must be a boolean' }) - @Transform(({ value }) => trim(value)) - @IsOptional() - autoAcceptInvitation?: boolean; - - @ApiPropertyOptional() - @IsBoolean({ message: 'reuseConnection must be a boolean' }) - @Transform(({ value }) => trim(value)) - @IsOptional() - reuseConnection?: boolean; - - @ApiPropertyOptional() - @IsInt({ message: 'acceptInvitationTimeoutMs must be an integer' }) - @Transform(({ value }) => trim(value)) - @IsOptional() - acceptInvitationTimeoutMs?: number; - - @ApiPropertyOptional() - @IsString({ message: 'ourDid must be a string' }) - @IsOptional() - @IsNotEmpty({ message: 'please provide valid ourDid' }) - @Transform(({ value }) => trim(value)) - @IsNotSQLInjection({ message: 'ourDid is required.' }) - ourDid?: string; - - @ApiProperty() - @IsString({ message: 'invitationUrl must be a string' }) - @IsNotEmpty({ message: 'please provide valid invitationUrl' }) - @Transform(({ value }) => trim(value)) - @IsNotSQLInjection({ message: 'invitationUrl is required.' }) - invitationUrl: string; - - email?: string; - - userId?: string; - } - - export class AcceptOfferDto { - @ApiPropertyOptional({ example: 'always', description: 'autoAcceptCredential', enum: ['always', 'contentApproved', 'never'] }) - @Transform(({ value }) => trim(value)) - @IsString({ message: 'autoAcceptCredential must be a string' }) - autoAcceptCredential: string; - - @ApiPropertyOptional({ example: 'string', description: 'Comment' }) - @Transform(({ value }) => trim(value)) - @IsString({ message: 'comment must be a string' }) - @IsOptional() - comment?: string; - - @ApiProperty({ example: 'string', description: 'Credential record ID' }) - @Transform(({ value }) => trim(value)) - @IsString({ message: 'credentialRecordId must be a string' }) - credentialRecordId: string; - - @ApiProperty({ type: Object, description: 'Credential formats' }) - credentialFormats: object; - - email?: string; - - userId?: string; - } - - export class CreateCloudWalletDidDto { - - @ApiProperty({ example: '000000000000000000000000000Seed1' }) - @MaxLength(32, { message: 'seed must be at most 32 characters.' }) - @Transform(({ value }) => trim(value)) - @IsOptional() - @ApiPropertyOptional() - @IsString({ message: 'seed must be in string format.' }) - @Matches(/^\S*$/, { - message: 'Spaces are not allowed in seed' - }) - seed?: string; - - @ApiProperty({ example: 'ed25519'}) - @IsNotEmpty({ message: 'key type is required' }) - @Transform(({ value }) => trim(value)) - @IsString({ message: 'key type be in string format.' }) - keyType: string; - - @ApiProperty({ example: 'indy'}) - @IsNotEmpty({ message: 'method is required' }) - @Transform(({ value }) => trim(value)) - @IsString({ message: 'method must be in string format.' }) - method: string; - - @ApiPropertyOptional({example: 'bcovrin:testnet'}) - @IsOptional() - @Transform(({ value }) => trim(value)) - @IsString({ message: 'network must be in string format.' }) - network?: string; - - @ApiPropertyOptional({example: 'www.github.com'}) - @IsOptional() - @Transform(({ value }) => trim(value)) - @IsString({ message: 'domain must be in string format.' }) - domain?: string; - - @ApiPropertyOptional({example: 'endorser'}) - @IsOptional() - @Transform(({ value }) => trim(value)) - @IsString({ message: 'role must be in string format.' }) - role?: string; - - @ApiPropertyOptional({example: '651727dab6dfdbb4f18afff5f368d13b0dca41fd26bd5e1c7953457524d645e6'}) - @IsOptional() - @IsString({ message: 'private key must be in string format.' }) - @Transform(({ value }) => trim(value)) - privatekey?: string; - - @ApiPropertyOptional({example: 'http://localhost:6006/docs'}) - @IsOptional() - @IsString({ message: 'endpoint must be in string format.' }) - endpoint?: string; - - @ApiPropertyOptional({ example: 'XzFjo1RTZ2h9UVFCnPUyaQ' }) - @IsOptional() - @Transform(({ value }) => trim(value)) - @IsString({ message: 'did must be in string format.' }) - did?: string; - - @ApiPropertyOptional({example: 'did:indy:bcovrin:testnet:UEeW111G1tYo1nEkPwMcF'}) - @IsOptional() - @Transform(({ value }) => trim(value)) - @IsString({ message: 'endorser did must be in string format.' }) - endorserDid?: string; - - email?: string; - - userId?: string; + @ApiPropertyOptional() + @IsString({ message: 'alias must be a string' }) + @IsOptional() + @IsNotEmpty({ message: 'please provide valid alias' }) + @Transform(({ value }) => trim(value)) + @IsNotSQLInjection({ message: 'alias is required.' }) + alias?: string; + + @ApiPropertyOptional() + @IsString({ message: 'label must be a string' }) + @IsOptional() + @IsNotEmpty({ message: 'please provide valid label' }) + @Transform(({ value }) => trim(value)) + @IsNotSQLInjection({ message: 'label is required.' }) + label?: string; + + @ApiPropertyOptional() + @IsString({ message: 'Image URL must be a string' }) + @IsOptional() + @IsNotEmpty({ message: 'please provide valid image URL' }) + @Transform(({ value }) => trim(value)) + @IsNotSQLInjection({ message: 'Image URL is required.' }) + imageUrl?: string; + + @ApiPropertyOptional() + @IsBoolean({ message: 'autoAcceptConnection must be a boolean' }) + @Transform(({ value }) => trim(value)) + @IsOptional() + autoAcceptConnection?: boolean; + + @ApiPropertyOptional() + @IsBoolean({ message: 'autoAcceptInvitation must be a boolean' }) + @Transform(({ value }) => trim(value)) + @IsOptional() + autoAcceptInvitation?: boolean; + + @ApiPropertyOptional() + @IsBoolean({ message: 'reuseConnection must be a boolean' }) + @Transform(({ value }) => trim(value)) + @IsOptional() + reuseConnection?: boolean; + + @ApiPropertyOptional() + @IsInt({ message: 'acceptInvitationTimeoutMs must be an integer' }) + @Transform(({ value }) => trim(value)) + @IsOptional() + acceptInvitationTimeoutMs?: number; + + @ApiPropertyOptional() + @IsString({ message: 'ourDid must be a string' }) + @IsOptional() + @IsNotEmpty({ message: 'please provide valid ourDid' }) + @Transform(({ value }) => trim(value)) + @IsNotSQLInjection({ message: 'ourDid is required.' }) + ourDid?: string; + + @ApiProperty() + @IsString({ message: 'invitationUrl must be a string' }) + @IsNotEmpty({ message: 'please provide valid invitationUrl' }) + @Transform(({ value }) => trim(value)) + @IsNotSQLInjection({ message: 'invitationUrl is required.' }) + invitationUrl: string; + + email?: string; + + userId?: string; +} + +export class AcceptOfferDto { + @ApiPropertyOptional({ + example: 'always', + description: 'autoAcceptCredential', + enum: ['always', 'contentApproved', 'never'] + }) + @Transform(({ value }) => trim(value)) + @IsString({ message: 'autoAcceptCredential must be a string' }) + autoAcceptCredential: string; + + @ApiPropertyOptional({ example: 'string', description: 'Comment' }) + @Transform(({ value }) => trim(value)) + @IsString({ message: 'comment must be a string' }) + @IsOptional() + comment?: string; + + @ApiProperty({ example: 'string', description: 'Credential record ID' }) + @Transform(({ value }) => trim(value)) + @IsString({ message: 'credentialRecordId must be a string' }) + credentialRecordId: string; + + @ApiProperty({ type: Object, description: 'Credential formats' }) + credentialFormats: object; + + email?: string; + + userId?: string; +} + +export class CreateCloudWalletDidDto { + @ApiProperty({ example: '000000000000000000000000000Seed1' }) + @MaxLength(32, { message: 'seed must be at most 32 characters.' }) + @Transform(({ value }) => trim(value)) + @IsOptional() + @ApiPropertyOptional() + @IsString({ message: 'seed must be in string format.' }) + @Matches(/^\S*$/, { + message: 'Spaces are not allowed in seed' + }) + seed?: string; + + @ApiProperty({ example: 'ed25519' }) + @IsNotEmpty({ message: 'key type is required' }) + @Transform(({ value }) => trim(value)) + @IsString({ message: 'key type be in string format.' }) + keyType: string; + + @ApiProperty({ example: 'indy' }) + @IsNotEmpty({ message: 'method is required' }) + @Transform(({ value }) => trim(value)) + @IsString({ message: 'method must be in string format.' }) + method: string; + + @ApiPropertyOptional({ example: 'bcovrin:testnet' }) + @IsOptional() + @Transform(({ value }) => trim(value)) + @IsString({ message: 'network must be in string format.' }) + network?: string; + + @ApiPropertyOptional({ example: 'www.github.com' }) + @IsOptional() + @Transform(({ value }) => trim(value)) + @IsString({ message: 'domain must be in string format.' }) + domain?: string; + + @ApiPropertyOptional({ example: 'endorser' }) + @IsOptional() + @Transform(({ value }) => trim(value)) + @IsString({ message: 'role must be in string format.' }) + role?: string; + + @ApiPropertyOptional({ example: '651727dab6dfdbb4f18afff5f368d13b0dca41fd26bd5e1c7953457524d645e6' }) + @IsOptional() + @IsString({ message: 'private key must be in string format.' }) + @Transform(({ value }) => trim(value)) + privatekey?: string; + + @ApiPropertyOptional({ example: 'http://localhost:6006/docs' }) + @IsOptional() + @IsString({ message: 'endpoint must be in string format.' }) + endpoint?: string; + + @ApiPropertyOptional({ example: 'XzFjo1RTZ2h9UVFCnPUyaQ' }) + @IsOptional() + @Transform(({ value }) => trim(value)) + @IsString({ message: 'did must be in string format.' }) + did?: string; + + @ApiPropertyOptional({ example: 'did:indy:bcovrin:testnet:UEeW111G1tYo1nEkPwMcF' }) + @IsOptional() + @Transform(({ value }) => trim(value)) + @IsString({ message: 'endorser did must be in string format.' }) + endorserDid?: string; + + email?: string; + + userId?: string; } export class CredentialListDto { - @ApiProperty({ required: false}) + @ApiProperty({ required: false }) @IsNotEmpty() @IsOptional() @IsString() threadId: string; - @ApiProperty({ required: false}) + @ApiProperty({ required: false }) @IsNotEmpty() @IsOptional() @IsString() connectionId: string; - - @ApiProperty({ required: false}) + + @ApiProperty({ required: false }) @IsNotEmpty() @IsOptional() @IsString() state: string; email?: string; - + userId?: string; } @@ -247,20 +249,20 @@ export class GetAllCloudWalletConnectionsDto { theirLabel: string; email?: string; - + userId?: string; } export class BasicMessageDTO { - @ApiProperty({ example: 'Message'}) + @ApiProperty({ example: 'Message' }) @IsNotEmpty({ message: 'content is required' }) @Transform(({ value }) => trim(value)) @IsString({ message: 'content should be in string format.' }) content: string; email?: string; - + userId?: string; connectionId: string; -} \ No newline at end of file +} diff --git a/apps/api-gateway/src/cloud-wallet/dtos/configure-base-wallet.dto.ts b/apps/api-gateway/src/cloud-wallet/dtos/configure-base-wallet.dto.ts index 7c14c928a..948429830 100644 --- a/apps/api-gateway/src/cloud-wallet/dtos/configure-base-wallet.dto.ts +++ b/apps/api-gateway/src/cloud-wallet/dtos/configure-base-wallet.dto.ts @@ -1,7 +1,7 @@ import { IsNotEmpty, IsString } from 'class-validator'; import { ApiProperty } from '@nestjs/swagger'; -import { IsHostPortOrDomain } from '@credebl/common/cast.helper'; +import { IsHostPortOrDomain } from '@credebl/common'; export class CloudBaseWalletConfigureDto { @ApiProperty({ example: 'xxx-xxxx-xxxx' }) @@ -17,7 +17,7 @@ export class CloudBaseWalletConfigureDto { @ApiProperty({ example: 'http://0.0.0.0:4001' }) @IsString({ message: 'agentEndpoint must be a string' }) @IsNotEmpty({ message: 'please provide valid agentEndpoint' }) - @IsHostPortOrDomain({ message: 'Agent Endpoint must be a valid protocol://host:port or domain'}) + @IsHostPortOrDomain({ message: 'Agent Endpoint must be a valid protocol://host:port or domain' }) agentEndpoint: string; userId: string; diff --git a/apps/api-gateway/src/cloud-wallet/dtos/create-connection.dto.ts b/apps/api-gateway/src/cloud-wallet/dtos/create-connection.dto.ts index 2ca7742d9..71721c3d0 100644 --- a/apps/api-gateway/src/cloud-wallet/dtos/create-connection.dto.ts +++ b/apps/api-gateway/src/cloud-wallet/dtos/create-connection.dto.ts @@ -99,7 +99,7 @@ class AppendedAttachment { data: Data; } -export class CreateConnectionDto { +export class ClouWalletCreateConnectionDto { @ApiPropertyOptional() @IsString() @IsOptional() diff --git a/apps/api-gateway/src/cloud-wallet/dtos/index.ts b/apps/api-gateway/src/cloud-wallet/dtos/index.ts new file mode 100644 index 000000000..3a4327442 --- /dev/null +++ b/apps/api-gateway/src/cloud-wallet/dtos/index.ts @@ -0,0 +1,4 @@ +export * from './accept-proof-request.dto'; +export * from './cloudWallet.dto'; +export * from './configure-base-wallet.dto'; +export * from './create-connection.dto'; diff --git a/apps/api-gateway/src/cloud-wallet/enums/connections.enum.ts b/apps/api-gateway/src/cloud-wallet/enums/connections.enum.ts deleted file mode 100644 index a15929cf6..000000000 --- a/apps/api-gateway/src/cloud-wallet/enums/connections.enum.ts +++ /dev/null @@ -1,4 +0,0 @@ -export declare enum HandshakeProtocol { - Connections = "https://didcomm.org/connections/1.0", - DidExchange = "https://didcomm.org/didexchange/1.0" -} \ No newline at end of file diff --git a/apps/api-gateway/src/cloud-wallet/index.ts b/apps/api-gateway/src/cloud-wallet/index.ts new file mode 100644 index 000000000..8812f9745 --- /dev/null +++ b/apps/api-gateway/src/cloud-wallet/index.ts @@ -0,0 +1,4 @@ +export * from './cloud-wallet.controller'; +export * from './cloud-wallet.module'; +export * from './cloud-wallet.service'; +export * from './dtos'; diff --git a/apps/api-gateway/common/exception-handler.ts b/apps/api-gateway/src/common/exception-handler.ts similarity index 96% rename from apps/api-gateway/common/exception-handler.ts rename to apps/api-gateway/src/common/exception-handler.ts index 674382356..9b21048c5 100644 --- a/apps/api-gateway/common/exception-handler.ts +++ b/apps/api-gateway/src/common/exception-handler.ts @@ -1,7 +1,7 @@ import { Catch, ArgumentsHost, HttpException, HttpStatus, Logger } from '@nestjs/common'; import { BaseExceptionFilter } from '@nestjs/core'; import { ExceptionResponse } from './interface'; -import { ResponseMessages } from '@credebl/common/response-messages'; +import { ResponseMessages } from '@credebl/common'; @Catch() export class CustomExceptionFilter extends BaseExceptionFilter { diff --git a/apps/api-gateway/src/common/index.ts b/apps/api-gateway/src/common/index.ts new file mode 100644 index 000000000..e36ba6e73 --- /dev/null +++ b/apps/api-gateway/src/common/index.ts @@ -0,0 +1,2 @@ +export * from './exception-handler'; +export * from './interface'; diff --git a/apps/api-gateway/common/interface.ts b/apps/api-gateway/src/common/interface.ts similarity index 100% rename from apps/api-gateway/common/interface.ts rename to apps/api-gateway/src/common/interface.ts diff --git a/apps/api-gateway/src/connection/connection.controller.ts b/apps/api-gateway/src/connection/connection.controller.ts index e72848f9a..c0c429b05 100644 --- a/apps/api-gateway/src/connection/connection.controller.ts +++ b/apps/api-gateway/src/connection/connection.controller.ts @@ -1,29 +1,58 @@ -import { IResponse } from '@credebl/common/interfaces/response.interface'; -import { ResponseMessages } from '@credebl/common/response-messages'; -import { Controller, Post, Logger, Body, UseGuards, HttpStatus, Res, Get, Param, UseFilters, Query, Inject, ParseUUIDPipe, BadRequestException, Delete } from '@nestjs/common'; +import { IResponse, ConnectionSortFields } from '@credebl/common'; +import { ResponseMessages } from '@credebl/common'; +import { + Controller, + Post, + Logger, + Body, + UseGuards, + HttpStatus, + Res, + Get, + Param, + UseFilters, + Query, + Inject, + ParseUUIDPipe, + BadRequestException, + Delete +} from '@nestjs/common'; import { AuthGuard } from '@nestjs/passport'; -import { ApiBearerAuth, ApiExcludeEndpoint, ApiForbiddenResponse, ApiOperation, ApiQuery, ApiResponse, ApiTags, ApiUnauthorizedResponse } from '@nestjs/swagger'; +import { + ApiBearerAuth, + ApiExcludeEndpoint, + ApiForbiddenResponse, + ApiOperation, + ApiQuery, + ApiResponse, + ApiTags, + ApiUnauthorizedResponse +} from '@nestjs/swagger'; import { User } from '../authz/decorators/user.decorator'; import { ForbiddenErrorDto } from '../dtos/forbidden-error.dto'; import { UnauthorizedErrorDto } from '../dtos/unauthorized-error.dto'; import { ConnectionService } from './connection.service'; -import { ConnectionDto, CreateOutOfBandConnectionInvitation, ReceiveInvitationDto, ReceiveInvitationUrlDto } from './dtos/connection.dto'; -import { IUserRequestInterface } from './interfaces'; +import { + ConnectionDto, + CreateOutOfBandConnectionInvitation, + ReceiveInvitationDto, + ReceiveInvitationUrlDto +} from './dtos/connection.dto'; import { Response } from 'express'; -import { IUserRequest } from '@credebl/user-request/user-request.interface'; -import { CustomExceptionFilter } from 'apps/api-gateway/common/exception-handler'; -import { OrgRoles } from 'libs/org-roles/enums'; +import { IUserRequest } from '@credebl/user-management'; +import { CustomExceptionFilter } from '../common'; +import { OrgRoles } from '@credebl/common'; import { Roles } from '../authz/decorators/roles.decorator'; import { OrgRolesGuard } from '../authz/guards/org-roles.guard'; import { GetAllAgentConnectionsDto, GetAllConnectionsDto } from './dtos/get-all-connections.dto'; import { ApiResponseDto } from '../dtos/apiResponse.dto'; import { IConnectionSearchCriteria } from '../interfaces/IConnectionSearch.interface'; -import { SortFields } from 'apps/connection/src/enum/connection.enum'; -import { ClientProxy} from '@nestjs/microservices'; -import { BasicMessageDto, QuestionAnswerWebhookDto, QuestionDto} from './dtos/question-answer.dto'; +import { ClientProxy } from '@nestjs/microservices'; +import { BasicMessageDto, QuestionAnswerWebhookDto, QuestionDto } from './dtos/question-answer.dto'; +import { TrimStringParamPipe } from '@credebl/common'; // eslint-disable-next-line @typescript-eslint/no-unused-vars -import { user } from '@prisma/client'; -import { TrimStringParamPipe } from '@credebl/common/cast.helper'; +import { user } from '@credebl/prisma-service'; +import { IUserRequestSelectedOrgsInterface } from '../schema/interfaces'; @UseFilters(CustomExceptionFilter) @Controller() @ApiTags('connections') @@ -31,91 +60,107 @@ import { TrimStringParamPipe } from '@credebl/common/cast.helper'; @ApiUnauthorizedResponse({ status: HttpStatus.UNAUTHORIZED, description: 'Unauthorized', type: UnauthorizedErrorDto }) @ApiForbiddenResponse({ status: HttpStatus.FORBIDDEN, description: 'Forbidden', type: ForbiddenErrorDto }) export class ConnectionController { + private readonly logger = new Logger('Connection'); + constructor( + private readonly connectionService: ConnectionService, + @Inject('NATS_CLIENT') private readonly connectionServiceProxy: ClientProxy + ) {} - private readonly logger = new Logger('Connection'); - constructor(private readonly connectionService: ConnectionService, - @Inject('NATS_CLIENT') private readonly connectionServiceProxy: ClientProxy - ) { } - - /** - * Get connection details by connectionId - * @param connectionId The ID of the connection - * @param orgId The ID of the organization - * @returns Connection details by connection Id - */ - @Get('orgs/:orgId/connections/:connectionId') - @UseGuards(AuthGuard('jwt'), OrgRolesGuard) - @Roles(OrgRoles.OWNER, OrgRoles.ADMIN, OrgRoles.ISSUER, OrgRoles.VERIFIER, OrgRoles.MEMBER) - @ApiOperation({ - summary: `Get connection details by connectionId`, - description: `Retrieve the details of a specific connection by its connectionId for a specific organization.` - }) - @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) - async getConnectionsById( - @User() user: IUserRequest, - @Param('orgId') orgId: string, - @Param('connectionId', TrimStringParamPipe, new ParseUUIDPipe({exceptionFactory: (): Error => { throw new BadRequestException(ResponseMessages.connection.error.invalidConnectionId); }})) connectionId: string, - @Res() res: Response - ): Promise { - const connectionsDetails = await this.connectionService.getConnectionsById(user, connectionId, orgId); - const finalResponse: IResponse = { - statusCode: HttpStatus.OK, - message: ResponseMessages.connection.success.fetchConnection, - data: connectionsDetails - }; - return res.status(HttpStatus.OK).json(finalResponse); - } - - /** - * Get all connections - * @param user The user making the request - * @param orgId The ID of the organization - * @returns List of all connections for a specific organization - */ - @Get('/orgs/:orgId/connections') - @UseGuards(AuthGuard('jwt'), OrgRolesGuard) - @Roles(OrgRoles.OWNER, OrgRoles.ADMIN, OrgRoles.ISSUER, OrgRoles.VERIFIER, OrgRoles.MEMBER) - @ApiOperation({ - summary: `Fetch all connections by orgId`, - description: `Retrieve all connections for a specific organization. Supports pagination and sorting.` - }) - @ApiQuery({ - name: 'sortField', - enum: SortFields, - required: false - }) - @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) - async getConnections( - @Query() getAllConnectionsDto: GetAllConnectionsDto, - @User() user: IUserRequest, - @Param('orgId', new ParseUUIDPipe({exceptionFactory: (): Error => { throw new BadRequestException(`Invalid format for orgId`); }})) orgId: string, - @Res() res: Response - ): Promise { + /** + * Get connection details by connectionId + * @param connectionId The ID of the connection + * @param orgId The ID of the organization + * @returns Connection details by connection Id + */ + @Get('orgs/:orgId/connections/:connectionId') + @UseGuards(AuthGuard('jwt'), OrgRolesGuard) + @Roles(OrgRoles.OWNER, OrgRoles.ADMIN, OrgRoles.ISSUER, OrgRoles.VERIFIER, OrgRoles.MEMBER) + @ApiOperation({ + summary: `Get connection details by connectionId`, + description: `Retrieve the details of a specific connection by its connectionId for a specific organization.` + }) + @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) + async getConnectionsById( + @User() user: IUserRequest, + @Param('orgId') orgId: string, + @Param( + 'connectionId', + TrimStringParamPipe, + new ParseUUIDPipe({ + exceptionFactory: (): Error => { + throw new BadRequestException(ResponseMessages.connection.error.invalidConnectionId); + } + }) + ) + connectionId: string, + @Res() res: Response + ): Promise { + const connectionsDetails = await this.connectionService.getConnectionsById(user, connectionId, orgId); + const finalResponse: IResponse = { + statusCode: HttpStatus.OK, + message: ResponseMessages.connection.success.fetchConnection, + data: connectionsDetails + }; + return res.status(HttpStatus.OK).json(finalResponse); + } - const { pageSize, searchByText, pageNumber, sortField, sortBy } = getAllConnectionsDto; - const connectionSearchCriteria: IConnectionSearchCriteria = { - pageNumber, - searchByText, - pageSize, - sortField, - sortBy - }; - const connectionDetails = await this.connectionService.getConnections(connectionSearchCriteria, user, orgId); + /** + * Get all connections + * @param user The user making the request + * @param orgId The ID of the organization + * @returns List of all connections for a specific organization + */ + @Get('/orgs/:orgId/connections') + @UseGuards(AuthGuard('jwt'), OrgRolesGuard) + @Roles(OrgRoles.OWNER, OrgRoles.ADMIN, OrgRoles.ISSUER, OrgRoles.VERIFIER, OrgRoles.MEMBER) + @ApiOperation({ + summary: `Fetch all connections by orgId`, + description: `Retrieve all connections for a specific organization. Supports pagination and sorting.` + }) + @ApiQuery({ + name: 'sortField', + enum: ConnectionSortFields, + required: false + }) + @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) + async getConnections( + @Query() getAllConnectionsDto: GetAllConnectionsDto, + @User() user: IUserRequest, + @Param( + 'orgId', + new ParseUUIDPipe({ + exceptionFactory: (): Error => { + throw new BadRequestException(`Invalid format for orgId`); + } + }) + ) + orgId: string, + @Res() res: Response + ): Promise { + const { pageSize, searchByText, pageNumber, sortField, sortBy } = getAllConnectionsDto; + const connectionSearchCriteria: IConnectionSearchCriteria = { + pageNumber, + searchByText, + pageSize, + sortField, + sortBy + }; + const connectionDetails = await this.connectionService.getConnections(connectionSearchCriteria, user, orgId); - const finalResponse: IResponse = { - statusCode: HttpStatus.OK, - message: ResponseMessages.connection.success.fetch, - data: connectionDetails - }; - return res.status(HttpStatus.OK).json(finalResponse); - } + const finalResponse: IResponse = { + statusCode: HttpStatus.OK, + message: ResponseMessages.connection.success.fetch, + data: connectionDetails + }; + return res.status(HttpStatus.OK).json(finalResponse); + } - /** - * Get all connections from agent - * @param user The user making the request - * @param orgId The ID of the organization - * @returns List of all connections from agent for a specific organization - */ + /** + * Get all connections from agent + * @param user The user making the request + * @param orgId The ID of the organization + * @returns List of all connections from agent for a specific organization + */ @Get('/orgs/:orgId/agent/connections') @UseGuards(AuthGuard('jwt'), OrgRolesGuard) @Roles(OrgRoles.OWNER, OrgRoles.ADMIN, OrgRoles.ISSUER, OrgRoles.VERIFIER, OrgRoles.MEMBER) @@ -129,11 +174,7 @@ export class ConnectionController { @Param('orgId') orgId: string, @Res() res: Response ): Promise { - - const connectionDetails = await this.connectionService.getConnectionListFromAgent( - getAllConnectionsDto, - orgId - ); + const connectionDetails = await this.connectionService.getConnectionListFromAgent(getAllConnectionsDto, orgId); const finalResponse: IResponse = { statusCode: HttpStatus.OK, @@ -143,65 +184,74 @@ export class ConnectionController { return res.status(HttpStatus.OK).json(finalResponse); } - - /** - * Get question-answer record - * @param orgId The ID of the organization - * @returns Question-answer record for a specific organization - */ - @Get('orgs/:orgId/question-answer/question') - @UseGuards(AuthGuard('jwt'), OrgRolesGuard) - @Roles(OrgRoles.OWNER, OrgRoles.ADMIN, OrgRoles.ISSUER, OrgRoles.VERIFIER, OrgRoles.MEMBER, OrgRoles.HOLDER, OrgRoles.SUPER_ADMIN, OrgRoles.PLATFORM_ADMIN) - @ApiOperation({ - summary: `Get question-answer record`, - description: `Retrieve the question-answer record for a specific organization.` - }) - @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) - async getQuestionAnswersRecord( - @Param('orgId') orgId: string, - @Res() res: Response - ): Promise { - const record = await this.connectionService.getQuestionAnswersRecord(orgId); - const finalResponse: IResponse = { - statusCode: HttpStatus.OK, - message: ResponseMessages.connection.success.questionAnswerRecord, - data: record - }; - return res.status(HttpStatus.OK).json(finalResponse); - } + /** + * Get question-answer record + * @param orgId The ID of the organization + * @returns Question-answer record for a specific organization + */ + @Get('orgs/:orgId/question-answer/question') + @UseGuards(AuthGuard('jwt'), OrgRolesGuard) + @Roles( + OrgRoles.OWNER, + OrgRoles.ADMIN, + OrgRoles.ISSUER, + OrgRoles.VERIFIER, + OrgRoles.MEMBER, + OrgRoles.HOLDER, + OrgRoles.SUPER_ADMIN, + OrgRoles.PLATFORM_ADMIN + ) + @ApiOperation({ + summary: `Get question-answer record`, + description: `Retrieve the question-answer record for a specific organization.` + }) + @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) + async getQuestionAnswersRecord(@Param('orgId') orgId: string, @Res() res: Response): Promise { + const record = await this.connectionService.getQuestionAnswersRecord(orgId); + const finalResponse: IResponse = { + statusCode: HttpStatus.OK, + message: ResponseMessages.connection.success.questionAnswerRecord, + data: record + }; + return res.status(HttpStatus.OK).json(finalResponse); + } - /** - * Create out-of-band connection invitation - * @param orgId The ID of the organization - * @param createOutOfBandConnectionInvitation The details of the out-of-band connection invitation - * @param reqUser The user making the request - * @param res The response object - * @returns Created out-of-band connection invitation URL - */ - @Post('/orgs/:orgId/connections') - @ApiOperation({ summary: 'Create outbound out-of-band connection invitation', description: 'Create an outbound out-of-band connection invitation for the organization.' }) - @UseGuards(AuthGuard('jwt'), OrgRolesGuard) - @Roles(OrgRoles.OWNER, OrgRoles.ADMIN, OrgRoles.ISSUER, OrgRoles.VERIFIER, OrgRoles.MEMBER) - @ApiResponse({ status: HttpStatus.CREATED, description: 'Created', type: ApiResponseDto }) - async createConnectionInvitation( - @Param('orgId') orgId: string, - @Body() createOutOfBandConnectionInvitation: CreateOutOfBandConnectionInvitation, - @User() reqUser: IUserRequestInterface, - @Res() res: Response - ): Promise { - - createOutOfBandConnectionInvitation.orgId = orgId; - const connectionData = await this.connectionService.createConnectionInvitation(createOutOfBandConnectionInvitation, reqUser); - const finalResponse: IResponse = { - statusCode: HttpStatus.CREATED, - message: ResponseMessages.connection.success.create, - data: connectionData - }; - return res.status(HttpStatus.CREATED).json(finalResponse); - - } + /** + * Create out-of-band connection invitation + * @param orgId The ID of the organization + * @param createOutOfBandConnectionInvitation The details of the out-of-band connection invitation + * @param reqUser The user making the request + * @param res The response object + * @returns Created out-of-band connection invitation URL + */ + @Post('/orgs/:orgId/connections') + @ApiOperation({ + summary: 'Create outbound out-of-band connection invitation', + description: 'Create an outbound out-of-band connection invitation for the organization.' + }) + @UseGuards(AuthGuard('jwt'), OrgRolesGuard) + @Roles(OrgRoles.OWNER, OrgRoles.ADMIN, OrgRoles.ISSUER, OrgRoles.VERIFIER, OrgRoles.MEMBER) + @ApiResponse({ status: HttpStatus.CREATED, description: 'Created', type: ApiResponseDto }) + async createConnectionInvitation( + @Param('orgId') orgId: string, + @Body() createOutOfBandConnectionInvitation: CreateOutOfBandConnectionInvitation, + @User() reqUser: IUserRequestSelectedOrgsInterface, + @Res() res: Response + ): Promise { + createOutOfBandConnectionInvitation.orgId = orgId; + const connectionData = await this.connectionService.createConnectionInvitation( + createOutOfBandConnectionInvitation, + reqUser + ); + const finalResponse: IResponse = { + statusCode: HttpStatus.CREATED, + message: ResponseMessages.connection.success.create, + data: connectionData + }; + return res.status(HttpStatus.CREATED).json(finalResponse); + } - /** + /** * Send question * @param orgId The ID of the organization * @param connectionId The ID of the connection @@ -210,31 +260,38 @@ export class ConnectionController { * @param res The response object * @returns The details of the sent question */ - @Post('/orgs/:orgId/question-answer/question/:connectionId') - @ApiOperation({ summary: 'Send question', description: 'Send a question to the connection ID' }) - @UseGuards(AuthGuard('jwt'), OrgRolesGuard) - @Roles(OrgRoles.OWNER, OrgRoles.ADMIN, OrgRoles.ISSUER, OrgRoles.VERIFIER, OrgRoles.MEMBER, OrgRoles.HOLDER, OrgRoles.SUPER_ADMIN, OrgRoles.PLATFORM_ADMIN) - @ApiResponse({ status: HttpStatus.CREATED, description: 'Created', type: ApiResponseDto }) - async sendQuestion( - @Param('orgId') orgId: string, - @Param('connectionId', TrimStringParamPipe) connectionId: string, - @Body() questionDto: QuestionDto, - @User() reqUser: IUserRequestInterface, - @Res() res: Response - ): Promise { - - questionDto.orgId = orgId; - questionDto.connectionId = connectionId; - const questionData = await this.connectionService.sendQuestion(questionDto); - const finalResponse: IResponse = { - statusCode: HttpStatus.CREATED, - message: ResponseMessages.connection.success.questionSend, - data: questionData - }; - return res.status(HttpStatus.CREATED).json(finalResponse); - - } - /** + @Post('/orgs/:orgId/question-answer/question/:connectionId') + @ApiOperation({ summary: 'Send question', description: 'Send a question to the connection ID' }) + @UseGuards(AuthGuard('jwt'), OrgRolesGuard) + @Roles( + OrgRoles.OWNER, + OrgRoles.ADMIN, + OrgRoles.ISSUER, + OrgRoles.VERIFIER, + OrgRoles.MEMBER, + OrgRoles.HOLDER, + OrgRoles.SUPER_ADMIN, + OrgRoles.PLATFORM_ADMIN + ) + @ApiResponse({ status: HttpStatus.CREATED, description: 'Created', type: ApiResponseDto }) + async sendQuestion( + @Param('orgId') orgId: string, + @Param('connectionId', TrimStringParamPipe) connectionId: string, + @Body() questionDto: QuestionDto, + @User() reqUser: IUserRequestSelectedOrgsInterface, + @Res() res: Response + ): Promise { + questionDto.orgId = orgId; + questionDto.connectionId = connectionId; + const questionData = await this.connectionService.sendQuestion(questionDto); + const finalResponse: IResponse = { + statusCode: HttpStatus.CREATED, + message: ResponseMessages.connection.success.questionSend, + data: questionData + }; + return res.status(HttpStatus.CREATED).json(finalResponse); + } + /** * Receive Invitation URL * @param orgId The ID of the organization * @param receiveInvitationUrl The details of the invitation URL @@ -242,27 +299,26 @@ export class ConnectionController { * @param res The response object * @returns The details of the received invitation URL */ - @Post('/orgs/:orgId/receive-invitation-url') - @ApiOperation({ summary: 'Receive Invitation URL', description: 'Receive an invitation URL for the organization.' }) - @UseGuards(AuthGuard('jwt'), OrgRolesGuard) - @Roles(OrgRoles.OWNER, OrgRoles.ADMIN) - @ApiResponse({ status: HttpStatus.CREATED, description: 'Created', type: ApiResponseDto }) - async receiveInvitationUrl( - @Param('orgId') orgId: string, - @Body() receiveInvitationUrl: ReceiveInvitationUrlDto, - @User() user: IUserRequestInterface, - @Res() res: Response - ): Promise { - - const connectionData = await this.connectionService.receiveInvitationUrl(receiveInvitationUrl, orgId, user); - const finalResponse: IResponse = { - statusCode: HttpStatus.CREATED, - message: ResponseMessages.connection.success.receivenvitation, - data: connectionData - }; - return res.status(HttpStatus.CREATED).json(finalResponse); - } - /** + @Post('/orgs/:orgId/receive-invitation-url') + @ApiOperation({ summary: 'Receive Invitation URL', description: 'Receive an invitation URL for the organization.' }) + @UseGuards(AuthGuard('jwt'), OrgRolesGuard) + @Roles(OrgRoles.OWNER, OrgRoles.ADMIN) + @ApiResponse({ status: HttpStatus.CREATED, description: 'Created', type: ApiResponseDto }) + async receiveInvitationUrl( + @Param('orgId') orgId: string, + @Body() receiveInvitationUrl: ReceiveInvitationUrlDto, + @User() user: IUserRequestSelectedOrgsInterface, + @Res() res: Response + ): Promise { + const connectionData = await this.connectionService.receiveInvitationUrl(receiveInvitationUrl, orgId, user); + const finalResponse: IResponse = { + statusCode: HttpStatus.CREATED, + message: ResponseMessages.connection.success.receivenvitation, + data: connectionData + }; + return res.status(HttpStatus.CREATED).json(finalResponse); + } + /** * Receive Invitation * @param orgId The ID of the organization * @param receiveInvitation The details of the invitation @@ -270,33 +326,35 @@ export class ConnectionController { * @param res The response object * @returns The details of the received invitation */ - @Post('/orgs/:orgId/receive-invitation') - @ApiOperation({ summary: 'Receive Invitation', description: 'Receive an invitation for the organization using the invitation object.' }) - @UseGuards(AuthGuard('jwt'), OrgRolesGuard) - @Roles(OrgRoles.OWNER, OrgRoles.ADMIN) - @ApiResponse({ status: HttpStatus.CREATED, description: 'Created', type: ApiResponseDto }) - async receiveInvitation( - @Param('orgId') orgId: string, - @Body() receiveInvitation: ReceiveInvitationDto, - @User() user: IUserRequestInterface, - @Res() res: Response - ): Promise { - - const connectionData = await this.connectionService.receiveInvitation(receiveInvitation, orgId, user); - const finalResponse: IResponse = { - statusCode: HttpStatus.CREATED, - message: ResponseMessages.connection.success.receivenvitation, - data: connectionData - }; - return res.status(HttpStatus.CREATED).json(finalResponse); - } + @Post('/orgs/:orgId/receive-invitation') + @ApiOperation({ + summary: 'Receive Invitation', + description: 'Receive an invitation for the organization using the invitation object.' + }) + @UseGuards(AuthGuard('jwt'), OrgRolesGuard) + @Roles(OrgRoles.OWNER, OrgRoles.ADMIN) + @ApiResponse({ status: HttpStatus.CREATED, description: 'Created', type: ApiResponseDto }) + async receiveInvitation( + @Param('orgId') orgId: string, + @Body() receiveInvitation: ReceiveInvitationDto, + @User() user: IUserRequestSelectedOrgsInterface, + @Res() res: Response + ): Promise { + const connectionData = await this.connectionService.receiveInvitation(receiveInvitation, orgId, user); + const finalResponse: IResponse = { + statusCode: HttpStatus.CREATED, + message: ResponseMessages.connection.success.receivenvitation, + data: connectionData + }; + return res.status(HttpStatus.CREATED).json(finalResponse); + } - /** - * Catch connection webhook responses - * @param connectionDto The details of the connection - * @param orgId The ID of the organization - * @returns Callback URL for connection and created connections details - */ + /** + * Catch connection webhook responses + * @param connectionDto The details of the connection + * @param orgId The ID of the organization + * @returns Callback URL for connection and created connections details + */ @Post('wh/:orgId/connections/') @ApiExcludeEndpoint() @ApiOperation({ @@ -311,37 +369,38 @@ export class ConnectionController { ): Promise { connectionDto.type = 'Connection'; this.logger.debug(`connectionDto ::: ${JSON.stringify(connectionDto)} ${orgId}`); - + if (orgId && 'default' === connectionDto?.contextCorrelationId) { connectionDto.orgId = orgId; } - const connectionData = await this.connectionService.getConnectionWebhook(connectionDto, orgId).catch(error => { - this.logger.debug(`error in saving connection webhook ::: ${JSON.stringify(error)}`); - }); + const connectionData = await this.connectionService.getConnectionWebhook(connectionDto, orgId).catch((error) => { + this.logger.debug(`error in saving connection webhook ::: ${JSON.stringify(error)}`); + }); const finalResponse: IResponse = { statusCode: HttpStatus.CREATED, message: ResponseMessages.connection.success.create, data: connectionData }; - const webhookUrl = await this.connectionService._getWebhookUrl(connectionDto?.contextCorrelationId, orgId).catch(error => { - this.logger.debug(`error in getting webhook url ::: ${JSON.stringify(error)}`); - - }); - if (webhookUrl) { - await this.connectionService._postWebhookResponse(webhookUrl, { data: connectionDto }).catch(error => { - this.logger.debug(`error in posting webhook response to webhook url ::: ${JSON.stringify(error)}`); - }); - } + const webhookUrl = await this.connectionService + ._getWebhookUrl(connectionDto?.contextCorrelationId, orgId) + .catch((error) => { + this.logger.debug(`error in getting webhook url ::: ${JSON.stringify(error)}`); + }); + if (webhookUrl) { + await this.connectionService._postWebhookResponse(webhookUrl, { data: connectionDto }).catch((error) => { + this.logger.debug(`error in posting webhook response to webhook url ::: ${JSON.stringify(error)}`); + }); + } return res.status(HttpStatus.CREATED).json(finalResponse); } -/** - * Catch question-answer webhook responses - * @param questionAnswerWebhookDto The details of the question-answer webhook - * @param orgId The ID of the organization - * @returns Callback URL for question-answer - */ + /** + * Catch question-answer webhook responses + * @param questionAnswerWebhookDto The details of the question-answer webhook + * @param orgId The ID of the organization + * @returns Callback URL for question-answer + */ @Post('wh/:orgId/question-answer/') @ApiExcludeEndpoint() @ApiOperation({ @@ -350,28 +409,31 @@ export class ConnectionController { }) @ApiResponse({ status: HttpStatus.CREATED, description: 'Created', type: ApiResponseDto }) async getQuestionAnswerWebhook( - @Body() questionAnswerWebhookDto:QuestionAnswerWebhookDto, + @Body() questionAnswerWebhookDto: QuestionAnswerWebhookDto, @Param('orgId') orgId: string, @Res() res: Response ): Promise { questionAnswerWebhookDto.type = 'question-answer'; this.logger.debug(`questionAnswer ::: ${JSON.stringify(questionAnswerWebhookDto)} ${orgId}`); - + const finalResponse: IResponse = { statusCode: HttpStatus.CREATED, message: ResponseMessages.connection.success.create, data: '' }; - const webhookUrl = await this.connectionService._getWebhookUrl(questionAnswerWebhookDto?.contextCorrelationId, orgId).catch(error => { + const webhookUrl = await this.connectionService + ._getWebhookUrl(questionAnswerWebhookDto?.contextCorrelationId, orgId) + .catch((error) => { this.logger.debug(`error in getting webhook url ::: ${JSON.stringify(error)}`); - - }); - + }); + if (webhookUrl) { - await this.connectionService._postWebhookResponse(webhookUrl, { data: questionAnswerWebhookDto }).catch(error => { - this.logger.debug(`error in posting webhook response to webhook url ::: ${JSON.stringify(error)}`); + await this.connectionService + ._postWebhookResponse(webhookUrl, { data: questionAnswerWebhookDto }) + .catch((error) => { + this.logger.debug(`error in posting webhook response to webhook url ::: ${JSON.stringify(error)}`); }); - } + } return res.status(HttpStatus.CREATED).json(finalResponse); } /** @@ -408,36 +470,55 @@ export class ConnectionController { return res.status(HttpStatus.OK).json(finalResponse); } /** - * Send basic message - * @param orgId The ID of the organization - * @param connectionId The ID of the connection - * @param basicMessageDto The details of the basic message - * @param reqUser The user making the request - * @param res The response object - * @returns The details of the sent basic message - */ + * Send basic message + * @param orgId The ID of the organization + * @param connectionId The ID of the connection + * @param basicMessageDto The details of the basic message + * @param reqUser The user making the request + * @param res The response object + * @returns The details of the sent basic message + */ @Post('/orgs/:orgId/basic-message/:connectionId') - @ApiOperation({ summary: 'Send basic message', description: 'Send a basic message to a specific connection for a specific organization.' }) + @ApiOperation({ + summary: 'Send basic message', + description: 'Send a basic message to a specific connection for a specific organization.' + }) @UseGuards(AuthGuard('jwt'), OrgRolesGuard) - @Roles(OrgRoles.OWNER, OrgRoles.ADMIN, OrgRoles.ISSUER, OrgRoles.VERIFIER, OrgRoles.MEMBER, OrgRoles.HOLDER, OrgRoles.SUPER_ADMIN, OrgRoles.PLATFORM_ADMIN) - @ApiResponse({ status: HttpStatus.CREATED, description: 'Created', type: ApiResponseDto }) - async sendBasicMessage( - @Param('orgId') orgId: string, - @Param('connectionId', TrimStringParamPipe, new ParseUUIDPipe({exceptionFactory: (): Error => { throw new BadRequestException(ResponseMessages.connection.error.invalidConnectionId); }})) connectionId: string, - @Body() basicMessageDto: BasicMessageDto, - @User() reqUser: IUserRequestInterface, - @Res() res: Response - ): Promise { - - basicMessageDto.orgId = orgId; - basicMessageDto.connectionId = connectionId; - const basicMesgResponse = await this.connectionService.sendBasicMessage(basicMessageDto); - const finalResponse: IResponse = { - statusCode: HttpStatus.CREATED, - message: ResponseMessages.connection.success.basicMessage, - data: basicMesgResponse - }; - return res.status(HttpStatus.CREATED).json(finalResponse); - - } + @Roles( + OrgRoles.OWNER, + OrgRoles.ADMIN, + OrgRoles.ISSUER, + OrgRoles.VERIFIER, + OrgRoles.MEMBER, + OrgRoles.HOLDER, + OrgRoles.SUPER_ADMIN, + OrgRoles.PLATFORM_ADMIN + ) + @ApiResponse({ status: HttpStatus.CREATED, description: 'Created', type: ApiResponseDto }) + async sendBasicMessage( + @Param('orgId') orgId: string, + @Param( + 'connectionId', + TrimStringParamPipe, + new ParseUUIDPipe({ + exceptionFactory: (): Error => { + throw new BadRequestException(ResponseMessages.connection.error.invalidConnectionId); + } + }) + ) + connectionId: string, + @Body() basicMessageDto: BasicMessageDto, + @User() reqUser: IUserRequestSelectedOrgsInterface, + @Res() res: Response + ): Promise { + basicMessageDto.orgId = orgId; + basicMessageDto.connectionId = connectionId; + const basicMesgResponse = await this.connectionService.sendBasicMessage(basicMessageDto); + const finalResponse: IResponse = { + statusCode: HttpStatus.CREATED, + message: ResponseMessages.connection.success.basicMessage, + data: basicMesgResponse + }; + return res.status(HttpStatus.CREATED).json(finalResponse); + } } diff --git a/apps/api-gateway/src/connection/connection.module.ts b/apps/api-gateway/src/connection/connection.module.ts index 0a578b400..b8bc918d5 100644 --- a/apps/api-gateway/src/connection/connection.module.ts +++ b/apps/api-gateway/src/connection/connection.module.ts @@ -1,25 +1,46 @@ -import { getNatsOptions } from '@credebl/common/nats.config'; +import { getNatsOptions } from '@credebl/common'; import { ConnectionController } from './connection.controller'; import { ConnectionService } from './connection.service'; -import { Module } from '@nestjs/common'; +import { DynamicModule, Module, Provider } from '@nestjs/common'; import { ClientsModule, Transport } from '@nestjs/microservices'; -import { CommonConstants } from '@credebl/common/common.constant'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { CommonConstants } from '@credebl/common'; +import { NATSClient } from '@credebl/common'; @Module({ - imports: [ - - ClientsModule.register([ - { - name: 'NATS_CLIENT', - transport: Transport.NATS, - options: getNatsOptions(CommonConstants.CONNECTION_SERVICE, process.env.API_GATEWAY_NKEY_SEED) - } - ]) - ], - controllers: [ConnectionController], - providers: [ConnectionService, NATSClient] + imports: [ + ClientsModule.register([ + { + name: 'NATS_CLIENT', + transport: Transport.NATS, + options: getNatsOptions(CommonConstants.CONNECTION_SERVICE, process.env.API_GATEWAY_NKEY_SEED) + } + ]) + ], + controllers: [ConnectionController], + providers: [ConnectionService, NATSClient] }) - export class ConnectionModule { -} \ No newline at end of file + static register( + overrides: Provider[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + controllerOverrides: any[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + importedModules: any[] = [] + ): DynamicModule { + return { + module: ConnectionModule, + imports: [ + ClientsModule.register([ + { + name: 'NATS_CLIENT', + transport: Transport.NATS, + options: getNatsOptions(CommonConstants.CONNECTION_SERVICE, process.env.API_GATEWAY_NKEY_SEED) + } + ]), + ...importedModules + ], + controllers: controllerOverrides.length ? controllerOverrides : [ConnectionController], + providers: [ConnectionService, NATSClient, ...overrides] + }; + } +} diff --git a/apps/api-gateway/src/connection/connection.service.ts b/apps/api-gateway/src/connection/connection.service.ts index 215439f31..99d9a6de7 100644 --- a/apps/api-gateway/src/connection/connection.service.ts +++ b/apps/api-gateway/src/connection/connection.service.ts @@ -1,23 +1,34 @@ -import { IUserRequest } from '@credebl/user-request/user-request.interface'; -import { Inject, Injectable} from '@nestjs/common'; +import { IUserRequest } from '@credebl/user-management'; +import { Inject, Injectable } from '@nestjs/common'; import { ClientProxy, RpcException } from '@nestjs/microservices'; -import { BaseService } from 'libs/service/base.service'; -import { ConnectionDto, CreateOutOfBandConnectionInvitation, ReceiveInvitationDto, ReceiveInvitationUrlDto } from './dtos/connection.dto'; -import { IReceiveInvitationRes, IUserRequestInterface } from './interfaces'; -import { IConnectionList, IDeletedConnectionsRecord } from '@credebl/common/interfaces/connection.interface'; -import { AgentConnectionSearchCriteria, IConnectionDetailsById, IConnectionSearchCriteria } from '../interfaces/IConnectionSearch.interface'; +import { BaseService } from '@credebl/common'; +import { + ConnectionDto, + CreateOutOfBandConnectionInvitation, + ReceiveInvitationDto, + ReceiveInvitationUrlDto +} from './dtos/connection.dto'; +import { IReceiveInvitationRes } from './interfaces'; +import { IConnectionList, IDeletedConnectionsRecord } from '@credebl/common'; +import { + AgentConnectionSearchCriteria, + IConnectionDetailsById, + IConnectionSearchCriteria +} from '../interfaces/IConnectionSearch.interface'; import { BasicMessageDto, QuestionDto } from './dtos/question-answer.dto'; -import { user } from '@prisma/client'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { user } from '@credebl/prisma-service'; +import { NATSClient } from '@credebl/common'; +import { IUserRequestSelectedOrgsInterface } from '../schema/interfaces'; @Injectable() export class ConnectionService extends BaseService { - constructor(@Inject('NATS_CLIENT') private readonly connectionServiceProxy: ClientProxy, private readonly natsClient : NATSClient) { + constructor( + @Inject('NATS_CLIENT') private readonly connectionServiceProxy: ClientProxy, + private readonly natsClient: NATSClient + ) { super('ConnectionService'); } - sendQuestion( - questionDto: QuestionDto - ): Promise { + sendQuestion(questionDto: QuestionDto): Promise { try { return this.natsClient.sendNatsMessage(this.connectionServiceProxy, 'send-question', questionDto); } catch (error) { @@ -25,20 +36,19 @@ export class ConnectionService extends BaseService { } } - sendBasicMessage( - basicMessageDto: BasicMessageDto - ): Promise { + sendBasicMessage(basicMessageDto: BasicMessageDto): Promise { try { - return this.natsClient.sendNatsMessage(this.connectionServiceProxy, 'send-basic-message-on-connection', basicMessageDto); + return this.natsClient.sendNatsMessage( + this.connectionServiceProxy, + 'send-basic-message-on-connection', + basicMessageDto + ); } catch (error) { throw new RpcException(error.response); } } - getConnectionWebhook( - connectionDto: ConnectionDto, - orgId: string - ): Promise { + getConnectionWebhook(connectionDto: ConnectionDto, orgId: string): Promise { const payload = { connectionDto, orgId }; return this.natsClient.sendNatsMessage(this.connectionServiceProxy, 'webhook-get-connection', payload); } @@ -71,27 +81,23 @@ export class ConnectionService extends BaseService { return this.natsClient.sendNatsMessage(this.connectionServiceProxy, 'get-all-agent-connection-list', payload); } - getConnectionsById( - user: IUserRequest, - connectionId: string, - orgId: string - ): Promise { + getConnectionsById(user: IUserRequest, connectionId: string, orgId: string): Promise { const payload = { user, connectionId, orgId }; - return this.natsClient.sendNatsMessage(this.connectionServiceProxy, 'get-connection-details-by-connectionId', payload); + return this.natsClient.sendNatsMessage( + this.connectionServiceProxy, + 'get-connection-details-by-connectionId', + payload + ); } - - getQuestionAnswersRecord( - orgId: string - ): Promise { - + getQuestionAnswersRecord(orgId: string): Promise { return this.natsClient.sendNatsMessage(this.connectionServiceProxy, 'get-question-answer-record', orgId); } receiveInvitationUrl( receiveInvitationUrl: ReceiveInvitationUrlDto, orgId: string, - user: IUserRequestInterface + user: IUserRequestSelectedOrgsInterface ): Promise { const payload = { user, receiveInvitationUrl, orgId }; return this.natsClient.sendNatsMessage(this.connectionServiceProxy, 'receive-invitation-url', payload); @@ -100,7 +106,7 @@ export class ConnectionService extends BaseService { receiveInvitation( receiveInvitation: ReceiveInvitationDto, orgId: string, - user: IUserRequestInterface + user: IUserRequestSelectedOrgsInterface ): Promise { const payload = { user, receiveInvitation, orgId }; return this.natsClient.sendNatsMessage(this.connectionServiceProxy, 'receive-invitation', payload); @@ -110,7 +116,7 @@ export class ConnectionService extends BaseService { const pattern = { cmd: 'get-webhookurl' }; const payload = { tenantId, orgId }; - + try { // eslint-disable-next-line @typescript-eslint/no-explicit-any const message = await this.connectionServiceProxy.send(pattern, payload).toPromise(); @@ -121,10 +127,10 @@ export class ConnectionService extends BaseService { } } - async _postWebhookResponse(webhookUrl: string, data:object): Promise { + async _postWebhookResponse(webhookUrl: string, data: object): Promise { const pattern = { cmd: 'post-webhook-response-to-webhook-url' }; - const payload = { webhookUrl, data }; - + const payload = { webhookUrl, data }; + try { // eslint-disable-next-line @typescript-eslint/no-explicit-any const message = await this.connectionServiceProxy.send(pattern, payload).toPromise(); @@ -137,7 +143,7 @@ export class ConnectionService extends BaseService { createConnectionInvitation( createOutOfBandConnectionInvitation: CreateOutOfBandConnectionInvitation, - user: IUserRequestInterface + user: IUserRequestSelectedOrgsInterface ): Promise { const payload = { user, createOutOfBandConnectionInvitation }; return this.natsClient.sendNatsMessage(this.connectionServiceProxy, 'create-connection-invitation', payload); diff --git a/apps/api-gateway/src/connection/dtos/connection.dto.ts b/apps/api-gateway/src/connection/dtos/connection.dto.ts index da4cef77d..456706de4 100644 --- a/apps/api-gateway/src/connection/dtos/connection.dto.ts +++ b/apps/api-gateway/src/connection/dtos/connection.dto.ts @@ -1,369 +1,376 @@ -import { ArrayNotEmpty, IsArray, IsBoolean, IsNotEmpty, IsNumber, IsOptional, IsString, IsUrl, ValidateNested } from 'class-validator'; +import { + ArrayNotEmpty, + IsArray, + IsBoolean, + IsNotEmpty, + IsNumber, + IsOptional, + IsString, + IsUrl, + ValidateNested +} from 'class-validator'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { Type } from 'class-transformer'; import { HandshakeProtocol } from '../enums/connections.enum'; -import { IsNotSQLInjection } from '@credebl/common/cast.helper'; +import { IsNotSQLInjection } from '@credebl/common'; export class CreateOutOfBandConnectionInvitation { - @ApiPropertyOptional() - @IsOptional() - label?: string; - - @ApiPropertyOptional() - @IsOptional() - alias?: string; - - @ApiPropertyOptional() - @IsOptional() - imageUrl?: string; - - @ApiPropertyOptional() - @IsOptional() - goalCode?: string; - - @ApiPropertyOptional() - @IsOptional() - goal?: string; - - @ApiPropertyOptional() - @IsOptional() - handshake?: boolean; - - @ApiPropertyOptional() - @IsOptional() - handshakeProtocols?: HandshakeProtocol[]; - - @ApiPropertyOptional() - @IsOptional() - messages?: object[]; - - @ApiPropertyOptional() - @IsOptional() - multiUseInvitation?: boolean; - - @ApiPropertyOptional() - @IsOptional() - IsReuseConnection?: boolean; - - @ApiPropertyOptional() - @IsOptional() - autoAcceptConnection?: boolean; - - @ApiPropertyOptional() - @IsOptional() - routing?: object; - - @ApiPropertyOptional() - @IsOptional() - appendedAttachments?: object[]; - - @ApiPropertyOptional() - @IsString() - @IsOptional() - @IsNotEmpty({ message: 'Please provide recipientKey' }) - recipientKey: string; - - @ApiPropertyOptional() - @IsString() - @IsOptional() - @IsNotEmpty({ message: 'Please provide invitation did' }) - invitationDid?: string; - - orgId; + @ApiPropertyOptional() + @IsOptional() + label?: string; + + @ApiPropertyOptional() + @IsOptional() + alias?: string; + + @ApiPropertyOptional() + @IsOptional() + imageUrl?: string; + + @ApiPropertyOptional() + @IsOptional() + goalCode?: string; + + @ApiPropertyOptional() + @IsOptional() + goal?: string; + + @ApiPropertyOptional() + @IsOptional() + handshake?: boolean; + + @ApiPropertyOptional() + @IsOptional() + handshakeProtocols?: HandshakeProtocol[]; + + @ApiPropertyOptional() + @IsOptional() + messages?: object[]; + + @ApiPropertyOptional() + @IsOptional() + multiUseInvitation?: boolean; + + @ApiPropertyOptional() + @IsOptional() + IsReuseConnection?: boolean; + + @ApiPropertyOptional() + @IsOptional() + autoAcceptConnection?: boolean; + + @ApiPropertyOptional() + @IsOptional() + routing?: object; + + @ApiPropertyOptional() + @IsOptional() + appendedAttachments?: object[]; + + @ApiPropertyOptional() + @IsString() + @IsOptional() + @IsNotEmpty({ message: 'Please provide recipientKey' }) + recipientKey: string; + + @ApiPropertyOptional() + @IsString() + @IsOptional() + @IsNotEmpty({ message: 'Please provide invitation did' }) + invitationDid?: string; + + orgId; } export class CreateConnectionDto { - @ApiPropertyOptional() - @IsOptional() - @IsString({ message: 'alias must be a string' }) - @IsNotEmpty({ message: 'please provide valid alias' }) - @IsNotSQLInjection({ message: 'alias is required.' }) - alias: string; - - @ApiPropertyOptional() - @IsOptional() - @IsString({ message: 'label must be a string' }) - @IsNotEmpty({ message: 'please provide valid label' }) - @IsNotSQLInjection({ message: 'label is required.' }) - label: string; - - @ApiPropertyOptional() - @IsOptional() - @IsNotEmpty({ message: 'please provide valid imageUrl' }) - @IsString({ message: 'imageUrl must be a string' }) - imageUrl: string; - - @ApiPropertyOptional() - @IsBoolean() - @IsOptional() - @IsNotEmpty({ message: 'please provide multiUseInvitation' }) - multiUseInvitation: boolean; - - @ApiPropertyOptional() - @IsBoolean() - @IsOptional() - @IsNotEmpty({ message: 'Please provide autoAcceptConnection' }) - autoAcceptConnection: boolean; - - @ApiPropertyOptional() - @IsString() - @IsOptional() - @IsNotEmpty({ message: 'Please provide goalCode' }) - goalCode: string; - - @ApiPropertyOptional() - @IsString() - @IsOptional() - @IsNotEmpty({ message: 'Please provide goal' }) - goal: string; - - @ApiPropertyOptional() - @IsBoolean() - @IsOptional() - @IsNotEmpty({ message: 'Please provide handshake' }) - handshake: boolean; - - @ApiPropertyOptional() - @IsArray() - @ArrayNotEmpty() - @IsOptional() - @IsString({ each: true }) - handshakeProtocols: string[]; - - orgId: string; - - @ApiPropertyOptional() - @IsString() - @IsOptional() - @IsNotEmpty({ message: 'Please provide recipientKey' }) - recipientKey: string; - - @ApiPropertyOptional() - @IsString() - @IsOptional() - @IsNotEmpty({ message: 'Please provide invitation did' }) - invitationDid?: string; + @ApiPropertyOptional() + @IsOptional() + @IsString({ message: 'alias must be a string' }) + @IsNotEmpty({ message: 'please provide valid alias' }) + @IsNotSQLInjection({ message: 'alias is required.' }) + alias: string; + + @ApiPropertyOptional() + @IsOptional() + @IsString({ message: 'label must be a string' }) + @IsNotEmpty({ message: 'please provide valid label' }) + @IsNotSQLInjection({ message: 'label is required.' }) + label: string; + + @ApiPropertyOptional() + @IsOptional() + @IsNotEmpty({ message: 'please provide valid imageUrl' }) + @IsString({ message: 'imageUrl must be a string' }) + imageUrl: string; + + @ApiPropertyOptional({ example: true }) + @IsBoolean() + @IsOptional() + @IsNotEmpty({ message: 'please provide multiUseInvitation' }) + multiUseInvitation: boolean; + + @ApiPropertyOptional({ example: true }) + @IsBoolean() + @IsOptional() + @IsNotEmpty({ message: 'Please provide autoAcceptConnection' }) + autoAcceptConnection: boolean; + + @ApiPropertyOptional() + @IsString() + @IsOptional() + @IsNotEmpty({ message: 'Please provide goalCode' }) + goalCode: string; + + @ApiPropertyOptional() + @IsString() + @IsOptional() + @IsNotEmpty({ message: 'Please provide goal' }) + goal: string; + + @ApiPropertyOptional() + @IsBoolean() + @IsOptional() + @IsNotEmpty({ message: 'Please provide handshake' }) + handshake: boolean; + + @ApiPropertyOptional({ example: ['https://didcomm.org/didexchange/1.x'] }) + @IsArray() + @ArrayNotEmpty() + @IsOptional() + @IsString({ each: true }) + handshakeProtocols: string[]; + + orgId: string; + + @ApiPropertyOptional() + @IsString() + @IsOptional() + @IsNotEmpty({ message: 'Please provide recipientKey' }) + recipientKey: string; + + @ApiPropertyOptional() + @IsString() + @IsOptional() + @IsNotEmpty({ message: 'Please provide invitation did' }) + invitationDid?: string; } export class ConnectionDto { - @ApiPropertyOptional() - @IsOptional() - id: string; + @ApiPropertyOptional() + @IsOptional() + id: string; - @ApiPropertyOptional() - @IsOptional() - createdAt: string; + @ApiPropertyOptional() + @IsOptional() + createdAt: string; - @ApiPropertyOptional() - @IsOptional() - did: string; + @ApiPropertyOptional() + @IsOptional() + did: string; - @ApiPropertyOptional() - @IsOptional() - theirDid: string; + @ApiPropertyOptional() + @IsOptional() + theirDid: string; - @ApiPropertyOptional() - @IsOptional() - theirLabel: string; + @ApiPropertyOptional() + @IsOptional() + theirLabel: string; - @ApiPropertyOptional() - @IsOptional() - state: string; + @ApiPropertyOptional() + @IsOptional() + state: string; - @ApiPropertyOptional() - @IsOptional() - role: string; + @ApiPropertyOptional() + @IsOptional() + role: string; - @ApiPropertyOptional() - @IsOptional() - imageUrl: string; + @ApiPropertyOptional() + @IsOptional() + imageUrl: string; - @ApiPropertyOptional() - @IsOptional() - autoAcceptConnection: boolean; + @ApiPropertyOptional() + @IsOptional() + autoAcceptConnection: boolean; - @ApiPropertyOptional() - @IsOptional() - threadId: string; + @ApiPropertyOptional() + @IsOptional() + threadId: string; - @ApiPropertyOptional() - @IsOptional() - protocol: string; + @ApiPropertyOptional() + @IsOptional() + protocol: string; - @ApiPropertyOptional() - @IsOptional() - outOfBandId: string; + @ApiPropertyOptional() + @IsOptional() + outOfBandId: string; - @ApiPropertyOptional() - @IsOptional() - updatedAt: string; + @ApiPropertyOptional() + @IsOptional() + updatedAt: string; - @ApiPropertyOptional() - @IsOptional() - contextCorrelationId: string; + @ApiPropertyOptional() + @IsOptional() + contextCorrelationId: string; - @ApiPropertyOptional() - @IsOptional() - type: string; + @ApiPropertyOptional() + @IsOptional() + type: string; - @ApiPropertyOptional() - @IsOptional() - orgId: string; + @ApiPropertyOptional() + @IsOptional() + orgId: string; - @ApiPropertyOptional() - @IsOptional() - outOfBandRecord?: object; + @ApiPropertyOptional() + @IsOptional() + outOfBandRecord?: object; - @ApiPropertyOptional() - @IsOptional() - reuseThreadId?: string; + @ApiPropertyOptional() + @IsOptional() + reuseThreadId?: string; } class ReceiveInvitationCommonDto { - @ApiPropertyOptional() - @IsOptional() - @IsString({ message: 'alias must be a string' }) - @IsNotEmpty({ message: 'please provide valid alias' }) - alias: string; - - @ApiPropertyOptional() - @IsOptional() - @IsString({ message: 'label must be a string' }) - @IsNotEmpty({ message: 'please provide valid label' }) - label: string; - - @ApiPropertyOptional() - @IsOptional() - @IsString({ message: 'imageUrl must be a string' }) - @IsNotEmpty({ message: 'please provide valid imageUrl' }) - @IsString() - imageUrl: string; - - @ApiPropertyOptional() - @IsOptional() - @IsBoolean({ message: 'autoAcceptConnection must be a boolean' }) - @IsNotEmpty({ message: 'please provide valid autoAcceptConnection' }) - autoAcceptConnection: boolean; - - @ApiPropertyOptional() - @IsOptional() - @IsBoolean({ message: 'autoAcceptInvitation must be a boolean' }) - @IsNotEmpty({ message: 'please provide valid autoAcceptInvitation' }) - autoAcceptInvitation: boolean; - - @ApiPropertyOptional() - @IsOptional() - @IsBoolean({ message: 'reuseConnection must be a boolean' }) - @IsNotEmpty({ message: 'please provide valid reuseConnection' }) - reuseConnection: boolean; - - @ApiPropertyOptional() - @IsOptional() - @IsNumber() - @IsNotEmpty({ message: 'please provide valid acceptInvitationTimeoutMs' }) - acceptInvitationTimeoutMs: number; + @ApiPropertyOptional() + @IsOptional() + @IsString({ message: 'alias must be a string' }) + @IsNotEmpty({ message: 'please provide valid alias' }) + alias: string; + + @ApiPropertyOptional() + @IsOptional() + @IsString({ message: 'label must be a string' }) + @IsNotEmpty({ message: 'please provide valid label' }) + label: string; + + @ApiPropertyOptional() + @IsOptional() + @IsString({ message: 'imageUrl must be a string' }) + @IsNotEmpty({ message: 'please provide valid imageUrl' }) + @IsString() + imageUrl: string; + + @ApiPropertyOptional() + @IsOptional() + @IsBoolean({ message: 'autoAcceptConnection must be a boolean' }) + @IsNotEmpty({ message: 'please provide valid autoAcceptConnection' }) + autoAcceptConnection: boolean; + + @ApiPropertyOptional() + @IsOptional() + @IsBoolean({ message: 'autoAcceptInvitation must be a boolean' }) + @IsNotEmpty({ message: 'please provide valid autoAcceptInvitation' }) + autoAcceptInvitation: boolean; + + @ApiPropertyOptional() + @IsOptional() + @IsBoolean({ message: 'reuseConnection must be a boolean' }) + @IsNotEmpty({ message: 'please provide valid reuseConnection' }) + reuseConnection: boolean; + + @ApiPropertyOptional() + @IsOptional() + @IsNumber() + @IsNotEmpty({ message: 'please provide valid acceptInvitationTimeoutMs' }) + acceptInvitationTimeoutMs: number; } export class ReceiveInvitationUrlDto extends ReceiveInvitationCommonDto { - - @ApiProperty() - @IsOptional() - @IsString({ message: 'invitationUrl must be a string' }) - @IsNotEmpty({ message: 'please provide valid invitationUrl' }) - invitationUrl: string; + @ApiProperty() + @IsOptional() + @IsString({ message: 'invitationUrl must be a string' }) + @IsNotEmpty({ message: 'please provide valid invitationUrl' }) + invitationUrl: string; } - class ServiceDto { - @ApiProperty() - @IsString() - @IsNotEmpty({ message: 'please provide valid id' }) - id: string; - - @ApiProperty() - @IsString() - @IsNotEmpty({ message: 'please provide valid serviceEndpoint' }) - @IsUrl({}, { message: 'Invalid serviceEndpoint format' }) - serviceEndpoint: string; - - @ApiProperty() - @IsString() - @IsNotEmpty({ message: 'please provide valid type' }) - type: string; - - @ApiProperty() - @IsString({ each: true }) - recipientKeys: string[]; - - @ApiPropertyOptional() - @IsOptional() - @IsString({ each: true }) - routingKeys: string[]; - - @ApiPropertyOptional() - @IsOptional() - @IsString({ each: true }) - accept: string[]; + @ApiProperty() + @IsString() + @IsNotEmpty({ message: 'please provide valid id' }) + id: string; + + @ApiProperty() + @IsString() + @IsNotEmpty({ message: 'please provide valid serviceEndpoint' }) + @IsUrl({}, { message: 'Invalid serviceEndpoint format' }) + serviceEndpoint: string; + + @ApiProperty() + @IsString() + @IsNotEmpty({ message: 'please provide valid type' }) + type: string; + + @ApiProperty() + @IsString({ each: true }) + recipientKeys: string[]; + + @ApiPropertyOptional() + @IsOptional() + @IsString({ each: true }) + routingKeys: string[]; + + @ApiPropertyOptional() + @IsOptional() + @IsString({ each: true }) + accept: string[]; } class InvitationDto { - @ApiPropertyOptional() - @IsOptional() - @IsString() - @IsNotEmpty({ message: 'please provide valid @id' }) - '@id': string; - - @ApiProperty() - @IsString() - @IsNotEmpty({ message: 'please provide valid @type' }) - '@type': string; - - @ApiProperty() - @IsString() - @IsNotEmpty({ message: 'please provide valid label' }) - label: string; - - @ApiPropertyOptional() - @IsOptional() - @IsString() - @IsNotEmpty({ message: 'please provide valid goalCode' }) - goalCode: string; - - @ApiPropertyOptional() - @IsOptional() - @IsString() - @IsNotEmpty({ message: 'please provide valid goal' }) - goal: string; - - @ApiPropertyOptional() - @IsOptional() - @IsString({ each: true }) - accept: string[]; - - @ApiPropertyOptional() - @IsOptional() - @IsString({ each: true }) - // eslint-disable-next-line camelcase - handshake_protocols: string[]; - - @ApiProperty() - @ValidateNested({ each: true }) - @Type(() => ServiceDto) - services: ServiceDto[]; - - @ApiPropertyOptional() - @IsString() - @IsOptional() - @IsNotEmpty({ message: 'please provide valid imageUrl' }) - @IsString() - imageUrl?: string; + @ApiPropertyOptional() + @IsOptional() + @IsString() + @IsNotEmpty({ message: 'please provide valid @id' }) + '@id': string; + + @ApiProperty() + @IsString() + @IsNotEmpty({ message: 'please provide valid @type' }) + '@type': string; + + @ApiProperty() + @IsString() + @IsNotEmpty({ message: 'please provide valid label' }) + label: string; + + @ApiPropertyOptional() + @IsOptional() + @IsString() + @IsNotEmpty({ message: 'please provide valid goalCode' }) + goalCode: string; + + @ApiPropertyOptional() + @IsOptional() + @IsString() + @IsNotEmpty({ message: 'please provide valid goal' }) + goal: string; + + @ApiPropertyOptional() + @IsOptional() + @IsString({ each: true }) + accept: string[]; + + @ApiPropertyOptional() + @IsOptional() + @IsString({ each: true }) + // eslint-disable-next-line camelcase + handshake_protocols: string[]; + + @ApiProperty() + @ValidateNested({ each: true }) + @Type(() => ServiceDto) + services: ServiceDto[]; + + @ApiPropertyOptional() + @IsString() + @IsOptional() + @IsNotEmpty({ message: 'please provide valid imageUrl' }) + @IsString() + imageUrl?: string; } export class ReceiveInvitationDto extends ReceiveInvitationCommonDto { - - @ApiProperty() - @ValidateNested() - @Type(() => InvitationDto) - invitation: InvitationDto; -} \ No newline at end of file + @ApiProperty() + @ValidateNested() + @Type(() => InvitationDto) + invitation: InvitationDto; +} diff --git a/apps/api-gateway/src/connection/dtos/get-all-connections.dto.ts b/apps/api-gateway/src/connection/dtos/get-all-connections.dto.ts index 08e97b3b3..b1a3b98cc 100644 --- a/apps/api-gateway/src/connection/dtos/get-all-connections.dto.ts +++ b/apps/api-gateway/src/connection/dtos/get-all-connections.dto.ts @@ -1,9 +1,7 @@ import { ApiProperty } from '@nestjs/swagger'; import { Transform, Type } from 'class-transformer'; import { IsEnum, IsOptional, Max, Min } from 'class-validator'; -import { SortValue } from '../../enum'; -import { toNumber, trim } from '@credebl/common/cast.helper'; -import { SortFields } from 'apps/connection/src/enum/connection.enum'; +import { SortFields, toNumber, trim, SortValue } from '@credebl/common'; export class GetAllConnectionsDto { @ApiProperty({ required: false, example: '1' }) diff --git a/apps/api-gateway/src/connection/dtos/index.ts b/apps/api-gateway/src/connection/dtos/index.ts new file mode 100644 index 000000000..91863b448 --- /dev/null +++ b/apps/api-gateway/src/connection/dtos/index.ts @@ -0,0 +1,3 @@ +export * from './connection.dto'; +export * from './get-all-connections.dto'; +export * from './question-answer.dto'; diff --git a/apps/api-gateway/src/connection/dtos/question-answer.dto.ts b/apps/api-gateway/src/connection/dtos/question-answer.dto.ts index d9deb3dfc..fd82c7342 100644 --- a/apps/api-gateway/src/connection/dtos/question-answer.dto.ts +++ b/apps/api-gateway/src/connection/dtos/question-answer.dto.ts @@ -1,105 +1,102 @@ -import { trim } from '@credebl/common/cast.helper'; +import { trim } from '@credebl/common'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { Transform, Type } from 'class-transformer'; import { IsArray, IsNotEmpty, IsOptional, IsString, ValidateNested } from 'class-validator'; class ValidResponses { - @ApiProperty({ example: 'Emma' }) - @IsNotEmpty({ message: 'text is required' }) - @IsString({ message: 'text should be a string' }) - @Transform(({ value }) => trim(value)) - @Type(() => String) - text: string; + @ApiProperty({ example: 'Emma' }) + @IsNotEmpty({ message: 'text is required' }) + @IsString({ message: 'text should be a string' }) + @Transform(({ value }) => trim(value)) + @Type(() => String) + text: string; } export class QuestionDto { - @ApiPropertyOptional() - @IsOptional() - @IsString({ message: 'detail must be a string' }) - @IsNotEmpty({ message: 'please provide valid detail' }) - detail: string; - - @ApiProperty({ example: [{ 'text': 'Emma'}, { 'text': 'Kiva'}] }) - @IsNotEmpty({ message: 'Please provide valid responses' }) - @IsArray({ message: 'Responses should be array' }) - @ValidateNested({ each: true }) - @Type(() => ValidResponses) - validResponses: ValidResponses[]; - - @ApiProperty({ example: 'What is your name'}) - @IsNotEmpty({ message: 'question is required' }) - @IsString({ message: 'question must be a string' }) - @IsNotEmpty({ message: 'please provide valid question' }) - question: string; - - orgId: string; - connectionId: string; + @ApiPropertyOptional() + @IsOptional() + @IsString({ message: 'detail must be a string' }) + @IsNotEmpty({ message: 'please provide valid detail' }) + detail: string; + + @ApiProperty({ example: [{ text: 'Emma' }, { text: 'Kiva' }] }) + @IsNotEmpty({ message: 'Please provide valid responses' }) + @IsArray({ message: 'Responses should be array' }) + @ValidateNested({ each: true }) + @Type(() => ValidResponses) + validResponses: ValidResponses[]; + + @ApiProperty({ example: 'What is your name' }) + @IsNotEmpty({ message: 'question is required' }) + @IsString({ message: 'question must be a string' }) + @IsNotEmpty({ message: 'please provide valid question' }) + question: string; + + orgId: string; + connectionId: string; } export class BasicMessageDto { - @ApiPropertyOptional() - @IsOptional() - @IsString({ message: 'content must be a string' }) - @IsNotEmpty({ message: 'please provide valid content' }) - content: string; - - orgId: string; - connectionId: string; + @ApiPropertyOptional() + @IsOptional() + @IsString({ message: 'content must be a string' }) + @IsNotEmpty({ message: 'please provide valid content' }) + content: string; + + orgId: string; + connectionId: string; } export class QuestionAnswerWebhookDto { - - - @ApiPropertyOptional() - @IsOptional() - id: string; - - @ApiPropertyOptional() - @IsOptional() - createdAt: string; - - @ApiPropertyOptional() - @IsOptional() - questionText: string; - - @ApiPropertyOptional() - @IsOptional() - questionDetail: string; - - @ApiPropertyOptional() - @IsOptional() - // eslint-disable-next-line @typescript-eslint/no-explicit-any - validResponses:any; - - @ApiPropertyOptional() - @IsOptional() - connectionId: string; - - @ApiPropertyOptional() - @IsOptional() - role: string; - - @ApiPropertyOptional() - @IsOptional() - signatureRequired: boolean; - - @ApiPropertyOptional() - @IsOptional() - state: boolean; - - @ApiPropertyOptional() - @IsOptional() - threadId: string; - - @ApiPropertyOptional() - @IsOptional() - updatedAt: string; - - @ApiPropertyOptional() - @IsOptional() - contextCorrelationId: string; - - @ApiPropertyOptional() - @IsOptional() - type: string; - -} \ No newline at end of file + @ApiPropertyOptional() + @IsOptional() + id: string; + + @ApiPropertyOptional() + @IsOptional() + createdAt: string; + + @ApiPropertyOptional() + @IsOptional() + questionText: string; + + @ApiPropertyOptional() + @IsOptional() + questionDetail: string; + + @ApiPropertyOptional() + @IsOptional() + // eslint-disable-next-line @typescript-eslint/no-explicit-any + validResponses: any; + + @ApiPropertyOptional() + @IsOptional() + connectionId: string; + + @ApiPropertyOptional() + @IsOptional() + role: string; + + @ApiPropertyOptional() + @IsOptional() + signatureRequired: boolean; + + @ApiPropertyOptional() + @IsOptional() + state: boolean; + + @ApiPropertyOptional() + @IsOptional() + threadId: string; + + @ApiPropertyOptional() + @IsOptional() + updatedAt: string; + + @ApiPropertyOptional() + @IsOptional() + contextCorrelationId: string; + + @ApiPropertyOptional() + @IsOptional() + type: string; +} diff --git a/apps/api-gateway/src/connection/enums/index.ts b/apps/api-gateway/src/connection/enums/index.ts new file mode 100644 index 000000000..230b5d570 --- /dev/null +++ b/apps/api-gateway/src/connection/enums/index.ts @@ -0,0 +1 @@ +export * from './connections.enum'; diff --git a/apps/api-gateway/src/connection/index.ts b/apps/api-gateway/src/connection/index.ts new file mode 100644 index 000000000..f239a4444 --- /dev/null +++ b/apps/api-gateway/src/connection/index.ts @@ -0,0 +1,5 @@ +export * from './connection.controller'; +export * from './connection.module'; +export * from './connection.service'; +export * from './dtos'; +export * from './enums'; diff --git a/apps/api-gateway/src/connection/interfaces/index.ts b/apps/api-gateway/src/connection/interfaces/index.ts index 20f8f584b..e9d7739f1 100644 --- a/apps/api-gateway/src/connection/interfaces/index.ts +++ b/apps/api-gateway/src/connection/interfaces/index.ts @@ -1,35 +1,3 @@ -import { UserRoleOrgPermsDto } from '../../dtos/user-role-org-perms.dto'; - -export interface IUserRequestInterface { - userId: string; - email: string; - orgId: string; - agentEndPoint?: string; - apiKey?: string; - tenantId?: string; - tenantName?: string; - tenantOrgId?: string; - userRoleOrgPermissions?: UserRoleOrgPermsDto[]; - orgName?: string; - selectedOrg: ISelectedOrgInterface; -} - -export interface ISelectedOrgInterface { - id: string; - userId: string; - orgRoleId: string; - orgId: string; - orgRole: object; - organisation: object; -} - -export interface IOrganizationInterface { - name: string; - description: string; - org_agents: IOrgAgentInterface[] - -} - export interface IOrgAgentInterface { orgDid: string; verkey: string; @@ -40,7 +8,6 @@ export interface IOrgAgentInterface { orgId: string; } - export class IConnectionInterface { tag: object; createdAt: string; @@ -71,8 +38,8 @@ interface IOutOfBandInvitationService { } interface IOutOfBandInvitation { - "@type": string; - "@id": string; + '@type': string; + '@id': string; label: string; accept: string[]; handshake_protocols: string[]; @@ -114,4 +81,4 @@ interface IConnectionRecord { export interface IReceiveInvitationRes { outOfBandRecord: IOutOfBandRecord; connectionRecord: IConnectionRecord; -} \ No newline at end of file +} diff --git a/apps/api-gateway/src/credential-definition/credential-definition.controller.spec.ts b/apps/api-gateway/src/credential-definition/credential-definition.controller.spec.ts deleted file mode 100644 index 2ad6e017a..000000000 --- a/apps/api-gateway/src/credential-definition/credential-definition.controller.spec.ts +++ /dev/null @@ -1,204 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; - -import { Any } from 'typeorm'; -import { CredentialDefinitionController } from './credential-definition.controller'; -import { CredentialDefinitionService } from './credential-definition.service'; - -describe('CredentialDefinitionController Test Cases', () => { - let controller: CredentialDefinitionController; - const mockCredentialDefinitionService = { - createCredentialDefinition: jest.fn(() => ({})), - getAllCredDefsByOrgId: jest.fn(() => ({})), - getCredDefsByCredId: jest.fn(() => ({})), - getAllCredentialDefinitionForHolder: jest.fn(() => ({})) - }; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - controllers: [CredentialDefinitionController], - providers: [CredentialDefinitionService] - }) - .overrideProvider(CredentialDefinitionService) - .useValue(mockCredentialDefinitionService) - .compile(); - controller = module.get( - CredentialDefinitionController - ); - }); - describe('createCredential', () => { - const user: any = {}; - user.orgId = 1234; - const createCredentialDefinition: any = { - schema_id: 'Test', - tag: 'Test', - support_revocation: true, - support_auto_issue: true, - revocation_registry_size: 0 - }; - it('should return an expected credentialdefinition', async () => { - const result = await controller.createCredential( - user, - createCredentialDefinition - ); - expect(result).toEqual({}); - }); - - it('should check returned credentialdefinition is not to be null', async () => { - const result = await controller.createCredential( - user, - createCredentialDefinition - ); - expect(result).not.toBeNull(); - }); - it('should hit error if support_auto_issue is number', async () => { - createCredentialDefinition.support_auto_issue = 1234; - const result = await (() => { - controller.createCredential(user, createCredentialDefinition); - }); - expect(result).toThrowError('Support auto issue should be boolean.'); - }); - it('should hit error if support_auto_issue is empty', async () => { - createCredentialDefinition.support_auto_issue = ''; - const result = await (() => { - controller.createCredential(user, createCredentialDefinition); - }); - expect(result).toThrowError('Please provide support auto issue data.'); - }); - it('should hit error if support_revocation is empty', async () => { - createCredentialDefinition.support_revocation = ''; - const result = await (() => { - controller.createCredential(user, createCredentialDefinition); - }); - expect(result).toThrowError('Please provide support revocation data.'); - }); - it('should hit error if support_revocation is number', async () => { - createCredentialDefinition.support_revocation = 1234; - const result = await (() => { - controller.createCredential(user, createCredentialDefinition); - }); - expect(result).toThrowError('Support revocation should be boolean.'); - }); - it('should hit error if tag is empty', async () => { - createCredentialDefinition.tag = ''; - const result = await (() => { - controller.createCredential(user, createCredentialDefinition); - }); - expect(result).toThrowError('Please provide a valid tag.'); - }); - it('should hit error if tag is number', async () => { - createCredentialDefinition.tag = 1234; - const result = await (() => { - controller.createCredential(user, createCredentialDefinition); - }); - expect(result).toThrowError('Tag should be a string.'); - }); - it('should hit error if schema_id is empty', async () => { - createCredentialDefinition.schema_id = ''; - const result = await (() => { - controller.createCredential(user, createCredentialDefinition); - }); - expect(result).toThrowError('Please provide a schema id.'); - }); - it('should hit error if schema_id is number', async () => { - createCredentialDefinition.schema_id = 1234; - const result = await (() => { - controller.createCredential(user, createCredentialDefinition); - }); - expect(result).toThrowError('Schema id should be a string.'); - }); - //createCredential test case - - }); - describe('getAllCredDefsByOrgId', () => { - const page: any = 'hello'; - const search_text: any = 'Test'; - const items_per_page: any = 1234; - const orgId: any = 1234; - const credDefSortBy: any = 1234; - const sortValue: any = 1234; - const supportRevocation: any = 'Test'; - const user: any = 1234; - it('should return an expected credentialdefinition', async () => { - const result = await controller.getAllCredDefsByOrgId( - page, - search_text, - items_per_page, - orgId, - credDefSortBy, - sortValue, - supportRevocation, - user - ); - expect(result).toEqual({}); - }); - it('should return an expected credentialdefinition', async () => { - const result = await controller.getAllCredDefsByOrgId( - page, - search_text, - items_per_page, - orgId, - credDefSortBy, - sortValue, - supportRevocation, - user - ); - expect(result).not.toBeNull(); - }); - }); - // describe("getAllCredDefsByOrgId", () => { - // let page: any = "hello"; - - // it("should return an expected credentialdefinition", async () => { - // const result = await controller.getCredDefsByCredId( - // page, - // search_text, - - // ); - // expect(result).toEqual({}); - // }); - // it("should return an expected credentialdefinition", async () => { - // const result = await controller.getCredDefsByCredId( - // page, - // search_text, - - // ); - // expect(result).not.toBeNull(); - // }); - // }); - describe('getAllCredentialDefinitionForHolder', () => { - const page: any = 'hello'; - const search_text: any = 'Test'; - const items_per_page: any = 1234; - const orgId: any = 1234; - const credDefSortBy: any = 1234; - const sortValue: any = 1234; - const supportRevocation: any = 'Test'; - const user: any = 1234; - it('should return an expected credentialdefinition', async () => { - const result = await controller.getAllCredentialDefinitionForHolder( - page, - search_text, - items_per_page, - orgId, - credDefSortBy, - sortValue, - supportRevocation, - user - ); - expect(result).toEqual({}); - }); - it('should return an expected credentialdefinition', async () => { - const result = await controller.getAllCredDefsByOrgId( - page, - search_text, - items_per_page, - orgId, - credDefSortBy, - sortValue, - supportRevocation, - user - ); - expect(result).not.toBeNull(); - }); - }); -}); diff --git a/apps/api-gateway/src/credential-definition/credential-definition.controller.ts b/apps/api-gateway/src/credential-definition/credential-definition.controller.ts index 23eb3b36b..91b38f38f 100644 --- a/apps/api-gateway/src/credential-definition/credential-definition.controller.ts +++ b/apps/api-gateway/src/credential-definition/credential-definition.controller.ts @@ -1,23 +1,41 @@ -import { Controller, Logger, Post, Body, UseGuards, Get, Query, HttpStatus, Res, Param, UseFilters, ParseUUIDPipe, BadRequestException } from '@nestjs/common'; +import { + Controller, + Logger, + Post, + Body, + UseGuards, + Get, + Query, + HttpStatus, + Res, + Param, + UseFilters, + ParseUUIDPipe, + BadRequestException +} from '@nestjs/common'; import { CredentialDefinitionService } from './credential-definition.service'; -import { ApiTags, ApiOperation, ApiResponse, ApiBearerAuth, ApiUnauthorizedResponse, ApiForbiddenResponse } from '@nestjs/swagger'; -import { ApiResponseDto } from 'apps/api-gateway/src/dtos/apiResponse.dto'; -import { UnauthorizedErrorDto } from 'apps/api-gateway/src/dtos/unauthorized-error.dto'; -import { ForbiddenErrorDto } from 'apps/api-gateway/src/dtos/forbidden-error.dto'; +import { + ApiTags, + ApiOperation, + ApiResponse, + ApiBearerAuth, + ApiUnauthorizedResponse, + ApiForbiddenResponse +} from '@nestjs/swagger'; +import { ApiResponseDto, UnauthorizedErrorDto, ForbiddenErrorDto } from '../dtos'; import { User } from '../authz/decorators/user.decorator'; import { AuthGuard } from '@nestjs/passport'; -import { IResponse } from '@credebl/common/interfaces/response.interface'; -import { ResponseMessages } from '@credebl/common/response-messages'; +import { IResponse } from '@credebl/common'; +import { ResponseMessages } from '@credebl/common'; import { Response } from 'express'; import { GetAllCredDefsDto } from './dto/get-all-cred-defs.dto'; import { OrgRolesGuard } from '../authz/guards/org-roles.guard'; import { IUserRequestInterface } from '../interfaces/IUserRequestInterface'; import { CreateCredentialDefinitionDto } from './dto/create-cred-defs.dto'; -import { OrgRoles } from 'libs/org-roles/enums'; +import { OrgRoles } from '@credebl/common'; import { Roles } from '../authz/decorators/roles.decorator'; -import { CustomExceptionFilter } from 'apps/api-gateway/common/exception-handler'; -import { EmptyStringParamPipe, TrimStringParamPipe } from '@credebl/common/cast.helper'; - +import { CustomExceptionFilter } from '../common'; +import { EmptyStringParamPipe, TrimStringParamPipe } from '@credebl/common'; @ApiBearerAuth() @ApiTags('credential-definitions') @@ -26,8 +44,7 @@ import { EmptyStringParamPipe, TrimStringParamPipe } from '@credebl/common/cast. @ApiForbiddenResponse({ status: HttpStatus.FORBIDDEN, description: 'Forbidden', type: ForbiddenErrorDto }) @UseFilters(CustomExceptionFilter) export class CredentialDefinitionController { - - constructor(private readonly credentialDefinitionService: CredentialDefinitionService) { } + constructor(private readonly credentialDefinitionService: CredentialDefinitionService) {} private readonly logger = new Logger('CredentialDefinitionController'); /** @@ -40,7 +57,8 @@ export class CredentialDefinitionController { @Get('/orgs/:orgId/cred-defs/:credDefId') @ApiOperation({ summary: 'Get credential definition by credential definition Id', - description: 'Fetches the details of a specific credential definition using its ID available credential definitions on platform.' + description: + 'Fetches the details of a specific credential definition using its ID available credential definitions on platform.' }) @ApiResponse({ status: HttpStatus.CREATED, description: 'Success', type: ApiResponseDto }) @Roles(OrgRoles.OWNER, OrgRoles.ADMIN, OrgRoles.ISSUER, OrgRoles.VERIFIER, OrgRoles.MEMBER) @@ -50,7 +68,10 @@ export class CredentialDefinitionController { @Param('credDefId', TrimStringParamPipe, EmptyStringParamPipe.forParam('credDefId')) credentialDefinitionId: string, @Res() res: Response ): Promise { - const credentialsDefinitionDetails = await this.credentialDefinitionService.getCredentialDefinitionById(credentialDefinitionId, orgId); + const credentialsDefinitionDetails = await this.credentialDefinitionService.getCredentialDefinitionById( + credentialDefinitionId, + orgId + ); const credDefResponse: IResponse = { statusCode: HttpStatus.OK, message: ResponseMessages.credentialDefinition.success.fetch, @@ -59,7 +80,7 @@ export class CredentialDefinitionController { return res.status(HttpStatus.OK).json(credDefResponse); } - /** + /** * Retrieves all credential definitions linked to a specific schema. * * @param schemaId The unique identifier of the schema. @@ -68,7 +89,8 @@ export class CredentialDefinitionController { @Get('/verifiation/cred-defs/:schemaId') @ApiOperation({ summary: 'Get all credential definitions by schema Id', - description: 'Fetches all credential definitions associated with a specific schema ID available credential definitions on platform.' + description: + 'Fetches all credential definitions associated with a specific schema ID available credential definitions on platform.' }) @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) @UseGuards(AuthGuard('jwt')) @@ -76,7 +98,6 @@ export class CredentialDefinitionController { @Param('schemaId', TrimStringParamPipe) schemaId: string, @Res() res: Response ): Promise { - if (!schemaId) { throw new BadRequestException(ResponseMessages.schema.error.invalidSchemaId); } @@ -90,11 +111,11 @@ export class CredentialDefinitionController { return res.status(HttpStatus.OK).json(credDefResponse); } - /** - * Retrieves all credential definitions for a given organization. - * - * @param orgId The unique identifier of the organization. - * @returns A paginated list of credential definitions for the organization. + /** + * Retrieves all credential definitions for a given organization. + * + * @param orgId The unique identifier of the organization. + * @returns A paginated list of credential definitions for the organization. */ @Get('/orgs/:orgId/cred-defs') @ApiOperation({ @@ -104,7 +125,15 @@ export class CredentialDefinitionController { @Roles(OrgRoles.OWNER, OrgRoles.ADMIN, OrgRoles.ISSUER, OrgRoles.VERIFIER, OrgRoles.MEMBER) @UseGuards(AuthGuard('jwt'), OrgRolesGuard) async getAllCredDefs( - @Param('orgId', new ParseUUIDPipe({exceptionFactory: (): Error => { throw new BadRequestException(ResponseMessages.organisation.error.invalidOrgId); }})) orgId: string, + @Param( + 'orgId', + new ParseUUIDPipe({ + exceptionFactory: (): Error => { + throw new BadRequestException(ResponseMessages.organisation.error.invalidOrgId); + } + }) + ) + orgId: string, @Query() getAllCredDefs: GetAllCredDefsDto, @User() user: IUserRequestInterface, @Res() res: Response @@ -122,7 +151,7 @@ export class CredentialDefinitionController { return res.status(HttpStatus.OK).json(credDefResponse); } - /** + /** * Creates a new credential definition and submits it to the ledger. * * @param orgId The unique identifier of the organization. @@ -140,12 +169,22 @@ export class CredentialDefinitionController { async createCredentialDefinition( @User() user: IUserRequestInterface, @Body() credDef: CreateCredentialDefinitionDto, - @Param('orgId', new ParseUUIDPipe({exceptionFactory: (): Error => { throw new BadRequestException(ResponseMessages.organisation.error.invalidOrgId); }})) orgId: string, + @Param( + 'orgId', + new ParseUUIDPipe({ + exceptionFactory: (): Error => { + throw new BadRequestException(ResponseMessages.organisation.error.invalidOrgId); + } + }) + ) + orgId: string, @Res() res: Response ): Promise { - credDef.orgId = orgId; - const credentialsDefinitionDetails = await this.credentialDefinitionService.createCredentialDefinition(credDef, user); + const credentialsDefinitionDetails = await this.credentialDefinitionService.createCredentialDefinition( + credDef, + user + ); const credDefResponse: IResponse = { statusCode: HttpStatus.CREATED, message: ResponseMessages.credentialDefinition.success.create, @@ -153,5 +192,4 @@ export class CredentialDefinitionController { }; return res.status(HttpStatus.CREATED).json(credDefResponse); } - -} \ No newline at end of file +} diff --git a/apps/api-gateway/src/credential-definition/credential-definition.module.ts b/apps/api-gateway/src/credential-definition/credential-definition.module.ts index cd99e5b3f..220922f48 100644 --- a/apps/api-gateway/src/credential-definition/credential-definition.module.ts +++ b/apps/api-gateway/src/credential-definition/credential-definition.module.ts @@ -1,14 +1,14 @@ import { ClientsModule, Transport } from '@nestjs/microservices'; -import { Logger, Module } from '@nestjs/common'; +import { DynamicModule, Module, Provider } from '@nestjs/common'; import { CredentialDefinitionController } from './credential-definition.controller'; import { CredentialDefinitionService } from './credential-definition.service'; -import { getNatsOptions } from '@credebl/common/nats.config'; -import { CommonConstants } from '@credebl/common/common.constant'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { getNatsOptions } from '@credebl/common'; +import { CommonConstants } from '@credebl/common'; +import { NATSClient } from '@credebl/common'; @Module({ - imports:[ + imports: [ ClientsModule.register([ { name: 'NATS_CLIENT', @@ -21,8 +21,27 @@ import { NATSClient } from '@credebl/common/NATSClient'; providers: [CredentialDefinitionService, NATSClient] }) export class CredentialDefinitionModule { - constructor() { - Logger.log('API Gateway - CredDef loaded...'); - + static register( + overrides: Provider[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + controllerOverrides: any[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + importedModules: any[] = [] + ): DynamicModule { + return { + module: CredentialDefinitionModule, + imports: [ + ClientsModule.register([ + { + name: 'NATS_CLIENT', + transport: Transport.NATS, + options: getNatsOptions(CommonConstants.CREDENTIAL_DEFINITION_SERVICE, process.env.API_GATEWAY_NKEY_SEED) + } + ]), + ...importedModules + ], + controllers: controllerOverrides.length ? controllerOverrides : [CredentialDefinitionController], + providers: [CredentialDefinitionService, NATSClient, ...overrides] + }; } } diff --git a/apps/api-gateway/src/credential-definition/credential-definition.service.ts b/apps/api-gateway/src/credential-definition/credential-definition.service.ts index 330e6d200..0e234ed8c 100644 --- a/apps/api-gateway/src/credential-definition/credential-definition.service.ts +++ b/apps/api-gateway/src/credential-definition/credential-definition.service.ts @@ -1,25 +1,23 @@ import { Injectable, Inject } from '@nestjs/common'; import { ClientProxy } from '@nestjs/microservices'; import { CreateCredentialDefinitionDto } from './dto/create-cred-defs.dto'; -import { BaseService } from '../../../../libs/service/base.service'; import { IUserRequestInterface } from '../interfaces/IUserRequestInterface'; -import { GetAllCredDefsDto } from '../dtos/get-cred-defs.dto'; +import { IGetAllCredDefsDto } from '../dtos/get-cred-defs.dto'; import { ICredDef, ICredDefs } from './interfaces'; -import { ICredDefData } from '@credebl/common/interfaces/cred-def.interface'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { ICredDefData, BaseService } from '@credebl/common'; +import { NATSClient } from '@credebl/common'; @Injectable() export class CredentialDefinitionService extends BaseService { - constructor( @Inject('NATS_CLIENT') private readonly credDefServiceProxy: ClientProxy, - private readonly natsClient : NATSClient + private readonly natsClient: NATSClient ) { super('CredentialDefinitionService'); } createCredentialDefinition(credDef: CreateCredentialDefinitionDto, user: IUserRequestInterface): Promise { - const payload = { credDef, user }; + const payload = { credDef, user }; return this.natsClient.sendNatsMessage(this.credDefServiceProxy, 'create-credential-definition', payload); } @@ -28,13 +26,21 @@ export class CredentialDefinitionService extends BaseService { return this.natsClient.sendNatsMessage(this.credDefServiceProxy, 'get-credential-definition-by-id', payload); } - getAllCredDefs(credDefSearchCriteria: GetAllCredDefsDto, user: IUserRequestInterface, orgId: string): Promise { + getAllCredDefs( + credDefSearchCriteria: IGetAllCredDefsDto, + user: IUserRequestInterface, + orgId: string + ): Promise { const payload = { credDefSearchCriteria, user, orgId }; return this.natsClient.sendNatsMessage(this.credDefServiceProxy, 'get-all-credential-definitions', payload); } getCredentialDefinitionBySchemaId(schemaId: string): Promise { const payload = { schemaId }; - return this.natsClient.sendNatsMessage(this.credDefServiceProxy, 'get-all-credential-definitions-by-schema-id', payload); + return this.natsClient.sendNatsMessage( + this.credDefServiceProxy, + 'get-all-credential-definitions-by-schema-id', + payload + ); } } diff --git a/apps/api-gateway/src/credential-definition/dto/create-cred-defs.dto.ts b/apps/api-gateway/src/credential-definition/dto/create-cred-defs.dto.ts index 2187ad362..5ef56dc31 100644 --- a/apps/api-gateway/src/credential-definition/dto/create-cred-defs.dto.ts +++ b/apps/api-gateway/src/credential-definition/dto/create-cred-defs.dto.ts @@ -1,33 +1,32 @@ import { IsBoolean, IsDefined, IsNotEmpty, IsOptional, IsString } from 'class-validator'; import { ApiProperty } from '@nestjs/swagger'; import { Transform } from 'class-transformer'; -import { trim } from '@credebl/common/cast.helper'; +import { trim } from '@credebl/common'; export class CreateCredentialDefinitionDto { + @ApiProperty({ example: 'default' }) + @IsDefined({ message: 'Tag is required' }) + @IsNotEmpty({ message: 'Please provide a tag' }) + @IsString({ message: 'Tag should be string' }) + tag: string; - @ApiProperty({ 'example': 'default' }) - @IsDefined({ message: 'Tag is required' }) - @IsNotEmpty({ message: 'Please provide a tag' }) - @IsString({ message: 'Tag should be string' }) - tag: string; + @ApiProperty({ example: 'WgWxqztrNooG92RXvxSTWv:2:schema_name:1.0' }) + @IsDefined({ message: 'schemaLedgerId is required' }) + @IsNotEmpty({ message: 'Please provide valid schema ledger Id' }) + @Transform(({ value }) => trim(value)) + @IsString({ message: 'Schema id should be string' }) + schemaLedgerId: string; - @ApiProperty({ 'example': 'WgWxqztrNooG92RXvxSTWv:2:schema_name:1.0' }) - @IsDefined({ message: 'schemaLedgerId is required' }) - @IsNotEmpty({ message: 'Please provide valid schema ledger Id' }) - @Transform(({ value }) => trim(value)) - @IsString({ message: 'Schema id should be string' }) - schemaLedgerId: string; + orgId: string; - orgId: string; + @ApiProperty({ required: false }) + @IsOptional() + @IsString({ message: 'orgDid must be a string' }) + orgDid: string; - @ApiProperty({ required: false }) - @IsOptional() - @IsString({ message: 'orgDid must be a string' }) - orgDid: string; - - @ApiProperty({ default: false }) - @IsDefined({ message: 'Revocable is required.' }) - @IsBoolean({ message: 'Revocable must be a boolean value.' }) - @IsNotEmpty({ message: 'Please provide whether the revocable must be true or false' }) - revocable: boolean; + @ApiProperty({ default: false }) + @IsDefined({ message: 'Revocable is required.' }) + @IsBoolean({ message: 'Revocable must be a boolean value.' }) + @IsNotEmpty({ message: 'Please provide whether the revocable must be true or false' }) + revocable: boolean; } diff --git a/apps/api-gateway/src/credential-definition/dto/get-all-cred-defs.dto.ts b/apps/api-gateway/src/credential-definition/dto/get-all-cred-defs.dto.ts index 475519e93..78be64888 100644 --- a/apps/api-gateway/src/credential-definition/dto/get-all-cred-defs.dto.ts +++ b/apps/api-gateway/src/credential-definition/dto/get-all-cred-defs.dto.ts @@ -1,39 +1,37 @@ /* eslint-disable @typescript-eslint/no-inferrable-types */ /* eslint-disable camelcase */ import { ApiProperty } from '@nestjs/swagger'; -import { SortValue } from '../../enum'; import { Transform, Type } from 'class-transformer'; -import { IsOptional, Max, Min } from 'class-validator'; -import { toNumber } from '@credebl/common/cast.helper'; +import { IsOptional, Max, Min } from 'class-validator'; +import { toNumber, SortValue } from '@credebl/common'; export class GetAllCredDefsDto { - @ApiProperty({ required: false, default: 1 }) - @IsOptional() - @Transform(({ value }) => toNumber(value)) - pageNumber: number = 1; + @ApiProperty({ required: false, default: 1 }) + @IsOptional() + @Transform(({ value }) => toNumber(value)) + pageNumber: number = 1; - @ApiProperty({ required: false }) - @IsOptional() - @Type(() => String) - searchByText: string = ''; + @ApiProperty({ required: false }) + @IsOptional() + @Type(() => String) + searchByText: string = ''; - @ApiProperty({ required: false, default: 10 }) - @IsOptional() - @Transform(({ value }) => toNumber(value)) - @Min(1, { message: 'Page size must be greater than 0' }) - @Max(100, { message: 'Page size must be less than 100' }) - pageSize: number = 10; + @ApiProperty({ required: false, default: 10 }) + @IsOptional() + @Transform(({ value }) => toNumber(value)) + @Min(1, { message: 'Page size must be greater than 0' }) + @Max(100, { message: 'Page size must be less than 100' }) + pageSize: number = 10; - @ApiProperty({ required: false }) - @IsOptional() - sorting: string = 'id'; + @ApiProperty({ required: false }) + @IsOptional() + sorting: string = 'id'; - @ApiProperty({ required: false }) - @IsOptional() - sortByValue: string = SortValue.DESC; + @ApiProperty({ required: false }) + @IsOptional() + sortByValue: string = SortValue.DESC; - @ApiProperty({ required: false }) - @IsOptional() - revocable: boolean = true; + @ApiProperty({ required: false }) + @IsOptional() + revocable: boolean = true; } - diff --git a/apps/api-gateway/src/credential-definition/dto/get-all-platform-cred-defs.dto.ts b/apps/api-gateway/src/credential-definition/dto/get-all-platform-cred-defs.dto.ts index 20f4fb34c..e0a9174b8 100644 --- a/apps/api-gateway/src/credential-definition/dto/get-all-platform-cred-defs.dto.ts +++ b/apps/api-gateway/src/credential-definition/dto/get-all-platform-cred-defs.dto.ts @@ -1,30 +1,28 @@ -import { trim } from '@credebl/common/cast.helper'; -import { PaginationDto } from '@credebl/common/dtos/pagination.dto'; -import { CredDefSortFields, SortValue } from '@credebl/enum/enum'; +import { trim } from '@credebl/common'; +import { PaginationDto } from '@credebl/common'; +import { CredDefSortFields, SortValue } from '@credebl/common'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { Transform } from 'class-transformer'; import { IsEnum, IsOptional, IsUUID } from 'class-validator'; export class GetAllPlatformCredDefsDto extends PaginationDto { + @ApiProperty({ example: '1a7eac11-ff05-40d7-8351-4d7467687cad' }) + @ApiPropertyOptional() + @Transform(({ value }) => ('string' === typeof value && '' === value.trim() ? undefined : value.trim())) + @IsOptional() + @IsUUID('4', { message: 'Invalid format of ledgerId' }) + ledgerId?: string; - @ApiProperty({ example: '1a7eac11-ff05-40d7-8351-4d7467687cad'}) - @ApiPropertyOptional() - @Transform(({ value }) => ('string' === typeof value && '' === value.trim() ? undefined : value.trim())) - @IsOptional() - @IsUUID('4', { message: 'Invalid format of ledgerId' }) - ledgerId?: string; - - @ApiProperty({ - required: false - }) - @Transform(({ value }) => trim(value)) - @IsOptional() - @IsEnum(CredDefSortFields) - sortField: string = CredDefSortFields.CREATED_DATE_TIME; + @ApiProperty({ + required: false + }) + @Transform(({ value }) => trim(value)) + @IsOptional() + @IsEnum(CredDefSortFields) + sortField: string = CredDefSortFields.CREATED_DATE_TIME; - @ApiProperty({ required: false }) - @Transform(({ value }) => trim(value)) - @IsOptional() - sortBy: string = SortValue.DESC; - + @ApiProperty({ required: false }) + @Transform(({ value }) => trim(value)) + @IsOptional() + sortBy: string = SortValue.DESC; } diff --git a/apps/api-gateway/src/credential-definition/dto/index.ts b/apps/api-gateway/src/credential-definition/dto/index.ts new file mode 100644 index 000000000..30b3d9f4b --- /dev/null +++ b/apps/api-gateway/src/credential-definition/dto/index.ts @@ -0,0 +1,3 @@ +export * from './create-cred-defs.dto'; +export * from './get-all-cred-defs.dto'; +export * from './get-all-platform-cred-defs.dto'; diff --git a/apps/api-gateway/src/credential-definition/index.ts b/apps/api-gateway/src/credential-definition/index.ts new file mode 100644 index 000000000..9c36375d1 --- /dev/null +++ b/apps/api-gateway/src/credential-definition/index.ts @@ -0,0 +1,5 @@ +export * from './credential-definition.controller'; +export * from './credential-definition.module'; +export * from './credential-definition.service'; +export * from './dto'; +export * from './interfaces'; diff --git a/apps/api-gateway/src/credential-definition/interfaces/index.ts b/apps/api-gateway/src/credential-definition/interfaces/index.ts index f196534e6..af238bbc1 100644 --- a/apps/api-gateway/src/credential-definition/interfaces/index.ts +++ b/apps/api-gateway/src/credential-definition/interfaces/index.ts @@ -1,35 +1,3 @@ -import { UserRoleOrgPermsDto } from '../../dtos/user-role-org-perms.dto'; - -export interface IUserRequestInterface { - userId: string; - email: string; - orgId: string; - agentEndPoint?: string; - apiKey?: string; - tenantId?: string; - tenantName?: string; - tenantOrgId?: string; - userRoleOrgPermissions?: UserRoleOrgPermsDto[]; - orgName?: string; - selectedOrg: ISelectedOrgInterface; -} - -export interface ISelectedOrgInterface { - id: string; - userId: string; - orgRoleId: string; - orgId: string; - orgRole: object; - organisation: object; -} - -export interface IOrganizationInterface { - name: string; - description: string; - org_agents: IOrgAgentInterface[] - -} - export interface IOrgAgentInterface { orgDid: string; verkey: string; @@ -51,7 +19,7 @@ export interface ICredDef { orgId: string; } -export interface ICredDefs extends ICredDef{ +export interface ICredDefs extends ICredDef { lastChangedDateTime: string; lastChangedBy: string; } diff --git a/apps/api-gateway/src/dtos/apiResponse.dto copy.ts b/apps/api-gateway/src/dtos/apiResponse.dto copy.ts deleted file mode 100644 index 60fa37163..000000000 --- a/apps/api-gateway/src/dtos/apiResponse.dto copy.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { ApiProperty } from '@nestjs/swagger'; - -export class ApiResponseDto { - @ApiProperty({ example: 'Success' }) - message: string; - - @ApiProperty() - success: boolean; - - @ApiProperty() - data?: any; - - @ApiProperty({ example: 200 }) - code?: number; -} diff --git a/apps/api-gateway/src/dtos/authDto.dto.ts b/apps/api-gateway/src/dtos/authDto.dto.ts index 39a6d00a0..9fe73396b 100644 --- a/apps/api-gateway/src/dtos/authDto.dto.ts +++ b/apps/api-gateway/src/dtos/authDto.dto.ts @@ -2,23 +2,23 @@ import { IsBoolean, IsEmail, IsNotEmpty, IsOptional, IsString } from 'class-vali import { ApiProperty } from '@nestjs/swagger'; import { Transform } from 'class-transformer'; -import { trim } from '@credebl/common/cast.helper'; +import { trim } from '@credebl/common'; export class AuthDto { - @ApiProperty({ example: 'awqx@yopmail.com' }) - @IsEmail({}, { message: 'Please provide a valid email' }) - @IsNotEmpty({ message: 'Email is required' }) - @IsString({ message: 'Email should be a string' }) - @Transform(({ value }) => trim(value)) - email: string; + @ApiProperty({ example: 'awqx@yopmail.com' }) + @IsEmail({}, { message: 'Please provide a valid email' }) + @IsNotEmpty({ message: 'Email is required' }) + @IsString({ message: 'Email should be a string' }) + @Transform(({ value }) => trim(value)) + email: string; - @IsOptional() - @IsBoolean({ message: 'flag should be boolean' }) - flag: boolean; + @IsOptional() + @IsBoolean({ message: 'flag should be boolean' }) + flag: boolean; - @IsOptional() - @ApiProperty({ example: 'Password@1' }) - @IsNotEmpty({ message: 'Please provide valid password' }) - @IsString({ message: 'password should be string' }) - password: string; + @IsOptional() + @ApiProperty({ example: 'Password@1' }) + @IsNotEmpty({ message: 'Please provide valid password' }) + @IsString({ message: 'password should be string' }) + password: string; } diff --git a/apps/api-gateway/src/dtos/connection.dto.ts b/apps/api-gateway/src/dtos/connection.dto.ts index 3df7acb17..69410c7af 100644 --- a/apps/api-gateway/src/dtos/connection.dto.ts +++ b/apps/api-gateway/src/dtos/connection.dto.ts @@ -1,49 +1,40 @@ +/* eslint-disable camelcase */ import { ApiProperty } from '@nestjs/swagger'; -export class ConnectionDto { +export class CompleteConnectionDto { + @ApiProperty() + connection_id: string; - @ApiProperty() - // tslint:disable-next-line: variable-name - connection_id: string; + @ApiProperty() + state: string; - @ApiProperty() - state: string; + @ApiProperty() + my_did: string; - @ApiProperty() - // tslint:disable-next-line: variable-name - my_did: string; + @ApiProperty() + their_did: string; - @ApiProperty() - // tslint:disable-next-line: variable-name - their_did: string; + @ApiProperty() + their_label: string; - @ApiProperty() - // tslint:disable-next-line: variable-name - their_label: string; + @ApiProperty() + initiator: string; - @ApiProperty() - initiator: string; + @ApiProperty() + invitation_key: string; - @ApiProperty() - // tslint:disable-next-line: variable-name - invitation_key: string; + @ApiProperty() + routing_state: string; - @ApiProperty() - // tslint:disable-next-line: variable-name - routing_state: string; + @ApiProperty() + accept: string; - @ApiProperty() - accept: string; + @ApiProperty() + invitation_mode: string; - @ApiProperty() - // tslint:disable-next-line: variable-name - invitation_mode: string; + @ApiProperty() + updated_at: string; - @ApiProperty() - // tslint:disable-next-line: variable-name - updated_at: string; - - @ApiProperty() - // tslint:disable-next-line: variable-name - created_at: string; -} \ No newline at end of file + @ApiProperty() + created_at: string; +} diff --git a/apps/api-gateway/src/dtos/create-credential-definition.dto.ts b/apps/api-gateway/src/dtos/create-credential-definition.dto.ts deleted file mode 100644 index dda18b786..000000000 --- a/apps/api-gateway/src/dtos/create-credential-definition.dto.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { IsBoolean, IsDefined, IsNotEmpty, IsOptional, IsString } from 'class-validator'; - -import { ApiProperty } from '@nestjs/swagger'; - -export class CreateCredentialDefinitionDto { - - @ApiProperty({ 'example': 'default' }) - @IsNotEmpty({ message: 'Please provide a tag' }) - @IsString({ message: 'Tag id should be string' }) - tag: string; - - @ApiProperty({ 'example': 'WgWxqztrNooG92RXvxSTWv:2:schema_name:1.0' }) - @IsNotEmpty({ message: 'Please provide a schema id' }) - @IsString({ message: 'Schema id should be string' }) - schemaLedgerId: string; - - @ApiProperty() - - @IsNotEmpty({ message: 'Please provide orgId' }) - orgId: string; - - @ApiProperty({ required: false }) - @IsOptional() - @IsString({ message: 'orgDid must be a string' }) - orgDid: string; - - @ApiProperty({ default: true }) - @IsDefined({ message: 'Revocable is required.' }) - @IsBoolean({ message: 'Revocable must be a boolean value.' }) - @IsNotEmpty({ message: 'Please provide whether the revocable must be true or false' }) - revocable = true; -} diff --git a/apps/api-gateway/src/dtos/create-schema.dto.ts b/apps/api-gateway/src/dtos/create-schema.dto.ts index 91674834d..a100bafde 100644 --- a/apps/api-gateway/src/dtos/create-schema.dto.ts +++ b/apps/api-gateway/src/dtos/create-schema.dto.ts @@ -14,8 +14,8 @@ import { ValidateIf, ValidateNested } from 'class-validator'; -import { IndySchemaDataType, JSONSchemaType, SchemaTypeEnum, W3CSchemaDataType } from '@credebl/enum/enum'; -import { IsNotSQLInjection, ValidateNestedStructureFields, trim } from '@credebl/common/cast.helper'; +import { IndySchemaDataType, JSONSchemaType, SchemaTypeEnum, W3CSchemaDataType } from '@credebl/common'; +import { IsNotSQLInjection, ValidateNestedStructureFields, trim } from '@credebl/common'; import { Transform, Type, plainToClass } from 'class-transformer'; export class W3CAttributeValue { diff --git a/apps/api-gateway/src/dtos/email-validator.dto.ts b/apps/api-gateway/src/dtos/email-validator.dto.ts index 1ba458fcf..79ff92244 100644 --- a/apps/api-gateway/src/dtos/email-validator.dto.ts +++ b/apps/api-gateway/src/dtos/email-validator.dto.ts @@ -1,11 +1,9 @@ - -import { trim } from '@credebl/common/cast.helper'; +import { trim } from '@credebl/common'; import { ApiProperty } from '@nestjs/swagger'; import { Transform } from 'class-transformer'; import { IsEmail, IsNotEmpty, IsString, MaxLength } from 'class-validator'; export class EmailValidator { - @ApiProperty({ example: 'awqx@yopmail.com' }) @IsEmail({}, { message: 'Please provide a valid email' }) @IsNotEmpty({ message: 'Email is required' }) @@ -13,4 +11,4 @@ export class EmailValidator { @Transform(({ value }) => trim(value)) @MaxLength(256, { message: 'Email must be at most 256 character' }) email: string; -} \ No newline at end of file +} diff --git a/apps/api-gateway/src/dtos/forgot-password.dto.ts b/apps/api-gateway/src/dtos/forgot-password.dto.ts index f2f68f18a..0cb1b6d5f 100644 --- a/apps/api-gateway/src/dtos/forgot-password.dto.ts +++ b/apps/api-gateway/src/dtos/forgot-password.dto.ts @@ -2,19 +2,18 @@ import { IsEmail, IsNotEmpty, IsString } from 'class-validator'; import { ApiProperty } from '@nestjs/swagger'; import { Transform } from 'class-transformer'; -import { trim } from '@credebl/common/cast.helper'; +import { trim } from '@credebl/common'; export class ForgotPasswordDto { + @ApiProperty({ example: 'awqx@yopmail.com' }) + @IsEmail({}, { message: 'Please provide a valid email' }) + @IsNotEmpty({ message: 'Email is required' }) + @IsString({ message: 'Email should be a string' }) + @Transform(({ value }) => trim(value)) + username: string; - @ApiProperty({ example: 'awqx@yopmail.com' }) - @IsEmail({}, { message: 'Please provide a valid email' }) - @IsNotEmpty({ message: 'Email is required' }) - @IsString({ message: 'Email should be a string' }) - @Transform(({ value }) => trim(value)) - username: string; - - @ApiProperty() - @IsNotEmpty({ message: 'Please provide valid password' }) - @IsString({ message: 'password should be string' }) - password: string; -} \ No newline at end of file + @ApiProperty() + @IsNotEmpty({ message: 'Please provide valid password' }) + @IsString({ message: 'password should be string' }) + password: string; +} diff --git a/apps/api-gateway/src/dtos/get-cred-defs.dto.ts b/apps/api-gateway/src/dtos/get-cred-defs.dto.ts index ab341ef7d..b3ab52eeb 100644 --- a/apps/api-gateway/src/dtos/get-cred-defs.dto.ts +++ b/apps/api-gateway/src/dtos/get-cred-defs.dto.ts @@ -1,10 +1,10 @@ // import { SortValue } from '@credebl/enum/enum'; -export class GetAllCredDefsDto { - pageSize?: number; - pageNumber?: number; - searchByText?: string; - sorting?: string; - revocable?: boolean; - sortByValue?: string; -} \ No newline at end of file +export class IGetAllCredDefsDto { + pageSize?: number; + pageNumber?: number; + searchByText?: string; + sorting?: string; + revocable?: boolean; + sortByValue?: string; +} diff --git a/apps/api-gateway/src/dtos/holder-details.dto.ts b/apps/api-gateway/src/dtos/holder-details.dto.ts index b3fb3c009..b30fd14b6 100644 --- a/apps/api-gateway/src/dtos/holder-details.dto.ts +++ b/apps/api-gateway/src/dtos/holder-details.dto.ts @@ -2,67 +2,67 @@ import { IsEmail, IsNotEmpty, IsString } from 'class-validator'; import { ApiProperty } from '@nestjs/swagger'; import { Transform } from 'class-transformer'; -import { trim } from '@credebl/common/cast.helper'; +import { trim } from '@credebl/common'; export class HolderDetailsDto { - @ApiProperty({ example: 'Alen' }) - @IsNotEmpty({ message: 'Please provide valid firstName' }) - @IsString({ message: 'firstName should be string' }) - firstName: string; + @ApiProperty({ example: 'Alen' }) + @IsNotEmpty({ message: 'Please provide valid firstName' }) + @IsString({ message: 'firstName should be string' }) + firstName: string; - @ApiProperty({ example: 'Harvey' }) - @IsNotEmpty({ message: 'Please provide valid lastName' }) - @IsString({ message: 'lastName should be string' }) - lastName: string; + @ApiProperty({ example: 'Harvey' }) + @IsNotEmpty({ message: 'Please provide valid lastName' }) + @IsString({ message: 'lastName should be string' }) + lastName: string; - @ApiProperty({ example: 'awqx@yopmail.com' }) - @IsEmail({}, { message: 'Please provide a valid email' }) - @IsNotEmpty({ message: 'Email is required' }) - @IsString({ message: 'Email should be a string' }) - @Transform(({ value }) => trim(value)) - email: string; + @ApiProperty({ example: 'awqx@yopmail.com' }) + @IsEmail({}, { message: 'Please provide a valid email' }) + @IsNotEmpty({ message: 'Email is required' }) + @IsString({ message: 'Email should be a string' }) + @Transform(({ value }) => trim(value)) + email: string; - @ApiProperty({ example: 'awqx@example.com' }) - @IsEmail({}, { message: 'Please provide a valid email' }) - @IsNotEmpty({ message: 'Please provide valid username' }) - @IsString({ message: 'username should be string' }) - username: string; + @ApiProperty({ example: 'awqx@example.com' }) + @IsEmail({}, { message: 'Please provide a valid email' }) + @IsNotEmpty({ message: 'Please provide valid username' }) + @IsString({ message: 'username should be string' }) + username: string; - @ApiProperty({ example: 'your-secret-password' }) - @IsNotEmpty({ message: 'Please provide valid password' }) - @IsString({ message: 'password should be string' }) - password: string; + @ApiProperty({ example: 'your-secret-password' }) + @IsNotEmpty({ message: 'Please provide valid password' }) + @IsString({ message: 'password should be string' }) + password: string; - @ApiProperty({ example: 'GamoraPlus' }) - @IsNotEmpty({ message: 'Please provide valid deviceId' }) - @IsString({ message: 'deviceId should be string' }) - deviceId: string; + @ApiProperty({ example: 'GamoraPlus' }) + @IsNotEmpty({ message: 'Please provide valid deviceId' }) + @IsString({ message: 'deviceId should be string' }) + deviceId: string; - @ApiProperty({ example: 'Nokia C3' }) - @IsNotEmpty({ message: 'Please provide valid model' }) - @IsString({ message: 'model should be string' }) - model: string; + @ApiProperty({ example: 'Nokia C3' }) + @IsNotEmpty({ message: 'Please provide valid model' }) + @IsString({ message: 'model should be string' }) + model: string; - @ApiProperty({ example: 'Nokia' }) - @IsNotEmpty({ message: 'Please provide valid type' }) - @IsString({ message: 'type should be string' }) - type: string; + @ApiProperty({ example: 'Nokia' }) + @IsNotEmpty({ message: 'Please provide valid type' }) + @IsString({ message: 'type should be string' }) + type: string; - @ApiProperty({ example: 'Android' }) - @IsNotEmpty({ message: 'Please provide valid os' }) - @IsString({ message: 'os should be string' }) - os: string; + @ApiProperty({ example: 'Android' }) + @IsNotEmpty({ message: 'Please provide valid os' }) + @IsString({ message: 'os should be string' }) + os: string; - // @ApiProperty() - // mediatorId?: number; + // @ApiProperty() + // mediatorId?: number; - @ApiProperty({ example: 'https://yourdomain.com/my-profile-logo.png' }) - // @IsNotEmpty({ message: 'Please provide valid profileLogoUrl' }) - // @IsString({ message: 'profileLogoUrl should be string' }) - profileLogoUrl: string; + @ApiProperty({ example: 'https://yourdomain.com/my-profile-logo.png' }) + // @IsNotEmpty({ message: 'Please provide valid profileLogoUrl' }) + // @IsString({ message: 'profileLogoUrl should be string' }) + profileLogoUrl: string; - @ApiProperty({ example: 'your-firebase-token' }) - @IsNotEmpty({ message: 'Please provide valid firebaseToken' }) - @IsString({ message: 'firebaseToken should be string' }) - firebaseToken: string; -} \ No newline at end of file + @ApiProperty({ example: 'your-firebase-token' }) + @IsNotEmpty({ message: 'Please provide valid firebaseToken' }) + @IsString({ message: 'firebaseToken should be string' }) + firebaseToken: string; +} diff --git a/apps/api-gateway/src/dtos/holder-reset-password.ts b/apps/api-gateway/src/dtos/holder-reset-password.ts index dbd25709e..49aabfaba 100644 --- a/apps/api-gateway/src/dtos/holder-reset-password.ts +++ b/apps/api-gateway/src/dtos/holder-reset-password.ts @@ -2,24 +2,23 @@ import { IsEmail, IsNotEmpty, IsString } from 'class-validator'; import { ApiProperty } from '@nestjs/swagger'; import { Transform } from 'class-transformer'; -import { trim } from '@credebl/common/cast.helper'; +import { trim } from '@credebl/common'; export class HolderResetPasswordDto { - @ApiProperty({ example: 'awqx@yopmail.com' }) - @IsEmail({}, { message: 'Please provide a valid email' }) - @IsNotEmpty({ message: 'Email is required' }) - @IsString({ message: 'Email should be a string' }) - @Transform(({ value }) => trim(value)) - email: string; + @ApiProperty({ example: 'awqx@yopmail.com' }) + @IsEmail({}, { message: 'Please provide a valid email' }) + @IsNotEmpty({ message: 'Email is required' }) + @IsString({ message: 'Email should be a string' }) + @Transform(({ value }) => trim(value)) + email: string; - @ApiProperty({ example: '$2b$10$.NcA4.oN.a8otc5TgGuO5OvH.hbaF/AWNvVfA1t7g3N9jstvzJTlm' }) - @IsNotEmpty({ message: 'Please provide valid password' }) - @IsString({ message: 'password should be string' }) - password: string; + @ApiProperty({ example: '$2b$10$.NcA4.oN.a8otc5TgGuO5OvH.hbaF/AWNvVfA1t7g3N9jstvzJTlm' }) + @IsNotEmpty({ message: 'Please provide valid password' }) + @IsString({ message: 'password should be string' }) + password: string; - - @ApiProperty({ example: '647bf6c8b888b6a269ca' }) - @IsNotEmpty({ message: 'Please provide valid token' }) - @IsString({ message: 'token should be string' }) - token: string; -} \ No newline at end of file + @ApiProperty({ example: '647bf6c8b888b6a269ca' }) + @IsNotEmpty({ message: 'Please provide valid token' }) + @IsString({ message: 'token should be string' }) + token: string; +} diff --git a/apps/api-gateway/src/dtos/index.ts b/apps/api-gateway/src/dtos/index.ts new file mode 100644 index 000000000..88d43b8a2 --- /dev/null +++ b/apps/api-gateway/src/dtos/index.ts @@ -0,0 +1,60 @@ +export * from './PresentProof.dto'; +export * from './UpdateNonAdminUser.dto'; +export * from './admin-onboard-user.dto'; +export * from './admin-profile-update.dto'; +export * from './apiResponse.dto'; +export * from './approval-status.dto'; +export * from './authDto.dto'; +export * from './bad-request-error.dto'; +export * from './category.dto'; +export * from './connection-out-of-band.dto'; +export * from './connection.dto'; +export * from './create-feature-price.dto'; +export * from './create-proof-request.dto'; +export * from './create-revocation-registry.dto'; +export * from './create-schema.dto'; +export * from './createEnterprise-query.dto'; +export * from './created-response-dto'; +export * from './credential-offer.dto'; +export * from './credential-send-offer.dto'; +export * from './email-validator.dto'; +export * from './email.dto'; +export * from './endorse-transaction.dto'; +export * from './enums'; +export * from './fido-user.dto'; +export * from './forbidden-error.dto'; +// export * from './forgot-password.dto'; +export * from './geo-location-dto'; +export * from './get-cred-defs.dto'; +export * from './holder-details.dto'; +export * from './holder-reset-password'; +export * from './internal-server-error-res.dto'; +export * from './issue-credential-offer.dto '; +export * from './issue-credential-out-of-band.dto'; +export * from './issue-credential-save.dto'; +export * from './issue-credential.dto'; +export * from './label-editor.dto'; +export * from './not-found-error.dto'; +export * from './org-name-check.dto'; +export * from './platform-config.dto'; +export * from './platform-connection.dtos'; +export * from './printable-form-details.dto'; +export * from './register-non-admin-user.dto'; +export * from './register-tenant.dto'; +export * from './register-user.dto'; +export * from './remote-get-credential.dto'; +export * from './remove-holder.dto'; +// export * from './reset-password.dto'; +export * from './revoke-credential.dto'; +export * from './save-roles-permissions.dto'; +export * from './schemasearch.dto'; +export * from './send-invite-toOrg.dto'; +export * from './send-proof-request.dto'; +export * from './subscription.dto'; +export * from './unauthorized-error.dto'; +export * from './update-profile.dto'; +export * from './update-revocation-registry.dto'; +export * from './user-counts.dto'; +export * from './user-profile-update.dto'; +// export * from './user-role-org-perms.dto'; +export * from './wallet-details.dto'; diff --git a/apps/api-gateway/src/dtos/issue-credential.dto.ts b/apps/api-gateway/src/dtos/issue-credential.dto.ts index 173c3731e..7a6b0d902 100644 --- a/apps/api-gateway/src/dtos/issue-credential.dto.ts +++ b/apps/api-gateway/src/dtos/issue-credential.dto.ts @@ -1,40 +1,39 @@ import { IsArray, IsNotEmpty, IsString } from 'class-validator'; import { ApiProperty } from '@nestjs/swagger'; -import { toLowerCase, trim } from '@credebl/common/cast.helper'; +import { toLowerCase, trim } from '@credebl/common'; import { Transform } from 'class-transformer'; interface attribute { - name: string; - value: string; + name: string; + value: string; } -export class IssueCredentialDto { - - - @ApiProperty({ example: 'v1' }) - @Transform(({ value }) => trim(value)) - @Transform(({ value }) => toLowerCase(value)) - @IsNotEmpty({ message: 'Please provide valid protocolVersion' }) - @IsString({ message: 'protocolVersion should be string' }) - protocolVersion: string; - - @ApiProperty({ example: [{ 'value': 'string', 'name': 'string' }] }) - @IsNotEmpty({ message: 'Please provide valid attributes' }) - @IsArray({ message: 'attributes should be array' }) - attributes: attribute[]; - - @ApiProperty({ example: 'string' }) - @IsNotEmpty({ message: 'Please provide valid credentialDefinitionId' }) - @IsString({ message: 'credentialDefinitionId should be string' }) - credentialDefinitionId: string; - - @ApiProperty({ example: 'string' }) - @IsNotEmpty({ message: 'Please provide valid comment' }) - @IsString({ message: 'comment should be string' }) - comment: string; - - @ApiProperty({ example: '3fa85f64-5717-4562-b3fc-2c963f66afa6' }) - @IsNotEmpty({ message: 'Please provide valid connectionId' }) - @IsString({ message: 'connectionId should be string' }) - connectionId: string; -} \ No newline at end of file +// TODO: remove DTO +export class UnusedIssueCredentialDto { + @ApiProperty({ example: 'v1' }) + @Transform(({ value }) => trim(value)) + @Transform(({ value }) => toLowerCase(value)) + @IsNotEmpty({ message: 'Please provide valid protocolVersion' }) + @IsString({ message: 'protocolVersion should be string' }) + protocolVersion: string; + + @ApiProperty({ example: [{ value: 'string', name: 'string' }] }) + @IsNotEmpty({ message: 'Please provide valid attributes' }) + @IsArray({ message: 'attributes should be array' }) + attributes: attribute[]; + + @ApiProperty({ example: 'string' }) + @IsNotEmpty({ message: 'Please provide valid credentialDefinitionId' }) + @IsString({ message: 'credentialDefinitionId should be string' }) + credentialDefinitionId: string; + + @ApiProperty({ example: 'string' }) + @IsNotEmpty({ message: 'Please provide valid comment' }) + @IsString({ message: 'comment should be string' }) + comment: string; + + @ApiProperty({ example: '3fa85f64-5717-4562-b3fc-2c963f66afa6' }) + @IsNotEmpty({ message: 'Please provide valid connectionId' }) + @IsString({ message: 'connectionId should be string' }) + connectionId: string; +} diff --git a/apps/api-gateway/src/dtos/register-non-admin-user.dto.ts b/apps/api-gateway/src/dtos/register-non-admin-user.dto.ts index ec9f3876e..589148b90 100644 --- a/apps/api-gateway/src/dtos/register-non-admin-user.dto.ts +++ b/apps/api-gateway/src/dtos/register-non-admin-user.dto.ts @@ -1,44 +1,43 @@ -import { trim } from '@credebl/common/cast.helper'; +import { trim } from '@credebl/common'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { Transform } from 'class-transformer'; import { IsArray, IsEmail, IsInt, IsNotEmpty, IsString } from 'class-validator'; export class RegisterNonAdminUserDto { - @ApiProperty() - @IsNotEmpty({message:'Please provide valid firstName'}) - @IsString({message:'FirstName should be string'}) - firstName: string; - - @ApiProperty() - @IsNotEmpty({message:'Please provide valid lastName'}) - @IsString({message:'LastName should be string'}) - lastName: string; - - @ApiProperty({ example: 'awqx@yopmail.com' }) - @IsEmail({}, { message: 'Please provide a valid email' }) - @IsNotEmpty({ message: 'Email is required' }) - @IsString({ message: 'Email should be a string' }) - @Transform(({ value }) => trim(value)) - email: string; - - @ApiPropertyOptional() - // @IsNotEmpty({message:'Please provide valid username'}) - // @IsString({message:'Username should be string'}) - username: string; - - @ApiProperty() - @IsNotEmpty({message:'Please provide valid password'}) - @IsString({message:'Password should be string'}) - password: string; - - @ApiProperty() - @IsNotEmpty({message:'Role should be array of number'}) - @IsArray({message:'Role should be number'}) - @IsInt({ each: true }) - - // @IsInt({message:'Role should be number'}) - role:number; - - featureId: number; - + @ApiProperty() + @IsNotEmpty({ message: 'Please provide valid firstName' }) + @IsString({ message: 'FirstName should be string' }) + firstName: string; + + @ApiProperty() + @IsNotEmpty({ message: 'Please provide valid lastName' }) + @IsString({ message: 'LastName should be string' }) + lastName: string; + + @ApiProperty({ example: 'awqx@yopmail.com' }) + @IsEmail({}, { message: 'Please provide a valid email' }) + @IsNotEmpty({ message: 'Email is required' }) + @IsString({ message: 'Email should be a string' }) + @Transform(({ value }) => trim(value)) + email: string; + + @ApiPropertyOptional() + // @IsNotEmpty({message:'Please provide valid username'}) + // @IsString({message:'Username should be string'}) + username: string; + + @ApiProperty() + @IsNotEmpty({ message: 'Please provide valid password' }) + @IsString({ message: 'Password should be string' }) + password: string; + + @ApiProperty() + @IsNotEmpty({ message: 'Role should be array of number' }) + @IsArray({ message: 'Role should be number' }) + @IsInt({ each: true }) + + // @IsInt({message:'Role should be number'}) + role: number; + + featureId: number; } diff --git a/apps/api-gateway/src/dtos/register-tenant.dto.ts b/apps/api-gateway/src/dtos/register-tenant.dto.ts index 22bbbb89a..58437053e 100644 --- a/apps/api-gateway/src/dtos/register-tenant.dto.ts +++ b/apps/api-gateway/src/dtos/register-tenant.dto.ts @@ -3,12 +3,10 @@ import { ApiExtraModels, ApiProperty, ApiPropertyOptional } from '@nestjs/swagge import { IsEmail, IsNotEmpty, IsNumberString, IsString, MaxLength, MinLength } from 'class-validator'; import { Transform } from 'class-transformer'; -import { toLowerCase, trim } from '@credebl/common/cast.helper'; - +import { toLowerCase, trim } from '@credebl/common'; @ApiExtraModels() export class RegisterTenantDto { - @ApiProperty({ example: 'awqx@yopmail.com' }) @Transform(({ value }) => toLowerCase(value)) @IsNotEmpty({ message: 'Email is required.' }) @@ -55,7 +53,6 @@ export class RegisterTenantDto { @ApiPropertyOptional() logoUri?: string; - @ApiPropertyOptional() @Transform(({ value }) => trim(value)) solutionTitle?: string; diff --git a/apps/api-gateway/src/dtos/register-user.dto.ts b/apps/api-gateway/src/dtos/register-user.dto.ts index 3bfb15ad2..6f7c6f62c 100644 --- a/apps/api-gateway/src/dtos/register-user.dto.ts +++ b/apps/api-gateway/src/dtos/register-user.dto.ts @@ -1,114 +1,113 @@ -import { trim } from '@credebl/common/cast.helper'; +import { trim } from '@credebl/common'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { Transform } from 'class-transformer'; import { IsEmail, IsInt, IsNotEmpty, IsOptional, IsString } from 'class-validator'; export class RegisterUserDto { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - attribute: any; - - - @ApiProperty({ example: 'awqx@yopmail.com' }) - @IsEmail({}, { message: 'Please provide a valid email' }) - @IsNotEmpty({ message: 'Email is required' }) - @IsString({ message: 'Email should be a string' }) - @Transform(({ value }) => trim(value)) - adminEmail: string; - - @ApiProperty() - @IsNotEmpty({message:'Please provide valid orgName'}) - @IsString({message:'OrgName should be string'}) - orgName: string; - - @ApiProperty() - // @IsNotEmpty({message:'Please provide valid adminPassword'}) - @IsString({message:'AdminPassword should be string'}) - adminPassword?: string; - - @ApiProperty() - @IsNotEmpty({message:'Please provide valid orgCategory'}) - // @IsInt({message:'OrgCategory should be number'}) - orgCategory: number; - - @ApiPropertyOptional() - @IsOptional() - @IsString({message:'FirstName should be string'}) - firstName: string; - - @ApiPropertyOptional() - @IsOptional() - @IsString({message:'LastName should be string'}) - lastName: string; - - @ApiPropertyOptional() - @IsOptional() - @IsString({message:'Description should be string'}) - description: string; - - @ApiPropertyOptional() - @IsOptional() - @IsString({message:'DisplayName should be string'}) - displayName: string; - - @ApiPropertyOptional() - @IsOptional() - @IsString({message:'LogoUrl should be string'}) - logoUrl: string; - - @ApiPropertyOptional() - @IsOptional() - @IsString({message:'Address should be string'}) - address: string; - - @ApiPropertyOptional() - @IsOptional() - @IsString({message:'AdminContact should be string'}) - adminContact: string; - - @ApiPropertyOptional() - @IsOptional() - // @IsInt({message:'NoOfUsers should be number'}) - noOfUsers: number; - - @ApiPropertyOptional() - @IsOptional() - // @IsInt({message:'NoOfSchemas should be number'}) - noOfSchemas: number; - - @ApiPropertyOptional() - @IsOptional() - // @IsInt({message:'NoOfCredentials should be number'}) - noOfCredentials: number; - - @ApiPropertyOptional() - @IsOptional() - @IsString({message:'AdminUsername should be string'}) - adminUsername: string; - - @ApiPropertyOptional() - @IsOptional() - @IsString({message:'Keywords should be string'}) - Keywords: string; - - @IsOptional() - @IsString({message:'ByAdmin should be string'}) - byAdmin?: string; - - @IsOptional() - // @IsInt({message:'TenantId should be number'}) - tenantId?: string; - - @IsOptional() - @IsString({message:'Tags should be string'}) - tags?: string; - - @IsOptional() - // @IsInt({message:'InviteId should be number'}) - inviteId: number; - - @IsOptional() - @IsInt({message:'OnBoardingType should be number'}) - onBoardingType?: number; - - featureId: number; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + attribute: any; + + @ApiProperty({ example: 'awqx@yopmail.com' }) + @IsEmail({}, { message: 'Please provide a valid email' }) + @IsNotEmpty({ message: 'Email is required' }) + @IsString({ message: 'Email should be a string' }) + @Transform(({ value }) => trim(value)) + adminEmail: string; + + @ApiProperty() + @IsNotEmpty({ message: 'Please provide valid orgName' }) + @IsString({ message: 'OrgName should be string' }) + orgName: string; + + @ApiProperty() + // @IsNotEmpty({message:'Please provide valid adminPassword'}) + @IsString({ message: 'AdminPassword should be string' }) + adminPassword?: string; + + @ApiProperty() + @IsNotEmpty({ message: 'Please provide valid orgCategory' }) + // @IsInt({message:'OrgCategory should be number'}) + orgCategory: number; + + @ApiPropertyOptional() + @IsOptional() + @IsString({ message: 'FirstName should be string' }) + firstName: string; + + @ApiPropertyOptional() + @IsOptional() + @IsString({ message: 'LastName should be string' }) + lastName: string; + + @ApiPropertyOptional() + @IsOptional() + @IsString({ message: 'Description should be string' }) + description: string; + + @ApiPropertyOptional() + @IsOptional() + @IsString({ message: 'DisplayName should be string' }) + displayName: string; + + @ApiPropertyOptional() + @IsOptional() + @IsString({ message: 'LogoUrl should be string' }) + logoUrl: string; + + @ApiPropertyOptional() + @IsOptional() + @IsString({ message: 'Address should be string' }) + address: string; + + @ApiPropertyOptional() + @IsOptional() + @IsString({ message: 'AdminContact should be string' }) + adminContact: string; + + @ApiPropertyOptional() + @IsOptional() + // @IsInt({message:'NoOfUsers should be number'}) + noOfUsers: number; + + @ApiPropertyOptional() + @IsOptional() + // @IsInt({message:'NoOfSchemas should be number'}) + noOfSchemas: number; + + @ApiPropertyOptional() + @IsOptional() + // @IsInt({message:'NoOfCredentials should be number'}) + noOfCredentials: number; + + @ApiPropertyOptional() + @IsOptional() + @IsString({ message: 'AdminUsername should be string' }) + adminUsername: string; + + @ApiPropertyOptional() + @IsOptional() + @IsString({ message: 'Keywords should be string' }) + Keywords: string; + + @IsOptional() + @IsString({ message: 'ByAdmin should be string' }) + byAdmin?: string; + + @IsOptional() + // @IsInt({message:'TenantId should be number'}) + tenantId?: string; + + @IsOptional() + @IsString({ message: 'Tags should be string' }) + tags?: string; + + @IsOptional() + // @IsInt({message:'InviteId should be number'}) + inviteId: number; + + @IsOptional() + @IsInt({ message: 'OnBoardingType should be number' }) + onBoardingType?: number; + + featureId: number; } diff --git a/apps/api-gateway/src/dtos/reset-password.dto.ts b/apps/api-gateway/src/dtos/reset-password.dto.ts index cc855fa93..b5bb22020 100644 --- a/apps/api-gateway/src/dtos/reset-password.dto.ts +++ b/apps/api-gateway/src/dtos/reset-password.dto.ts @@ -1,22 +1,22 @@ -import { trim } from '@credebl/common/cast.helper'; +import { trim } from '@credebl/common'; import { ApiProperty } from '@nestjs/swagger'; import { Transform } from 'class-transformer'; import { IsString, IsNotEmpty, IsEmail } from 'class-validator'; export class ResetPasswordDto { - @ApiProperty({ example: 'awqx@yopmail.com' }) - @IsEmail({}, { message: 'Please provide a valid email' }) - @IsNotEmpty({ message: 'Email is required' }) - @IsString({ message: 'Email should be a string' }) - @Transform(({ value }) => trim(value)) - email: string; + @ApiProperty({ example: 'awqx@yopmail.com' }) + @IsEmail({}, { message: 'Please provide a valid email' }) + @IsNotEmpty({ message: 'Email is required' }) + @IsString({ message: 'Email should be a string' }) + @Transform(({ value }) => trim(value)) + email: string; - @ApiProperty() - @IsNotEmpty({message:'Please provide valid oldPassword'}) - @IsString({message:'oldPassword should be string'}) - oldPassword: string; + @ApiProperty() + @IsNotEmpty({ message: 'Please provide valid oldPassword' }) + @IsString({ message: 'oldPassword should be string' }) + oldPassword: string; - @ApiProperty() - @IsNotEmpty({message:'Please provide valid newPassword'}) - @IsString({message:'newPassword should be string'}) - newPassword: string; -} \ No newline at end of file + @ApiProperty() + @IsNotEmpty({ message: 'Please provide valid newPassword' }) + @IsString({ message: 'newPassword should be string' }) + newPassword: string; +} diff --git a/apps/api-gateway/src/dtos/update-profile.dto.ts b/apps/api-gateway/src/dtos/update-profile.dto.ts index a46246007..84a91e833 100644 --- a/apps/api-gateway/src/dtos/update-profile.dto.ts +++ b/apps/api-gateway/src/dtos/update-profile.dto.ts @@ -1,24 +1,23 @@ import { IsNotEmpty, IsString } from 'class-validator'; import { ApiProperty } from '@nestjs/swagger'; -import { trim } from '@credebl/common/cast.helper'; +import { trim } from '@credebl/common'; import { Transform } from 'class-transformer'; export class UpdateProfileDto { + @ApiProperty() + @IsNotEmpty({ message: 'Please provide valid firstName' }) + @IsString({ message: 'FirstName should be string' }) + firstName: string; - @ApiProperty() - @IsNotEmpty({message:'Please provide valid firstName'}) - @IsString({message:'FirstName should be string'}) - firstName: string; + @ApiProperty() + @IsNotEmpty({ message: 'Please provide valid lastName' }) + @IsString({ message: 'LastName should be string' }) + lastName: string; - @ApiProperty() - @IsNotEmpty({message:'Please provide valid lastName'}) - @IsString({message:'LastName should be string'}) - lastName: string; - - @ApiProperty() - @Transform(({ value }) => trim(value)) - @IsNotEmpty({message:'Please provide valid profileLogoUrl'}) - @IsString({message:'ProfileLogoUrl should be string'}) - profileLogoUrl?: string; + @ApiProperty() + @Transform(({ value }) => trim(value)) + @IsNotEmpty({ message: 'Please provide valid profileLogoUrl' }) + @IsString({ message: 'ProfileLogoUrl should be string' }) + profileLogoUrl?: string; } diff --git a/apps/api-gateway/src/dtos/update-revocation-registry.dto.ts b/apps/api-gateway/src/dtos/update-revocation-registry.dto.ts index 1449172a0..ad570d723 100644 --- a/apps/api-gateway/src/dtos/update-revocation-registry.dto.ts +++ b/apps/api-gateway/src/dtos/update-revocation-registry.dto.ts @@ -1,10 +1,13 @@ import { ApiProperty } from '@nestjs/swagger'; export class UpdateRevocationRegistryUriDto { - @ApiProperty({ 'example': 'WgWxqztrNooG92RXvxSTWv:4:WgWxqztrNooG92RXvxSTWv:3:CL:20:tag:CL_ACCUM:0' }) - // tslint:disable-next-line: variable-name - revoc_reg_id?: string; - @ApiProperty({ 'example': 'http://192.168.56.133:5000/revocation/registry/WgWxqztrNooG92RXvxSTWv:4:WgWxqztrNooG92RXvxSTWv:3:CL:20:tag:CL_ACCUM:0/tails-file' }) - // tslint:disable-next-line: variable-name - path?: string; -} \ No newline at end of file + @ApiProperty({ example: 'WgWxqztrNooG92RXvxSTWv:4:WgWxqztrNooG92RXvxSTWv:3:CL:20:tag:CL_ACCUM:0' }) + // eslint-disable-next-line camelcase + revoc_reg_id?: string; + + @ApiProperty({ + example: + 'http://192.168.56.133:5000/revocation/registry/WgWxqztrNooG92RXvxSTWv:4:WgWxqztrNooG92RXvxSTWv:3:CL:20:tag:CL_ACCUM:0/tails-file' + }) + path?: string; +} diff --git a/apps/api-gateway/src/enum.ts b/apps/api-gateway/src/enum.ts index dd8cadd70..8b8e0e172 100644 --- a/apps/api-gateway/src/enum.ts +++ b/apps/api-gateway/src/enum.ts @@ -1,39 +1,31 @@ -export enum sortValue { - ASC = 'asc', - DESC = 'desc', -} -export enum SortValue { - ASC = 'asc', - DESC = 'desc', -} export enum onboardRequestSort { - id = 'id', - orgName = 'orgName', - createDateTime = 'createDateTime', - isEmailVerified = 'isEmailVerified', - lastChangedDateTime = 'lastChangedDateTime' + id = 'id', + orgName = 'orgName', + createDateTime = 'createDateTime', + isEmailVerified = 'isEmailVerified', + lastChangedDateTime = 'lastChangedDateTime' } export enum schemaSortBy { - id = 'id', - schemaName = 'schemaName', - createDateTime = 'createDateTime' + id = 'id', + schemaName = 'schemaName', + createDateTime = 'createDateTime' } export enum credDefSortBy { - id = 'id', - createDateTime = 'createDateTime', - tag = 'tag' + id = 'id', + createDateTime = 'createDateTime', + tag = 'tag' } export enum connectionSortBy { - id = 'id', - theirLabel = 'theirLabel', - createDateTime = 'createdAt' + id = 'id', + theirLabel = 'theirLabel', + createDateTime = 'createdAt' } export enum credentialSortBy { - id = 'id', - createDateTime = 'createDateTime' + id = 'id', + createDateTime = 'createDateTime' } // export enum credRevokeStatus { @@ -43,88 +35,87 @@ export enum credentialSortBy { // } export enum booleanStatus { - all = 'all', - true = 'true', - false = 'false' + all = 'all', + true = 'true', + false = 'false' } export enum orgPresentProofRequestsSort { - id = 'id', - holderName = 'theirLabel', - createDateTime = 'createDateTime' + id = 'id', + holderName = 'theirLabel', + createDateTime = 'createDateTime' } export enum orgHolderRequestsSort { - id = 'id', - holderName = 'theirLabel', - createDateTime = 'createDateTime' + id = 'id', + holderName = 'theirLabel', + createDateTime = 'createDateTime' } export enum holderProofRequestsSort { - id = 'id', - createDateTime = 'createDateTime' + id = 'id', + createDateTime = 'createDateTime' } - export enum OnboardRequestSort { - id = 'id', - createDateTime = 'createDateTime', - orgName = 'orgName' + id = 'id', + createDateTime = 'createDateTime', + orgName = 'orgName' } export enum CategorySortBy { - id = 'id', - Name = 'name' + id = 'id', + Name = 'name' } export enum CredDefSortBy { - id = 'id', - createDateTime = 'createDateTime', - tag = 'tag' + id = 'id', + createDateTime = 'createDateTime', + tag = 'tag' } export enum transactionSort { - id = 'id', - createDateTime = 'createDateTime', + id = 'id', + createDateTime = 'createDateTime' } export enum ConnectionAlias { - endorser = 'ENDORSER', - author = 'AUTHOR', + endorser = 'ENDORSER', + author = 'AUTHOR' } export enum TransactionRole { - transactionAuthor = 'TRANSACTION_AUTHOR', - transactionEndorser = 'TRANSACTION_ENDORSER', + transactionAuthor = 'TRANSACTION_AUTHOR', + transactionEndorser = 'TRANSACTION_ENDORSER' } export enum TransactionType { - schema = 'SCHEMA', - credDef = 'CREDENTIAL_DEF', + schema = 'SCHEMA', + credDef = 'CREDENTIAL_DEF' } export enum OrderBy { - ASC = 'ASC', - DESC = 'DESC', + ASC = 'ASC', + DESC = 'DESC' } export enum EmailAuditOrderByColumns { - CreatedDateTime = 'createDateTime', - Id = 'id', + CreatedDateTime = 'createDateTime', + Id = 'id' } export enum ExpiredSubscriptionSortBy { - startDate = 'startDate', - endDate = 'endDate', - id = 'id', + startDate = 'startDate', + endDate = 'endDate', + id = 'id' } export enum FileUploadType { - Issuance = 'ISSUANCE' + Issuance = 'ISSUANCE' } export enum FileUploadStatus { - started = 'PROCESS_STARTED', - completed = 'PROCESS_COMPLETED', - interrupted= 'PROCESS_INTERRUPTED', - retry= 'PROCESS_REINITIATED', - partially_completed= 'PARTIALLY_COMPLETED' + started = 'PROCESS_STARTED', + completed = 'PROCESS_COMPLETED', + interrupted = 'PROCESS_INTERRUPTED', + retry = 'PROCESS_REINITIATED', + partially_completed = 'PARTIALLY_COMPLETED' } diff --git a/apps/api-gateway/src/fido/dto/fido-user.dto.ts b/apps/api-gateway/src/fido/dto/fido-user.dto.ts index 50783e6a7..b680d7921 100644 --- a/apps/api-gateway/src/fido/dto/fido-user.dto.ts +++ b/apps/api-gateway/src/fido/dto/fido-user.dto.ts @@ -1,103 +1,22 @@ -import { ApiProperty } from '@nestjs/swagger'; -import { IsBoolean, IsEmail, IsNotEmpty, IsOptional } from 'class-validator'; - - -export class GenerateRegistrationDto { - @ApiProperty({ example: 'abc@vomoto.com' }) - @IsNotEmpty({ message: 'Email is required.' }) - @IsEmail({}, { message: 'Please provide a valid email' }) - userName: string; - - @IsOptional() - @ApiProperty({ example: 'false' }) - @IsBoolean({ message: 'isPasskey should be boolean' }) - deviceFlag: boolean; -} - -export class VerifyRegistrationDto { - @ApiProperty() - id: string; - - @ApiProperty() - rawId: string; - - @ApiProperty() - response: Response; - - @ApiProperty() - type: string; - - @ApiProperty() - clientExtensionResults: ClientExtensionResults; - - @ApiProperty() - authenticatorAttachment: string; - - @ApiProperty() - challangeId: string; -} - export interface Response { - attestationObject: string - clientDataJSON: string - transports: [] + attestationObject: string; + clientDataJSON: string; + transports: []; } export interface ClientExtensionResults { - credProps: CredProps + credProps: CredProps; } // eslint-disable-next-line @typescript-eslint/no-empty-interface -export interface CredProps { } - - -export class VerifyAuthenticationDto { - @ApiProperty() - id: string; - - @ApiProperty() - rawId: string; - - @ApiProperty() - response: Response; - - @ApiProperty() - type: string; - - @ApiProperty() - clientExtensionResults: ClientExtensionResults; - - @ApiProperty() - authenticatorAttachment: string; - - @ApiProperty() - challangeId: string; -} +export interface CredProps {} export interface Response { - authenticatorData: string - clientDataJSON: string - signature: string - userHandle: string + authenticatorData: string; + clientDataJSON: string; + signature: string; + userHandle: string; } // eslint-disable-next-line @typescript-eslint/no-empty-interface -export interface ClientExtensionResults { } - - -export class UpdateFidoUserDetailsDto { - @ApiProperty() - userName: string; - - @ApiProperty() - credentialId: string; - - @ApiProperty() - deviceFriendlyName: string; - -} - -export class GenerateAuthenticationDto { - @ApiProperty({ example: 'abc@vomoto.com' }) - userName: string; -} +export interface ClientExtensionResults {} diff --git a/apps/api-gateway/src/fido/dto/index.ts b/apps/api-gateway/src/fido/dto/index.ts new file mode 100644 index 000000000..8cca23901 --- /dev/null +++ b/apps/api-gateway/src/fido/dto/index.ts @@ -0,0 +1 @@ +export * from './fido-user.dto'; diff --git a/apps/api-gateway/src/fido/fido.controller.ts b/apps/api-gateway/src/fido/fido.controller.ts index 37e11a0f8..4cfed9898 100644 --- a/apps/api-gateway/src/fido/fido.controller.ts +++ b/apps/api-gateway/src/fido/fido.controller.ts @@ -1,17 +1,47 @@ -import { Body, Controller, Delete, Get, HttpStatus, Logger, Param, Post, Put, Query, Request, Res, UseFilters } from '@nestjs/common'; -import { ApiBadRequestResponse, ApiBearerAuth, ApiExcludeEndpoint, ApiForbiddenResponse, ApiOperation, ApiQuery, ApiResponse, ApiTags, ApiUnauthorizedResponse } from '@nestjs/swagger'; +import { + Body, + Controller, + Delete, + Get, + HttpStatus, + Logger, + Param, + Post, + Put, + Query, + Request, + Res, + UseFilters +} from '@nestjs/common'; +import { + ApiBadRequestResponse, + ApiBearerAuth, + ApiExcludeEndpoint, + ApiForbiddenResponse, + ApiOperation, + ApiQuery, + ApiResponse, + ApiTags, + ApiUnauthorizedResponse +} from '@nestjs/swagger'; import { ApiResponseDto } from '../dtos/apiResponse.dto'; import { BadRequestErrorDto } from '../dtos/bad-request-error.dto'; -import { GenerateAuthenticationDto, GenerateRegistrationDto, UpdateFidoUserDetailsDto, VerifyRegistrationDto, VerifyAuthenticationDto } from '../dtos/fido-user.dto'; +import { + GenerateAuthenticationDto, + GenerateRegistrationDto, + UpdateFidoUserDetailsDto, + VerifyRegistrationDto, + VerifyAuthenticationDto +} from '../dtos/fido-user.dto'; import { ForbiddenErrorDto } from '../dtos/forbidden-error.dto'; import { UnauthorizedErrorDto } from '../dtos/unauthorized-error.dto'; import { FidoService } from './fido.service'; -import { ResponseMessages } from '@credebl/common/response-messages'; -import IResponseType from '@credebl/common/interfaces/response.interface'; +import { ResponseMessages } from '@credebl/common'; +import { IResponseType } from '@credebl/common'; import { Response } from 'express'; import { Roles } from '../authz/decorators/roles.decorator'; -import { OrgRoles } from 'libs/org-roles/enums'; -import { CustomExceptionFilter } from 'apps/api-gateway/common/exception-handler'; +import { OrgRoles } from '@credebl/common'; +import { CustomExceptionFilter } from '../common'; @UseFilters(CustomExceptionFilter) @Controller('auth') @@ -20,198 +50,243 @@ import { CustomExceptionFilter } from 'apps/api-gateway/common/exception-handler @ApiForbiddenResponse({ status: HttpStatus.FORBIDDEN, description: 'Forbidden', type: ForbiddenErrorDto }) @ApiBadRequestResponse({ status: 400, description: 'Bad Request', type: BadRequestErrorDto }) export class FidoController { - private logger = new Logger('FidoController'); - constructor(private readonly fidoService: FidoService) { } + private logger = new Logger('FidoController'); + constructor(private readonly fidoService: FidoService) {} - /** - * Fetch fido user details - * @param email The email of the user - * @param res The response object - * @returns User details - */ - @Get('/passkey/:email') - @Roles(OrgRoles.OWNER, OrgRoles.ADMIN, OrgRoles.HOLDER, OrgRoles.ISSUER, OrgRoles.SUPER_ADMIN, OrgRoles.MEMBER) - @ApiBearerAuth() - @ApiOperation({ summary: 'Fetch fido user details', description: 'Retrieve the details of a FIDO user by their email address.' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) - @ApiUnauthorizedResponse({ status: HttpStatus.UNAUTHORIZED, description: 'Unauthorized', type: UnauthorizedErrorDto }) - @ApiForbiddenResponse({ status: HttpStatus.FORBIDDEN, description: 'Forbidden', type: ForbiddenErrorDto }) - @ApiBadRequestResponse({ status: 400, description: 'Bad Request', type: BadRequestErrorDto }) - async fetchFidoUserDetails(@Request() req, @Param('email') email: string, @Res() res: Response): Promise { - try { - const fidoUserDetails = await this.fidoService.fetchFidoUserDetails(req.params.email.toLowerCase()); - const finalResponse: IResponseType = { - statusCode: HttpStatus.OK, - message: ResponseMessages.user.success.fetchUsers, - data: fidoUserDetails.response - }; - return res.status(HttpStatus.OK).json(finalResponse); - } catch (error) { - this.logger.error(`Error::${error}`); - throw error; - } + /** + * Fetch fido user details + * @param email The email of the user + * @param res The response object + * @returns User details + */ + @Get('/passkey/:email') + @Roles(OrgRoles.OWNER, OrgRoles.ADMIN, OrgRoles.HOLDER, OrgRoles.ISSUER, OrgRoles.SUPER_ADMIN, OrgRoles.MEMBER) + @ApiBearerAuth() + @ApiOperation({ + summary: 'Fetch fido user details', + description: 'Retrieve the details of a FIDO user by their email address.' + }) + @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) + @ApiUnauthorizedResponse({ status: HttpStatus.UNAUTHORIZED, description: 'Unauthorized', type: UnauthorizedErrorDto }) + @ApiForbiddenResponse({ status: HttpStatus.FORBIDDEN, description: 'Forbidden', type: ForbiddenErrorDto }) + @ApiBadRequestResponse({ status: 400, description: 'Bad Request', type: BadRequestErrorDto }) + async fetchFidoUserDetails(@Request() req, @Param('email') email: string, @Res() res: Response): Promise { + try { + const fidoUserDetails = await this.fidoService.fetchFidoUserDetails(req.params.email.toLowerCase()); + const finalResponse: IResponseType = { + statusCode: HttpStatus.OK, + message: ResponseMessages.user.success.fetchUsers, + data: fidoUserDetails.response + }; + return res.status(HttpStatus.OK).json(finalResponse); + } catch (error) { + this.logger.error(`Error::${error}`); + throw error; } + } - /** - * Generate registration option - * @param GenerateRegistrationDto The registration details - * @param email The email of the user - * @param res The response object - * @returns Registration options - */ - @Post('/passkey/generate-registration/:email') - @ApiExcludeEndpoint() - @ApiOperation({ summary: 'Generate registration option', description: 'Generate registration options for a FIDO user.' }) - @ApiResponse({ status: HttpStatus.CREATED, description: 'Success', type: ApiResponseDto }) - async generateRegistrationOption(@Body() body: GenerateRegistrationDto, @Param('email') email: string, @Res() res: Response): Promise { - try { - const { deviceFlag } = body; - const registrationOption = await this.fidoService.generateRegistrationOption(deviceFlag, email.toLowerCase()); - const finalResponse: IResponseType = { - statusCode: HttpStatus.CREATED, - message: ResponseMessages.fido.success.RegistrationOption, - data: registrationOption.response - }; - return res.status(HttpStatus.CREATED).json(finalResponse); - } catch (error) { - this.logger.error(`Error::${error}`); - } + /** + * Generate registration option + * @param GenerateRegistrationDto The registration details + * @param email The email of the user + * @param res The response object + * @returns Registration options + */ + @Post('/passkey/generate-registration/:email') + @ApiExcludeEndpoint() + @ApiOperation({ + summary: 'Generate registration option', + description: 'Generate registration options for a FIDO user.' + }) + @ApiResponse({ status: HttpStatus.CREATED, description: 'Success', type: ApiResponseDto }) + async generateRegistrationOption( + @Body() body: GenerateRegistrationDto, + @Param('email') email: string, + @Res() res: Response + ): Promise { + try { + const { deviceFlag } = body; + const registrationOption = await this.fidoService.generateRegistrationOption(deviceFlag, email.toLowerCase()); + const finalResponse: IResponseType = { + statusCode: HttpStatus.CREATED, + message: ResponseMessages.fido.success.RegistrationOption, + data: registrationOption.response + }; + return res.status(HttpStatus.CREATED).json(finalResponse); + } catch (error) { + this.logger.error(`Error::${error}`); } + } - /** - * Verify registration - * @param verifyRegistrationDto The registration verification details - * @param email The email of the user - * @param res The response object - * @returns Verification result - */ - @Post('/passkey/verify-registration/:email') - @ApiExcludeEndpoint() - @ApiOperation({ summary: 'Verify registration', description: 'Verify the registration of a FIDO user.' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) - async verifyRegistration(@Request() req, @Body() verifyRegistrationDto: VerifyRegistrationDto, @Param('email') email: string, @Res() res: Response): Promise { - const verifyRegistration = await this.fidoService.verifyRegistration(verifyRegistrationDto, req.params.email.toLowerCase()); - const finalResponse: IResponseType = { - statusCode: HttpStatus.OK, - message: ResponseMessages.fido.success.verifyRegistration, - data: verifyRegistration.response - }; - return res.status(HttpStatus.OK).json(finalResponse); - } + /** + * Verify registration + * @param verifyRegistrationDto The registration verification details + * @param email The email of the user + * @param res The response object + * @returns Verification result + */ + @Post('/passkey/verify-registration/:email') + @ApiExcludeEndpoint() + @ApiOperation({ summary: 'Verify registration', description: 'Verify the registration of a FIDO user.' }) + @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) + async verifyRegistration( + @Request() req, + @Body() verifyRegistrationDto: VerifyRegistrationDto, + @Param('email') email: string, + @Res() res: Response + ): Promise { + const verifyRegistration = await this.fidoService.verifyRegistration( + verifyRegistrationDto, + req.params.email.toLowerCase() + ); + const finalResponse: IResponseType = { + statusCode: HttpStatus.OK, + message: ResponseMessages.fido.success.verifyRegistration, + data: verifyRegistration.response + }; + return res.status(HttpStatus.OK).json(finalResponse); + } - /** - * Generate authentication option - * @param GenerateAuthenticationDto The authentication details - * @param res The response object - * @returns Authentication options - */ - @Post('/passkey/authentication-options') - @ApiExcludeEndpoint() - @ApiOperation({ summary: 'Generate authentication option', description: 'Generate authentication options for a FIDO user.' }) - @ApiResponse({ status: HttpStatus.CREATED, description: 'Success', type: ApiResponseDto }) - async generateAuthenticationOption(@Body() body: GenerateAuthenticationDto, @Request() req, @Res() res: Response): Promise { - const generateAuthentication = await this.fidoService.generateAuthenticationOption(body); - const finalResponse: IResponseType = { - statusCode: HttpStatus.OK, - message: ResponseMessages.fido.success.generateAuthenticationOption, - data: generateAuthentication.response - }; - return res.status(HttpStatus.OK).json(finalResponse); - } + /** + * Generate authentication option + * @param GenerateAuthenticationDto The authentication details + * @param res The response object + * @returns Authentication options + */ + @Post('/passkey/authentication-options') + @ApiExcludeEndpoint() + @ApiOperation({ + summary: 'Generate authentication option', + description: 'Generate authentication options for a FIDO user.' + }) + @ApiResponse({ status: HttpStatus.CREATED, description: 'Success', type: ApiResponseDto }) + async generateAuthenticationOption( + @Body() body: GenerateAuthenticationDto, + @Request() req, + @Res() res: Response + ): Promise { + const generateAuthentication = await this.fidoService.generateAuthenticationOption(body); + const finalResponse: IResponseType = { + statusCode: HttpStatus.OK, + message: ResponseMessages.fido.success.generateAuthenticationOption, + data: generateAuthentication.response + }; + return res.status(HttpStatus.OK).json(finalResponse); + } - /** - * Verify authentication - * @param verifyAuthenticationDto The authentication verification details - * @param email The email of the user - * @param res The response object - * @returns Verification result - */ - @Post('/passkey/verify-authentication/:email') - @ApiExcludeEndpoint() - @ApiOperation({ summary: 'Verify authentication', description: 'Verify the authentication of a FIDO user.' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) - async verifyAuthentication(@Request() req, @Body() verifyAuthenticationDto: VerifyAuthenticationDto, @Param('email') email: string, @Res() res: Response): Promise { - const verifyAuthentication = await this.fidoService.verifyAuthentication(verifyAuthenticationDto, req.params.email.toLowerCase()); - const finalResponse: IResponseType = { - statusCode: HttpStatus.OK, - message: ResponseMessages.fido.success.login, - data: verifyAuthentication.response - }; - return res.status(HttpStatus.OK).json(finalResponse); - } + /** + * Verify authentication + * @param verifyAuthenticationDto The authentication verification details + * @param email The email of the user + * @param res The response object + * @returns Verification result + */ + @Post('/passkey/verify-authentication/:email') + @ApiExcludeEndpoint() + @ApiOperation({ summary: 'Verify authentication', description: 'Verify the authentication of a FIDO user.' }) + @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) + async verifyAuthentication( + @Request() req, + @Body() verifyAuthenticationDto: VerifyAuthenticationDto, + @Param('email') email: string, + @Res() res: Response + ): Promise { + const verifyAuthentication = await this.fidoService.verifyAuthentication( + verifyAuthenticationDto, + req.params.email.toLowerCase() + ); + const finalResponse: IResponseType = { + statusCode: HttpStatus.OK, + message: ResponseMessages.fido.success.login, + data: verifyAuthentication.response + }; + return res.status(HttpStatus.OK).json(finalResponse); + } - /** - * Update fido user details - * @param updateFidoUserDetailsDto The user details to be updated - * @param credentialId The credential ID of the user - * @param res The response object - * @returns Updated user details - */ - @Put('/passkey/user-details/:credentialId') - @ApiExcludeEndpoint() - @ApiOperation({ summary: 'Update fido user details', description: 'Update the details of a FIDO user.' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) - async updateFidoUser(@Request() req, @Body() updateFidoUserDetailsDto: UpdateFidoUserDetailsDto, @Param('credentialId') credentialId: string, @Res() res: Response): Promise { - const verifyRegistration = await this.fidoService.updateFidoUser(updateFidoUserDetailsDto, decodeURIComponent(credentialId)); - const finalResponse: IResponseType = { - statusCode: HttpStatus.OK, - message: ResponseMessages.fido.success.updateUserDetails, - data: verifyRegistration.response - }; - return res.status(HttpStatus.OK).json(finalResponse); - } + /** + * Update fido user details + * @param updateFidoUserDetailsDto The user details to be updated + * @param credentialId The credential ID of the user + * @param res The response object + * @returns Updated user details + */ + @Put('/passkey/user-details/:credentialId') + @ApiExcludeEndpoint() + @ApiOperation({ summary: 'Update fido user details', description: 'Update the details of a FIDO user.' }) + @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) + async updateFidoUser( + @Request() req, + @Body() updateFidoUserDetailsDto: UpdateFidoUserDetailsDto, + @Param('credentialId') credentialId: string, + @Res() res: Response + ): Promise { + const verifyRegistration = await this.fidoService.updateFidoUser( + updateFidoUserDetailsDto, + decodeURIComponent(credentialId) + ); + const finalResponse: IResponseType = { + statusCode: HttpStatus.OK, + message: ResponseMessages.fido.success.updateUserDetails, + data: verifyRegistration.response + }; + return res.status(HttpStatus.OK).json(finalResponse); + } - /** - * Update fido user device name - * @param credentialId The credential ID of the user - * @param deviceName The new device name - * @param res The response object - * @returns Updated device name - */ - @Put('/passkey/:credentialId') - @Roles(OrgRoles.OWNER, OrgRoles.ADMIN, OrgRoles.HOLDER, OrgRoles.ISSUER, OrgRoles.SUPER_ADMIN, OrgRoles.MEMBER) - @ApiBearerAuth() - @ApiOperation({ summary: 'Update fido user device name', description: 'Update the device name of a FIDO user.' }) - @ApiQuery({ name: 'deviceName', required: true }) - @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) - async updateFidoUserDeviceName(@Param('credentialId') credentialId: string, @Query('deviceName') deviceName: string, @Res() res: Response): Promise { - try { - const updateDeviceName = await this.fidoService.updateFidoUserDeviceName(credentialId, deviceName); - const finalResponse: IResponseType = { - statusCode: HttpStatus.OK, - message: ResponseMessages.fido.success.updateDeviceName, - data: updateDeviceName.response - }; - return res.status(HttpStatus.OK).json(finalResponse); - } catch (error) { - this.logger.error(`Error::${error}`); - throw error; - } + /** + * Update fido user device name + * @param credentialId The credential ID of the user + * @param deviceName The new device name + * @param res The response object + * @returns Updated device name + */ + @Put('/passkey/:credentialId') + @Roles(OrgRoles.OWNER, OrgRoles.ADMIN, OrgRoles.HOLDER, OrgRoles.ISSUER, OrgRoles.SUPER_ADMIN, OrgRoles.MEMBER) + @ApiBearerAuth() + @ApiOperation({ summary: 'Update fido user device name', description: 'Update the device name of a FIDO user.' }) + @ApiQuery({ name: 'deviceName', required: true }) + @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) + async updateFidoUserDeviceName( + @Param('credentialId') credentialId: string, + @Query('deviceName') deviceName: string, + @Res() res: Response + ): Promise { + try { + const updateDeviceName = await this.fidoService.updateFidoUserDeviceName(credentialId, deviceName); + const finalResponse: IResponseType = { + statusCode: HttpStatus.OK, + message: ResponseMessages.fido.success.updateDeviceName, + data: updateDeviceName.response + }; + return res.status(HttpStatus.OK).json(finalResponse); + } catch (error) { + this.logger.error(`Error::${error}`); + throw error; } + } - /** - * Delete fido user device - * @param credentialId The credential ID of the user - * @param res The response object - * @returns Success message - */ - @Delete('/passkey/:credentialId') - @Roles(OrgRoles.OWNER, OrgRoles.ADMIN, OrgRoles.HOLDER, OrgRoles.ISSUER, OrgRoles.SUPER_ADMIN, OrgRoles.MEMBER) - @ApiBearerAuth() - @ApiOperation({ summary: 'Delete fido user device', description: 'Delete a FIDO user device by its credential ID.' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) - async deleteFidoUserDevice(@Param('credentialId') credentialId: string, @Res() res: Response): Promise { - try { - const deleteFidoUser = await this.fidoService.deleteFidoUserDevice(credentialId); - const finalResponse: IResponseType = { - statusCode: HttpStatus.OK, - message: ResponseMessages.fido.success.deleteDevice, - data: deleteFidoUser.response - }; - return res.status(HttpStatus.OK).json(finalResponse); - } catch (error) { - this.logger.error(`Error::${error}`); - throw error; - } + /** + * Delete fido user device + * @param credentialId The credential ID of the user + * @param res The response object + * @returns Success message + */ + @Delete('/passkey/:credentialId') + @Roles(OrgRoles.OWNER, OrgRoles.ADMIN, OrgRoles.HOLDER, OrgRoles.ISSUER, OrgRoles.SUPER_ADMIN, OrgRoles.MEMBER) + @ApiBearerAuth() + @ApiOperation({ summary: 'Delete fido user device', description: 'Delete a FIDO user device by its credential ID.' }) + @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) + async deleteFidoUserDevice(@Param('credentialId') credentialId: string, @Res() res: Response): Promise { + try { + const deleteFidoUser = await this.fidoService.deleteFidoUserDevice(credentialId); + const finalResponse: IResponseType = { + statusCode: HttpStatus.OK, + message: ResponseMessages.fido.success.deleteDevice, + data: deleteFidoUser.response + }; + return res.status(HttpStatus.OK).json(finalResponse); + } catch (error) { + this.logger.error(`Error::${error}`); + throw error; } + } } diff --git a/apps/api-gateway/src/fido/fido.module.ts b/apps/api-gateway/src/fido/fido.module.ts index 6f05ce04d..df804d4fd 100644 --- a/apps/api-gateway/src/fido/fido.module.ts +++ b/apps/api-gateway/src/fido/fido.module.ts @@ -1,23 +1,46 @@ -import { Module } from '@nestjs/common'; +import { DynamicModule, Module, Provider } from '@nestjs/common'; import { ClientsModule, Transport } from '@nestjs/microservices'; import { FidoController } from './fido.controller'; import { FidoService } from './fido.service'; -import { getNatsOptions } from '@credebl/common/nats.config'; -import { CommonConstants } from '@credebl/common/common.constant'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { getNatsOptions } from '@credebl/common'; +import { CommonConstants } from '@credebl/common'; +import { NATSClient } from '@credebl/common'; @Module({ - imports:[ + imports: [ ClientsModule.register([ { name: 'NATS_CLIENT', transport: Transport.NATS, options: getNatsOptions(CommonConstants.FIDO_SERVICE, process.env.API_GATEWAY_NKEY_SEED) - } ]) ], controllers: [FidoController], providers: [FidoService, NATSClient] }) -export class FidoModule { } +export class FidoModule { + static register( + overrides: Provider[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + controllerOverrides: any[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + importedModules: any[] = [] + ): DynamicModule { + return { + module: FidoModule, + imports: [ + ClientsModule.register([ + { + name: 'NATS_CLIENT', + transport: Transport.NATS, + options: getNatsOptions(CommonConstants.FIDO_SERVICE, process.env.API_GATEWAY_NKEY_SEED) + } + ]), + ...importedModules + ], + controllers: controllerOverrides.length ? controllerOverrides : [FidoController], + providers: [FidoService, NATSClient, ...overrides] + }; + } +} diff --git a/apps/api-gateway/src/fido/fido.service.ts b/apps/api-gateway/src/fido/fido.service.ts index e746b3930..b1eef14bd 100644 --- a/apps/api-gateway/src/fido/fido.service.ts +++ b/apps/api-gateway/src/fido/fido.service.ts @@ -1,61 +1,70 @@ import { Inject, Injectable } from '@nestjs/common'; import { ClientProxy, RpcException } from '@nestjs/microservices'; -import { BaseService } from 'libs/service/base.service'; -import { UpdateFidoUserDetailsDto, VerifyRegistrationDto, GenerateAuthenticationDto, VerifyAuthenticationDto } from '../dtos/fido-user.dto'; -import { NATSClient } from '@credebl/common/NATSClient'; - +import { BaseService } from '@credebl/common'; +import { + UpdateFidoUserDetailsDto, + VerifyRegistrationDto, + GenerateAuthenticationDto, + VerifyAuthenticationDto +} from '../dtos/fido-user.dto'; +import { NATSClient } from '@credebl/common'; @Injectable() export class FidoService extends BaseService { - constructor( - @Inject('NATS_CLIENT') private readonly fidoServiceProxy: ClientProxy, - private readonly natsClient : NATSClient - ) { - super('FidoService'); - } - async generateRegistrationOption(deviceFlag: boolean, email:string): Promise<{response: object}> { - try { - const payload = { deviceFlag, email }; - return await this.natsClient.sendNats(this.fidoServiceProxy, 'generate-registration-options', payload); - } catch (error) { - throw new RpcException(error.response); - } - + constructor( + @Inject('NATS_CLIENT') private readonly fidoServiceProxy: ClientProxy, + private readonly natsClient: NATSClient + ) { + super('FidoService'); + } + async generateRegistrationOption(deviceFlag: boolean, email: string): Promise<{ response: object }> { + try { + const payload = { deviceFlag, email }; + return await this.natsClient.sendNats(this.fidoServiceProxy, 'generate-registration-options', payload); + } catch (error) { + throw new RpcException(error.response); } + } - async verifyRegistration(verifyRegistrationDto: VerifyRegistrationDto, email: string): Promise<{response: object}> { - const payload = { verifyRegistrationDetails: verifyRegistrationDto, email }; - return this.natsClient.sendNats(this.fidoServiceProxy, 'verify-registration', payload); - } + async verifyRegistration(verifyRegistrationDto: VerifyRegistrationDto, email: string): Promise<{ response: object }> { + const payload = { verifyRegistrationDetails: verifyRegistrationDto, email }; + return this.natsClient.sendNats(this.fidoServiceProxy, 'verify-registration', payload); + } - async generateAuthenticationOption(generateAuthentication: GenerateAuthenticationDto) : Promise<{response: object}> { - const {userName} = generateAuthentication; - const payload = { userName }; - return this.natsClient.sendNats(this.fidoServiceProxy, 'generate-authentication-options', payload); - } + async generateAuthenticationOption(generateAuthentication: GenerateAuthenticationDto): Promise<{ response: object }> { + const { userName } = generateAuthentication; + const payload = { userName }; + return this.natsClient.sendNats(this.fidoServiceProxy, 'generate-authentication-options', payload); + } - async verifyAuthentication(verifyAuthenticationDto: VerifyAuthenticationDto, email: string): Promise<{response: object}> { - const payload = { verifyAuthenticationDetails: verifyAuthenticationDto, email }; - return this.natsClient.sendNats(this.fidoServiceProxy, 'verify-authentication', payload); - } + async verifyAuthentication( + verifyAuthenticationDto: VerifyAuthenticationDto, + email: string + ): Promise<{ response: object }> { + const payload = { verifyAuthenticationDetails: verifyAuthenticationDto, email }; + return this.natsClient.sendNats(this.fidoServiceProxy, 'verify-authentication', payload); + } - async updateFidoUser(updateFidoUserDetailsDto: UpdateFidoUserDetailsDto, credentialId: string) : Promise<{response: object}> { - const payload = {updateFidoUserDetailsDto, credentialId}; - return this.natsClient.sendNats(this.fidoServiceProxy, 'update-user', payload); - } + async updateFidoUser( + updateFidoUserDetailsDto: UpdateFidoUserDetailsDto, + credentialId: string + ): Promise<{ response: object }> { + const payload = { updateFidoUserDetailsDto, credentialId }; + return this.natsClient.sendNats(this.fidoServiceProxy, 'update-user', payload); + } - async fetchFidoUserDetails(email: string): Promise<{response: string}> { - const payload = { email }; - return this.natsClient.sendNats(this.fidoServiceProxy, 'fetch-fido-user-details', payload); - } + async fetchFidoUserDetails(email: string): Promise<{ response: string }> { + const payload = { email }; + return this.natsClient.sendNats(this.fidoServiceProxy, 'fetch-fido-user-details', payload); + } - async deleteFidoUserDevice(credentialId: string): Promise<{response: object}> { - const payload = { credentialId }; - return this.natsClient.sendNats(this.fidoServiceProxy, 'delete-fido-user-device', payload); - } + async deleteFidoUserDevice(credentialId: string): Promise<{ response: object }> { + const payload = { credentialId }; + return this.natsClient.sendNats(this.fidoServiceProxy, 'delete-fido-user-device', payload); + } - async updateFidoUserDeviceName(credentialId: string, deviceName: string): Promise<{response: string}> { - const payload = { credentialId, deviceName }; - return this.natsClient.sendNats(this.fidoServiceProxy, 'update-fido-user-device-name', payload); - } + async updateFidoUserDeviceName(credentialId: string, deviceName: string): Promise<{ response: string }> { + const payload = { credentialId, deviceName }; + return this.natsClient.sendNats(this.fidoServiceProxy, 'update-fido-user-device-name', payload); + } } diff --git a/apps/api-gateway/src/fido/index.ts b/apps/api-gateway/src/fido/index.ts new file mode 100644 index 000000000..5158e898a --- /dev/null +++ b/apps/api-gateway/src/fido/index.ts @@ -0,0 +1,4 @@ +export * from './fido.controller'; +export * from './fido.module'; +export * from './fido.service'; +export * from './dto'; diff --git a/apps/api-gateway/src/geo-location/geo-location.controller.ts b/apps/api-gateway/src/geo-location/geo-location.controller.ts index 2bca8eecc..2a8528548 100644 --- a/apps/api-gateway/src/geo-location/geo-location.controller.ts +++ b/apps/api-gateway/src/geo-location/geo-location.controller.ts @@ -2,10 +2,10 @@ import { Controller, Get, HttpStatus, Logger, Param, Res, UseFilters } from '@ne import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger'; import { GeoLocationService } from './geo-location.service'; import { ApiResponseDto } from '../dtos/apiResponse.dto'; -import IResponseType from '@credebl/common/interfaces/response.interface'; -import { ResponseMessages } from '@credebl/common/response-messages'; +import { IResponseType } from '@credebl/common'; +import { ResponseMessages } from '@credebl/common'; import { Response } from 'express'; -import { CustomExceptionFilter } from 'apps/api-gateway/common/exception-handler'; +import { CustomExceptionFilter } from '../common'; @UseFilters(CustomExceptionFilter) @Controller('/') @@ -21,7 +21,10 @@ export class GeoLocationController { * @returns A list of all available countries */ @Get('countries') - @ApiOperation({ summary: 'Retrieve a list of all countries', description: 'Fetches and returns the details of all available countries.' }) + @ApiOperation({ + summary: 'Retrieve a list of all countries', + description: 'Fetches and returns the details of all available countries.' + }) @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) async getAllCountries(@Res() res: Response): Promise { const countriesDetails = await this.geolocationService.getAllCountries(); @@ -39,7 +42,10 @@ export class GeoLocationController { * @returns A list of all states associated with the given countryId */ @Get('countries/:countryId/states') - @ApiOperation({ summary: 'Retrieve a list of all states within a specified country', description: 'Fetches and returns the details of all states associated with a given countryId.' }) + @ApiOperation({ + summary: 'Retrieve a list of all states within a specified country', + description: 'Fetches and returns the details of all states associated with a given countryId.' + }) @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) async getStatesByCountryId(@Param('countryId') countryId: number, @Res() res: Response): Promise { const statesDetails = await this.geolocationService.getStatesByCountryId(countryId); @@ -58,9 +64,16 @@ export class GeoLocationController { * @returns A list of all cities associated with the given countryId and stateId */ @Get('countries/:countryId/states/:stateId/cities') - @ApiOperation({ summary: 'Retrieve a list of all cities within a specified state and country', description: 'Fetches and returns the details of all cities associated with a given countryId and stateId.' }) + @ApiOperation({ + summary: 'Retrieve a list of all cities within a specified state and country', + description: 'Fetches and returns the details of all cities associated with a given countryId and stateId.' + }) @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) - async getCitiesByStateAndCountry(@Param('countryId') countryId: number, @Param('stateId') stateId: number, @Res() res: Response): Promise { + async getCitiesByStateAndCountry( + @Param('countryId') countryId: number, + @Param('stateId') stateId: number, + @Res() res: Response + ): Promise { const citiesDetails = await this.geolocationService.getCitiesByStateAndCountry(countryId, stateId); const finalResponse: IResponseType = { statusCode: HttpStatus.OK, diff --git a/apps/api-gateway/src/geo-location/geo-location.module.ts b/apps/api-gateway/src/geo-location/geo-location.module.ts index 0f5db4d68..7a13343e8 100644 --- a/apps/api-gateway/src/geo-location/geo-location.module.ts +++ b/apps/api-gateway/src/geo-location/geo-location.module.ts @@ -1,12 +1,12 @@ -import { Logger, Module } from '@nestjs/common'; +import { DynamicModule, Logger, Module, Provider } from '@nestjs/common'; import { GeoLocationController } from './geo-location.controller'; import { GeoLocationService } from './geo-location.service'; import { ClientsModule, Transport } from '@nestjs/microservices'; -import { getNatsOptions } from '@credebl/common/nats.config'; +import { getNatsOptions } from '@credebl/common'; import { RateLimiterModule, RateLimiterGuard } from 'nestjs-rate-limiter'; import { APP_GUARD } from '@nestjs/core'; -import { CommonConstants } from '@credebl/common/common.constant'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { CommonConstants } from '@credebl/common'; +import { NATSClient } from '@credebl/common'; @Module({ imports: [ @@ -35,4 +35,43 @@ import { NATSClient } from '@credebl/common/NATSClient'; NATSClient ] }) -export class GeoLocationModule {} +export class GeoLocationModule { + static register( + overrides: Provider[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + controllerOverrides: any[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + importedModules: any[] = [] + ): DynamicModule { + return { + module: GeoLocationModule, + imports: [ + ClientsModule.register([ + { + name: 'NATS_CLIENT', + transport: Transport.NATS, + options: getNatsOptions(CommonConstants.GEO_LOCATION_SERVICE, process.env.API_GATEWAY_NKEY_SEED) + } + ]), + RateLimiterModule.register({ + points: 50, + duration: 1, + keyPrefix: 'rateLimiter', + errorMessage: 'Rate limit exceeded, please try again later.' + }), + ...importedModules + ], + controllers: controllerOverrides.length ? controllerOverrides : [GeoLocationController], + providers: [ + GeoLocationService, + Logger, + { + provide: APP_GUARD, + useClass: RateLimiterGuard + }, + NATSClient, + ...overrides + ] + }; + } +} diff --git a/apps/api-gateway/src/geo-location/geo-location.service.ts b/apps/api-gateway/src/geo-location/geo-location.service.ts index ab8f92f7b..032895ab3 100644 --- a/apps/api-gateway/src/geo-location/geo-location.service.ts +++ b/apps/api-gateway/src/geo-location/geo-location.service.ts @@ -1,12 +1,15 @@ -import { CountryInterface, StateInterface, CityInterface } from '@credebl/common/interfaces/geolocation.interface'; +import { CountryInterface, StateInterface, CityInterface } from '@credebl/common'; import { Inject, Injectable } from '@nestjs/common'; import { ClientProxy } from '@nestjs/microservices'; -import { BaseService } from 'libs/service/base.service'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { BaseService } from '@credebl/common'; +import { NATSClient } from '@credebl/common'; @Injectable() export class GeoLocationService extends BaseService { - constructor(@Inject('NATS_CLIENT') private readonly serviceProxy: ClientProxy, private readonly natsClient : NATSClient) { + constructor( + @Inject('NATS_CLIENT') private readonly serviceProxy: ClientProxy, + private readonly natsClient: NATSClient + ) { super('GeoLocationService'); } diff --git a/apps/api-gateway/src/geo-location/index.ts b/apps/api-gateway/src/geo-location/index.ts new file mode 100644 index 000000000..e9a05d9da --- /dev/null +++ b/apps/api-gateway/src/geo-location/index.ts @@ -0,0 +1,3 @@ +export * from './geo-location.controller'; +export * from './geo-location.module'; +export * from './geo-location.service'; diff --git a/apps/api-gateway/src/helper-files/index.ts b/apps/api-gateway/src/helper-files/index.ts new file mode 100644 index 000000000..1607d487a --- /dev/null +++ b/apps/api-gateway/src/helper-files/index.ts @@ -0,0 +1 @@ +export * from './file-operation.helper'; diff --git a/apps/api-gateway/src/index.ts b/apps/api-gateway/src/index.ts new file mode 100644 index 000000000..4e761f5f6 --- /dev/null +++ b/apps/api-gateway/src/index.ts @@ -0,0 +1,28 @@ +export * from './agent'; +export * from './agent-service'; +export * from './app.controller'; +export * from './app.module'; +export * from './app.service'; +export * from './authz'; +export * from './boostrap'; +export * from './cloud-wallet'; +export * from './common'; +export * from './connection'; +export * from './credential-definition'; +export * from './dtos'; +export * from './enum'; +export * from './fido'; +export * from './geo-location'; +export * from './helper-files'; +export * from './interfaces'; +export * from './issuance'; +export * from './main'; +export * from './notification'; +export * from './organization'; +export * from './platform'; +export * from './revocation'; +export * from './schema'; +export * from './user'; +export * from './utilities'; +export * from './verification'; +export * from './webhook'; diff --git a/apps/api-gateway/src/interfaces/ISchemaSearch.interface.ts b/apps/api-gateway/src/interfaces/ISchemaSearch.interface.ts index 5d92e5b61..ae30fb2c9 100644 --- a/apps/api-gateway/src/interfaces/ISchemaSearch.interface.ts +++ b/apps/api-gateway/src/interfaces/ISchemaSearch.interface.ts @@ -1,40 +1,38 @@ -import { SchemaType } from '@credebl/enum/enum'; -import { IUserRequestInterface } from '../schema/interfaces'; +import { SchemaType } from '@credebl/common'; +import { IUserRequestSelectedOrgsInterface } from '../schema/interfaces'; export interface ISchemaSearchPayload { - ledgerId?: string; - pageNumber: number; - pageSize: number; - sortField: string; - sortBy: string; - searchByText?: string; - schemaType?: SchemaType; - user?: IUserRequestInterface + ledgerId?: string; + pageNumber: number; + pageSize: number; + sortField: string; + sortBy: string; + searchByText?: string; + schemaType?: SchemaType; + user?: IUserRequestSelectedOrgsInterface; } - export interface W3CSchemaPayload { - schemaAttributes: W3CSchemaAttributes []; - schemaName: string; - did: string; - } + schemaAttributes: W3CSchemaAttributes[]; + schemaName: string; + did: string; +} - interface W3CSchemaAttributes { - type: string, - title: string - } +interface W3CSchemaAttributes { + type: string; + title: string; +} - export interface ILedgers { - id: string; - createDateTime: string; - lastChangedDateTime: string; - name: string; - networkType: string; - poolConfig: string; - isActive: boolean; - networkString: string; - nymTxnEndpoint: string; - indyNamespace: string; - networkUrl: string | null; - } - \ No newline at end of file +export interface ILedgers { + id: string; + createDateTime: string; + lastChangedDateTime: string; + name: string; + networkType: string; + poolConfig: string; + isActive: boolean; + networkString: string; + nymTxnEndpoint: string; + indyNamespace: string; + networkUrl: string | null; +} diff --git a/apps/api-gateway/src/interfaces/fileExport.interface.ts b/apps/api-gateway/src/interfaces/fileExport.interface.ts deleted file mode 100644 index 4cc78a3c3..000000000 --- a/apps/api-gateway/src/interfaces/fileExport.interface.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { IUserRequestInterface } from './IUserRequestInterface'; - -export interface FileExportResponse { - fileContent: string; - fileName : string -} - -export interface FileImportRequest { - filePath: string; - fileName : string; - credDefId: string; - user : IUserRequestInterface -} \ No newline at end of file diff --git a/apps/api-gateway/src/interfaces/index.ts b/apps/api-gateway/src/interfaces/index.ts new file mode 100644 index 000000000..8c30b9ebb --- /dev/null +++ b/apps/api-gateway/src/interfaces/index.ts @@ -0,0 +1,5 @@ +export * from './IConnectionSearch.interface'; +export * from './ISchemaSearch.interface'; +export * from './ISocket.interface'; +export * from './IUserRequestInterface'; +// export * from './fileExport.interface'; diff --git a/apps/api-gateway/src/issuance/dtos/get-all-issued-credentials.dto.ts b/apps/api-gateway/src/issuance/dtos/get-all-issued-credentials.dto.ts index 37be22275..f814ed74f 100644 --- a/apps/api-gateway/src/issuance/dtos/get-all-issued-credentials.dto.ts +++ b/apps/api-gateway/src/issuance/dtos/get-all-issued-credentials.dto.ts @@ -1,13 +1,10 @@ import { ApiProperty } from '@nestjs/swagger'; import { Transform } from 'class-transformer'; import { IsEnum, IsOptional } from 'class-validator'; -import { SortValue } from '../../enum'; -import { trim } from '@credebl/common/cast.helper'; -import { SortFields } from 'apps/issuance/enum/issuance.enum'; -import { PaginationDto } from '@credebl/common/dtos/pagination.dto'; +import { SortFields, trim, SortValue } from '@credebl/common'; +import { PaginationDto } from '@credebl/common'; export class IGetAllIssuedCredentialsDto extends PaginationDto { - @ApiProperty({ required: false, enum: SortFields }) @Transform(({ value }) => trim(value)) @IsOptional() diff --git a/apps/api-gateway/src/issuance/dtos/index.ts b/apps/api-gateway/src/issuance/dtos/index.ts new file mode 100644 index 000000000..9de39be63 --- /dev/null +++ b/apps/api-gateway/src/issuance/dtos/index.ts @@ -0,0 +1,3 @@ +export * from './get-all-issued-credentials.dto'; +export * from './issuance.dto'; +export * from './multi-connection.dto'; diff --git a/apps/api-gateway/src/issuance/dtos/issuance.dto.ts b/apps/api-gateway/src/issuance/dtos/issuance.dto.ts index 26b5e5ca4..4742008ba 100644 --- a/apps/api-gateway/src/issuance/dtos/issuance.dto.ts +++ b/apps/api-gateway/src/issuance/dtos/issuance.dto.ts @@ -18,7 +18,7 @@ import { MaxLength, ValidateNested } from 'class-validator'; -import { AutoAccept, SchemaType, SortValue } from '@credebl/enum/enum'; +import { AutoAccept, SchemaType, SortFields, SortValue } from '@credebl/common'; import { IsCredentialJsonLdContext, SingleOrArray } from '../utils/helper'; import { IssueCredentialType, @@ -28,8 +28,7 @@ import { } from '../interfaces'; import { Transform, Type } from 'class-transformer'; -import { SortFields } from 'apps/connection/src/enum/connection.enum'; -import { trim } from '@credebl/common/cast.helper'; +import { trim } from '@credebl/common'; class Issuer { @ApiProperty() diff --git a/apps/api-gateway/src/issuance/dtos/multi-connection.dto.ts b/apps/api-gateway/src/issuance/dtos/multi-connection.dto.ts index 23a4f56f0..d6bc4112e 100644 --- a/apps/api-gateway/src/issuance/dtos/multi-connection.dto.ts +++ b/apps/api-gateway/src/issuance/dtos/multi-connection.dto.ts @@ -1,114 +1,118 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; -import { ArrayMaxSize, ArrayMinSize, IsArray, IsBoolean, IsEnum, IsNotEmpty, IsObject, IsOptional, IsString, ValidateNested } from 'class-validator'; +import { + ArrayMaxSize, + ArrayMinSize, + IsArray, + IsBoolean, + IsEnum, + IsNotEmpty, + IsObject, + IsOptional, + IsString, + ValidateNested +} from 'class-validator'; import { Transform, Type } from 'class-transformer'; -import { AutoAccept } from '@credebl/enum/enum'; -import { trim } from '@credebl/common/cast.helper'; +import { AutoAccept } from '@credebl/common'; +import { trim } from '@credebl/common'; import { Attribute, Credential, CredentialsIssuanceDto, JsonLdCredentialDetailOptions } from './issuance.dto'; class ConnectionAttributes { - @ApiProperty({ example: 'string' }) - @IsNotEmpty({ message: 'connectionId is required' }) - @IsString({ message: 'connectionId should be string' }) - @Transform(({ value }) => trim(value)) - connectionId: string; + @ApiProperty({ example: 'string' }) + @IsNotEmpty({ message: 'connectionId is required' }) + @IsString({ message: 'connectionId should be string' }) + @Transform(({ value }) => trim(value)) + connectionId: string; - @ApiProperty({ - example: [ - { - value: 'string', - name: 'string' - } - ] - }) - @IsArray() - @ValidateNested({ each: true }) - @ArrayMinSize(1) - @IsNotEmpty({ message: 'Please provide valid attributes' }) - @Type(() => Attribute) - @IsOptional() - attributes?: Attribute[]; + @ApiProperty({ + example: [ + { + value: 'string', + name: 'string' + } + ] + }) + @IsArray() + @ValidateNested({ each: true }) + @ArrayMinSize(1) + @IsNotEmpty({ message: 'Please provide valid attributes' }) + @Type(() => Attribute) + @IsOptional() + attributes?: Attribute[]; - @ApiProperty() - @IsNotEmpty({ message: 'Please provide valid credential' }) - @IsObject({ message: 'credential should be an object' }) - @Type(() => Credential) - @IsOptional() - @ValidateNested({ each: true }) - credential?: Credential; + @ApiProperty() + @IsNotEmpty({ message: 'Please provide valid credential' }) + @IsObject({ message: 'credential should be an object' }) + @Type(() => Credential) + @IsOptional() + @ValidateNested({ each: true }) + credential?: Credential; - @ApiProperty() - @IsNotEmpty({ message: 'Please provide valid options' }) - @IsObject({ message: 'options should be an object' }) - @Type(() => JsonLdCredentialDetailOptions) - @IsOptional() - @ValidateNested({ each: true }) - options?:JsonLdCredentialDetailOptions; + @ApiProperty() + @IsNotEmpty({ message: 'Please provide valid options' }) + @IsObject({ message: 'options should be an object' }) + @Type(() => JsonLdCredentialDetailOptions) + @IsOptional() + @ValidateNested({ each: true }) + options?: JsonLdCredentialDetailOptions; } export class IssueCredentialDto extends CredentialsIssuanceDto { - @ApiProperty({ - example: [ + @ApiProperty({ + example: [ + { + connectionId: 'string', + attributes: [ { - 'connectionId': 'string', - 'attributes': [ - { - 'value': 'string', - 'name': 'string' - } - ], - 'credential': { - '@context': [ - 'https://www.w3.org/2018/credentials/v1', - 'https://www.w3.org/2018/credentials/examples/v1' - ], - 'type': [ - 'VerifiableCredential', - 'UniversityDegreeCredential' - ], - 'issuer': { - 'id': 'did:key:z6Mkn72LVp3mq1fWSefkSMh5V7qrmGfCV4KH3K6SoTM21ouM' - }, - 'issuanceDate': '2019-10-12T07:20:50.52Z', - 'credentialSubject': { - 'id': 'did:key:z6Mkn72LVp3mq1fWSefkSMh5V7qrmGfCV4KH3K6SoTM21ouM', - 'degree': { - 'type': 'BachelorDegree', - 'name': 'Bachelor of Science and Arts' - } - } - }, - 'options': { - 'proofType': 'Ed25519Signature2018', - 'proofPurpose': 'assertionMethod' - } - + value: 'string', + name: 'string' + } + ], + credential: { + '@context': ['https://www.w3.org/2018/credentials/v1', 'https://www.w3.org/2018/credentials/examples/v1'], + type: ['VerifiableCredential', 'UniversityDegreeCredential'], + issuer: { + id: 'did:key:z6Mkn72LVp3mq1fWSefkSMh5V7qrmGfCV4KH3K6SoTM21ouM' + }, + issuanceDate: '2019-10-12T07:20:50.52Z', + credentialSubject: { + id: 'did:key:z6Mkn72LVp3mq1fWSefkSMh5V7qrmGfCV4KH3K6SoTM21ouM', + degree: { + type: 'BachelorDegree', + name: 'Bachelor of Science and Arts' + } } - ] - - }) - @IsArray() - @ValidateNested({ each: true }) - @ArrayMinSize(1) - @ArrayMaxSize(Number(process.env.OOB_BATCH_SIZE), { message: `Limit reached (${process.env.OOB_BATCH_SIZE} connections max).` }) - @IsNotEmpty({ message: 'credentialData is required' }) - @Type(() => ConnectionAttributes) - credentialData: ConnectionAttributes[]; + }, + options: { + proofType: 'Ed25519Signature2018', + proofPurpose: 'assertionMethod' + } + } + ] + }) + @IsArray() + @ValidateNested({ each: true }) + @ArrayMinSize(1) + @ArrayMaxSize(Number(process.env.OOB_BATCH_SIZE), { + message: `Limit reached (${process.env.OOB_BATCH_SIZE} connections max).` + }) + @IsNotEmpty({ message: 'credentialData is required' }) + @Type(() => ConnectionAttributes) + credentialData: ConnectionAttributes[]; - @ApiPropertyOptional() - @IsOptional() - @IsString({ message: 'auto accept proof must be in string' }) - @IsNotEmpty({ message: 'please provide valid auto accept proof' }) - @IsEnum(AutoAccept, { - message: `Invalid auto accept credential. It should be one of: ${Object.values(AutoAccept).join(', ')}` - }) - autoAcceptCredential?: string; + @ApiPropertyOptional() + @IsOptional() + @IsString({ message: 'auto accept proof must be in string' }) + @IsNotEmpty({ message: 'please provide valid auto accept proof' }) + @IsEnum(AutoAccept, { + message: `Invalid auto accept credential. It should be one of: ${Object.values(AutoAccept).join(', ')}` + }) + autoAcceptCredential?: string; - @ApiProperty({ - example: false - }) - @IsOptional() - @IsNotEmpty() - @IsBoolean({message: 'isShortenUrl must be boolean'}) - isShortenUrl?: boolean; - + @ApiProperty({ + example: false + }) + @IsOptional() + @IsNotEmpty() + @IsBoolean({ message: 'isShortenUrl must be boolean' }) + isShortenUrl?: boolean; } diff --git a/apps/api-gateway/src/issuance/enums/Issuance.enum.ts b/apps/api-gateway/src/issuance/enums/Issuance.enum.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/apps/api-gateway/src/issuance/index.ts b/apps/api-gateway/src/issuance/index.ts new file mode 100644 index 000000000..1d1261bf4 --- /dev/null +++ b/apps/api-gateway/src/issuance/index.ts @@ -0,0 +1,6 @@ +export * from './issuance.controller'; +export * from './issuance.module'; +export * from './issuance.service'; +export * from './dtos'; +export * from './interfaces'; +export * from './utils'; diff --git a/apps/api-gateway/src/issuance/interfaces/index.ts b/apps/api-gateway/src/issuance/interfaces/index.ts index 06d30d3ff..791b00596 100644 --- a/apps/api-gateway/src/issuance/interfaces/index.ts +++ b/apps/api-gateway/src/issuance/interfaces/index.ts @@ -1,119 +1,103 @@ -import { SchemaType } from '@credebl/enum/enum'; +import { SchemaType } from '@credebl/common'; import { JsonLdCredentialDetailCredentialStatus } from '../dtos/issuance.dto'; import { JsonValue } from '../utils/helper'; -export interface IUserRequestInterface { - userId: string; - email: string; - orgId: string; - agentEndPoint?: string; - apiKey?: string; - tenantId?: string; - tenantName?: string; - tenantOrgId?: string; - userRoleOrgPermissions?: IUserRoleOrgPerms[]; - orgName?: string; - selectedOrg: ISelectedOrg; -} - export interface ISelectedOrg { - id: string; - userId: string; - orgRoleId: string; - orgId: string; - orgRole: object; - organisation: object; + id: string; + userId: string; + orgRoleId: string; + orgId: string; + orgRole: object; + organisation: object; } export interface IOrganization { - name: string; - description: string; - org_agents: IOrgAgent[] - + name: string; + description: string; + org_agents: IOrgAgent[]; } export interface IOrgAgent { - orgDid: string; - verkey: string; - agentEndPoint: string; - agentOptions: string; - walletName: string; - agentsTypeId: string; - orgId: string; + orgDid: string; + verkey: string; + agentEndPoint: string; + agentOptions: string; + walletName: string; + agentsTypeId: string; + orgId: string; } export class IUserRoleOrgPerms { - id: number; - role: IUserRole; - Organization: IUserOrg; + id: number; + role: IUserRole; + Organization: IUserOrg; } export class IUserRole { - id: number; - name: string; - permissions: string[]; - + id: number; + name: string; + permissions: string[]; } export class IUserOrg { - id: number; - orgName: string; + id: number; + orgName: string; } export interface FileExportResponse { - response: unknown; - fileContent: string; - fileName: string + response: unknown; + fileContent: string; + fileName: string; } export interface UploadedFileDetails { - templateId: string; - fileKey: string; - fileName: string; - type: SchemaType; - isValidateSchema?: boolean; + templateId: string; + fileKey: string; + fileName: string; + type: SchemaType; + isValidateSchema?: boolean; } export interface IIssuedCredentialSearchParams { - pageNumber: number; - pageSize: number; - sortField: string; - sortBy: string; - search: string; + pageNumber: number; + pageSize: number; + sortField: string; + sortBy: string; + search: string; } export enum IssueCredentialType { - JSONLD = 'jsonld', - INDY = 'indy' + JSONLD = 'jsonld', + INDY = 'indy' } export interface JsonObject { - [property: string]: JsonValue - } + [property: string]: JsonValue; +} - export interface JsonLdCredentialDetailCredentialStatusOptions { - type: string - } +export interface JsonLdCredentialDetailCredentialStatusOptions { + type: string; +} - export interface JsonLdCredentialDetailOptionsOptions { - proofPurpose: string - created?: string - domain?: string - challenge?: string - credentialStatus?: JsonLdCredentialDetailCredentialStatus - proofType: string - } +export interface JsonLdCredentialDetailOptionsOptions { + proofPurpose: string; + created?: string; + domain?: string; + challenge?: string; + credentialStatus?: JsonLdCredentialDetailCredentialStatus; + proofType: string; +} - export interface ITemplateFormat { - credentialDefinitionId: string; - schemaCredDefName: string; - schemaName: string; - schemaVersion: string; - schemaAttributes: string; - credentialDefinition: string; - } +export interface ITemplateFormat { + credentialDefinitionId: string; + schemaCredDefName: string; + schemaName: string; + schemaVersion: string; + schemaAttributes: string; + credentialDefinition: string; +} - export interface IReqPayload { - credDefId: string; - fileKey: string | null; - fileName: string; - } \ No newline at end of file +export interface IReqPayload { + credDefId: string; + fileKey: string | null; + fileName: string; +} diff --git a/apps/api-gateway/src/issuance/issuance.controller.ts b/apps/api-gateway/src/issuance/issuance.controller.ts index b94ff1777..d547aef13 100644 --- a/apps/api-gateway/src/issuance/issuance.controller.ts +++ b/apps/api-gateway/src/issuance/issuance.controller.ts @@ -41,7 +41,7 @@ import { ApiResponseDto } from '../dtos/apiResponse.dto'; import { UnauthorizedErrorDto } from '../dtos/unauthorized-error.dto'; import { ForbiddenErrorDto } from '../dtos/forbidden-error.dto'; import { Response } from 'express'; -import IResponseType, { IResponse } from '@credebl/common/interfaces/response.interface'; +import { IResponse } from '@credebl/common'; import { IssuanceService } from './issuance.service'; import { ClientDetails, @@ -56,13 +56,13 @@ import { TemplateDetails, TemplateQuery } from './dtos/issuance.dto'; -import { IUserRequest } from '@credebl/user-request/user-request.interface'; +import { IUserRequest } from '@credebl/user-management'; import { User } from '../authz/decorators/user.decorator'; -import { ResponseMessages } from '@credebl/common/response-messages'; +import { ResponseMessages } from '@credebl/common'; import { Roles } from '../authz/decorators/roles.decorator'; -import { OrgRoles } from 'libs/org-roles/enums'; +import { OrgRoles } from '@credebl/common'; import { OrgRolesGuard } from '../authz/guards/org-roles.guard'; -import { CustomExceptionFilter } from 'apps/api-gateway/common/exception-handler'; +import { CustomExceptionFilter } from '../common'; import { FileExportResponse, IIssuedCredentialSearchParams, @@ -74,13 +74,13 @@ import { FileInterceptor } from '@nestjs/platform-express'; import { v4 as uuidv4 } from 'uuid'; import { RpcException } from '@nestjs/microservices'; /* eslint-disable @typescript-eslint/no-unused-vars */ -import { user } from '@prisma/client'; +import { user } from '@credebl/prisma-service'; import { IGetAllIssuedCredentialsDto } from './dtos/get-all-issued-credentials.dto'; import { IssueCredentialDto } from './dtos/multi-connection.dto'; -import { SchemaType } from '@credebl/enum/enum'; -import { CommonConstants } from '../../../../libs/common/src/common.constant'; -import { TrimStringParamPipe } from '@credebl/common/cast.helper'; +import { SchemaType } from '@credebl/common'; +import { TrimStringParamPipe, CommonConstants } from '@credebl/common'; import { NotFoundErrorDto } from '../dtos/not-found-error.dto'; +import { IResponseType } from '@credebl/common'; @Controller() @UseFilters(CustomExceptionFilter) @ApiTags('credentials') diff --git a/apps/api-gateway/src/issuance/issuance.module.ts b/apps/api-gateway/src/issuance/issuance.module.ts index d5f184d16..f9effb38c 100644 --- a/apps/api-gateway/src/issuance/issuance.module.ts +++ b/apps/api-gateway/src/issuance/issuance.module.ts @@ -1,13 +1,13 @@ import { ClientsModule, Transport } from '@nestjs/microservices'; -import { Module } from '@nestjs/common'; +import { DynamicModule, Module, Provider } from '@nestjs/common'; import { IssuanceController } from './issuance.controller'; import { IssuanceService } from './issuance.service'; import { CommonService } from '@credebl/common'; import { HttpModule } from '@nestjs/axios'; -import { getNatsOptions } from '@credebl/common/nats.config'; +import { getNatsOptions } from '@credebl/common'; import { AwsService } from '@credebl/aws'; -import { CommonConstants } from '@credebl/common/common.constant'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { CommonConstants } from '@credebl/common'; +import { NATSClient } from '@credebl/common'; @Module({ imports: [ @@ -23,4 +23,29 @@ import { NATSClient } from '@credebl/common/NATSClient'; controllers: [IssuanceController], providers: [IssuanceService, CommonService, AwsService, NATSClient] }) -export class IssuanceModule {} +export class IssuanceModule { + static register( + overrides: Provider[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + controllerOverrides: any[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + importedModules: any[] = [] + ): DynamicModule { + return { + module: IssuanceModule, + imports: [ + HttpModule, + ClientsModule.register([ + { + name: 'NATS_CLIENT', + transport: Transport.NATS, + options: getNatsOptions(CommonConstants.ISSUANCE_SERVICE, process.env.API_GATEWAY_NKEY_SEED) + } + ]), + ...importedModules + ], + controllers: controllerOverrides.length ? controllerOverrides : [IssuanceController], + providers: [IssuanceService, CommonService, AwsService, NATSClient, ...overrides] + }; + } +} diff --git a/apps/api-gateway/src/issuance/issuance.service.ts b/apps/api-gateway/src/issuance/issuance.service.ts index dd791f7e8..962b9e0a4 100644 --- a/apps/api-gateway/src/issuance/issuance.service.ts +++ b/apps/api-gateway/src/issuance/issuance.service.ts @@ -1,8 +1,8 @@ /* eslint-disable camelcase */ import { Injectable, Inject } from '@nestjs/common'; import { ClientProxy } from '@nestjs/microservices'; -import { BaseService } from 'libs/service/base.service'; -import { IUserRequest } from '@credebl/user-request/user-request.interface'; +import { BaseService } from '@credebl/common'; +import { IUserRequest } from '@credebl/user-management'; import { ClientDetails, FileParameter, @@ -20,14 +20,10 @@ import { IssueCredentialType, UploadedFileDetails } from './interfaces'; -import { - ICredentialOfferResponse, - IDeletedIssuanceRecords, - IIssuedCredential -} from '@credebl/common/interfaces/issuance.interface'; +import { ICredentialOfferResponse, IDeletedIssuanceRecords, IIssuedCredential } from '@credebl/common'; import { IssueCredentialDto } from './dtos/multi-connection.dto'; -import { user } from '@prisma/client'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { user } from '@credebl/prisma-service'; +import { NATSClient } from '@credebl/common'; @Injectable() export class IssuanceService extends BaseService { constructor( diff --git a/apps/api-gateway/src/issuance/utils/index.ts b/apps/api-gateway/src/issuance/utils/index.ts new file mode 100644 index 000000000..d6d6f056a --- /dev/null +++ b/apps/api-gateway/src/issuance/utils/index.ts @@ -0,0 +1 @@ +export * from './helper'; diff --git a/apps/api-gateway/src/main.ts b/apps/api-gateway/src/main.ts index 47fa61094..2ede72817 100644 --- a/apps/api-gateway/src/main.ts +++ b/apps/api-gateway/src/main.ts @@ -1,106 +1,46 @@ import * as dotenv from 'dotenv'; -import * as express from 'express'; -import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; -import { Logger, VERSION_NEUTRAL, VersioningType } from '@nestjs/common'; +import { bootstrapApiGateway } from './boostrap'; -import { AppModule } from './app.module'; -import { HttpAdapterHost, NestFactory, Reflector } from '@nestjs/core'; -import { AllExceptionsFilter } from '@credebl/common/exception-handler'; -import { MicroserviceOptions, Transport } from '@nestjs/microservices'; -import { getNatsOptions } from '@credebl/common/nats.config'; - -import helmet from 'helmet'; -import { CommonConstants } from '@credebl/common/common.constant'; -import NestjsLoggerServiceAdapter from '@credebl/logger/nestjsLoggerServiceAdapter'; -import { NatsInterceptor } from '@credebl/common'; -import { UpdatableValidationPipe } from '@credebl/common/custom-overrideable-validation-pipe'; dotenv.config(); -async function bootstrap(): Promise { - const app = await NestFactory.create(AppModule); - - app.useLogger(app.get(NestjsLoggerServiceAdapter)); - - app.connectMicroservice({ - transport: Transport.NATS, - options: getNatsOptions(CommonConstants.API_GATEWAY_SERVICE, process.env.API_GATEWAY_NKEY_SEED) - }); - - const expressApp = app.getHttpAdapter().getInstance(); - expressApp.set('x-powered-by', false); - app.use(express.json({ limit: '100mb' })); - app.use(express.urlencoded({ limit: '100mb', extended: true })); - - app.use(function (req, res, next) { - let err = null; - try { - decodeURIComponent(req.path); - } catch (e) { - err = e; - } - if (err) { - return res.status(500).json({ message: 'Invalid URL' }); - } - next(); - }); +// Unique global symbol — prevents double bootstrap in same process +const BOOTSTRAP_FLAG = '__credebl_api_gateway_started__'; - const options = new DocumentBuilder() - .setTitle(`${process.env.PLATFORM_NAME}`) - .setDescription(`${process.env.PLATFORM_NAME} Platform APIs`) - .setVersion('1.0') - .addBearerAuth() - .addServer(`${process.env.PUBLIC_DEV_API_URL}`) - .addServer(`${process.env.PUBLIC_LOCALHOST_URL}`) - .addServer(`${process.env.PUBLIC_QA_API_URL}`) - .addServer(`${process.env.PUBLIC_PRODUCTION_API_URL}`) - .addServer(`${process.env.PUBLIC_SANDBOX_API_URL}`) - .addServer(`${process.env.API_GATEWAY_PROTOCOL}://${process.env.API_ENDPOINT}`) - .addServer(`${process.env.API_GATEWAY_PROTOCOL}://${process.env.API_GATEWAY_HOST}`) - .build(); +async function mainEntry(): Promise { + // If already bootstrapped by something else, do nothing. + // eslint-disable-next-line @typescript-eslint/no-explicit-any + if ((globalThis as any)[BOOTSTRAP_FLAG]) { + return; + } - app.enableVersioning({ - type: VersioningType.URI, - defaultVersion: ['1'] - }); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (globalThis as any)[BOOTSTRAP_FLAG] = true; - const document = SwaggerModule.createDocument(app, options); - SwaggerModule.setup('api', app, document); - const httpAdapter = app.get(HttpAdapterHost); - app.useGlobalFilters(new AllExceptionsFilter(httpAdapter)); - const { ENABLE_CORS_IP_LIST } = process.env || {}; - if (ENABLE_CORS_IP_LIST && '' !== ENABLE_CORS_IP_LIST) { - app.enableCors({ - origin: ENABLE_CORS_IP_LIST.split(','), - methods: 'GET,HEAD,PUT,PATCH,POST,DELETE', - credentials: true + try { + // default options when running package directly + await bootstrapApiGateway(process.env.API_GATEWAY_PORT, { + overrides: [], + controllerOverrides: [], + importedModules: [] }); + } catch (err) { + // let orchestrator see the failure + // eslint-disable-next-line no-console + console.error('Failed to bootstrap API Gateway:', err); + process.exit(1); } +} - app.enableVersioning({ - type: VersioningType.URI, - defaultVersion: ['1', VERSION_NEUTRAL] - }); - - app.use(express.static('uploadedFiles/holder-profile')); - app.use(express.static('uploadedFiles/org-logo')); - app.use(express.static('uploadedFiles/tenant-logo')); - app.use(express.static('uploadedFiles/exports')); - app.use(express.static('resources')); - app.use(express.static('genesis-file')); - app.use(express.static('invoice-pdf')); - app.use(express.static('uploadedFiles/bulk-verification-templates')); - app.use(express.static('uploadedFiles/import')); - // Use custom updatable global pipes - const reflector = app.get(Reflector); - app.useGlobalPipes(new UpdatableValidationPipe(reflector, { whitelist: true, transform: true })); - app.use( - helmet({ - xssFilter: true - }) - ); - app.useGlobalInterceptors(new NatsInterceptor()); - await app.listen(process.env.API_GATEWAY_PORT, `${process.env.API_GATEWAY_HOST}`); - Logger.log(`API Gateway is listening on port ${process.env.API_GATEWAY_PORT}`); +/** + * Auto-run only when this file is executed directly (CJS-style). + * + * This is the standard, reliable check for most Node workflows (ts-node, node after tsc). + * If you also compile to native ESM and run as ESM, add an additional check for import.meta.main. + */ +if ('undefined' !== typeof require && require.main === module) { + void mainEntry(); } -bootstrap(); + +// NOTE: if consumers import this file, nothing is started automatically. +// They should call `bootstrapApiGateway()` from '@credebl/api-gateway/dist/bootstrap' or the package entrypoint. diff --git a/apps/api-gateway/src/notification/dtos/index.ts b/apps/api-gateway/src/notification/dtos/index.ts new file mode 100644 index 000000000..6d9d80f46 --- /dev/null +++ b/apps/api-gateway/src/notification/dtos/index.ts @@ -0,0 +1 @@ +export * from './notification.dto'; diff --git a/apps/api-gateway/src/notification/dtos/notification.dto.ts b/apps/api-gateway/src/notification/dtos/notification.dto.ts index 8ddef46d3..a828161d6 100644 --- a/apps/api-gateway/src/notification/dtos/notification.dto.ts +++ b/apps/api-gateway/src/notification/dtos/notification.dto.ts @@ -2,84 +2,79 @@ import { ApiExtraModels, ApiProperty } from '@nestjs/swagger'; import { IsNotEmpty, IsString, IsUrl } from 'class-validator'; import { Transform } from 'class-transformer'; -import { trim } from '@credebl/common/cast.helper'; +import { trim } from '@credebl/common'; @ApiExtraModels() export class RegisterHolderCredentalsDto { + @ApiProperty() + @Transform(({ value }) => trim(value)) + @IsNotEmpty({ message: 'fcmToken is required.' }) + @IsString({ message: 'fcmToken must be in string format.' }) + fcmToken: string; - @ApiProperty() - @Transform(({ value }) => trim(value)) - @IsNotEmpty({ message: 'fcmToken is required.' }) - @IsString({ message: 'fcmToken must be in string format.' }) - fcmToken: string; + @ApiProperty() + @Transform(({ value }) => trim(value)) + @IsNotEmpty({ message: 'orgId is required.' }) + @IsString({ message: 'orgId must be in string format.' }) + orgId: string; - @ApiProperty() - @Transform(({ value }) => trim(value)) - @IsNotEmpty({ message: 'orgId is required.' }) - @IsString({ message: 'orgId must be in string format.' }) - orgId: string; - - @ApiProperty() - @Transform(({ value }) => trim(value)) - @IsNotEmpty({ message: 'userKey is required.' }) - @IsString({ message: 'userKey must be in string format.' }) - userKey: string; + @ApiProperty() + @Transform(({ value }) => trim(value)) + @IsNotEmpty({ message: 'userKey is required.' }) + @IsString({ message: 'userKey must be in string format.' }) + userKey: string; } export class RegisterOrgWebhhookEndpointDto { + @ApiProperty() + @Transform(({ value }) => trim(value)) + @IsNotEmpty({ message: 'orgId is required.' }) + @IsString({ message: 'orgId must be in string format.' }) + orgId: string; - @ApiProperty() - @Transform(({ value }) => trim(value)) - @IsNotEmpty({ message: 'orgId is required.' }) - @IsString({ message: 'orgId must be in string format.' }) - orgId: string; - - @ApiProperty() - @Transform(({ value }) => trim(value)) - @IsNotEmpty({ message: 'notificationWebhook is required.' }) - @IsString({ message: 'notificationWebhook must be in string format.' }) - @IsUrl({ - // eslint-disable-next-line camelcase - require_protocol: true, // require URL protocol (e.g., http:// or https://) - // eslint-disable-next-line camelcase - require_tld: true // require top-level domain (e.g., .com, .net) - - }) - notificationWebhook: string; + @ApiProperty() + @Transform(({ value }) => trim(value)) + @IsNotEmpty({ message: 'notificationWebhook is required.' }) + @IsString({ message: 'notificationWebhook must be in string format.' }) + @IsUrl({ + // eslint-disable-next-line camelcase + require_protocol: true, // require URL protocol (e.g., http:// or https://) + // eslint-disable-next-line camelcase + require_tld: true // require top-level domain (e.g., .com, .net) + }) + notificationWebhook: string; } export class SendNotificationDto { + @ApiProperty() + @Transform(({ value }) => trim(value)) + @IsNotEmpty({ message: 'fcmToken is required.' }) + @IsString({ message: 'fcmToken must be in string format.' }) + fcmToken: string; - @ApiProperty() - @Transform(({ value }) => trim(value)) - @IsNotEmpty({ message: 'fcmToken is required.' }) - @IsString({ message: 'fcmToken must be in string format.' }) - fcmToken: string; - - @ApiProperty() - @Transform(({ value }) => trim(value)) - @IsNotEmpty({ message: 'messageType is required.' }) - @IsString({ message: 'messageType must be in string format.' }) - messageType: string; + @ApiProperty() + @Transform(({ value }) => trim(value)) + @IsNotEmpty({ message: 'messageType is required.' }) + @IsString({ message: 'messageType must be in string format.' }) + messageType: string; - @ApiProperty() - @Transform(({ value }) => trim(value)) - @IsNotEmpty({ message: 'clientCode is required.' }) - @IsString({ message: 'clientCode must be in string format.' }) - clientCode: string; + @ApiProperty() + @Transform(({ value }) => trim(value)) + @IsNotEmpty({ message: 'clientCode is required.' }) + @IsString({ message: 'clientCode must be in string format.' }) + clientCode: string; } export class GetNotificationDto { + @ApiProperty() + @Transform(({ value }) => trim(value)) + @IsNotEmpty({ message: 'fcmToken is required.' }) + @IsString({ message: 'fcmToken must be in string format.' }) + fcmToken: string; - @ApiProperty() - @Transform(({ value }) => trim(value)) - @IsNotEmpty({ message: 'fcmToken is required.' }) - @IsString({ message: 'fcmToken must be in string format.' }) - fcmToken: string; - - @ApiProperty() - @Transform(({ value }) => trim(value)) - @IsNotEmpty({ message: 'messageType is required.' }) - @IsString({ message: 'messageType must be in string format.' }) - messageType: string; -} \ No newline at end of file + @ApiProperty() + @Transform(({ value }) => trim(value)) + @IsNotEmpty({ message: 'messageType is required.' }) + @IsString({ message: 'messageType must be in string format.' }) + messageType: string; +} diff --git a/apps/api-gateway/src/notification/index.ts b/apps/api-gateway/src/notification/index.ts new file mode 100644 index 000000000..a42e24727 --- /dev/null +++ b/apps/api-gateway/src/notification/index.ts @@ -0,0 +1,5 @@ +export * from './notification.controller'; +export * from './notification.module'; +export * from './notification.service'; +export * from './dtos'; +export * from './interfaces'; diff --git a/apps/api-gateway/src/notification/interfaces/index.ts b/apps/api-gateway/src/notification/interfaces/index.ts new file mode 100644 index 000000000..5224ec751 --- /dev/null +++ b/apps/api-gateway/src/notification/interfaces/index.ts @@ -0,0 +1 @@ +export * from './notification.interfaces'; diff --git a/apps/api-gateway/src/notification/notification.controller.ts b/apps/api-gateway/src/notification/notification.controller.ts index c435d1eaa..90c2d89ba 100644 --- a/apps/api-gateway/src/notification/notification.controller.ts +++ b/apps/api-gateway/src/notification/notification.controller.ts @@ -1,84 +1,83 @@ -import { CustomExceptionFilter } from '@credebl/common/exception-handler'; +import { CustomExceptionFilter } from '../common'; import { Body, Controller, HttpStatus, Logger, Post, Res, UseFilters } from '@nestjs/common'; -import { ApiExcludeEndpoint, ApiForbiddenResponse, ApiOperation, ApiResponse, ApiTags, ApiUnauthorizedResponse } from '@nestjs/swagger'; +import { + ApiExcludeEndpoint, + ApiForbiddenResponse, + ApiOperation, + ApiResponse, + ApiTags, + ApiUnauthorizedResponse +} from '@nestjs/swagger'; import { UnauthorizedErrorDto } from '../dtos/unauthorized-error.dto'; import { ForbiddenErrorDto } from '../dtos/forbidden-error.dto'; import { ApiResponseDto } from '../dtos/apiResponse.dto'; import { RegisterOrgWebhhookEndpointDto, SendNotificationDto } from './dtos/notification.dto'; -import { IResponse } from '@credebl/common/interfaces/response.interface'; +import { IResponse } from '@credebl/common'; import { Response } from 'express'; -import { ResponseMessages } from '@credebl/common/response-messages'; +import { ResponseMessages } from '@credebl/common'; import { NotificationService } from './notification.service'; - @Controller('notification') @UseFilters(CustomExceptionFilter) @ApiTags('notification') @ApiUnauthorizedResponse({ status: 401, description: 'Unauthorized', type: UnauthorizedErrorDto }) @ApiForbiddenResponse({ status: 403, description: 'Forbidden', type: ForbiddenErrorDto }) export class NotificationController { - constructor( - private readonly notificationService: NotificationService - ) { } - private readonly logger = new Logger('NotificationController'); - - /** - * Register organization webhook endpoint - * @param registerOrgWebhhookEndpointDto - * @param res - * @returns Stored notification data - */ - @Post('/register/webhook-endpoint') - @ApiExcludeEndpoint() - @ApiOperation({ - summary: `Register organization webhook endpoint for notification`, - description: `Register organization webhook endpoint for notification` - }) - @ApiResponse({ status: HttpStatus.CREATED, description: 'Success', type: ApiResponseDto }) - async registerOrgWebhookEndpoint( - @Body() registerOrgWebhhookEndpointDto: RegisterOrgWebhhookEndpointDto, - @Res() res: Response - ): Promise { - - const registerUserEndpoint = await this.notificationService.registerOrgWebhookEndpoint( - registerOrgWebhhookEndpointDto - ); + constructor(private readonly notificationService: NotificationService) {} + private readonly logger = new Logger('NotificationController'); - const finalResponse: IResponse = { - statusCode: HttpStatus.CREATED, - message: ResponseMessages.notification.success.register, - data: registerUserEndpoint - }; - return res.status(HttpStatus.CREATED).json(finalResponse); - } + /** + * Register organization webhook endpoint + * @param registerOrgWebhhookEndpointDto + * @param res + * @returns Stored notification data + */ + @Post('/register/webhook-endpoint') + @ApiExcludeEndpoint() + @ApiOperation({ + summary: `Register organization webhook endpoint for notification`, + description: `Register organization webhook endpoint for notification` + }) + @ApiResponse({ status: HttpStatus.CREATED, description: 'Success', type: ApiResponseDto }) + async registerOrgWebhookEndpoint( + @Body() registerOrgWebhhookEndpointDto: RegisterOrgWebhhookEndpointDto, + @Res() res: Response + ): Promise { + const registerUserEndpoint = + await this.notificationService.registerOrgWebhookEndpoint(registerOrgWebhhookEndpointDto); - /** - * Send notification for holder - * @param sendNotificationDto - * @param res - * @returns Get notification details - */ - @Post('/') - @ApiExcludeEndpoint() - @ApiOperation({ - summary: `Send notification for holder`, - description: `Send notification for holder` - }) - @ApiResponse({ status: HttpStatus.CREATED, description: 'Success', type: ApiResponseDto }) - async sendNotification( - @Body() notificationRequestBody: SendNotificationDto, - @Res() res: Response - ): Promise { + const finalResponse: IResponse = { + statusCode: HttpStatus.CREATED, + message: ResponseMessages.notification.success.register, + data: registerUserEndpoint + }; + return res.status(HttpStatus.CREATED).json(finalResponse); + } - const sendNotification = await this.notificationService.sendNotification( - notificationRequestBody - ); + /** + * Send notification for holder + * @param sendNotificationDto + * @param res + * @returns Get notification details + */ + @Post('/') + @ApiExcludeEndpoint() + @ApiOperation({ + summary: `Send notification for holder`, + description: `Send notification for holder` + }) + @ApiResponse({ status: HttpStatus.CREATED, description: 'Success', type: ApiResponseDto }) + async sendNotification( + @Body() notificationRequestBody: SendNotificationDto, + @Res() res: Response + ): Promise { + const sendNotification = await this.notificationService.sendNotification(notificationRequestBody); - const finalResponse: IResponse = { - statusCode: HttpStatus.CREATED, - message: ResponseMessages.notification.success.sendNotification, - data: sendNotification - }; - return res.status(HttpStatus.CREATED).json(finalResponse); - } -} \ No newline at end of file + const finalResponse: IResponse = { + statusCode: HttpStatus.CREATED, + message: ResponseMessages.notification.success.sendNotification, + data: sendNotification + }; + return res.status(HttpStatus.CREATED).json(finalResponse); + } +} diff --git a/apps/api-gateway/src/notification/notification.module.ts b/apps/api-gateway/src/notification/notification.module.ts index 72fbc9400..3ddc26acb 100644 --- a/apps/api-gateway/src/notification/notification.module.ts +++ b/apps/api-gateway/src/notification/notification.module.ts @@ -1,14 +1,13 @@ - import { CommonModule, CommonService } from '@credebl/common'; import { ClientsModule, Transport } from '@nestjs/microservices'; import { ConfigModule } from '@nestjs/config'; import { HttpModule } from '@nestjs/axios'; -import { Module } from '@nestjs/common'; -import { getNatsOptions } from '@credebl/common/nats.config'; +import { DynamicModule, Module, Provider } from '@nestjs/common'; +import { getNatsOptions } from '@credebl/common'; import { NotificationController } from './notification.controller'; import { NotificationService } from './notification.service'; -import { CommonConstants } from '@credebl/common/common.constant'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { CommonConstants } from '@credebl/common'; +import { NATSClient } from '@credebl/common'; @Module({ imports: [ @@ -19,7 +18,6 @@ import { NATSClient } from '@credebl/common/NATSClient'; name: 'NATS_CLIENT', transport: Transport.NATS, options: getNatsOptions(CommonConstants.NOTIFICATION_SERVICE, process.env.API_GATEWAY_NKEY_SEED) - }, CommonModule ]) @@ -27,4 +25,31 @@ import { NATSClient } from '@credebl/common/NATSClient'; controllers: [NotificationController], providers: [NotificationService, CommonService, NATSClient] }) -export class NotificationModule { } +export class NotificationModule { + static register( + overrides: Provider[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + controllerOverrides: any[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + importedModules: any[] = [] + ): DynamicModule { + return { + module: NotificationModule, + imports: [ + HttpModule, + ConfigModule.forRoot(), + ClientsModule.register([ + { + name: 'NATS_CLIENT', + transport: Transport.NATS, + options: getNatsOptions(CommonConstants.NOTIFICATION_SERVICE, process.env.API_GATEWAY_NKEY_SEED) + }, + CommonModule + ]), + ...importedModules + ], + controllers: controllerOverrides.length ? controllerOverrides : [NotificationController], + providers: [NotificationService, CommonService, NATSClient, ...overrides] + }; + } +} diff --git a/apps/api-gateway/src/notification/notification.service.ts b/apps/api-gateway/src/notification/notification.service.ts index 130012fc2..a9ce77162 100644 --- a/apps/api-gateway/src/notification/notification.service.ts +++ b/apps/api-gateway/src/notification/notification.service.ts @@ -1,31 +1,40 @@ import { Inject, Injectable } from '@nestjs/common'; import { ClientProxy } from '@nestjs/microservices'; -import { BaseService } from 'libs/service/base.service'; +import { BaseService } from '@credebl/common'; import { RegisterOrgWebhhookEndpointDto, SendNotificationDto } from './dtos/notification.dto'; import { INotification } from './interfaces/notification.interfaces'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { NATSClient } from '@credebl/common'; @Injectable() export class NotificationService extends BaseService { - constructor(@Inject('NATS_CLIENT') private readonly serviceProxy: ClientProxy, private readonly natsClient : NATSClient) { - super('NotificationService'); - } + constructor( + @Inject('NATS_CLIENT') private readonly serviceProxy: ClientProxy, + private readonly natsClient: NATSClient + ) { + super('NotificationService'); + } - /** - * Register organization webhook endpoint - * @param registerOrgWebhhookEndpointDto - * @returns Stored notification data - */ - async registerOrgWebhookEndpoint(registerOrgWebhhookEndpointDto: RegisterOrgWebhhookEndpointDto): Promise { - return this.natsClient.sendNatsMessage(this.serviceProxy, 'register-org-webhook-endpoint-for-notification', registerOrgWebhhookEndpointDto); - } + /** + * Register organization webhook endpoint + * @param registerOrgWebhhookEndpointDto + * @returns Stored notification data + */ + async registerOrgWebhookEndpoint( + registerOrgWebhhookEndpointDto: RegisterOrgWebhhookEndpointDto + ): Promise { + return this.natsClient.sendNatsMessage( + this.serviceProxy, + 'register-org-webhook-endpoint-for-notification', + registerOrgWebhhookEndpointDto + ); + } - /** - * Send notification for holder - * @param sendNotificationDto - * @returns Get notification details - */ - async sendNotification(notificationRequestBody: SendNotificationDto): Promise { - return this.natsClient.sendNatsMessage(this.serviceProxy, 'send-notification', notificationRequestBody); - } -} \ No newline at end of file + /** + * Send notification for holder + * @param sendNotificationDto + * @returns Get notification details + */ + async sendNotification(notificationRequestBody: SendNotificationDto): Promise { + return this.natsClient.sendNatsMessage(this.serviceProxy, 'send-notification', notificationRequestBody); + } +} diff --git a/apps/api-gateway/src/organization/dtos/client-credentials.dto.ts b/apps/api-gateway/src/organization/dtos/client-credentials.dto.ts index 9c2ad15d3..77f87a150 100644 --- a/apps/api-gateway/src/organization/dtos/client-credentials.dto.ts +++ b/apps/api-gateway/src/organization/dtos/client-credentials.dto.ts @@ -2,17 +2,15 @@ import { ApiExtraModels, ApiProperty } from '@nestjs/swagger'; import { IsNotEmpty, IsString } from 'class-validator'; import { Transform } from 'class-transformer'; -import { trim } from '@credebl/common/cast.helper'; +import { trim } from '@credebl/common'; @ApiExtraModels() export class ClientCredentialsDto { + clientId: string; - clientId: string; - - @ApiProperty() - @Transform(({ value }) => trim(value)) - @IsNotEmpty({ message: 'clientSecret is required.' }) - @IsString({ message: 'clientSecret must be in string format.' }) - clientSecret: string; - -} \ No newline at end of file + @ApiProperty() + @Transform(({ value }) => trim(value)) + @IsNotEmpty({ message: 'clientSecret is required.' }) + @IsString({ message: 'clientSecret must be in string format.' }) + clientSecret: string; +} diff --git a/apps/api-gateway/src/organization/dtos/create-organization-dto.ts b/apps/api-gateway/src/organization/dtos/create-organization-dto.ts index 47d1f987b..06299abf6 100644 --- a/apps/api-gateway/src/organization/dtos/create-organization-dto.ts +++ b/apps/api-gateway/src/organization/dtos/create-organization-dto.ts @@ -2,7 +2,7 @@ import { ApiExtraModels, ApiProperty, ApiPropertyOptional } from '@nestjs/swagge import { IsNotEmpty, IsOptional, IsString, IsUrl, MaxLength, MinLength } from 'class-validator'; import { Transform } from 'class-transformer'; -import { IsNotSQLInjection, trim } from '@credebl/common/cast.helper'; +import { IsNotSQLInjection, trim } from '@credebl/common'; import { GeoLocationDto } from '../../dtos/geo-location-dto'; @ApiExtraModels() diff --git a/apps/api-gateway/src/organization/dtos/get-organizations.dto.ts b/apps/api-gateway/src/organization/dtos/get-organizations.dto.ts index 4a4b35ddd..41eb12f06 100644 --- a/apps/api-gateway/src/organization/dtos/get-organizations.dto.ts +++ b/apps/api-gateway/src/organization/dtos/get-organizations.dto.ts @@ -1,14 +1,14 @@ -import { trim } from '@credebl/common/cast.helper'; -import { PaginationDto } from '@credebl/common/dtos/pagination.dto'; +import { trim } from '@credebl/common'; +import { PaginationDto } from '@credebl/common'; import { ApiProperty } from '@nestjs/swagger'; import { Transform } from 'class-transformer'; import { IsEnum, IsOptional } from 'class-validator'; -import { OrgRoles } from 'libs/org-roles/enums'; +import { OrgRoles } from '@credebl/common'; export class GetAllOrganizationsDto extends PaginationDto { - @ApiProperty({ required: false, enum: OrgRoles }) - @Transform(({ value }) => trim(value)) - @IsOptional() - @IsEnum(OrgRoles) - role: string; + @ApiProperty({ required: false, enum: OrgRoles }) + @Transform(({ value }) => trim(value)) + @IsOptional() + @IsEnum(OrgRoles) + role: string; } diff --git a/apps/api-gateway/src/organization/dtos/index.ts b/apps/api-gateway/src/organization/dtos/index.ts new file mode 100644 index 000000000..6e323f6f9 --- /dev/null +++ b/apps/api-gateway/src/organization/dtos/index.ts @@ -0,0 +1,7 @@ +export * from './client-credentials.dto'; +export * from './create-organization-dto'; +export * from './get-organizations.dto'; +export * from './send-invitation.dto'; +export * from './set-primary-did.dto'; +export * from './update-organization-dto'; +export * from './update-user-roles.dto'; diff --git a/apps/api-gateway/src/organization/dtos/send-invitation.dto.ts b/apps/api-gateway/src/organization/dtos/send-invitation.dto.ts index b5c6295bd..98dfadffb 100644 --- a/apps/api-gateway/src/organization/dtos/send-invitation.dto.ts +++ b/apps/api-gateway/src/organization/dtos/send-invitation.dto.ts @@ -1,41 +1,38 @@ import { ApiExtraModels, ApiProperty } from '@nestjs/swagger'; import { IsArray, IsEmail, IsNotEmpty, IsString, IsUUID, ValidateNested } from 'class-validator'; import { Transform, Type } from 'class-transformer'; -import { trim } from '@credebl/common/cast.helper'; +import { trim } from '@credebl/common'; @ApiExtraModels() export class SendInvitationDto { + @ApiProperty({ example: 'awqx@yopmail.com' }) + @IsEmail({}, { message: 'Please provide a valid email' }) + @IsNotEmpty({ message: 'Email is required' }) + @IsString({ message: 'Email should be a string' }) + @Transform(({ value }) => trim(value)) + email: string; - @ApiProperty({ example: 'awqx@yopmail.com' }) - @IsEmail({}, { message: 'Please provide a valid email' }) - @IsNotEmpty({ message: 'Email is required' }) - @IsString({ message: 'Email should be a string' }) - @Transform(({ value }) => trim(value)) - email: string; - - @ApiProperty({ example: ['1a7eac11-ff05-40d7-8351-4d7467687cad'] }) - @IsNotEmpty({ message: 'Please provide valid orgRoleId' }) - @IsArray() - @IsUUID('4', { each: true, message: 'Invalid format of orgRoleId' }) - orgRoleId: string[]; - + @ApiProperty({ example: ['1a7eac11-ff05-40d7-8351-4d7467687cad'] }) + @IsNotEmpty({ message: 'Please provide valid orgRoleId' }) + @IsArray() + @IsUUID('4', { each: true, message: 'Invalid format of orgRoleId' }) + orgRoleId: string[]; } @ApiExtraModels() export class BulkSendInvitationDto { + @ApiProperty({ + example: [ + { + email: 'awqx@yopmail.com', + orgRoleId: ['1a7eac11-ff05-40d7-8351-4d7467687cad'] + } + ] + }) + @IsArray() + @ValidateNested({ each: true }) + @Type(() => SendInvitationDto) + invitations: SendInvitationDto[]; - @ApiProperty({ - example: [ - { - email: 'awqx@yopmail.com', - orgRoleId: ['1a7eac11-ff05-40d7-8351-4d7467687cad'] - } - ] - }) - @IsArray() - @ValidateNested({ each: true }) - @Type(() => SendInvitationDto) - invitations: SendInvitationDto[]; - - orgId: string; + orgId: string; } diff --git a/apps/api-gateway/src/organization/dtos/set-primary-did.dto.ts b/apps/api-gateway/src/organization/dtos/set-primary-did.dto.ts index ccac22c94..85a3175fd 100644 --- a/apps/api-gateway/src/organization/dtos/set-primary-did.dto.ts +++ b/apps/api-gateway/src/organization/dtos/set-primary-did.dto.ts @@ -1,22 +1,20 @@ import { ApiExtraModels, ApiPropertyOptional } from '@nestjs/swagger'; -import { IsNotEmpty, IsString} from 'class-validator'; +import { IsNotEmpty, IsString } from 'class-validator'; import { Transform } from 'class-transformer'; -import { trim } from '@credebl/common/cast.helper'; +import { trim } from '@credebl/common'; @ApiExtraModels() export class PrimaryDid { - - @ApiPropertyOptional() - @Transform(({ value }) => trim(value)) - @IsNotEmpty({ message: 'Did is required.' }) - @IsString({ message: 'Did must be in string format.' }) - did: string; + @ApiPropertyOptional() + @Transform(({ value }) => trim(value)) + @IsNotEmpty({ message: 'Did is required.' }) + @IsString({ message: 'Did must be in string format.' }) + did: string; - @ApiPropertyOptional() - @Transform(({ value }) => trim(value)) - @IsNotEmpty({ message: 'Id is required.' }) - @IsString({ message: 'Id must be in string format.' }) - id: string; - -} \ No newline at end of file + @ApiPropertyOptional() + @Transform(({ value }) => trim(value)) + @IsNotEmpty({ message: 'Id is required.' }) + @IsString({ message: 'Id must be in string format.' }) + id: string; +} diff --git a/apps/api-gateway/src/organization/dtos/update-organization-dto.ts b/apps/api-gateway/src/organization/dtos/update-organization-dto.ts index ca6e2dc8b..aac0e7d4b 100644 --- a/apps/api-gateway/src/organization/dtos/update-organization-dto.ts +++ b/apps/api-gateway/src/organization/dtos/update-organization-dto.ts @@ -2,7 +2,7 @@ import { ApiExtraModels, ApiPropertyOptional } from '@nestjs/swagger'; import { IsNotEmpty, IsOptional, IsString, IsBoolean, MaxLength, MinLength, Validate } from 'class-validator'; import { Transform } from 'class-transformer'; -import { ImageBase64Validator, IsNotSQLInjection, trim } from '@credebl/common/cast.helper'; +import { ImageBase64Validator, IsNotSQLInjection, trim } from '@credebl/common'; import { GeoLocationDto } from '../../dtos/geo-location-dto'; @ApiExtraModels() diff --git a/apps/api-gateway/src/organization/index.ts b/apps/api-gateway/src/organization/index.ts new file mode 100644 index 000000000..e2dc2f1a8 --- /dev/null +++ b/apps/api-gateway/src/organization/index.ts @@ -0,0 +1,4 @@ +export * from './organization.controller'; +export * from './organization.module'; +export * from './organization.service'; +export * from './dtos'; diff --git a/apps/api-gateway/src/organization/organization.controller.ts b/apps/api-gateway/src/organization/organization.controller.ts index 72f012fe4..72b0d2f79 100644 --- a/apps/api-gateway/src/organization/organization.controller.ts +++ b/apps/api-gateway/src/organization/organization.controller.ts @@ -30,30 +30,30 @@ import { } from '@nestjs/common'; import { OrganizationService } from './organization.service'; import { CreateOrganizationDto } from './dtos/create-organization-dto'; -import IResponse from '@credebl/common/interfaces/response.interface'; +import type { IResponse } from '@credebl/common'; import { Response } from 'express'; import { ApiResponseDto } from '../dtos/apiResponse.dto'; import { UnauthorizedErrorDto } from '../dtos/unauthorized-error.dto'; import { ForbiddenErrorDto } from '../dtos/forbidden-error.dto'; import { AuthGuard } from '@nestjs/passport'; import { User } from '../authz/decorators/user.decorator'; -import { user } from '@prisma/client'; -import { ResponseMessages } from '@credebl/common/response-messages'; +import { user } from '@credebl/prisma-service'; +import { ResponseMessages } from '@credebl/common'; import { BulkSendInvitationDto } from './dtos/send-invitation.dto'; import { OrgRolesGuard } from '../authz/guards/org-roles.guard'; import { Roles } from '../authz/decorators/roles.decorator'; -import { OrgRoles } from 'libs/org-roles/enums'; +import { OrgRoles } from '@credebl/common'; import { UpdateUserRolesDto } from './dtos/update-user-roles.dto'; import { UpdateOrganizationDto } from './dtos/update-organization-dto'; -import { CustomExceptionFilter } from 'apps/api-gateway/common/exception-handler'; +import { CustomExceptionFilter } from '../common'; import { IUserRequestInterface } from '../interfaces/IUserRequestInterface'; import { ClientCredentialsDto } from './dtos/client-credentials.dto'; -import { PaginationDto } from '@credebl/common/dtos/pagination.dto'; +import { PaginationDto } from '@credebl/common'; import { validate as isValidUUID } from 'uuid'; import { UserAccessGuard } from '../authz/guards/user-access-guard'; import { GetAllOrganizationsDto } from './dtos/get-organizations.dto'; import { PrimaryDid } from './dtos/set-primary-did.dto'; -import { TrimStringParamPipe } from '@credebl/common/cast.helper'; +import { TrimStringParamPipe } from '@credebl/common'; @UseFilters(CustomExceptionFilter) @Controller('orgs') diff --git a/apps/api-gateway/src/organization/organization.module.ts b/apps/api-gateway/src/organization/organization.module.ts index bc8da3334..6bb69df1f 100644 --- a/apps/api-gateway/src/organization/organization.module.ts +++ b/apps/api-gateway/src/organization/organization.module.ts @@ -3,13 +3,14 @@ import { CommonModule, CommonService } from '@credebl/common'; import { ClientsModule, Transport } from '@nestjs/microservices'; import { ConfigModule } from '@nestjs/config'; import { HttpModule } from '@nestjs/axios'; -import { Module } from '@nestjs/common'; +import { DynamicModule, Module, Provider } from '@nestjs/common'; import { OrganizationController } from './organization.controller'; import { OrganizationService } from './organization.service'; -import { getNatsOptions } from '@credebl/common/nats.config'; +import { getNatsOptions } from '@credebl/common'; import { AwsService } from '@credebl/aws'; -import { CommonConstants } from '@credebl/common/common.constant'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { CommonConstants } from '@credebl/common'; +import { NATSClient } from '@credebl/common'; + @Module({ imports: [ HttpModule, @@ -26,4 +27,31 @@ import { NATSClient } from '@credebl/common/NATSClient'; controllers: [OrganizationController], providers: [OrganizationService, CommonService, AwsService, NATSClient] }) -export class OrganizationModule {} +export class OrganizationModule { + static register( + overrides: Provider[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + controllerOverrides: any[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + importedModules: any[] = [] + ): DynamicModule { + return { + module: OrganizationModule, + imports: [ + HttpModule, + ConfigModule.forRoot(), + ClientsModule.register([ + { + name: 'NATS_CLIENT', + transport: Transport.NATS, + options: getNatsOptions(CommonConstants.ORGANIZATION_SERVICE, process.env.API_GATEWAY_NKEY_SEED) + }, + CommonModule + ]), + ...importedModules + ], + controllers: controllerOverrides.length ? controllerOverrides : [OrganizationController], + providers: [OrganizationService, CommonService, AwsService, ...overrides] + }; + } +} diff --git a/apps/api-gateway/src/organization/organization.service.ts b/apps/api-gateway/src/organization/organization.service.ts index c407385e0..972ded430 100644 --- a/apps/api-gateway/src/organization/organization.service.ts +++ b/apps/api-gateway/src/organization/organization.service.ts @@ -1,14 +1,13 @@ import { Inject } from '@nestjs/common'; import { Injectable } from '@nestjs/common'; import { ClientProxy } from '@nestjs/microservices'; -import { BaseService } from 'libs/service/base.service'; +import { BaseService, IOrgUsers } from '@credebl/common'; import { CreateOrganizationDto } from './dtos/create-organization-dto'; import { BulkSendInvitationDto } from './dtos/send-invitation.dto'; import { UpdateUserRolesDto } from './dtos/update-user-roles.dto'; import { UpdateOrganizationDto } from './dtos/update-organization-dto'; -import { organisation, user } from '@prisma/client'; -import { IDidList, IGetOrgById, IGetOrganization } from 'apps/organization/interfaces/organization.interface'; -import { IOrgUsers } from 'apps/user/interfaces/user.interface'; +import { organisation, user } from '@credebl/prisma-service'; +import { IDidList, IGetOrgById, IGetOrganization } from '@credebl/common'; import { IOrgCredentials, IOrganization, @@ -16,14 +15,14 @@ import { IOrganizationDashboard, IDeleteOrganization, IOrgActivityCount -} from '@credebl/common/interfaces/organization.interface'; +} from '@credebl/common'; import { ClientCredentialsDto } from './dtos/client-credentials.dto'; -import { IAccessTokenData } from '@credebl/common/interfaces/interface'; -import { PaginationDto } from '@credebl/common/dtos/pagination.dto'; -import { IClientRoles } from '@credebl/client-registration/interfaces/client.interface'; +import { IAccessTokenData } from '@credebl/common'; +import { PaginationDto } from '@credebl/common'; +import { IClientRoles } from '@credebl/user-management'; import { GetAllOrganizationsDto } from './dtos/get-organizations.dto'; import { PrimaryDid } from './dtos/set-primary-did.dto'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { NATSClient } from '@credebl/common'; @Injectable() export class OrganizationService extends BaseService { diff --git a/apps/api-gateway/src/platform/index.ts b/apps/api-gateway/src/platform/index.ts new file mode 100644 index 000000000..1411cb189 --- /dev/null +++ b/apps/api-gateway/src/platform/index.ts @@ -0,0 +1,4 @@ +export * from './platform.controller'; +export * from './platform.interface'; +export * from './platform.module'; +export * from './platform.service'; diff --git a/apps/api-gateway/src/platform/platform.controller.spec.ts b/apps/api-gateway/src/platform/platform.controller.spec.ts deleted file mode 100644 index 8cb1a53a9..000000000 --- a/apps/api-gateway/src/platform/platform.controller.spec.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { plainToClass } from 'class-transformer'; -import { validate } from 'class-validator'; -import { PlatformController } from './platform.controller'; -import { PlatformService } from './platform.service'; -import { SortValue } from './platform.model'; - -describe('Credentia lDefinitionController Test Cases', () => { - let controller: PlatformController; - const mockCredentialDefinitionService = { - connectedHolderList: jest.fn(() => ({})), - getCredentialListByConnectionId: jest.fn(() => ({})), - pingServicePlatform: jest.fn(() => ({})) - }; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - controllers: [PlatformController], - providers: [PlatformService] - }) - .overrideProvider(PlatformService) - .useValue(mockCredentialDefinitionService) - .compile(); - controller = module.get( - PlatformController - ); - }); - - describe('connected holder list', () => { - const itemsPerPage: any = 1; - const page: any = 1; - const searchText: any = 'abc'; - const orgId: any = 13; - const connectionSortBy: any = 'xyz'; - const sortValue: any = 'asdd'; - it('should return an expected connected holder list', async () => { - const result = await controller.connectedHolderList( - itemsPerPage, - page, - searchText, - orgId, - connectionSortBy, - sortValue - ); - expect(result).toEqual({}); - }); - }); - describe('get credential list by connection id', () => { - const connectionId = 'jhkh'; - const itemsPerPage = 10; - const page = 1; - const searchText = 'abc'; - const sortValue:any = SortValue; - const credentialSortBy = 'ddcc'; - it('should return an expected credential list by connection id', async () => { - const result = await controller.getCredentialListByConnectionId( - connectionId, - itemsPerPage, - page, - searchText, - sortValue, - credentialSortBy - ); - expect(result).toEqual({}); - }); - }); - describe('get the platform service status', () => { - it('should return an expected platform service status', async () => { - const result = await controller.pingServicePlatform(); - expect(result).toEqual({}); - }); - }); - }); - \ No newline at end of file diff --git a/apps/api-gateway/src/platform/platform.controller.ts b/apps/api-gateway/src/platform/platform.controller.ts index 3f1c2b35f..db5b96028 100644 --- a/apps/api-gateway/src/platform/platform.controller.ts +++ b/apps/api-gateway/src/platform/platform.controller.ts @@ -1,4 +1,15 @@ -import { BadRequestException, Controller, Get, HttpStatus, Logger, Param, Query, Res, UseFilters, UseGuards } from '@nestjs/common'; +import { + BadRequestException, + Controller, + Get, + HttpStatus, + Logger, + Param, + Query, + Res, + UseFilters, + UseGuards +} from '@nestjs/common'; import { PlatformService } from './platform.service'; import { ApiBearerAuth, ApiExcludeEndpoint, ApiOperation, ApiQuery, ApiResponse, ApiTags } from '@nestjs/swagger'; import { ApiResponseDto } from '../dtos/apiResponse.dto'; @@ -7,204 +18,196 @@ import { IUserRequestInterface } from '../interfaces/IUserRequestInterface'; import { User } from '../authz/decorators/user.decorator'; import { Response } from 'express'; import { ISchemaSearchPayload } from '../interfaces/ISchemaSearch.interface'; -import { IResponse } from '@credebl/common/interfaces/response.interface'; -import { ResponseMessages } from '@credebl/common/response-messages'; -import { CustomExceptionFilter } from 'apps/api-gateway/common/exception-handler'; +import { IResponse } from '@credebl/common'; +import { ResponseMessages } from '@credebl/common'; +import { CustomExceptionFilter } from '../common'; import { AuthGuard } from '@nestjs/passport'; import * as QRCode from 'qrcode'; -import { CredDefSortFields, SchemaType, SortFields } from '@credebl/enum/enum'; +import { CredDefSortFields, SchemaType, SortFields } from '@credebl/common'; import { GetAllPlatformCredDefsDto } from '../credential-definition/dto/get-all-platform-cred-defs.dto'; -import { TrimStringParamPipe } from '@credebl/common/cast.helper'; +import { TrimStringParamPipe } from '@credebl/common'; @Controller('') @UseFilters(CustomExceptionFilter) export class PlatformController { - constructor(private readonly platformService: PlatformService) { } + constructor(private readonly platformService: PlatformService) {} - private readonly logger = new Logger('PlatformController'); + private readonly logger = new Logger('PlatformController'); - /** - * Retrieves all schemas available on the platform with optional filters and sorting. - * - * @param ledgerId The ID of the ledger. - * @param schemaType Type of schema to filter results. - * - * @returns A paginated list of schemas based on the provided criteria. - */ - @Get('/platform/schemas') - @ApiTags('schemas') - @ApiOperation({ - summary: 'Get all schemas from platform.', - description: 'Retrieves all schemas available on the platform' - }) - @ApiQuery({ - name: 'sortField', - enum: SortFields, - required: false - }) - @ApiQuery({ - name: 'schemaType', - enum: SchemaType, - required: false - }) - @ApiBearerAuth() - @UseGuards(AuthGuard('jwt')) - @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) - async getAllSchema( - @Query() getAllSchemaDto: GetAllSchemaByPlatformDto, - @Res() res: Response, - @User() user: IUserRequestInterface - ): Promise { - const { ledgerId, pageSize, searchByText, pageNumber, sorting, sortByValue, schemaType } = getAllSchemaDto; - const schemaSearchCriteria: ISchemaSearchPayload = { - ledgerId, - pageNumber, - searchByText, - pageSize, - sortField: sorting, - sortBy: sortByValue, - schemaType - }; - const schemasResponse = await this.platformService.getAllSchema(schemaSearchCriteria, user); - const finalResponse: IResponse = { - statusCode: HttpStatus.OK, - message: ResponseMessages.schema.success.fetch, - data: schemasResponse - }; - return res.status(HttpStatus.OK).json(finalResponse); - } - -/** - * Retrieves all credential definitions available on the platform. - * - * @returns A list of credential definitions and their details. - */ - @Get('/platform/cred-defs') - @ApiTags('credential-definitions') - @ApiOperation({ - summary: 'Get all credential-definitions from platform.', - description: 'Retrieves all credential definitions available on the platform' - }) - @ApiQuery({ - name: 'sortField', - enum: CredDefSortFields, - required: false - }) - @ApiBearerAuth() - @UseGuards(AuthGuard('jwt')) - @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) - async getAllCredDefs( - @Query() getAllPlatformCredDefs: GetAllPlatformCredDefsDto, - @Res() res: Response, - @User() user: IUserRequestInterface - ): Promise { - const schemasResponse = await this.platformService.getAllPlatformCredDefs(getAllPlatformCredDefs, user); - const finalResponse: IResponse = { - statusCode: HttpStatus.OK, - message: ResponseMessages.credentialDefinition.success.fetch, - data: schemasResponse - }; - return res.status(HttpStatus.OK).json(finalResponse); - } + /** + * Retrieves all schemas available on the platform with optional filters and sorting. + * + * @param ledgerId The ID of the ledger. + * @param schemaType Type of schema to filter results. + * + * @returns A paginated list of schemas based on the provided criteria. + */ + @Get('/platform/schemas') + @ApiTags('schemas') + @ApiOperation({ + summary: 'Get all schemas from platform.', + description: 'Retrieves all schemas available on the platform' + }) + @ApiQuery({ + name: 'sortField', + enum: SortFields, + required: false + }) + @ApiQuery({ + name: 'schemaType', + enum: SchemaType, + required: false + }) + @ApiBearerAuth() + @UseGuards(AuthGuard('jwt')) + @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) + async getAllSchema( + @Query() getAllSchemaDto: GetAllSchemaByPlatformDto, + @Res() res: Response, + @User() user: IUserRequestInterface + ): Promise { + const { ledgerId, pageSize, searchByText, pageNumber, sorting, sortByValue, schemaType } = getAllSchemaDto; + const schemaSearchCriteria: ISchemaSearchPayload = { + ledgerId, + pageNumber, + searchByText, + pageSize, + sortField: sorting, + sortBy: sortByValue, + schemaType + }; + const schemasResponse = await this.platformService.getAllSchema(schemaSearchCriteria, user); + const finalResponse: IResponse = { + statusCode: HttpStatus.OK, + message: ResponseMessages.schema.success.fetch, + data: schemasResponse + }; + return res.status(HttpStatus.OK).json(finalResponse); + } - /** - * Retrieves all available ledgers from the platform. - * - * @returns A list of ledgers and their details. - */ - @Get('/platform/ledgers') - @ApiTags('ledgers') - @ApiOperation({ - summary: 'Get all ledgers from platform.', - description: 'Retrieves a list of all available ledgers on platform.' - }) - @ApiBearerAuth() - @UseGuards(AuthGuard('jwt')) - @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) - async getAllLedgers( - @Res() res: Response - ): Promise { - const networksResponse = await this.platformService.getAllLedgers(); + /** + * Retrieves all credential definitions available on the platform. + * + * @returns A list of credential definitions and their details. + */ + @Get('/platform/cred-defs') + @ApiTags('credential-definitions') + @ApiOperation({ + summary: 'Get all credential-definitions from platform.', + description: 'Retrieves all credential definitions available on the platform' + }) + @ApiQuery({ + name: 'sortField', + enum: CredDefSortFields, + required: false + }) + @ApiBearerAuth() + @UseGuards(AuthGuard('jwt')) + @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) + async getAllCredDefs( + @Query() getAllPlatformCredDefs: GetAllPlatformCredDefsDto, + @Res() res: Response, + @User() user: IUserRequestInterface + ): Promise { + const schemasResponse = await this.platformService.getAllPlatformCredDefs(getAllPlatformCredDefs, user); + const finalResponse: IResponse = { + statusCode: HttpStatus.OK, + message: ResponseMessages.credentialDefinition.success.fetch, + data: schemasResponse + }; + return res.status(HttpStatus.OK).json(finalResponse); + } - const finalResponse: IResponse = { - statusCode: HttpStatus.OK, - message: ResponseMessages.ledger.success.fetch, - data: networksResponse - }; - return res.status(HttpStatus.OK).json(finalResponse); - } + /** + * Retrieves all available ledgers from the platform. + * + * @returns A list of ledgers and their details. + */ + @Get('/platform/ledgers') + @ApiTags('ledgers') + @ApiOperation({ + summary: 'Get all ledgers from platform.', + description: 'Retrieves a list of all available ledgers on platform.' + }) + @ApiBearerAuth() + @UseGuards(AuthGuard('jwt')) + @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) + async getAllLedgers(@Res() res: Response): Promise { + const networksResponse = await this.platformService.getAllLedgers(); - /** - * Retrieves the network URL associated with a specific ledger namespace. - * - * @param indyNamespace The namespace of the ledger. - * @returns The network URL for the specified ledger. - */ - @Get('/platform/network/url/:indyNamespace') - @ApiTags('ledgers') - @ApiOperation({ - summary: 'Get network url from platform.', - description: 'Retrieves the network URL for a specified ledger namespace.' - }) - @ApiBearerAuth() - @UseGuards(AuthGuard('jwt')) - @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) - async getNetwrkUrl( - @Param('indyNamespace', TrimStringParamPipe) indyNamespace: string, - @Res() res: Response - ): Promise { - if (!indyNamespace) { - throw new BadRequestException(ResponseMessages.ledger.error.indyNamespaceisRequired); - } - const networksResponse = await this.platformService.getNetworkUrl(indyNamespace); + const finalResponse: IResponse = { + statusCode: HttpStatus.OK, + message: ResponseMessages.ledger.success.fetch, + data: networksResponse + }; + return res.status(HttpStatus.OK).json(finalResponse); + } - const finalResponse: IResponse = { - statusCode: HttpStatus.OK, - message: ResponseMessages.ledger.success.fetchNetworkUrl, - data: networksResponse - }; - return res.status(HttpStatus.OK).json(finalResponse); + /** + * Retrieves the network URL associated with a specific ledger namespace. + * + * @param indyNamespace The namespace of the ledger. + * @returns The network URL for the specified ledger. + */ + @Get('/platform/network/url/:indyNamespace') + @ApiTags('ledgers') + @ApiOperation({ + summary: 'Get network url from platform.', + description: 'Retrieves the network URL for a specified ledger namespace.' + }) + @ApiBearerAuth() + @UseGuards(AuthGuard('jwt')) + @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) + async getNetwrkUrl( + @Param('indyNamespace', TrimStringParamPipe) indyNamespace: string, + @Res() res: Response + ): Promise { + if (!indyNamespace) { + throw new BadRequestException(ResponseMessages.ledger.error.indyNamespaceisRequired); } + const networksResponse = await this.platformService.getNetworkUrl(indyNamespace); - @Get('/invitation/:referenceId') - @ApiOperation({ - summary: `Get shortening url by referenceId`, - description: `Get shortening url by referenceId` - }) - @ApiExcludeEndpoint() - @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) - async getShorteningUrlById( - @Param('referenceId') referenceId: string, - @Res() res: Response - ): Promise { - const shorteningUrlDetails = await this.platformService.getShorteningUrlById(referenceId); - const finalResponse: IResponse = { - statusCode: HttpStatus.OK, - message: ResponseMessages.shorteningUrl.success.getshorteningUrl, - data: shorteningUrlDetails - }; - return res.status(HttpStatus.OK).json(finalResponse); - } + const finalResponse: IResponse = { + statusCode: HttpStatus.OK, + message: ResponseMessages.ledger.success.fetchNetworkUrl, + data: networksResponse + }; + return res.status(HttpStatus.OK).json(finalResponse); + } - @Get('/invitation/qr-code/:referenceId') - @ApiOperation({ - summary: `Get QR by referenceId`, - description: `Get QR by referenceId` - }) - @ApiExcludeEndpoint() - @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) - async getQrCode( - @Param('referenceId') referenceId: string, - @Res() res: Response - ): Promise { - const url = `${process.env.API_GATEWAY_PROTOCOL}://${process.env.API_ENDPOINT}/invitation/${referenceId}`; - // Generate QR code as a buffer - const qrCodeBuffer = await QRCode.toBuffer(url); + @Get('/invitation/:referenceId') + @ApiOperation({ + summary: `Get shortening url by referenceId`, + description: `Get shortening url by referenceId` + }) + @ApiExcludeEndpoint() + @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) + async getShorteningUrlById(@Param('referenceId') referenceId: string, @Res() res: Response): Promise { + const shorteningUrlDetails = await this.platformService.getShorteningUrlById(referenceId); + const finalResponse: IResponse = { + statusCode: HttpStatus.OK, + message: ResponseMessages.shorteningUrl.success.getshorteningUrl, + data: shorteningUrlDetails + }; + return res.status(HttpStatus.OK).json(finalResponse); + } - // Set response type to image/png - res.type('image/png'); + @Get('/invitation/qr-code/:referenceId') + @ApiOperation({ + summary: `Get QR by referenceId`, + description: `Get QR by referenceId` + }) + @ApiExcludeEndpoint() + @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) + async getQrCode(@Param('referenceId') referenceId: string, @Res() res: Response): Promise { + const url = `${process.env.API_GATEWAY_PROTOCOL}://${process.env.API_ENDPOINT}/invitation/${referenceId}`; + // Generate QR code as a buffer + const qrCodeBuffer = await QRCode.toBuffer(url); - // Send the QR code buffer as the response - res.send(qrCodeBuffer); - } + // Set response type to image/png + res.type('image/png'); + + // Send the QR code buffer as the response + res.send(qrCodeBuffer); + } } diff --git a/apps/api-gateway/src/platform/platform.interface.ts b/apps/api-gateway/src/platform/platform.interface.ts index 7679b3ad0..102e1ce9b 100644 --- a/apps/api-gateway/src/platform/platform.interface.ts +++ b/apps/api-gateway/src/platform/platform.interface.ts @@ -1,33 +1,29 @@ +import { SortValue } from '@credebl/common'; import { credentialSortBy } from '../enum'; -export enum SortValue { - ASC = 'ASC', - DESC = 'DESC' -} export interface IConnectedHolderList { - orgId: string; - itemsPerPage?: number; - page?: number; - searchText?: string; - connectionSortBy?: string; - sortValue?: string; + orgId: string; + itemsPerPage?: number; + page?: number; + searchText?: string; + connectionSortBy?: string; + sortValue?: string; } - export interface CredentialListPayload { - connectionId: string; - itemsPerPage: number; - page: number; - searchText: string; - sortValue: SortValue; - credentialSortBy: string; + connectionId: string; + itemsPerPage: number; + page: number; + searchText: string; + sortValue: SortValue; + credentialSortBy: string; } export interface GetCredentialListByConnectionId { - connectionId: string, - items_per_page: number, - page: number, - search_text: string, - sortValue: SortValue, - sortBy: credentialSortBy -} \ No newline at end of file + connectionId: string; + items_per_page: number; + page: number; + search_text: string; + sortValue: SortValue; + sortBy: credentialSortBy; +} diff --git a/apps/api-gateway/src/platform/platform.module.ts b/apps/api-gateway/src/platform/platform.module.ts index d169ee4cf..d260f7b5a 100644 --- a/apps/api-gateway/src/platform/platform.module.ts +++ b/apps/api-gateway/src/platform/platform.module.ts @@ -1,11 +1,12 @@ -import { Module } from '@nestjs/common'; +import { DynamicModule, Module, Provider } from '@nestjs/common'; import { PlatformController } from './platform.controller'; import { PlatformService } from './platform.service'; import { ClientsModule, Transport } from '@nestjs/microservices'; import { ConfigModule } from '@nestjs/config'; -import { getNatsOptions } from '@credebl/common/nats.config'; -import { CommonConstants } from '@credebl/common/common.constant'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { getNatsOptions } from '@credebl/common'; +import { CommonConstants } from '@credebl/common'; +import { NATSClient } from '@credebl/common'; + @Module({ imports: [ ConfigModule.forRoot(), @@ -20,4 +21,29 @@ import { NATSClient } from '@credebl/common/NATSClient'; controllers: [PlatformController], providers: [PlatformService, NATSClient] }) -export class PlatformModule {} +export class PlatformModule { + static register( + overrides: Provider[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + controllerOverrides: any[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + importedModules: any[] = [] + ): DynamicModule { + return { + module: PlatformModule, + imports: [ + ConfigModule.forRoot(), + ClientsModule.register([ + { + name: 'NATS_CLIENT', + transport: Transport.NATS, + options: getNatsOptions(CommonConstants.PLATFORM_SERVICE, process.env.API_GATEWAY_NKEY_SEED) + } + ]), + ...importedModules + ], + controllers: controllerOverrides.length ? controllerOverrides : [PlatformController], + providers: [PlatformService, ...overrides] + }; + } +} diff --git a/apps/api-gateway/src/platform/platform.service.ts b/apps/api-gateway/src/platform/platform.service.ts index 36838b02d..4a29f55de 100644 --- a/apps/api-gateway/src/platform/platform.service.ts +++ b/apps/api-gateway/src/platform/platform.service.ts @@ -1,45 +1,45 @@ import { Injectable, Inject } from '@nestjs/common'; import { ClientProxy } from '@nestjs/microservices'; -import { BaseService } from '../../../../libs/service/base.service'; import { ILedgers, ISchemaSearchPayload } from '../interfaces/ISchemaSearch.interface'; import { IUserRequestInterface } from '../interfaces/IUserRequestInterface'; -import { INetworkUrl, ISchemaDetails } from '@credebl/common/interfaces/schema.interface'; +import { INetworkUrl, ISchemaDetails } from '@credebl/common'; import { GetAllPlatformCredDefsDto } from '../credential-definition/dto/get-all-platform-cred-defs.dto'; -import { IPlatformCredDefsData } from '@credebl/common/interfaces/cred-def.interface'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { IPlatformCredDefsData, BaseService } from '@credebl/common'; +import { NATSClient } from '@credebl/common'; @Injectable() export class PlatformService extends BaseService { - constructor( - @Inject('NATS_CLIENT') private readonly platformServiceProxy: ClientProxy, - private readonly natsClient : NATSClient - ) { - super('PlatformService'); - } + constructor( + @Inject('NATS_CLIENT') private readonly platformServiceProxy: ClientProxy, + private readonly natsClient: NATSClient + ) { + super('PlatformService'); + } - async getAllSchema(schemaSearchCriteria: ISchemaSearchPayload, user: IUserRequestInterface): Promise { - const schemaSearch = { schemaSearchCriteria, user }; - return this.natsClient.sendNatsMessage(this.platformServiceProxy, 'get-all-schemas', schemaSearch); + async getAllSchema(schemaSearchCriteria: ISchemaSearchPayload, user: IUserRequestInterface): Promise { + const schemaSearch = { schemaSearchCriteria, user }; + return this.natsClient.sendNatsMessage(this.platformServiceProxy, 'get-all-schemas', schemaSearch); + } - } + async getAllPlatformCredDefs( + getAllPlatformCredDefs: GetAllPlatformCredDefsDto, + user: IUserRequestInterface + ): Promise { + const credDefs = { ...getAllPlatformCredDefs, user }; + return this.natsClient.sendNatsMessage(this.platformServiceProxy, 'get-all-platform-cred-defs', credDefs); + } - async getAllPlatformCredDefs(getAllPlatformCredDefs: GetAllPlatformCredDefsDto, user: IUserRequestInterface): Promise { - const credDefs = { ...getAllPlatformCredDefs, user }; - return this.natsClient.sendNatsMessage(this.platformServiceProxy, 'get-all-platform-cred-defs', credDefs); - } + async getAllLedgers(): Promise { + const payload = {}; + return this.natsClient.sendNatsMessage(this.platformServiceProxy, 'get-all-ledgers', payload); + } - async getAllLedgers(): Promise { - const payload = {}; - return this.natsClient.sendNatsMessage(this.platformServiceProxy, 'get-all-ledgers', payload); - } + async getNetworkUrl(indyNamespace: string): Promise { + return this.natsClient.sendNatsMessage(this.platformServiceProxy, 'get-network-url', indyNamespace); + } - async getNetworkUrl(indyNamespace: string): Promise { - return this.natsClient.sendNatsMessage(this.platformServiceProxy, 'get-network-url', indyNamespace); - } - - async getShorteningUrlById(referenceId: string): Promise { - - // NATS call - return this.natsClient.sendNatsMessage(this.platformServiceProxy, 'get-shortening-url', referenceId); - } -} \ No newline at end of file + async getShorteningUrlById(referenceId: string): Promise { + // NATS call + return this.natsClient.sendNatsMessage(this.platformServiceProxy, 'get-shortening-url', referenceId); + } +} diff --git a/apps/api-gateway/src/revocation/index.ts b/apps/api-gateway/src/revocation/index.ts new file mode 100644 index 000000000..c34e64fbb --- /dev/null +++ b/apps/api-gateway/src/revocation/index.ts @@ -0,0 +1,3 @@ +export * from './revocation.controller'; +export * from './revocation.module'; +export * from './revocation.service'; diff --git a/apps/api-gateway/src/revocation/revocation.module.ts b/apps/api-gateway/src/revocation/revocation.module.ts index 77558663b..4faafc2e0 100644 --- a/apps/api-gateway/src/revocation/revocation.module.ts +++ b/apps/api-gateway/src/revocation/revocation.module.ts @@ -1,10 +1,10 @@ -import { Module } from '@nestjs/common'; +import { DynamicModule, Module, Provider } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import { ClientsModule } from '@nestjs/microservices'; import { RevocationService } from './revocation.service'; import { RevocationController } from './revocation.controller'; -import { commonNatsOptions } from 'libs/service/nats.options'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { commonNatsOptions } from '@credebl/common'; +import { NATSClient } from '@credebl/common'; @Module({ imports: [ @@ -19,4 +19,28 @@ import { NATSClient } from '@credebl/common/NATSClient'; controllers: [RevocationController], providers: [RevocationService, NATSClient] }) -export class RevocationModule {} +export class RevocationModule { + static register( + overrides: Provider[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + controllerOverrides: any[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + importedModules: any[] = [] + ): DynamicModule { + return { + module: RevocationModule, + imports: [ + ConfigModule.forRoot(), + ClientsModule.register([ + { + name: 'NATS_CLIENT', + ...commonNatsOptions('REVOCATION_SERVICE:REQUESTER') + } + ]), + ...importedModules + ], + controllers: controllerOverrides.length ? controllerOverrides : [RevocationController], + providers: [RevocationService, ...overrides] + }; + } +} diff --git a/apps/api-gateway/src/revocation/revocation.service.ts b/apps/api-gateway/src/revocation/revocation.service.ts index 706f2408a..1a7b7ac88 100644 --- a/apps/api-gateway/src/revocation/revocation.service.ts +++ b/apps/api-gateway/src/revocation/revocation.service.ts @@ -5,8 +5,8 @@ import { Injectable, Inject } from '@nestjs/common'; import { ClientProxy } from '@nestjs/microservices'; import { CreateRevocationRegistryDto } from '../dtos/create-revocation-registry.dto'; import { UpdateRevocationRegistryUriDto } from '../dtos/update-revocation-registry.dto'; -import { BaseService } from 'libs/service/base.service'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { BaseService } from '@credebl/common'; +import { NATSClient } from '@credebl/common'; @Injectable() export class RevocationService extends BaseService { @@ -40,7 +40,7 @@ export class RevocationService extends BaseService { const payload = { revocationId, user }; return this.natsClient.sendNats(this.revocationServiceProxy, 'publish-revocation-registry', payload); } - // eslint-disable-next-line @typescript-eslint/explicit-function-return-type + // eslint-disable-next-line @typescript-eslint/explicit-function-return-type getRevocationRegistry(rev_reg_id: string, user: any) { this.logger.log('**** getRevocationRegistry called'); const payload = { rev_reg_id, user }; diff --git a/apps/api-gateway/src/schema/dtos/get-all-schema.dto.ts b/apps/api-gateway/src/schema/dtos/get-all-schema.dto.ts index 0e77da8cd..20ca0e3a9 100644 --- a/apps/api-gateway/src/schema/dtos/get-all-schema.dto.ts +++ b/apps/api-gateway/src/schema/dtos/get-all-schema.dto.ts @@ -3,133 +3,129 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { Transform, Type } from 'class-transformer'; import { IsEnum, IsOptional, IsUUID, Min } from 'class-validator'; -import { toNumber, trim } from '@credebl/common/cast.helper'; -import { CredDefSortFields, SchemaType, SortFields, SortValue } from '@credebl/enum/enum'; +import { toNumber, trim } from '@credebl/common'; +import { CredDefSortFields, SchemaType, SortFields, SortValue } from '@credebl/common'; export class GetAllSchemaDto { - @ApiProperty({ required: false }) - @IsOptional() - @Transform(({ value }) => trim(value)) - @Type(() => String) - searchByText: string = ''; - - @ApiProperty({ required: false, default: 1 }) - @IsOptional() - @Transform(({ value }) => toNumber(value)) - @Min(1, { message: 'Page number must be greater than 0' }) - pageNumber: number = 1; - - @ApiProperty({ required: false, default: 10 }) - @IsOptional() - @Transform(({ value }) => toNumber(value)) - @Min(1, { message: 'Page size must be greater than 0' }) - pageSize: number = 10; - - @ApiProperty({ - required: false - }) - @Transform(({ value }) => trim(value)) - @IsOptional() - @IsEnum(SortFields) - sortField: string = SortFields.CREATED_DATE_TIME; - - @ApiProperty({ - enum: [SortValue.DESC, SortValue.ASC], - required: false - }) - @Transform(({ value }) => trim(value)) - @IsOptional() - @IsEnum(SortValue) - sortBy: string = SortValue.DESC; + @ApiProperty({ required: false }) + @IsOptional() + @Transform(({ value }) => trim(value)) + @Type(() => String) + searchByText: string = ''; + + @ApiProperty({ required: false, default: 1 }) + @IsOptional() + @Transform(({ value }) => toNumber(value)) + @Min(1, { message: 'Page number must be greater than 0' }) + pageNumber: number = 1; + + @ApiProperty({ required: false, default: 10 }) + @IsOptional() + @Transform(({ value }) => toNumber(value)) + @Min(1, { message: 'Page size must be greater than 0' }) + pageSize: number = 10; + + @ApiProperty({ + required: false + }) + @Transform(({ value }) => trim(value)) + @IsOptional() + @IsEnum(SortFields) + sortField: string = SortFields.CREATED_DATE_TIME; + + @ApiProperty({ + enum: [SortValue.DESC, SortValue.ASC], + required: false + }) + @Transform(({ value }) => trim(value)) + @IsOptional() + @IsEnum(SortValue) + sortBy: string = SortValue.DESC; } export class GetCredentialDefinitionBySchemaIdDto { - - @ApiProperty({ required: false, default: 1 }) - @IsOptional() - @Transform(({ value }) => toNumber(value)) - @Min(1, { message: 'Page number must be greater than 0' }) - pageNumber: number = 1; - - @ApiProperty({ required: false, default: 10 }) - @IsOptional() - @Transform(({ value }) => toNumber(value)) - @Min(1, { message: 'Page size must be greater than 0' }) - pageSize: number = 10; - - @ApiProperty({ required: false }) - @IsOptional() - @Type(() => String) - searchByText: string = ''; - - @ApiProperty({ - required: false - }) - @Transform(({ value }) => trim(value)) - @IsOptional() - @IsEnum(CredDefSortFields) - sortField: string = SortFields.CREATED_DATE_TIME; - - @ApiProperty({ - enum: [SortValue.DESC, SortValue.ASC], - required: false - }) - @Transform(({ value }) => trim(value)) - @IsOptional() - @IsEnum(SortValue) - sortBy: string = SortValue.DESC; - - schemaId: string; - - orgId: string; + @ApiProperty({ required: false, default: 1 }) + @IsOptional() + @Transform(({ value }) => toNumber(value)) + @Min(1, { message: 'Page number must be greater than 0' }) + pageNumber: number = 1; + + @ApiProperty({ required: false, default: 10 }) + @IsOptional() + @Transform(({ value }) => toNumber(value)) + @Min(1, { message: 'Page size must be greater than 0' }) + pageSize: number = 10; + + @ApiProperty({ required: false }) + @IsOptional() + @Type(() => String) + searchByText: string = ''; + + @ApiProperty({ + required: false + }) + @Transform(({ value }) => trim(value)) + @IsOptional() + @IsEnum(CredDefSortFields) + sortField: string = SortFields.CREATED_DATE_TIME; + + @ApiProperty({ + enum: [SortValue.DESC, SortValue.ASC], + required: false + }) + @Transform(({ value }) => trim(value)) + @IsOptional() + @IsEnum(SortValue) + sortBy: string = SortValue.DESC; + + schemaId: string; + + orgId: string; } - export class GetAllSchemaByPlatformDto { - - @ApiProperty({ example: '1a7eac11-ff05-40d7-8351-4d7467687cad'}) - @ApiPropertyOptional() - @Transform(({ value }) => ('string' === typeof value && '' === value.trim() ? undefined : value.trim())) - @IsOptional() - @IsUUID('4', { message: 'Invalid format of ledgerId' }) - ledgerId?: string; - - @ApiProperty({ required: false, default: 1 }) - @IsOptional() - @Transform(({ value }) => toNumber(value)) - @Min(1, { message: 'Page number must be greater than 0' }) - pageNumber: number = 1; - - @ApiProperty({ required: false }) - @IsOptional() - @Type(() => String) - searchByText: string = ''; - - @ApiProperty({ required: false, default: 10 }) - @IsOptional() - @Transform(({ value }) => toNumber(value)) - @Min(1, { message: 'Page size must be greater than 0' }) - pageSize: number = 10; - - @ApiProperty({ - required: false - }) - @Transform(({ value }) => trim(value)) - @IsOptional() - @IsEnum(SortFields) - sorting: string = SortFields.CREATED_DATE_TIME; - - @ApiProperty({ required: false }) - @IsOptional() - sortByValue: string = SortValue.DESC; - - @ApiProperty({ - type: SchemaType, - required: false - }) - @Transform(({ value }) => trim(value)) - @IsOptional() - @IsEnum(SchemaType) - schemaType: SchemaType; - -} \ No newline at end of file + @ApiProperty({ example: '1a7eac11-ff05-40d7-8351-4d7467687cad' }) + @ApiPropertyOptional() + @Transform(({ value }) => ('string' === typeof value && '' === value.trim() ? undefined : value.trim())) + @IsOptional() + @IsUUID('4', { message: 'Invalid format of ledgerId' }) + ledgerId?: string; + + @ApiProperty({ required: false, default: 1 }) + @IsOptional() + @Transform(({ value }) => toNumber(value)) + @Min(1, { message: 'Page number must be greater than 0' }) + pageNumber: number = 1; + + @ApiProperty({ required: false }) + @IsOptional() + @Type(() => String) + searchByText: string = ''; + + @ApiProperty({ required: false, default: 10 }) + @IsOptional() + @Transform(({ value }) => toNumber(value)) + @Min(1, { message: 'Page size must be greater than 0' }) + pageSize: number = 10; + + @ApiProperty({ + required: false + }) + @Transform(({ value }) => trim(value)) + @IsOptional() + @IsEnum(SortFields) + sorting: string = SortFields.CREATED_DATE_TIME; + + @ApiProperty({ required: false }) + @IsOptional() + sortByValue: string = SortValue.DESC; + + @ApiProperty({ + type: SchemaType, + required: false + }) + @Transform(({ value }) => trim(value)) + @IsOptional() + @IsEnum(SchemaType) + schemaType: SchemaType; +} diff --git a/apps/api-gateway/src/schema/dtos/index.ts b/apps/api-gateway/src/schema/dtos/index.ts new file mode 100644 index 000000000..53cec7d97 --- /dev/null +++ b/apps/api-gateway/src/schema/dtos/index.ts @@ -0,0 +1,3 @@ +export * from './create-schema.dto'; +export * from './get-all-schema.dto'; +export * from './update-schema-dto'; diff --git a/apps/api-gateway/src/schema/index.ts b/apps/api-gateway/src/schema/index.ts new file mode 100644 index 000000000..a6031e9a0 --- /dev/null +++ b/apps/api-gateway/src/schema/index.ts @@ -0,0 +1,5 @@ +export * from './schema.controller'; +export * from './schema.module'; +export * from './schema.service'; +// export * from './dtos'; +// export * from './interfaces'; diff --git a/apps/api-gateway/src/schema/interfaces/index.ts b/apps/api-gateway/src/schema/interfaces/index.ts index a0dfce8c2..b2fb97198 100644 --- a/apps/api-gateway/src/schema/interfaces/index.ts +++ b/apps/api-gateway/src/schema/interfaces/index.ts @@ -1,36 +1,10 @@ -import { UserRoleOrgPermsDto } from '../../dtos/user-role-org-perms.dto'; +import { IUserRequestInterface } from '../../interfaces/IUserRequestInterface'; +import { ISelectedOrgInterface } from '../../user/interfaces'; -export interface IUserRequestInterface { - id: string; - userId: string; - email: string; - orgId: string; - agentEndPoint?: string; - apiKey?: string; - tenantId?: string; - tenantName?: string; - tenantOrgId?: string; - userRoleOrgPermissions?: UserRoleOrgPermsDto[]; - orgName?: string; +export interface IUserRequestSelectedOrgsInterface extends IUserRequestInterface { selectedOrg: ISelectedOrgInterface; } -export interface ISelectedOrgInterface { - id: string; - userId: string; - orgRoleId: string; - orgId: string; - orgRole: object; - organisation: object; -} - -export interface IOrganizationInterface { - name: string; - description: string; - org_agents: IOrgAgentInterface[] - -} - export interface IOrgAgentInterface { orgDid: string; verkey: string; diff --git a/apps/api-gateway/src/schema/schema.controller.spec.ts b/apps/api-gateway/src/schema/schema.controller.spec.ts deleted file mode 100644 index 6e0d602bc..000000000 --- a/apps/api-gateway/src/schema/schema.controller.spec.ts +++ /dev/null @@ -1,222 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; - -import { Any } from 'typeorm'; -import { CreateSchemaDto } from '../dtos/create-schema.dto'; -import { SchemaController } from './schema.controller'; -import { SchemaService } from './schema.service'; -import { plainToClassFromExist } from 'class-transformer'; -import { validate } from 'class-validator'; -import { CredDefSortBy, SortValue } from '../enum'; - -describe('schemaController Test Cases', () => { - let controller: SchemaController; - const mockSchemaService = { - createSchema: jest.fn(() => ({})), - getSchemas: jest.fn(() => ({})), - getSchemaByOrg: jest.fn(() => ({})), - getSchemaBySchemaId:jest.fn(() => ({})), - getCredDefBySchemaId: jest.fn(() => ({})) - }; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - controllers: [SchemaController], - providers: [SchemaService] - }) - .overrideProvider(SchemaService) - .useValue(mockSchemaService) - .compile(); - controller = module.get( - SchemaController - ); - }); - /////////////////////--------Create Schema -------------------////////////////////// - describe('createSchema', () => { - const user: any = {}; - - it('should return an expected schema', async () => { - const createSchemaDto: CreateSchemaDto = new CreateSchemaDto; - const result = await controller.createSchema( - createSchemaDto, - user - ); - expect(result).toEqual({}); - }); - /////////////// - - it('should check returned credentialdefinition is not to be null', async () => { - const createSchemaDto: CreateSchemaDto = new CreateSchemaDto; - const result = await controller.createSchema( - createSchemaDto, - user - ); - expect(result).not.toBeNull(); - }); - - //////////// - it('Should throw error when schema version is not string', async () => { - const schema_version_dto = { schema_version: 1 }; - const schemaVersionResult = plainToClassFromExist( - CreateSchemaDto, - schema_version_dto - ); - const errors = await validate(schemaVersionResult); - const result = await errors[0].constraints.isString; - expect(result).toEqual('schema version must be a string'); - }); - - - it('Should throw error when schema name is not a string', async () => { - const schemaName = { schema_name: 234 }; - const schemaNameResult = plainToClassFromExist( - CreateSchemaDto, - schemaName - ); - const errors = await validate(schemaNameResult); - const result = await errors[1].constraints.isString; - expect(result).toEqual('schema name must be a string'); - }); - - ////////////////////// - - it('should throw error when schema version is null', async () => { - const schema_version_dto = { schema_version: '' }; - const schemaNameResult = plainToClassFromExist( - CreateSchemaDto, - schema_version_dto - ); - const errors = await validate(schemaNameResult); - const result = await errors[0].constraints.isNotEmpty; - expect(result).toEqual('please provide valid schema version'); - }); - - it('should throw error when schema name is null', async () => { - const schema_name_dto = { schema_name: '' }; - const schemaNameResult = plainToClassFromExist( - CreateSchemaDto, - schema_name_dto - ); - const errors = await validate(schemaNameResult); - const result = await errors[1].constraints.isNotEmpty; - expect(result).toEqual('please provide valid schema name'); - }); - - ////////////////////// - - it('should throw error when attributes are not in array', async () => { - const attribute_dto = {attributes:'testAcb'}; - const schemaattributeResult = plainToClassFromExist( - CreateSchemaDto, - attribute_dto - ); - const errors = await validate(schemaattributeResult); - const result = await errors[2].constraints.isArray; - expect(result).toEqual('attributes must be an array'); - }); - - it('should throw error when elements of attributes are not a string', async () => { - const attribute_dto = {attributes: true}; - const schemaattributeResult = plainToClassFromExist( - CreateSchemaDto, - attribute_dto - ); - const errors = await validate(schemaattributeResult); - const result = await errors[2].constraints.isString; - expect(result).toEqual('each value in attributes must be a string'); - }); - - it('should throw error when attributes are null', async () => { - const attribute_dto = {attributes:''}; - const schemaattributeResult = plainToClassFromExist( - CreateSchemaDto, - attribute_dto - ); - const errors = await validate(schemaattributeResult); - const result = await errors[2].constraints.isNotEmpty; - expect(result).toEqual('please provide valid attributes'); - }); - - }); - -///////////////////// --- get schema by ledger Id ------------/////////// - - - describe('getSchemas', () => { - const user: any = {}; - const page = 1; - const search_text = 'test search'; - const items_per_page = 1; - const schemaSortBy = 'id'; - const sortValue = 'DESC'; - it('should return an expected schemas by ledger Id', async () => { - const result = await controller.getSchemaWithFilters( - page, - search_text, - items_per_page, - schemaSortBy, - sortValue, - user - ); - expect(result).toEqual({}); - }); - - }); - -/////////////////////////----- get schemas with organization id ---------- - describe('getSchemasByOrgId', () => { - const user: any = {}; - const page = 1; - const search_text = 'test search'; - const items_per_page = 1; - const sortValue = 1; - const id = 1; - const schemaSortBy = 'DESC'; - it('should return an expected schemas by org Id', async () => { - const result = await controller.getSchemasByOrgId( - page, - search_text, - items_per_page, - sortValue, - schemaSortBy, - id - ); - expect(result).toEqual({}); - }); - }); - -/////////////////////------- get schemas with schema ledger Id --------------- - - describe('getSchemaBySchemaId', () => { - const user: any = {}; - const id = '1'; - it('should return an expected schemas by org Id', async () => { - const result = await controller.getSchemaById( - user, - id - ); - expect(result).toEqual({}); - }); - }); - -/////////--------- get cred defs with schema Id ---/// - describe('getCredDefBySchemaId', () => { - const user: any = {}; - const id = 1; - const page = 1; - const search_text = 'test'; - const items_per_page = 1; - const orgId = 2; - const credDefSortBy = CredDefSortBy.id; - const sortValue = SortValue.DESC; - const supportRevocation = 'all'; - it('should return expected cred defs by schemaId', async () => { - const result = await controller.getCredDefBySchemaId( - page, search_text, items_per_page, orgId, credDefSortBy, sortValue, supportRevocation, id, user - ); - expect(result).toEqual({}); - }); - - }); - - -}); \ No newline at end of file diff --git a/apps/api-gateway/src/schema/schema.controller.ts b/apps/api-gateway/src/schema/schema.controller.ts index 93682107f..a0463b87f 100644 --- a/apps/api-gateway/src/schema/schema.controller.ts +++ b/apps/api-gateway/src/schema/schema.controller.ts @@ -1,26 +1,50 @@ -import { Controller, Logger, Post, Body, HttpStatus, UseGuards, Get, Query, BadRequestException, Res, UseFilters, Param, ParseUUIDPipe, Put } from '@nestjs/common'; +import { + Controller, + Logger, + Post, + Body, + HttpStatus, + UseGuards, + Get, + Query, + BadRequestException, + Res, + UseFilters, + Param, + ParseUUIDPipe, + Put +} from '@nestjs/common'; /* eslint-disable @typescript-eslint/no-unused-vars */ /* eslint-disable camelcase */ -import { ApiOperation, ApiResponse, ApiTags, ApiBearerAuth, ApiForbiddenResponse, ApiUnauthorizedResponse, ApiQuery, ApiExcludeEndpoint } from '@nestjs/swagger'; +import { + ApiOperation, + ApiResponse, + ApiTags, + ApiBearerAuth, + ApiForbiddenResponse, + ApiUnauthorizedResponse, + ApiQuery, + ApiExcludeEndpoint +} from '@nestjs/swagger'; import { SchemaService } from './schema.service'; import { AuthGuard } from '@nestjs/passport'; import { ApiResponseDto } from '../dtos/apiResponse.dto'; import { UnauthorizedErrorDto } from '../dtos/unauthorized-error.dto'; import { ForbiddenErrorDto } from '../dtos/forbidden-error.dto'; -import { IResponse } from '@credebl/common/interfaces/response.interface'; +import { IResponse } from '@credebl/common'; import { Response } from 'express'; import { User } from '../authz/decorators/user.decorator'; import { ISchemaSearchPayload } from '../interfaces/ISchemaSearch.interface'; -import { ResponseMessages } from '@credebl/common/response-messages'; +import { ResponseMessages } from '@credebl/common'; import { GetAllSchemaDto, GetCredentialDefinitionBySchemaIdDto } from './dtos/get-all-schema.dto'; -import { OrgRoles } from 'libs/org-roles/enums'; +import { OrgRoles } from '@credebl/common'; import { Roles } from '../authz/decorators/roles.decorator'; -import { IUserRequestInterface } from './interfaces'; +import { IUserRequestSelectedOrgsInterface } from './interfaces'; import { OrgRolesGuard } from '../authz/guards/org-roles.guard'; import { GenericSchemaDTO } from '../dtos/create-schema.dto'; -import { CustomExceptionFilter } from 'apps/api-gateway/common/exception-handler'; -import { CredDefSortFields, SortFields } from '@credebl/enum/enum'; -import { TrimStringParamPipe } from '@credebl/common/cast.helper'; +import { CustomExceptionFilter } from '../common'; +import { CredDefSortFields, SortFields } from '@credebl/common'; +import { TrimStringParamPipe } from '@credebl/common'; import { UpdateSchemaDto } from './dtos/update-schema-dto'; @UseFilters(CustomExceptionFilter) @@ -30,11 +54,9 @@ import { UpdateSchemaDto } from './dtos/update-schema-dto'; @ApiUnauthorizedResponse({ status: HttpStatus.UNAUTHORIZED, description: 'Unauthorized', type: UnauthorizedErrorDto }) @ApiForbiddenResponse({ status: HttpStatus.FORBIDDEN, description: 'Forbidden', type: ForbiddenErrorDto }) export class SchemaController { - constructor(private readonly appService: SchemaService - ) { } + constructor(private readonly appService: SchemaService) {} private readonly logger = new Logger('SchemaController'); - /** * Retrieves schema information from the ledger using its schema ID. * @@ -52,14 +74,13 @@ export class SchemaController { @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) async getSchemaById( @Res() res: Response, - @Param('orgId') orgId: string, + @Param('orgId') orgId: string, @Param('schemaId', TrimStringParamPipe) schemaId: string ): Promise { - if (!schemaId) { throw new BadRequestException(ResponseMessages.schema.error.invalidSchemaId); } - + const schemaDetails = await this.appService.getSchemaById(schemaId, orgId); const finalResponse: IResponse = { statusCode: HttpStatus.OK, @@ -69,14 +90,13 @@ export class SchemaController { return res.status(HttpStatus.OK).json(finalResponse); } - /** * Retrieves a list of credential definitions associated with a given schema ID. - * + * * @param orgId The organization ID. * @param schemaId The unique schema ID. * @param sortField The field by which to sort the results (optional). - * + * * @returns A list of credential definitions filtered by schema ID. */ @Get('/:orgId/schemas/:schemaId/cred-defs') @@ -93,12 +113,20 @@ export class SchemaController { @Roles(OrgRoles.OWNER, OrgRoles.ADMIN, OrgRoles.ISSUER, OrgRoles.VERIFIER, OrgRoles.MEMBER) @UseGuards(AuthGuard('jwt'), OrgRolesGuard) async getcredDeffListBySchemaId( - @Param('orgId', new ParseUUIDPipe({exceptionFactory: (): Error => { throw new BadRequestException(ResponseMessages.organisation.error.invalidOrgId); }})) orgId: string, + @Param( + 'orgId', + new ParseUUIDPipe({ + exceptionFactory: (): Error => { + throw new BadRequestException(ResponseMessages.organisation.error.invalidOrgId); + } + }) + ) + orgId: string, @Param('schemaId', TrimStringParamPipe) schemaId: string, @Query() getCredentialDefinitionBySchemaIdDto: GetCredentialDefinitionBySchemaIdDto, @Res() res: Response, - @User() user: IUserRequestInterface): Promise { - + @User() user: IUserRequestSelectedOrgsInterface + ): Promise { if (!schemaId) { throw new BadRequestException(ResponseMessages.schema.error.invalidSchemaId); } @@ -106,21 +134,24 @@ export class SchemaController { getCredentialDefinitionBySchemaIdDto.schemaId = schemaId; getCredentialDefinitionBySchemaIdDto.orgId = orgId; - const credentialDefinitionList = await this.appService.getcredDefListBySchemaId(getCredentialDefinitionBySchemaIdDto, user); + const credentialDefinitionList = await this.appService.getcredDefListBySchemaId( + getCredentialDefinitionBySchemaIdDto, + user + ); const finalResponse: IResponse = { statusCode: HttpStatus.OK, message: ResponseMessages.schema.success.fetch, data: credentialDefinitionList }; - + return res.status(HttpStatus.OK).json(finalResponse); } /** * Retrieves a list of schemas associated with a given organization ID. - * + * * @param orgId The organization ID. - * + * * @returns A list of schemas filtered by organization ID. */ @Get('/:orgId/schemas') @@ -138,11 +169,18 @@ export class SchemaController { @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) async getSchemas( @Query() getAllSchemaDto: GetAllSchemaDto, - @Param('orgId', new ParseUUIDPipe({exceptionFactory: (): Error => { throw new BadRequestException(ResponseMessages.organisation.error.invalidOrgId); }})) orgId: string, + @Param( + 'orgId', + new ParseUUIDPipe({ + exceptionFactory: (): Error => { + throw new BadRequestException(ResponseMessages.organisation.error.invalidOrgId); + } + }) + ) + orgId: string, @Res() res: Response, - @User() user: IUserRequestInterface + @User() user: IUserRequestSelectedOrgsInterface ): Promise { - const { pageSize, searchByText, pageNumber, sortField, sortBy } = getAllSchemaDto; const schemaSearchCriteria: ISchemaSearchPayload = { pageNumber, @@ -161,25 +199,37 @@ export class SchemaController { return res.status(HttpStatus.OK).json(finalResponse); } - -/** - * Create and register various types of schemas. - * - * @param orgId The organization ID. - * @param schemaDetails The schema details. - * @returns The created schema details. - */ + /** + * Create and register various types of schemas. + * + * @param orgId The organization ID. + * @param schemaDetails The schema details. + * @returns The created schema details. + */ @Post('/:orgId/schemas') @ApiOperation({ summary: 'Create and register various types of schemas.', - description: 'Create and register a schema for an organization. Supports multiple systems like Indy, Polygon, and W3C standards.' - } - ) + description: + 'Create and register a schema for an organization. Supports multiple systems like Indy, Polygon, and W3C standards.' + }) @Roles(OrgRoles.OWNER, OrgRoles.ADMIN) @UseGuards(AuthGuard('jwt'), OrgRolesGuard) @ApiResponse({ status: HttpStatus.CREATED, description: 'Success', type: ApiResponseDto }) - async createSchema(@Res() res: Response, @Body() schemaDetails: GenericSchemaDTO, @Param('orgId', new ParseUUIDPipe({exceptionFactory: (): Error => { throw new BadRequestException(ResponseMessages.organisation.error.invalidOrgId); }})) orgId: string, @User() user: IUserRequestInterface): Promise { - const schemaResponse = await this.appService.createSchema(schemaDetails, user, orgId); + async createSchema( + @Res() res: Response, + @Body() schemaDetails: GenericSchemaDTO, + @Param( + 'orgId', + new ParseUUIDPipe({ + exceptionFactory: (): Error => { + throw new BadRequestException(ResponseMessages.organisation.error.invalidOrgId); + } + }) + ) + orgId: string, + @User() user: IUserRequestSelectedOrgsInterface + ): Promise { + const schemaResponse = await this.appService.createSchema(schemaDetails, user, orgId); const finalResponse: IResponse = { statusCode: HttpStatus.CREATED, message: ResponseMessages.schema.success.create, @@ -189,10 +239,10 @@ export class SchemaController { } /** - * Update an schema alias - * @param updateSchemaDto The details of the schema to be updated - * @returns Success message - */ + * Update an schema alias + * @param updateSchemaDto The details of the schema to be updated + * @returns Success message + */ @Put('/schema') @ApiOperation({ summary: 'Update schema', description: 'Update the details of the schema' }) @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) @@ -200,8 +250,7 @@ export class SchemaController { @ApiBearerAuth() @Roles(OrgRoles.OWNER, OrgRoles.ADMIN) @UseGuards(AuthGuard('jwt')) - async updateSchema(@Body() updateSchemaDto: UpdateSchemaDto, @Res() res: Response): Promise { - + async updateSchema(@Body() updateSchemaDto: UpdateSchemaDto, @Res() res: Response): Promise { await this.appService.updateSchema(updateSchemaDto); const finalResponse: IResponse = { @@ -210,5 +259,4 @@ export class SchemaController { }; return res.status(HttpStatus.OK).json(finalResponse); } - } diff --git a/apps/api-gateway/src/schema/schema.module.ts b/apps/api-gateway/src/schema/schema.module.ts index a27ec6d48..95e212f27 100644 --- a/apps/api-gateway/src/schema/schema.module.ts +++ b/apps/api-gateway/src/schema/schema.module.ts @@ -1,12 +1,12 @@ import { ClientsModule, Transport } from '@nestjs/microservices'; import { ConfigModule } from '@nestjs/config'; -import { Module } from '@nestjs/common'; +import { DynamicModule, Module, Provider } from '@nestjs/common'; import { SchemaController } from './schema.controller'; import { SchemaService } from './schema.service'; -import { getNatsOptions } from '@credebl/common/nats.config'; -import { CommonConstants } from '@credebl/common/common.constant'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { getNatsOptions } from '@credebl/common'; +import { CommonConstants } from '@credebl/common'; +import { NATSClient } from '@credebl/common'; @Module({ imports: [ @@ -16,11 +16,35 @@ import { NATSClient } from '@credebl/common/NATSClient'; name: 'NATS_CLIENT', transport: Transport.NATS, options: getNatsOptions(CommonConstants.SCHEMA_SERVICE, process.env.API_GATEWAY_NKEY_SEED) - } ]) ], controllers: [SchemaController], providers: [SchemaService, NATSClient] }) -export class SchemaModule { } +export class SchemaModule { + static register( + overrides: Provider[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + controllerOverrides: any[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + importedModules: any[] = [] + ): DynamicModule { + return { + module: SchemaModule, + imports: [ + ConfigModule.forRoot(), + ClientsModule.register([ + { + name: 'NATS_CLIENT', + transport: Transport.NATS, + options: getNatsOptions(CommonConstants.SCHEMA_SERVICE, process.env.API_GATEWAY_NKEY_SEED) + } + ]), + ...importedModules + ], + controllers: controllerOverrides.length ? controllerOverrides : [SchemaController], + providers: [SchemaService, ...overrides] + }; + } +} diff --git a/apps/api-gateway/src/schema/schema.service.ts b/apps/api-gateway/src/schema/schema.service.ts index bb328e5dc..a79353ed2 100644 --- a/apps/api-gateway/src/schema/schema.service.ts +++ b/apps/api-gateway/src/schema/schema.service.ts @@ -1,41 +1,50 @@ import { Injectable, Inject } from '@nestjs/common'; import { ClientProxy } from '@nestjs/microservices'; -import { BaseService } from '../../../../libs/service/base.service'; import { GenericSchemaDTO } from '../dtos/create-schema.dto'; import { ISchemaSearchPayload } from '../interfaces/ISchemaSearch.interface'; -import { ISchemaInfo, IUserRequestInterface } from './interfaces'; -import { ICredDefWithPagination, ISchemaData, ISchemasWithPagination } from '@credebl/common/interfaces/schema.interface'; +import { ISchemaInfo, IUserRequestSelectedOrgsInterface } from './interfaces'; +import { ICredDefWithPagination, ISchemaData, ISchemasWithPagination, BaseService } from '@credebl/common'; import { GetCredentialDefinitionBySchemaIdDto } from './dtos/get-all-schema.dto'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { NATSClient, UpdateSchemaResponse } from '@credebl/common'; -import { UpdateSchemaResponse } from 'apps/ledger/src/schema/interfaces/schema.interface'; import { UpdateSchemaDto } from './dtos/update-schema-dto'; @Injectable() export class SchemaService extends BaseService { - constructor( @Inject('NATS_CLIENT') private readonly schemaServiceProxy: ClientProxy, - private readonly natsClient : NATSClient - ) { super(`Schema Service`); } + private readonly natsClient: NATSClient + ) { + super(`Schema Service`); + } - createSchema(schemaDetails: GenericSchemaDTO, user: IUserRequestInterface, orgId: string): Promise { + createSchema( + schemaDetails: GenericSchemaDTO, + user: IUserRequestSelectedOrgsInterface, + orgId: string + ): Promise { const payload = { schemaDetails, user, orgId }; return this.natsClient.sendNatsMessage(this.schemaServiceProxy, 'create-schema', payload); } - getSchemaById(schemaId: string, orgId: string): Promise { const payload = { schemaId, orgId }; return this.natsClient.sendNatsMessage(this.schemaServiceProxy, 'get-schema-by-id', payload); } - getSchemas(schemaSearchCriteria: ISchemaSearchPayload, user: IUserRequestInterface, orgId: string): Promise { + getSchemas( + schemaSearchCriteria: ISchemaSearchPayload, + user: IUserRequestSelectedOrgsInterface, + orgId: string + ): Promise { const schemaSearch = { schemaSearchCriteria, user, orgId }; return this.natsClient.sendNatsMessage(this.schemaServiceProxy, 'get-schemas', schemaSearch); } - getcredDefListBySchemaId(schemaSearchCriteria: GetCredentialDefinitionBySchemaIdDto, user: IUserRequestInterface): Promise { + getcredDefListBySchemaId( + schemaSearchCriteria: GetCredentialDefinitionBySchemaIdDto, + user: IUserRequestSelectedOrgsInterface + ): Promise { const payload = { schemaSearchCriteria, user }; return this.natsClient.sendNatsMessage(this.schemaServiceProxy, 'get-cred-def-list-by-schemas-id', payload); } @@ -44,4 +53,4 @@ export class SchemaService extends BaseService { const payload = { schemaDetails }; return this.natsClient.sendNatsMessage(this.schemaServiceProxy, 'update-schema', payload); } -} \ No newline at end of file +} diff --git a/apps/api-gateway/src/secrets/13b0e1df87be249a.pem b/apps/api-gateway/src/secrets/13b0e1df87be249a.pem deleted file mode 100644 index b499c7492..000000000 --- a/apps/api-gateway/src/secrets/13b0e1df87be249a.pem +++ /dev/null @@ -1,36 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIGOzCCBSOgAwIBAgIIE7Dh34e+JJowDQYJKoZIhvcNAQELBQAwgbQxCzAJBgNV -BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRow -GAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjEtMCsGA1UECxMkaHR0cDovL2NlcnRz -LmdvZGFkZHkuY29tL3JlcG9zaXRvcnkvMTMwMQYDVQQDEypHbyBEYWRkeSBTZWN1 -cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIwHhcNMjAwNzIwMTg1NjI1WhcN -MjEwNzIwMTg1NjI1WjA9MSEwHwYDVQQLExhEb21haW4gQ29udHJvbCBWYWxpZGF0 -ZWQxGDAWBgNVBAMMDyouaWRzd2FsbGV0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBALvSaTJO9WG/6YiMCp9qmbPp8deuJ2f8QJCoH+PhlyqS4kaG -lRPoU/VWeVVAr2F6qbpzEcDaVDcLFFGf7JLIFobUqHPM1jFQYbvsIwcf9NsZ/8+P -4ur6HXfM5NuRuiz/5C3yaPM0U5kAoKlvoiJbORdttazHESDJ2nRzAi7ZrJ6yX74I -v5Gt1WgkT80PV8oJD0VGXgNPHomZ4R66uVT3NrlEsPdjCT+IYNzef4YsysVcstlY -JPfYpmbdAucY4jEFKoFgkuwW4rvGxoftbvLl9U4MTRd1FL7FtddrhxXTC/O66KD3 -FaS9wUmDnI0PNEkkN8ypv8UCjPOqU7jx5T5YRZ8CAwEAAaOCAsUwggLBMAwGA1Ud -EwEB/wQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMA4GA1UdDwEB -/wQEAwIFoDA4BgNVHR8EMTAvMC2gK6AphidodHRwOi8vY3JsLmdvZGFkZHkuY29t -L2dkaWcyczEtMjEzOC5jcmwwXQYDVR0gBFYwVDBIBgtghkgBhv1tAQcXATA5MDcG -CCsGAQUFBwIBFitodHRwOi8vY2VydGlmaWNhdGVzLmdvZGFkZHkuY29tL3JlcG9z -aXRvcnkvMAgGBmeBDAECATB2BggrBgEFBQcBAQRqMGgwJAYIKwYBBQUHMAGGGGh0 -dHA6Ly9vY3NwLmdvZGFkZHkuY29tLzBABggrBgEFBQcwAoY0aHR0cDovL2NlcnRp -ZmljYXRlcy5nb2RhZGR5LmNvbS9yZXBvc2l0b3J5L2dkaWcyLmNydDAfBgNVHSME -GDAWgBRAwr0njsw0gzCiM9f7bLPwtCyAzjApBgNVHREEIjAggg8qLmlkc3dhbGxl -dC5jb22CDWlkc3dhbGxldC5jb20wHQYDVR0OBBYEFMT3bmcO7H2AdnMBGIc+IjSP -MvuNMIIBBAYKKwYBBAHWeQIEAgSB9QSB8gDwAHYA9lyUL9F3MCIUVBgIMJRWjuNN -Exkzv98MLyALzE7xZOMAAAFzbZWd1QAABAMARzBFAiAICn4Mo2AXSzEX/EFfU+2D -WxOv9r0YUz2hyHwbW7jgjAIhAIH4POyAgBRXWqXXX7l/6l+zGi8s1EnSZ59MIl2o -nxmsAHYAXNxDkv7mq0VEsV6a1FbmEDf71fpH3KFzlLJe5vbHDsoAAAFzbZWfAQAA -BAMARzBFAiEAgKctaNh6KE76cGShExtrT46hKvVnTf4SB3MUlvTyxKsCIA9WDBGE -rOHFJVj8+luFkY34GSvTkgLlVZr8fhSZfd6AMA0GCSqGSIb3DQEBCwUAA4IBAQBa -VS457jYfh2skILPdoQZRFgHvzkVhbiviqjIdrk0j2Fwp7KK0iw0HLHwmFEU1g4Ss -+DCRBRq1KRmS4DVSUu6Crel3KUOCfA3Xl+Ck9ceS66Mcj2B+Bapi54Iew+qu2y7P -RHUfsqp9IvATZm/PC/H+omzPYw/u2HykWQwhbGe6isN9nDhkQfH2YG3DfQF75zfi -kZMVWYBO76ZDS88r7uJ3UGKgbixxxTK2KtFc/WdxMeRrazekYtOO/aZNCBuzMWUT -y9EgKfF6ufp7MdJDxtJd3z9WVfkJik48bBToA0uN908y4UqIOHqs42Gx5L5jKGDD -4baTF3+3G/2fWVEeDIvv ------END CERTIFICATE----- diff --git a/apps/api-gateway/src/secrets/idswallet.key b/apps/api-gateway/src/secrets/idswallet.key deleted file mode 100644 index ad24f0ff1..000000000 --- a/apps/api-gateway/src/secrets/idswallet.key +++ /dev/null @@ -1,28 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC70mkyTvVhv+mI -jAqfapmz6fHXridn/ECQqB/j4ZcqkuJGhpUT6FP1VnlVQK9heqm6cxHA2lQ3CxRR -n+ySyBaG1KhzzNYxUGG77CMHH/TbGf/Pj+Lq+h13zOTbkbos/+Qt8mjzNFOZAKCp -b6IiWzkXbbWsxxEgydp0cwIu2ayesl++CL+RrdVoJE/ND1fKCQ9FRl4DTx6JmeEe -urlU9za5RLD3Ywk/iGDc3n+GLMrFXLLZWCT32KZm3QLnGOIxBSqBYJLsFuK7xsaH -7W7y5fVODE0XdRS+xbXXa4cV0wvzuuig9xWkvcFJg5yNDzRJJDfMqb/FAozzqlO4 -8eU+WEWfAgMBAAECggEADJTNoycS3NdkJ1dqJr+XSCv1nUL3NMn68TWx3SvxWlK4 -gYzmU40OgrKmMgXBOcBjui+XEtoNJhrB463YxQROLf30wr0H5AnEYjgxKHsFhd+5 -+QdkZeUXMD0zX1nlpLoHaOSCDziEGQ2ntXHa5H5D1sPslYRIK3AaCA7kKItAOukO -gaRxDh1N6/u5XZX1hh9Poctydo5gHu6uAZ7y8QzRB3PDjhgeXB6pL/b2VJOnyw2d -EAgDZ04bIEPhLfxNSJR1wlCXcNc4LUh3xGy38Gyvfd2hzWrQRM46RmvtTUKpY+7a -DR+v8+pJDQm4zsol9ncaJKgQtIJgzpqj3TfltnCFsQKBgQDnPdST5JNY25w/wai1 -lek0qDewkD6dg/8P5mASOwN/A/ay+9lgpHncjreYLrQRtvxWYfm7wNagyYmhN4lF -IH8skqoWbDiz4qxUNuR5TAHx+g2hpXK/wKbCcafqYV6L7Lc+5/x7/k7mqVMkf/D+ -7XmQhFVGItJMjVG4W5UOfGGbRQKBgQDP7nqwt5Q+qSBNFOMg2433PVve5lyBpTkH -Fca8GDd5aa7aEbdZwDOlKHjgXu/Heg8uTVHZGf725c9j6Nsda9vPlfAdeu5VxdJs -5kqZro0/AoW+vpkmtpk7M/Ot5Y7R+5IRSlBCb17RzSm2pqmJLacefbvYa09QjcyC -LmAM2o75kwKBgQDb6znYzXI09+dJ22wQBlqb8b/E8+oY9AgHnxmPPQC+M47T+iFq -gAJFeJWy7ffjQRwLK3LO1T9J+2IhKSgrzhQk1/dbC+GBcvphvTLdCSRwdVexfB/9 -rcLq+hywE5pPiPldolPFuL5hMHgaJnOUf1U11CUlZsiKdXxa0P6ZoEFT4QKBgQCB -ReoffjL7dhiv86F2JyovIYXBogS3UaqP3hkNjhzHLk5YI5WThixVrUDhdgSrRxaz -Gb0eNcxPYfc7TWUU+J7Tg4uiOHB/ARtfOxn8TApit0XBniwHZpUDurvwTH0rzbU1 -bLdTZnxUAbLCbQGQWMLC8TbdSXIpSc9wzDZJJ4SmYwKBgD5bunZbmukXYG6ACplx -Q3VRBTU82o0QHVf7ZdYR1kXrO9MdxAS8EF18EODGzfC6p5IlZZZ721RCmZQ7LRsS -fcYWVx1ujSuluGGStdvXVwg3t3j/byJCHUYbxohn0GoDEwMzuoakr1PsEJNewrzs -NZbCsCXwSIqeqCDNNGyEN23m ------END PRIVATE KEY----- diff --git a/apps/api-gateway/src/user/dto/accept-reject-invitation.dto.ts b/apps/api-gateway/src/user/dto/accept-reject-invitation.dto.ts index ab04eb078..472046cd5 100644 --- a/apps/api-gateway/src/user/dto/accept-reject-invitation.dto.ts +++ b/apps/api-gateway/src/user/dto/accept-reject-invitation.dto.ts @@ -1,24 +1,23 @@ import { IsEnum, IsNotEmpty, IsString } from 'class-validator'; import { ApiProperty } from '@nestjs/swagger'; -import { Invitation } from '@credebl/enum/enum'; +import { Invitation } from '@credebl/common'; import { Transform } from 'class-transformer'; -import { trim } from '@credebl/common/cast.helper'; +import { trim } from '@credebl/common'; export class AcceptRejectInvitationDto { - invitationId: string; + invitationId: string; - @ApiProperty({ example: 1 }) - @IsNotEmpty({ message: 'Please provide valid orgId' }) - @IsString() - orgId: string; + @ApiProperty({ example: 1 }) + @IsNotEmpty({ message: 'Please provide valid orgId' }) + @IsString() + orgId: string; - @ApiProperty({ - enum: [Invitation.ACCEPTED, Invitation.REJECTED] - }) - @Transform(({ value }) => trim(value)) - @IsNotEmpty({ message: 'Please provide valid status' }) - @IsEnum(Invitation) - status: Invitation.ACCEPTED | Invitation.REJECTED; - -} \ No newline at end of file + @ApiProperty({ + enum: [Invitation.ACCEPTED, Invitation.REJECTED] + }) + @Transform(({ value }) => trim(value)) + @IsNotEmpty({ message: 'Please provide valid status' }) + @IsEnum(Invitation) + status: Invitation.ACCEPTED | Invitation.REJECTED; +} diff --git a/apps/api-gateway/src/user/dto/add-user.dto.ts b/apps/api-gateway/src/user/dto/add-user.dto.ts index 2101d8a48..33cb1d599 100644 --- a/apps/api-gateway/src/user/dto/add-user.dto.ts +++ b/apps/api-gateway/src/user/dto/add-user.dto.ts @@ -1,51 +1,49 @@ -import { trim } from '@credebl/common/cast.helper'; +import { trim } from '@credebl/common'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { Transform } from 'class-transformer'; import { IsBoolean, IsEmail, IsNotEmpty, IsOptional, IsString, MaxLength, MinLength } from 'class-validator'; export class AddUserDetailsDto { - - @ApiProperty({ example: 'awqx@yopmail.com' }) - @IsEmail({}, { message: 'Please provide a valid email' }) - @IsNotEmpty({ message: 'Email is required' }) - @IsString({ message: 'Email should be a string' }) - @Transform(({ value }) => trim(value)) - email: string; - - @ApiProperty({ example: 'Alen' }) - @IsNotEmpty({ message: 'First name is required' }) - @MinLength(2, { message: 'First name must be at least 2 characters' }) - @MaxLength(50, { message: 'First name must be at most 50 characters' }) - @IsString({ message: 'First name should be a string' }) - firstName: string; - - @ApiProperty({ example: 'Harvey' }) - @IsNotEmpty({ message: 'Last name is required' }) - @MinLength(2, { message: 'Last name must be at least 2 characters' }) - @MaxLength(50, { message: 'Last name must be at most 50 characters' }) - @IsString({ message: 'Last name should be a string' }) - lastName: string; - - @ApiProperty() - @Transform(({ value }) => trim(value)) - @IsNotEmpty({ message: 'Password is required' }) - password: string; - - @ApiProperty({ example: 'false' }) - @IsOptional() - @IsBoolean({ message: 'isPasskey should be boolean' }) - isPasskey?: boolean; - - @ApiPropertyOptional({ example: false }) - @IsOptional() - @IsBoolean({ message: 'isHolder should be boolean' }) - isHolder?: boolean; + @ApiProperty({ example: 'awqx@yopmail.com' }) + @IsEmail({}, { message: 'Please provide a valid email' }) + @IsNotEmpty({ message: 'Email is required' }) + @IsString({ message: 'Email should be a string' }) + @Transform(({ value }) => trim(value)) + email: string; + + @ApiProperty({ example: 'Alen' }) + @IsNotEmpty({ message: 'First name is required' }) + @MinLength(2, { message: 'First name must be at least 2 characters' }) + @MaxLength(50, { message: 'First name must be at most 50 characters' }) + @IsString({ message: 'First name should be a string' }) + firstName: string; + + @ApiProperty({ example: 'Harvey' }) + @IsNotEmpty({ message: 'Last name is required' }) + @MinLength(2, { message: 'Last name must be at least 2 characters' }) + @MaxLength(50, { message: 'Last name must be at most 50 characters' }) + @IsString({ message: 'Last name should be a string' }) + lastName: string; + + @ApiProperty() + @Transform(({ value }) => trim(value)) + @IsNotEmpty({ message: 'Password is required' }) + password: string; + + @ApiProperty({ example: 'false' }) + @IsOptional() + @IsBoolean({ message: 'isPasskey should be boolean' }) + isPasskey?: boolean; + + @ApiPropertyOptional({ example: false }) + @IsOptional() + @IsBoolean({ message: 'isHolder should be boolean' }) + isHolder?: boolean; } export class AddPasskeyDetailsDto { - @ApiProperty() - @Transform(({ value }) => trim(value)) - @IsNotEmpty({ message: 'Password is required' }) - password: string; - + @ApiProperty() + @Transform(({ value }) => trim(value)) + @IsNotEmpty({ message: 'Password is required' }) + password: string; } diff --git a/apps/api-gateway/src/user/dto/create-user.dto.ts b/apps/api-gateway/src/user/dto/create-user.dto.ts index d3bf0855e..241a95dc3 100644 --- a/apps/api-gateway/src/user/dto/create-user.dto.ts +++ b/apps/api-gateway/src/user/dto/create-user.dto.ts @@ -1,37 +1,39 @@ import { IsEmail, IsNotEmpty, IsOptional, IsString, IsUrl, MaxLength } from 'class-validator'; -import { toLowerCase, trim } from '@credebl/common/cast.helper'; +import { toLowerCase, trim } from '@credebl/common'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { Transform } from 'class-transformer'; export class UserEmailVerificationDto { - @ApiProperty({ example: 'awqx@yopmail.com' }) - @Transform(({ value }) => trim(value)) - @Transform(({ value }) => toLowerCase(value)) - @IsNotEmpty({ message: 'Email is required.' }) - @MaxLength(256, { message: 'Email must be at most 256 character.' }) - @IsEmail({}, { message: 'Please provide a valid email' }) - email: string; + @ApiProperty({ example: 'awqx@yopmail.com' }) + @Transform(({ value }) => trim(value)) + @Transform(({ value }) => toLowerCase(value)) + @IsNotEmpty({ message: 'Email is required.' }) + @MaxLength(256, { message: 'Email must be at most 256 character.' }) + @IsEmail({}, { message: 'Please provide a valid email' }) + email: string; - @ApiProperty({ example: 'xxxx-xxxx-xxxx' }) - @IsString({ message: 'clientId should be string' }) - clientId: string; + @ApiProperty({ example: 'xxxx-xxxx-xxxx' }) + @IsString({ message: 'clientId should be string' }) + clientId: string; - @ApiProperty({ example: 'xxxx-xxxxx-xxxxx' }) - @IsString({ message: 'clientSecret should be string' }) - clientSecret: string; + @ApiProperty({ example: 'xxxx-xxxxx-xxxxx' }) + @IsString({ message: 'clientSecret should be string' }) + clientSecret: string; - @ApiPropertyOptional({ example: 'https://example.com/logo.png' }) - @Transform(({ value }) => trim(value)) - @IsOptional() - @IsUrl({ - // eslint-disable-next-line camelcase - require_protocol: true, - // eslint-disable-next-line camelcase + @ApiPropertyOptional({ example: 'https://example.com/logo.png' }) + @Transform(({ value }) => trim(value)) + @IsOptional() + @IsUrl( + { + // eslint-disable-next-line camelcase + require_protocol: true, + // eslint-disable-next-line camelcase require_tld: true }, - { message: 'brandLogoUrl should be a valid URL' }) - brandLogoUrl?: string; + { message: 'brandLogoUrl should be a valid URL' } + ) + brandLogoUrl?: string; @ApiPropertyOptional({ example: 'MyPlatform' }) @Transform(({ value }) => trim(value)) diff --git a/apps/api-gateway/src/user/dto/email-verify.dto.ts b/apps/api-gateway/src/user/dto/email-verify.dto.ts index 0df0ae7a2..687b27e1c 100644 --- a/apps/api-gateway/src/user/dto/email-verify.dto.ts +++ b/apps/api-gateway/src/user/dto/email-verify.dto.ts @@ -1,23 +1,22 @@ import { IsEmail, IsNotEmpty, IsString, MaxLength } from 'class-validator'; -import { toLowerCase, trim } from '@credebl/common/cast.helper'; +import { toLowerCase, trim } from '@credebl/common'; import { ApiProperty } from '@nestjs/swagger'; import { Transform } from 'class-transformer'; - export class EmailVerificationDto { - @ApiProperty() - @Transform(({ value }) => trim(value)) - @Transform(({ value }) => toLowerCase(value)) - @IsNotEmpty({ message: 'Email is required.' }) - @MaxLength(256, { message: 'Email must be at most 256 character.' }) - @IsEmail({}, { message: 'Please provide a valid email' }) - @MaxLength(256, { message: 'Email must be at most 256 character' }) - email: string; + @ApiProperty() + @Transform(({ value }) => trim(value)) + @Transform(({ value }) => toLowerCase(value)) + @IsNotEmpty({ message: 'Email is required.' }) + @MaxLength(256, { message: 'Email must be at most 256 character.' }) + @IsEmail({}, { message: 'Please provide a valid email' }) + @MaxLength(256, { message: 'Email must be at most 256 character' }) + email: string; - @ApiProperty() - @Transform(({ value }) => trim(value)) - @IsNotEmpty({ message: 'Verification code is required.' }) - @IsString({ message: 'Verification code should be string' }) - verificationCode: string; + @ApiProperty() + @Transform(({ value }) => trim(value)) + @IsNotEmpty({ message: 'Verification code is required.' }) + @IsString({ message: 'Verification code should be string' }) + verificationCode: string; } diff --git a/apps/api-gateway/src/user/dto/get-all-invitations.dto.ts b/apps/api-gateway/src/user/dto/get-all-invitations.dto.ts index 0e8133523..7a9f06676 100644 --- a/apps/api-gateway/src/user/dto/get-all-invitations.dto.ts +++ b/apps/api-gateway/src/user/dto/get-all-invitations.dto.ts @@ -1,14 +1,12 @@ -import { IsOptional, IsString} from 'class-validator'; - +import { IsOptional, IsString } from 'class-validator'; import { ApiProperty } from '@nestjs/swagger'; -import { Invitation } from '@credebl/enum/enum'; -import { PaginationDto } from '@credebl/common/dtos/pagination.dto'; +import { Invitation } from '@credebl/common'; +import { PaginationDto } from '@credebl/common'; export class GetAllInvitationsDto extends PaginationDto { - @ApiProperty({ required: false }) - @IsOptional() - @IsString() - status = Invitation.PENDING; - + @ApiProperty({ required: false }) + @IsOptional() + @IsString() + status = Invitation.PENDING; } diff --git a/apps/api-gateway/src/user/dto/index.ts b/apps/api-gateway/src/user/dto/index.ts new file mode 100644 index 000000000..a8b8e98de --- /dev/null +++ b/apps/api-gateway/src/user/dto/index.ts @@ -0,0 +1,8 @@ +export * from './accept-reject-invitation.dto'; +export * from './add-user.dto'; +export * from './create-user.dto'; +export * from './email-verify.dto'; +export * from './get-all-invitations.dto'; +export * from './login-user.dto'; +export * from './update-platform-settings.dto'; +export * from './update-user-profile.dto'; diff --git a/apps/api-gateway/src/user/dto/login-user.dto.ts b/apps/api-gateway/src/user/dto/login-user.dto.ts index bd362ca27..f1ac8632e 100644 --- a/apps/api-gateway/src/user/dto/login-user.dto.ts +++ b/apps/api-gateway/src/user/dto/login-user.dto.ts @@ -2,19 +2,18 @@ import { IsEmail, IsNotEmpty, IsString } from 'class-validator'; import { ApiProperty } from '@nestjs/swagger'; import { Transform } from 'class-transformer'; -import { trim } from '@credebl/common/cast.helper'; +import { trim } from '@credebl/common'; export class LoginUserDto { - @ApiProperty({ example: 'awqx@yopmail.com' }) - @IsEmail({}, { message: 'Please provide a valid email' }) - @IsNotEmpty({ message: 'Email is required' }) - @IsString({ message: 'Email should be a string' }) - @Transform(({ value }) => trim(value)) - email: string; + @ApiProperty({ example: 'awqx@yopmail.com' }) + @IsEmail({}, { message: 'Please provide a valid email' }) + @IsNotEmpty({ message: 'Email is required' }) + @IsString({ message: 'Email should be a string' }) + @Transform(({ value }) => trim(value)) + email: string; - @ApiProperty() - @Transform(({ value }) => trim(value)) - @IsNotEmpty({ message: 'Password is required.' }) - password: string; - -} \ No newline at end of file + @ApiProperty() + @Transform(({ value }) => trim(value)) + @IsNotEmpty({ message: 'Password is required.' }) + password: string; +} diff --git a/apps/api-gateway/src/user/index.ts b/apps/api-gateway/src/user/index.ts new file mode 100644 index 000000000..673c916d2 --- /dev/null +++ b/apps/api-gateway/src/user/index.ts @@ -0,0 +1,5 @@ +export * from './user.controller'; +export * from './user.module'; +export * from './user.service'; +export * from './dto'; +export * from './interfaces'; diff --git a/apps/api-gateway/src/user/interfaces/index.ts b/apps/api-gateway/src/user/interfaces/index.ts index 10d95bbfb..19d0adb1a 100644 --- a/apps/api-gateway/src/user/interfaces/index.ts +++ b/apps/api-gateway/src/user/interfaces/index.ts @@ -1,4 +1,4 @@ -export interface IUserRequestInterface { +export interface IUserControllerRequestInterface { userId: string; email: string; orgId: string; @@ -9,15 +9,15 @@ export interface IUserRequestInterface { } export interface ISelectedOrgInterface { - id: string; - userId: string; - orgRoleId: string; - orgId: string; - orgRole: object; - organisation: IOrganizationInterface; + id: string; + userId: string; + orgRoleId: string; + orgId: string; + orgRole: object; + organisation: IOrganizationInterface; } export interface IOrganizationInterface { - name: string; - description: string; + name: string; + description: string; } diff --git a/apps/api-gateway/src/user/user.controller.ts b/apps/api-gateway/src/user/user.controller.ts index c9f138a52..655731752 100644 --- a/apps/api-gateway/src/user/user.controller.ts +++ b/apps/api-gateway/src/user/user.controller.ts @@ -30,27 +30,27 @@ import { UnauthorizedErrorDto } from '../dtos/unauthorized-error.dto'; import { ForbiddenErrorDto } from '../dtos/forbidden-error.dto'; import { Response } from 'express'; import { CommonService } from '@credebl/common'; -import IResponse from '@credebl/common/interfaces/response.interface'; -import { ResponseMessages } from '@credebl/common/response-messages'; -import { user } from '@prisma/client'; +import { IResponse } from '@credebl/common'; +import { ResponseMessages } from '@credebl/common'; +import { user } from '@credebl/prisma-service'; import { AuthGuard } from '@nestjs/passport'; import { User } from '../authz/decorators/user.decorator'; import { AcceptRejectInvitationDto } from './dto/accept-reject-invitation.dto'; -import { Invitation } from '@credebl/enum/enum'; -import { IUserRequestInterface } from './interfaces'; +import { Invitation } from '@credebl/common'; +import { IUserControllerRequestInterface } from './interfaces'; import { GetAllInvitationsDto } from './dto/get-all-invitations.dto'; import { UpdateUserProfileDto } from './dto/update-user-profile.dto'; -import { CustomExceptionFilter } from 'apps/api-gateway/common/exception-handler'; +import { CustomExceptionFilter } from '../common'; import { AddPasskeyDetailsDto } from './dto/add-user.dto'; import { EmailValidator } from '../dtos/email-validator.dto'; import { UpdatePlatformSettingsDto } from './dto/update-platform-settings.dto'; import { Roles } from '../authz/decorators/roles.decorator'; import { OrgRolesGuard } from '../authz/guards/org-roles.guard'; -import { OrgRoles } from 'libs/org-roles/enums'; -import { AwsService } from '@credebl/aws/aws.service'; -import { PaginationDto } from '@credebl/common/dtos/pagination.dto'; +import { OrgRoles } from '@credebl/common'; +import { AwsService } from '@credebl/aws'; +import { PaginationDto } from '@credebl/common'; import { UserAccessGuard } from '../authz/guards/user-access-guard'; -import { TrimStringParamPipe } from '@credebl/common/cast.helper'; +import { TrimStringParamPipe } from '@credebl/common'; @UseFilters(CustomExceptionFilter) @Controller('users') @@ -62,7 +62,7 @@ export class UserController { private readonly userService: UserService, private readonly commonService: CommonService, private readonly awsService: AwsService - ) { } + ) {} /** * @@ -91,7 +91,7 @@ export class UserController { required: false }) async get( - @User() user: IUserRequestInterface, + @User() user: IUserControllerRequestInterface, @Query() paginationDto: PaginationDto, @Res() res: Response ): Promise { @@ -105,9 +105,9 @@ export class UserController { return res.status(HttpStatus.OK).json(finalResponse); } - /** + /** * Get public profile details of a user by username. - * + * * @param username The username of the user. * @returns Public profile information. */ @@ -134,7 +134,6 @@ export class UserController { return res.status(HttpStatus.OK).json(finalResponse); } - /** * Retrieves the profile details of the currently logged-in user. * @@ -149,7 +148,7 @@ export class UserController { @ApiBearerAuth() async getProfile(@User() reqUser: user, @Res() res: Response): Promise { const userData = await this.userService.getProfile(reqUser.id); - + const finalResponse: IResponse = { statusCode: HttpStatus.OK, message: ResponseMessages.user.success.fetchProfile, @@ -159,9 +158,9 @@ export class UserController { return res.status(HttpStatus.OK).json(finalResponse); } - /** + /** * Retrieves all platform settings. - * + * * @returns The platform settings. */ @Get('/platform-settings') @@ -185,11 +184,11 @@ export class UserController { } /** - * Fetch user activities. - * - * @param limit - Number of activities to fetch. - * @returns A response containing user activity data. - */ + * Fetch user activities. + * + * @param limit - Number of activities to fetch. + * @returns A response containing user activity data. + */ @Get('/activity') @ApiOperation({ summary: 'Fetch users activity', @@ -214,12 +213,11 @@ export class UserController { return res.status(HttpStatus.OK).json(finalResponse); } - - /** - * Fetch organization invitations. - * - * @returns A paginated list of organization invitations. - */ + /** + * Fetch organization invitations. + * + * @returns A paginated list of organization invitations. + */ @Get('/org-invitations') @ApiOperation({ summary: 'organization invitations', @@ -248,7 +246,7 @@ export class UserController { required: false }) async invitations( - @Query() getAllInvitationsDto: GetAllInvitationsDto, + @Query() getAllInvitationsDto: GetAllInvitationsDto, @User() reqUser: user, @Res() res: Response ): Promise { @@ -271,14 +269,17 @@ export class UserController { return res.status(HttpStatus.OK).json(finalResponse); } - /** - * Checks if a user is registered and verifies email existence. - * - * @param email The email address to check. - * @returns Returns user registration and email verification status. - */ + /** + * Checks if a user is registered and verifies email existence. + * + * @param email The email address to check. + * @returns Returns user registration and email verification status. + */ @Get('/:email') - @ApiOperation({ summary: 'Check user registration and email verification status', description: 'Check if a user is already registered and if their email already exists.' }) + @ApiOperation({ + summary: 'Check user registration and email verification status', + description: 'Check if a user is already registered and if their email already exists.' + }) async checkUserExist(@Param() emailParam: EmailValidator, @Res() res: Response): Promise { const userDetails = await this.userService.checkUserExist(emailParam.email); @@ -292,12 +293,12 @@ export class UserController { } /** - * Accept or reject an organization invitation. - * - * @param invitationId The ID of the organization invitation. - * @body AcceptRejectInvitationDto - * @returns The status of the organization invitation response. - */ + * Accept or reject an organization invitation. + * + * @param invitationId The ID of the organization invitation. + * @body AcceptRejectInvitationDto + * @returns The status of the organization invitation response. + */ @Post('/org-invitations/:invitationId') @ApiOperation({ summary: 'accept/reject organization invitation', @@ -306,8 +307,17 @@ export class UserController { @UseGuards(AuthGuard('jwt'), UserAccessGuard) @ApiBearerAuth() async acceptRejectInvitaion( - @Body() acceptRejectInvitation: AcceptRejectInvitationDto, - @Param('invitationId', TrimStringParamPipe, new ParseUUIDPipe({exceptionFactory: (): Error => { throw new BadRequestException(`Invalid format for InvitationId`); }})) invitationId: string, + @Body() acceptRejectInvitation: AcceptRejectInvitationDto, + @Param( + 'invitationId', + TrimStringParamPipe, + new ParseUUIDPipe({ + exceptionFactory: (): Error => { + throw new BadRequestException(`Invalid format for InvitationId`); + } + }) + ) + invitationId: string, @User() reqUser: user, @Res() res: Response ): Promise { @@ -320,13 +330,13 @@ export class UserController { }; return res.status(HttpStatus.CREATED).json(finalResponse); } - + /** - * Updates the user profile. - * - * @body UpdateUserProfileDto - * @returns A response indicating the success of the update operation. - */ + * Updates the user profile. + * + * @body UpdateUserProfileDto + * @returns A response indicating the success of the update operation. + */ @Put('/') @ApiOperation({ summary: 'Update user profile', @@ -343,7 +353,7 @@ export class UserController { const userId = reqUser.id; updateUserProfileDto.id = userId; await this.userService.updateUserProfile(updateUserProfileDto); - + const finalResponse: IResponse = { statusCode: HttpStatus.OK, message: ResponseMessages.user.success.update @@ -351,40 +361,40 @@ export class UserController { return res.status(HttpStatus.OK).json(finalResponse); } - /** + /** * @body AddPasskeyDetailsDto * @returns User's profile update status */ - - - @Put('/password/:email') - @ApiOperation({ summary: 'Store user password details', description: 'Securely store and update the user’s password details.' }) - @ApiExcludeEndpoint() - @ApiBearerAuth() - @UseGuards(AuthGuard('jwt'), UserAccessGuard) - - async addPasskey( - @Body() userInfo: AddPasskeyDetailsDto, - @User() reqUser: user, - @Res() res: Response - ): Promise { - - const userDetails = await this.userService.addPasskey(reqUser.email, userInfo); - const finalResponse = { - statusCode: HttpStatus.OK, - message: ResponseMessages.user.success.update, - data: userDetails - }; - - return res.status(HttpStatus.OK).json(finalResponse); - } + + @Put('/password/:email') + @ApiOperation({ + summary: 'Store user password details', + description: 'Securely store and update the user’s password details.' + }) + @ApiExcludeEndpoint() + @ApiBearerAuth() + @UseGuards(AuthGuard('jwt'), UserAccessGuard) + async addPasskey( + @Body() userInfo: AddPasskeyDetailsDto, + @User() reqUser: user, + @Res() res: Response + ): Promise { + const userDetails = await this.userService.addPasskey(reqUser.email, userInfo); + const finalResponse = { + statusCode: HttpStatus.OK, + message: ResponseMessages.user.success.update, + data: userDetails + }; + + return res.status(HttpStatus.OK).json(finalResponse); + } /** - * Updates platform settings. - * @body UpdatePlatformSettingsDto - * - * @returns Status of the update operation. - */ + * Updates platform settings. + * @body UpdatePlatformSettingsDto + * + * @returns Status of the update operation. + */ @Put('/platform-settings') @ApiOperation({ summary: 'Update platform settings', @@ -406,4 +416,4 @@ export class UserController { return res.status(HttpStatus.OK).json(finalResponse); } -} \ No newline at end of file +} diff --git a/apps/api-gateway/src/user/user.module.ts b/apps/api-gateway/src/user/user.module.ts index 02a920ffa..51b386ccd 100644 --- a/apps/api-gateway/src/user/user.module.ts +++ b/apps/api-gateway/src/user/user.module.ts @@ -2,13 +2,13 @@ import { CommonService } from '@credebl/common'; import { ClientsModule, Transport } from '@nestjs/microservices'; import { ConfigModule } from '@nestjs/config'; import { HttpModule } from '@nestjs/axios'; -import { Module } from '@nestjs/common'; +import { DynamicModule, Module, Provider } from '@nestjs/common'; import { UserController } from './user.controller'; import { UserService } from './user.service'; -import { getNatsOptions } from '@credebl/common/nats.config'; +import { getNatsOptions } from '@credebl/common'; import { AwsService } from '@credebl/aws'; -import { CommonConstants } from '@credebl/common/common.constant'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { CommonConstants } from '@credebl/common'; +import { NATSClient } from '@credebl/common'; @Module({ imports: [ @@ -19,11 +19,36 @@ import { NATSClient } from '@credebl/common/NATSClient'; name: 'NATS_CLIENT', transport: Transport.NATS, options: getNatsOptions(CommonConstants.USER_SERVICE, process.env.API_GATEWAY_NKEY_SEED) - } ]) ], controllers: [UserController], providers: [UserService, CommonService, AwsService, NATSClient] }) -export class UserModule {} +export class UserModule { + static register( + overrides: Provider[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + controllerOverrides: any[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + importedModules: any[] = [] + ): DynamicModule { + return { + module: UserModule, + imports: [ + HttpModule, + ConfigModule.forRoot(), + ClientsModule.register([ + { + name: 'NATS_CLIENT', + transport: Transport.NATS, + options: getNatsOptions(CommonConstants.USER_SERVICE, process.env.API_GATEWAY_NKEY_SEED) + } + ]), + ...importedModules + ], + controllers: controllerOverrides.length ? controllerOverrides : [UserController], + providers: [UserService, CommonService, AwsService, ...overrides] + }; + } +} diff --git a/apps/api-gateway/src/user/user.service.ts b/apps/api-gateway/src/user/user.service.ts index c3988d810..f8a8bb37c 100644 --- a/apps/api-gateway/src/user/user.service.ts +++ b/apps/api-gateway/src/user/user.service.ts @@ -1,21 +1,23 @@ import { Inject, Injectable } from '@nestjs/common'; import { ClientProxy } from '@nestjs/microservices'; -import { BaseService } from 'libs/service/base.service'; +import { BaseService } from '@credebl/common'; import { AcceptRejectInvitationDto } from './dto/accept-reject-invitation.dto'; import { GetAllInvitationsDto } from './dto/get-all-invitations.dto'; import { UpdateUserProfileDto } from './dto/update-user-profile.dto'; import { AddPasskeyDetailsDto } from './dto/add-user.dto'; import { UpdatePlatformSettingsDto } from './dto/update-platform-settings.dto'; -import { IUsersProfile, ICheckUserDetails } from 'apps/user/interfaces/user.interface'; -import { IUsersActivity } from 'libs/user-activity/interface'; -import { IUserInvitations } from '@credebl/common/interfaces/user.interface'; -import { user } from '@prisma/client'; -import { PaginationDto } from '@credebl/common/dtos/pagination.dto'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { IUsersActivity } from '@credebl/user-management'; +import { IUserInvitations, IUsersProfile, ICheckUserDetails } from '@credebl/common'; +import { user } from '@credebl/prisma-service'; +import { PaginationDto } from '@credebl/common'; +import { NATSClient } from '@credebl/common'; @Injectable() export class UserService extends BaseService { - constructor(@Inject('NATS_CLIENT') private readonly serviceProxy: ClientProxy, private readonly natsClient : NATSClient) { + constructor( + @Inject('NATS_CLIENT') private readonly serviceProxy: ClientProxy, + private readonly natsClient: NATSClient + ) { super('User Service'); } @@ -25,8 +27,8 @@ export class UserService extends BaseService { } async getPublicProfile(username: string): Promise { - const payload = { username }; - return this.natsClient.sendNatsMessage(this.serviceProxy, 'get-user-public-profile', payload); + const payload = { username }; + return this.natsClient.sendNatsMessage(this.serviceProxy, 'get-user-public-profile', payload); } async updateUserProfile(updateUserProfileDto: UpdateUserProfileDto): Promise { @@ -43,24 +45,19 @@ export class UserService extends BaseService { const payload = { id }; return this.natsClient.sendNatsMessage(this.serviceProxy, 'get-user-by-keycloak', payload); } - + async invitations(id: string, status: string, getAllInvitationsDto: GetAllInvitationsDto): Promise { const { pageNumber, pageSize, search } = getAllInvitationsDto; const payload = { id, status, pageNumber, pageSize, search }; return this.natsClient.sendNatsMessage(this.serviceProxy, 'get-org-invitations', payload); } - async acceptRejectInvitaion( - acceptRejectInvitation: AcceptRejectInvitationDto, - userId: string - ): Promise { + async acceptRejectInvitaion(acceptRejectInvitation: AcceptRejectInvitationDto, userId: string): Promise { const payload = { acceptRejectInvitation, userId }; return this.natsClient.sendNatsMessage(this.serviceProxy, 'accept-reject-invitations', payload); } - async get( - paginationDto:PaginationDto - ): Promise { + async get(paginationDto: PaginationDto): Promise { const { pageNumber, pageSize, search } = paginationDto; const payload = { pageNumber, pageSize, search }; return this.natsClient.sendNatsMessage(this.serviceProxy, 'fetch-users', payload); diff --git a/apps/api-gateway/src/utilities/dtos/index.ts b/apps/api-gateway/src/utilities/dtos/index.ts new file mode 100644 index 000000000..09718ccbe --- /dev/null +++ b/apps/api-gateway/src/utilities/dtos/index.ts @@ -0,0 +1 @@ +export * from './shortening-url.dto'; diff --git a/apps/api-gateway/src/utilities/index.ts b/apps/api-gateway/src/utilities/index.ts new file mode 100644 index 000000000..4fef4174a --- /dev/null +++ b/apps/api-gateway/src/utilities/index.ts @@ -0,0 +1,4 @@ +export * from './utilities.controller'; +export * from './utilities.module'; +export * from './utilities.service'; +export * from './dtos'; diff --git a/apps/api-gateway/src/utilities/utilities.controller.ts b/apps/api-gateway/src/utilities/utilities.controller.ts index a1cba29aa..598725455 100644 --- a/apps/api-gateway/src/utilities/utilities.controller.ts +++ b/apps/api-gateway/src/utilities/utilities.controller.ts @@ -1,12 +1,19 @@ -import { ApiBearerAuth, ApiForbiddenResponse, ApiOperation, ApiResponse, ApiTags, ApiUnauthorizedResponse } from '@nestjs/swagger'; +import { + ApiBearerAuth, + ApiForbiddenResponse, + ApiOperation, + ApiResponse, + ApiTags, + ApiUnauthorizedResponse +} from '@nestjs/swagger'; import { Controller, UseFilters, Post, Body, Res, HttpStatus, Param, UseGuards } from '@nestjs/common'; -import IResponse from '@credebl/common/interfaces/response.interface'; +import { IResponse } from '@credebl/common'; import { Response } from 'express'; import { ApiResponseDto } from '../dtos/apiResponse.dto'; import { UnauthorizedErrorDto } from '../dtos/unauthorized-error.dto'; import { ForbiddenErrorDto } from '../dtos/forbidden-error.dto'; -import { ResponseMessages } from '@credebl/common/response-messages'; -import { CustomExceptionFilter } from 'apps/api-gateway/common/exception-handler'; +import { ResponseMessages } from '@credebl/common'; +import { CustomExceptionFilter } from '../common'; import { StoreObjectDto, UtilitiesDto } from './dtos/shortening-url.dto'; import { UtilitiesService } from './utilities.service'; import { AuthGuard } from '@nestjs/passport'; @@ -17,10 +24,7 @@ import { AuthGuard } from '@nestjs/passport'; @ApiUnauthorizedResponse({ status: HttpStatus.UNAUTHORIZED, description: 'Unauthorized', type: UnauthorizedErrorDto }) @ApiForbiddenResponse({ status: HttpStatus.FORBIDDEN, description: 'Forbidden', type: ForbiddenErrorDto }) export class UtilitiesController { - - constructor( - private readonly utilitiesService: UtilitiesService - ) { } + constructor(private readonly utilitiesService: UtilitiesService) {} /** * Create a shortening URL @@ -51,9 +55,20 @@ export class UtilitiesController { @Post('/store-object/:persist') @ApiBearerAuth() @UseGuards(AuthGuard('jwt')) - @ApiOperation({ summary: 'Store Object and Create Short URL', description: 'Store an object and create a short URL representing the object.' }) - @ApiResponse({ status: HttpStatus.CREATED, description: 'Object stored and short URL created successfully', type: ApiResponseDto }) - async storeObject(@Body() storeObjectDto: StoreObjectDto, @Param('persist') persist: boolean, @Res() res: Response): Promise { + @ApiOperation({ + summary: 'Store Object and Create Short URL', + description: 'Store an object and create a short URL representing the object.' + }) + @ApiResponse({ + status: HttpStatus.CREATED, + description: 'Object stored and short URL created successfully', + type: ApiResponseDto + }) + async storeObject( + @Body() storeObjectDto: StoreObjectDto, + @Param('persist') persist: boolean, + @Res() res: Response + ): Promise { const shorteningUrl = await this.utilitiesService.storeObject(persist.valueOf(), storeObjectDto); const finalResponse: IResponse = { statusCode: HttpStatus.CREATED, @@ -63,4 +78,3 @@ export class UtilitiesController { return res.status(HttpStatus.CREATED).json(finalResponse); } } - diff --git a/apps/api-gateway/src/utilities/utilities.module.ts b/apps/api-gateway/src/utilities/utilities.module.ts index 3fc905a4f..4e7f21a95 100644 --- a/apps/api-gateway/src/utilities/utilities.module.ts +++ b/apps/api-gateway/src/utilities/utilities.module.ts @@ -3,12 +3,12 @@ import { CommonModule, CommonService } from '@credebl/common'; import { ClientsModule, Transport } from '@nestjs/microservices'; import { ConfigModule } from '@nestjs/config'; import { HttpModule } from '@nestjs/axios'; -import { Module } from '@nestjs/common'; -import { getNatsOptions } from '@credebl/common/nats.config'; +import { DynamicModule, Module, Provider } from '@nestjs/common'; +import { getNatsOptions } from '@credebl/common'; import { UtilitiesController } from './utilities.controller'; import { UtilitiesService } from './utilities.service'; -import { CommonConstants } from '@credebl/common/common.constant'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { CommonConstants } from '@credebl/common'; +import { NATSClient } from '@credebl/common'; @Module({ imports: [ @@ -26,4 +26,31 @@ import { NATSClient } from '@credebl/common/NATSClient'; controllers: [UtilitiesController], providers: [UtilitiesService, CommonService, NATSClient] }) -export class UtilitiesModule {} +export class UtilitiesModule { + static register( + overrides: Provider[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + controllerOverrides: any[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + importedModules: any[] = [] + ): DynamicModule { + return { + module: UtilitiesModule, + imports: [ + HttpModule, + ConfigModule.forRoot(), + ClientsModule.register([ + { + name: 'NATS_CLIENT', + transport: Transport.NATS, + options: getNatsOptions(CommonConstants.UTILITY_SERVICE, process.env.API_GATEWAY_NKEY_SEED) + }, + CommonModule + ]), + ...importedModules + ], + controllers: controllerOverrides.length ? controllerOverrides : [UtilitiesController], + providers: [UtilitiesService, CommonService, ...overrides] + }; + } +} diff --git a/apps/api-gateway/src/utilities/utilities.service.ts b/apps/api-gateway/src/utilities/utilities.service.ts index c90142ee4..e2d4473e8 100644 --- a/apps/api-gateway/src/utilities/utilities.service.ts +++ b/apps/api-gateway/src/utilities/utilities.service.ts @@ -1,12 +1,15 @@ import { Inject, Injectable } from '@nestjs/common'; import { ClientProxy } from '@nestjs/microservices'; -import { BaseService } from 'libs/service/base.service'; +import { BaseService } from '@credebl/common'; import { StoreObjectDto, UtilitiesDto } from './dtos/shortening-url.dto'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { NATSClient } from '@credebl/common'; @Injectable() export class UtilitiesService extends BaseService { - constructor(@Inject('NATS_CLIENT') private readonly serviceProxy: ClientProxy, private readonly natsClient : NATSClient) { + constructor( + @Inject('NATS_CLIENT') private readonly serviceProxy: ClientProxy, + private readonly natsClient: NATSClient + ) { super('OrganizationService'); } @@ -16,7 +19,7 @@ export class UtilitiesService extends BaseService { async storeObject(persistent: boolean, storeObjectDto: StoreObjectDto): Promise { const storeObj = storeObjectDto.data; - const payload = {persistent, storeObj}; + const payload = { persistent, storeObj }; return this.natsClient.sendNatsMessage(this.serviceProxy, 'store-object-return-url', payload); } } diff --git a/apps/api-gateway/src/verification/dto/get-all-proof-requests.dto.ts b/apps/api-gateway/src/verification/dto/get-all-proof-requests.dto.ts index d414112fb..01adc1661 100644 --- a/apps/api-gateway/src/verification/dto/get-all-proof-requests.dto.ts +++ b/apps/api-gateway/src/verification/dto/get-all-proof-requests.dto.ts @@ -1,29 +1,25 @@ import { ApiProperty } from '@nestjs/swagger'; import { Transform } from 'class-transformer'; import { IsEnum, IsOptional } from 'class-validator'; -import { SortValue } from '../../enum'; -import { trim } from '@credebl/common/cast.helper'; +import { trim, SortValue } from '@credebl/common'; import { SortFields } from '../enum/verification.enum'; -import { PaginationDto } from '@credebl/common/dtos/pagination.dto'; +import { PaginationDto } from '@credebl/common'; export class GetAllProofRequestsDto extends PaginationDto { - - @ApiProperty({ - enum: [SortValue.DESC, SortValue.ASC], - required: false - }) - @Transform(({ value }) => trim(value)) - @IsOptional() - @IsEnum(SortValue) - sortBy: string = SortValue.DESC; - - @ApiProperty({ - required: false - }) - @Transform(({ value }) => trim(value)) - @IsOptional() - @IsEnum(SortFields) - sortField: string = SortFields.CREATED_DATE_TIME; - -} + @ApiProperty({ + enum: [SortValue.DESC, SortValue.ASC], + required: false + }) + @Transform(({ value }) => trim(value)) + @IsOptional() + @IsEnum(SortValue) + sortBy: string = SortValue.DESC; + @ApiProperty({ + required: false + }) + @Transform(({ value }) => trim(value)) + @IsOptional() + @IsEnum(SortFields) + sortField: string = SortFields.CREATED_DATE_TIME; +} diff --git a/apps/api-gateway/src/verification/dto/index.ts b/apps/api-gateway/src/verification/dto/index.ts new file mode 100644 index 000000000..06bea8d73 --- /dev/null +++ b/apps/api-gateway/src/verification/dto/index.ts @@ -0,0 +1,3 @@ +export * from './get-all-proof-requests.dto'; +export * from './request-proof.dto'; +export * from './webhook-proof.dto'; diff --git a/apps/api-gateway/src/verification/dto/request-proof.dto.ts b/apps/api-gateway/src/verification/dto/request-proof.dto.ts index 6f1b41072..51ecd5f75 100644 --- a/apps/api-gateway/src/verification/dto/request-proof.dto.ts +++ b/apps/api-gateway/src/verification/dto/request-proof.dto.ts @@ -1,74 +1,90 @@ -import { ArrayNotEmpty, IsArray, IsBoolean, IsEmail, IsEnum, IsNotEmpty, IsNumberString, IsObject, IsOptional, IsString, ValidateIf, ValidateNested, IsUUID, ArrayUnique, ArrayMaxSize, ArrayMinSize } from 'class-validator'; -import { trim } from '@credebl/common/cast.helper'; +import { + ArrayNotEmpty, + IsArray, + IsBoolean, + IsEmail, + IsEnum, + IsNotEmpty, + IsNumberString, + IsObject, + IsOptional, + IsString, + ValidateIf, + ValidateNested, + IsUUID, + ArrayUnique, + ArrayMaxSize, + ArrayMinSize +} from 'class-validator'; +import { trim } from '@credebl/common'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { Transform, Type } from 'class-transformer'; -import { AutoAccept } from '@credebl/enum/enum'; +import { AutoAccept } from '@credebl/common'; import { IProofFormats } from '../interfaces/verification.interface'; import { ProofRequestType } from '../enum/verification.enum'; export class ProofRequestAttribute { + @ValidateIf((obj) => obj.attributeNames === undefined) + @IsNotEmpty() + @IsString() + attributeName?: string; + + @ValidateIf((obj) => obj.attributeName === undefined) + @IsArray({ message: 'attributeNames must be an array' }) + @ArrayNotEmpty({ message: 'array can not be empty' }) + @IsString({ each: true }) + @IsNotEmpty({ each: true, message: 'each element cannot be empty' }) + attributeNames?: string[]; + + @ApiPropertyOptional() + @IsString() + @IsOptional() + @IsNotEmpty({ message: 'schemaId is required' }) + schemaId?: string; + + @ApiPropertyOptional() + @ValidateIf((obj) => obj.value !== undefined || obj.condition !== undefined) + @IsNotEmpty({ message: 'condition is required' }) + @IsString({ message: 'condition must be a string' }) + condition?: string; + + @ApiPropertyOptional() + @ValidateIf((obj) => obj.condition !== undefined || obj.value !== undefined) + @IsNotEmpty({ message: 'value is required' }) + @IsNumberString({}, { message: 'value must be a number' }) + value?: string; - @ValidateIf((obj) => obj.attributeNames === undefined) - @IsNotEmpty() - @IsString() - attributeName?: string; - - @ValidateIf((obj) => obj.attributeName === undefined) - @IsArray({ message: 'attributeNames must be an array' }) - @ArrayNotEmpty({ message: 'array can not be empty' }) - @IsString({ each: true }) - @IsNotEmpty({ each: true, message: 'each element cannot be empty' }) - attributeNames?: string[]; - - @ApiPropertyOptional() - @IsString() - @IsOptional() - @IsNotEmpty({ message: 'schemaId is required' }) - schemaId?: string; - - @ApiPropertyOptional() - @ValidateIf((obj) => obj.value !== undefined || obj.condition !== undefined) - @IsNotEmpty({ message: 'condition is required' }) - @IsString({ message: 'condition must be a string' }) - condition?: string; - - @ApiPropertyOptional() - @ValidateIf((obj) => obj.condition !== undefined || obj.value !== undefined) - @IsNotEmpty({ message: 'value is required' }) - @IsNumberString({}, { message: 'value must be a number' }) - value?: string; - - @ApiPropertyOptional() - @IsString() - @IsOptional() - @IsNotEmpty({ message: 'credDefId is required' }) - credDefId?: string; + @ApiPropertyOptional() + @IsString() + @IsOptional() + @IsNotEmpty({ message: 'credDefId is required' }) + credDefId?: string; } class ProofPayload { - @ApiPropertyOptional() - @IsString({ message: 'goalCode must be in string' }) - @IsNotEmpty({ message: 'please provide valid goalCode' }) - @IsOptional() - goalCode: string; - - @ApiPropertyOptional() - @IsString({ message: 'parentThreadId must be in string' }) - @IsNotEmpty({ message: 'please provide valid parentThreadId' }) - @IsOptional() - parentThreadId?: string; - - @ApiPropertyOptional() - @IsBoolean({ message: 'willConfirm must be in boolean' }) - @IsNotEmpty({ message: 'please provide valid willConfirm' }) - @IsOptional() - willConfirm: boolean; - - @ApiPropertyOptional() - @IsString({ message: 'protocolVersion must be in string' }) - @IsNotEmpty({ message: 'please provide valid protocol version' }) - @IsOptional() - protocolVersion: string; + @ApiPropertyOptional() + @IsString({ message: 'goalCode must be in string' }) + @IsNotEmpty({ message: 'please provide valid goalCode' }) + @IsOptional() + goalCode: string; + + @ApiPropertyOptional() + @IsString({ message: 'parentThreadId must be in string' }) + @IsNotEmpty({ message: 'please provide valid parentThreadId' }) + @IsOptional() + parentThreadId?: string; + + @ApiPropertyOptional() + @IsBoolean({ message: 'willConfirm must be in boolean' }) + @IsNotEmpty({ message: 'please provide valid willConfirm' }) + @IsOptional() + willConfirm: boolean; + + @ApiPropertyOptional() + @IsString({ message: 'protocolVersion must be in string' }) + @IsNotEmpty({ message: 'please provide valid protocol version' }) + @IsOptional() + protocolVersion: string; } export class Fields { @@ -79,7 +95,7 @@ export class Fields { } export class Constraints { - @ApiProperty({type: () => [Fields]}) + @ApiProperty({ type: () => [Fields] }) @IsOptional() @IsNotEmpty({ message: 'Fields are required' }) @ValidateNested() @@ -87,50 +103,45 @@ export class Constraints { fields: Fields[]; } - export class Schema { @ApiProperty() @IsNotEmpty({ message: 'uri is required' }) @IsString() - uri:string; - + uri: string; } export class InputDescriptors { @ApiProperty() @IsNotEmpty({ message: 'id is required' }) @IsString() - id:string; + id: string; @ApiProperty() @IsString() @IsOptional() @IsNotEmpty({ message: 'name is required' }) - name:string; + name: string; @ApiProperty() @IsString() @IsOptional() @IsNotEmpty({ message: 'purpose is required' }) - purpose:string; - - @ApiProperty({type: () => [Schema]}) + purpose: string; + + @ApiProperty({ type: () => [Schema] }) @IsNotEmpty({ message: 'schema is required' }) @ValidateNested() @Type(() => Schema) - schema:Schema[]; + schema: Schema[]; - - @ApiProperty({type: () => Constraints}) + @ApiProperty({ type: () => Constraints }) @IsOptional() @IsNotEmpty({ message: 'Constraints are required' }) @ValidateNested() @Type(() => Constraints) - constraints:Constraints; - + constraints: Constraints; } export class ProofRequestPresentationDefinition { - @ApiProperty() @IsString() @IsNotEmpty({ message: 'id is required' }) @@ -145,41 +156,64 @@ export class ProofRequestPresentationDefinition { @IsOptional() purpose?: string; - @ApiProperty({type: () => [InputDescriptors]}) + @ApiProperty({ type: () => [InputDescriptors] }) @IsArray({ message: 'inputDescriptors must be an array' }) @IsNotEmpty({ message: 'inputDescriptors is required' }) @ArrayMinSize(1) - @ValidateNested({each:true}) + @ValidateNested({ each: true }) @Type(() => InputDescriptors) // eslint-disable-next-line camelcase - input_descriptors:InputDescriptors[]; + input_descriptors: InputDescriptors[]; } export class ProofRequestAttributeDto { @ApiProperty({ - 'example': [ - { - attributeName: 'attributeName', - condition: '>=', - value: 'predicates', - credDefId: 'string', - schemaId: 'string' - } + example: [ + { + attributeName: 'attributeName', + condition: '>=', + value: 'predicates', + credDefId: 'string', + schemaId: 'string' + } ], type: () => [ProofRequestAttribute] -}) -@IsArray({ message: 'attributes must be in array' }) -@ValidateNested({ each: true }) -@IsObject({ each: true }) -@IsNotEmpty({ message: 'please provide valid attributes' }) -@Type(() => ProofRequestAttribute) -attributes?: ProofRequestAttribute[]; + }) + @IsArray({ message: 'attributes must be in array' }) + @ValidateNested({ each: true }) + @IsObject({ each: true }) + @IsNotEmpty({ message: 'please provide valid attributes' }) + @Type(() => ProofRequestAttribute) + attributes?: ProofRequestAttribute[]; } export class IndyDto { @ApiProperty({ - 'example': { - 'attributes': [ + example: { + attributes: [ + { + attributeName: 'attributeName', + condition: '>=', + value: 'predicates', + credDefId: 'string', + schemaId: 'string' + } + ] + }, + type: () => [ProofRequestAttributeDto] + }) + @ValidateNested() + @IsObject({ each: true }) + @IsNotEmpty({ message: 'please provide valid attributes' }) + @Type(() => ProofRequestAttributeDto) + indy: ProofRequestAttributeDto; +} + +export class RequestProofDtoBase extends ProofPayload { + @ApiProperty({ + example: { + indy: { + attributes: [ { attributeName: 'attributeName', condition: '>=', @@ -188,286 +222,257 @@ export class IndyDto { schemaId: 'string' } ] - }, - type: () => [ProofRequestAttributeDto] - }) + } + }, + type: () => [IndyDto] + }) + @IsOptional() @ValidateNested() - @IsObject({ each: true }) - @IsNotEmpty({ message: 'please provide valid attributes' }) - @Type(() => ProofRequestAttributeDto) - indy: ProofRequestAttributeDto; -} - -export class RequestProofDtoBase extends ProofPayload { + @IsObject({ message: 'ProofFormatDto must be an object' }) + @IsNotEmpty({ message: 'ProofFormatDto must not be empty' }) + @Type(() => IndyDto) + proofFormats?: IndyDto; - @ApiProperty({ - 'example': - { - 'indy': { - 'attributes': [ + @ApiProperty({ + example: { + id: '32f54163-7166-48f1-93d8-ff217bdb0653', + purpose: 'Used for KYC verification.', + // eslint-disable-next-line camelcase + input_descriptors: [ + { + id: 'healthcare_input_1', + name: 'Medical History', + schema: [ { - attributeName: 'attributeName', - condition: '>=', - value: 'predicates', - credDefId: 'string', - schemaId: 'string' + uri: 'https://health-schemas.org/1.0.1/medical_history.json' } - ] + ], + constraints: { + fields: [ + { + path: ['$.credentialSubject.PatientID'] + } + ] + } } - }, - type: () => [IndyDto] + ] + }, + type: () => [ProofRequestPresentationDefinition] }) @IsOptional() @ValidateNested() - @IsObject({ message: 'ProofFormatDto must be an object' }) - @IsNotEmpty({ message: 'ProofFormatDto must not be empty' }) - @Type(() => IndyDto) - proofFormats?: IndyDto; - - @ApiProperty({ - 'example': - { - id: '32f54163-7166-48f1-93d8-ff217bdb0653', - purpose: 'Used for KYC verification.', - // eslint-disable-next-line camelcase - input_descriptors: [ - { - 'id': 'healthcare_input_1', - 'name': 'Medical History', - 'schema': [ - { - 'uri': 'https://health-schemas.org/1.0.1/medical_history.json' - } - - ], - 'constraints': { - 'fields': [ - { - 'path': ['$.credentialSubject.PatientID'] - } - ] - } - } - ] - }, - type: () => [ProofRequestPresentationDefinition] - }) - @IsOptional() - @ValidateNested() - @IsObject({ message: 'presentationDefinition must be an object' }) - @IsNotEmpty({ message: 'presentationDefinition must not be empty' }) - @Type(() => ProofRequestPresentationDefinition) - presentationDefinition?:ProofRequestPresentationDefinition; - - @ApiPropertyOptional() - @IsOptional() - @IsString({ message: 'comment must be in string' }) - comment: string; - - type:ProofRequestType; - - orgId: string; - - @ApiPropertyOptional({enum:AutoAccept}) - @IsString({ message: 'auto accept proof must be in string' }) - @IsNotEmpty({ message: 'please provide valid auto accept proof' }) - @IsOptional() - @IsEnum(AutoAccept, { - message: `Invalid auto accept proof. It should be one of: ${Object.values(AutoAccept).join(', ')}` - }) - autoAcceptProof: AutoAccept; - version: string; + @IsObject({ message: 'presentationDefinition must be an object' }) + @IsNotEmpty({ message: 'presentationDefinition must not be empty' }) + @Type(() => ProofRequestPresentationDefinition) + presentationDefinition?: ProofRequestPresentationDefinition; + + @ApiPropertyOptional() + @IsOptional() + @IsString({ message: 'comment must be in string' }) + comment: string; + + type: ProofRequestType; + + orgId: string; + + @ApiPropertyOptional({ enum: AutoAccept }) + @IsString({ message: 'auto accept proof must be in string' }) + @IsNotEmpty({ message: 'please provide valid auto accept proof' }) + @IsOptional() + @IsEnum(AutoAccept, { + message: `Invalid auto accept proof. It should be one of: ${Object.values(AutoAccept).join(', ')}` + }) + autoAcceptProof: AutoAccept; + version: string; } export class RequestProofDtoV1 extends RequestProofDtoBase { @ApiProperty({ example: '32f54163-7166-48f1-93d8-ff217bdb0653' - }) - @IsNotEmpty({ message: 'connectionId is required' }) - @IsString({ message: 'connectionId must be a string' }) - @IsUUID() - connectionId:string; + }) + @IsNotEmpty({ message: 'connectionId is required' }) + @IsString({ message: 'connectionId must be a string' }) + @IsUUID() + connectionId: string; } - export class RequestProofDtoV2 extends RequestProofDtoBase { @ApiProperty({ example: ['32f54163-7166-48f1-93d8-ff217bdb0653'] - }) + }) @IsNotEmpty({ each: true, message: 'connectionId array elements must not be empty' }) @IsArray({ message: 'connectionId must be an array' }) @ArrayMinSize(1, { message: 'connectionId must contain at least 1 element' }) - @ArrayMaxSize(Number(process.env.PROOF_REQ_CONN_LIMIT), { message: `Limit reached (${process.env.PROOF_REQ_CONN_LIMIT} connections max).` }) + @ArrayMaxSize(Number(process.env.PROOF_REQ_CONN_LIMIT), { + message: `Limit reached (${process.env.PROOF_REQ_CONN_LIMIT} connections max).` + }) @IsUUID('all', { each: true, message: 'Each connectionId must be a valid UUID' }) connectionId: string[]; } - export class OutOfBandRequestProof extends ProofPayload { - @ApiProperty({ - 'example': [ - { - attributeName: 'attributeName', - condition: '>=', - value: 'predicates', - credDefId: '', - schemaId: '' - } - ], - type: () => [ProofRequestAttribute] - }) - @IsArray({ message: 'attributes must be in array' }) - @ValidateNested({ each: true }) - @IsObject({ each: true }) - @IsNotEmpty({ message: 'please provide valid attributes' }) - @Type(() => ProofRequestAttribute) - attributes: ProofRequestAttribute[]; - - @ApiProperty() - @IsEmail({}, { message: 'Please provide a valid email' }) - @IsNotEmpty({ message: 'Email is required' }) - @Transform(({ value }) => trim(value)) - @IsString({ each: true, message: 'Each emailId in the array should be a string' }) - @IsOptional() - emailId?: string | string[]; - - @ApiProperty() - @IsOptional() - comment: string; - orgId: string; - - @ApiPropertyOptional() - @IsString({ message: 'auto accept proof must be in string' }) - @IsNotEmpty({ message: 'please provide valid auto accept proof' }) - @IsOptional() - @IsEnum(AutoAccept, { - message: `Invalid auto accept proof. It should be one of: ${Object.values(AutoAccept).join(', ')}` - }) - autoAcceptProof: string; + @ApiProperty({ + example: [ + { + attributeName: 'attributeName', + condition: '>=', + value: 'predicates', + credDefId: '', + schemaId: '' + } + ], + type: () => [ProofRequestAttribute] + }) + @IsArray({ message: 'attributes must be in array' }) + @ValidateNested({ each: true }) + @IsObject({ each: true }) + @IsNotEmpty({ message: 'please provide valid attributes' }) + @Type(() => ProofRequestAttribute) + attributes: ProofRequestAttribute[]; + + @ApiProperty() + @IsEmail({}, { message: 'Please provide a valid email' }) + @IsNotEmpty({ message: 'Email is required' }) + @Transform(({ value }) => trim(value)) + @IsString({ each: true, message: 'Each emailId in the array should be a string' }) + @IsOptional() + emailId?: string | string[]; + + @ApiProperty() + @IsOptional() + comment: string; + orgId: string; + + @ApiPropertyOptional() + @IsString({ message: 'auto accept proof must be in string' }) + @IsNotEmpty({ message: 'please provide valid auto accept proof' }) + @IsOptional() + @IsEnum(AutoAccept, { + message: `Invalid auto accept proof. It should be one of: ${Object.values(AutoAccept).join(', ')}` + }) + autoAcceptProof: string; } export class SendProofRequestPayload { + @ApiPropertyOptional() + @IsOptional() + @IsNotEmpty({ message: 'Please provide valid goal code' }) + @IsString({ message: 'goal code should be string' }) + goalCode?: string; - @ApiPropertyOptional() - @IsOptional() - @IsNotEmpty({ message: 'Please provide valid goal code' }) - @IsString({ message: 'goal code should be string' }) - goalCode?: string; - - @ApiPropertyOptional() - @IsString({ message: 'protocolVersion must be in string' }) - @IsNotEmpty({ message: 'please provide valid protocol version' }) - @IsOptional() - protocolVersion: string; - - @ApiPropertyOptional() - @IsOptional() - @IsString({ message: 'comment must be in string' }) - comment: string; - - @ApiProperty({ - 'example': { - indy: { - name: 'Verify national identity', - version: '1.0', - // eslint-disable-next-line camelcase - requested_attributes: { - verifynameAddress: { - names: ['name', 'address'], - restrictions: [{ 'schema_id': 'KU583UbI4yAKfaBTSz1rqG:2:National ID:1.0.0' }] - }, - verifyBirthPlace: { - name: 'Place', - restrictions: [{ 'schema_id': 'KU583UbI4yAKfaBTSz1rqG:2:Birth Certificate:1.0.0' }] - } - }, - // eslint-disable-next-line camelcase - requested_predicates: {} - } - } - }) - @IsObject({ each: true }) - @IsNotEmpty({ message: 'please provide valid proofFormat' }) - @IsOptional() - proofFormats?: IProofFormats; - - @ApiProperty({ - 'example': + @ApiPropertyOptional() + @IsString({ message: 'protocolVersion must be in string' }) + @IsNotEmpty({ message: 'please provide valid protocol version' }) + @IsOptional() + protocolVersion: string; + + @ApiPropertyOptional() + @IsOptional() + @IsString({ message: 'comment must be in string' }) + comment: string; + + @ApiProperty({ + example: { + indy: { + name: 'Verify national identity', + version: '1.0', + // eslint-disable-next-line camelcase + requested_attributes: { + verifynameAddress: { + names: ['name', 'address'], + restrictions: [{ schema_id: 'KU583UbI4yAKfaBTSz1rqG:2:National ID:1.0.0' }] + }, + verifyBirthPlace: { + name: 'Place', + restrictions: [{ schema_id: 'KU583UbI4yAKfaBTSz1rqG:2:Birth Certificate:1.0.0' }] + } + }, + // eslint-disable-next-line camelcase + requested_predicates: {} + } + } + }) + @IsObject({ each: true }) + @IsNotEmpty({ message: 'please provide valid proofFormat' }) + @IsOptional() + proofFormats?: IProofFormats; + + @ApiProperty({ + example: { + id: '32f54163-7166-48f1-93d8-ff217bdb0653', + purpose: 'Used for KYC verification.', + inputDescriptors: [ + { + id: 'banking_input_1', + name: 'Bank Account Information', + schema: [ { - id: '32f54163-7166-48f1-93d8-ff217bdb0653', - purpose: 'Used for KYC verification.', - inputDescriptors: [ - { - 'id': 'banking_input_1', - 'name': 'Bank Account Information', - 'schema': [ - { - 'uri': 'https://bank-schemas.org/1.0.0/accounts.json' - } - - ], - 'constraints': { - 'fields': [ - { - 'path': ['$.issuer'] - } - ] - } - } - ] - }, - type: () => [ProofRequestPresentationDefinition] - }) - @IsOptional() - @ValidateNested() - @IsObject({ message: 'presentationDefinition must be an object' }) - @IsNotEmpty({ message: 'presentationDefinition must not be empty' }) - @Type(() => ProofRequestPresentationDefinition) - presentationDefinition?:ProofRequestPresentationDefinition; - - type:string; - - @ApiPropertyOptional() - @IsString({ message: 'auto accept proof must be in string' }) - @IsNotEmpty({ message: 'please provide from valid auto accept proof options' }) - @IsOptional() - @IsEnum(AutoAccept, { - message: `Invalid auto accept proof. It should be one of: ${Object.values(AutoAccept).join(', ')}` - }) - autoAcceptProof: AutoAccept; - - @ApiPropertyOptional() - @IsOptional() - @IsString({ message: 'label must be in string' }) - label: string; - - // TODO: [Credo-ts] Issue with parentThreadId in creating an OOB proof request. - // This causes failures in OOB connection establishment. - // @ApiPropertyOptional() - // @IsOptional() - // @IsUUID() - // @IsNotEmpty({ message: 'please provide valid parentThreadId' }) - // parentThreadId: string; - - @ApiProperty({ example: true }) - @IsBoolean() - @IsOptional() - @IsNotEmpty({message:'Please provide the flag for shorten url'}) - isShortenUrl?: boolean; - - @ApiPropertyOptional() - @IsEmail({}, { each: true, message: 'Please provide a valid email' }) - @ArrayNotEmpty({ message: 'Email array must not be empty' }) - @ArrayUnique({ message: 'Duplicate emails are not allowed' }) - @ArrayMaxSize(Number(process.env.OOB_BATCH_SIZE), { message: `Limit reached (${process.env.OOB_BATCH_SIZE} proof request max).` }) - @IsArray() - @IsString({ each: true, message: 'Each emailId in the array should be a string' }) - @IsOptional() - emailId: string[]; - - @ApiPropertyOptional({ default: true }) - @IsOptional() - @IsNotEmpty({ message: 'please provide valid value for reuseConnection' }) - @IsBoolean({ message: 'reuseConnection must be a boolean' }) - reuseConnection?: boolean; + uri: 'https://bank-schemas.org/1.0.0/accounts.json' + } + ], + constraints: { + fields: [ + { + path: ['$.issuer'] + } + ] + } + } + ] + }, + type: () => [ProofRequestPresentationDefinition] + }) + @IsOptional() + @ValidateNested() + @IsObject({ message: 'presentationDefinition must be an object' }) + @IsNotEmpty({ message: 'presentationDefinition must not be empty' }) + @Type(() => ProofRequestPresentationDefinition) + presentationDefinition?: ProofRequestPresentationDefinition; + + type: string; + + @ApiPropertyOptional() + @IsString({ message: 'auto accept proof must be in string' }) + @IsNotEmpty({ message: 'please provide from valid auto accept proof options' }) + @IsOptional() + @IsEnum(AutoAccept, { + message: `Invalid auto accept proof. It should be one of: ${Object.values(AutoAccept).join(', ')}` + }) + autoAcceptProof: AutoAccept; + + @ApiPropertyOptional() + @IsOptional() + @IsString({ message: 'label must be in string' }) + label: string; + + // TODO: [Credo-ts] Issue with parentThreadId in creating an OOB proof request. + // This causes failures in OOB connection establishment. + // @ApiPropertyOptional() + // @IsOptional() + // @IsUUID() + // @IsNotEmpty({ message: 'please provide valid parentThreadId' }) + // parentThreadId: string; + + @ApiProperty({ example: true }) + @IsBoolean() + @IsOptional() + @IsNotEmpty({ message: 'Please provide the flag for shorten url' }) + isShortenUrl?: boolean; + @ApiPropertyOptional() + @IsEmail({}, { each: true, message: 'Please provide a valid email' }) + @ArrayNotEmpty({ message: 'Email array must not be empty' }) + @ArrayUnique({ message: 'Duplicate emails are not allowed' }) + @ArrayMaxSize(Number(process.env.OOB_BATCH_SIZE), { + message: `Limit reached (${process.env.OOB_BATCH_SIZE} proof request max).` + }) + @IsArray() + @IsString({ each: true, message: 'Each emailId in the array should be a string' }) + @IsOptional() + emailId: string[]; + + @ApiPropertyOptional({ default: true }) + @IsOptional() + @IsNotEmpty({ message: 'please provide valid value for reuseConnection' }) + @IsBoolean({ message: 'reuseConnection must be a boolean' }) + reuseConnection?: boolean; } diff --git a/apps/api-gateway/src/verification/enum/index.ts b/apps/api-gateway/src/verification/enum/index.ts new file mode 100644 index 000000000..d9123a85a --- /dev/null +++ b/apps/api-gateway/src/verification/enum/index.ts @@ -0,0 +1 @@ +export * from './verification.enum'; diff --git a/apps/api-gateway/src/verification/index.ts b/apps/api-gateway/src/verification/index.ts new file mode 100644 index 000000000..066177598 --- /dev/null +++ b/apps/api-gateway/src/verification/index.ts @@ -0,0 +1,6 @@ +export * from './verification.controller'; +export * from './verification.module'; +export * from './verification.service'; +export * from './dto'; +export * from './interfaces'; +export * from './enum'; diff --git a/apps/api-gateway/src/verification/interfaces/index.ts b/apps/api-gateway/src/verification/interfaces/index.ts new file mode 100644 index 000000000..63b77648b --- /dev/null +++ b/apps/api-gateway/src/verification/interfaces/index.ts @@ -0,0 +1 @@ +export * from './verification.interface'; diff --git a/apps/api-gateway/src/verification/verification.controller.ts b/apps/api-gateway/src/verification/verification.controller.ts index 9a0258946..78c33b548 100644 --- a/apps/api-gateway/src/verification/verification.controller.ts +++ b/apps/api-gateway/src/verification/verification.controller.ts @@ -34,24 +34,24 @@ import { UnauthorizedErrorDto } from '../dtos/unauthorized-error.dto'; import { ForbiddenErrorDto } from '../dtos/forbidden-error.dto'; import { SendProofRequestPayload, RequestProofDtoV1, RequestProofDtoV2 } from './dto/request-proof.dto'; import { VerificationService } from './verification.service'; -import IResponseType, { IResponse } from '@credebl/common/interfaces/response.interface'; +import { IResponseType, IResponse } from '@credebl/common'; import { Response } from 'express'; -import { ResponseMessages } from '@credebl/common/response-messages'; -import { IUserRequest } from '@credebl/user-request/user-request.interface'; +import { ResponseMessages } from '@credebl/common'; +import { IUserRequest } from '@credebl/user-management'; import { Roles } from '../authz/decorators/roles.decorator'; -import { OrgRoles } from 'libs/org-roles/enums'; +import { OrgRoles } from '@credebl/common'; import { AuthGuard } from '@nestjs/passport'; import { OrgRolesGuard } from '../authz/guards/org-roles.guard'; import { WebhookPresentationProofDto } from './dto/webhook-proof.dto'; -import { CustomExceptionFilter } from 'apps/api-gateway/common/exception-handler'; +import { CustomExceptionFilter } from '../common'; import { User } from '../authz/decorators/user.decorator'; import { GetAllProofRequestsDto } from './dto/get-all-proof-requests.dto'; import { IProofRequestSearchCriteria } from './interfaces/verification.interface'; import { API_Version, ProofRequestType, SortFields } from './enum/verification.enum'; // eslint-disable-next-line @typescript-eslint/no-unused-vars -import { user } from '@prisma/client'; -import { TrimStringParamPipe } from '@credebl/common/cast.helper'; -import { Validator } from '@credebl/common/validator'; +import { user } from '@credebl/prisma-service'; +import { TrimStringParamPipe } from '@credebl/common'; +import { Validator } from '@credebl/common'; @UseFilters(CustomExceptionFilter) @Controller() diff --git a/apps/api-gateway/src/verification/verification.module.ts b/apps/api-gateway/src/verification/verification.module.ts index 3f8c473af..783a7516d 100644 --- a/apps/api-gateway/src/verification/verification.module.ts +++ b/apps/api-gateway/src/verification/verification.module.ts @@ -1,12 +1,12 @@ import { ClientsModule, Transport } from '@nestjs/microservices'; import { ConfigModule } from '@nestjs/config'; -import { Module } from '@nestjs/common'; +import { DynamicModule, Module, Provider } from '@nestjs/common'; import { VerificationController } from './verification.controller'; import { VerificationService } from './verification.service'; -import { getNatsOptions } from '@credebl/common/nats.config'; -import { CommonConstants } from '@credebl/common/common.constant'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { getNatsOptions } from '@credebl/common'; +import { CommonConstants } from '@credebl/common'; +import { NATSClient } from '@credebl/common'; @Module({ imports: [ @@ -22,4 +22,29 @@ import { NATSClient } from '@credebl/common/NATSClient'; controllers: [VerificationController], providers: [VerificationService, NATSClient] }) -export class VerificationModule {} +export class VerificationModule { + static register( + overrides: Provider[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + controllerOverrides: any[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + importedModules: any[] = [] + ): DynamicModule { + return { + module: VerificationModule, + imports: [ + ConfigModule.forRoot(), + ClientsModule.register([ + { + name: 'NATS_CLIENT', + transport: Transport.NATS, + options: getNatsOptions(CommonConstants.VERIFICATION_SERVICE, process.env.API_GATEWAY_NKEY_SEED) + } + ]), + ...importedModules + ], + controllers: controllerOverrides.length ? controllerOverrides : [VerificationController], + providers: [VerificationService, ...overrides] + }; + } +} diff --git a/apps/api-gateway/src/verification/verification.service.ts b/apps/api-gateway/src/verification/verification.service.ts index d312967ce..97ed705df 100644 --- a/apps/api-gateway/src/verification/verification.service.ts +++ b/apps/api-gateway/src/verification/verification.service.ts @@ -1,19 +1,15 @@ import { Injectable, Inject } from '@nestjs/common'; import { ClientProxy } from '@nestjs/microservices'; -import { BaseService } from 'libs/service/base.service'; +import { BaseService } from '@credebl/common'; import { SendProofRequestPayload, RequestProofDtoV1, RequestProofDtoV2 } from './dto/request-proof.dto'; -import { IUserRequest } from '@credebl/user-request/user-request.interface'; +import { IUserRequest } from '@credebl/user-management'; import { WebhookPresentationProofDto } from './dto/webhook-proof.dto'; -import { - IProofPresentationDetails, - IProofPresentationList, - IVerificationRecords -} from '@credebl/common/interfaces/verification.interface'; +import { IProofPresentationDetails, IProofPresentationList, IVerificationRecords } from '@credebl/common'; import { IPresentation, IProofRequest, IProofRequestSearchCriteria } from './interfaces/verification.interface'; import { IProofPresentation } from './interfaces/verification.interface'; // To do make a similar interface in API-gateway -import { user } from '@prisma/client'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { user } from '@credebl/prisma-service'; +import { NATSClient } from '@credebl/common'; @Injectable() export class VerificationService extends BaseService { diff --git a/apps/api-gateway/src/webhook/dtos/get-webhoook-dto.ts b/apps/api-gateway/src/webhook/dtos/get-webhoook-dto.ts index 846225df0..3c6c0df60 100644 --- a/apps/api-gateway/src/webhook/dtos/get-webhoook-dto.ts +++ b/apps/api-gateway/src/webhook/dtos/get-webhoook-dto.ts @@ -1,21 +1,20 @@ import { ApiExtraModels, ApiPropertyOptional } from '@nestjs/swagger'; import { IsOptional, IsString, IsUUID } from 'class-validator'; import { Transform } from 'class-transformer'; -import { trim } from '@credebl/common/cast.helper'; +import { trim } from '@credebl/common'; @ApiExtraModels() export class GetWebhookDto { + @ApiPropertyOptional({ example: '2a041d6e-d24c-4ed9-b011-1cfc371a8b8e' }) + @IsOptional() + @Transform(({ value }) => trim(value)) + @IsString({ message: 'Organization id must be in string format.' }) + orgId?: string; - @ApiPropertyOptional({example: '2a041d6e-d24c-4ed9-b011-1cfc371a8b8e'}) - @IsOptional() - @Transform(({ value }) => trim(value)) - @IsString({ message: 'Organization id must be in string format.' }) - orgId?: string; - - @ApiPropertyOptional({example: '3a041d6e-d24c-4ed9-b011-1cfc371a8b8e'}) - @IsOptional() - @Transform(({ value }) => trim(value)) - @IsUUID('4', { message: 'Please provide valid tenantId' }) - @IsString({ message: 'Tenant id must be in string format.' }) - tenantId?: string; -} \ No newline at end of file + @ApiPropertyOptional({ example: '3a041d6e-d24c-4ed9-b011-1cfc371a8b8e' }) + @IsOptional() + @Transform(({ value }) => trim(value)) + @IsUUID('4', { message: 'Please provide valid tenantId' }) + @IsString({ message: 'Tenant id must be in string format.' }) + tenantId?: string; +} diff --git a/apps/api-gateway/src/webhook/dtos/index.ts b/apps/api-gateway/src/webhook/dtos/index.ts new file mode 100644 index 000000000..421504449 --- /dev/null +++ b/apps/api-gateway/src/webhook/dtos/index.ts @@ -0,0 +1,3 @@ +export * from './get-webhoook-dto'; +export * from './register-webhook-dto'; +export * from './webhook-response-dto'; diff --git a/apps/api-gateway/src/webhook/dtos/register-webhook-dto.ts b/apps/api-gateway/src/webhook/dtos/register-webhook-dto.ts index 4bde261c1..cee0b225a 100644 --- a/apps/api-gateway/src/webhook/dtos/register-webhook-dto.ts +++ b/apps/api-gateway/src/webhook/dtos/register-webhook-dto.ts @@ -1,16 +1,15 @@ -import { trim } from '@credebl/common/cast.helper'; +import { trim } from '@credebl/common'; import { ApiProperty } from '@nestjs/swagger'; import { Transform } from 'class-transformer'; -import { IsNotEmpty, IsString, IsUrl} from 'class-validator'; +import { IsNotEmpty, IsString, IsUrl } from 'class-validator'; export class RegisterWebhookDto { + orgId: string; -orgId: string; - -@ApiProperty() -@Transform(({ value }) => trim(value)) -@IsNotEmpty({ message: 'webhookUrl is required.' }) -@IsString({ message: 'webhookUrl must be in string format.' }) -@IsUrl(undefined, {message:'webhookUrl is not valid'}) -webhookUrl: string; -} \ No newline at end of file + @ApiProperty() + @Transform(({ value }) => trim(value)) + @IsNotEmpty({ message: 'webhookUrl is required.' }) + @IsString({ message: 'webhookUrl must be in string format.' }) + @IsUrl(undefined, { message: 'webhookUrl is not valid' }) + webhookUrl: string; +} diff --git a/apps/api-gateway/src/webhook/dtos/webhook-response-dto.ts b/apps/api-gateway/src/webhook/dtos/webhook-response-dto.ts index 70552b4ca..28162b836 100644 --- a/apps/api-gateway/src/webhook/dtos/webhook-response-dto.ts +++ b/apps/api-gateway/src/webhook/dtos/webhook-response-dto.ts @@ -1,19 +1,18 @@ -import { trim } from '@credebl/common/cast.helper'; +import { trim } from '@credebl/common'; import { ApiProperty } from '@nestjs/swagger'; import { Transform } from 'class-transformer'; import { IsNotEmpty, IsObject, IsString } from 'class-validator'; export class WebhookResponseDto { - -@ApiProperty() -@Transform(({ value }) => trim(value)) -@IsNotEmpty({ message: 'webhookUrl is required' }) -@IsString({ message: 'webhookUrl must be in string format' }) -webhookUrl: string; + @ApiProperty() + @Transform(({ value }) => trim(value)) + @IsNotEmpty({ message: 'webhookUrl is required' }) + @IsString({ message: 'webhookUrl must be in string format' }) + webhookUrl: string; -@ApiProperty() -@Transform(({ value }) => trim(value)) -@IsNotEmpty({ message: 'data is required' }) -@IsObject({ message: 'data must be an object' }) -data:object; -} \ No newline at end of file + @ApiProperty() + @Transform(({ value }) => trim(value)) + @IsNotEmpty({ message: 'data is required' }) + @IsObject({ message: 'data must be an object' }) + data: object; +} diff --git a/apps/api-gateway/src/webhook/index.ts b/apps/api-gateway/src/webhook/index.ts new file mode 100644 index 000000000..30b9a6f37 --- /dev/null +++ b/apps/api-gateway/src/webhook/index.ts @@ -0,0 +1,4 @@ +export * from './webhook.controller'; +export * from './webhook.module'; +// export * from './dtos'; +export * from './webhook.service'; diff --git a/apps/api-gateway/src/webhook/webhook.controller.ts b/apps/api-gateway/src/webhook/webhook.controller.ts index 9481263bb..bc1783ccf 100644 --- a/apps/api-gateway/src/webhook/webhook.controller.ts +++ b/apps/api-gateway/src/webhook/webhook.controller.ts @@ -30,13 +30,13 @@ import { ApiResponseDto } from '../dtos/apiResponse.dto'; import { UnauthorizedErrorDto } from '../dtos/unauthorized-error.dto'; import { ForbiddenErrorDto } from '../dtos/forbidden-error.dto'; import { Response } from 'express'; -import { IResponse } from '@credebl/common/interfaces/response.interface'; +import { IResponse } from '@credebl/common'; import { WebhookService } from './webhook.service'; import { RegisterWebhookDto } from './dtos/register-webhook-dto'; -import { ResponseMessages } from '@credebl/common/response-messages'; -import { CustomExceptionFilter } from 'apps/api-gateway/common/exception-handler'; +import { ResponseMessages } from '@credebl/common'; +import { CustomExceptionFilter } from '../common'; import { OrgRolesGuard } from '../authz/guards/org-roles.guard'; -import { OrgRoles } from 'libs/org-roles/enums'; +import { OrgRoles } from '@credebl/common'; import { Roles } from '../authz/decorators/roles.decorator'; import { GetWebhookDto } from './dtos/get-webhoook-dto'; @@ -46,9 +46,7 @@ import { GetWebhookDto } from './dtos/get-webhoook-dto'; @ApiUnauthorizedResponse({ status: 401, description: 'Unauthorized', type: UnauthorizedErrorDto }) @ApiForbiddenResponse({ status: 403, description: 'Forbidden', type: ForbiddenErrorDto }) export class WebhookController { - constructor( - private readonly webhookService: WebhookService - ) {} + constructor(private readonly webhookService: WebhookService) {} private readonly logger = new Logger('WebhookController'); private readonly PAGE: number = 1; @@ -69,7 +67,15 @@ export class WebhookController { @Roles(OrgRoles.OWNER, OrgRoles.ADMIN) @ApiResponse({ status: HttpStatus.CREATED, description: 'Webhook URL registered successfully', type: ApiResponseDto }) async registerWebhook( - @Param('orgId', new ParseUUIDPipe({ exceptionFactory: (): Error => { throw new BadRequestException(ResponseMessages.organisation.error.invalidOrgId); }})) orgId: string, + @Param( + 'orgId', + new ParseUUIDPipe({ + exceptionFactory: (): Error => { + throw new BadRequestException(ResponseMessages.organisation.error.invalidOrgId); + } + }) + ) + orgId: string, @Body() registerWebhookDto: RegisterWebhookDto, @Res() res: Response ): Promise { @@ -100,11 +106,12 @@ export class WebhookController { @ApiBearerAuth() @UseGuards(AuthGuard('jwt')) @Roles(OrgRoles.OWNER, OrgRoles.ISSUER, OrgRoles.VERIFIER, OrgRoles.ADMIN) - @ApiResponse({ status: HttpStatus.OK, description: 'Webhook URL details retrieved successfully', type: ApiResponseDto }) - async getWebhookUrl( - @Query() getWebhook: GetWebhookDto, - @Res() res: Response - ): Promise { + @ApiResponse({ + status: HttpStatus.OK, + description: 'Webhook URL details retrieved successfully', + type: ApiResponseDto + }) + async getWebhookUrl(@Query() getWebhook: GetWebhookDto, @Res() res: Response): Promise { const webhookUrlData = await this.webhookService.getWebhookUrl(getWebhook); const finalResponse: IResponse = { diff --git a/apps/api-gateway/src/webhook/webhook.module.ts b/apps/api-gateway/src/webhook/webhook.module.ts index 08433c3f9..0acf2ecee 100644 --- a/apps/api-gateway/src/webhook/webhook.module.ts +++ b/apps/api-gateway/src/webhook/webhook.module.ts @@ -1,13 +1,13 @@ import { ClientsModule, Transport } from '@nestjs/microservices'; -import { Module } from '@nestjs/common'; +import { DynamicModule, Module, Provider } from '@nestjs/common'; import { WebhookController } from './webhook.controller'; import { WebhookService } from './webhook.service'; import { CommonService } from '@credebl/common'; import { HttpModule } from '@nestjs/axios'; -import { getNatsOptions } from '@credebl/common/nats.config'; +import { getNatsOptions } from '@credebl/common'; import { AwsService } from '@credebl/aws'; -import { CommonConstants } from '@credebl/common/common.constant'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { CommonConstants } from '@credebl/common'; +import { NATSClient } from '@credebl/common'; @Module({ imports: [ @@ -23,4 +23,29 @@ import { NATSClient } from '@credebl/common/NATSClient'; controllers: [WebhookController], providers: [WebhookService, CommonService, AwsService, NATSClient] }) -export class WebhookModule { } +export class WebhookModule { + static register( + overrides: Provider[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + controllerOverrides: any[] = [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + importedModules: any[] = [] + ): DynamicModule { + return { + module: WebhookModule, + imports: [ + HttpModule, + ClientsModule.register([ + { + name: 'NATS_CLIENT', + transport: Transport.NATS, + options: getNatsOptions(CommonConstants.WEBHOOK_SERVICE, process.env.API_GATEWAY_NKEY_SEED) + } + ]), + ...importedModules + ], + controllers: controllerOverrides.length ? controllerOverrides : [WebhookController], + providers: [WebhookService, CommonService, AwsService, ...overrides] + }; + } +} diff --git a/apps/api-gateway/src/webhook/webhook.service.ts b/apps/api-gateway/src/webhook/webhook.service.ts index aed49bdbd..55e4da714 100644 --- a/apps/api-gateway/src/webhook/webhook.service.ts +++ b/apps/api-gateway/src/webhook/webhook.service.ts @@ -1,29 +1,29 @@ /* eslint-disable camelcase */ import { Injectable, Inject } from '@nestjs/common'; import { ClientProxy } from '@nestjs/microservices'; -import { BaseService } from 'libs/service/base.service'; +import { BaseService } from '@credebl/common'; import { RegisterWebhookDto } from './dtos/register-webhook-dto'; -import { ICreateWebhookUrl, IGetWebhookUrl } from 'apps/webhook/interfaces/webhook.interfaces'; import { GetWebhookDto } from './dtos/get-webhoook-dto'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { ICreateWebhookUrl, IGetWebhookUrl, NATSClient } from '@credebl/common'; @Injectable() export class WebhookService extends BaseService { - constructor(@Inject('NATS_CLIENT') private readonly webhookProxy: ClientProxy, private readonly natsClient : NATSClient) { + constructor( + @Inject('NATS_CLIENT') private readonly webhookProxy: ClientProxy, + private readonly natsClient: NATSClient + ) { super('WebhookService'); } - async getWebhookUrl(getWebhook: GetWebhookDto): Promise { + async getWebhookUrl(getWebhook: GetWebhookDto): Promise { // NATS call return this.natsClient.sendNatsMessage(this.webhookProxy, 'get-webhookurl', getWebhook); } async registerWebhook(registerWebhookDto: RegisterWebhookDto): Promise { - const payload = { registerWebhookDto}; + const payload = { registerWebhookDto }; // NATS call return this.natsClient.sendNatsMessage(this.webhookProxy, 'register-webhook', payload); } - - } diff --git a/apps/api-gateway/test/app.e2e-spec.ts b/apps/api-gateway/test/app.e2e-spec.ts deleted file mode 100644 index 3430c90ea..000000000 --- a/apps/api-gateway/test/app.e2e-spec.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { INestApplication } from '@nestjs/common'; -import * as request from 'supertest'; -import { AppModule } from './../src/app.module'; - -describe('AppController (e2e)', () => { - let app: INestApplication; - - beforeEach(async () => { - const moduleFixture: TestingModule = await Test.createTestingModule({ - imports: [AppModule] - }).compile(); - - app = moduleFixture.createNestApplication(); - await app.init(); - }); - - it('/ (GET)', () => request(app.getHttpServer()) - .get('/') - .expect(200) - .expect('Hello World!')); -}); diff --git a/apps/api-gateway/test/jest-e2e.json b/apps/api-gateway/test/jest-e2e.json deleted file mode 100644 index e9d912f3e..000000000 --- a/apps/api-gateway/test/jest-e2e.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "moduleFileExtensions": ["js", "json", "ts"], - "rootDir": ".", - "testEnvironment": "node", - "testRegex": ".e2e-spec.ts$", - "transform": { - "^.+\\.(t|j)s$": "ts-jest" - } -} diff --git a/apps/api-gateway/tsconfig.app.json b/apps/api-gateway/tsconfig.app.json index 9b222ab12..9c5d9583f 100644 --- a/apps/api-gateway/tsconfig.app.json +++ b/apps/api-gateway/tsconfig.app.json @@ -1,9 +1,9 @@ { - "extends": "../../tsconfig.json", + "extends": "../../tsconfig.build.json", "compilerOptions": { - "declaration": false, - "outDir": "../../dist/apps/api-gateway" + "outDir": "./dist", }, - "include": ["src/**/*"], - "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] -} + "include": [ + "src/" + ] +} \ No newline at end of file diff --git a/apps/api-gateway/tsconfig.json b/apps/api-gateway/tsconfig.json new file mode 100644 index 000000000..00a0489f4 --- /dev/null +++ b/apps/api-gateway/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "../../tsconfig.json", + "include": [ + "src/**/*" + ] +} \ No newline at end of file diff --git a/apps/cloud-wallet/index.ts b/apps/cloud-wallet/index.ts new file mode 100644 index 000000000..d1e9a4766 --- /dev/null +++ b/apps/cloud-wallet/index.ts @@ -0,0 +1,2 @@ +// export * from './src/bootstrap'; +export * from './src' \ No newline at end of file diff --git a/apps/cloud-wallet/src/cloud-wallet.module.ts b/apps/cloud-wallet/src/cloud-wallet.module.ts index 32f733734..24bee1659 100644 --- a/apps/cloud-wallet/src/cloud-wallet.module.ts +++ b/apps/cloud-wallet/src/cloud-wallet.module.ts @@ -4,13 +4,13 @@ import { CloudWalletService } from './cloud-wallet.service'; import { ClientsModule, Transport } from '@nestjs/microservices'; import { CommonModule } from '@credebl/common'; import { CacheModule } from '@nestjs/cache-manager'; -import { getNatsOptions } from '@credebl/common/nats.config'; +import { getNatsOptions } from '@credebl/common/nats/nats.config'; import { PrismaService } from '@credebl/prisma-service'; import { CloudWalletRepository } from './cloud-wallet.repository'; import { GlobalConfigModule } from '@credebl/config/global-config.module'; import { LoggerModule } from '@credebl/logger/logger.module'; import { ConfigModule as PlatformConfig } from '@credebl/config/config.module'; -import { ContextInterceptorModule } from '@credebl/context/contextInterceptorModule'; +import { ContextInterceptorModule } from '@credebl/common/utils/context/contextInterceptorModule'; import { MICRO_SERVICE_NAME } from '@credebl/common/common.constant'; @Module({ diff --git a/apps/cloud-wallet/src/cloud-wallet.repository.ts b/apps/cloud-wallet/src/cloud-wallet.repository.ts index cbf63f788..046236dec 100644 --- a/apps/cloud-wallet/src/cloud-wallet.repository.ts +++ b/apps/cloud-wallet/src/cloud-wallet.repository.ts @@ -1,6 +1,6 @@ import { Injectable, Logger } from '@nestjs/common'; import { PrismaService } from '@credebl/prisma-service'; -import { CloudWalletType } from '@credebl/enum/enum'; +import { CloudWalletType } from '@credebl/common/enum/enum'; // eslint-disable-next-line camelcase import { cloud_wallet_user_info, user } from '@prisma/client'; import { ICloudWalletDetails, IGetStoredWalletInfo, IStoredWalletDetails, IStoreWalletInfo } from '@credebl/common/interfaces/cloud-wallet.interface'; diff --git a/apps/cloud-wallet/src/cloud-wallet.service.ts b/apps/cloud-wallet/src/cloud-wallet.service.ts index 5dcd378c1..62606a58f 100644 --- a/apps/cloud-wallet/src/cloud-wallet.service.ts +++ b/apps/cloud-wallet/src/cloud-wallet.service.ts @@ -38,8 +38,8 @@ import { IBasicMessageDetails } from '@credebl/common/interfaces/cloud-wallet.interface'; import { CloudWalletRepository } from './cloud-wallet.repository'; -import { ResponseMessages } from '@credebl/common/response-messages'; -import { CloudWalletType } from '@credebl/enum/enum'; +import { ResponseMessages } from '@credebl/common/utils/response-messages'; +import { CloudWalletType } from '@credebl/common/enum/enum'; import { CommonConstants } from '@credebl/common/common.constant'; @Injectable() diff --git a/apps/cloud-wallet/src/index.ts b/apps/cloud-wallet/src/index.ts new file mode 100644 index 000000000..4a9f98df1 --- /dev/null +++ b/apps/cloud-wallet/src/index.ts @@ -0,0 +1,5 @@ +export * from './cloud-wallet.controller'; +export * from './cloud-wallet.module'; +export * from './cloud-wallet.repository'; +export * from './cloud-wallet.service'; +export * from './main'; diff --git a/apps/cloud-wallet/src/main.ts b/apps/cloud-wallet/src/main.ts index c6abbdb1c..3fe1ba77f 100644 --- a/apps/cloud-wallet/src/main.ts +++ b/apps/cloud-wallet/src/main.ts @@ -1,11 +1,11 @@ import { NestFactory } from '@nestjs/core'; import { CloudWalletModule } from './cloud-wallet.module'; -import { HttpExceptionFilter } from 'libs/http-exception.filter'; +import { HttpExceptionFilter } from '@credebl/common/utils/handlers/http-exception.filter'; import { Logger } from '@nestjs/common'; import { MicroserviceOptions, Transport } from '@nestjs/microservices'; -import { getNatsOptions } from '@credebl/common/nats.config'; +import { getNatsOptions } from '@credebl/common/nats/nats.config'; import { CommonConstants } from '@credebl/common/common.constant'; -import NestjsLoggerServiceAdapter from '@credebl/logger/nestjsLoggerServiceAdapter'; +import { NestjsLoggerServiceAdapter } from '@credebl/logger/nestjsLoggerServiceAdapter'; const logger = new Logger(); diff --git a/apps/cloud-wallet/tsconfig.app.json b/apps/cloud-wallet/tsconfig.app.json index 0788dd2e8..79d123a19 100644 --- a/apps/cloud-wallet/tsconfig.app.json +++ b/apps/cloud-wallet/tsconfig.app.json @@ -1,8 +1,8 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "declaration": false, - "outDir": "../../dist/apps/cloud-wallet" + + "outDir": "./dist/apps/", //cloud-wallet/" }, "include": ["src/**/*"], "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] diff --git a/apps/connection/package.json b/apps/connection/package.json new file mode 100644 index 000000000..0e58ff20a --- /dev/null +++ b/apps/connection/package.json @@ -0,0 +1,31 @@ +{ + "name": "@credebl/connection-service", + "version": "2.0.0", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "license": "Apache-2.0", + "files": [ + "dist" + ], + "scripts": { + "build": "pnpm run clean && pnpm run compile", + "clean": "rimraf ./dist", + "compile": "tsc -p tsconfig.app.json", + "generate": "npx prisma generate --schema=node_modules/@credebl/prisma-service/prisma/schema.prisma", + "cleanup": "rm -rf node_modules dist pnpm-lock.yaml && rm -rf ~/.cache/prisma ~/.pnpm-store", + "start": "ts-node src/main.ts" + }, + "dependencies": { + "@credebl/common": "file:../../credebl-common-2.0.0.tgz", + "@credebl/logger": "file:../../credebl-logger-2.0.0.tgz", + "@credebl/prisma-service": "file:../../credebl-prisma-service-2.0.0.tgz", + "@credebl/user-management": "file:../../credebl-user-management-2.0.0.tgz", + "@nestjs/cache-manager": "^2.3.0", + "@nestjs/common": "^10.4.20", + "@nestjs/core": "^10.4.20", + "@nestjs/microservices": "^10.4.20", + "cache-manager": "^5.7.6", + "nats": "^2.29.3", + "rxjs": "^7.8.2" + } +} \ No newline at end of file diff --git a/apps/connection/src/bootstrap.ts b/apps/connection/src/bootstrap.ts new file mode 100644 index 000000000..0cd58cfe8 --- /dev/null +++ b/apps/connection/src/bootstrap.ts @@ -0,0 +1,32 @@ +import { NestFactory } from '@nestjs/core'; +import { ConnectionModule } from './connection.module'; +import { HttpExceptionFilter } from '@credebl/common'; +import { Logger } from '@nestjs/common'; +import { MicroserviceOptions, Transport } from '@nestjs/microservices'; +import { getNatsOptions } from '@credebl/common'; +import { CommonConstants } from '@credebl/common'; +import { NestjsLoggerServiceAdapter } from '@credebl/logger'; +import type { Provider } from '@nestjs/common'; + +const logger = new Logger(); + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export async function bootstrapConnectionService( + providers: Provider[] = [], + controllers: any[] = [], + imports: any[] = [] +): Promise { + const app = await NestFactory.createMicroservice( + ConnectionModule.register(providers, controllers, imports), + { + transport: Transport.NATS, + options: getNatsOptions(CommonConstants.CONNECTION_SERVICE, process.env.CONNECTION_NKEY_SEED) + } + ); + + app.useLogger(app.get(NestjsLoggerServiceAdapter)); + app.useGlobalFilters(new HttpExceptionFilter()); + + await app.listen(); + logger.log('Connection-Service Microservice is listening to NATS'); +} diff --git a/apps/connection/src/connection.controller.ts b/apps/connection/src/connection.controller.ts index 0cc2e63d7..e60e18f54 100644 --- a/apps/connection/src/connection.controller.ts +++ b/apps/connection/src/connection.controller.ts @@ -11,14 +11,21 @@ import { IReceiveInvitationByUrlOrg, IReceiveInvitationResponse } from './interfaces/connection.interfaces'; -import { IConnectionList, IDeletedConnectionsRecord } from '@credebl/common/interfaces/connection.interface'; -import { IConnectionDetailsById } from 'apps/api-gateway/src/interfaces/IConnectionSearch.interface'; -import { IQuestionPayload } from './interfaces/messaging.interfaces'; -import { user } from '@prisma/client'; +import { IConnectionList, IDeletedConnectionsRecord } from '@credebl/common'; +import { IQuestionPayload, IConnectionDetailsById } from './interfaces'; +import { user } from '@credebl/prisma-service'; @Controller() export class ConnectionController { constructor(private readonly connectionService: ConnectionService) {} + /** + * Receive hello message + */ + @MessagePattern('get-hello') + async getHello(): Promise { + return this.connectionService.getSomelogs(); + } + /** * Receive connection webhook responses and save details in connection table * @param orgId @@ -47,14 +54,14 @@ export class ConnectionController { @MessagePattern({ cmd: 'get-all-agent-connection-list' }) async getConnectionListFromAgent(payload: GetAllConnections): Promise { - const {orgId, connectionSearchCriteria } = payload; + const { orgId, connectionSearchCriteria } = payload; return this.connectionService.getAllConnectionListFromAgent(orgId, connectionSearchCriteria); } /** - * + * * @param connectionId - * @param orgId + * @param orgId * @returns connection details by connection Id */ @MessagePattern({ cmd: 'get-connection-details-by-connectionId' }) @@ -64,7 +71,7 @@ export class ConnectionController { } @MessagePattern({ cmd: 'get-connection-records' }) - async getConnectionRecordsByOrgId(payload: { orgId: string, userId: string }): Promise { + async getConnectionRecordsByOrgId(payload: { orgId: string; userId: string }): Promise { const { orgId } = payload; return this.connectionService.getConnectionRecords(orgId); } @@ -80,7 +87,7 @@ export class ConnectionController { const { user, receiveInvitation, orgId } = payload; return this.connectionService.receiveInvitation(user, receiveInvitation, orgId); } - + @MessagePattern({ cmd: 'send-question' }) async sendQuestion(payload: IQuestionPayload): Promise { return this.connectionService.sendQuestion(payload); @@ -97,13 +104,13 @@ export class ConnectionController { } @MessagePattern({ cmd: 'delete-connection-records' }) - async deleteConnectionRecords(payload: {orgId: string, userDetails: user}): Promise { + async deleteConnectionRecords(payload: { orgId: string; userDetails: user }): Promise { const { orgId, userDetails } = payload; return this.connectionService.deleteConnectionRecords(orgId, userDetails); } @MessagePattern({ cmd: 'send-basic-message-on-connection' }) - async sendBasicMessage(payload: {content: string, orgId: string, connectionId: string}): Promise { + async sendBasicMessage(payload: { content: string; orgId: string; connectionId: string }): Promise { return this.connectionService.sendBasicMesage(payload); } } diff --git a/apps/connection/src/connection.module.ts b/apps/connection/src/connection.module.ts index 4823f6dfd..d861eca6a 100644 --- a/apps/connection/src/connection.module.ts +++ b/apps/connection/src/connection.module.ts @@ -1,5 +1,5 @@ /* eslint-disable array-bracket-spacing */ -import { Logger, Module } from '@nestjs/common'; +import { Logger, Module, Provider } from '@nestjs/common'; import { ConnectionController } from './connection.controller'; import { ConnectionService } from './connection.service'; import { ClientsModule, Transport } from '@nestjs/microservices'; @@ -7,32 +7,69 @@ import { CommonModule } from '@credebl/common'; import { ConnectionRepository } from './connection.repository'; import { PrismaService } from '@credebl/prisma-service'; import { CacheModule } from '@nestjs/cache-manager'; -import { getNatsOptions } from '@credebl/common/nats.config'; -import { UserActivityRepository } from 'libs/user-activity/repositories'; -import { CommonConstants } from '@credebl/common/common.constant'; +import { getNatsOptions } from '@credebl/common'; +import { UserActivityRepository } from '@credebl/user-management'; +import { CommonConstants } from '@credebl/common'; // import { nkeyAuthenticator } from 'nats'; -import { GlobalConfigModule } from '@credebl/config/global-config.module'; -import { ConfigModule as PlatformConfig } from '@credebl/config/config.module'; -import { LoggerModule } from '@credebl/logger/logger.module'; -import { ContextInterceptorModule } from '@credebl/context/contextInterceptorModule'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { GlobalConfigModule } from '@credebl/logger'; +import { ConfigModule as PlatformConfig } from '@credebl/logger'; +import { LoggerModule } from '@credebl/logger'; +import { ContextInterceptorModule } from '@credebl/common'; +import { NATSClient } from '@credebl/common'; +import { DynamicModule } from '@nestjs/common'; -@Module({ - imports: [ - ClientsModule.register([ - { - name: 'NATS_CLIENT', - transport: Transport.NATS, - options: getNatsOptions(CommonConstants.CONNECTION_SERVICE, process.env.CONNECTION_NKEY_SEED) - } - ]), +// @Module({ +// imports: [ +// ClientsModule.register([ +// { +// name: 'NATS_CLIENT', +// transport: Transport.NATS, +// options: getNatsOptions(CommonConstants.CONNECTION_SERVICE, process.env.CONNECTION_NKEY_SEED) +// } +// ]), - CommonModule, - GlobalConfigModule, - LoggerModule, PlatformConfig, ContextInterceptorModule, - CacheModule.register() - ], - controllers: [ConnectionController], - providers: [ConnectionService, ConnectionRepository, UserActivityRepository, PrismaService, Logger, NATSClient] -}) -export class ConnectionModule { } +// CommonModule, +// GlobalConfigModule, +// LoggerModule, PlatformConfig, ContextInterceptorModule, +// CacheModule.register() +// ], +// controllers: [ConnectionController], +// providers: [ConnectionService, ConnectionRepository, UserActivityRepository, PrismaService, Logger, NATSClient] +// }) + +@Module({}) +export class ConnectionModule { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + static register(overrides: Provider[] = [], controllers: any[] = [], imports: any[] = []): DynamicModule { + return { + module: ConnectionModule, + imports: [ + ClientsModule.register([ + { + name: 'NATS_CLIENT', + transport: Transport.NATS, + options: getNatsOptions(CommonConstants.CONNECTION_SERVICE, process.env.CONNECTION_NKEY_SEED) + } + ]), + CommonModule, + GlobalConfigModule, + LoggerModule, + PlatformConfig, + ContextInterceptorModule, + CacheModule.register(), + ...imports + ], + controllers: controllers.length ? controllers : [ConnectionController], + providers: [ + ConnectionService, + ConnectionRepository, + UserActivityRepository, + PrismaService, + Logger, + NATSClient, + ...overrides + ], + exports: [ConnectionService] + }; + } +} diff --git a/apps/connection/src/connection.repository.ts b/apps/connection/src/connection.repository.ts index ec43c8385..7f4bb2590 100644 --- a/apps/connection/src/connection.repository.ts +++ b/apps/connection/src/connection.repository.ts @@ -1,12 +1,12 @@ import { Injectable, Logger, ConflictException } from '@nestjs/common'; import { PrismaService } from '@credebl/prisma-service'; // eslint-disable-next-line camelcase -import { agent_invitations, org_agents, platform_config, shortening_url } from '@prisma/client'; +import { agent_invitations, org_agents, platform_config, shortening_url } from '@credebl/prisma-service'; import { IConnectionSearchCriteria, ICreateConnection, OrgAgent } from './interfaces/connection.interfaces'; -import { IUserRequest } from '@credebl/user-request/user-request.interface'; -import { IConnectionsListCount, IDeletedConnectionsRecord } from '@credebl/common/interfaces/connection.interface'; -import { PrismaTables, SortValue } from '@credebl/enum/enum'; -import { ResponseMessages } from '@credebl/common/response-messages'; +import { IUserRequest } from '@credebl/user-management'; +import { IConnectionsListCount, IDeletedConnectionsRecord } from '@credebl/common'; +import { PrismaTables, SortValue } from '@credebl/common'; +import { ResponseMessages } from '@credebl/common'; // import { OrgAgent } from './interfaces/connection.interfaces'; @Injectable() export class ConnectionRepository { @@ -90,7 +90,6 @@ export class ConnectionRepository { } } - async getConnectionRecordsCount(orgId: string): Promise { try { const connectionRecordsCount = await this.prisma.connections.count({ @@ -105,7 +104,6 @@ export class ConnectionRepository { } } - /** * Description: Save connection details * @param connectionInvitation @@ -333,7 +331,7 @@ export class ConnectionRepository { if (0 < referencedTables.length) { let errorMessage = `Organization ID ${orgId} is referenced in the following table(s): ${referencedTables.join(', ')}`; - + if (1 === referencedTables.length) { if (referencedTables.includes(`${PrismaTables.PRESENTATIONS}`)) { errorMessage += `, ${ResponseMessages.verification.error.removeVerificationData}`; @@ -343,34 +341,31 @@ export class ConnectionRepository { } else if (2 === referencedTables.length) { errorMessage += `, ${ResponseMessages.connection.error.removeConnectionReferences}`; } - + throw new ConflictException(errorMessage); } - - const getConnectionRecords = await prisma.connections.findMany( - { - where: { - orgId - }, - select: { - createDateTime: true, - createdBy: true, - connectionId: true, - theirLabel: true, - state: true, - orgId: true - } - }); + const getConnectionRecords = await prisma.connections.findMany({ + where: { + orgId + }, + select: { + createDateTime: true, + createdBy: true, + connectionId: true, + theirLabel: true, + state: true, + orgId: true + } + }); - const deleteConnectionRecords = await prisma.connections.deleteMany( - { - where: { - orgId - } - }); + const deleteConnectionRecords = await prisma.connections.deleteMany({ + where: { + orgId + } + }); - return {getConnectionRecords, deleteConnectionRecords }; + return { getConnectionRecords, deleteConnectionRecords }; }); } catch (error) { this.logger.error(`Error in deleting connection records: ${error.message}`); @@ -378,8 +373,8 @@ export class ConnectionRepository { } } - // eslint-disable-next-line camelcase - async getInvitationDidByOrgId(orgId: string): Promise { + // eslint-disable-next-line camelcase + async getInvitationDidByOrgId(orgId: string): Promise { try { return this.prisma.agent_invitations.findMany({ where: { diff --git a/apps/connection/src/connection.service.ts b/apps/connection/src/connection.service.ts index 0efa7a8bf..6f1f99138 100644 --- a/apps/connection/src/connection.service.ts +++ b/apps/connection/src/connection.service.ts @@ -1,6 +1,6 @@ /* eslint-disable camelcase */ import { CommonService } from '@credebl/common'; -import { CommonConstants } from '@credebl/common/common.constant'; +import { CommonConstants } from '@credebl/common'; import { HttpException, HttpStatus, Inject, Injectable, Logger, NotFoundException } from '@nestjs/common'; import { ClientProxy, RpcException } from '@nestjs/microservices'; import { from, map } from 'rxjs'; @@ -14,20 +14,21 @@ import { IReceiveInvitationUrl, ICreateOutOfbandConnectionInvitation, ICreateConnectionInvitation -} from './interfaces/connection.interfaces'; +} from './interfaces'; import { ConnectionRepository } from './connection.repository'; -import { ResponseMessages } from '@credebl/common/response-messages'; -import { IUserRequest } from '@credebl/user-request/user-request.interface'; -import { OrgAgentType, ConnectionProcessState } from '@credebl/enum/enum'; +import { ResponseMessages } from '@credebl/common'; +import { IUserRequest } from '@credebl/user-management'; +import { OrgAgentType, ConnectionProcessState } from '@credebl/common'; import { Cache } from 'cache-manager'; import { CACHE_MANAGER } from '@nestjs/cache-manager'; -import { IConnectionList, ICreateConnectionUrl, IDeletedConnectionsRecord } from '@credebl/common/interfaces/connection.interface'; -import { IConnectionDetailsById } from 'apps/api-gateway/src/interfaces/IConnectionSearch.interface'; -import { IBasicMessage, IQuestionPayload } from './interfaces/messaging.interfaces'; -import { RecordType, user } from '@prisma/client'; -import { UserActivityRepository } from 'libs/user-activity/repositories'; -import { agent_invitations } from '@prisma/client'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { IConnectionList, ICreateConnectionUrl, IDeletedConnectionsRecord } from '@credebl/common'; +// import { IConnectionDetailsById } from '../../api-gateway/src/interfaces/IConnectionSearch.interface'; +import { IBasicMessage, IQuestionPayload, IConnectionDetailsById } from './interfaces'; +import { UserActivityRepository } from '@credebl/user-management'; +import { agent_invitations, RecordType } from '@credebl/prisma-service'; +import type { user } from '@credebl/prisma-service'; +import { NATSClient } from '@credebl/common'; + @Injectable() export class ConnectionService { constructor( @@ -37,9 +38,16 @@ export class ConnectionService { private readonly userActivityRepository: UserActivityRepository, private readonly logger: Logger, @Inject(CACHE_MANAGER) private readonly cacheService: Cache, - private readonly natsClient : NATSClient + private readonly natsClient: NATSClient ) {} + getSomelogs(): string { + const msg = 'This is from @credebl/connection-service'; + // eslint-disable-next-line no-console + console.log(msg); + return msg; + } + /** * Description: Catch connection webhook responses and save details in connection table * @param orgId @@ -98,7 +106,6 @@ export class ConnectionService { try { return await this.connectionRepository.getConnectionRecordsCount(orgId); } catch (error) { - this.logger.error( `[getConnectionRecords ] [NATS call]- error in get connection records count : ${JSON.stringify(error)}` ); @@ -384,10 +391,10 @@ export class ConnectionService { orgAgentType === OrgAgentType.DEDICATED ? `${agentEndPoint}${CommonConstants.URL_SEND_QUESTION}`.replace('#', connectionId) : orgAgentType === OrgAgentType.SHARED - ? `${agentEndPoint}${CommonConstants.URL_SHAGENT_SEND_QUESTION}` - .replace('#', connectionId) - .replace('@', tenantId) - : null; + ? `${agentEndPoint}${CommonConstants.URL_SHAGENT_SEND_QUESTION}` + .replace('#', connectionId) + .replace('@', tenantId) + : null; break; } @@ -396,8 +403,8 @@ export class ConnectionService { orgAgentType === OrgAgentType.DEDICATED ? `${agentEndPoint}${CommonConstants.URL_QUESTION_ANSWER_RECORD}` : orgAgentType === OrgAgentType.SHARED - ? `${agentEndPoint}${CommonConstants.URL_SHAGENT_QUESTION_ANSWER_RECORD}`.replace('#', tenantId) - : null; + ? `${agentEndPoint}${CommonConstants.URL_SHAGENT_QUESTION_ANSWER_RECORD}`.replace('#', tenantId) + : null; break; } @@ -475,8 +482,7 @@ export class ConnectionService { message: customErrorMessage, error: ResponseMessages.errorMessages.conflict }); - } else - if (error?.response?.error?.reason) { + } else if (error?.response?.error?.reason) { throw new RpcException({ message: ResponseMessages.connection.error.connectionNotFound, statusCode: error?.response?.status, @@ -495,7 +501,6 @@ export class ConnectionService { ): Promise<{ response; }> { - const pattern = { cmd: 'agent-receive-invitation-url' }; const payload = { url, orgId, receiveInvitationUrl }; @@ -644,7 +649,6 @@ export class ConnectionService { */ async createConnectionInvitation(payload: ICreateOutOfbandConnectionInvitation): Promise { try { - const { alias, appendedAttachments, @@ -676,18 +680,17 @@ export class ConnectionService { let legacyinvitationDid; if (IsReuseConnection) { const data: agent_invitations[] = await this.connectionRepository.getInvitationDidByOrgId(orgId); - if (data && 0 < data.length) { - const [firstElement] = data; - legacyinvitationDid = firstElement?.invitationDid ?? undefined; - - this.logger.log('legacyinvitationDid:', legacyinvitationDid); + if (data && 0 < data.length) { + const [firstElement] = data; + legacyinvitationDid = firstElement?.invitationDid ?? undefined; + + this.logger.log('legacyinvitationDid:', legacyinvitationDid); } } const connectionInvitationDid = invitationDid ? invitationDid : legacyinvitationDid; this.logger.log('connectionInvitationDid:', connectionInvitationDid); - this.logger.log(`logoUrl:::, ${organisation.logoUrl}`); const connectionPayload = { multiUseInvitation: multiUseInvitation ?? true, @@ -726,7 +729,7 @@ export class ConnectionService { shortenedUrl, agentId, orgId, - invitationsDid + invitationsDid ); const connectionStorePayload: ConnectionResponseDetail = { id: saveConnectionDetails.id, @@ -785,8 +788,7 @@ export class ConnectionService { response: string; }> { try { - return from(this.natsClient - .send(this.connectionServiceProxy, pattern, payload)) + return from(this.natsClient.send(this.connectionServiceProxy, pattern, payload)) .pipe( map((response) => ({ response @@ -824,49 +826,47 @@ export class ConnectionService { async deleteConnectionRecords(orgId: string, user: user): Promise { try { - const deleteConnections = await this.connectionRepository.deleteConnectionRecordsByOrgId(orgId); + const deleteConnections = await this.connectionRepository.deleteConnectionRecordsByOrgId(orgId); - if (0 === deleteConnections?.deleteConnectionRecords?.count) { - throw new NotFoundException(ResponseMessages.connection.error.connectionRecordNotFound); - } + if (0 === deleteConnections?.deleteConnectionRecords?.count) { + throw new NotFoundException(ResponseMessages.connection.error.connectionRecordNotFound); + } - const statusCounts = { - [ConnectionProcessState.START]: 0, - [ConnectionProcessState.COMPLETE]: 0, - [ConnectionProcessState.ABANDONED]: 0, - [ConnectionProcessState.INVITATION_SENT]: 0, - [ConnectionProcessState.INVITATION_RECEIVED]: 0, - [ConnectionProcessState.REQUEST_SENT]: 0, - [ConnectionProcessState.DECLIEND]: 0, - [ConnectionProcessState.REQUEST_RECEIVED]: 0, - [ConnectionProcessState.RESPONSE_SENT]: 0, - [ConnectionProcessState.RESPONSE_RECEIVED]: 0 - }; - - await Promise.all(deleteConnections.getConnectionRecords.map(async (record) => { - statusCounts[record.state]++; - })); - - const filteredStatusCounts = Object.fromEntries( - Object.entries(statusCounts).filter(entry => 0 < entry[1]) - ); + const statusCounts = { + [ConnectionProcessState.START]: 0, + [ConnectionProcessState.COMPLETE]: 0, + [ConnectionProcessState.ABANDONED]: 0, + [ConnectionProcessState.INVITATION_SENT]: 0, + [ConnectionProcessState.INVITATION_RECEIVED]: 0, + [ConnectionProcessState.REQUEST_SENT]: 0, + [ConnectionProcessState.DECLIEND]: 0, + [ConnectionProcessState.REQUEST_RECEIVED]: 0, + [ConnectionProcessState.RESPONSE_SENT]: 0, + [ConnectionProcessState.RESPONSE_RECEIVED]: 0 + }; + + await Promise.all( + deleteConnections.getConnectionRecords.map(async (record) => { + statusCounts[record.state]++; + }) + ); - const deletedConnectionData = { - deletedConnectionsRecordsCount: deleteConnections?.deleteConnectionRecords?.count, - deletedRecordsStatusCount: filteredStatusCounts - }; + const filteredStatusCounts = Object.fromEntries(Object.entries(statusCounts).filter((entry) => 0 < entry[1])); - await this.userActivityRepository._orgDeletedActivity(orgId, user, deletedConnectionData, RecordType.CONNECTION); + const deletedConnectionData = { + deletedConnectionsRecordsCount: deleteConnections?.deleteConnectionRecords?.count, + deletedRecordsStatusCount: filteredStatusCounts + }; - return deleteConnections; + await this.userActivityRepository._orgDeletedActivity(orgId, user, deletedConnectionData, RecordType.CONNECTION); + return deleteConnections; } catch (error) { - this.logger.error(`[deleteConnectionRecords] - error in deleting connection records: ${JSON.stringify(error)}`); - throw new RpcException(error.response ? error.response : error); + this.logger.error(`[deleteConnectionRecords] - error in deleting connection records: ${JSON.stringify(error)}`); + throw new RpcException(error.response ? error.response : error); } } - async sendBasicMesage(payload: IBasicMessage): Promise { const { content, orgId, connectionId } = payload; try { @@ -915,5 +915,4 @@ export class ConnectionService { // eslint-disable-next-line no-return-await return await this.natsCall(pattern, payload); } - } diff --git a/apps/connection/src/enum/index.ts b/apps/connection/src/enum/index.ts new file mode 100644 index 000000000..b268aa3b5 --- /dev/null +++ b/apps/connection/src/enum/index.ts @@ -0,0 +1 @@ +export * from './connection.enum'; diff --git a/apps/connection/src/index.ts b/apps/connection/src/index.ts new file mode 100644 index 000000000..b4431c614 --- /dev/null +++ b/apps/connection/src/index.ts @@ -0,0 +1,7 @@ +export * from './connection.controller'; +export * from './connection.module'; +export * from './connection.repository'; +export * from './connection.service'; +export * from './enum'; +export * from './main'; +export * from './bootstrap'; diff --git a/apps/connection/src/interfaces/connection.interfaces.ts b/apps/connection/src/interfaces/connection.interfaces.ts index 020e4821d..804e9c714 100644 --- a/apps/connection/src/interfaces/connection.interfaces.ts +++ b/apps/connection/src/interfaces/connection.interfaces.ts @@ -1,7 +1,7 @@ // eslint-disable-next-line camelcase -import { IUserRequest } from '@credebl/user-request/user-request.interface'; -import { organisation } from '@prisma/client'; -import { UserRoleOrgPermsDto } from 'apps/api-gateway/src/dtos/user-role-org-perms.dto'; +import { IUserRequest } from '@credebl/user-management'; +import { organisation } from '@credebl/prisma-service'; +// import { UserRoleOrgPermsDto } from 'apps/api-gateway/src/dtos/user-role-org-perms.dto'; export interface IConnection { user: IUserRequestInterface; @@ -16,7 +16,7 @@ export interface IConnection { handshakeProtocols: string[]; orgId: string; recipientKey?: string; - invitationDid?: string + invitationDid?: string; } export interface IUserRequestInterface { userId: string; @@ -27,7 +27,8 @@ export interface IUserRequestInterface { tenantId?: string; tenantName?: string; tenantOrgId?: string; - userRoleOrgPermissions?: UserRoleOrgPermsDto[]; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + userRoleOrgPermissions?: any[]; orgName?: string; selectedOrg: ISelectedOrgInterface; } @@ -130,7 +131,7 @@ export interface IConnectionSearchCriteria { sortField: string; sortBy: string; searchByText: string; - user: IUserRequestInterface + user: IUserRequestInterface; } export interface AgentConnectionSearchCriteria { @@ -143,9 +144,9 @@ export interface AgentConnectionSearchCriteria { } export interface IReceiveInvitationByUrlOrg { - user: IUserRequestInterface, - receiveInvitationUrl: IReceiveInvitationUrl, - orgId: string + user: IUserRequestInterface; + receiveInvitationUrl: IReceiveInvitationUrl; + orgId: string; } export interface IReceiveInvitationUrl extends IReceiveInvite { @@ -153,9 +154,9 @@ export interface IReceiveInvitationUrl extends IReceiveInvite { } export interface IReceiveInvitationByOrg { - user: IUserRequestInterface, - receiveInvitation: IReceiveInvitation, - orgId: string + user: IUserRequestInterface; + receiveInvitation: IReceiveInvitation; + orgId: string; } interface Service { @@ -210,8 +211,8 @@ interface OutOfBandInvitationService { } interface OutOfBandInvitation { - "@type": string; - "@id": string; + '@type': string; + '@id': string; label: string; accept: string[]; handshake_protocols: string[]; @@ -266,7 +267,7 @@ export interface ConnectionResponseDetail { lastChangedDateTime: Date; lastChangedBy: number; recordId: string; - invitationDid?: string + invitationDid?: string; } export interface ICreateConnectionInvitation { @@ -289,6 +290,21 @@ export interface ICreateConnectionInvitation { } export interface ICreateOutOfbandConnectionInvitation { - user: IUserRequestInterface, - createOutOfBandConnectionInvitation: ICreateConnectionInvitation, -} \ No newline at end of file + user: IUserRequestInterface; + createOutOfBandConnectionInvitation: ICreateConnectionInvitation; +} + +export interface IConnectionDetailsById { + id: string; + createdAt: string; + did: string; + theirDid: string; + theirLabel: string; + state: string; + role: string; + autoAcceptConnection: boolean; + threadId: string; + protocol: string; + outOfBandId: string; + updatedAt: string; +} diff --git a/apps/connection/src/interfaces/index.ts b/apps/connection/src/interfaces/index.ts new file mode 100644 index 000000000..9b10ff0ea --- /dev/null +++ b/apps/connection/src/interfaces/index.ts @@ -0,0 +1,2 @@ +export * from './connection.interfaces'; +export * from './messaging.interfaces'; diff --git a/apps/connection/src/main.ts b/apps/connection/src/main.ts index 752b048f6..c58c38052 100644 --- a/apps/connection/src/main.ts +++ b/apps/connection/src/main.ts @@ -1,25 +1,32 @@ -import { NestFactory } from '@nestjs/core'; -import { ConnectionModule } from './connection.module'; -import { HttpExceptionFilter } from 'libs/http-exception.filter'; -import { Logger } from '@nestjs/common'; -import { MicroserviceOptions, Transport } from '@nestjs/microservices'; -import { getNatsOptions } from '@credebl/common/nats.config'; -import { CommonConstants } from '@credebl/common/common.constant'; -import NestjsLoggerServiceAdapter from '@credebl/logger/nestjsLoggerServiceAdapter'; +// import { NestFactory } from '@nestjs/core'; +// import { ConnectionModule } from './connection.module'; +// import { HttpExceptionFilter } from '@credebl/common'; +// import { Logger } from '@nestjs/common'; +// import { MicroserviceOptions, Transport } from '@nestjs/microservices'; +// import { getNatsOptions } from '@credebl/common'; +// import { CommonConstants } from '@credebl/common'; +// import {NestjsLoggerServiceAdapter} from '@credebl/logger'; +import { bootstrapConnectionService } from './bootstrap'; -const logger = new Logger(); +// const logger = new Logger(); -async function bootstrap(): Promise { +// async function bootstrap(): Promise { - const app = await NestFactory.createMicroservice(ConnectionModule, { - transport: Transport.NATS, - options: getNatsOptions(CommonConstants.CONNECTION_SERVICE, process.env.CONNECTION_NKEY_SEED) - }); +// const app = await NestFactory.createMicroservice(ConnectionModule, { +// transport: Transport.NATS, +// options: getNatsOptions(CommonConstants.CONNECTION_SERVICE, process.env.CONNECTION_NKEY_SEED) +// }); - app.useLogger(app.get(NestjsLoggerServiceAdapter)); - app.useGlobalFilters(new HttpExceptionFilter()); +// app.useLogger(app.get(NestjsLoggerServiceAdapter)); +// app.useGlobalFilters(new HttpExceptionFilter()); - await app.listen(); - logger.log('Connection-Service Microservice is listening to NATS '); +// await app.listen(); +// logger.log('Connection-Service Microservice is listening to NATS '); +// } +// bootstrap(); +async function main() { + await bootstrapConnectionService(); } -bootstrap(); + +main(); + diff --git a/apps/connection/test/app.e2e-spec.ts b/apps/connection/test/app.e2e-spec.ts deleted file mode 100644 index bae2e58fd..000000000 --- a/apps/connection/test/app.e2e-spec.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { INestApplication } from '@nestjs/common'; -import * as request from 'supertest'; -import { ConnectionModule } from '../src/connection.module'; - -describe('ConnectionServiceController (e2e)', () => { - let app: INestApplication; - - beforeEach(async () => { - const moduleFixture: TestingModule = await Test.createTestingModule({ - imports: [ConnectionModule] - }).compile(); - - app = moduleFixture.createNestApplication(); - await app.init(); - }); - - it('/ (GET)', () => request(app.getHttpServer()) - .get('/') - .expect(200) - .expect('Hello World!')); -}); diff --git a/apps/connection/test/jest-e2e.json b/apps/connection/test/jest-e2e.json deleted file mode 100644 index e9d912f3e..000000000 --- a/apps/connection/test/jest-e2e.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "moduleFileExtensions": ["js", "json", "ts"], - "rootDir": ".", - "testEnvironment": "node", - "testRegex": ".e2e-spec.ts$", - "transform": { - "^.+\\.(t|j)s$": "ts-jest" - } -} diff --git a/apps/connection/tsconfig.app.json b/apps/connection/tsconfig.app.json index 312d6801f..432d15ddd 100644 --- a/apps/connection/tsconfig.app.json +++ b/apps/connection/tsconfig.app.json @@ -1,9 +1,21 @@ { - "extends": "../../tsconfig.json", + "extends": "../../tsconfig.build.json", "compilerOptions": { - "declaration": false, - "outDir": "../../dist/apps/connection" + // "rootDir": ".", + "outDir": "./dist", // per-package output + // "composite": true, + // "declaration": true, + // "declarationMap": true }, - "include": ["src/**/*"], - "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] -} + "include": [ + "src/", + "index.ts" + ], + // "exclude": [ + // "node_modules", + // "test", + // "dist", + // "**/*.spec.ts", + // "scripts" + // ] +} \ No newline at end of file diff --git a/apps/connection/tsconfig.json b/apps/connection/tsconfig.json new file mode 100644 index 000000000..00a0489f4 --- /dev/null +++ b/apps/connection/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "../../tsconfig.json", + "include": [ + "src/**/*" + ] +} \ No newline at end of file diff --git a/apps/geo-location/index.ts b/apps/geo-location/index.ts new file mode 100644 index 000000000..d1e9a4766 --- /dev/null +++ b/apps/geo-location/index.ts @@ -0,0 +1,2 @@ +// export * from './src/bootstrap'; +export * from './src' \ No newline at end of file diff --git a/apps/geo-location/src/geo-location.module.ts b/apps/geo-location/src/geo-location.module.ts index f664a861f..de66eba69 100644 --- a/apps/geo-location/src/geo-location.module.ts +++ b/apps/geo-location/src/geo-location.module.ts @@ -4,14 +4,14 @@ import { GeoLocationService } from './geo-location.service'; import { ClientsModule, Transport } from '@nestjs/microservices'; import { CommonModule } from '@credebl/common'; import { CacheModule } from '@nestjs/cache-manager'; -import { getNatsOptions } from '@credebl/common/nats.config'; +import { getNatsOptions } from '@credebl/common/nats/nats.config'; import { PrismaService } from '@credebl/prisma-service'; import { GeoLocationRepository } from './geo-location.repository'; import { CommonConstants } from '@credebl/common/common.constant'; import { GlobalConfigModule } from '@credebl/config/global-config.module'; import { ConfigModule as PlatformConfig } from '@credebl/config/config.module'; import { LoggerModule } from '@credebl/logger/logger.module'; -import { ContextInterceptorModule } from '@credebl/context/contextInterceptorModule'; +import { ContextInterceptorModule } from '@credebl/common/utils/context/contextInterceptorModule'; @Module({ imports: [ diff --git a/apps/geo-location/src/geo-location.service.ts b/apps/geo-location/src/geo-location.service.ts index b3a40c8fe..8e3591f71 100644 --- a/apps/geo-location/src/geo-location.service.ts +++ b/apps/geo-location/src/geo-location.service.ts @@ -2,7 +2,7 @@ import { Injectable, Logger, NotFoundException } from '@nestjs/common'; import { RpcException } from '@nestjs/microservices'; import { CountryInterface, StateInterface, CityInterface } from '@credebl/common/interfaces/geolocation.interface'; import { GeoLocationRepository } from './geo-location.repository'; -import { ResponseMessages } from '@credebl/common/response-messages'; +import { ResponseMessages } from '@credebl/common/utils/response-messages'; @Injectable() export class GeoLocationService { diff --git a/apps/geo-location/src/index.ts b/apps/geo-location/src/index.ts new file mode 100644 index 000000000..351b645eb --- /dev/null +++ b/apps/geo-location/src/index.ts @@ -0,0 +1,5 @@ +export * from './geo-location.controller'; +export * from './geo-location.module'; +export * from './geo-location.repository'; +export * from './geo-location.service'; +export * from './main'; diff --git a/apps/geo-location/src/main.ts b/apps/geo-location/src/main.ts index 0e01892c0..a27cd044a 100644 --- a/apps/geo-location/src/main.ts +++ b/apps/geo-location/src/main.ts @@ -1,11 +1,11 @@ -import { HttpExceptionFilter } from 'libs/http-exception.filter'; +import { HttpExceptionFilter } from '@credebl/common/utils/handlers/http-exception.filter'; import { Logger } from '@nestjs/common'; import { NestFactory } from '@nestjs/core'; import { MicroserviceOptions, Transport } from '@nestjs/microservices'; -import { getNatsOptions } from '@credebl/common/nats.config'; +import { getNatsOptions } from '@credebl/common/nats/nats.config'; import { GeoLocationModule } from './geo-location.module'; import { CommonConstants } from '@credebl/common/common.constant'; -import NestjsLoggerServiceAdapter from '@credebl/logger/nestjsLoggerServiceAdapter'; +import { NestjsLoggerServiceAdapter } from '@credebl/logger/nestjsLoggerServiceAdapter'; const logger = new Logger(); diff --git a/apps/geo-location/tsconfig.app.json b/apps/geo-location/tsconfig.app.json index 8b90f0c63..1d1252539 100644 --- a/apps/geo-location/tsconfig.app.json +++ b/apps/geo-location/tsconfig.app.json @@ -1,8 +1,8 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "declaration": false, - "outDir": "../../dist/apps/geo-location" + + "outDir": "./dist/apps/", //geo-location/" }, "include": ["src/**/*"], "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] diff --git a/apps/issuance/enum/index.ts b/apps/issuance/enum/index.ts new file mode 100644 index 000000000..95658d4b0 --- /dev/null +++ b/apps/issuance/enum/index.ts @@ -0,0 +1 @@ +export * from './issuance.enum'; diff --git a/apps/issuance/enum/issuance.enum.ts b/apps/issuance/enum/issuance.enum.ts index aa09cabc9..85eacc22e 100644 --- a/apps/issuance/enum/issuance.enum.ts +++ b/apps/issuance/enum/issuance.enum.ts @@ -1,6 +1,6 @@ -export enum SortFields { - CREATED_DATE_TIME = 'createDateTime', - SCHEMA_ID = 'schemaId', - CONNECTION_ID = 'connectionId', - STATE = 'state' -} \ No newline at end of file +// export enum SortFields { +// CREATED_DATE_TIME = 'createDateTime', +// SCHEMA_ID = 'schemaId', +// CONNECTION_ID = 'connectionId', +// STATE = 'state' +// } diff --git a/apps/issuance/index.ts b/apps/issuance/index.ts new file mode 100644 index 000000000..d1e9a4766 --- /dev/null +++ b/apps/issuance/index.ts @@ -0,0 +1,2 @@ +// export * from './src/bootstrap'; +export * from './src' \ No newline at end of file diff --git a/apps/issuance/interfaces/index.ts b/apps/issuance/interfaces/index.ts new file mode 100644 index 000000000..d386afda1 --- /dev/null +++ b/apps/issuance/interfaces/index.ts @@ -0,0 +1 @@ +export * from './issuance.interfaces'; diff --git a/apps/issuance/interfaces/issuance.interfaces.ts b/apps/issuance/interfaces/issuance.interfaces.ts index 6fb847924..22719695b 100644 --- a/apps/issuance/interfaces/issuance.interfaces.ts +++ b/apps/issuance/interfaces/issuance.interfaces.ts @@ -1,5 +1,5 @@ // eslint-disable-next-line camelcase -import { AutoAccept, SchemaType } from '@credebl/enum/enum'; +import { AutoAccept, SchemaType } from '@credebl/common/enum/enum'; import { Prisma, organisation } from '@prisma/client'; import { IPrettyVc } from '@credebl/common/interfaces/issuance.interface'; diff --git a/apps/issuance/libs/helpers/attributes.extractor.ts b/apps/issuance/libs/helpers/attributes.extractor.ts index 5c62aaa93..6d39e42b0 100644 --- a/apps/issuance/libs/helpers/attributes.extractor.ts +++ b/apps/issuance/libs/helpers/attributes.extractor.ts @@ -1,5 +1,5 @@ import { CommonConstants } from '@credebl/common/common.constant'; -import { TemplateIdentifier } from '@credebl/enum/enum'; +import { TemplateIdentifier } from '@credebl/common/enum/enum'; // Function for extracting attributes from nested structure export function extractAttributeNames( diff --git a/apps/issuance/libs/helpers/attributes.validator.ts b/apps/issuance/libs/helpers/attributes.validator.ts index 78df951e9..d2a6b99e0 100644 --- a/apps/issuance/libs/helpers/attributes.validator.ts +++ b/apps/issuance/libs/helpers/attributes.validator.ts @@ -1,4 +1,4 @@ -import { W3CSchemaDataType } from '@credebl/enum/enum'; +import { W3CSchemaDataType } from '@credebl/common/enum/enum'; import { BadRequestException } from '@nestjs/common'; import { IIssuanceAttributes, ISchemaAttributes } from 'apps/issuance/interfaces/issuance.interfaces'; diff --git a/apps/issuance/libs/helpers/index.ts b/apps/issuance/libs/helpers/index.ts new file mode 100644 index 000000000..ac84d1b66 --- /dev/null +++ b/apps/issuance/libs/helpers/index.ts @@ -0,0 +1,2 @@ +export * from './attributes.extractor'; +export * from './attributes.validator'; diff --git a/apps/issuance/src/index.ts b/apps/issuance/src/index.ts new file mode 100644 index 000000000..f71d70275 --- /dev/null +++ b/apps/issuance/src/index.ts @@ -0,0 +1,6 @@ +export * from './issuance.controller'; +export * from './issuance.module'; +export * from './issuance.processor'; +export * from './issuance.repository'; +export * from './issuance.service'; +export * from './main'; diff --git a/apps/issuance/src/issuance.module.ts b/apps/issuance/src/issuance.module.ts index 84886a913..57f8fc893 100644 --- a/apps/issuance/src/issuance.module.ts +++ b/apps/issuance/src/issuance.module.ts @@ -6,7 +6,7 @@ import { ClientsModule, Transport } from '@nestjs/microservices'; import { IssuanceController } from './issuance.controller'; import { IssuanceRepository } from './issuance.repository'; import { IssuanceService } from './issuance.service'; -import { getNatsOptions } from '@credebl/common/nats.config'; +import { getNatsOptions } from '@credebl/common/nats/nats.config'; import { OutOfBandIssuance } from '../templates/out-of-band-issuance.template'; import { EmailDto } from '@credebl/common/dtos/email.dto'; import { BullModule } from '@nestjs/bull'; @@ -14,13 +14,13 @@ import { CacheModule } from '@nestjs/cache-manager'; import * as redisStore from 'cache-manager-redis-store'; import { BulkIssuanceProcessor } from './issuance.processor'; import { AwsService } from '@credebl/aws'; -import { UserActivityRepository } from 'libs/user-activity/repositories'; +import { UserActivityRepository } from '@credebl/user-activity/repositories'; import { CommonConstants, MICRO_SERVICE_NAME } from '@credebl/common/common.constant'; import { LoggerModule } from '@credebl/logger/logger.module'; import { ConfigModule as PlatformConfig } from '@credebl/config/config.module'; -import { ContextInterceptorModule } from '@credebl/context/contextInterceptorModule'; +import { ContextInterceptorModule } from '@credebl/common/utils/context/contextInterceptorModule'; import { GlobalConfigModule } from '@credebl/config/global-config.module'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { NATSClient } from '@credebl/common/nats/NATSClient'; @Module({ imports: [ diff --git a/apps/issuance/src/issuance.repository.ts b/apps/issuance/src/issuance.repository.ts index c825cb96a..705cbdf06 100644 --- a/apps/issuance/src/issuance.repository.ts +++ b/apps/issuance/src/issuance.repository.ts @@ -9,7 +9,7 @@ import { PreviewRequest, SchemaDetails } from '../interfaces/issuance.interfaces'; -import { PrismaTables, SortValue } from '@credebl/enum/enum'; +import { PrismaTables, SortValue } from '@credebl/common/enum/enum'; // eslint-disable-next-line camelcase import { agent_invitations, @@ -27,7 +27,7 @@ import { IDeletedIssuanceRecords } from '@credebl/common/interfaces/issuance.int import { IIssuedCredentialSearchParams } from 'apps/api-gateway/src/issuance/interfaces'; import { IUserRequest } from '@credebl/user-request/user-request.interface'; import { PrismaService } from '@credebl/prisma-service'; -import { ResponseMessages } from '@credebl/common/response-messages'; +import { ResponseMessages } from '@credebl/common/utils/response-messages'; @Injectable() export class IssuanceRepository { diff --git a/apps/issuance/src/issuance.service.ts b/apps/issuance/src/issuance.service.ts index 7030d2b0c..e55f15806 100644 --- a/apps/issuance/src/issuance.service.ts +++ b/apps/issuance/src/issuance.service.ts @@ -16,7 +16,7 @@ import { import { IssuanceRepository } from './issuance.repository'; import { IUserRequest } from '@credebl/user-request/user-request.interface'; import { CommonConstants } from '@credebl/common/common.constant'; -import { ResponseMessages } from '@credebl/common/response-messages'; +import { ResponseMessages } from '@credebl/common/utils/response-messages'; import { ClientProxy, RpcException } from '@nestjs/microservices'; import { map } from 'rxjs'; import { @@ -52,7 +52,7 @@ import { SchemaType, TemplateIdentifier, W3CSchemaDataType -} from '@credebl/enum/enum'; +} from '@credebl/common/enum/enum'; import * as QRCode from 'qrcode'; import { OutOfBandIssuance } from '../templates/out-of-band-issuance.template'; import { EmailDto } from '@credebl/common/dtos/email.dto'; @@ -63,7 +63,7 @@ import { parse as paParse } from 'papaparse'; import { v4 as uuidv4 } from 'uuid'; import { Cache } from 'cache-manager'; import { CACHE_MANAGER } from '@nestjs/cache-manager'; -import { convertUrlToDeepLinkUrl, paginator } from '@credebl/common/common.utils'; +import { convertUrlToDeepLinkUrl, paginator } from '@credebl/common/utils/common.utils'; import { InjectQueue } from '@nestjs/bull'; import { Queue } from 'bull'; import { FileUploadStatus, FileUploadType } from 'apps/api-gateway/src/enum'; @@ -84,14 +84,14 @@ import { createOobJsonldIssuancePayload, validateAndUpdateIssuanceDates, validateEmail -} from '@credebl/common/cast.helper'; -import { sendEmail } from '@credebl/common/send-grid-helper-file'; -import * as pLimit from 'p-limit'; -import { UserActivityRepository } from 'libs/user-activity/repositories'; +} from '@credebl/common/utils/helpers/cast.helper'; +import { sendEmail } from '@credebl/common/utils/helpers/send-grid-helper-file'; +import pLimit from 'p-limit'; +import { UserActivityRepository } from '@credebl/user-activity/repositories'; import { validateW3CSchemaAttributes } from '../libs/helpers/attributes.validator'; import { ISchemaDetail } from '@credebl/common/interfaces/schema.interface'; -import ContextStorageService, { ContextStorageServiceKey } from '@credebl/context/contextStorageService.interface'; -import { NATSClient } from '@credebl/common/NATSClient'; +import {ContextStorageService, ContextStorageServiceKey } from '@credebl/common/utils/context/contextStorageService.interface'; +import { NATSClient } from '@credebl/common/nats/NATSClient'; import { extractAttributeNames, unflattenCsvRow } from '../libs/helpers/attributes.extractor'; @Injectable() export class IssuanceService { diff --git a/apps/issuance/src/main.ts b/apps/issuance/src/main.ts index 5f435d931..f10918ab8 100644 --- a/apps/issuance/src/main.ts +++ b/apps/issuance/src/main.ts @@ -1,11 +1,11 @@ import { NestFactory } from '@nestjs/core'; -import { HttpExceptionFilter } from 'libs/http-exception.filter'; +import { HttpExceptionFilter } from '@credebl/common/utils/handlers/http-exception.filter'; import { Logger } from '@nestjs/common'; import { MicroserviceOptions, Transport } from '@nestjs/microservices'; import { IssuanceModule } from '../src/issuance.module'; -import { getNatsOptions } from '@credebl/common/nats.config'; +import { getNatsOptions } from '@credebl/common/nats/nats.config'; import { CommonConstants } from '@credebl/common/common.constant'; -import NestjsLoggerServiceAdapter from '@credebl/logger/nestjsLoggerServiceAdapter'; +import {NestjsLoggerServiceAdapter} from '@credebl/logger/nestjsLoggerServiceAdapter'; const logger = new Logger(); diff --git a/apps/issuance/templates/index.ts b/apps/issuance/templates/index.ts new file mode 100644 index 000000000..d6b46d351 --- /dev/null +++ b/apps/issuance/templates/index.ts @@ -0,0 +1 @@ +export * from './out-of-band-issuance.template'; diff --git a/apps/issuance/tsconfig.app.json b/apps/issuance/tsconfig.app.json index 5ffc426af..b14a6eb63 100644 --- a/apps/issuance/tsconfig.app.json +++ b/apps/issuance/tsconfig.app.json @@ -1,8 +1,8 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "declaration": false, - "outDir": "../../dist/apps/issuance" + + "outDir": "./dist/apps/", //issuance/" }, "include": ["src/**/*"], "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] diff --git a/apps/ledger/index.ts b/apps/ledger/index.ts new file mode 100644 index 000000000..d1e9a4766 --- /dev/null +++ b/apps/ledger/index.ts @@ -0,0 +1,2 @@ +// export * from './src/bootstrap'; +export * from './src' \ No newline at end of file diff --git a/apps/ledger/libs/helpers/index.ts b/apps/ledger/libs/helpers/index.ts new file mode 100644 index 000000000..940edeffa --- /dev/null +++ b/apps/ledger/libs/helpers/index.ts @@ -0,0 +1 @@ +export * from './w3c.schema.builder'; diff --git a/apps/ledger/libs/helpers/w3c.schema.builder.ts b/apps/ledger/libs/helpers/w3c.schema.builder.ts index da967ff39..7a515cf45 100644 --- a/apps/ledger/libs/helpers/w3c.schema.builder.ts +++ b/apps/ledger/libs/helpers/w3c.schema.builder.ts @@ -1,15 +1,15 @@ import { IW3CAttributeValue } from '@credebl/common/interfaces/interface'; import { ISchemaAttributesFormat } from 'apps/ledger/src/schema/interfaces/schema-payload.interface'; import { IProductSchema } from 'apps/ledger/src/schema/interfaces/schema.interface'; -import ExclusiveMinimum from 'libs/validations/exclusiveMinimum'; -import MaxItems from 'libs/validations/maxItems'; -import MaxLength from 'libs/validations/maxLength'; -import Minimum from 'libs/validations/minimum'; -import MinItems from 'libs/validations/minItems'; -import MinLength from 'libs/validations/minLength'; -import MultipleOf from 'libs/validations/multipleOf'; -import Pattern from 'libs/validations/pattern'; -import UniqueItems from 'libs/validations/uniqueItems'; +import ExclusiveMinimum from '@credebl/common/utils/validations/exclusiveMinimum'; +import MaxItems from '@credebl/common/utils/validations/maxItems'; +import MaxLength from '@credebl/common/utils/validations/maxLength'; +import Minimum from '@credebl/common/utils/validations/minimum'; +import MinItems from '@credebl/common/utils/validations/minItems'; +import MinLength from '@credebl/common/utils/validations/minLength'; +import MultipleOf from '@credebl/common/utils/validations/multipleOf'; +import Pattern from '@credebl/common/utils/validations/pattern'; +import UniqueItems from '@credebl/common/utils/validations/uniqueItems'; export function w3cSchemaBuilder(attributes: IW3CAttributeValue[], schemaName: string, description: string): object { // Function to apply validations based on attribute properties diff --git a/apps/ledger/src/credential-definition/credential-definition.module.ts b/apps/ledger/src/credential-definition/credential-definition.module.ts index a51ae4109..520a350cc 100644 --- a/apps/ledger/src/credential-definition/credential-definition.module.ts +++ b/apps/ledger/src/credential-definition/credential-definition.module.ts @@ -8,9 +8,9 @@ import { CredentialDefinitionService } from './credential-definition.service'; import { HttpModule } from '@nestjs/axios'; import { PrismaService } from '@credebl/prisma-service'; import { CacheModule } from '@nestjs/cache-manager'; -import { getNatsOptions } from '@credebl/common/nats.config'; +import { getNatsOptions } from '@credebl/common/nats/nats.config'; import { CommonConstants } from '@credebl/common/common.constant'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { NATSClient } from '@credebl/common/nats/NATSClient'; @Module({ imports: [ ClientsModule.register([ diff --git a/apps/ledger/src/credential-definition/credential-definition.service.ts b/apps/ledger/src/credential-definition/credential-definition.service.ts index a98d59480..163431948 100644 --- a/apps/ledger/src/credential-definition/credential-definition.service.ts +++ b/apps/ledger/src/credential-definition/credential-definition.service.ts @@ -7,18 +7,18 @@ import { NotFoundException } from '@nestjs/common'; import { ClientProxy, RpcException } from '@nestjs/microservices'; -import { BaseService } from 'libs/service/base.service'; +import { BaseService } from '@credebl/common/service/base.service'; import { CredentialDefinitionRepository } from './repositories/credential-definition.repository'; import { CreateCredDefPayload, CredDefPayload, GetAllCredDefsPayload, GetCredDefBySchemaId, GetCredDefPayload, IPlatformCredDefs, ISaveCredDef } from './interfaces/create-credential-definition.interface'; import { credential_definition } from '@prisma/client'; -import { ResponseMessages } from '@credebl/common/response-messages'; +import { ResponseMessages } from '@credebl/common/utils/response-messages'; import { CreateCredDefAgentRedirection, CredDefSchema, GetCredDefAgentRedirection } from './interfaces/credential-definition.interface'; import { map } from 'rxjs/operators'; -import { OrgAgentType, SchemaType, SortValue } from '@credebl/enum/enum'; +import { OrgAgentType, SchemaType, SortValue } from '@credebl/common/enum/enum'; import { Cache } from 'cache-manager'; import { CACHE_MANAGER } from '@nestjs/cache-manager'; import { ICredDefDetails, IPlatformCredDefsData } from '@credebl/common/interfaces/cred-def.interface'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { NATSClient } from '@credebl/common/nats/NATSClient'; import { from } from 'rxjs'; import { ISchemaDetail } from '@credebl/common/interfaces/schema.interface'; @Injectable() diff --git a/apps/ledger/src/credential-definition/index.ts b/apps/ledger/src/credential-definition/index.ts new file mode 100644 index 000000000..56e493e88 --- /dev/null +++ b/apps/ledger/src/credential-definition/index.ts @@ -0,0 +1,3 @@ +export * from './credential-definition.controller'; +export * from './credential-definition.module'; +export * from './credential-definition.service'; diff --git a/apps/ledger/src/credential-definition/interfaces/create-credential-definition.interface.ts b/apps/ledger/src/credential-definition/interfaces/create-credential-definition.interface.ts index dbbd2c876..567938612 100644 --- a/apps/ledger/src/credential-definition/interfaces/create-credential-definition.interface.ts +++ b/apps/ledger/src/credential-definition/interfaces/create-credential-definition.interface.ts @@ -1,4 +1,4 @@ -import { SortValue } from '@credebl/enum/enum'; +import { SortValue } from '@credebl/common/enum/enum'; import { CreateCredentialDefinitionDto } from 'apps/api-gateway/src/credential-definition/dto/create-cred-defs.dto'; import { IUserRequestInterface } from '.'; diff --git a/apps/ledger/src/credential-definition/interfaces/index.ts b/apps/ledger/src/credential-definition/interfaces/index.ts index bb5099072..52ecb21a9 100644 --- a/apps/ledger/src/credential-definition/interfaces/index.ts +++ b/apps/ledger/src/credential-definition/interfaces/index.ts @@ -1,66 +1,2 @@ -import { UserRoleOrgPermsDto } from '../../schema/dtos/user-role-org-perms.dto'; - -export interface IUserRequestInterface { - id: string; - userId: string; - email: string; - orgId: string; - agentEndPoint?: string; - apiKey?: string; - tenantId?: string; - tenantName?: string; - tenantOrgId?: string; - userRoleOrgPermissions?: UserRoleOrgPermsDto[]; - orgName?: string; - selectedOrg: ISelectedOrgInterface; -} - -export interface ISelectedOrgInterface { - id: string; - userId: string; - orgRoleId: string; - orgId: string; - orgRole: object; - organisation: IOrganizationInterface; -} - -export interface IOrganizationInterface { - name: string; - description: string; - org_agents: IOrgAgentInterface[] - -} - -export interface IOrgAgentInterface { - orgDid: string; - verkey: string; - agentEndPoint: string; - agentOptions: string; - walletName: string; - agentsTypeId: string; - orgId: string; -} - -export interface ISchemaResponse{ - name: string; - version: string; - attributes: string; - schemaLedgerId: string; - orgId: string; - createDateTime?: Date; - createdBy?: string; - organisation?: Organisation; -} - -interface UserDetails { - firstName: string; -} - -interface UserOrgRole { - user: UserDetails; -} - -interface Organisation { - name: string; - userOrgRoles: UserOrgRole[]; -} \ No newline at end of file +export * from './create-credential-definition.interface'; +export * from './credential-definition.interface'; diff --git a/apps/ledger/src/credential-definition/repositories/credential-definition.repository.ts b/apps/ledger/src/credential-definition/repositories/credential-definition.repository.ts index 6923b49ea..0ba548cc8 100644 --- a/apps/ledger/src/credential-definition/repositories/credential-definition.repository.ts +++ b/apps/ledger/src/credential-definition/repositories/credential-definition.repository.ts @@ -3,10 +3,10 @@ import { CredDefPayload, GetAllCredDefsDto, IPlatformCredDefs, ISaveCredDef } fr import { PrismaService } from '@credebl/prisma-service'; import { credential_definition, org_agents, org_agents_type, organisation, schema } from '@prisma/client'; import { Injectable, Logger } from '@nestjs/common'; -import { ResponseMessages } from '@credebl/common/response-messages'; +import { ResponseMessages } from '@credebl/common/utils/response-messages'; import { BulkCredDefSchema, CredDefSchema } from '../interfaces/credential-definition.interface'; import { ICredDefData, IPlatformCredDefDetails } from '@credebl/common/interfaces/cred-def.interface'; -import { SchemaType, SortValue } from '@credebl/enum/enum'; +import { SchemaType, SortValue } from '@credebl/common/enum/enum'; import { ISchemaResponse } from '../interfaces'; @Injectable() diff --git a/apps/ledger/src/credential-definition/repositories/index.ts b/apps/ledger/src/credential-definition/repositories/index.ts new file mode 100644 index 000000000..e589dcff6 --- /dev/null +++ b/apps/ledger/src/credential-definition/repositories/index.ts @@ -0,0 +1 @@ +export * from './credential-definition.repository'; diff --git a/apps/ledger/src/index.ts b/apps/ledger/src/index.ts new file mode 100644 index 000000000..6d137d717 --- /dev/null +++ b/apps/ledger/src/index.ts @@ -0,0 +1,5 @@ +export * from './ledger.controller.spec'; +export * from './ledger.controller'; +export * from './ledger.module'; +export * from './ledger.service'; +export * from './main'; diff --git a/apps/ledger/src/ledger.module.ts b/apps/ledger/src/ledger.module.ts index ed5daa043..cf15a7fa4 100644 --- a/apps/ledger/src/ledger.module.ts +++ b/apps/ledger/src/ledger.module.ts @@ -6,12 +6,12 @@ import { PrismaService } from '@credebl/prisma-service'; import { CredentialDefinitionModule } from './credential-definition/credential-definition.module'; import { ClientsModule, Transport } from '@nestjs/microservices'; import { LedgerRepository } from './repositories/ledger.repository'; -import { getNatsOptions } from '@credebl/common/nats.config'; +import { getNatsOptions } from '@credebl/common/nats/nats.config'; import { CommonConstants } from '@credebl/common/common.constant'; import { ConfigModule as PlatformConfig } from '@credebl/config/config.module'; import { GlobalConfigModule } from '@credebl/config/global-config.module'; import { LoggerModule } from '@credebl/logger/logger.module'; -import { ContextInterceptorModule } from '@credebl/context/contextInterceptorModule'; +import { ContextInterceptorModule } from '@credebl/common/utils/context/contextInterceptorModule'; @Module({ imports: [ diff --git a/apps/ledger/src/ledger.service.ts b/apps/ledger/src/ledger.service.ts index 170f6c3ac..03c61ed17 100644 --- a/apps/ledger/src/ledger.service.ts +++ b/apps/ledger/src/ledger.service.ts @@ -1,10 +1,10 @@ import { Injectable, NotFoundException } from '@nestjs/common'; -import { BaseService } from 'libs/service/base.service'; +import { BaseService } from '@credebl/common/service/base.service'; import { LedgerRepository } from './repositories/ledger.repository'; import { RpcException } from '@nestjs/microservices'; // eslint-disable-next-line camelcase import { ledgers } from '@prisma/client'; -import { ResponseMessages } from '@credebl/common/response-messages'; +import { ResponseMessages } from '@credebl/common/utils/response-messages'; import { LedgerDetails } from './interfaces/ledgers.interface'; import { INetworkUrl } from '@credebl/common/interfaces/schema.interface'; import { ISchemasList } from './schema/interfaces/schema.interface'; diff --git a/apps/ledger/src/main.ts b/apps/ledger/src/main.ts index fe38aaa35..77193d2e3 100644 --- a/apps/ledger/src/main.ts +++ b/apps/ledger/src/main.ts @@ -1,11 +1,11 @@ import { NestFactory } from '@nestjs/core'; import { LedgerModule } from './ledger.module'; -import { HttpExceptionFilter } from 'libs/http-exception.filter'; +import { HttpExceptionFilter } from '@credebl/common/utils/handlers/http-exception.filter'; import { Logger } from '@nestjs/common'; import { MicroserviceOptions, Transport } from '@nestjs/microservices'; -import { getNatsOptions } from '@credebl/common/nats.config'; +import { getNatsOptions } from '@credebl/common/nats/nats.config'; import { CommonConstants } from '@credebl/common/common.constant'; -import NestjsLoggerServiceAdapter from '@credebl/logger/nestjsLoggerServiceAdapter'; +import {NestjsLoggerServiceAdapter} from '@credebl/logger/nestjsLoggerServiceAdapter'; async function bootstrap(): Promise { diff --git a/apps/ledger/src/repositories/index.ts b/apps/ledger/src/repositories/index.ts new file mode 100644 index 000000000..d72698fbb --- /dev/null +++ b/apps/ledger/src/repositories/index.ts @@ -0,0 +1 @@ +export * from './ledger.repository'; diff --git a/apps/ledger/src/schema/dtos/index.ts b/apps/ledger/src/schema/dtos/index.ts new file mode 100644 index 000000000..2c55a05a9 --- /dev/null +++ b/apps/ledger/src/schema/dtos/index.ts @@ -0,0 +1 @@ +export * from './user-role-org-perms.dto'; diff --git a/apps/ledger/src/schema/enum/index.ts b/apps/ledger/src/schema/enum/index.ts new file mode 100644 index 000000000..925041795 --- /dev/null +++ b/apps/ledger/src/schema/enum/index.ts @@ -0,0 +1 @@ +export * from './schema.enum'; diff --git a/apps/ledger/src/schema/index.ts b/apps/ledger/src/schema/index.ts new file mode 100644 index 000000000..4808b9bef --- /dev/null +++ b/apps/ledger/src/schema/index.ts @@ -0,0 +1,4 @@ +export * from './schema.controller'; +export * from './schema.interface'; +export * from './schema.module'; +export * from './schema.service'; diff --git a/apps/ledger/src/schema/interfaces/index.ts b/apps/ledger/src/schema/interfaces/index.ts new file mode 100644 index 000000000..22aefe984 --- /dev/null +++ b/apps/ledger/src/schema/interfaces/index.ts @@ -0,0 +1,2 @@ +export * from './schema-payload.interface'; +export * from './schema.interface'; diff --git a/apps/ledger/src/schema/interfaces/schema-payload.interface.ts b/apps/ledger/src/schema/interfaces/schema-payload.interface.ts index db8d09192..574336dfb 100644 --- a/apps/ledger/src/schema/interfaces/schema-payload.interface.ts +++ b/apps/ledger/src/schema/interfaces/schema-payload.interface.ts @@ -1,4 +1,4 @@ -import { SchemaType, SortValue } from '@credebl/enum/enum'; +import { SchemaType, SortValue } from '@credebl/common/enum/enum'; import { IUserRequestInterface } from './schema.interface'; export interface ISchema { diff --git a/apps/ledger/src/schema/interfaces/schema.interface.ts b/apps/ledger/src/schema/interfaces/schema.interface.ts index 7791d5e2d..9aeec854c 100644 --- a/apps/ledger/src/schema/interfaces/schema.interface.ts +++ b/apps/ledger/src/schema/interfaces/schema.interface.ts @@ -1,4 +1,4 @@ -import { JSONSchemaType, SchemaTypeEnum } from '@credebl/enum/enum'; +import { JSONSchemaType, SchemaTypeEnum } from '@credebl/common/enum/enum'; import { UserRoleOrgPermsDto } from '../dtos/user-role-org-perms.dto'; import { IW3CAttributeValue } from '@credebl/common/interfaces/interface'; @@ -132,6 +132,7 @@ export interface IUpdateSchema { orgId?: string; } -export interface UpdateSchemaResponse { - count: number; -} +// Added to common +// export interface UpdateSchemaResponse { +// count: number; +// } diff --git a/apps/ledger/src/schema/repositories/index.ts b/apps/ledger/src/schema/repositories/index.ts new file mode 100644 index 000000000..0eb767092 --- /dev/null +++ b/apps/ledger/src/schema/repositories/index.ts @@ -0,0 +1 @@ +export * from './schema.repository'; diff --git a/apps/ledger/src/schema/repositories/schema.repository.ts b/apps/ledger/src/schema/repositories/schema.repository.ts index 381eef7bd..489f91352 100644 --- a/apps/ledger/src/schema/repositories/schema.repository.ts +++ b/apps/ledger/src/schema/repositories/schema.repository.ts @@ -3,9 +3,9 @@ import { ConflictException, Injectable, InternalServerErrorException, Logger } f import { PrismaService } from '@credebl/prisma-service'; import { ledgers, org_agents, org_agents_type, organisation, Prisma, schema } from '@prisma/client'; import { ISchema, ISchemaExist, ISchemaSearchCriteria, ISaveSchema } from '../interfaces/schema-payload.interface'; -import { ResponseMessages } from '@credebl/common/response-messages'; +import { ResponseMessages } from '@credebl/common/utils/response-messages'; import { AgentDetails, ISchemasWithCount, IUpdateSchema, UpdateSchemaResponse } from '../interfaces/schema.interface'; -import { SchemaType, SortValue } from '@credebl/enum/enum'; +import { SchemaType, SortValue } from '@credebl/common/enum/enum'; import { ICredDefWithCount, IPlatformSchemas } from '@credebl/common/interfaces/schema.interface'; import { ISchemaId } from '../schema.interface'; diff --git a/apps/ledger/src/schema/schema.module.ts b/apps/ledger/src/schema/schema.module.ts index a8c8609d3..ae4247345 100644 --- a/apps/ledger/src/schema/schema.module.ts +++ b/apps/ledger/src/schema/schema.module.ts @@ -8,9 +8,9 @@ import { SchemaService } from './schema.service'; import { HttpModule } from '@nestjs/axios'; import { PrismaService } from '@credebl/prisma-service'; import { CacheModule } from '@nestjs/cache-manager'; -import { getNatsOptions } from '@credebl/common/nats.config'; +import { getNatsOptions } from '@credebl/common/nats/nats.config'; import { CommonConstants } from '@credebl/common/common.constant'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { NATSClient } from '@credebl/common/nats/NATSClient'; @Module({ imports: [ ClientsModule.register([ diff --git a/apps/ledger/src/schema/schema.service.ts b/apps/ledger/src/schema/schema.service.ts index a2fc33c63..dc839eadf 100644 --- a/apps/ledger/src/schema/schema.service.ts +++ b/apps/ledger/src/schema/schema.service.ts @@ -9,7 +9,7 @@ import { NotFoundException } from '@nestjs/common'; import { ClientProxy, RpcException } from '@nestjs/microservices'; -import { BaseService } from 'libs/service/base.service'; +import { BaseService } from '@credebl/common'; import { SchemaRepository } from './repositories/schema.repository'; import { Prisma, schema } from '@prisma/client'; import { @@ -20,7 +20,7 @@ import { ISchemaSearchCriteria, W3CCreateSchema } from './interfaces/schema-payload.interface'; -import { ResponseMessages } from '@credebl/common/response-messages'; +import { ResponseMessages } from '@credebl/common/utils/response-messages'; import { ICreateSchema, ICreateW3CSchema, @@ -38,7 +38,7 @@ import { OrgAgentType, SchemaType, SchemaTypeEnum -} from '@credebl/enum/enum'; +} from '@credebl/common/enum/enum'; import { ICredDefWithPagination, ISchemaData, @@ -51,9 +51,9 @@ import { CommonConstants } from '@credebl/common/common.constant'; import { CommonService } from '@credebl/common'; import { W3CSchemaVersion } from './enum/schema.enum'; import { v4 as uuidv4 } from 'uuid'; -import { networkNamespace } from '@credebl/common/common.utils'; -import { checkDidLedgerAndNetwork } from '@credebl/common/cast.helper'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { networkNamespace } from '@credebl/common/utils/common.utils'; +import { checkDidLedgerAndNetwork } from '@credebl/common/utils/helpers/cast.helper'; +import { NATSClient } from '@credebl/common/nats/NATSClient'; import { from } from 'rxjs'; import { w3cSchemaBuilder } from 'apps/ledger/libs/helpers/w3c.schema.builder'; @@ -360,7 +360,6 @@ export class SchemaService extends BaseService { } private async storeW3CSchemas(schemaDetails, user, orgId, attributes, alias): Promise { - let ledgerDetails; const schemaServerUrl = `${process.env.SCHEMA_FILE_SERVER_URL}${schemaDetails.schemaId}`; const schemaRequest = await this.commonService.httpGet(schemaServerUrl).then(async (response) => response); diff --git a/apps/ledger/tsconfig.app.json b/apps/ledger/tsconfig.app.json index 3a817ff09..71522190d 100644 --- a/apps/ledger/tsconfig.app.json +++ b/apps/ledger/tsconfig.app.json @@ -1,8 +1,8 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "declaration": false, - "outDir": "../../dist/apps/ledger" + + "outDir": "./dist/apps/", //ledger/" }, "include": ["src/**/*"], "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] diff --git a/apps/notification/index.ts b/apps/notification/index.ts new file mode 100644 index 000000000..d1e9a4766 --- /dev/null +++ b/apps/notification/index.ts @@ -0,0 +1,2 @@ +// export * from './src/bootstrap'; +export * from './src' \ No newline at end of file diff --git a/apps/notification/interfaces/index.ts b/apps/notification/interfaces/index.ts new file mode 100644 index 000000000..5224ec751 --- /dev/null +++ b/apps/notification/interfaces/index.ts @@ -0,0 +1 @@ +export * from './notification.interfaces'; diff --git a/apps/notification/src/index.ts b/apps/notification/src/index.ts new file mode 100644 index 000000000..825587e95 --- /dev/null +++ b/apps/notification/src/index.ts @@ -0,0 +1,5 @@ +export * from './main'; +export * from './notification.controller'; +export * from './notification.module'; +export * from './notification.repository'; +export * from './notification.service'; diff --git a/apps/notification/src/main.ts b/apps/notification/src/main.ts index 3ca6db826..e8850f97a 100644 --- a/apps/notification/src/main.ts +++ b/apps/notification/src/main.ts @@ -1,11 +1,11 @@ import { NestFactory } from '@nestjs/core'; -import { HttpExceptionFilter } from 'libs/http-exception.filter'; +import { HttpExceptionFilter } from '@credebl/common/utils/handlers/http-exception.filter'; import { Logger } from '@nestjs/common'; import { MicroserviceOptions, Transport } from '@nestjs/microservices'; import { NotificationModule } from '../src/notification.module'; -import { getNatsOptions } from '@credebl/common/nats.config'; +import { getNatsOptions } from '@credebl/common/nats/nats.config'; import { CommonConstants } from '@credebl/common/common.constant'; -import NestjsLoggerServiceAdapter from '@credebl/logger/nestjsLoggerServiceAdapter'; +import { NestjsLoggerServiceAdapter } from '@credebl/logger/nestjsLoggerServiceAdapter'; const logger = new Logger(); diff --git a/apps/notification/src/notification.module.ts b/apps/notification/src/notification.module.ts index a29ff124e..f76108b9d 100644 --- a/apps/notification/src/notification.module.ts +++ b/apps/notification/src/notification.module.ts @@ -1,5 +1,5 @@ import { CommonModule } from '@credebl/common'; -import { getNatsOptions } from '@credebl/common/nats.config'; +import { getNatsOptions } from '@credebl/common/nats/nats.config'; import { CacheModule } from '@nestjs/cache-manager'; import { Logger, Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; @@ -12,7 +12,7 @@ import { CommonConstants } from '@credebl/common/common.constant'; import { GlobalConfigModule } from '@credebl/config/global-config.module'; import { ConfigModule as PlatformConfig } from '@credebl/config/config.module'; import { LoggerModule } from '@credebl/logger/logger.module'; -import { ContextInterceptorModule } from '@credebl/context/contextInterceptorModule'; +import { ContextInterceptorModule } from '@credebl/common/utils/context/contextInterceptorModule'; @Module({ imports: [ diff --git a/apps/notification/src/notification.repository.ts b/apps/notification/src/notification.repository.ts index e543899b7..14e8cb6c6 100644 --- a/apps/notification/src/notification.repository.ts +++ b/apps/notification/src/notification.repository.ts @@ -1,4 +1,4 @@ -import { ResponseMessages } from '@credebl/common/response-messages'; +import { ResponseMessages } from '@credebl/common/utils/response-messages'; import { PrismaService } from '@credebl/prisma-service'; import { Injectable, Logger, NotFoundException } from '@nestjs/common'; import { INotification, IWebhookEndpoint } from '../interfaces/notification.interfaces'; diff --git a/apps/notification/src/notification.service.ts b/apps/notification/src/notification.service.ts index 01bb467d2..8805b440d 100644 --- a/apps/notification/src/notification.service.ts +++ b/apps/notification/src/notification.service.ts @@ -6,7 +6,7 @@ import { } from '../interfaces/notification.interfaces'; import { RpcException } from '@nestjs/microservices'; import { NotificationRepository } from './notification.repository'; -import { ResponseMessages } from '@credebl/common/response-messages'; +import { ResponseMessages } from '@credebl/common/utils/response-messages'; import { CommonService } from '@credebl/common'; @Injectable() diff --git a/apps/notification/tsconfig.app.json b/apps/notification/tsconfig.app.json index 87277fc96..a5291abaa 100644 --- a/apps/notification/tsconfig.app.json +++ b/apps/notification/tsconfig.app.json @@ -1,8 +1,8 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "declaration": false, - "outDir": "../../dist/apps/notification" + + "outDir": "./dist/apps/", //notification/" }, "include": ["src/**/*"], "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] diff --git a/apps/organization/dtos/index.ts b/apps/organization/dtos/index.ts new file mode 100644 index 000000000..73e5fb529 --- /dev/null +++ b/apps/organization/dtos/index.ts @@ -0,0 +1,4 @@ +export * from './create-organization.dto'; +export * from './send-invitation.dto'; +export * from './update-invitation.dt'; +export * from './verify-email-token.dto'; diff --git a/apps/organization/dtos/update-invitation.dt.ts b/apps/organization/dtos/update-invitation.dt.ts index 21e345858..569cd39e8 100644 --- a/apps/organization/dtos/update-invitation.dt.ts +++ b/apps/organization/dtos/update-invitation.dt.ts @@ -1,4 +1,4 @@ -import { Invitation } from '@credebl/enum/enum'; +import { Invitation } from '@credebl/common/enum/enum'; export class UpdateInvitationDto { invitationId: string; diff --git a/apps/organization/index.ts b/apps/organization/index.ts new file mode 100644 index 000000000..d1e9a4766 --- /dev/null +++ b/apps/organization/index.ts @@ -0,0 +1,2 @@ +// export * from './src/bootstrap'; +export * from './src' \ No newline at end of file diff --git a/apps/organization/interfaces/index.ts b/apps/organization/interfaces/index.ts new file mode 100644 index 000000000..d411c5c1b --- /dev/null +++ b/apps/organization/interfaces/index.ts @@ -0,0 +1 @@ +export * from './organization.interface'; diff --git a/apps/organization/interfaces/organization.interface.ts b/apps/organization/interfaces/organization.interface.ts index 0401e4468..1658ab65e 100644 --- a/apps/organization/interfaces/organization.interface.ts +++ b/apps/organization/interfaces/organization.interface.ts @@ -45,78 +45,80 @@ export interface IOrgAgent { apiKey: string; } -export interface IGetOrgById { - id: string; - name: string; - description: string; - orgSlug: string; - logoUrl: string; - website: string; - publicProfile: boolean; - schema: ISchema[]; - org_agents: IOrgAgents[]; -} - -interface ISchema { - id: string; - name: string; -} - -interface IOrgAgents { - agent_invitations: IAgentInvitation[]; - ledgers: ILedgers; - org_agent_type: IOrgAgentType; -} - -interface IAgentInvitation { - id: string; - connectionInvitation: string; - multiUse: boolean; -} +// Added in common +// export interface IGetOrgById { +// id: string; +// name: string; +// description: string; +// orgSlug: string; +// logoUrl: string; +// website: string; +// publicProfile: boolean; +// schema: ISchema[]; +// org_agents: IOrgAgents[]; +// } + +// interface ISchema { +// id: string; +// name: string; +// } + +// interface IOrgAgents { +// agent_invitations: IAgentInvitation[]; +// ledgers: ILedgers; +// org_agent_type: IOrgAgentType; +// } + +// interface IAgentInvitation { +// id: string; +// connectionInvitation: string; +// multiUse: boolean; +// } export interface IUserOrgRole { user: string; orgRole: string; } -interface IOrgAgentType { - id: string; - createDateTime: Date; - lastChangedDateTime: Date; - agent: string; -} - -interface ILedgers { - id: string; - name: string; - networkType: string; -} - -export interface IGetOrganization { - totalCount: number; - totalPages: number; - organizations: IGetAllOrganizations[]; -} - -interface IGetAllOrganizations { - id: string; - name: string; - description: string; - logoUrl: string; - orgSlug: string; - userOrgRoles: IUserOrganizationRoles[]; -} - -interface IUserOrganizationRoles { - id: string; - orgRole: IOrgRole; -} - -export interface IOrgRole { - id: string; - name: string; - description: string; -} +// interface IOrgAgentType { +// id: string; +// createDateTime: Date; +// lastChangedDateTime: Date; +// agent: string; +// } + +// interface ILedgers { +// id: string; +// name: string; +// networkType: string; +// } + +// Added to common +// export interface IGetOrganization { +// totalCount: number; +// totalPages: number; +// organizations: IGetAllOrganizations[]; +// } + +// interface IGetAllOrganizations { +// id: string; +// name: string; +// description: string; +// logoUrl: string; +// orgSlug: string; +// userOrgRoles: IUserOrganizationRoles[]; +// } + +// interface IUserOrganizationRoles { +// id: string; +// orgRole: IOrgRole; +// } + +// export interface IOrgRole { +// id: string; +// name: string; +// description: string; +// } export interface IOrgInvitationsPagination { totalPages: number; @@ -148,13 +150,14 @@ export interface Payload { role?: string; } -export interface IDidList { - id: string; - createDateTime: Date; - did: string; - lastChangedDateTime: Date; - isPrimaryDid: boolean; -} +// Included in common +// export interface IDidList { +// id: string; +// createDateTime: Date; +// did: string; +// lastChangedDateTime: Date; +// isPrimaryDid: boolean; +// } export interface IPrimaryDid { orgId: string; diff --git a/apps/organization/repositories/index.ts b/apps/organization/repositories/index.ts new file mode 100644 index 000000000..e0e253818 --- /dev/null +++ b/apps/organization/repositories/index.ts @@ -0,0 +1 @@ +export * from './organization.repository'; diff --git a/apps/organization/repositories/organization.repository.ts b/apps/organization/repositories/organization.repository.ts index 017c6816f..3b2ff7c39 100644 --- a/apps/organization/repositories/organization.repository.ts +++ b/apps/organization/repositories/organization.repository.ts @@ -36,6 +36,30 @@ import { } from '@prisma/client'; import { CreateOrganizationDto } from '../dtos/create-organization.dto'; +import { + IGetDids, + IDidDetails, + IDidList, + IGetOrgById, + IGetOrganization, + IPrimaryDidDetails, + IUpdateOrganization, + ILedgerNameSpace, + OrgInvitation, + ILedgerDetails, + IOrgRoleDetails, + IOrgDetails +} from '../interfaces/organization.interface'; +import { Invitation, PrismaTables, SortValue } from '@credebl/common/enum/enum'; +import { PrismaService } from '@credebl/prisma-service'; +import { UserOrgRolesService } from '@credebl/user-org-roles'; +import { ResponseMessages } from '@credebl/common/utils/response-messages'; +import { + IOrganizationInvitations, + IOrganization, + IOrganizationDashboard, + IDeleteOrganization +} from '@credebl/common/interfaces/organization.interface'; import { IOrgRoles } from 'libs/org-roles/interfaces/org-roles.interface'; import { PrismaService } from '@credebl/prisma-service'; import { ResponseMessages } from '@credebl/common/response-messages'; diff --git a/apps/organization/src/index.ts b/apps/organization/src/index.ts new file mode 100644 index 000000000..925593542 --- /dev/null +++ b/apps/organization/src/index.ts @@ -0,0 +1,4 @@ +export * from './main'; +export * from './organization.controller'; +export * from './organization.module'; +export * from './organization.service'; diff --git a/apps/organization/src/main.ts b/apps/organization/src/main.ts index a8d0f278e..b61ca2f96 100644 --- a/apps/organization/src/main.ts +++ b/apps/organization/src/main.ts @@ -1,12 +1,12 @@ -import { HttpExceptionFilter } from 'libs/http-exception.filter'; +import { HttpExceptionFilter } from '@credebl/common/utils/handlers/http-exception.filter'; import { Logger } from '@nestjs/common'; import { NestFactory } from '@nestjs/core'; import { OrganizationModule } from './organization.module'; import { MicroserviceOptions, Transport } from '@nestjs/microservices'; // import { nkeyAuthenticator } from 'nats'; -import { getNatsOptions } from '@credebl/common/nats.config'; +import { getNatsOptions } from '@credebl/common/nats/nats.config'; import { CommonConstants } from '@credebl/common/common.constant'; -import NestjsLoggerServiceAdapter from '@credebl/logger/nestjsLoggerServiceAdapter'; +import { NestjsLoggerServiceAdapter } from '@credebl/logger/nestjsLoggerServiceAdapter'; const logger = new Logger(); diff --git a/apps/organization/src/organization.module.ts b/apps/organization/src/organization.module.ts index 37ad1c270..a5c293949 100644 --- a/apps/organization/src/organization.module.ts +++ b/apps/organization/src/organization.module.ts @@ -8,13 +8,13 @@ import { OrganizationController } from './organization.controller'; import { OrganizationRepository } from '../repositories/organization.repository'; import { OrganizationService } from './organization.service'; import { PrismaService } from '@credebl/prisma-service'; -import { UserActivityRepository } from 'libs/user-activity/repositories'; +import { UserActivityRepository } from '@credebl/user-activity/repositories'; import { UserActivityService } from '@credebl/user-activity'; import { UserOrgRolesRepository } from 'libs/user-org-roles/repositories'; import { UserOrgRolesService } from '@credebl/user-org-roles'; import { UserRepository } from 'apps/user/repositories/user.repository'; import { CacheModule } from '@nestjs/cache-manager'; -import { getNatsOptions } from '@credebl/common/nats.config'; +import { getNatsOptions } from '@credebl/common/nats/nats.config'; import { ClientRegistrationService } from '@credebl/client-registration'; import { KeycloakUrlService } from '@credebl/keycloak-url'; @@ -23,8 +23,8 @@ import { CommonConstants } from '@credebl/common/common.constant'; import { GlobalConfigModule } from '@credebl/config/global-config.module'; import { ConfigModule as PlatformConfig } from '@credebl/config/config.module'; import { LoggerModule } from '@credebl/logger/logger.module'; -import { ContextInterceptorModule } from '@credebl/context/contextInterceptorModule'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { ContextInterceptorModule } from '@credebl/common/utils/context/contextInterceptorModule'; +import { NATSClient } from '@credebl/common/nats/NATSClient'; @Module({ imports: [ ClientsModule.register([ diff --git a/apps/organization/src/organization.service.ts b/apps/organization/src/organization.service.ts index edf05c322..3d298e3ef 100644 --- a/apps/organization/src/organization.service.ts +++ b/apps/organization/src/organization.service.ts @@ -20,14 +20,14 @@ import { ClientProxy, RpcException } from '@nestjs/microservices'; import { OrgRolesService } from '@credebl/org-roles'; import { OrgRoles } from 'libs/org-roles/enums'; import { UserOrgRolesService } from '@credebl/user-org-roles'; -import { ResponseMessages } from '@credebl/common/response-messages'; +import { ResponseMessages } from '@credebl/common/utils/response-messages'; import { OrganizationInviteTemplate } from '../templates/organization-invitation.template'; import { EmailDto } from '@credebl/common/dtos/email.dto'; -import { sendEmail } from '@credebl/common/send-grid-helper-file'; +import { sendEmail } from '@credebl/common/utils/helpers/send-grid-helper-file'; import { CreateOrganizationDto } from '../dtos/create-organization.dto'; import { BulkSendInvitationDto } from '../dtos/send-invitation.dto'; import { UpdateInvitationDto } from '../dtos/update-invitation.dt'; -import { DidMethod, Invitation, Ledgers, PrismaTables, transition } from '@credebl/enum/enum'; +import { DidMethod, Invitation, Ledgers, PrismaTables, transition } from '@credebl/common/enum/enum'; import { IGetOrgById, IGetOrganization, IUpdateOrganization, IClientCredentials, ICreateConnectionUrl, IOrgRole, IDidList, IPrimaryDidDetails, IEcosystemOrgStatus, IOrgDetails } from '../interfaces/organization.interface'; import { UserActivityService } from '@credebl/user-activity'; import { ClientRegistrationService } from '@credebl/client-registration/client-registration.service'; @@ -47,11 +47,11 @@ import { import { ClientCredentialTokenPayloadDto } from '@credebl/client-registration/dtos/client-credential-token-payload.dto'; import { IAccessTokenData } from '@credebl/common/interfaces/interface'; import { IClientRoles } from '@credebl/client-registration/interfaces/client.interface'; -import { toNumber } from '@credebl/common/cast.helper'; -import { UserActivityRepository } from 'libs/user-activity/repositories'; +import { toNumber } from '@credebl/common/utils/helpers/cast.helper'; +import { UserActivityRepository } from '@credebl/user-activity/repositories'; import { DeleteOrgInvitationsEmail } from '../templates/delete-organization-invitations.template'; import { IOrgRoles } from 'libs/org-roles/interfaces/org-roles.interface'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { NATSClient } from '@credebl/common/nats/NATSClient'; @Injectable() export class OrganizationService { constructor( diff --git a/apps/organization/templates/index.ts b/apps/organization/templates/index.ts new file mode 100644 index 000000000..579ff607e --- /dev/null +++ b/apps/organization/templates/index.ts @@ -0,0 +1,4 @@ +export * from './delete-organization-invitations.template'; +export * from './organization-invitation.template'; +export * from './organization-onboard.template'; +export * from './organization-url-template'; diff --git a/apps/organization/tsconfig.app.json b/apps/organization/tsconfig.app.json index 36b277d10..cdad3b782 100644 --- a/apps/organization/tsconfig.app.json +++ b/apps/organization/tsconfig.app.json @@ -1,8 +1,8 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "declaration": false, - "outDir": "../../dist/apps/organization" + + "outDir": "./dist/apps/", //organization/" }, "include": ["src/**/*"], "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] diff --git a/apps/user/dtos/accept-reject-invitation.dto.ts b/apps/user/dtos/accept-reject-invitation.dto.ts index 970e3bf32..43dd4f9e2 100644 --- a/apps/user/dtos/accept-reject-invitation.dto.ts +++ b/apps/user/dtos/accept-reject-invitation.dto.ts @@ -1,4 +1,4 @@ -import { Invitation } from '@credebl/enum/enum'; +import { Invitation } from '@credebl/common/enum/enum'; export class AcceptRejectInvitationDto { invitationId: string; diff --git a/apps/user/dtos/index.ts b/apps/user/dtos/index.ts new file mode 100644 index 000000000..037ae1aa6 --- /dev/null +++ b/apps/user/dtos/index.ts @@ -0,0 +1,5 @@ +export * from './accept-reject-invitation.dto'; +export * from './create-user.dto'; +export * from './keycloak-register.dto'; +export * from './login-user.dto'; +export * from './verify-email.dto'; diff --git a/apps/user/dtos/keycloak-register.dto.ts b/apps/user/dtos/keycloak-register.dto.ts index bfeb2c715..0624bf836 100644 --- a/apps/user/dtos/keycloak-register.dto.ts +++ b/apps/user/dtos/keycloak-register.dto.ts @@ -1,29 +1,30 @@ -export class KeycloakUserRegistrationDto { - email: string; - firstName: string; - lastName: string; - username: string; - enabled: boolean; - totp: boolean; - emailVerified: boolean; - notBefore: number; - credentials: Credentials[]; - access: Access; - realmRoles: string[]; - attributes: object; +// Exported from +// export class KeycloakUserRegistrationDto { +// email: string; +// firstName: string; +// lastName: string; +// username: string; +// enabled: boolean; +// totp: boolean; +// emailVerified: boolean; +// notBefore: number; +// credentials: Credentials[]; +// access: Access; +// realmRoles: string[]; +// attributes: object; -} +// } -export class Credentials { - type: string; - value: string; - temporary: boolean; -} +// export class Credentials { +// type: string; +// value: string; +// temporary: boolean; +// } -export class Access { - manageGroupMembership: boolean; - view: boolean; - mapRoles: boolean; - impersonate: boolean; - manage: boolean; -} \ No newline at end of file +// export class Access { +// manageGroupMembership: boolean; +// view: boolean; +// mapRoles: boolean; +// impersonate: boolean; +// manage: boolean; +// } diff --git a/apps/user/dtos/login-user.dto.ts b/apps/user/dtos/login-user.dto.ts index 2a4aa64db..ef180da2d 100644 --- a/apps/user/dtos/login-user.dto.ts +++ b/apps/user/dtos/login-user.dto.ts @@ -1,4 +1,4 @@ -import { trim } from '@credebl/common/cast.helper'; +import { trim } from '@credebl/common/utils/helpers/cast.helper'; import { ApiProperty } from '@nestjs/swagger'; import { Transform } from 'class-transformer'; import { IsBoolean, IsEmail, IsNotEmpty, IsOptional, IsString } from 'class-validator'; diff --git a/apps/user/index.ts b/apps/user/index.ts new file mode 100644 index 000000000..d1e9a4766 --- /dev/null +++ b/apps/user/index.ts @@ -0,0 +1,2 @@ +// export * from './src/bootstrap'; +export * from './src' \ No newline at end of file diff --git a/apps/user/interfaces/index.ts b/apps/user/interfaces/index.ts new file mode 100644 index 000000000..4bd6e45cb --- /dev/null +++ b/apps/user/interfaces/index.ts @@ -0,0 +1 @@ +export * from './user.interface'; diff --git a/apps/user/interfaces/user.interface.ts b/apps/user/interfaces/user.interface.ts index dd6c1d60d..53a3a64bb 100644 --- a/apps/user/interfaces/user.interface.ts +++ b/apps/user/interfaces/user.interface.ts @@ -1,41 +1,42 @@ import { $Enums, Prisma, RecordType } from '@prisma/client'; -export interface IUsersProfile { - id: string; - username?: string; - email?: string; - firstName?: string; - lastName?: string; - supabaseUserId?: string; - keycloakUserId?: string; - userOrgRoles?: IUserOrgRole[]; -} - -interface IUserOrgRole { - id: string; - userId: string; - orgRoleId: string; - orgId: string; - orgRole :IOrgRole; - organisation:IOrganisation; -} - export interface IOrgRole{ - id: string; - name: string; - description: string; - }; - export interface IOrganisation{ - id: string; - name: string; - description: string; - orgSlug: string; - logoUrl: string; - website: string; - publicProfile: boolean; - countryId: number; - stateId: number; - cityId: number; -} +// Added to common +// export interface IUsersProfile { +// id: string; +// username?: string; +// email?: string; +// firstName?: string; +// lastName?: string; +// supabaseUserId?: string; +// keycloakUserId?: string; +// userOrgRoles?: IUserOrgRole[]; +// } + +// interface IUserOrgRole { +// id: string; +// userId: string; +// orgRoleId: string; +// orgId: string; +// orgRole :IOrgRole; +// organisation:IOrganisation; +// } +// export interface IOrgRole{ +// id: string; +// name: string; +// description: string; +// }; +// export interface IOrganisation{ +// id: string; +// name: string; +// description: string; +// orgSlug: string; +// logoUrl: string; +// website: string; +// publicProfile: boolean; +// countryId: number; +// stateId: number; +// cityId: number; +// } export interface OrgInvitations { id: string; @@ -101,18 +102,20 @@ export interface Attribute { label: string; } -export interface ICheckUserDetails { - isEmailVerified?: boolean; - isFidoVerified?: boolean; - isRegistrationCompleted?: boolean; - userId?: number; - message?:string; -} +// Added in common +// export interface ICheckUserDetails { +// isEmailVerified?: boolean; +// isFidoVerified?: boolean; +// isRegistrationCompleted?: boolean; +// userId?: number; +// message?:string; +// } -export interface IOrgUsers { - totalPages: number, - users: OrgUser[] -} +// Added in common +// export interface IOrgUsers { +// totalPages: number, +// users: OrgUser[] +// } export interface IDidList { id: string; @@ -122,77 +125,35 @@ export interface IDidList { isPrimaryDid: boolean; } -interface OrgUser { - id: string; - username: string; - email: string; - firstName: string; - lastName: string; - isEmailVerified: boolean; - userOrgRoles: UserOrgRoles[]; -} - -interface UserOrgRoles { - id: string; - orgId: string; - orgRoleId: string; - orgRole: OrgRole; - organisation: Organization -} -interface OrgRole { - id: string; - name: string; - description: string; -} - -interface Organization { - id: string, - name: string, - description: string, - orgSlug: string, - logoUrl: string, - org_agents: OrgAgents[]; -} - -interface OrgAgents { - id: string, - orgDid: string, - walletName: string, - agentSpinUpStatus: number, - agentsTypeId: string, - createDateTime: Date, - orgAgentTypeId:string -} - export interface Payload { pageNumber: number; pageSize: number; search: string; } -export interface IVerifyUserEmail{ +export interface IVerifyUserEmail { email: string; verificationCode: string; } -export interface IUserSignIn{ +export interface IUserSignIn { email: string; password: string; isPasskey?: boolean; } -export interface IUserResetPassword{ +export interface IUserResetPassword { email: string; oldPassword?: string; newPassword?: string; token?: string; password?: string; } -export interface IUserForgotPassword{ +export interface IUserForgotPassword { email: string; - brandLogoUrl?: string, - platformName?: string, - endpoint?: string + brandLogoUrl?: string; + platformName?: string; + endpoint?: string; } export interface IIssueCertificate { courseCode: string; @@ -202,7 +163,7 @@ export interface IIssueCertificate { practicalGradeCredits: string; practicalObtainedEarned: string; } -export interface IPuppeteerOption{ +export interface IPuppeteerOption { width: number; height: number; } @@ -229,7 +190,7 @@ export interface UserRoleMapping { userRoleId: string; } -export interface UserRoleDetails{ +export interface UserRoleDetails { id: string; role: $Enums.UserRole; } @@ -243,4 +204,4 @@ export interface IEcosystemConfig { lastChangedDateTime: Date; lastChangedBy: string; deletedAt: Date | null; -} \ No newline at end of file +} diff --git a/apps/user/repositories/index.ts b/apps/user/repositories/index.ts new file mode 100644 index 000000000..0510bcad9 --- /dev/null +++ b/apps/user/repositories/index.ts @@ -0,0 +1,3 @@ +export * from './fido-user.repository'; +export * from './user-device.repository'; +export * from './user.repository'; diff --git a/apps/user/repositories/user.repository.ts b/apps/user/repositories/user.repository.ts index 1cc3efad2..f9e9e505e 100644 --- a/apps/user/repositories/user.repository.ts +++ b/apps/user/repositories/user.repository.ts @@ -18,7 +18,7 @@ import { import { PrismaService } from '@credebl/prisma-service'; // eslint-disable-next-line camelcase import { RecordType, schema, token, user, user_org_roles } from '@prisma/client'; -import { UserRole } from '@credebl/enum/enum'; +import { UserRole } from '@credebl/common/enum/enum'; interface UserQueryOptions { id?: string; // Use the appropriate type based on your data model diff --git a/apps/user/src/fido/dtos/index.ts b/apps/user/src/fido/dtos/index.ts new file mode 100644 index 000000000..8cca23901 --- /dev/null +++ b/apps/user/src/fido/dtos/index.ts @@ -0,0 +1 @@ +export * from './fido-user.dto'; diff --git a/apps/user/src/fido/fido.module.ts b/apps/user/src/fido/fido.module.ts index e3125189a..22578c8d5 100644 --- a/apps/user/src/fido/fido.module.ts +++ b/apps/user/src/fido/fido.module.ts @@ -12,7 +12,7 @@ import { OrgRolesRepository } from 'libs/org-roles/repositories'; import { OrgRolesService } from '@credebl/org-roles'; import { PrismaService } from '@credebl/prisma-service'; import { SupabaseService } from '@credebl/supabase'; -import { UserActivityRepository } from 'libs/user-activity/repositories'; +import { UserActivityRepository } from '@credebl/user-activity/repositories'; import { UserActivityService } from '@credebl/user-activity'; import { UserDevicesRepository } from '../../repositories/user-device.repository'; import { UserOrgRolesRepository } from 'libs/user-org-roles/repositories'; @@ -20,7 +20,7 @@ import { UserOrgRolesService } from '@credebl/user-org-roles'; import { UserRepository } from '../../repositories/user.repository'; import { UserService } from '../user.service'; import { AwsService } from '@credebl/aws'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { NATSClient } from '@credebl/common/nats/NATSClient'; @Module({ imports: [ diff --git a/apps/user/src/fido/fido.service.ts b/apps/user/src/fido/fido.service.ts index e5b3b90db..8dba6bb7e 100644 --- a/apps/user/src/fido/fido.service.ts +++ b/apps/user/src/fido/fido.service.ts @@ -1,6 +1,6 @@ import { BadRequestException, Injectable, Logger, NotFoundException, InternalServerErrorException } from '@nestjs/common'; //InternalServerErrorException import { CommonService } from '@credebl/common'; -import { ResponseMessages } from '@credebl/common/response-messages'; +import { ResponseMessages } from '@credebl/common/utils/response-messages'; import { RpcException } from '@nestjs/microservices'; import { FidoUserRepository } from '../../repositories/fido-user.repository'; import { GenerateRegistrationDto, VerifyRegistrationPayloadDto, VerifyAuthenticationPayloadDto, UpdateFidoUserDetailsDto, credentialDto, updateDeviceDto } from './dtos/fido-user.dto'; diff --git a/apps/user/src/fido/index.ts b/apps/user/src/fido/index.ts new file mode 100644 index 000000000..09ec520af --- /dev/null +++ b/apps/user/src/fido/index.ts @@ -0,0 +1,3 @@ +export * from './fido.controller'; +export * from './fido.module'; +export * from './fido.service'; diff --git a/apps/user/src/index.ts b/apps/user/src/index.ts new file mode 100644 index 000000000..fa65ecbc1 --- /dev/null +++ b/apps/user/src/index.ts @@ -0,0 +1,4 @@ +export * from './main'; +export * from './user.controller'; +export * from './user.module'; +export * from './user.service'; diff --git a/apps/user/src/main.ts b/apps/user/src/main.ts index 502c43950..86e0f0ea7 100644 --- a/apps/user/src/main.ts +++ b/apps/user/src/main.ts @@ -1,11 +1,11 @@ -import { HttpExceptionFilter } from 'libs/http-exception.filter'; +import { HttpExceptionFilter } from '@credebl/common/utils/handlers/http-exception.filter'; import { Logger } from '@nestjs/common'; import { NestFactory } from '@nestjs/core'; import { UserModule } from './user.module'; import { MicroserviceOptions, Transport } from '@nestjs/microservices'; -import { getNatsOptions } from '@credebl/common/nats.config'; +import { getNatsOptions } from '@credebl/common/nats/nats.config'; import { CommonConstants } from '@credebl/common/common.constant'; -import NestjsLoggerServiceAdapter from '@credebl/logger/nestjsLoggerServiceAdapter'; +import { NestjsLoggerServiceAdapter } from '@credebl/logger/nestjsLoggerServiceAdapter'; const logger = new Logger(); diff --git a/apps/user/src/user.controller.ts b/apps/user/src/user.controller.ts index 3616b2d92..659f89cf1 100644 --- a/apps/user/src/user.controller.ts +++ b/apps/user/src/user.controller.ts @@ -6,7 +6,7 @@ import { UserService } from './user.service'; import { VerifyEmailTokenDto } from '../dtos/verify-email.dto'; // eslint-disable-next-line camelcase import { user, user_org_roles } from '@prisma/client'; -import { IUsersActivity } from 'libs/user-activity/interface'; +import { IUsersActivity } from '@credebl/user-activity/interface'; import { ISendVerificationEmail, ISignInUser, IVerifyUserEmail, IUserInvitations, IResetPasswordResponse, ISignUpUserResponse } from '@credebl/common/interfaces/user.interface'; import { AddPasskeyDetailsDto } from 'apps/api-gateway/src/user/dto/add-user.dto'; diff --git a/apps/user/src/user.module.ts b/apps/user/src/user.module.ts index a8e262790..072f5fbc6 100644 --- a/apps/user/src/user.module.ts +++ b/apps/user/src/user.module.ts @@ -9,7 +9,7 @@ import { KeycloakUrlService } from '@credebl/keycloak-url'; import { OrgRolesRepository } from 'libs/org-roles/repositories'; import { PrismaService } from '@credebl/prisma-service'; import { SupabaseService } from '@credebl/supabase'; -import { UserActivityRepository } from 'libs/user-activity/repositories'; +import { UserActivityRepository } from '@credebl/user-activity/repositories'; import { UserActivityService } from '@credebl/user-activity'; import { UserController } from './user.controller'; import { UserOrgRolesRepository } from 'libs/user-org-roles/repositories'; @@ -17,14 +17,14 @@ import { UserOrgRolesService } from '@credebl/user-org-roles'; import { UserRepository } from '../repositories/user.repository'; import { UserService } from './user.service'; import { UserDevicesRepository } from '../repositories/user-device.repository'; -import { getNatsOptions } from '@credebl/common/nats.config'; +import { getNatsOptions } from '@credebl/common/nats/nats.config'; import { AwsService } from '@credebl/aws'; import { CommonConstants } from '@credebl/common/common.constant'; import { GlobalConfigModule } from '@credebl/config/global-config.module'; import { ConfigModule as PlatformConfig } from '@credebl/config/config.module'; import { LoggerModule } from '@credebl/logger/logger.module'; -import { ContextInterceptorModule } from '@credebl/context/contextInterceptorModule'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { ContextInterceptorModule } from '@credebl/common/utils/context/contextInterceptorModule'; +import { NATSClient } from '@credebl/common/nats/NATSClient'; @Module({ imports: [ @@ -59,7 +59,7 @@ import { NATSClient } from '@credebl/common/NATSClient'; UserActivityService, UserActivityRepository, UserDevicesRepository, - NATSClient + {provide: 'NatsClient', useClass: SovioNATSClient} ] }) export class UserModule {} diff --git a/apps/user/src/user.service.ts b/apps/user/src/user.service.ts index aec67200e..01c0eca47 100644 --- a/apps/user/src/user.service.ts +++ b/apps/user/src/user.service.ts @@ -19,13 +19,13 @@ import { LoginUserDto } from '../dtos/login-user.dto'; import { OrgRoles } from 'libs/org-roles/enums'; import { OrgRolesService } from '@credebl/org-roles'; import { PrismaService } from '@credebl/prisma-service'; -import { ResponseMessages } from '@credebl/common/response-messages'; +import { ResponseMessages } from '@credebl/common/utils/response-messages'; import { ClientProxy, RpcException } from '@nestjs/microservices'; import { URLUserEmailTemplate } from '../templates/user-email-template'; import { UserOrgRolesService } from '@credebl/user-org-roles'; import { UserRepository } from '../repositories/user.repository'; import { VerifyEmailTokenDto } from '../dtos/verify-email.dto'; -import { sendEmail } from '@credebl/common/send-grid-helper-file'; +import { sendEmail } from '@credebl/common/utils/helpers/send-grid-helper-file'; // eslint-disable-next-line camelcase import { RecordType, user, user_org_roles } from '@prisma/client'; import { @@ -47,17 +47,17 @@ import { UserActivityService } from '@credebl/user-activity'; import { SupabaseService } from '@credebl/supabase'; import { UserDevicesRepository } from '../repositories/user-device.repository'; import { v4 as uuidv4 } from 'uuid'; -import { Invitation, UserRole } from '@credebl/enum/enum'; +import { Invitation, UserRole } from '@credebl/common/enum/enum'; import validator from 'validator'; import { DISALLOWED_EMAIL_DOMAIN } from '@credebl/common/common.constant'; import { AwsService } from '@credebl/aws'; -import { IUsersActivity } from 'libs/user-activity/interface'; +import { IUsersActivity } from '@credebl/user-activity/interface'; import { ISendVerificationEmail, ISignInUser, IVerifyUserEmail, IUserInvitations, IResetPasswordResponse, ISignUpUserResponse } from '@credebl/common/interfaces/user.interface'; import { AddPasskeyDetailsDto } from 'apps/api-gateway/src/user/dto/add-user.dto'; import { URLUserResetPasswordTemplate } from '../templates/reset-password-template'; -import { toNumber } from '@credebl/common/cast.helper'; +import { toNumber } from '@credebl/common/utils/helpers/cast.helper'; import * as jwt from 'jsonwebtoken'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { NATSClient } from '@credebl/common/nats/NATSClient'; @Injectable() export class UserService { diff --git a/apps/user/templates/index.ts b/apps/user/templates/index.ts new file mode 100644 index 000000000..b7372e553 --- /dev/null +++ b/apps/user/templates/index.ts @@ -0,0 +1,3 @@ +export * from './reset-password-template'; +export * from './user-email-template'; +export * from './user-onboard.template'; diff --git a/apps/user/test/index.ts b/apps/user/test/index.ts new file mode 100644 index 000000000..6a7011609 --- /dev/null +++ b/apps/user/test/index.ts @@ -0,0 +1 @@ +export * from './app.e2e-spec'; diff --git a/apps/user/tsconfig.app.json b/apps/user/tsconfig.app.json index 118b50673..691535558 100644 --- a/apps/user/tsconfig.app.json +++ b/apps/user/tsconfig.app.json @@ -1,8 +1,8 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "declaration": false, - "outDir": "../../dist/apps/user" + + "outDir": "./dist/apps/", //user/" }, "include": ["src/**/*"], "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] diff --git a/apps/utility/index.ts b/apps/utility/index.ts new file mode 100644 index 000000000..d1e9a4766 --- /dev/null +++ b/apps/utility/index.ts @@ -0,0 +1,2 @@ +// export * from './src/bootstrap'; +export * from './src' \ No newline at end of file diff --git a/apps/utility/interfaces/index.ts b/apps/utility/interfaces/index.ts new file mode 100644 index 000000000..212bc5b92 --- /dev/null +++ b/apps/utility/interfaces/index.ts @@ -0,0 +1 @@ +export * from './shortening-url.interface'; diff --git a/apps/utility/src/index.ts b/apps/utility/src/index.ts new file mode 100644 index 000000000..57ed44070 --- /dev/null +++ b/apps/utility/src/index.ts @@ -0,0 +1,5 @@ +export * from './main'; +export * from './utilities.controller'; +export * from './utilities.module'; +export * from './utilities.repository'; +export * from './utilities.service'; diff --git a/apps/utility/src/main.ts b/apps/utility/src/main.ts index 3000eedd3..f343ced44 100644 --- a/apps/utility/src/main.ts +++ b/apps/utility/src/main.ts @@ -1,11 +1,11 @@ -import { HttpExceptionFilter } from 'libs/http-exception.filter'; +import { HttpExceptionFilter } from '@credebl/common/utils/handlers/http-exception.filter'; import { Logger } from '@nestjs/common'; import { NestFactory } from '@nestjs/core'; import { MicroserviceOptions, Transport } from '@nestjs/microservices'; -import { getNatsOptions } from '@credebl/common/nats.config'; +import { getNatsOptions } from '@credebl/common/nats/nats.config'; import { UtilitiesModule } from './utilities.module'; import { CommonConstants } from '@credebl/common/common.constant'; -import NestjsLoggerServiceAdapter from '@credebl/logger/nestjsLoggerServiceAdapter'; +import { NestjsLoggerServiceAdapter } from '@credebl/logger/nestjsLoggerServiceAdapter'; const logger = new Logger(); diff --git a/apps/utility/src/utilities.module.ts b/apps/utility/src/utilities.module.ts index 2f547234f..e77d1ad7e 100644 --- a/apps/utility/src/utilities.module.ts +++ b/apps/utility/src/utilities.module.ts @@ -1,6 +1,6 @@ import { Logger, Module } from '@nestjs/common'; import { ClientsModule, Transport } from '@nestjs/microservices'; -import { getNatsOptions } from '@credebl/common/nats.config'; +import { getNatsOptions } from '@credebl/common/nats/nats.config'; import { CommonModule } from '@credebl/common'; import { CacheModule } from '@nestjs/cache-manager'; import { PrismaService } from '@credebl/prisma-service'; @@ -12,7 +12,7 @@ import { CommonConstants } from '@credebl/common/common.constant'; import { GlobalConfigModule } from '@credebl/config/global-config.module'; import { ConfigModule as PlatformConfig } from '@credebl/config/config.module'; import { LoggerModule } from '@credebl/logger/logger.module'; -import { ContextInterceptorModule } from '@credebl/context/contextInterceptorModule'; +import { ContextInterceptorModule } from '@credebl/common/utils/context/contextInterceptorModule'; @Module({ imports: [ diff --git a/apps/utility/tsconfig.app.json b/apps/utility/tsconfig.app.json index b7f528cf6..b447ad970 100644 --- a/apps/utility/tsconfig.app.json +++ b/apps/utility/tsconfig.app.json @@ -1,8 +1,8 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "declaration": false, - "outDir": "../../dist/apps/utility" + + "outDir": "./dist/apps/", //utility/" }, "include": ["src/**/*"], "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] diff --git a/apps/verification/index.ts b/apps/verification/index.ts new file mode 100644 index 000000000..d1e9a4766 --- /dev/null +++ b/apps/verification/index.ts @@ -0,0 +1,2 @@ +// export * from './src/bootstrap'; +export * from './src' \ No newline at end of file diff --git a/apps/verification/src/index.ts b/apps/verification/src/index.ts new file mode 100644 index 000000000..7ce4d1748 --- /dev/null +++ b/apps/verification/src/index.ts @@ -0,0 +1,4 @@ +export * from './main'; +export * from './verification.controller'; +export * from './verification.module'; +export * from './verification.service'; diff --git a/apps/verification/src/interfaces/index.ts b/apps/verification/src/interfaces/index.ts new file mode 100644 index 000000000..63b77648b --- /dev/null +++ b/apps/verification/src/interfaces/index.ts @@ -0,0 +1 @@ +export * from './verification.interface'; diff --git a/apps/verification/src/interfaces/verification.interface.ts b/apps/verification/src/interfaces/verification.interface.ts index fb7520a87..1613a513d 100644 --- a/apps/verification/src/interfaces/verification.interface.ts +++ b/apps/verification/src/interfaces/verification.interface.ts @@ -1,4 +1,4 @@ -import { AutoAccept } from '@credebl/enum/enum'; +import { AutoAccept } from '@credebl/common/enum/enum'; import { IUserRequest } from '@credebl/user-request/user-request.interface'; export interface IProofRequestAttribute { diff --git a/apps/verification/src/main.ts b/apps/verification/src/main.ts index d355b3971..782f01625 100644 --- a/apps/verification/src/main.ts +++ b/apps/verification/src/main.ts @@ -1,11 +1,11 @@ import { NestFactory } from '@nestjs/core'; -import { HttpExceptionFilter } from 'libs/http-exception.filter'; +import { HttpExceptionFilter } from '@credebl/common/utils/handlers/http-exception.filter'; import { Logger } from '@nestjs/common'; import { MicroserviceOptions, Transport } from '@nestjs/microservices'; import { VerificationModule } from './verification.module'; -import { getNatsOptions } from '@credebl/common/nats.config'; +import { getNatsOptions } from '@credebl/common/nats/nats.config'; import { CommonConstants } from '@credebl/common/common.constant'; -import NestjsLoggerServiceAdapter from '@credebl/logger/nestjsLoggerServiceAdapter'; +import { NestjsLoggerServiceAdapter } from '@credebl/logger/nestjsLoggerServiceAdapter'; const logger = new Logger(); diff --git a/apps/verification/src/repositories/index.ts b/apps/verification/src/repositories/index.ts new file mode 100644 index 000000000..bac2f0611 --- /dev/null +++ b/apps/verification/src/repositories/index.ts @@ -0,0 +1 @@ +export * from './verification.repository'; diff --git a/apps/verification/src/repositories/verification.repository.ts b/apps/verification/src/repositories/verification.repository.ts index 13587c094..3d7f977f3 100644 --- a/apps/verification/src/repositories/verification.repository.ts +++ b/apps/verification/src/repositories/verification.repository.ts @@ -7,8 +7,8 @@ import { agent_invitations, org_agents, organisation, platform_config, presentat import { CommonService } from '@credebl/common'; import { IUserRequest } from '@credebl/user-request/user-request.interface'; import { PrismaService } from '@credebl/prisma-service'; -import { ResponseMessages } from '@credebl/common/response-messages'; -import { SortValue } from '@credebl/enum/enum'; +import { ResponseMessages } from '@credebl/common/utils/response-messages'; +import { SortValue } from '@credebl/common/enum/enum'; @Injectable() export class VerificationRepository { diff --git a/apps/verification/src/verification.module.ts b/apps/verification/src/verification.module.ts index d5e849965..13aff5b70 100644 --- a/apps/verification/src/verification.module.ts +++ b/apps/verification/src/verification.module.ts @@ -5,18 +5,18 @@ import { ClientsModule, Transport } from '@nestjs/microservices'; import { CommonModule } from '@credebl/common'; import { VerificationRepository } from './repositories/verification.repository'; import { PrismaService } from '@credebl/prisma-service'; -import { getNatsOptions } from '@credebl/common/nats.config'; +import { getNatsOptions } from '@credebl/common/nats/nats.config'; import { OutOfBandVerification } from '../templates/out-of-band-verification.template'; import { EmailDto } from '@credebl/common/dtos/email.dto'; import { CacheModule } from '@nestjs/cache-manager'; import { UserActivityService } from '@credebl/user-activity'; -import { UserActivityRepository } from 'libs/user-activity/repositories'; +import { UserActivityRepository } from '@credebl/user-activity/repositories'; import { CommonConstants, MICRO_SERVICE_NAME } from '@credebl/common/common.constant'; import { ConfigModule as PlatformConfig } from '@credebl/config/config.module'; -import { ContextInterceptorModule } from '@credebl/context/contextInterceptorModule'; +import { ContextInterceptorModule } from '@credebl/common/utils/context/contextInterceptorModule'; import { LoggerModule } from '@credebl/logger/logger.module'; import { GlobalConfigModule } from '@credebl/config/global-config.module'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { NATSClient } from '@credebl/common/nats/NATSClient'; @Module({ imports: [ diff --git a/apps/verification/src/verification.service.ts b/apps/verification/src/verification.service.ts index fe99e8cf8..029270093 100644 --- a/apps/verification/src/verification.service.ts +++ b/apps/verification/src/verification.service.ts @@ -26,12 +26,12 @@ import { import { VerificationRepository } from './repositories/verification.repository'; import { ATTRIBUTE_NAME_REGEX, CommonConstants } from '@credebl/common/common.constant'; import { RecordType, agent_invitations, org_agents, organisation, presentations, user } from '@prisma/client'; -import { AutoAccept, OrgAgentType, VerificationProcessState } from '@credebl/enum/enum'; -import { ResponseMessages } from '@credebl/common/response-messages'; +import { AutoAccept, OrgAgentType, VerificationProcessState } from '@credebl/common/enum/enum'; +import { ResponseMessages } from '@credebl/common/utils/response-messages'; import * as QRCode from 'qrcode'; import { OutOfBandVerification } from '../templates/out-of-band-verification.template'; import { EmailDto } from '@credebl/common/dtos/email.dto'; -import { sendEmail } from '@credebl/common/send-grid-helper-file'; +import { sendEmail } from '@credebl/common/utils/helpers/send-grid-helper-file'; import { Cache } from 'cache-manager'; import { CACHE_MANAGER } from '@nestjs/cache-manager'; import { IUserRequest } from '@credebl/user-request/user-request.interface'; @@ -49,10 +49,10 @@ import { VerificationMethodLabel } from 'apps/api-gateway/src/verification/enum/verification.enum'; import { UserActivityService } from '@credebl/user-activity'; -import { convertUrlToDeepLinkUrl } from '@credebl/common/common.utils'; -import { UserActivityRepository } from 'libs/user-activity/repositories'; +import { convertUrlToDeepLinkUrl } from '@credebl/common/utils/common.utils'; +import { UserActivityRepository } from '@credebl/user-activity/repositories'; import { ISchemaDetail } from '@credebl/common/interfaces/schema.interface'; -import { NATSClient } from '@credebl/common/NATSClient'; +import { NATSClient } from '@credebl/common/nats/NATSClient'; import { from } from 'rxjs'; @Injectable() diff --git a/apps/verification/templates/index.ts b/apps/verification/templates/index.ts new file mode 100644 index 000000000..5625feb3b --- /dev/null +++ b/apps/verification/templates/index.ts @@ -0,0 +1 @@ +export * from './out-of-band-verification.template'; diff --git a/apps/verification/tsconfig.app.json b/apps/verification/tsconfig.app.json index 3f4a3d9c6..3394ec4cb 100644 --- a/apps/verification/tsconfig.app.json +++ b/apps/verification/tsconfig.app.json @@ -1,8 +1,8 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "declaration": false, - "outDir": "../../dist/apps/verification" + + "outDir": "./dist/apps/", //verification/" }, "include": ["src/**/*"], "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] diff --git a/apps/webhook/index.ts b/apps/webhook/index.ts new file mode 100644 index 000000000..d1e9a4766 --- /dev/null +++ b/apps/webhook/index.ts @@ -0,0 +1,2 @@ +// export * from './src/bootstrap'; +export * from './src' \ No newline at end of file diff --git a/apps/webhook/interfaces/index.ts b/apps/webhook/interfaces/index.ts new file mode 100644 index 000000000..f3f903d19 --- /dev/null +++ b/apps/webhook/interfaces/index.ts @@ -0,0 +1 @@ +export * from './webhook.interfaces'; diff --git a/apps/webhook/interfaces/webhook.interfaces.ts b/apps/webhook/interfaces/webhook.interfaces.ts index 2341bc217..ddf053931 100644 --- a/apps/webhook/interfaces/webhook.interfaces.ts +++ b/apps/webhook/interfaces/webhook.interfaces.ts @@ -1,10 +1,11 @@ -export interface ICreateWebhookUrl { - webhookUrl: string; -} +// Added in common +// export interface ICreateWebhookUrl { +// webhookUrl: string; +// } -export interface IGetWebhookUrl { - webhookUrl: string; -} +// export interface IGetWebhookUrl { +// webhookUrl: string; +// } export interface IWebhookDto { orgId: string; diff --git a/apps/webhook/src/index.ts b/apps/webhook/src/index.ts new file mode 100644 index 000000000..0e263e050 --- /dev/null +++ b/apps/webhook/src/index.ts @@ -0,0 +1,5 @@ +export * from './main'; +export * from './webhook.controller'; +export * from './webhook.module'; +export * from './webhook.repository'; +export * from './webhook.service'; diff --git a/apps/webhook/src/main.ts b/apps/webhook/src/main.ts index 303f7f8e9..a5e3273d8 100644 --- a/apps/webhook/src/main.ts +++ b/apps/webhook/src/main.ts @@ -1,11 +1,11 @@ import { NestFactory } from '@nestjs/core'; -import { HttpExceptionFilter } from 'libs/http-exception.filter'; +import { HttpExceptionFilter } from '@credebl/common/utils/handlers/http-exception.filter'; import { Logger } from '@nestjs/common'; import { MicroserviceOptions, Transport } from '@nestjs/microservices'; import { WebhookModule } from '../src/webhook.module'; -import { getNatsOptions } from '@credebl/common/nats.config'; +import { getNatsOptions } from '@credebl/common/nats/nats.config'; import { CommonConstants } from '@credebl/common/common.constant'; -import NestjsLoggerServiceAdapter from '@credebl/logger/nestjsLoggerServiceAdapter'; +import { NestjsLoggerServiceAdapter } from '@credebl/logger/nestjsLoggerServiceAdapter'; const logger = new Logger(); diff --git a/apps/webhook/src/webhook.module.ts b/apps/webhook/src/webhook.module.ts index fb6d69549..6663203ee 100644 --- a/apps/webhook/src/webhook.module.ts +++ b/apps/webhook/src/webhook.module.ts @@ -6,12 +6,12 @@ import { ClientsModule, Transport } from '@nestjs/microservices'; import { WebhookController } from './webhook.controller'; import { WebhookRepository } from './webhook.repository'; import { WebhookService } from './webhook.service'; -import { getNatsOptions } from '@credebl/common/nats.config'; +import { getNatsOptions } from '@credebl/common/nats/nats.config'; import { CommonConstants } from '@credebl/common/common.constant'; import { GlobalConfigModule } from '@credebl/config/global-config.module'; import { ConfigModule as PlatformConfig } from '@credebl/config/config.module'; import { LoggerModule } from '@credebl/logger/logger.module'; -import { ContextInterceptorModule } from '@credebl/context/contextInterceptorModule'; +import { ContextInterceptorModule } from '@credebl/common/utils/context/contextInterceptorModule'; @Module({ imports: [ diff --git a/apps/webhook/src/webhook.service.ts b/apps/webhook/src/webhook.service.ts index 3d3402bd2..0fc823781 100644 --- a/apps/webhook/src/webhook.service.ts +++ b/apps/webhook/src/webhook.service.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { CommonService } from '@credebl/common'; import { WebhookRepository } from './webhook.repository'; -import { ResponseMessages } from '@credebl/common/response-messages'; +import { ResponseMessages } from '@credebl/common/utils/response-messages'; import { ClientProxy, RpcException } from '@nestjs/microservices'; import AsyncRetry = require('async-retry'); import { ICreateWebhookUrl, IGetWebhookUrl, IWebhookDto } from '../interfaces/webhook.interfaces'; diff --git a/apps/webhook/tsconfig.app.json b/apps/webhook/tsconfig.app.json index 5521c4ae8..29464bd75 100644 --- a/apps/webhook/tsconfig.app.json +++ b/apps/webhook/tsconfig.app.json @@ -1,8 +1,8 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "declaration": false, - "outDir": "../../dist/apps/webhook" + "outDirs": [], + "outDir": "./dist/apps/", //webhook/" }, "include": ["src/**/*"], "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] diff --git a/libs/aws/package.json b/libs/aws/package.json index 7e66c0b02..9a12f2ba9 100644 --- a/libs/aws/package.json +++ b/libs/aws/package.json @@ -1,26 +1,29 @@ { "name": "@credebl/aws", - "main": "src/index", - "types": "src/index", - "version": "0.0.1", - "files": [ - "dist" - ], + "main": "dist/src/index.js", + "types": "dist/src/index.d.ts", + "version": "2.0.0", + "license": "Apache-2.0", + "publishConfig": { + "main": "dist/index.js", + "types": "dist/index.d.ts", + "access": "public" + }, "scripts": { "build": "pnpm run clean && pnpm run compile", - "clean": "rimraf ../../dist/libs/aws", - "compile": "tsc -p tsconfig.build.json", + "clean": "rimraf ./dist", + "compile": "tsc -p tsconfig.lib.json", "test": "jest" }, "dependencies": { - "@nestjs/common": "^10.2.7", - "@nestjs/testing": "^10.1.3", - "@nestjs/microservices": "^10.1.3", - "aws-sdk": "^2.1510.0" + "@nestjs/common": "^10.4.20", + "@nestjs/microservices": "^10.4.20", + "@nestjs/testing": "^10.4.20", + "aws-sdk": "^2.1692.0" }, "devDependencies": { - "reflect-metadata": "^0.1.13", - "rimraf": "^4.4.0", - "typescript": "^5.1.6" + "reflect-metadata": "^0.1.14", + "rimraf": "^4.4.1", + "typescript": "^5.8.3" } } diff --git a/libs/aws/tsconfig.json b/libs/aws/tsconfig.json index b29a7b46c..5cc50cd88 100644 --- a/libs/aws/tsconfig.json +++ b/libs/aws/tsconfig.json @@ -1,4 +1,6 @@ { "extends": "../../tsconfig.json", - "compilerOptions": {} + "include": [ + "src/**/*" + ] } diff --git a/libs/aws/tsconfig.build.json b/libs/aws/tsconfig.lib.json similarity index 54% rename from libs/aws/tsconfig.build.json rename to libs/aws/tsconfig.lib.json index 74c2e991f..c0f4dc349 100644 --- a/libs/aws/tsconfig.build.json +++ b/libs/aws/tsconfig.lib.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig.build.json", "compilerOptions": { - "outDir": "../../dist/libs/aws" + "outDir": "./dist" }, - "include": ["src/**/*"] + "include": ["src/"] } diff --git a/libs/client-registration/src/client-registration.module.ts b/libs/client-registration/src/client-registration.module.ts deleted file mode 100644 index 9fd72ef70..000000000 --- a/libs/client-registration/src/client-registration.module.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Module } from '@nestjs/common'; -import { ClientRegistrationService } from './client-registration.service'; - -@Module({ - providers: [ClientRegistrationService], - exports: [ClientRegistrationService] -}) -export class ClientRegistrationModule {} diff --git a/libs/client-registration/src/client-registration.service.spec.ts b/libs/client-registration/src/client-registration.service.spec.ts deleted file mode 100644 index 7d4d230b7..000000000 --- a/libs/client-registration/src/client-registration.service.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { ClientRegistrationService } from './client-registration.service'; - -describe('ClientRegistrationService', () => { - let service: ClientRegistrationService; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - providers: [ClientRegistrationService] - }).compile(); - - service = module.get(ClientRegistrationService); - }); - - it('should be defined', () => { - expect(service).toBeDefined(); - }); -}); diff --git a/libs/client-registration/src/dtos/accessTokenPayloadDto.ts b/libs/client-registration/src/dtos/accessTokenPayloadDto.ts deleted file mode 100644 index 18294a0bb..000000000 --- a/libs/client-registration/src/dtos/accessTokenPayloadDto.ts +++ /dev/null @@ -1,7 +0,0 @@ -export class accessTokenPayloadDto { - client_id: string; - client_secret: string; - grant_type?: string = 'refresh_token'; - refresh_token: string; - } - \ No newline at end of file diff --git a/libs/client-registration/src/dtos/client-credential-token-payload.dto.ts b/libs/client-registration/src/dtos/client-credential-token-payload.dto.ts deleted file mode 100644 index 6e9c87de8..000000000 --- a/libs/client-registration/src/dtos/client-credential-token-payload.dto.ts +++ /dev/null @@ -1,7 +0,0 @@ -export class ClientCredentialTokenPayloadDto { - client_id: string; - client_secret: string; - audience?: string; - grant_type?: string = 'client_credentials'; - scope?: string; -} diff --git a/libs/client-registration/src/dtos/create-user.dto.ts b/libs/client-registration/src/dtos/create-user.dto.ts deleted file mode 100644 index 146abc1e9..000000000 --- a/libs/client-registration/src/dtos/create-user.dto.ts +++ /dev/null @@ -1,23 +0,0 @@ -/* eslint-disable camelcase */ -import { ApiExtraModels } from '@nestjs/swagger'; -// import { Role } from 'apps/platform-service/src/entities/role.entity'; - -@ApiExtraModels() -export class CreateUserDto { - id?: string; - username?: string; - email: string; - password: string; - logo_uri?: string; - token_lifetime?: number; - is_active?: boolean; - firstName?: string; - lastName?: string; - // role?: Role; - isEmailVerified?: boolean; - createdBy?: string; - clientId?: string; - clientSecret?: string; - supabaseUserId?: string; - isHolder?: boolean; -} diff --git a/libs/client-registration/src/dtos/userTokenPayloadDto.ts b/libs/client-registration/src/dtos/userTokenPayloadDto.ts deleted file mode 100644 index d1e89bf86..000000000 --- a/libs/client-registration/src/dtos/userTokenPayloadDto.ts +++ /dev/null @@ -1,9 +0,0 @@ -export class userTokenPayloadDto { - client_id: string; - client_secret: string; - username: string; - password: string; - grant_type?: string = 'password'; - - } - \ No newline at end of file diff --git a/libs/client-registration/src/index.ts b/libs/client-registration/src/index.ts deleted file mode 100644 index 470b28a05..000000000 --- a/libs/client-registration/src/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './client-registration.module'; -export * from './client-registration.service'; diff --git a/libs/client-registration/src/interfaces/client.interface.ts b/libs/client-registration/src/interfaces/client.interface.ts deleted file mode 100644 index 59e78a52c..000000000 --- a/libs/client-registration/src/interfaces/client.interface.ts +++ /dev/null @@ -1,8 +0,0 @@ -export interface IClientRoles { - id: string - name: string - description?: string - composite?: boolean - clientRole?: boolean - containerId?: string -} \ No newline at end of file diff --git a/libs/client-registration/tsconfig.lib.json b/libs/client-registration/tsconfig.lib.json deleted file mode 100644 index fb3f93c0f..000000000 --- a/libs/client-registration/tsconfig.lib.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "declaration": true, - "outDir": "../../dist/libs/client-registration" - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] -} diff --git a/libs/common/index.ts b/libs/common/index.ts new file mode 100644 index 000000000..e6918d588 --- /dev/null +++ b/libs/common/index.ts @@ -0,0 +1 @@ +export * from './src' \ No newline at end of file diff --git a/libs/common/package.json b/libs/common/package.json index 16a53aeb6..a3317fa34 100644 --- a/libs/common/package.json +++ b/libs/common/package.json @@ -1,38 +1,43 @@ { "name": "@credebl/common", - "main": "src/index", - "types": "src/index", - "version": "0.0.1", - "files": [ - "dist" - ], + "version": "2.0.0", + "main": "dist/src/index.js", + "types": "dist/src/index.d.ts", + "license": "Apache-2.0", + "publishConfig": { + "main": "dist/index.js", + "types": "dist/index.d.ts", + "access": "public" + }, "scripts": { "build": "pnpm run clean && pnpm run compile", - "clean": "rimraf ../../dist/libs/common", - "compile": "tsc -p tsconfig.build.json", + "clean": "rimraf ./dist", + "compile": "tsc -p tsconfig.lib.json", "test": "jest" }, "dependencies": { - "@nestjs/axios": "^3.0.0", - "@nestjs/common": "^10.2.7", - "@nestjs/core": "^10.1.3", - "@nestjs/testing": "^10.1.3", - "@nestjs/microservices": "^10.1.3", - "@nestjs/swagger": "^7.1.6", - "@prisma/client": "^5.1.1", + "@credebl/prisma-service": "file:../../credebl-prisma-service-2.0.0.tgz", + "@nestjs/axios": "^3.1.3", + "@nestjs/common": "^10.4.20", + "@nestjs/core": "^10.4.20", + "@nestjs/microservices": "^10.4.20", + "@nestjs/swagger": "^7.4.2", + "@nestjs/testing": "^10.4.20", "@sendgrid/mail": "^7.7.0", + "axios": "^1.11.0", "class-transformer": "^0.5.1", - "class-validator": "^0.14.0", - "crypto-js": "^4.1.1", - "dotenv": "^16.0.3", - "nats": "^2.15.1", - "rxjs": "^7.8.1", - "uuid": "^9.0.0" + "class-validator": "^0.14.2", + "crypto-js": "^4.2.0", + "dotenv": "^16.6.1", + "nats": "^2.29.3", + "nestjs-cls": "^4.5.0", + "rxjs": "^7.8.2", + "uuid": "^9.0.1" }, "devDependencies": { - "@types/crypto-js": "^4.1.1", - "reflect-metadata": "^0.1.13", - "rimraf": "^4.4.0", - "typescript": "^5.1.6" + "@types/crypto-js": "^4.2.2", + "reflect-metadata": "^0.1.14", + "rimraf": "^4.4.1", + "typescript": "^5.8.3" } } diff --git a/libs/common/src/common.module.ts b/libs/common/src/common.module.ts index 2b7967c30..a79676b6e 100644 --- a/libs/common/src/common.module.ts +++ b/libs/common/src/common.module.ts @@ -2,10 +2,12 @@ import { HttpModule } from '@nestjs/axios'; import { Module } from '@nestjs/common'; import { CommonService } from './common.service'; +import { ContextInterceptorModule, ContextModule, NatsInterceptor, NATSClient } from './utils'; +import { PrismaServiceModule } from '@credebl/prisma-service'; @Module({ - imports: [HttpModule], - providers: [CommonService], + imports: [HttpModule, ContextModule, ContextInterceptorModule, PrismaServiceModule], + providers: [CommonService, NatsInterceptor, NATSClient], exports: [CommonService] }) export class CommonModule {} diff --git a/libs/common/src/common.service.ts b/libs/common/src/common.service.ts index 68d251fce..49f36f6ea 100644 --- a/libs/common/src/common.service.ts +++ b/libs/common/src/common.service.ts @@ -11,10 +11,11 @@ import { BadRequestException, HttpException, HttpStatus, Injectable, Logger, Not import { CommonConstants } from './common.constant'; import { HttpService } from '@nestjs/axios'; import * as dotenv from 'dotenv'; -import { ResponseMessages } from './response-messages'; +import { ResponseMessages } from './utils/response-messages'; import { IFormattedResponse, IOptionalParams } from './interfaces/interface'; -import { OrgAgentType } from '../../enum/src/enum'; +import { OrgAgentType } from './enum/enum'; import { RpcException } from '@nestjs/microservices'; +import { AxiosResponse } from 'axios'; dotenv.config(); @Injectable() @@ -63,7 +64,7 @@ export class CommonService { } } - async httpDelete(url: string, config?: unknown) { + async httpDelete(url: string, config?: unknown): Promise> { try { return await this.httpService .delete(url, config) diff --git a/libs/common/src/dtos/index.ts b/libs/common/src/dtos/index.ts new file mode 100644 index 000000000..35008ba69 --- /dev/null +++ b/libs/common/src/dtos/index.ts @@ -0,0 +1,2 @@ +export * from './email.dto'; +export * from './pagination.dto'; diff --git a/libs/enum/src/enum.ts b/libs/common/src/enum/enum.ts similarity index 91% rename from libs/enum/src/enum.ts rename to libs/common/src/enum/enum.ts index fa0eba90b..3e2c5be7c 100644 --- a/libs/enum/src/enum.ts +++ b/libs/common/src/enum/enum.ts @@ -8,6 +8,13 @@ export enum SortValue { DESC = 'desc' } +// export enum SortFields { +// CREATED_DATE_TIME = 'createDateTime', +// SCHEMA_ID = 'schemaId', +// CONNECTION_ID = 'connectionId', +// STATE = 'state' +// } + export enum SortFields { ID = 'id', CREATED_DATE_TIME = 'createDateTime', @@ -18,6 +25,12 @@ export enum SortFields { ISSUER_ID = 'issuerId' } +export enum ConnectionSortFields { + CREATED_DATE_TIME = 'createDateTime', + USER_LABEL = 'theirLabel', + CONNECTION_ID = 'connectionId' +} + export enum CredDefSortFields { CREATED_DATE_TIME = 'createDateTime', TAG = 'tag', @@ -257,3 +270,14 @@ export enum ProofType { POLYGON_PROOFTYPE = 'EcdsaSecp256k1Signature2019', NO_LEDGER_PROOFTYPE = 'Ed25519Signature2018' } + +export enum OrgRoles { + OWNER = 'owner', + SUPER_ADMIN = 'super_admin', + ADMIN = 'admin', + ISSUER = 'issuer', + VERIFIER = 'verifier', + HOLDER = 'holder', + MEMBER = 'member', + PLATFORM_ADMIN = 'platform_admin' +} diff --git a/libs/common/src/enum/index.ts b/libs/common/src/enum/index.ts new file mode 100644 index 000000000..bdd505d9c --- /dev/null +++ b/libs/common/src/enum/index.ts @@ -0,0 +1 @@ +export * from './enum'; diff --git a/libs/common/src/index.ts b/libs/common/src/index.ts index 90573502c..50d7466b8 100644 --- a/libs/common/src/index.ts +++ b/libs/common/src/index.ts @@ -1,3 +1,10 @@ +export * from './utils/helpers/cast.helper'; +export * from './common.constant'; export * from './common.module'; export * from './common.service'; -export * from './nats.interceptor'; +export * from './utils'; +export * from './dtos'; +export * from './enum'; +export * from './interfaces'; +export * from './service'; +export * from './custom-overrideable-validation-pipe'; diff --git a/libs/common/src/interfaces/cloud-wallet.interface.ts b/libs/common/src/interfaces/cloud-wallet.interface.ts index f4d8ab52f..75bf44184 100644 --- a/libs/common/src/interfaces/cloud-wallet.interface.ts +++ b/libs/common/src/interfaces/cloud-wallet.interface.ts @@ -1,5 +1,4 @@ -import { CloudWalletType } from '../../../enum/src/enum'; -import { $Enums } from '@prisma/client'; +import { CloudWalletType } from '../enum/enum'; export class ICreateCloudWallet { label: string; @@ -73,7 +72,7 @@ export interface IGetStoredWalletInfo { email: string; userId: string; id: string; - type: $Enums.CloudWalletType; + type: CloudWalletType; agentEndpoint: string; } @@ -104,7 +103,7 @@ export interface IGetStoredWalletInfo { email: string; userId: string; id: string; - type: $Enums.CloudWalletType; + type: CloudWalletType; agentEndpoint: string; } @@ -177,7 +176,7 @@ export interface CloudWallet { label: string; tenantId: string; email: string; - type: $Enums.CloudWalletType; + type: CloudWalletType; createDateTime: Date; createdBy: string; lastChangedDateTime: Date; @@ -265,7 +264,7 @@ export interface ICreateConnection { email: string; } -export interface Invitation { +export interface ICloudWalletInvitation { '@type': string; '@id': string; label: string; @@ -288,7 +287,7 @@ export interface OutOfBandRecord { metadata: Record; id: string; createdAt: string; - outOfBandInvitation: Invitation; + outOfBandInvitation: ICloudWalletInvitation; role: string; state: string; alias: string; @@ -303,7 +302,7 @@ export interface Tags { export interface IConnectionInvitationResponse { invitationUrl: string; - invitation: Invitation; + invitation: ICloudWalletInvitation; outOfBandRecord: OutOfBandRecord; invitationDid: string; } diff --git a/libs/common/src/interfaces/cred-def.interface.ts b/libs/common/src/interfaces/cred-def.interface.ts index dc9a45f0f..ac07c6622 100644 --- a/libs/common/src/interfaces/cred-def.interface.ts +++ b/libs/common/src/interfaces/cred-def.interface.ts @@ -1,33 +1,32 @@ -export interface ICredDefDetails extends IPaginationDetails{ - data: ICredDefData[]; +export interface ICredDefDetails extends IPaginationDetails { + data: ICredDefWithSchemaData[]; } -export interface ICredDefData { - createDateTime: Date; - createdBy: string; - credentialDefinitionId: string; - tag: string; - schemaLedgerId: string; - schemaId: string; - orgId: string; - revocable: boolean; +export interface ICredDefWithSchemaData { + createDateTime: Date; + createdBy: string; + credentialDefinitionId: string; + tag: string; + schemaLedgerId: string; + schemaId: string; + orgId: string; + revocable: boolean; } export interface IPlatformCredDefDetails { - credDefCount: number; - credDefResult: ICredDefData[]; - } + credDefCount: number; + credDefResult: ICredDefWithSchemaData[]; +} + +export interface IPaginationDetails { + totalItems: number; + hasNextPage: boolean; + hasPreviousPage: boolean; + nextPage: number; + previousPage: number; + lastPage: number; +} - export interface IPaginationDetails { - totalItems: number; - hasNextPage: boolean; - hasPreviousPage: boolean; - nextPage: number; - previousPage: number; - lastPage: number; - } - - export interface IPlatformCredDefsData extends IPaginationDetails{ - data: ICredDefData[]; - } - \ No newline at end of file +export interface IPlatformCredDefsData extends IPaginationDetails { + data: ICredDefWithSchemaData[]; +} diff --git a/libs/common/src/interfaces/index.ts b/libs/common/src/interfaces/index.ts new file mode 100644 index 000000000..a62d5f80d --- /dev/null +++ b/libs/common/src/interfaces/index.ts @@ -0,0 +1,14 @@ +export * from './agent-service.interface'; +export * from './cloud-wallet.interface'; +export * from './connection.interface'; +export * from './cred-def.interface'; +export * from './did.interface'; +export * from './geolocation.interface'; +export * from './interface'; +export * from './issuance.interface'; +export * from './organization.interface'; +export * from './response.interface'; +export * from './schema.interface'; +export * from './user.interface'; +export * from './verification.interface'; +export * from './webhook.interface'; diff --git a/libs/common/src/interfaces/interface.ts b/libs/common/src/interfaces/interface.ts index 4116d21f8..25757debe 100644 --- a/libs/common/src/interfaces/interface.ts +++ b/libs/common/src/interfaces/interface.ts @@ -1,4 +1,4 @@ -import { W3CSchemaDataType } from '@credebl/enum/enum'; +import { W3CSchemaDataType } from '../enum'; export interface ResponseType { statusCode: number; diff --git a/libs/common/src/interfaces/organization.interface.ts b/libs/common/src/interfaces/organization.interface.ts index 32d9a24d9..e1528f91f 100644 --- a/libs/common/src/interfaces/organization.interface.ts +++ b/libs/common/src/interfaces/organization.interface.ts @@ -1,111 +1,235 @@ - export interface IOrganization { - id: string - createDateTime: Date - createdBy: string - lastChangedDateTime: Date - lastChangedBy: string - name: string - description: string - orgSlug: string - logoUrl: string - website: string - publicProfile: boolean - userOrgRoles: UserOrgRole[] - } - - export interface UserOrgRole { - id: string - userId: string - orgRoleId: string - orgId: string - user: User - orgRole: IOrgRoles - } - - export interface User { - email: string - username: string - id: string - firstName: string - lastName: string - isEmailVerified: boolean - } - - export interface IOrgRoles { - id: string - name: string - description: string - createDateTime: Date - createdBy: string - lastChangedDateTime: Date - lastChangedBy: string - } + id: string; + createDateTime: Date; + createdBy: string; + lastChangedDateTime: Date; + lastChangedBy: string; + name: string; + description: string; + orgSlug: string; + logoUrl: string; + website: string; + publicProfile: boolean; + userOrgRoles: UserOrgRole[]; +} + +interface ISchema { + id: string; + name: string; +} + +interface IOrgAgents { + agent_invitations: IAgentInvitation[]; + ledgers: ILedgers; + org_agent_type: IOrgAgentType; +} + +interface IAgentInvitation { + id: string; + connectionInvitation: string; + multiUse: boolean; +} + +interface IGetAllOrganizations { + id: string; + name: string; + description: string; + logoUrl: string; + orgSlug: string; + userOrgRoles: IUserOrganizationRoles[]; +} +export interface IGetOrganization { + totalCount: number; + totalPages: number; + organizations: IGetAllOrganizations[]; +} + +interface IUserOrganizationRoles { + id: string; + orgRole: IOrgRole; +} + +export interface IOrgUsers { + totalPages: number; + users: OrgUser[]; +} + +interface OrgUser { + id: string; + username: string; + email: string; + firstName: string; + lastName: string; + isEmailVerified: boolean; + userOrgRoles: UserOrgRoles[]; +} + +interface UserOrgRoles { + id: string; + orgId: string; + orgRoleId: string; + orgRole: OrgRole; + organisation: Organization; +} + +interface OrgRole { + id: string; + name: string; + description: string; +} + +interface Organization { + id: string; + name: string; + description: string; + orgSlug: string; + logoUrl: string; + org_agents: OrgAgents[]; +} + +interface OrgAgents { + id: string; + orgDid: string; + walletName: string; + agentSpinUpStatus: number; + agentsTypeId: string; + createDateTime: Date; + orgAgentTypeId: string; +} + +export interface IOrgRole { + id: string; + name: string; + description: string; +} + +interface ILedgers { + id: string; + name: string; + networkType: string; +} +interface IOrgAgentType { + id: string; + createDateTime: Date; + lastChangedDateTime: Date; + agent: string; +} +export interface IUserOrgRole { + user: string; + orgRole: string; +} + +export interface IGetOrgById { + id: string; + name: string; + description: string; + orgSlug: string; + logoUrl: string; + website: string; + publicProfile: boolean; + schema: ISchema[]; + org_agents: IOrgAgents[]; +} + +export interface IDidList { + id: string; + createDateTime: Date; + did: string; + lastChangedDateTime: Date; + isPrimaryDid: boolean; +} + +export interface UserOrgRole { + id: string; + userId: string; + orgRoleId: string; + orgId: string; + user: User; + orgRole: IOrgRoles; +} + +export interface User { + email: string; + username: string; + id: string; + firstName: string; + lastName: string; + isEmailVerified: boolean; +} + +export interface IOrgRoles { + id: string; + name: string; + description: string; + createDateTime: Date; + createdBy: string; + lastChangedDateTime: Date; + lastChangedBy: string; +} export interface IOrgCredentials { - idpId?: string, - clientId: string, - clientSecret: string + idpId?: string; + clientId: string; + clientSecret: string; } export interface IOrganizationDashboard { - usersCount: number, - schemasCount: number, - credentialsCount: number, - presentationsCount: number -} - - export interface IOrganizationInvitations { - totalPages: number; - invitations: IOrgInvitation[]; - } - - interface IOrgInvitation { - id: string, - orgId: string, - email: string, - userId: string, - status: string, - orgRoles: string[], - createDateTime: Date, - createdBy:string, - organisation: IOrganizations; - } - - interface IOrganizations { - id: string; - name: string; - logoUrl: string; - } - - export interface IDeleteOrganization { - id: string; - createDateTime: Date; - createdBy: string; - lastChangedDateTime: Date; - lastChangedBy: string; - name: string; - description: string; - orgSlug: string; - logoUrl: string; - website: string; - publicProfile: boolean; - idpId: string; - clientId: string; - clientSecret: string; - } - - export interface IOrgData extends IDeleteOrganization{ - registrationNumber: string, - country: string, - city: string, - state: string - } - - export interface IOrgActivityCount { - verificationRecordsCount: number; - issuanceRecordsCount: number; - connectionRecordsCount: number; - orgUsersCount: number; - orgInvitationsCount: number; - } - \ No newline at end of file + usersCount: number; + schemasCount: number; + credentialsCount: number; + presentationsCount: number; +} + +export interface IOrganizationInvitations { + totalPages: number; + invitations: IOrgInvitation[]; +} + +interface IOrgInvitation { + id: string; + orgId: string; + email: string; + userId: string; + status: string; + orgRoles: string[]; + createDateTime: Date; + createdBy: string; + organisation: IOrganizations; +} + +interface IOrganizations { + id: string; + name: string; + logoUrl: string; +} + +export interface IDeleteOrganization { + id: string; + createDateTime: Date; + createdBy: string; + lastChangedDateTime: Date; + lastChangedBy: string; + name: string; + description: string; + orgSlug: string; + logoUrl: string; + website: string; + publicProfile: boolean; + idpId: string; + clientId: string; + clientSecret: string; +} + +export interface IOrgData extends IDeleteOrganization { + registrationNumber: string; + country: string; + city: string; + state: string; +} + +export interface IOrgActivityCount { + verificationRecordsCount: number; + issuanceRecordsCount: number; + connectionRecordsCount: number; + orgUsersCount: number; + orgInvitationsCount: number; +} diff --git a/libs/common/src/interfaces/response.interface.ts b/libs/common/src/interfaces/response.interface.ts index 6c1b4160a..6e945590d 100644 --- a/libs/common/src/interfaces/response.interface.ts +++ b/libs/common/src/interfaces/response.interface.ts @@ -1,13 +1,13 @@ -export default interface IResponseType { +export interface IResponseType { statusCode: number; message?: string; label?: string; data?: unknown; error?: unknown; -}; +} export interface IResponse { statusCode: number; message: string; label?: string; data?: unknown; -}; +} diff --git a/libs/common/src/interfaces/schema.interface.ts b/libs/common/src/interfaces/schema.interface.ts index 2e9467280..e5a67acbc 100644 --- a/libs/common/src/interfaces/schema.interface.ts +++ b/libs/common/src/interfaces/schema.interface.ts @@ -1,118 +1,112 @@ +import { IPaginationDetails } from './cred-def.interface'; -export interface IPaginationDetails { - totalItems: number; - hasNextPage: boolean; - hasPreviousPage: boolean; - nextPage: number; - previousPage: number; - lastPage: number; +export interface ISchemasWithPagination extends IPaginationDetails { + data: ISchemaData[]; } +export interface ISchemaData extends ISchema { + orgId: string; +} -export interface ISchemasWithPagination extends IPaginationDetails{ - data: ISchemaData[]; - } +export interface ISchemaDetails extends IPaginationDetails { + data: ISchema[]; +} - export interface ISchemaData extends ISchema { - orgId: string; - } +export interface UpdateSchemaResponse { + count: number; +} + +export interface IW3CSchema { + response: { + did: string; + schemaId: string; + schemaTxnHash: string; + resourceTxnHash: string; + }; +} +interface ISchema { + createDateTime: Date; + createdBy: string; + name: string; + schemaLedgerId: string; + version: string; + attributes: string; + publisherDid: string; + issuerId: string; +} - export interface ISchemaDetails extends IPaginationDetails{ - data: ISchema[]; - } +interface Attribute { + attributeName: string; + schemaDataType: string; + displayName: string; + isRequired: boolean; +} - export interface IW3CSchema { - response: { - did: string, - schemaId: string, - schemaTxnHash: string, - resourceTxnHash: string - } - } - interface ISchema { - createDateTime: Date; - createdBy: string; - name: string; - schemaLedgerId: string; - version: string; - attributes: string; - publisherDid: string; - issuerId: string; - } - - interface Attribute { - attributeName: string; - schemaDataType: string; - displayName: string; - isRequired: boolean; - } - - export interface ISchemaDetail { - id: string; - createDateTime: string; - createdBy: string; - lastChangedDateTime: string; - lastChangedBy: string; +export interface ISchemaDetail { + id: string; + createDateTime: string; + createdBy: string; + lastChangedDateTime: string; + lastChangedBy: string; + name: string; + version: string; + attributes: Attribute[]; + schemaLedgerId: string; + publisherDid: string; + issuerId: string; + orgId: string; + ledgerId: string; + type: string; + isSchemaArchived: boolean; + organisation: { name: string; - version: string; - attributes: Attribute[]; - schemaLedgerId: string; - publisherDid: string; - issuerId: string; - orgId: string; - ledgerId: string; - type: string; - isSchemaArchived: boolean, - organisation: { - name: string - } - } + }; +} + +export interface IPlatformSchemas { + schemasCount: number; + schemasResult: ISchemaData[]; +} + +export interface ICredDefData { + tag: string; + credentialDefinitionId: string; + schemaLedgerId: string; + revocable: boolean; + createDateTime?: Date; +} + +export interface ICredDefWithPagination extends IPaginationDetails { + data: ICredDefData[]; +} - export interface IPlatformSchemas { - schemasCount: number; - schemasResult: ISchemaData[]; - } - - export interface ICredDefData { - tag: string; - credentialDefinitionId: string; - schemaLedgerId: string; - revocable: boolean; - createDateTime?: Date; - } - - export interface ICredDefWithPagination extends IPaginationDetails{ - data: ICredDefData[]; - } +export interface ICredDefWithCount { + credDefCount: number; + credDefResult: ICredDefData[]; +} - export interface ICredDefWithCount { - credDefCount: number; - credDefResult: ICredDefData[]; - } +export interface INetworkUrl { + networkUrl: string; +} - export interface INetworkUrl { - networkUrl: string; - } +export interface ISchemaFields { + name?: string; + schemaName?: string; + attributes?: IIndySchemaAttributesValue[]; + schemaAttributes?: IW3CSchemaAttributesValue[]; + endorse?: boolean; + version?: string; + did?: string; + description?: string; +} - export interface ISchemaFields { - name?: string; - schemaName?: string; - attributes?: IIndySchemaAttributesValue[]; - schemaAttributes?: IW3CSchemaAttributesValue[]; - endorse?: boolean; - version?: string; - did?: string; - description?: string; - } +interface IIndySchemaAttributesValue { + attributeName: string; + schemaDataType: string; + displayName: string; +} - interface IIndySchemaAttributesValue { - attributeName: string; - schemaDataType: string; - displayName: string; - } - - interface IW3CSchemaAttributesValue { - title: string; - type: string; - } - +interface IW3CSchemaAttributesValue { + title: string; + type: string; +} diff --git a/libs/common/src/interfaces/user.interface.ts b/libs/common/src/interfaces/user.interface.ts index 998be0e70..9e20560c1 100644 --- a/libs/common/src/interfaces/user.interface.ts +++ b/libs/common/src/interfaces/user.interface.ts @@ -1,53 +1,90 @@ +import { IOrgRole } from './organization.interface'; + +export interface ICheckUserDetails { + isEmailVerified?: boolean; + isFidoVerified?: boolean; + isRegistrationCompleted?: boolean; + userId?: number; + message?: string; +} + +export interface IUsersProfile { + id: string; + username?: string; + email?: string; + firstName?: string; + lastName?: string; + supabaseUserId?: string; + keycloakUserId?: string; + userOrgRoles?: IUserOrgRole[]; +} + +interface IUserOrgRole { + id: string; + userId: string; + orgRoleId: string; + orgId: string; + orgRole: IOrgRole; + organisation: IOrganisation; +} +export interface IOrganisation { + id: string; + name: string; + description: string; + orgSlug: string; + logoUrl: string; + website: string; + publicProfile: boolean; + countryId: number; + stateId: number; + cityId: number; +} + export interface ISignInUser { - access_token: string; - token_type?: string; - expires_in?: number; - expires_at?: number; - refresh_token?: string; - isRegisteredToSupabase?: boolean; - } - export interface IVerifyUserEmail{ - email: string; - verificationCode: string; - } - export interface ISendVerificationEmail { - email: string; - clientId?: string; - clientSecret?: string; - username?: string; - brandLogoUrl?: string; - platformName?: string; - } - - export interface IUserInvitations { - totalPages:number; - userInvitationsData:IUserInvitationsData[]; - } - export interface IUserInvitationsData { - orgRoles: IOrgRole[]; - status: string; - id: string; - orgId: string; - organisation: IOrganisation; - userId: string; - } - export interface IOrgRole { - id: string; - name: string; - description: string; - } - - export interface IOrganisation { - id: string; - name: string; - logoUrl: string; - } - - export interface IResetPasswordResponse { - id: string; - email: string; - } + access_token: string; + token_type?: string; + expires_in?: number; + expires_at?: number; + refresh_token?: string; + isRegisteredToSupabase?: boolean; +} +export interface IVerifyUserEmail { + email: string; + verificationCode: string; +} +export interface ISendVerificationEmail { + email: string; + clientId?: string; + clientSecret?: string; + username?: string; + brandLogoUrl?: string; + platformName?: string; +} + +export interface IUserInvitations { + totalPages: number; + userInvitationsData: IUserInvitationsData[]; +} +export interface IUserInvitationsData { + orgRoles: IOrgRole[]; + status: string; + id: string; + orgId: string; + organisation: IOrganisation; + userId: string; +} + +export interface IOrganisation { + id: string; + name: string; + logoUrl: string; +} + +export interface IResetPasswordResponse { + id: string; + email: string; +} export interface ISignUpUserResponse { - userId: string -} \ No newline at end of file + userId: string; +} diff --git a/libs/common/src/interfaces/verification.interface.ts b/libs/common/src/interfaces/verification.interface.ts index 762512cbd..799711af9 100644 --- a/libs/common/src/interfaces/verification.interface.ts +++ b/libs/common/src/interfaces/verification.interface.ts @@ -1,5 +1,6 @@ -import { Prisma } from '@prisma/client'; - +export type BatchPayload = { + count: number +} export interface IProofPresentationsListCount { proofRequestsCount: number; proofRequestsList: IProofPresentationItem[]; @@ -32,7 +33,7 @@ export interface IProofPresentationDetails { certificateTemplate?: string; } export interface IVerificationRecords { - deleteResult: Prisma.BatchPayload; + deleteResult: BatchPayload; recordsToDelete: IRecords[]; } diff --git a/libs/common/src/interfaces/webhook.interface.ts b/libs/common/src/interfaces/webhook.interface.ts index c483444d6..7a5ead3d2 100644 --- a/libs/common/src/interfaces/webhook.interface.ts +++ b/libs/common/src/interfaces/webhook.interface.ts @@ -1,4 +1,12 @@ export interface IWebhookUrl { - orgId?: string; - tenantId?: string; - } \ No newline at end of file + orgId?: string; + tenantId?: string; +} + +export interface ICreateWebhookUrl { + webhookUrl: string; +} + +export interface IGetWebhookUrl { + webhookUrl: string; +} diff --git a/libs/service/base.service.ts b/libs/common/src/service/base.service.ts similarity index 100% rename from libs/service/base.service.ts rename to libs/common/src/service/base.service.ts diff --git a/libs/common/src/service/index.ts b/libs/common/src/service/index.ts new file mode 100644 index 000000000..168641bd0 --- /dev/null +++ b/libs/common/src/service/index.ts @@ -0,0 +1 @@ +export * from './base.service'; diff --git a/libs/common/src/common.utils.ts b/libs/common/src/utils/common.utils.ts similarity index 97% rename from libs/common/src/common.utils.ts rename to libs/common/src/utils/common.utils.ts index ed84515c3..411eced83 100644 --- a/libs/common/src/common.utils.ts +++ b/libs/common/src/utils/common.utils.ts @@ -1,7 +1,7 @@ import { NotFoundException } from '@nestjs/common'; import * as dotenv from 'dotenv'; import { ResponseMessages } from './response-messages'; -import { CommonConstants } from './common.constant'; +import { CommonConstants } from '../common.constant'; dotenv.config(); /* eslint-disable camelcase */ // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/explicit-function-return-type diff --git a/libs/context/src/contextInterceptorModule.ts b/libs/common/src/utils/context/contextInterceptorModule.ts similarity index 100% rename from libs/context/src/contextInterceptorModule.ts rename to libs/common/src/utils/context/contextInterceptorModule.ts diff --git a/libs/context/src/contextModule.ts b/libs/common/src/utils/context/contextModule.ts similarity index 100% rename from libs/context/src/contextModule.ts rename to libs/common/src/utils/context/contextModule.ts diff --git a/libs/context/src/contextStorageService.interface.ts b/libs/common/src/utils/context/contextStorageService.interface.ts similarity index 80% rename from libs/context/src/contextStorageService.interface.ts rename to libs/common/src/utils/context/contextStorageService.interface.ts index 2ad6d8f20..4316180ba 100644 --- a/libs/context/src/contextStorageService.interface.ts +++ b/libs/common/src/utils/context/contextStorageService.interface.ts @@ -1,6 +1,6 @@ export const ContextStorageServiceKey = Symbol(); -export default interface ContextStorageService { +export interface ContextStorageService { setContextId(contextId: string): void; getContextId(): string; get(key: string): T | undefined; diff --git a/libs/common/src/utils/context/index.ts b/libs/common/src/utils/context/index.ts new file mode 100644 index 000000000..2150834e7 --- /dev/null +++ b/libs/common/src/utils/context/index.ts @@ -0,0 +1,4 @@ +export * from './contextInterceptorModule'; +export * from './contextModule'; +export * from './contextStorageService.interface'; +export * from './nestjsClsContextStorageService'; diff --git a/libs/context/src/nestjsClsContextStorageService.ts b/libs/common/src/utils/context/nestjsClsContextStorageService.ts similarity index 88% rename from libs/context/src/nestjsClsContextStorageService.ts rename to libs/common/src/utils/context/nestjsClsContextStorageService.ts index 00107f21e..9bc384ae8 100644 --- a/libs/context/src/nestjsClsContextStorageService.ts +++ b/libs/common/src/utils/context/nestjsClsContextStorageService.ts @@ -1,4 +1,4 @@ -import ContextStorageService from './contextStorageService.interface'; +import { ContextStorageService } from './contextStorageService.interface'; import { CLS_ID, ClsService } from 'nestjs-cls'; import { Injectable } from '@nestjs/common'; diff --git a/libs/common/src/exception-handler.ts b/libs/common/src/utils/handlers/exception-handler.ts similarity index 100% rename from libs/common/src/exception-handler.ts rename to libs/common/src/utils/handlers/exception-handler.ts diff --git a/libs/http-exception.filter.ts b/libs/common/src/utils/handlers/http-exception.filter.ts similarity index 98% rename from libs/http-exception.filter.ts rename to libs/common/src/utils/handlers/http-exception.filter.ts index c7dc008fb..0e2f2b38a 100644 --- a/libs/http-exception.filter.ts +++ b/libs/common/src/utils/handlers/http-exception.filter.ts @@ -1,6 +1,6 @@ import { Catch, ExceptionFilter, HttpException, HttpStatus, Logger } from '@nestjs/common'; import { RpcException } from '@nestjs/microservices'; -import { PrismaClientKnownRequestError, PrismaClientValidationError } from '@prisma/client/runtime/library'; +import { PrismaClientKnownRequestError, PrismaClientValidationError } from '@credebl/prisma-service'; import { Observable, throwError } from 'rxjs'; @Catch() diff --git a/libs/common/src/utils/handlers/index.ts b/libs/common/src/utils/handlers/index.ts new file mode 100644 index 000000000..d6b92f95f --- /dev/null +++ b/libs/common/src/utils/handlers/index.ts @@ -0,0 +1,2 @@ +export * from './exception-handler'; +export * from './http-exception.filter'; diff --git a/libs/common/src/cast.helper.ts b/libs/common/src/utils/helpers/cast.helper.ts similarity index 98% rename from libs/common/src/cast.helper.ts rename to libs/common/src/utils/helpers/cast.helper.ts index a425f7dbf..787ca917f 100644 --- a/libs/common/src/cast.helper.ts +++ b/libs/common/src/utils/helpers/cast.helper.ts @@ -7,8 +7,8 @@ import { W3CSchemaDataType, ledgerLessDIDType, schemaRequestType -} from '../../enum/src/enum'; -import { ICredentialData, IJsonldCredential, IPrettyVc } from './interfaces/issuance.interface'; +} from '../../enum/enum'; +import { ICredentialData, IJsonldCredential, IPrettyVc } from '../../interfaces/issuance.interface'; import { ValidationArguments, ValidationOptions, @@ -19,8 +19,8 @@ import { registerDecorator } from 'class-validator'; -import { ISchemaFields } from './interfaces/schema.interface'; -import { ResponseMessages } from './response-messages'; +import { ISchemaFields } from '../../interfaces/schema.interface'; +import { ResponseMessages } from '../response-messages'; import { plainToClass } from 'class-transformer'; interface ToNumberOptions { diff --git a/libs/common/src/utils/helpers/index.ts b/libs/common/src/utils/helpers/index.ts new file mode 100644 index 000000000..87450ab7c --- /dev/null +++ b/libs/common/src/utils/helpers/index.ts @@ -0,0 +1,2 @@ +export * from './cast.helper'; +export * from './send-grid-helper-file'; diff --git a/libs/common/src/send-grid-helper-file.ts b/libs/common/src/utils/helpers/send-grid-helper-file.ts similarity index 92% rename from libs/common/src/send-grid-helper-file.ts rename to libs/common/src/utils/helpers/send-grid-helper-file.ts index 623d118e1..0477395e2 100644 --- a/libs/common/src/send-grid-helper-file.ts +++ b/libs/common/src/utils/helpers/send-grid-helper-file.ts @@ -1,6 +1,6 @@ import * as sendgrid from '@sendgrid/mail'; import * as dotenv from 'dotenv'; -import { EmailDto } from './dtos/email.dto'; +import { EmailDto } from '../../dtos/email.dto'; dotenv.config(); diff --git a/libs/common/src/utils/index.ts b/libs/common/src/utils/index.ts new file mode 100644 index 000000000..d990504c4 --- /dev/null +++ b/libs/common/src/utils/index.ts @@ -0,0 +1,7 @@ +export * from './context'; +export * from './handlers'; +export * from './helpers'; +export * from './nats'; +export * from './response-messages'; +export * from './validations'; +export * from './common.utils'; diff --git a/libs/common/src/NATSClient.ts b/libs/common/src/utils/nats/NATSClient.ts similarity index 87% rename from libs/common/src/NATSClient.ts rename to libs/common/src/utils/nats/NATSClient.ts index 219a85499..9fb9f68a9 100644 --- a/libs/common/src/NATSClient.ts +++ b/libs/common/src/utils/nats/NATSClient.ts @@ -5,7 +5,7 @@ import { ClientProxy, NatsRecordBuilder } from '@nestjs/microservices'; import { map } from 'rxjs/operators'; import * as nats from 'nats'; import { firstValueFrom } from 'rxjs'; -import ContextStorageService, { ContextStorageServiceKey } from '../../context/src/contextStorageService.interface'; +import { ContextStorageService, ContextStorageServiceKey } from '../context/contextStorageService.interface'; import { v4 } from 'uuid'; @Injectable() @@ -19,12 +19,14 @@ export class NATSClient { } // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types - sendNats(serviceProxy: ClientProxy, cmd: string, payload: any): Promise { + sendNats(serviceProxy: ClientProxy, cmd: string, payload: any, limit?: {type?: string, limit?: number }): Promise { this.logger.log(`Inside NATSClient for sendNats()`); const pattern = { cmd }; const headers = nats.headers(1, this.contextStorageService.getContextId()); const record = new NatsRecordBuilder(payload).setHeaders(headers).build(); + // Do something custom + return serviceProxy .send(pattern, record) .pipe( diff --git a/libs/common/src/utils/nats/index.ts b/libs/common/src/utils/nats/index.ts new file mode 100644 index 000000000..f1ae49e66 --- /dev/null +++ b/libs/common/src/utils/nats/index.ts @@ -0,0 +1,4 @@ +export * from './NATSClient'; +export * from './nats.config'; +export * from './nats.interceptor'; +export * from './nats.options'; diff --git a/libs/common/src/nats.config.ts b/libs/common/src/utils/nats/nats.config.ts similarity index 92% rename from libs/common/src/nats.config.ts rename to libs/common/src/utils/nats/nats.config.ts index 7fd1ff011..b068142bc 100644 --- a/libs/common/src/nats.config.ts +++ b/libs/common/src/utils/nats/nats.config.ts @@ -1,4 +1,4 @@ -import { NATSReconnects } from '../../enum/src/enum'; +import { NATSReconnects } from '../../enum/enum'; import { Authenticator, nkeyAuthenticator } from 'nats'; export const getNatsOptions = ( diff --git a/libs/common/src/nats.interceptor.ts b/libs/common/src/utils/nats/nats.interceptor.ts similarity index 92% rename from libs/common/src/nats.interceptor.ts rename to libs/common/src/utils/nats/nats.interceptor.ts index a26c54faf..e85a8954c 100644 --- a/libs/common/src/nats.interceptor.ts +++ b/libs/common/src/utils/nats/nats.interceptor.ts @@ -1,4 +1,4 @@ -import { ResponseMessages } from '@credebl/common/response-messages'; +import { ResponseMessages } from '../response-messages'; import { CallHandler, ExecutionContext, Injectable, NestInterceptor, HttpException, Logger } from '@nestjs/common'; import { Observable, throwError } from 'rxjs'; import { catchError } from 'rxjs/operators'; diff --git a/libs/service/nats.options.ts b/libs/common/src/utils/nats/nats.options.ts similarity index 100% rename from libs/service/nats.options.ts rename to libs/common/src/utils/nats/nats.options.ts diff --git a/libs/common/src/response-messages/index.ts b/libs/common/src/utils/response-messages/index.ts similarity index 100% rename from libs/common/src/response-messages/index.ts rename to libs/common/src/utils/response-messages/index.ts diff --git a/libs/validations/arrayKeyword.ts b/libs/common/src/utils/validations/arrayKeyword.ts similarity index 100% rename from libs/validations/arrayKeyword.ts rename to libs/common/src/utils/validations/arrayKeyword.ts diff --git a/libs/validations/exclusiveMaximum.ts b/libs/common/src/utils/validations/exclusiveMaximum.ts similarity index 100% rename from libs/validations/exclusiveMaximum.ts rename to libs/common/src/utils/validations/exclusiveMaximum.ts diff --git a/libs/validations/exclusiveMinimum.ts b/libs/common/src/utils/validations/exclusiveMinimum.ts similarity index 100% rename from libs/validations/exclusiveMinimum.ts rename to libs/common/src/utils/validations/exclusiveMinimum.ts diff --git a/libs/common/src/utils/validations/index.ts b/libs/common/src/utils/validations/index.ts new file mode 100644 index 000000000..d8a43171b --- /dev/null +++ b/libs/common/src/utils/validations/index.ts @@ -0,0 +1,17 @@ +export * from './arrayKeyword'; +export * from './exclusiveMaximum'; +export * from './exclusiveMinimum'; +export * from './keyword'; +export * from './maxItems'; +export * from './maxLength'; +export * from './maximum'; +export * from './minItems'; +export * from './minLength'; +export * from './minimum'; +export * from './multipleOf'; +export * from './numberKeyword'; +export * from './objectKeyword'; +export * from './pattern'; +export * from './stringKeyword'; +export * from './uniqueItems'; +export * from './validator'; diff --git a/libs/validations/keyword.ts b/libs/common/src/utils/validations/keyword.ts similarity index 100% rename from libs/validations/keyword.ts rename to libs/common/src/utils/validations/keyword.ts diff --git a/libs/validations/maxItems.ts b/libs/common/src/utils/validations/maxItems.ts similarity index 100% rename from libs/validations/maxItems.ts rename to libs/common/src/utils/validations/maxItems.ts diff --git a/libs/validations/maxLength.ts b/libs/common/src/utils/validations/maxLength.ts similarity index 100% rename from libs/validations/maxLength.ts rename to libs/common/src/utils/validations/maxLength.ts diff --git a/libs/validations/maximum.ts b/libs/common/src/utils/validations/maximum.ts similarity index 100% rename from libs/validations/maximum.ts rename to libs/common/src/utils/validations/maximum.ts diff --git a/libs/validations/minItems.ts b/libs/common/src/utils/validations/minItems.ts similarity index 100% rename from libs/validations/minItems.ts rename to libs/common/src/utils/validations/minItems.ts diff --git a/libs/validations/minLength.ts b/libs/common/src/utils/validations/minLength.ts similarity index 100% rename from libs/validations/minLength.ts rename to libs/common/src/utils/validations/minLength.ts diff --git a/libs/validations/minimum.ts b/libs/common/src/utils/validations/minimum.ts similarity index 100% rename from libs/validations/minimum.ts rename to libs/common/src/utils/validations/minimum.ts diff --git a/libs/validations/multipleOf.ts b/libs/common/src/utils/validations/multipleOf.ts similarity index 100% rename from libs/validations/multipleOf.ts rename to libs/common/src/utils/validations/multipleOf.ts diff --git a/libs/validations/numberKeyword.ts b/libs/common/src/utils/validations/numberKeyword.ts similarity index 100% rename from libs/validations/numberKeyword.ts rename to libs/common/src/utils/validations/numberKeyword.ts diff --git a/libs/validations/objectKeyword.ts b/libs/common/src/utils/validations/objectKeyword.ts similarity index 100% rename from libs/validations/objectKeyword.ts rename to libs/common/src/utils/validations/objectKeyword.ts diff --git a/libs/validations/pattern.ts b/libs/common/src/utils/validations/pattern.ts similarity index 100% rename from libs/validations/pattern.ts rename to libs/common/src/utils/validations/pattern.ts diff --git a/libs/validations/stringKeyword.ts b/libs/common/src/utils/validations/stringKeyword.ts similarity index 100% rename from libs/validations/stringKeyword.ts rename to libs/common/src/utils/validations/stringKeyword.ts diff --git a/libs/validations/uniqueItems.ts b/libs/common/src/utils/validations/uniqueItems.ts similarity index 100% rename from libs/validations/uniqueItems.ts rename to libs/common/src/utils/validations/uniqueItems.ts diff --git a/libs/common/src/validator.ts b/libs/common/src/utils/validations/validator.ts similarity index 91% rename from libs/common/src/validator.ts rename to libs/common/src/utils/validations/validator.ts index 3de39afb0..f222c1419 100644 --- a/libs/common/src/validator.ts +++ b/libs/common/src/utils/validations/validator.ts @@ -1,8 +1,8 @@ -import { DidMethod } from '../../enum/src/enum'; -import { IDidCreate } from './interfaces/did.interface'; +import { DidMethod } from '../../enum/enum'; +import { IDidCreate } from '../../interfaces/did.interface'; import { BadRequestException } from '@nestjs/common'; -import { ResponseMessages } from './response-messages'; -import { IProofRequestAttribute } from './interfaces/verification.interface'; +import { ResponseMessages } from '../response-messages'; +import { IProofRequestAttribute } from '../../interfaces/verification.interface'; export class Validator { static validateDid(createDid: IDidCreate): void { diff --git a/libs/common/tsconfig.build.json b/libs/common/tsconfig.build.json deleted file mode 100644 index 9dad2c02b..000000000 --- a/libs/common/tsconfig.build.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "../../tsconfig.build.json", - "compilerOptions": { - "outDir": "../../dist/libs/common" - }, - "include": ["src/**/*"] -} diff --git a/libs/common/tsconfig.json b/libs/common/tsconfig.json index 6a8e212c8..7b412184f 100644 --- a/libs/common/tsconfig.json +++ b/libs/common/tsconfig.json @@ -1,6 +1,9 @@ { "extends": "../../tsconfig.json", - "compilerOptions": { - "declaration": true, - } + // "compilerOptions": { + // "declaration": true, + // } + "include": [ + "src/**/*" + ] } diff --git a/libs/common/tsconfig.lib.json b/libs/common/tsconfig.lib.json new file mode 100644 index 000000000..432d15ddd --- /dev/null +++ b/libs/common/tsconfig.lib.json @@ -0,0 +1,21 @@ +{ + "extends": "../../tsconfig.build.json", + "compilerOptions": { + // "rootDir": ".", + "outDir": "./dist", // per-package output + // "composite": true, + // "declaration": true, + // "declarationMap": true + }, + "include": [ + "src/", + "index.ts" + ], + // "exclude": [ + // "node_modules", + // "test", + // "dist", + // "**/*.spec.ts", + // "scripts" + // ] +} \ No newline at end of file diff --git a/libs/config/src/index.ts b/libs/config/src/index.ts deleted file mode 100644 index 8d518dbf6..000000000 --- a/libs/config/src/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './config.service'; -export * from './config.module'; -export * from './global-config.module'; \ No newline at end of file diff --git a/libs/config/tsconfig.lib.json b/libs/config/tsconfig.lib.json deleted file mode 100644 index ec3efa642..000000000 --- a/libs/config/tsconfig.lib.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "declaration": true, - "outDir": "../../dist/libs/config" - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] -} diff --git a/libs/context/src/index.ts b/libs/context/src/index.ts deleted file mode 100644 index 1466bbdd3..000000000 --- a/libs/context/src/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './contextInterceptorModule'; -export * from './contextModule'; diff --git a/libs/context/tsconfig.lib.json b/libs/context/tsconfig.lib.json deleted file mode 100644 index b3cc2199f..000000000 --- a/libs/context/tsconfig.lib.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "declaration": true, - "outDir": "../../dist/libs/context" - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] -} diff --git a/libs/enum/src/enum.module.ts b/libs/enum/src/enum.module.ts deleted file mode 100644 index 3d3e871ff..000000000 --- a/libs/enum/src/enum.module.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Module } from '@nestjs/common'; -import { EnumService } from './enum.service'; - -@Module({ - providers: [EnumService], - exports: [EnumService] -}) -export class EnumModule {} diff --git a/libs/enum/src/enum.service.spec.ts b/libs/enum/src/enum.service.spec.ts deleted file mode 100644 index 59f9cbe13..000000000 --- a/libs/enum/src/enum.service.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { EnumService } from './enum.service'; - -describe('EnumService', () => { - let service: EnumService; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - providers: [EnumService] - }).compile(); - - service = module.get(EnumService); - }); - - it('should be defined', () => { - expect(service).toBeDefined(); - }); -}); diff --git a/libs/enum/src/enum.service.ts b/libs/enum/src/enum.service.ts deleted file mode 100644 index 6b825b134..000000000 --- a/libs/enum/src/enum.service.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { Injectable } from '@nestjs/common'; - -@Injectable() -export class EnumService {} diff --git a/libs/enum/src/index.ts b/libs/enum/src/index.ts deleted file mode 100644 index 535c1bd49..000000000 --- a/libs/enum/src/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './enum.module'; -export * from './enum.service'; diff --git a/libs/enum/tsconfig.lib.json b/libs/enum/tsconfig.lib.json deleted file mode 100644 index c388798d3..000000000 --- a/libs/enum/tsconfig.lib.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "declaration": true, - "outDir": "../../dist/libs/enum" - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] -} diff --git a/libs/keycloak-url/src/index.ts b/libs/keycloak-url/src/index.ts deleted file mode 100644 index 4457df5ce..000000000 --- a/libs/keycloak-url/src/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './keycloak-url.module'; -export * from './keycloak-url.service'; diff --git a/libs/keycloak-url/src/keycloak-url.module.ts b/libs/keycloak-url/src/keycloak-url.module.ts deleted file mode 100644 index 02d0c52ea..000000000 --- a/libs/keycloak-url/src/keycloak-url.module.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Module } from '@nestjs/common'; -import { KeycloakUrlService } from './keycloak-url.service'; - -@Module({ - providers: [KeycloakUrlService], - exports: [KeycloakUrlService] -}) -export class KeycloakUrlModule {} diff --git a/libs/keycloak-url/src/keycloak-url.service.ts b/libs/keycloak-url/src/keycloak-url.service.ts deleted file mode 100644 index fc259d1c2..000000000 --- a/libs/keycloak-url/src/keycloak-url.service.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { Injectable, Logger } from '@nestjs/common'; - -@Injectable() -export class KeycloakUrlService { - private readonly logger = new Logger('KeycloakUrlService'); - - - async createUserURL( - realm: string - ):Promise { - - return `${process.env.KEYCLOAK_DOMAIN}admin/realms/${realm}/users`; - } - - async getUserByUsernameURL( - realm: string, - username: string - ):Promise { - - return `${process.env.KEYCLOAK_DOMAIN}admin/realms/${realm}/users?username=${username}`; - } - - async GetUserInfoURL( - realm: string, - userid: string - ):Promise { - - return `${process.env.KEYCLOAK_DOMAIN}admin/realms/${realm}/users/${userid}`; - } - - async GetSATURL( - realm: string - ):Promise { - - return `${process.env.KEYCLOAK_DOMAIN}realms/${realm}/protocol/openid-connect/token`; - } - - async ResetPasswordURL( - realm: string, - userid: string - ):Promise { - - return `${process.env.KEYCLOAK_DOMAIN}admin/realms/${realm}/users/${userid}/reset-password`; - } - - - async CreateRealmURL():Promise { - return `${process.env.KEYCLOAK_DOMAIN}admin/realms`; - } - - async createClientURL( - realm: string - ):Promise { - - return `${process.env.KEYCLOAK_DOMAIN}admin/realms/${realm}/clients`; - } - - async GetClientURL( - realm: string, - clientid: string - ):Promise { - - return `${process.env.KEYCLOAK_DOMAIN}admin/realms/${realm}/clients?clientId=${clientid}`; - } - - async GetClientSecretURL( - realm: string, - clientid: string - ):Promise { - - return `${process.env.KEYCLOAK_DOMAIN}admin/realms/${realm}/clients/${clientid}/client-secret`; - } - - async GetClientRoleURL( - realm: string, - clientid: string, - roleName = '' - ):Promise { - - if ('' === roleName) { - return `${process.env.KEYCLOAK_DOMAIN}admin/realms/${realm}/clients/${clientid}/roles`; - } - - return `${process.env.KEYCLOAK_DOMAIN}admin/realms/${realm}/clients/${clientid}/roles/${roleName}`; - - } - - async GetRealmRoleURL( - realm: string, - roleName = '' - ):Promise { - - if ('' === roleName) { - return `${process.env.KEYCLOAK_DOMAIN}admin/realms/${realm}/roles`; - } - - return `${process.env.KEYCLOAK_DOMAIN}admin/realms/${realm}/roles/${roleName}`; - - } - - async GetClientUserRoleURL( - realm: string, - userId: string, - clientId?: string - ):Promise { - - if (clientId) { - return `${process.env.KEYCLOAK_DOMAIN}admin/realms/${realm}/users/${userId}/role-mappings/clients/${clientId}`; - } - - return `${process.env.KEYCLOAK_DOMAIN}admin/realms/${realm}/users/${userId}/role-mappings/realm`; - - } - - - async GetClientIdpURL( - realm: string, - idp: string - ):Promise { - - return `${process.env.KEYCLOAK_DOMAIN}admin/realms/${realm}/clients/${idp}`; - } - - async GetClient( - realm: string, - clientId: string - ):Promise { - - return `${process.env.KEYCLOAK_DOMAIN}admin/realms/${realm}/clients?clientId=${clientId}`; - } - -} diff --git a/libs/keycloak-url/tsconfig.lib.json b/libs/keycloak-url/tsconfig.lib.json deleted file mode 100644 index 6218a7ca6..000000000 --- a/libs/keycloak-url/tsconfig.lib.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "declaration": true, - "outDir": "../../dist/libs/keycloak-url" - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] -} diff --git a/libs/logger/package.json b/libs/logger/package.json new file mode 100644 index 000000000..f000abef3 --- /dev/null +++ b/libs/logger/package.json @@ -0,0 +1,41 @@ +{ + "name": "@credebl/logger", + "version": "2.0.0", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "license": "Apache-2.0", + "publishConfig": { + "main": "dist/index.js", + "types": "dist/index.d.ts", + "access": "public" + }, + "scripts": { + "build": "pnpm run clean && pnpm run compile", + "clean": "rimraf ./dist", + "compile": "tsc -p tsconfig.lib.json", + "generate": "npx prisma generate --schema=node_modules/@credebl/prisma-service/prisma/schema.prisma", + "cleanup": "rm -rf node_modules dist pnpm-lock.yaml && rm -rf ~/.cache/prisma ~/.pnpm-store", + "test": "jest" + }, + "dependencies": { + "@credebl/common": "file:../../credebl-common-2.0.0.tgz", + "@elastic/ecs-winston-format": "^1.5.3", + "@nestjs/axios": "^3.1.3", + "@nestjs/common": "^10.4.20", + "@nestjs/config": "^3.3.0", + "@nestjs/core": "^10.4.20", + "@nestjs/microservices": "^10.4.20", + "morgan": "^1.10.1", + "rxjs": "^7.8.2", + "uuid": "^9.0.1", + "winston": "~3.4.0", + "winston-daily-rotate-file": "^5.0.0", + "winston-elasticsearch": "0.16.0" + }, + "devDependencies": { + "@types/crypto-js": "^4.2.2", + "reflect-metadata": "^0.1.14", + "rimraf": "^4.4.1", + "typescript": "^5.8.3" + } +} diff --git a/libs/config/src/config.module.ts b/libs/logger/src/config.module.ts similarity index 86% rename from libs/config/src/config.module.ts rename to libs/logger/src/config.module.ts index dc9972dcb..ca05ee271 100644 --- a/libs/config/src/config.module.ts +++ b/libs/logger/src/config.module.ts @@ -1,6 +1,6 @@ import { Global, Module } from '@nestjs/common'; import { ConfigModule as NestConfigModule } from '@nestjs/config'; -import { ConfigService } from './config.service'; +import { ConfigService } from './services'; @Global() @Module({ diff --git a/libs/config/src/global-config.module.ts b/libs/logger/src/global-config.module.ts similarity index 66% rename from libs/config/src/global-config.module.ts rename to libs/logger/src/global-config.module.ts index ecc5f8750..52db87030 100644 --- a/libs/config/src/global-config.module.ts +++ b/libs/logger/src/global-config.module.ts @@ -1,4 +1,4 @@ -import { MICRO_SERVICE_NAME } from '@credebl/common/common.constant'; +import { MICRO_SERVICE_NAME } from '@credebl/common'; import { Module, Global } from '@nestjs/common'; @Global() @@ -11,4 +11,4 @@ import { Module, Global } from '@nestjs/common'; ], exports: [MICRO_SERVICE_NAME] }) -export class GlobalConfigModule {} \ No newline at end of file +export class GlobalConfigModule {} diff --git a/libs/logger/src/index.ts b/libs/logger/src/index.ts index bbf7c26d2..0005fa0be 100644 --- a/libs/logger/src/index.ts +++ b/libs/logger/src/index.ts @@ -1,2 +1,8 @@ +export * from './config.module'; +export * from './global-config.module'; +export * from './logger.enum'; +export * from './logger.interface'; export * from './logger.module'; -export * from './logger.service'; +export * from './services'; +export * from './transports'; +export * from './utils'; diff --git a/libs/logger/src/log.ts b/libs/logger/src/log.ts deleted file mode 100644 index 7456ef7b4..000000000 --- a/libs/logger/src/log.ts +++ /dev/null @@ -1,27 +0,0 @@ -export enum LogLevel { - Emergency = 'emergency', // One or more systems are unusable. - Fatal = 'fatal', // A person must take an action immediately - Error = 'error', // Error events are likely to cause problems - Warn = 'warn', // Warning events might cause problems in the future and deserve eyes - Info = 'info', // Routine information, such as ongoing status or performance - Debug = 'debug', // Debug or trace information - } - - export interface Log { - timestamp: number; // Unix timestamp - level: LogLevel; // Log level - message: string; // Log message - data: LogData; // Log data - } - - export interface LogData { - organization?: string; // Organization or project name - context?: string; // Bounded Context name - app?: string; // Application or Microservice name - sourceClass?: string; // Classname of the source - correlationId?: string; // Correlation ID - error?: Error; // Error object - // eslint-disable-next-line @typescript-eslint/no-explicit-any - props?: NodeJS.Dict; // Additional custom properties - } - \ No newline at end of file diff --git a/libs/logger/src/logger.enum.ts b/libs/logger/src/logger.enum.ts new file mode 100644 index 000000000..a0e61c5d0 --- /dev/null +++ b/libs/logger/src/logger.enum.ts @@ -0,0 +1,8 @@ +export enum LogLevel { + Emergency = 'emergency', // One or more systems are unusable. + Fatal = 'fatal', // A person must take an action immediately + Error = 'error', // Error events are likely to cause problems + Warn = 'warn', // Warning events might cause problems in the future and deserve eyes + Info = 'info', // Routine information, such as ongoing status or performance + Debug = 'debug' // Debug or trace information +} diff --git a/libs/logger/src/logger.interface.ts b/libs/logger/src/logger.interface.ts index 012a874dd..936489878 100644 --- a/libs/logger/src/logger.interface.ts +++ b/libs/logger/src/logger.interface.ts @@ -1,15 +1,28 @@ -import { LogData, LogLevel } from '@credebl/logger/log'; +import { LogLevel } from './logger.enum'; export const LoggerBaseKey = Symbol(); export const LoggerKey = Symbol(); -export default interface Logger { - log( - level: LogLevel, - message: string | Error, - data?: LogData, - profile?: string, - ): void; +export interface Log { + timestamp: number; // Unix timestamp + level: LogLevel; // Log level + message: string; // Log message + data: LogData; // Log data +} + +export interface LogData { + organization?: string; // Organization or project name + context?: string; // Bounded Context name + app?: string; // Application or Microservice name + sourceClass?: string; // Classname of the source + correlationId?: string; // Correlation ID + error?: Error; // Error object + // eslint-disable-next-line @typescript-eslint/no-explicit-any + props?: NodeJS.Dict; // Additional custom properties +} + +export interface Logger { + log(level: LogLevel, message: string | Error, data?: LogData, profile?: string): void; debug(message: string, data?: LogData, profile?: string): void; info(message: string, data?: LogData, profile?: string): void; warn(message: string | Error, data?: LogData, profile?: string): void; @@ -17,4 +30,4 @@ export default interface Logger { fatal(message: string | Error, data?: LogData, profile?: string): void; emergency(message: string | Error, data?: LogData, profile?: string): void; startProfile(id: string): void; -}; +} diff --git a/libs/logger/src/logger.module.ts b/libs/logger/src/logger.module.ts index c7529d380..6762cc22d 100644 --- a/libs/logger/src/logger.module.ts +++ b/libs/logger/src/logger.module.ts @@ -1,24 +1,13 @@ -import { - Global, - Inject, - MiddlewareConsumer, - Module, - NestModule -} from '@nestjs/common'; +import { Global, Inject, MiddlewareConsumer, Module, NestModule } from '@nestjs/common'; -import WinstonLogger, { - WinstonLoggerTransportsKey -} from '@credebl/logger/winstonLogger'; -import Logger, { - LoggerBaseKey, - LoggerKey -} from '@credebl/logger/logger.interface'; -import NestjsLoggerServiceAdapter from '@credebl/logger/nestjsLoggerServiceAdapter'; -import ConsoleTransport from '@credebl/logger/transports/consoleTransport'; +import WinstonLogger, { WinstonLoggerTransportsKey } from './utils/winstonLogger'; +import { Logger, LoggerBaseKey, LoggerKey } from './logger.interface'; +import { NestjsLoggerServiceAdapter } from './utils/nestjsLoggerServiceAdapter'; +import ConsoleTransport from './transports/consoleTransport'; import * as morgan from 'morgan'; -import { ConfigService } from '../../config/src/config.service'; -import LoggerService from '@credebl/logger/logger.service'; -import { MICRO_SERVICE_NAME } from '@credebl/common/common.constant'; +import LoggerService from './services/logger.service'; +import { MICRO_SERVICE_NAME } from '@credebl/common'; +import { ConfigService } from './services'; @Global() @Module({ diff --git a/libs/logger/src/logging.interceptor.ts b/libs/logger/src/logging.interceptor.ts deleted file mode 100644 index 7a96ee996..000000000 --- a/libs/logger/src/logging.interceptor.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { Injectable, NestInterceptor, ExecutionContext, CallHandler, Inject } from '@nestjs/common'; -import { Observable, throwError } from 'rxjs'; -import { catchError } from 'rxjs/operators'; - -import ContextStorageService, { ContextStorageServiceKey } from '@credebl/context/contextStorageService.interface'; -import Logger, { LoggerKey } from './logger.interface'; -import { ClsService } from 'nestjs-cls'; -import { v4 } from 'uuid'; - -const isNullUndefinedOrEmpty = (obj: any): boolean => obj === null || obj === undefined || (typeof obj === 'object' && Object.keys(obj).length === 0); -@Injectable() -export class LoggingInterceptor implements NestInterceptor { - constructor( - private readonly clsService: ClsService, - @Inject(ContextStorageServiceKey) - private readonly contextStorageService: ContextStorageService, - @Inject(LoggerKey) private readonly _logger: Logger, - ) {} - // eslint-disable-next-line @typescript-eslint/no-explicit-any - intercept(context: ExecutionContext, next: CallHandler): Observable { - return this.clsService.run(() => { - - this._logger.info('In LoggingInterceptor configuration'); - const rpcContext = context.switchToRpc().getContext(); - const headers = rpcContext.getHeaders(); - - if (!isNullUndefinedOrEmpty(headers)) { - this.contextStorageService.set('x-correlation-id', headers._description); - this.contextStorageService.setContextId(headers._description); - } else { - const newContextId = v4(); - this.contextStorageService.set('x-correlation-id', newContextId); - this.contextStorageService.setContextId(newContextId); - } - - return next.handle().pipe( - catchError((err) => { - this._logger.error(err); - return throwError(() => err); - }) - ); - - }); - - } - -} diff --git a/libs/config/src/config.service.ts b/libs/logger/src/services/config.service.ts similarity index 92% rename from libs/config/src/config.service.ts rename to libs/logger/src/services/config.service.ts index f94305b82..66d1a3efd 100644 --- a/libs/config/src/config.service.ts +++ b/libs/logger/src/services/config.service.ts @@ -1,4 +1,4 @@ -import { DevelopmentEnvironment } from '@credebl/enum/enum'; +import { DevelopmentEnvironment } from '@credebl/common'; import { Injectable } from '@nestjs/common'; import { ConfigService as NestConfigService } from '@nestjs/config'; diff --git a/libs/logger/src/services/index.ts b/libs/logger/src/services/index.ts new file mode 100644 index 000000000..e6d6ed605 --- /dev/null +++ b/libs/logger/src/services/index.ts @@ -0,0 +1,2 @@ +export * from './config.service'; +export * from './logger.service'; diff --git a/libs/logger/src/logger.service.ts b/libs/logger/src/services/logger.service.ts similarity index 77% rename from libs/logger/src/logger.service.ts rename to libs/logger/src/services/logger.service.ts index 69e3e69d5..0d3fff58c 100644 --- a/libs/logger/src/logger.service.ts +++ b/libs/logger/src/services/logger.service.ts @@ -1,14 +1,10 @@ import { Inject, Injectable, Scope } from '@nestjs/common'; import { INQUIRER } from '@nestjs/core'; -import Logger, { - LoggerBaseKey -} from '@credebl/logger/logger.interface'; -import { LogData, LogLevel } from '@credebl/logger/log'; +import { Logger, LoggerBaseKey, LogData } from '../logger.interface'; +import { LogLevel } from '../logger.enum'; import { ConfigService } from '@nestjs/config'; -import ContextStorageService, { - ContextStorageServiceKey -} from '@credebl/context/contextStorageService.interface'; -import { MICRO_SERVICE_NAME } from '@credebl/common/common.constant'; +import { ContextStorageService, ContextStorageServiceKey } from '@credebl/common'; +import { MICRO_SERVICE_NAME } from '@credebl/common'; @Injectable({ scope: Scope.TRANSIENT }) export default class LoggerService implements Logger { @@ -33,36 +29,31 @@ export default class LoggerService implements Logger { this.app = configService.get('APP'); } - public log( - level: LogLevel, - message: string | Error, - data?: LogData, - profile?: string, - ): void { + public log(level: LogLevel, message: string | Error, data?: LogData, profile?: string): void { return this.logger.log(level, message, this.getLogData(data), profile); } - public debug(message: string, data?: LogData, profile?: string) : void { + public debug(message: string, data?: LogData, profile?: string): void { return this.logger.debug(message, this.getLogData(data), profile); } - public info(message: string, data?: LogData, profile?: string) : void { + public info(message: string, data?: LogData, profile?: string): void { return this.logger.info(message, this.getLogData(data), profile); } - public warn(message: string | Error, data?: LogData, profile?: string) : void { + public warn(message: string | Error, data?: LogData, profile?: string): void { return this.logger.warn(message, this.getLogData(data), profile); } - public error(message: string | Error, data?: LogData, profile?: string) : void { + public error(message: string | Error, data?: LogData, profile?: string): void { return this.logger.error(message, this.getLogData(data), profile); } - public fatal(message: string | Error, data?: LogData, profile?: string) : void { + public fatal(message: string | Error, data?: LogData, profile?: string): void { return this.logger.fatal(message, this.getLogData(data), profile); } - public emergency(message: string | Error, data?: LogData, profile?: string) : void { + public emergency(message: string | Error, data?: LogData, profile?: string): void { return this.logger.emergency(message, this.getLogData(data), profile); } @@ -73,12 +64,11 @@ export default class LoggerService implements Logger { context: data?.context || this.context, app: data?.app || this.app, sourceClass: data?.sourceClass || this.sourceClass, - correlationId: - data?.correlationId || this.contextStorageService.getContextId() + correlationId: data?.correlationId || this.contextStorageService.getContextId() }; } - public startProfile(id: string) : void { + public startProfile(id: string): void { this.logger.startProfile(id); } } diff --git a/libs/logger/src/transports/consoleTransport.ts b/libs/logger/src/transports/consoleTransport.ts index e12b6c029..cf14bce9e 100644 --- a/libs/logger/src/transports/consoleTransport.ts +++ b/libs/logger/src/transports/consoleTransport.ts @@ -1,6 +1,6 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import * as winston from 'winston'; -import { LogLevel } from '@credebl/logger/log'; +import { LogLevel } from '../logger.enum'; enum LogColors { red = '\x1b[31m', @@ -9,7 +9,7 @@ enum LogColors { blue = '\x1b[34m', magenta = '\x1b[35m', cyan = '\x1b[36m', - pink = '\x1b[38;5;206m', + pink = '\x1b[38;5;206m' } interface LogData { label?: string; @@ -40,13 +40,9 @@ export default class ConsoleTransport { : ''; const message = ConsoleTransport.colorize(color, `${log.message}`); const error = data.error ? ` - ${data.error}` : ''; - const duration = data.durationMs !== undefined - ? ` +${data.durationMs}ms` - : ''; + const duration = data.durationMs !== undefined ? ` +${data.durationMs}ms` : ''; const stack = data.stack ? ` - ${data.stack}` : ''; - const props = data.props - ? `\n - Props: ${JSON.stringify(data.props, null, 4)}` - : ''; + const props = data.props ? `\n - Props: ${JSON.stringify(data.props, null, 4)}` : ''; return `${ConsoleTransport.colorize(color, `${prefix} -`)} ${timestamp} ${correlationId} ${level} ${sourceClass} ${message}${error}${duration}${stack}${props}`; }) diff --git a/libs/logger/src/transports/index.ts b/libs/logger/src/transports/index.ts new file mode 100644 index 000000000..9d81a2daa --- /dev/null +++ b/libs/logger/src/transports/index.ts @@ -0,0 +1,2 @@ +export * from './consoleTransport'; +export * from './fileTransport'; diff --git a/libs/logger/src/utils/index.ts b/libs/logger/src/utils/index.ts new file mode 100644 index 000000000..fe3d3762e --- /dev/null +++ b/libs/logger/src/utils/index.ts @@ -0,0 +1,3 @@ +export * from './logging.interceptor'; +export * from './nestjsLoggerServiceAdapter'; +export * from './winstonLogger'; diff --git a/libs/logger/src/utils/logging.interceptor.ts b/libs/logger/src/utils/logging.interceptor.ts new file mode 100644 index 000000000..5777f4e5a --- /dev/null +++ b/libs/logger/src/utils/logging.interceptor.ts @@ -0,0 +1,45 @@ +import { Injectable, NestInterceptor, ExecutionContext, CallHandler, Inject } from '@nestjs/common'; +import { Observable, throwError } from 'rxjs'; +import { catchError } from 'rxjs/operators'; + +import { ContextStorageService, ContextStorageServiceKey } from '@credebl/common'; +import { Logger, LoggerKey } from '../logger.interface'; +import { ClsService } from 'nestjs-cls'; +import { v4 } from 'uuid'; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const isNullUndefinedOrEmpty = (obj: any): boolean => + null === obj || obj === undefined || ('object' === typeof obj && 0 === Object.keys(obj).length); +@Injectable() +export class LoggingInterceptor implements NestInterceptor { + constructor( + private readonly clsService: ClsService, + @Inject(ContextStorageServiceKey) + private readonly contextStorageService: ContextStorageService, + @Inject(LoggerKey) private readonly _logger: Logger + ) {} + // eslint-disable-next-line @typescript-eslint/no-explicit-any + intercept(context: ExecutionContext, next: CallHandler): Observable { + return this.clsService.run(() => { + this._logger.info('In LoggingInterceptor configuration'); + const rpcContext = context.switchToRpc().getContext(); + const headers = rpcContext.getHeaders(); + + if (!isNullUndefinedOrEmpty(headers)) { + this.contextStorageService.set('x-correlation-id', headers._description); + this.contextStorageService.setContextId(headers._description); + } else { + const newContextId = v4(); + this.contextStorageService.set('x-correlation-id', newContextId); + this.contextStorageService.setContextId(newContextId); + } + + return next.handle().pipe( + catchError((err) => { + this._logger.error(err); + return throwError(() => err); + }) + ); + }); + } +} diff --git a/libs/logger/src/nestjsLoggerServiceAdapter.ts b/libs/logger/src/utils/nestjsLoggerServiceAdapter.ts similarity index 53% rename from libs/logger/src/nestjsLoggerServiceAdapter.ts rename to libs/logger/src/utils/nestjsLoggerServiceAdapter.ts index 9ebae39d0..0a10cd5a6 100644 --- a/libs/logger/src/nestjsLoggerServiceAdapter.ts +++ b/libs/logger/src/utils/nestjsLoggerServiceAdapter.ts @@ -1,43 +1,40 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ import { ConsoleLogger } from '@nestjs/common'; -import Logger from '@credebl/logger/logger.interface'; +import { Logger, LogData } from '../logger.interface'; import { LoggerService } from '@nestjs/common/services/logger.service'; -import { LogData } from '@credebl/logger/log'; -export default class NestjsLoggerServiceAdapter - extends ConsoleLogger - implements LoggerService -{ +export class NestjsLoggerServiceAdapter extends ConsoleLogger implements LoggerService { public constructor(private readonly logger: Logger) { super(); } - public info(message: any, ...optionalParams: any[]) : void { + public info(message: any, ...optionalParams: any[]): void { return this.logger.info(message, this.getLogData(optionalParams)); } - public log(message: any, ...optionalParams: any[]) : void { + public log(message: any, ...optionalParams: any[]): void { return this.logger.info(message, this.getLogData(optionalParams)); } - public error(message: any, ...optionalParams: any[]) : void { + public error(message: any, ...optionalParams: any[]): void { return this.logger.error(message, this.getLogData(optionalParams)); } - public warn(message: any, ...optionalParams: any[]) : void { + public warn(message: any, ...optionalParams: any[]): void { return this.logger.warn(message, this.getLogData(optionalParams)); } - public debug(message: any, ...optionalParams: any[]) : void { + public debug(message: any, ...optionalParams: any[]): void { return this.logger.debug(message, this.getLogData(optionalParams)); } - public verbose(message: any, ...optionalParams: any[]) : void { + public verbose(message: any, ...optionalParams: any[]): void { return this.logger.info(message, this.getLogData(optionalParams)); } - private getLogData(...optionalParams: any[]) : LogData { + private getLogData(...optionalParams: any[]): LogData { return { - sourceClass: optionalParams[0] ? optionalParams[0] : undefined, + sourceClass: optionalParams[0] ? optionalParams[0] : undefined }; } } diff --git a/libs/logger/src/winstonLogger.ts b/libs/logger/src/utils/winstonLogger.ts similarity index 71% rename from libs/logger/src/winstonLogger.ts rename to libs/logger/src/utils/winstonLogger.ts index d2a8b0ef8..ec3dc3356 100644 --- a/libs/logger/src/winstonLogger.ts +++ b/libs/logger/src/utils/winstonLogger.ts @@ -1,7 +1,7 @@ import * as winston from 'winston'; import { Inject, Injectable } from '@nestjs/common'; -import { LogData, LogLevel } from '@credebl/logger/log'; -import Logger from '@credebl/logger/logger.interface'; +import { LogLevel } from '../logger.enum'; +import { Logger, LogData } from '../logger.interface'; import * as Elasticsearch from 'winston-elasticsearch'; import * as ecsFormat from '@elastic/ecs-winston-format'; @@ -9,42 +9,39 @@ export const WinstonLoggerTransportsKey = Symbol(); let esTransport; if ('true' === process.env.ELK_LOG?.toLowerCase()) { const esTransportOpts = { - level: `${process.env.LOG_LEVEL}`, - clientOpts: { node: `${process.env.ELK_LOG_PATH}`, - auth: { - username: `${process.env.ELK_USERNAME}`, - password: `${process.env.ELK_PASSWORD}` - } - } -}; -esTransport = new Elasticsearch.ElasticsearchTransport(esTransportOpts); - -esTransport.on('error', (error) => { - console.error('Error caught in logger', error); -}); + level: `${process.env.LOG_LEVEL}`, + clientOpts: { + node: `${process.env.ELK_LOG_PATH}`, + auth: { + username: `${process.env.ELK_USERNAME}`, + password: `${process.env.ELK_PASSWORD}` + } + } + }; + esTransport = new Elasticsearch.ElasticsearchTransport(esTransportOpts); + esTransport.on('error', (error) => { + // eslint-disable-next-line no-console + console.error('Error caught in logger', error); + }); } - @Injectable() export default class WinstonLogger implements Logger { private readonly logger: winston.Logger; - public constructor( - @Inject(WinstonLoggerTransportsKey) transports: winston.transport[] - ) { - if(esTransport){ + public constructor(@Inject(WinstonLoggerTransportsKey) transports: winston.transport[]) { + if (esTransport) { transports.push(esTransport); } - - + // Create winston logger this.logger = winston.createLogger(this.getLoggerFormatOptions(transports)); - } - private getLoggerFormatOptions(transports: winston.transport[]) : winston.LoggerOptions { + private getLoggerFormatOptions(transports: winston.transport[]): winston.LoggerOptions { // Setting log levels for winston + // eslint-disable-next-line @typescript-eslint/no-explicit-any const levels: any = {}; let cont = 0; Object.values(LogLevel).forEach((level) => { @@ -55,8 +52,8 @@ export default class WinstonLogger implements Logger { return { level: LogLevel.Debug, levels, - // format: ecsFormat.ecsFormat({ convertReqRes: true }), - format: winston.format.combine( + // format: ecsFormat.ecsFormat({ convertReqRes: true }), + format: winston.format.combine( ecsFormat.ecsFormat({ convertReqRes: true }), // Add timestamp and format the date // winston.format.timestamp({ @@ -65,6 +62,7 @@ export default class WinstonLogger implements Logger { // Errors will be logged with stack trace winston.format.errors({ stack: true }), // Add custom Log fields to the log + // eslint-disable-next-line @typescript-eslint/no-unused-vars winston.format((info, opts) => { // Info contains an Error property if (info.error && info.error instanceof Error) { @@ -82,21 +80,16 @@ export default class WinstonLogger implements Logger { fillExcept: ['timestamp', 'level', 'message'] }), // Format the log as JSON - winston.format.json(), + winston.format.json() ), transports, exceptionHandlers: transports }; } - public log( - level: LogLevel, - message: string | Error, - data?: LogData, - profile?: string - ) : void { + public log(level: LogLevel, message: string | Error, data?: LogData, profile?: string): void { const logData = { - level: level, + level, message: message instanceof Error ? message.message : message, error: message instanceof Error ? message : undefined, ...data @@ -109,34 +102,31 @@ export default class WinstonLogger implements Logger { } } - - public debug(message: string, data?: LogData, profile?: string) : void { + public debug(message: string, data?: LogData, profile?: string): void { this.log(LogLevel.Debug, message, data, profile); } - public info(message: string, data?: LogData, profile?: string) : void { + public info(message: string, data?: LogData, profile?: string): void { this.log(LogLevel.Info, message, data, profile); } - public warn(message: string | Error, data?: LogData, profile?: string) : void { + public warn(message: string | Error, data?: LogData, profile?: string): void { this.log(LogLevel.Warn, message, data, profile); } - public error(message: string | Error, data?: LogData, profile?: string) : void { + public error(message: string | Error, data?: LogData, profile?: string): void { this.log(LogLevel.Error, message, data, profile); } - public fatal(message: string | Error, data?: LogData, profile?: string) : void { + public fatal(message: string | Error, data?: LogData, profile?: string): void { this.log(LogLevel.Fatal, message, data, profile); } - public emergency(message: string | Error, data?: LogData, profile?: string) : void { + public emergency(message: string | Error, data?: LogData, profile?: string): void { this.log(LogLevel.Emergency, message, data, profile); } - public startProfile(id: string) : void { + public startProfile(id: string): void { this.logger.profile(id); } } - - diff --git a/libs/logger/tsconfig.json b/libs/logger/tsconfig.json new file mode 100644 index 000000000..7b412184f --- /dev/null +++ b/libs/logger/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + // "compilerOptions": { + // "declaration": true, + // } + "include": [ + "src/**/*" + ] +} diff --git a/libs/logger/tsconfig.lib.json b/libs/logger/tsconfig.lib.json index cd7c5b5ba..29085ec80 100644 --- a/libs/logger/tsconfig.lib.json +++ b/libs/logger/tsconfig.lib.json @@ -2,8 +2,8 @@ "extends": "../../tsconfig.json", "compilerOptions": { "declaration": true, - "outDir": "../../dist/libs/logger" + "outDir": "./dist", // per-package output }, - "include": ["src/**/*"], - "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] + "include": ["src/", "index.ts"], + // "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] } diff --git a/libs/org-roles/enums/index.ts b/libs/org-roles/enums/index.ts deleted file mode 100644 index 298bc93b4..000000000 --- a/libs/org-roles/enums/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -export enum OrgRoles { - OWNER = 'owner', - SUPER_ADMIN = 'super_admin', - ADMIN = 'admin', - ISSUER = 'issuer', - VERIFIER = 'verifier', - HOLDER = 'holder', - MEMBER = 'member', - PLATFORM_ADMIN = 'platform_admin', -} \ No newline at end of file diff --git a/libs/org-roles/interfaces/org-roles.interface.ts b/libs/org-roles/interfaces/org-roles.interface.ts deleted file mode 100644 index ec63e63c1..000000000 --- a/libs/org-roles/interfaces/org-roles.interface.ts +++ /dev/null @@ -1,9 +0,0 @@ -export interface IOrgRoles { - id: string; - name: string; - description: string; - createDateTime?: Date; - createdBy?: string; - lastChangedDateTime?: Date; - lastChangedBy?: string; -} \ No newline at end of file diff --git a/libs/org-roles/repositories/index.ts b/libs/org-roles/repositories/index.ts deleted file mode 100644 index 37b160774..000000000 --- a/libs/org-roles/repositories/index.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { Injectable, InternalServerErrorException, Logger } from '@nestjs/common'; - -import { PrismaService } from '@credebl/prisma-service'; -// eslint-disable-next-line camelcase -import { org_roles } from '@prisma/client'; -import { OrgRoles } from '../enums'; -import { IOrgRoles } from '../interfaces/org-roles.interface'; - -@Injectable() -export class OrgRolesRepository { - constructor(private readonly prisma: PrismaService, private readonly logger: Logger) {} - - // eslint-disable-next-line camelcase - async getRole(roleName: string): Promise { - try { - const roleDetails = await this.prisma.org_roles.findFirst({ - where: { - name: roleName - } - }); - return roleDetails; - } catch (error) { - this.logger.error(`In get role repository: ${JSON.stringify(error)}`); - throw new InternalServerErrorException('Bad Request'); - } - } - - - async getOrgRoles(): Promise { - try { - const roleDetails = await this.prisma.org_roles.findMany(); - const filteredRoles = roleDetails.filter(role => role.name !== OrgRoles.PLATFORM_ADMIN); - return filteredRoles; - } catch (error) { - this.logger.error(`In get org-roles repository: ${JSON.stringify(error)}`); - throw new InternalServerErrorException('Bad Request'); - - } - - } - - // eslint-disable-next-line camelcase - async getOrgRolesByIds(orgRoles: string[]): Promise { - try { - const roleDetails = await this.prisma.org_roles.findMany({ - where: { - id:{ - in:orgRoles - } - }, - select: { - id: true, - name: true, - description: true - } - }); - return roleDetails; - } catch (error) { - this.logger.error(`In get org-roles by id repository : ${JSON.stringify(error)}`); - throw error; - } - } -} \ No newline at end of file diff --git a/libs/org-roles/src/index.ts b/libs/org-roles/src/index.ts deleted file mode 100644 index 50cd30f84..000000000 --- a/libs/org-roles/src/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './org-roles.module'; -export * from './org-roles.service'; diff --git a/libs/org-roles/src/org-roles.module.ts b/libs/org-roles/src/org-roles.module.ts deleted file mode 100644 index a53dff126..000000000 --- a/libs/org-roles/src/org-roles.module.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { PrismaService } from '@credebl/prisma-service'; -import { Logger } from '@nestjs/common'; -import { Module } from '@nestjs/common'; -import { OrgRolesRepository } from '../repositories'; -import { OrgRolesService } from './org-roles.service'; - -@Module({ - providers: [OrgRolesService, OrgRolesRepository, Logger, PrismaService], - exports: [OrgRolesService] -}) -export class OrgRolesModule {} diff --git a/libs/org-roles/src/org-roles.service.ts b/libs/org-roles/src/org-roles.service.ts deleted file mode 100644 index a7ce01cdf..000000000 --- a/libs/org-roles/src/org-roles.service.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Injectable } from '@nestjs/common'; -import { Logger } from '@nestjs/common'; -import { OrgRolesRepository } from '../repositories'; -// eslint-disable-next-line camelcase -import { org_roles } from '@prisma/client'; -import { IOrgRoles } from '../interfaces/org-roles.interface'; -@Injectable() -export class OrgRolesService { - - constructor(private readonly orgRoleRepository: OrgRolesRepository, private readonly logger: Logger) { } - - // eslint-disable-next-line camelcase - async getRole(roleName: string): Promise { - return this.orgRoleRepository.getRole(roleName); - } - - async getOrgRoles(): Promise< IOrgRoles[]> { - return this.orgRoleRepository.getOrgRoles(); - } - - // eslint-disable-next-line camelcase - async getOrgRolesByIds(orgRoleIds: string[]): Promise { - return this.orgRoleRepository.getOrgRolesByIds(orgRoleIds); - } -} diff --git a/libs/org-roles/tsconfig.lib.json b/libs/org-roles/tsconfig.lib.json deleted file mode 100644 index c9d40a1d0..000000000 --- a/libs/org-roles/tsconfig.lib.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "declaration": true, - "outDir": "../../dist/libs/org-roles" - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] -} \ No newline at end of file diff --git a/libs/prisma-service/index.ts b/libs/prisma-service/index.ts new file mode 100644 index 000000000..05d2148f2 --- /dev/null +++ b/libs/prisma-service/index.ts @@ -0,0 +1,5 @@ +export { PrismaClient } from '@prisma/client'; +export * from '@prisma/client'; +export { PrismaClientKnownRequestError, PrismaClientValidationError } from '@prisma/client/runtime/library'; + +export * from './src'; diff --git a/libs/prisma-service/package.json b/libs/prisma-service/package.json new file mode 100644 index 000000000..97668566e --- /dev/null +++ b/libs/prisma-service/package.json @@ -0,0 +1,42 @@ +{ + "name": "@credebl/prisma-service", + "version": "2.0.0", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "license": "Apache-2.0", + "files": [ + "dist", + "prisma/schema.prisma", + "schema.prisma", + "prisma/migrations", + "prisma/data", + "prisma/seed.ts", + "cli.ts" + ], + "scripts": { + "postinstall": "npx prisma generate", + "build": "pnpm run clean && pnpm run compile", + "clean": "rimraf ./dist", + "compile": "tsc -p tsconfig.lib.json", + "test": "jest", + "prisma:generate": "npx prisma generate" + }, + "prisma": { + "seed": "ts-node prisma/seed.ts" + }, + "dependencies": { + "@credebl/common": "file:../../credebl-common-2.0.0.tgz", + "@nestjs/common": "^10.4.20", + "@supabase/supabase-js": "^2.53.0", + "crypto-js": "^4.2.0", + "readline": "^1.3.0" + }, + "peerDependencies": { + "@prisma/client": "^5.22.0" + }, + "devDependencies": { + "@types/crypto-js": "^4.2.2", + "@types/node": "^20.19.9", + "prisma": "^5.22.0" + } +} diff --git a/libs/prisma-service/prisma/index.ts b/libs/prisma-service/prisma/index.ts new file mode 100644 index 000000000..716131fe8 --- /dev/null +++ b/libs/prisma-service/prisma/index.ts @@ -0,0 +1 @@ +export * from './seed'; diff --git a/libs/prisma-service/prisma/seed.ts b/libs/prisma-service/prisma/seed.ts index 22919fec1..0a80c25d3 100644 --- a/libs/prisma-service/prisma/seed.ts +++ b/libs/prisma-service/prisma/seed.ts @@ -2,7 +2,7 @@ import * as fs from 'fs'; import { Logger } from '@nestjs/common'; import { PrismaClient } from '@prisma/client'; -import { CommonConstants } from '../../common/src/common.constant'; +import { CommonConstants } from '@credebl/common'; import * as CryptoJS from 'crypto-js'; import { exec } from 'child_process'; import * as util from 'util'; diff --git a/libs/prisma-service/tsconfig.json b/libs/prisma-service/tsconfig.json new file mode 100644 index 000000000..4f92e763b --- /dev/null +++ b/libs/prisma-service/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + // "compilerOptions": { + // "declaration": true, + // } + "include": [ + "src/**/*" +, "index.ts" ] +} diff --git a/libs/prisma-service/tsconfig.lib.json b/libs/prisma-service/tsconfig.lib.json index db04b298e..77a397d8b 100644 --- a/libs/prisma-service/tsconfig.lib.json +++ b/libs/prisma-service/tsconfig.lib.json @@ -1,9 +1,9 @@ { - "extends": "../../tsconfig.json", + "extends": "../../tsconfig.build.json", "compilerOptions": { - "declaration": true, - "outDir": "../../dist/libs/prisma-service" + // "declaration": true, + "outDir": "./dist", // per-package output }, - "include": ["src/**/*"], + "include": ["src", "cli.ts", "index.ts"], "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] } diff --git a/libs/supabase/src/index.ts b/libs/supabase/src/index.ts deleted file mode 100644 index 1b4bbcdf4..000000000 --- a/libs/supabase/src/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './supabase.module'; -export * from './supabase.service'; diff --git a/libs/supabase/src/supabase.module.ts b/libs/supabase/src/supabase.module.ts deleted file mode 100644 index 1cd0a3c77..000000000 --- a/libs/supabase/src/supabase.module.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Module } from '@nestjs/common'; -import { SupabaseService } from './supabase.service'; - -@Module({ - providers: [SupabaseService], - exports: [SupabaseService] -}) -export class SupabaseModule {} diff --git a/libs/supabase/src/supabase.service.ts b/libs/supabase/src/supabase.service.ts deleted file mode 100644 index 83acf5d6f..000000000 --- a/libs/supabase/src/supabase.service.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Injectable, Logger, Scope } from '@nestjs/common'; -import { SupabaseClient, createClient } from '@supabase/supabase-js'; - -@Injectable({ scope: Scope.REQUEST }) -export class SupabaseService { - - private readonly logger = new Logger(SupabaseService.name); - private clientInstance: SupabaseClient; - constructor( - ) { } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - getClient(): SupabaseClient { - this.logger.log('getting supabase client...'); - - if (this.clientInstance) { - this.logger.log('client exists - returning for current Scope.REQUEST'); - return this.clientInstance; - } - - this.logger.log('initialising new supabase client for new Scope.REQUEST'); - - this.clientInstance = createClient( - - process.env.SUPABASE_URL, - process.env.SUPABASE_KEY - ); - - this.logger.log('auth has been set!'); - - return this.clientInstance; - } -} diff --git a/libs/supabase/tsconfig.lib.json b/libs/supabase/tsconfig.lib.json deleted file mode 100644 index fdd77eefc..000000000 --- a/libs/supabase/tsconfig.lib.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "declaration": true, - "outDir": "../../dist/libs/supabase" - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] -} diff --git a/libs/user-activity/interface/index.ts b/libs/user-activity/interface/index.ts deleted file mode 100644 index 87ba1685b..000000000 --- a/libs/user-activity/interface/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -export interface IUsersActivity { - id: string, - orgId: string, - userId: string, - details: string, - action: string, - lastChangedDateTime: Date, - createDateTime: Date, -} \ No newline at end of file diff --git a/libs/user-activity/repositories/index.ts b/libs/user-activity/repositories/index.ts deleted file mode 100644 index 7895ea825..000000000 --- a/libs/user-activity/repositories/index.ts +++ /dev/null @@ -1,82 +0,0 @@ -/* eslint-disable camelcase */ -import { HttpException, Inject, Injectable, Logger } from '@nestjs/common'; -import { IUsersActivity} from '../interface'; -import { PrismaService } from '@credebl/prisma-service'; -import { RecordType, user, user_activity } from '@prisma/client'; -import { map } from 'rxjs'; -import { ClientProxy } from '@nestjs/microservices'; - -@Injectable() -export class UserActivityRepository { - constructor(private readonly prisma: PrismaService, private readonly logger: Logger, - @Inject('NATS_CLIENT') private readonly userActivityServiceProxy: ClientProxy - ) { } - - - async logActivity(userId: string, orgId: string, action: string, details: string): Promise { - return this.prisma.user_activity.create({ - data: { - userId, - orgId, - action, - details, - createdBy: userId, - lastChangedBy: userId - } - }); - } - - async getRecentActivities(userId: string, limit: number): Promise { - return this.prisma.user_activity.findMany({ - where: { - userId - }, - select: { - id: true, - userId: true, - orgId: true, - action: true, - details: true, - createDateTime:true, - lastChangedDateTime: true - }, - orderBy: { - createDateTime: 'desc' - }, - take: limit - }); - } - - async _orgDeletedActivity(orgId: string, user: user, txnMetadata: object, recordType: RecordType): Promise<{ - message: string; - }> { - try { - const pattern = { cmd: 'org-deleted-activity' }; - const payload = { orgId, userId: user?.id, deletedBy: user?.id, recordType, userEmail: user?.email, txnMetadata }; - - return this.userActivityServiceProxy - .send(pattern, payload) - .pipe( - map((message) => ({ - message - })) - ) - .toPromise() - .catch((error) => { - this.logger.error(`catch: ${JSON.stringify(error)}`); - - throw new HttpException( - { - status: error?.error?.statusCode, - error: error?.error?.error, - message: error?.error?.message ?? error?.message - }, - error.error - ); - }); - } catch (error) { - this.logger.error(`[_orgDeletedActivity] - error in delete wallet : ${JSON.stringify(error)}`); - throw error; - } - } -} \ No newline at end of file diff --git a/libs/user-activity/src/index.ts b/libs/user-activity/src/index.ts deleted file mode 100644 index 9b8fb5972..000000000 --- a/libs/user-activity/src/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './user-activity.module'; -export * from './user-activity.service'; diff --git a/libs/user-activity/src/user-activity.module.ts b/libs/user-activity/src/user-activity.module.ts deleted file mode 100644 index 2ac446d9d..000000000 --- a/libs/user-activity/src/user-activity.module.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Logger, Module } from '@nestjs/common'; - -import { PrismaService } from '@credebl/prisma-service'; -import { UserActivityRepository } from '../repositories'; -import { UserActivityService } from './user-activity.service'; - -@Module({ - providers: [UserActivityService, UserActivityRepository, Logger, PrismaService], - exports: [UserActivityService] -}) -export class UserActivityModule {} diff --git a/libs/user-activity/src/user-activity.service.ts b/libs/user-activity/src/user-activity.service.ts deleted file mode 100644 index f90f4f00a..000000000 --- a/libs/user-activity/src/user-activity.service.ts +++ /dev/null @@ -1,22 +0,0 @@ -/* eslint-disable camelcase */ -import { Injectable } from '@nestjs/common'; -import { UserActivityRepository } from '../repositories'; -import { user_activity } from '@prisma/client'; -import { IUsersActivity } from '../interface'; - -@Injectable() -export class UserActivityService { - - constructor( - private readonly userActivityRepository: UserActivityRepository - ) { } - - async createActivity(userId: string, orgId: string, action: string, details: string): Promise { - - return this.userActivityRepository.logActivity(userId, orgId, action, details); - } - - async getUserActivity(userId: string, limit: number): Promise { - return this.userActivityRepository.getRecentActivities(userId, limit); - } -} diff --git a/libs/user-activity/tsconfig.lib.json b/libs/user-activity/tsconfig.lib.json deleted file mode 100644 index 875e5f58a..000000000 --- a/libs/user-activity/tsconfig.lib.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "declaration": true, - "outDir": "../../dist/libs/user-activity" - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] -} diff --git a/libs/user-management/package.json b/libs/user-management/package.json new file mode 100644 index 000000000..a447eea00 --- /dev/null +++ b/libs/user-management/package.json @@ -0,0 +1,41 @@ +{ + "name": "@credebl/user-management", + "version": "2.0.0", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "license": "Apache-2.0", + "publishConfig": { + "main": "dist/index.js", + "types": "dist/index.d.ts", + "access": "public" + }, + "scripts": { + "build": "pnpm run clean && pnpm run compile", + "clean": "rimraf ./dist", + "generate": "npx prisma generate --schema=node_modules/@credebl/prisma-service/prisma/schema.prisma", + "cleanup": "rm -rf node_modules dist pnpm-lock.yaml && rm -rf ~/.cache/prisma ~/.pnpm-store", + "compile": "tsc -p tsconfig.lib.json", + "test": "jest" + }, + "dependencies": { + "@credebl/common": "file:../../credebl-common-2.0.0.tgz", + "@credebl/prisma-service": "file:../../credebl-prisma-service-2.0.0.tgz", + "@nestjs/axios": "^3.1.3", + "@nestjs/common": "^10.4.20", + "@nestjs/config": "^3.3.0", + "@nestjs/core": "^10.4.20", + "@nestjs/jwt": "^10.2.0", + "@nestjs/microservices": "^10.4.20", + "@nestjs/swagger": "^7.4.2", + "@supabase/supabase-js": "^2.53.0", + "morgan": "^1.10.1", + "rxjs": "^7.8.2", + "uuid": "^9.0.1" + }, + "devDependencies": { + "@types/crypto-js": "^4.2.2", + "reflect-metadata": "^0.1.14", + "rimraf": "^4.4.1", + "typescript": "^5.8.3" + } +} diff --git a/libs/user-management/src/dtos/client-registraction.dto.ts b/libs/user-management/src/dtos/client-registraction.dto.ts new file mode 100644 index 000000000..d3c50c198 --- /dev/null +++ b/libs/user-management/src/dtos/client-registraction.dto.ts @@ -0,0 +1,74 @@ +/* eslint-disable camelcase */ +import { ApiExtraModels } from '@nestjs/swagger'; + +export class accessTokenPayloadDto { + client_id: string; + client_secret: string; + grant_type?: string = 'refresh_token'; + refresh_token: string; +} + +export class ClientCredentialTokenPayloadDto { + client_id: string; + client_secret: string; + audience?: string; + grant_type?: string = 'client_credentials'; + scope?: string; +} + +@ApiExtraModels() +export class CreateUserDto { + id?: string; + username?: string; + email: string; + password: string; + logo_uri?: string; + token_lifetime?: number; + is_active?: boolean; + firstName?: string; + lastName?: string; + // role?: Role; + isEmailVerified?: boolean; + createdBy?: string; + clientId?: string; + clientSecret?: string; + supabaseUserId?: string; + isHolder?: boolean; +} + +export class userTokenPayloadDto { + client_id: string; + client_secret: string; + username: string; + password: string; + grant_type?: string = 'password'; +} + +export class KeycloakUserRegistrationDto { + email: string; + firstName: string; + lastName: string; + username: string; + enabled: boolean; + totp: boolean; + emailVerified: boolean; + notBefore: number; + credentials: Credentials[]; + access: Access; + realmRoles: string[]; + attributes: object; +} + +export class Credentials { + type: string; + value: string; + temporary: boolean; +} + +export class Access { + manageGroupMembership: boolean; + view: boolean; + mapRoles: boolean; + impersonate: boolean; + manage: boolean; +} diff --git a/libs/user-management/src/dtos/index.ts b/libs/user-management/src/dtos/index.ts new file mode 100644 index 000000000..a5941c322 --- /dev/null +++ b/libs/user-management/src/dtos/index.ts @@ -0,0 +1 @@ +export * from './client-registraction.dto'; diff --git a/libs/user-management/src/index.ts b/libs/user-management/src/index.ts new file mode 100644 index 000000000..139d8bf01 --- /dev/null +++ b/libs/user-management/src/index.ts @@ -0,0 +1,5 @@ +export * from './dtos'; +export * from './interfaces'; +export * from './repositories'; +export * from './services'; +export * from './user-management.module'; diff --git a/libs/user-management/src/interfaces/client-registraction.interface.ts b/libs/user-management/src/interfaces/client-registraction.interface.ts new file mode 100644 index 000000000..f11d1aa59 --- /dev/null +++ b/libs/user-management/src/interfaces/client-registraction.interface.ts @@ -0,0 +1,8 @@ +export interface IClientRoles { + id: string; + name: string; + description?: string; + composite?: boolean; + clientRole?: boolean; + containerId?: string; +} diff --git a/libs/user-management/src/interfaces/index.ts b/libs/user-management/src/interfaces/index.ts new file mode 100644 index 000000000..09202d1c3 --- /dev/null +++ b/libs/user-management/src/interfaces/index.ts @@ -0,0 +1,3 @@ +export * from './client-registraction.interface'; +export * from './user-activity.interface'; +export * from './user-request.interface'; diff --git a/libs/user-management/src/interfaces/user-activity.interface.ts b/libs/user-management/src/interfaces/user-activity.interface.ts new file mode 100644 index 000000000..3ab23710e --- /dev/null +++ b/libs/user-management/src/interfaces/user-activity.interface.ts @@ -0,0 +1,9 @@ +export interface IUsersActivity { + id: string; + orgId: string; + userId: string; + details: string; + action: string; + lastChangedDateTime: Date; + createDateTime: Date; +} diff --git a/libs/user-management/src/interfaces/user-request.interface.ts b/libs/user-management/src/interfaces/user-request.interface.ts new file mode 100644 index 000000000..9b4ee0c5d --- /dev/null +++ b/libs/user-management/src/interfaces/user-request.interface.ts @@ -0,0 +1,55 @@ +export interface IUserRequest { + userId: string; + email: string; + orgId: string; + agentEndPoint?: string; + apiKey?: string; + tenantId?: string; + tenantName?: string; + tenantOrgId?: string; + userRoleOrgPermissions?: IUserRoleOrgPerms[]; + orgName?: string; + selectedOrg: ISelectedOrg; +} + +export interface ISelectedOrg { + id: string; + userId: string; + orgRoleId: string; + orgId: string; + orgRole: object; + organisation: object; +} + +export interface IOrganization { + name: string; + description: string; + org_agents: IOrgAgent[]; +} + +export interface IOrgAgent { + orgDid: string; + verkey: string; + agentEndPoint: string; + agentOptions: string; + walletName: string; + agentsTypeId: string; + orgId: string; +} + +export class IUserRoleOrgPerms { + id: string; + role: IUserRole; + Organization: IUserOrg; +} + +export class IUserRole { + id: string; + name: string; + permissions: string[]; +} + +export class IUserOrg { + id: string; + orgName: string; +} diff --git a/libs/user-management/src/repositories/index.ts b/libs/user-management/src/repositories/index.ts new file mode 100644 index 000000000..c1a2fd923 --- /dev/null +++ b/libs/user-management/src/repositories/index.ts @@ -0,0 +1,3 @@ +export * from './org-roles.repository'; +export * from './user-activity.repository'; +export * from './user-org-roles.repository.'; diff --git a/libs/user-management/src/repositories/org-roles.repository.ts b/libs/user-management/src/repositories/org-roles.repository.ts new file mode 100644 index 000000000..12f8657d7 --- /dev/null +++ b/libs/user-management/src/repositories/org-roles.repository.ts @@ -0,0 +1,60 @@ +import { Injectable, InternalServerErrorException, Logger } from '@nestjs/common'; + +import { PrismaService } from '@credebl/prisma-service'; +import { OrgRoles, IOrgRoles } from '@credebl/common'; + +@Injectable() +export class OrgRolesRepository { + private readonly logger: Logger; + constructor(private readonly prisma: PrismaService) { + this.logger = new Logger('OrgRolesRepository'); + } + + // eslint-disable-next-line camelcase + async getRole(roleName: string): Promise { + try { + const roleDetails = await this.prisma.org_roles.findFirst({ + where: { + name: roleName + } + }); + return roleDetails; + } catch (error) { + this.logger.error(`In get role repository: ${JSON.stringify(error)}`); + throw new InternalServerErrorException('Bad Request'); + } + } + + async getOrgRoles(): Promise { + try { + const roleDetails = await this.prisma.org_roles.findMany(); + const filteredRoles = roleDetails.filter((role) => role.name !== OrgRoles.PLATFORM_ADMIN); + return filteredRoles; + } catch (error) { + this.logger.error(`In get org-roles repository: ${JSON.stringify(error)}`); + throw new InternalServerErrorException('Bad Request'); + } + } + + // eslint-disable-next-line camelcase + async getOrgRolesByIds(orgRoles: string[]): Promise { + try { + const roleDetails = await this.prisma.org_roles.findMany({ + where: { + id: { + in: orgRoles + } + }, + select: { + id: true, + name: true, + description: true + } + }); + return roleDetails; + } catch (error) { + this.logger.error(`In get org-roles by id repository : ${JSON.stringify(error)}`); + throw error; + } + } +} diff --git a/libs/user-management/src/repositories/user-activity.repository.ts b/libs/user-management/src/repositories/user-activity.repository.ts new file mode 100644 index 000000000..9ecf130cd --- /dev/null +++ b/libs/user-management/src/repositories/user-activity.repository.ts @@ -0,0 +1,85 @@ +/* eslint-disable camelcase */ +import { HttpException, Inject, Injectable, Logger } from '@nestjs/common'; +import { IUsersActivity } from '../interfaces'; +import { PrismaService } from '@credebl/prisma-service'; +import { user_activity, RecordType } from '@credebl/prisma-service'; +import type { user } from '@credebl/prisma-service'; +import { map } from 'rxjs'; +import { ClientProxy } from '@nestjs/microservices'; + +@Injectable() +export class UserActivityRepository { + private readonly logger: Logger; + constructor( + private readonly prisma: PrismaService, + @Inject('NATS_CLIENT') private readonly userActivityServiceProxy: ClientProxy + ) { + this.logger = new Logger('UserActivityRepository'); + } + + async logActivity(userId: string, orgId: string, action: string, details: string): Promise { + return this.prisma.user_activity.create({ + data: { + userId, + orgId, + action, + details, + createdBy: userId, + lastChangedBy: userId + } + }); + } + + async getRecentActivities(userId: string, limit: number): Promise { + return this.prisma.user_activity.findMany({ + where: { + userId + }, + select: { + id: true, + userId: true, + orgId: true, + action: true, + details: true, + createDateTime: true, + lastChangedDateTime: true + }, + orderBy: { + createDateTime: 'desc' + }, + take: limit + }); + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + async _orgDeletedActivity(orgId: string, user: user, txnMetadata: object, recordType: RecordType): Promise { + try { + const pattern = { cmd: 'org-deleted-activity' }; + const payload = { orgId, userId: user?.id, deletedBy: user?.id, recordType, userEmail: user?.email, txnMetadata }; + + return this.userActivityServiceProxy + .send(pattern, payload) + .pipe( + map((message) => ({ + message + })) + ) + .toPromise() + .catch((error) => { + this.logger.error(`catch: ${JSON.stringify(error)}`); + + throw new HttpException( + { + status: error?.error?.statusCode, + error: error?.error?.error, + message: error?.error?.message ?? error?.message + }, + error.error + ); + }); + } catch (error) { + this.logger.error(`[_orgDeletedActivity] - error in delete wallet : ${JSON.stringify(error)}`); + throw error; + } + } +} diff --git a/libs/user-org-roles/repositories/index.ts b/libs/user-management/src/repositories/user-org-roles.repository..ts similarity index 88% rename from libs/user-org-roles/repositories/index.ts rename to libs/user-management/src/repositories/user-org-roles.repository..ts index 5458796cd..1239f8afa 100644 --- a/libs/user-org-roles/repositories/index.ts +++ b/libs/user-management/src/repositories/user-org-roles.repository..ts @@ -1,16 +1,17 @@ import { Injectable, Logger } from '@nestjs/common'; import { InternalServerErrorException } from '@nestjs/common'; -import { PrismaService } from '@credebl/prisma-service'; // eslint-disable-next-line camelcase -import { user_org_roles } from '@prisma/client'; -import { Prisma } from '@prisma/client'; +import { PrismaService, user_org_roles, Prisma } from '@credebl/prisma-service'; type UserOrgRolesWhereUniqueInput = Prisma.user_org_rolesWhereUniqueInput; @Injectable() export class UserOrgRolesRepository { - constructor(private readonly prisma: PrismaService, private readonly logger: Logger) {} + private readonly logger: Logger; + constructor(private readonly prisma: PrismaService) { + this.logger = new Logger('UserOrgRolesRepository'); + } /** * @@ -19,13 +20,12 @@ export class UserOrgRolesRepository { */ // eslint-disable-next-line camelcase async createUserOrgRole(userId: string, roleId: string, orgId?: string, idpRoleId?: string): Promise { - try { const data: { orgRole: { connect: { id: string } }; user: { connect: { id: string } }; organisation?: { connect: { id: string } }; - idpRoleId?: string + idpRoleId?: string; } = { orgRole: { connect: { id: roleId } }, user: { connect: { id: userId } } @@ -42,9 +42,8 @@ export class UserOrgRolesRepository { const saveResponse = await this.prisma.user_org_roles.create({ data }); - + return saveResponse; - } catch (error) { this.logger.error(`UserOrgRolesRepository:: createUserOrgRole: ${error}`); throw new InternalServerErrorException('User Org Role not created'); @@ -83,8 +82,8 @@ export class UserOrgRolesRepository { async findAndUpdate(queryOptions: UserOrgRolesWhereUniqueInput, updateData: object): Promise { try { return this.prisma.user_org_roles.update({ - where: { ...queryOptions }, - data: { ...updateData } + where: queryOptions, + data: updateData }); } catch (error) { this.logger.error(`error in findAndUpdate: ${JSON.stringify(error)}`); @@ -102,5 +101,4 @@ export class UserOrgRolesRepository { throw new InternalServerErrorException(error); } } - } diff --git a/libs/client-registration/src/client-registration.service.ts b/libs/user-management/src/services/client-registration.service.ts similarity index 97% rename from libs/client-registration/src/client-registration.service.ts rename to libs/user-management/src/services/client-registration.service.ts index 51dbeb923..b2ca6dbcb 100644 --- a/libs/client-registration/src/client-registration.service.ts +++ b/libs/user-management/src/services/client-registration.service.ts @@ -7,28 +7,24 @@ import { BadRequestException, Injectable, Logger, NotFoundException, UnauthorizedException } from '@nestjs/common'; import * as qs from 'qs'; -import { ClientCredentialTokenPayloadDto } from './dtos/client-credential-token-payload.dto'; -import { CommonConstants } from '@credebl/common/common.constant'; +import { ClientCredentialTokenPayloadDto } from '../dtos'; +import { CommonConstants } from '@credebl/common'; import { CommonService } from '@credebl/common'; -import { CreateUserDto } from './dtos/create-user.dto'; +import { CreateUserDto } from '../dtos'; import { JwtService } from '@nestjs/jwt'; -import { KeycloakUrlService } from '@credebl/keycloak-url'; -import { accessTokenPayloadDto } from './dtos/accessTokenPayloadDto'; -import { userTokenPayloadDto } from './dtos/userTokenPayloadDto'; -import { KeycloakUserRegistrationDto } from 'apps/user/dtos/keycloak-register.dto'; -import { ResponseMessages } from '@credebl/common/response-messages'; -import { IClientRoles } from './interfaces/client.interface'; -import { IFormattedResponse } from '@credebl/common/interfaces/interface'; +import { KeycloakUrlService } from './keycloak-url.service'; +import { accessTokenPayloadDto, userTokenPayloadDto, KeycloakUserRegistrationDto } from '../dtos'; +import { ResponseMessages, IFormattedResponse } from '@credebl/common'; +import { IClientRoles } from '../interfaces'; @Injectable() export class ClientRegistrationService { + private readonly logger = new Logger('ClientRegistrationService'); constructor( - private readonly commonService: CommonService, - private readonly keycloakUrlService: KeycloakUrlService + private readonly keycloakUrlService: KeycloakUrlService, + private readonly commonService: CommonService ) {} - private readonly logger = new Logger('ClientRegistrationService'); - async registerKeycloakUser(userDetails: KeycloakUserRegistrationDto, realm: string, token: string) { try { const url = await this.keycloakUrlService.createUserURL(realm); @@ -215,7 +211,8 @@ export class ClientRegistrationService { } } - async deleteClient(idpId: string, token: string) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + async deleteClient(idpId: string, token: string): Promise { const realmName = process.env.KEYCLOAK_REALM; const getClientDeleteResponse = await this.commonService.httpDelete( diff --git a/libs/user-management/src/services/index.ts b/libs/user-management/src/services/index.ts new file mode 100644 index 000000000..e99b9fcdc --- /dev/null +++ b/libs/user-management/src/services/index.ts @@ -0,0 +1,6 @@ +export * from './client-registration.service'; +export * from './keycloak-url.service'; +export * from './org-roles.service'; +export * from './supabase.service'; +export * from './user-activity.service'; +export * from './user-org-roles.service'; diff --git a/libs/user-management/src/services/keycloak-url.service.ts b/libs/user-management/src/services/keycloak-url.service.ts new file mode 100644 index 000000000..60c262b52 --- /dev/null +++ b/libs/user-management/src/services/keycloak-url.service.ts @@ -0,0 +1,75 @@ +import { Injectable, Logger } from '@nestjs/common'; + +@Injectable() +export class KeycloakUrlService { + private readonly logger = new Logger('KeycloakUrlService'); + constructor() {} + + async createUserURL(realm: string): Promise { + return `${process.env.KEYCLOAK_DOMAIN}admin/realms/${realm}/users`; + } + + async getUserByUsernameURL(realm: string, username: string): Promise { + return `${process.env.KEYCLOAK_DOMAIN}admin/realms/${realm}/users?username=${username}`; + } + + async GetUserInfoURL(realm: string, userid: string): Promise { + return `${process.env.KEYCLOAK_DOMAIN}admin/realms/${realm}/users/${userid}`; + } + + async GetSATURL(realm: string): Promise { + return `${process.env.KEYCLOAK_DOMAIN}realms/${realm}/protocol/openid-connect/token`; + } + + async ResetPasswordURL(realm: string, userid: string): Promise { + return `${process.env.KEYCLOAK_DOMAIN}admin/realms/${realm}/users/${userid}/reset-password`; + } + + async CreateRealmURL(): Promise { + return `${process.env.KEYCLOAK_DOMAIN}admin/realms`; + } + + async createClientURL(realm: string): Promise { + return `${process.env.KEYCLOAK_DOMAIN}admin/realms/${realm}/clients`; + } + + async GetClientURL(realm: string, clientid: string): Promise { + return `${process.env.KEYCLOAK_DOMAIN}admin/realms/${realm}/clients?clientId=${clientid}`; + } + + async GetClientSecretURL(realm: string, clientid: string): Promise { + return `${process.env.KEYCLOAK_DOMAIN}admin/realms/${realm}/clients/${clientid}/client-secret`; + } + + async GetClientRoleURL(realm: string, clientid: string, roleName = ''): Promise { + if ('' === roleName) { + return `${process.env.KEYCLOAK_DOMAIN}admin/realms/${realm}/clients/${clientid}/roles`; + } + + return `${process.env.KEYCLOAK_DOMAIN}admin/realms/${realm}/clients/${clientid}/roles/${roleName}`; + } + + async GetRealmRoleURL(realm: string, roleName = ''): Promise { + if ('' === roleName) { + return `${process.env.KEYCLOAK_DOMAIN}admin/realms/${realm}/roles`; + } + + return `${process.env.KEYCLOAK_DOMAIN}admin/realms/${realm}/roles/${roleName}`; + } + + async GetClientUserRoleURL(realm: string, userId: string, clientId?: string): Promise { + if (clientId) { + return `${process.env.KEYCLOAK_DOMAIN}admin/realms/${realm}/users/${userId}/role-mappings/clients/${clientId}`; + } + + return `${process.env.KEYCLOAK_DOMAIN}admin/realms/${realm}/users/${userId}/role-mappings/realm`; + } + + async GetClientIdpURL(realm: string, idp: string): Promise { + return `${process.env.KEYCLOAK_DOMAIN}admin/realms/${realm}/clients/${idp}`; + } + + async GetClient(realm: string, clientId: string): Promise { + return `${process.env.KEYCLOAK_DOMAIN}admin/realms/${realm}/clients?clientId=${clientId}`; + } +} diff --git a/libs/user-management/src/services/org-roles.service.ts b/libs/user-management/src/services/org-roles.service.ts new file mode 100644 index 000000000..e71fe6e23 --- /dev/null +++ b/libs/user-management/src/services/org-roles.service.ts @@ -0,0 +1,22 @@ +import { Injectable } from '@nestjs/common'; +import { OrgRolesRepository } from '../repositories'; +// eslint-disable-next-line camelcase +import { IOrgRoles } from '@credebl/common'; +@Injectable() +export class OrgRolesService { + constructor(private readonly orgRoleRepository: OrgRolesRepository) {} + + // eslint-disable-next-line camelcase + async getRole(roleName: string): Promise { + return this.orgRoleRepository.getRole(roleName); + } + + async getOrgRoles(): Promise { + return this.orgRoleRepository.getOrgRoles(); + } + + // eslint-disable-next-line camelcase + async getOrgRolesByIds(orgRoleIds: string[]): Promise { + return this.orgRoleRepository.getOrgRolesByIds(orgRoleIds); + } +} diff --git a/libs/user-management/src/services/supabase.service.ts b/libs/user-management/src/services/supabase.service.ts new file mode 100644 index 000000000..76b70bba1 --- /dev/null +++ b/libs/user-management/src/services/supabase.service.ts @@ -0,0 +1,27 @@ +import { Injectable, Logger, Scope } from '@nestjs/common'; +import { SupabaseClient, createClient } from '@supabase/supabase-js'; + +@Injectable({ scope: Scope.REQUEST }) +export class SupabaseService { + private readonly logger = new Logger(SupabaseService.name); + private clientInstance: SupabaseClient; + constructor() {} + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + getClient(): SupabaseClient { + this.logger.log('getting supabase client...'); + + if (this.clientInstance) { + this.logger.log('client exists - returning for current Scope.REQUEST'); + return this.clientInstance; + } + + this.logger.log('initialising new supabase client for new Scope.REQUEST'); + + this.clientInstance = createClient(process.env.SUPABASE_URL, process.env.SUPABASE_KEY); + + this.logger.log('auth has been set!'); + + return this.clientInstance; + } +} diff --git a/libs/user-management/src/services/user-activity.service.ts b/libs/user-management/src/services/user-activity.service.ts new file mode 100644 index 000000000..02d5b2be7 --- /dev/null +++ b/libs/user-management/src/services/user-activity.service.ts @@ -0,0 +1,18 @@ +/* eslint-disable camelcase */ +import { Injectable } from '@nestjs/common'; +import { UserActivityRepository } from '../repositories'; +import { user_activity } from '@credebl/prisma-service'; +import { IUsersActivity } from '../interfaces'; + +@Injectable() +export class UserActivityService { + constructor(private readonly userActivityRepository: UserActivityRepository) {} + + async createActivity(userId: string, orgId: string, action: string, details: string): Promise { + return this.userActivityRepository.logActivity(userId, orgId, action, details); + } + + async getUserActivity(userId: string, limit: number): Promise { + return this.userActivityRepository.getRecentActivities(userId, limit); + } +} diff --git a/libs/user-org-roles/src/user-org-roles.service.ts b/libs/user-management/src/services/user-org-roles.service.ts similarity index 82% rename from libs/user-org-roles/src/user-org-roles.service.ts rename to libs/user-management/src/services/user-org-roles.service.ts index 0b87cd9cf..2219be212 100644 --- a/libs/user-org-roles/src/user-org-roles.service.ts +++ b/libs/user-management/src/services/user-org-roles.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@nestjs/common'; import { UserOrgRolesRepository } from '../repositories'; // eslint-disable-next-line camelcase -import { user_org_roles } from '@prisma/client'; +import { user_org_roles } from '@credebl/prisma-service'; @Injectable() export class UserOrgRolesService { @@ -17,11 +17,10 @@ export class UserOrgRolesService { return this.userOrgRoleRepository.createUserOrgRole(userId, roleId, orgId, idpRoleId); } - /** - * - * @param userId - * @param orgId + * + * @param userId + * @param orgId * @returns Boolean response for user exist */ async checkUserOrgExist(userId: string, orgId: string): Promise { @@ -38,20 +37,18 @@ export class UserOrgRolesService { return true; } - /** - * - * @param userId - * @param orgId - * @param roleIds - * @returns + * + * @param userId + * @param orgId + * @param roleIds + * @returns */ async updateUserOrgRole( userId: string, orgId: string, - roleIdList: {roleId: string, idpRoleId: string}[] - ): Promise { - + roleIdList: { roleId: string; idpRoleId: string }[] + ): Promise { for (const roleData of roleIdList) { this.userOrgRoleRepository.createUserOrgRole(userId, roleData.roleId, orgId, roleData.idpRoleId); } @@ -60,19 +57,17 @@ export class UserOrgRolesService { } /** - * - * @param userId - * @param orgId + * + * @param userId + * @param orgId * @returns Delete user org roles */ async deleteOrgRoles(userId: string, orgId: string): Promise { - const queryOptions = { userId, orgId }; return this.userOrgRoleRepository.deleteMany(queryOptions); - } } diff --git a/libs/user-management/src/user-management.module.ts b/libs/user-management/src/user-management.module.ts new file mode 100644 index 000000000..a7a0a4a28 --- /dev/null +++ b/libs/user-management/src/user-management.module.ts @@ -0,0 +1,50 @@ +import { Module } from '@nestjs/common'; +import { OrgRolesRepository, UserActivityRepository, UserOrgRolesRepository } from './repositories'; +import { PrismaServiceModule } from '@credebl/prisma-service'; +import { + ClientRegistrationService, + KeycloakUrlService, + OrgRolesService, + SupabaseService, + UserActivityService, + UserOrgRolesService +} from './services'; +import { CommonConstants, CommonModule, getNatsOptions } from '@credebl/common'; +import { ClientsModule, Transport } from '@nestjs/microservices'; + +@Module({ + imports: [ + PrismaServiceModule, + CommonModule, + ClientsModule.register([ + { + name: 'NATS_CLIENT', + transport: Transport.NATS, + options: getNatsOptions(CommonConstants.CLOUD_WALLET_SERVICE, process.env.USER_MANAGEMENT_NKEY_SEED) + } + ]) + ], + providers: [ + KeycloakUrlService, + OrgRolesService, + OrgRolesRepository, + UserActivityService, + SupabaseService, + ClientRegistrationService, + UserOrgRolesRepository, + UserActivityRepository, + UserOrgRolesService + ], + exports: [ + KeycloakUrlService, + OrgRolesService, + OrgRolesRepository, + UserActivityService, + SupabaseService, + ClientRegistrationService, + UserOrgRolesRepository, + UserActivityRepository, + UserOrgRolesService + ] +}) +export class UserManagementModule {} diff --git a/libs/user-management/tsconfig.json b/libs/user-management/tsconfig.json new file mode 100644 index 000000000..5cc50cd88 --- /dev/null +++ b/libs/user-management/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "../../tsconfig.json", + "include": [ + "src/**/*" + ] +} diff --git a/libs/user-management/tsconfig.lib.json b/libs/user-management/tsconfig.lib.json new file mode 100644 index 000000000..f507c4ea4 --- /dev/null +++ b/libs/user-management/tsconfig.lib.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + }, + "include": [ + "src/" + ] +} diff --git a/libs/user-org-roles/src/index.ts b/libs/user-org-roles/src/index.ts deleted file mode 100644 index be7c557e1..000000000 --- a/libs/user-org-roles/src/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './user-org-roles.module'; -export * from './user-org-roles.service'; diff --git a/libs/user-org-roles/src/user-org-roles.module.ts b/libs/user-org-roles/src/user-org-roles.module.ts deleted file mode 100644 index be4c0b84f..000000000 --- a/libs/user-org-roles/src/user-org-roles.module.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { PrismaService } from '@credebl/prisma-service'; -import { Logger } from '@nestjs/common'; -import { Module } from '@nestjs/common'; -import { UserOrgRolesRepository } from '../repositories'; -import { UserOrgRolesService } from './user-org-roles.service'; - -@Module({ - providers: [UserOrgRolesService, UserOrgRolesRepository, Logger, PrismaService], - exports: [UserOrgRolesService] -}) -export class UserOrgRolesModule {} diff --git a/libs/user-org-roles/tsconfig.lib.json b/libs/user-org-roles/tsconfig.lib.json deleted file mode 100644 index 3cb249bc1..000000000 --- a/libs/user-org-roles/tsconfig.lib.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "declaration": true, - "outDir": "../../dist/libs/user-org-roles" - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] -} diff --git a/libs/user-request/src/index.ts b/libs/user-request/src/index.ts deleted file mode 100644 index 0799fc9ba..000000000 --- a/libs/user-request/src/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './user-request.module'; -export * from './user-request.service'; diff --git a/libs/user-request/src/user-request.interface.ts b/libs/user-request/src/user-request.interface.ts deleted file mode 100644 index 93a703215..000000000 --- a/libs/user-request/src/user-request.interface.ts +++ /dev/null @@ -1,57 +0,0 @@ -export interface IUserRequest { - userId: string; - email: string; - orgId: string; - agentEndPoint?: string; - apiKey?: string; - tenantId?: string; - tenantName?: string; - tenantOrgId?: string; - userRoleOrgPermissions?: IUserRoleOrgPerms[]; - orgName?: string; - selectedOrg: ISelectedOrg; -} - -export interface ISelectedOrg { - id: string; - userId: string; - orgRoleId: string; - orgId: string; - orgRole: object; - organisation: object; -} - -export interface IOrganization { - name: string; - description: string; - org_agents: IOrgAgent[] - -} - -export interface IOrgAgent { - orgDid: string; - verkey: string; - agentEndPoint: string; - agentOptions: string; - walletName: string; - agentsTypeId: string; - orgId: string; -} - -export class IUserRoleOrgPerms { - id: string; - role: IUserRole; - Organization: IUserOrg; -} - -export class IUserRole { - id: string; - name: string; - permissions: string[]; - -} - -export class IUserOrg { - id: string; - orgName: string; -} \ No newline at end of file diff --git a/libs/user-request/src/user-request.module.ts b/libs/user-request/src/user-request.module.ts deleted file mode 100644 index b1b50ffd8..000000000 --- a/libs/user-request/src/user-request.module.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Module } from '@nestjs/common'; -import { UserRequestService } from './user-request.service'; - -@Module({ - providers: [UserRequestService], - exports: [UserRequestService] -}) -export class UserRequestModule {} diff --git a/libs/user-request/src/user-request.service.spec.ts b/libs/user-request/src/user-request.service.spec.ts deleted file mode 100644 index acc591d94..000000000 --- a/libs/user-request/src/user-request.service.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { UserRequestService } from './user-request.service'; - -describe('UserRequestService', () => { - let service: UserRequestService; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - providers: [UserRequestService] - }).compile(); - - service = module.get(UserRequestService); - }); - - it('should be defined', () => { - expect(service).toBeDefined(); - }); -}); diff --git a/libs/user-request/src/user-request.service.ts b/libs/user-request/src/user-request.service.ts deleted file mode 100644 index 1aa672185..000000000 --- a/libs/user-request/src/user-request.service.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { Injectable } from '@nestjs/common'; - -@Injectable() -export class UserRequestService {} diff --git a/libs/user-request/tsconfig.lib.json b/libs/user-request/tsconfig.lib.json deleted file mode 100644 index 7d511c9d7..000000000 --- a/libs/user-request/tsconfig.lib.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "declaration": true, - "outDir": "../../dist/libs/user-request" - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] -} diff --git a/nest-cli.json b/nest-cli.json index ee0cc7122..2e1b75dcf 100644 --- a/nest-cli.json +++ b/nest-cli.json @@ -4,7 +4,6 @@ "monorepo": true, "root": "apps/api-gateway", "compilerOptions": { - "webpack": true, "tsConfigPath": "apps/api-gateway/tsconfig.app.json" }, "projects": { diff --git a/package.json b/package.json index b4217c6ee..cd8e3e6a4 100755 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "api-gateway", + "name": "credebl-platform", "version": "2.0.0", "description": "CREDEBL SSI Platform API Gateway", "author": "", @@ -7,7 +7,7 @@ "scripts": { "prebuild": "rimraf dist", "build": "nest build", - "build:all": "rimraf dist && nest build api-gateway && nest build platform-service && nest build agent-service && nest build connection", + "build:all": "rimraf dist && nest build api-gateway && nest build agent-provisioning && nest build agent-service && nest build connection && nest build cloud-wallet && nest build geo-location && nest build issuance && nest build ledger && nest build notification && nest build organization && nest build user && nest build utility && nest build verification && nest build webhook", "format": "prettier --write \"apps/**/*.ts\" \"libs/**/*.ts\"", "start": "npx prisma migrate deploy --schema=./libs/prisma-service/prisma/schema.prisma & nest start", "start:dev": "nest start --watch", @@ -20,129 +20,124 @@ "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", "test:e2e": "jest --config ./apps/api-gateway/test/jest-e2e.json", "prisma:generate": "npx prisma generate", + "generate": "npx prisma generate --schema=node_modules/@credebl/prisma-service/prisma/schema.prisma", "prepare": "husky install" }, "prisma": { "seed": "ts-node prisma/seed.ts" }, "dependencies": { - "@elastic/ecs-winston-format": "^1.5.3", - "@nestjs/axios": "^3.0.0", - "@nestjs/bull": "^10.0.1", - "@nestjs/cache-manager": "^2.1.0", - "@nestjs/common": "^10.2.7", - "@nestjs/config": "^3.0.0", - "@nestjs/core": "^10.1.3", - "@nestjs/jwt": "^10.1.0", - "@nestjs/microservices": "^10.1.3", - "@nestjs/passport": "^10.0.0", - "@nestjs/platform-express": "^10.1.3", - "@nestjs/platform-socket.io": "^10.1.3", - "@nestjs/schedule": "^3.0.1", - "@nestjs/swagger": "^7.1.6", - "@nestjs/typeorm": "^10.0.0", - "@nestjs/websockets": "^10.1.3", - "@prisma/client": "^5.1.1", + "@nestjs/axios": "^3.1.3", + "@nestjs/bull": "^10.2.3", + "@nestjs/cache-manager": "^2.3.0", + "@nestjs/common": "^10.4.20", + "@nestjs/config": "^3.3.0", + "@nestjs/core": "^10.4.20", + "@nestjs/jwt": "^10.2.0", + "@nestjs/microservices": "^10.4.20", + "@nestjs/passport": "^10.0.3", + "@nestjs/platform-express": "^10.4.20", + "@nestjs/platform-socket.io": "^10.4.20", + "@nestjs/schedule": "^3.0.4", + "@nestjs/swagger": "^7.4.2", + "@nestjs/typeorm": "^10.0.2", + "@nestjs/websockets": "^10.4.20", + "@prisma/client": "^5.22.0", "@sendgrid/mail": "^7.7.0", - "@supabase/supabase-js": "^2.32.0", - "@types/async-retry": "^1.4.5", - "@types/crypto-js": "^4.1.1", - "@types/json2csv": "^5.0.5", - "@types/pdfkit": "^0.12.6", + "@types/async-retry": "^1.4.9", + "@types/crypto-js": "^4.2.2", + "@types/json2csv": "^5.0.7", + "@types/pdfkit": "^0.12.12", "async-retry": "^1.3.3", - "auth0-js": "^9.22.1", - "aws-sdk": "^2.1510.0", - "bcrypt": "^5.1.0", + "auth0-js": "^9.28.0", + "aws-sdk": "^2.1692.0", + "bcrypt": "^5.1.1", "blob-stream": "^0.1.3", - "body-parser": "^1.20.1", + "body-parser": "^1.20.3", "buffer": "^6.0.3", - "bull": "^4.11.4", - "cache-manager": "^5.2.4", + "bull": "^4.16.5", + "cache-manager": "^5.7.6", "cache-manager-redis-store": "^2.0.0", "class-transformer": "^0.5.1", - "class-validator": "^0.14.0", - "crypto-js": "^4.1.1", + "class-validator": "^0.14.2", + "crypto-js": "^4.2.0", "crypto-random-string": "^5.0.0", - "dotenv": "^16.0.3", - "express": "^4.18.2", + "dotenv": "^16.6.1", + "express": "^4.21.2", "fs": "0.0.1-security", - "generate-password": "^1.7.0", - "helmet": "^7.0.0", + "generate-password": "^1.7.1", + "helmet": "^7.2.0", "html-pdf": "^3.0.1", - "html-to-image": "^1.11.11", + "html-to-image": "^1.11.13", "json2csv": "^5.0.7", - "jsonwebtoken": "^9.0.1", - "jwks-rsa": "^3.0.1", + "jsonwebtoken": "^9.0.2", + "jwks-rsa": "^3.2.0", "linebyline": "^1.3.0", - "moment": "^2.29.3", + "moment": "^2.30.1", "multer": "1.4.5-lts.1", - "morgan": "^1.10.0", "nanoid": "^4.0.2", - "nats": "^2.15.1", + "nats": "^2.29.3", + "nestjs-cls": "^4.5.0", "nestjs-rate-limiter": "^3.1.0", - "nestjs-cls": "^4.3.0", "nestjs-supabase-auth": "^1.0.9", - "nestjs-typeorm-paginate": "^4.0.4", + "nestjs-typeorm-paginate": "^4.1.0", "node-html-to-image": "^4.0.0", "node-qpdf2": "^2.0.0", - "p-limit": "^3.0.0", - "papaparse": "^5.4.1", + "p-limit": "^3.1.0", + "papaparse": "^5.5.3", "passport": "^0.6.0", "passport-jwt": "^4.0.1", "passport-local": "^1.0.0", "path": "^0.12.7", "pdfkit": "^0.13.0", - "pg": "^8.11.2", - "puppeteer": "^21.5.0", - "qrcode": "^1.5.3", - "qs": "^6.11.2", - "reflect-metadata": "^0.1.13", + "pg": "^8.16.3", + "puppeteer": "^21.11.0", + "qrcode": "^1.5.4", + "qs": "^6.14.0", + "reflect-metadata": "^0.1.14", "rimraf": "^3.0.2", "rsync": "^0.6.1", - "rxjs": "^7.8.1", - "socket.io-client": "^4.7.1", - "swagger-ui-express": "^5.0.0", - "typeorm": "^0.3.10", + "rxjs": "^7.8.2", + "socket.io-client": "^4.8.1", + "swagger-ui-express": "^5.0.1", + "typeorm": "^0.3.25", "unzipper": "^0.10.14", - "uuid": "^9.0.0", - "validator": "^13.11.0", - "web-push": "^3.6.4", - "winston": "3.4", - "winston-daily-rotate-file": "^5.0.0", - "winston-elasticsearch": "0.16.0", + "uuid": "^9.0.1", + "validator": "^13.15.15", + "web-push": "^3.6.7", "xml-js": "^1.6.11" }, "devDependencies": { - "@nestjs/cli": "^10.1.11", - "@nestjs/schematics": "^10.0.1", - "@nestjs/testing": "^10.1.3", - "@types/express": "^4.17.17", - "@types/jest": "^29.5.3", - "@types/multer": "^1.4.9", - "@types/node": "^20.4.6", + "@nestjs/cli": "^10.4.9", + "@nestjs/schematics": "^10.2.3", + "@nestjs/testing": "^10.4.20", + "@types/express": "^4.17.23", + "@types/jest": "^29.5.14", + "@types/multer": "^1.4.13", + "@types/node": "^20.19.9", "@types/passport-jwt": "3.0.9", - "@types/passport-local": "^1.0.35", - "@types/supertest": "^2.0.12", - "@typescript-eslint/eslint-plugin": "^6.2.1", - "@typescript-eslint/parser": "^6.2.1", - "eslint": "^8.46.0", - "eslint-config-prettier": "^8.10.0", + "@types/passport-local": "^1.0.38", + "@types/supertest": "^2.0.16", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", + "eslint": "^8.57.1", + "eslint-config-prettier": "^8.10.2", "eslint-config-standard-with-typescript": "^37.0.0", - "eslint-plugin-import": "^2.28.0", + "eslint-plugin-import": "^2.32.0", "eslint-plugin-n": "^15.7.0", - "eslint-plugin-prettier": "^4.2.1", - "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-prettier": "^4.2.5", + "eslint-plugin-promise": "^6.6.0", "husky": "^8.0.3", - "jest": "^29.6.2", - "lint-staged": "^13.2.3", - "prettier": "^3.0.1", - "prisma": "^5.1.1", - "supertest": "^6.3.3", - "ts-jest": "^29.1.1", - "ts-loader": "^9.4.4", - "ts-node": "^10.9.1", + "jest": "^29.7.0", + "lint-staged": "^13.3.0", + "prettier": "^3.6.2", + "prisma": "^5.22.0", + "supertest": "^6.3.4", + "ts-jest": "^29.4.0", + "ts-loader": "^9.5.2", + "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", - "typescript": "^5.1.6" + "typescript": "^5.8.3" }, "lint-staged": { "**/*.{js,ts}": [ @@ -170,22 +165,13 @@ "moduleNameMapper": { "@credebl/common/(.*)": "/libs/common/src/$1", "@credebl/common": "/libs/common/src", - "@credebl/keycloak-url/(.*)": "/libs/keycloak-url/src/$1", - "@credebl/keycloak-url": "/libs/keycloak-url/src", - "@credebl/client-registration/(.*)": "/libs/client-registration/src/$1", - "@credebl/client-registration": "/libs/client-registration/src", "^@credebl/prisma(|/.*)$": "/libs/prisma/src/$1", - "^@credebl/repositories(|/.*)$": "/libs/repositories/src/$1", - "^@credebl/user-request(|/.*)$": "/libs/user-request/src/$1", - "^@credebl/enum(|/.*)$": "/libs/enum/src/$1", "^@credebl/prisma-service(|/.*)$": "/libs/prisma-service/src/$1", - "^@credebl/org-roles(|/.*)$": "/libs/org-roles/src/$1", - "^@credebl/user-org-roles(|/.*)$": "/libs/user-org-roles/src/$1", - "^y/user-activity(|/.*)$": "/libs/user-activity/src/$1", + "@credebl/user-management": "/libs/user-management/src", + "^@credebl/user-management(|/.*)$": "/libs/user-management/src/$1", "^@app/supabase(|/.*)$": "/libs/supabase/src/$1", "^@credebl/aws(|/.*)$": "/libs/aws/src/$1", "^credebl/utility(|/.*)$": "/libs/utility/src/$1", - "^@credebl/config(|/.*)$": "/libs/config/src/$1", "^@credebl/context(|/.*)$": "/libs/context/src/$1", "^@credebl/logger(|/.*)$": "/libs/logger/src/$1" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 83708c63d..e1d08a63d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,102 +8,96 @@ importers: .: dependencies: - '@elastic/ecs-winston-format': - specifier: ^1.5.3 - version: 1.5.3 '@nestjs/axios': - specifier: ^3.0.0 - version: 3.0.0(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(axios@1.4.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + specifier: ^3.1.3 + version: 3.1.3(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(axios@1.11.0)(rxjs@7.8.2) '@nestjs/bull': - specifier: ^10.0.1 - version: 10.0.1(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/core@10.1.3)(bull@4.11.4) + specifier: ^10.2.3 + version: 10.2.3(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(bull@4.16.5) '@nestjs/cache-manager': - specifier: ^2.1.0 - version: 2.2.1(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/core@10.1.3)(cache-manager@5.4.0)(rxjs@7.8.1) + specifier: ^2.3.0 + version: 2.3.0(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(cache-manager@5.7.6)(rxjs@7.8.2) '@nestjs/common': - specifier: ^10.2.7 - version: 10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + specifier: ^10.4.20 + version: 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) '@nestjs/config': - specifier: ^3.0.0 - version: 3.0.0(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(reflect-metadata@0.1.13) + specifier: ^3.3.0 + version: 3.3.0(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(rxjs@7.8.2) '@nestjs/core': - specifier: ^10.1.3 - version: 10.1.3(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/microservices@10.1.3)(@nestjs/platform-express@10.1.3)(@nestjs/websockets@10.1.3)(reflect-metadata@0.1.13)(rxjs@7.8.1) + specifier: ^10.4.20 + version: 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.20)(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(reflect-metadata@0.1.14)(rxjs@7.8.2) '@nestjs/jwt': - specifier: ^10.1.0 - version: 10.1.0(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1)) + specifier: ^10.2.0 + version: 10.2.0(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2)) '@nestjs/microservices': - specifier: ^10.1.3 - version: 10.1.3(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/core@10.1.3)(@nestjs/websockets@10.1.3)(cache-manager@5.4.0)(ioredis@5.3.2)(nats@2.15.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) + specifier: ^10.4.20 + version: 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(@nestjs/websockets@10.4.20)(cache-manager@5.7.6)(ioredis@5.6.1)(nats@2.29.3)(reflect-metadata@0.1.14)(rxjs@7.8.2) '@nestjs/passport': - specifier: ^10.0.0 - version: 10.0.0(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(passport@0.6.0) + specifier: ^10.0.3 + version: 10.0.3(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(passport@0.6.0) '@nestjs/platform-express': - specifier: ^10.1.3 - version: 10.1.3(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/core@10.1.3) + specifier: ^10.4.20 + version: 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20) '@nestjs/platform-socket.io': - specifier: ^10.1.3 - version: 10.1.3(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/websockets@10.1.3)(bufferutil@4.0.7)(rxjs@7.8.1)(utf-8-validate@5.0.10) + specifier: ^10.4.20 + version: 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/websockets@10.4.20)(rxjs@7.8.2) '@nestjs/schedule': - specifier: ^3.0.1 - version: 3.0.1(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/core@10.1.3)(reflect-metadata@0.1.13) + specifier: ^3.0.4 + version: 3.0.4(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(reflect-metadata@0.1.14) '@nestjs/swagger': - specifier: ^7.1.6 - version: 7.1.6(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/core@10.1.3)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13) + specifier: ^7.4.2 + version: 7.4.2(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14) '@nestjs/typeorm': - specifier: ^10.0.0 - version: 10.0.0(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/core@10.1.3)(reflect-metadata@0.1.13)(rxjs@7.8.1)(typeorm@0.3.10(ioredis@5.3.2)(pg@8.11.2)(redis@3.1.2)(ts-node@10.9.1(@types/node@20.4.6)(typescript@5.1.6))) + specifier: ^10.0.2 + version: 10.0.2(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(reflect-metadata@0.1.14)(rxjs@7.8.2)(typeorm@0.3.25(ioredis@5.6.1)(pg@8.16.3)(redis@3.1.2)(reflect-metadata@0.1.14)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))) '@nestjs/websockets': - specifier: ^10.1.3 - version: 10.1.3(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/core@10.1.3)(@nestjs/platform-socket.io@10.1.3)(reflect-metadata@0.1.13)(rxjs@7.8.1) + specifier: ^10.4.20 + version: 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(@nestjs/platform-socket.io@10.4.20)(reflect-metadata@0.1.14)(rxjs@7.8.2) '@prisma/client': - specifier: ^5.1.1 - version: 5.1.1(prisma@5.1.1) + specifier: ^5.22.0 + version: 5.22.0(prisma@5.22.0) '@sendgrid/mail': specifier: ^7.7.0 version: 7.7.0 - '@supabase/supabase-js': - specifier: ^2.32.0 - version: 2.32.0 '@types/async-retry': - specifier: ^1.4.5 - version: 1.4.5 + specifier: ^1.4.9 + version: 1.4.9 '@types/crypto-js': - specifier: ^4.1.1 - version: 4.1.1 + specifier: ^4.2.2 + version: 4.2.2 '@types/json2csv': - specifier: ^5.0.5 - version: 5.0.5 + specifier: ^5.0.7 + version: 5.0.7 '@types/pdfkit': - specifier: ^0.12.6 - version: 0.12.6 + specifier: ^0.12.12 + version: 0.12.12 async-retry: specifier: ^1.3.3 version: 1.3.3 auth0-js: - specifier: ^9.22.1 - version: 9.22.1 + specifier: ^9.28.0 + version: 9.28.0 aws-sdk: - specifier: ^2.1510.0 - version: 2.1560.0 + specifier: ^2.1692.0 + version: 2.1692.0 bcrypt: - specifier: ^5.1.0 - version: 5.1.0 + specifier: ^5.1.1 + version: 5.1.1 blob-stream: specifier: ^0.1.3 version: 0.1.3 body-parser: - specifier: ^1.20.1 - version: 1.20.1 + specifier: ^1.20.3 + version: 1.20.3 buffer: specifier: ^6.0.3 version: 6.0.3 bull: - specifier: ^4.11.4 - version: 4.11.4 + specifier: ^4.16.5 + version: 4.16.5 cache-manager: - specifier: ^5.2.4 - version: 5.4.0 + specifier: ^5.7.6 + version: 5.7.6 cache-manager-redis-store: specifier: ^2.0.0 version: 2.0.0 @@ -111,53 +105,50 @@ importers: specifier: ^0.5.1 version: 0.5.1 class-validator: - specifier: ^0.14.0 - version: 0.14.0 + specifier: ^0.14.2 + version: 0.14.2 crypto-js: - specifier: ^4.1.1 - version: 4.1.1 + specifier: ^4.2.0 + version: 4.2.0 crypto-random-string: specifier: ^5.0.0 version: 5.0.0 dotenv: - specifier: ^16.0.3 - version: 16.0.3 + specifier: ^16.6.1 + version: 16.6.1 express: - specifier: ^4.18.2 - version: 4.18.2 + specifier: ^4.21.2 + version: 4.21.2 fs: specifier: 0.0.1-security version: 0.0.1-security generate-password: - specifier: ^1.7.0 - version: 1.7.0 + specifier: ^1.7.1 + version: 1.7.1 helmet: - specifier: ^7.0.0 - version: 7.1.0 + specifier: ^7.2.0 + version: 7.2.0 html-pdf: specifier: ^3.0.1 version: 3.0.1 html-to-image: - specifier: ^1.11.11 - version: 1.11.11 + specifier: ^1.11.13 + version: 1.11.13 json2csv: specifier: ^5.0.7 version: 5.0.7 jsonwebtoken: - specifier: ^9.0.1 - version: 9.0.1 + specifier: ^9.0.2 + version: 9.0.2 jwks-rsa: - specifier: ^3.0.1 - version: 3.0.1 + specifier: ^3.2.0 + version: 3.2.0 linebyline: specifier: ^1.3.0 version: 1.3.0 moment: - specifier: ^2.29.3 - version: 2.29.3 - morgan: - specifier: ^1.10.0 - version: 1.10.0 + specifier: ^2.30.1 + version: 2.30.1 multer: specifier: 1.4.5-lts.1 version: 1.4.5-lts.1 @@ -165,11 +156,11 @@ importers: specifier: ^4.0.2 version: 4.0.2 nats: - specifier: ^2.15.1 - version: 2.15.1 + specifier: ^2.29.3 + version: 2.29.3 nestjs-cls: - specifier: ^4.3.0 - version: 4.4.1(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/core@10.1.3)(reflect-metadata@0.1.13)(rxjs@7.8.1) + specifier: ^4.5.0 + version: 4.5.0(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(reflect-metadata@0.1.14)(rxjs@7.8.2) nestjs-rate-limiter: specifier: ^3.1.0 version: 3.1.0 @@ -177,20 +168,20 @@ importers: specifier: ^1.0.9 version: 1.0.9 nestjs-typeorm-paginate: - specifier: ^4.0.4 - version: 4.0.4(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(typeorm@0.3.10(ioredis@5.3.2)(pg@8.11.2)(redis@3.1.2)(ts-node@10.9.1(@types/node@20.4.6)(typescript@5.1.6))) + specifier: ^4.1.0 + version: 4.1.0(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(typeorm@0.3.25(ioredis@5.6.1)(pg@8.16.3)(redis@3.1.2)(reflect-metadata@0.1.14)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))) node-html-to-image: specifier: ^4.0.0 - version: 4.0.0(bufferutil@4.0.7)(utf-8-validate@5.0.10) + version: 4.0.0 node-qpdf2: specifier: ^2.0.0 version: 2.0.0 p-limit: - specifier: ^3.0.0 + specifier: ^3.1.0 version: 3.1.0 papaparse: - specifier: ^5.4.1 - version: 5.4.1 + specifier: ^5.5.3 + version: 5.5.3 passport: specifier: ^0.6.0 version: 0.6.0 @@ -207,20 +198,20 @@ importers: specifier: ^0.13.0 version: 0.13.0 pg: - specifier: ^8.11.2 - version: 8.11.2 + specifier: ^8.16.3 + version: 8.16.3 puppeteer: - specifier: ^21.5.0 - version: 21.5.0(bufferutil@4.0.7)(typescript@5.1.6)(utf-8-validate@5.0.10) + specifier: ^21.11.0 + version: 21.11.0(typescript@5.8.3) qrcode: - specifier: ^1.5.3 - version: 1.5.3 + specifier: ^1.5.4 + version: 1.5.4 qs: - specifier: ^6.11.2 - version: 6.11.2 + specifier: ^6.14.0 + version: 6.14.0 reflect-metadata: - specifier: ^0.1.13 - version: 0.1.13 + specifier: ^0.1.14 + version: 0.1.14 rimraf: specifier: ^3.0.2 version: 3.0.2 @@ -228,338 +219,566 @@ importers: specifier: ^0.6.1 version: 0.6.1 rxjs: - specifier: ^7.8.1 - version: 7.8.1 + specifier: ^7.8.2 + version: 7.8.2 socket.io-client: - specifier: ^4.7.1 - version: 4.7.1(bufferutil@4.0.7)(utf-8-validate@5.0.10) + specifier: ^4.8.1 + version: 4.8.1 swagger-ui-express: - specifier: ^5.0.0 - version: 5.0.0(express@4.18.2) + specifier: ^5.0.1 + version: 5.0.1(express@4.21.2) typeorm: - specifier: ^0.3.10 - version: 0.3.10(ioredis@5.3.2)(pg@8.11.2)(redis@3.1.2)(ts-node@10.9.1(@types/node@20.4.6)(typescript@5.1.6)) + specifier: ^0.3.25 + version: 0.3.25(ioredis@5.6.1)(pg@8.16.3)(redis@3.1.2)(reflect-metadata@0.1.14)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3)) unzipper: specifier: ^0.10.14 version: 0.10.14 uuid: - specifier: ^9.0.0 - version: 9.0.0 + specifier: ^9.0.1 + version: 9.0.1 validator: - specifier: ^13.11.0 - version: 13.11.0 + specifier: ^13.15.15 + version: 13.15.15 web-push: - specifier: ^3.6.4 - version: 3.6.4 - winston: - specifier: '3.4' - version: 3.4.0 - winston-daily-rotate-file: - specifier: ^5.0.0 - version: 5.0.0(winston@3.4.0) - winston-elasticsearch: - specifier: 0.16.0 - version: 0.16.0 + specifier: ^3.6.7 + version: 3.6.7 xml-js: specifier: ^1.6.11 version: 1.6.11 devDependencies: '@nestjs/cli': - specifier: ^10.1.11 - version: 10.1.11 + specifier: ^10.4.9 + version: 10.4.9 '@nestjs/schematics': - specifier: ^10.0.1 - version: 10.0.1(chokidar@3.5.3)(typescript@5.1.6) + specifier: ^10.2.3 + version: 10.2.3(chokidar@3.6.0)(typescript@5.8.3) '@nestjs/testing': - specifier: ^10.1.3 - version: 10.1.3(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/core@10.1.3)(@nestjs/microservices@10.1.3)(@nestjs/platform-express@10.1.3) + specifier: ^10.4.20 + version: 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(@nestjs/microservices@10.4.20)(@nestjs/platform-express@10.4.20) '@types/express': - specifier: ^4.17.17 - version: 4.17.17 + specifier: ^4.17.23 + version: 4.17.23 '@types/jest': - specifier: ^29.5.3 - version: 29.5.3 + specifier: ^29.5.14 + version: 29.5.14 '@types/multer': - specifier: ^1.4.9 - version: 1.4.9 + specifier: ^1.4.13 + version: 1.4.13 '@types/node': - specifier: ^20.4.6 - version: 20.4.6 + specifier: ^20.19.9 + version: 20.19.9 '@types/passport-jwt': specifier: 3.0.9 version: 3.0.9 '@types/passport-local': - specifier: ^1.0.35 - version: 1.0.35 + specifier: ^1.0.38 + version: 1.0.38 '@types/supertest': - specifier: ^2.0.12 - version: 2.0.12 + specifier: ^2.0.16 + version: 2.0.16 '@typescript-eslint/eslint-plugin': - specifier: ^6.2.1 - version: 6.2.1(@typescript-eslint/parser@6.2.1(eslint@8.46.0)(typescript@5.1.6))(eslint@8.46.0)(typescript@5.1.6) + specifier: ^6.21.0 + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ^6.2.1 - version: 6.2.1(eslint@8.46.0)(typescript@5.1.6) + specifier: ^6.21.0 + version: 6.21.0(eslint@8.57.1)(typescript@5.8.3) eslint: - specifier: ^8.46.0 - version: 8.46.0 + specifier: ^8.57.1 + version: 8.57.1 eslint-config-prettier: - specifier: ^8.10.0 - version: 8.10.0(eslint@8.46.0) + specifier: ^8.10.2 + version: 8.10.2(eslint@8.57.1) eslint-config-standard-with-typescript: specifier: ^37.0.0 - version: 37.0.0(@typescript-eslint/eslint-plugin@6.2.1(@typescript-eslint/parser@6.2.1(eslint@8.46.0)(typescript@5.1.6))(eslint@8.46.0)(typescript@5.1.6))(eslint-plugin-import@2.28.0(@typescript-eslint/parser@6.2.1(eslint@8.46.0)(typescript@5.1.6))(eslint@8.46.0))(eslint-plugin-n@15.7.0(eslint@8.46.0))(eslint-plugin-promise@6.1.1(eslint@8.46.0))(eslint@8.46.0)(typescript@5.1.6) + version: 37.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.8.3) eslint-plugin-import: - specifier: ^2.28.0 - version: 2.28.0(@typescript-eslint/parser@6.2.1(eslint@8.46.0)(typescript@5.1.6))(eslint@8.46.0) + specifier: ^2.32.0 + version: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1) eslint-plugin-n: specifier: ^15.7.0 - version: 15.7.0(eslint@8.46.0) + version: 15.7.0(eslint@8.57.1) eslint-plugin-prettier: - specifier: ^4.2.1 - version: 4.2.1(eslint-config-prettier@8.10.0(eslint@8.46.0))(eslint@8.46.0)(prettier@3.0.1) + specifier: ^4.2.5 + version: 4.2.5(eslint-config-prettier@8.10.2(eslint@8.57.1))(eslint@8.57.1)(prettier@3.6.2) eslint-plugin-promise: - specifier: ^6.1.1 - version: 6.1.1(eslint@8.46.0) + specifier: ^6.6.0 + version: 6.6.0(eslint@8.57.1) husky: specifier: ^8.0.3 version: 8.0.3 jest: - specifier: ^29.6.2 - version: 29.6.2(@types/node@20.4.6)(ts-node@10.9.1(@types/node@20.4.6)(typescript@5.1.6)) + specifier: ^29.7.0 + version: 29.7.0(@types/node@20.19.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3)) lint-staged: - specifier: ^13.2.3 - version: 13.2.3 + specifier: ^13.3.0 + version: 13.3.0 prettier: - specifier: ^3.0.1 - version: 3.0.1 + specifier: ^3.6.2 + version: 3.6.2 prisma: - specifier: ^5.1.1 - version: 5.1.1 + specifier: ^5.22.0 + version: 5.22.0 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.22.9)(@jest/types@29.6.1)(babel-jest@29.6.2(@babel/core@7.22.9))(jest@29.6.2(@types/node@20.4.6)(ts-node@10.9.1(@types/node@20.4.6)(typescript@5.1.6)))(typescript@5.1.6) + specifier: ^29.4.0 + version: 29.4.0(@babel/core@7.28.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.0))(jest-util@29.7.0)(jest@29.7.0(@types/node@20.19.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3)))(typescript@5.8.3) ts-loader: - specifier: ^9.4.4 - version: 9.4.4(typescript@5.1.6)(webpack@5.88.1) + specifier: ^9.5.2 + version: 9.5.2(typescript@5.8.3)(webpack@5.97.1) ts-node: - specifier: ^10.9.1 - version: 10.9.1(@types/node@20.4.6)(typescript@5.1.6) + specifier: ^10.9.2 + version: 10.9.2(@types/node@20.19.9)(typescript@5.8.3) tsconfig-paths: specifier: ^4.2.0 version: 4.2.0 typescript: - specifier: ^5.1.6 - version: 5.1.6 + specifier: ^5.8.3 + version: 5.8.3 + + apps/api-gateway: + dependencies: + '@credebl/aws': + specifier: file:../../credebl-aws-2.0.0.tgz + version: file:credebl-aws-2.0.0.tgz(@nestjs/core@10.4.20)(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(cache-manager@5.7.6)(class-transformer@0.5.1)(class-validator@0.14.2)(ioredis@5.6.1)(nats@2.29.3)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@credebl/common': + specifier: file:../../credebl-common-2.0.0.tgz + version: file:credebl-common-2.0.0.tgz(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(@prisma/client@5.22.0(prisma@5.22.0))(cache-manager@5.7.6)(ioredis@5.6.1)(reflect-metadata@0.1.14) + '@credebl/logger': + specifier: file:../../credebl-logger-2.0.0.tgz + version: file:credebl-logger-2.0.0.tgz(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(axios@1.11.0)(cache-manager@5.7.6)(class-transformer@0.5.1)(class-validator@0.14.2)(ioredis@5.6.1)(nats@2.29.3)(reflect-metadata@0.1.14) + '@credebl/prisma-service': + specifier: file:../../credebl-prisma-service-2.0.0.tgz + version: file:credebl-prisma-service-2.0.0.tgz(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(@prisma/client@5.22.0(prisma@5.22.0))(cache-manager@5.7.6)(class-transformer@0.5.1)(class-validator@0.14.2)(ioredis@5.6.1)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@credebl/user-management': + specifier: file:../../credebl-user-management-2.0.0.tgz + version: file:credebl-user-management-2.0.0.tgz(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(@prisma/client@5.22.0(prisma@5.22.0))(axios@1.11.0)(cache-manager@5.7.6)(class-transformer@0.5.1)(class-validator@0.14.2)(ioredis@5.6.1)(nats@2.29.3)(reflect-metadata@0.1.14) + '@nestjs/common': + specifier: ^10.4.20 + version: 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/core': + specifier: ^10.4.20 + version: 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.20)(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/microservices': + specifier: ^10.4.20 + version: 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(@nestjs/websockets@10.4.20)(cache-manager@5.7.6)(ioredis@5.6.1)(nats@2.29.3)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/passport': + specifier: ^10.0.3 + version: 10.0.3(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(passport@0.6.0) + '@nestjs/platform-socket.io': + specifier: ^10.4.20 + version: 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/websockets@10.4.20)(rxjs@7.8.2) + '@nestjs/swagger': + specifier: ^7.4.2 + version: 7.4.2(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14) + '@nestjs/websockets': + specifier: ^10.4.20 + version: 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(@nestjs/platform-socket.io@10.4.20)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@prisma/client': + specifier: ^5.22.0 + version: 5.22.0(prisma@5.22.0) + cache-manager-redis-store: + specifier: ^2.0.0 + version: 2.0.0 + class-transformer: + specifier: ^0.5.1 + version: 0.5.1 + class-validator: + specifier: ^0.14.2 + version: 0.14.2 + dotenv: + specifier: ^16.6.1 + version: 16.6.1 + express: + specifier: ^4.21.2 + version: 4.21.2 + fs: + specifier: 0.0.1-security + version: 0.0.1-security + helmet: + specifier: ^7.2.0 + version: 7.2.0 + jsonwebtoken: + specifier: ^9.0.2 + version: 9.0.2 + jwks-rsa: + specifier: ^3.2.0 + version: 3.2.0 + nats: + specifier: ^2.29.3 + version: 2.29.3 + nestjs-rate-limiter: + specifier: ^3.1.0 + version: 3.1.0 + passport-jwt: + specifier: ^4.0.1 + version: 4.0.1 + path: + specifier: ^0.12.7 + version: 0.12.7 + qrcode: + specifier: ^1.5.4 + version: 1.5.4 + rxjs: + specifier: ^7.8.2 + version: 7.8.2 + swagger-ui-express: + specifier: ^5.0.1 + version: 5.0.1(express@4.21.2) + uuid: + specifier: ^9.0.1 + version: 9.0.1 + + apps/connection: + dependencies: + '@credebl/common': + specifier: file:../../credebl-common-2.0.0.tgz + version: file:credebl-common-2.0.0.tgz(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(@prisma/client@6.10.1(prisma@5.22.0)(typescript@5.8.3))(cache-manager@5.7.6)(ioredis@5.6.1)(reflect-metadata@0.1.14) + '@credebl/logger': + specifier: file:../../credebl-logger-2.0.0.tgz + version: file:credebl-logger-2.0.0.tgz(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(@prisma/client@6.10.1(prisma@5.22.0)(typescript@5.8.3))(axios@1.11.0)(cache-manager@5.7.6)(class-transformer@0.5.1)(class-validator@0.14.2)(ioredis@5.6.1)(nats@2.29.3)(reflect-metadata@0.1.14) + '@credebl/prisma-service': + specifier: file:../../credebl-prisma-service-2.0.0.tgz + version: file:credebl-prisma-service-2.0.0.tgz(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(@prisma/client@6.10.1(prisma@5.22.0)(typescript@5.8.3))(cache-manager@5.7.6)(class-transformer@0.5.1)(class-validator@0.14.2)(ioredis@5.6.1)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@credebl/user-management': + specifier: file:../../credebl-user-management-2.0.0.tgz + version: file:credebl-user-management-2.0.0.tgz(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(@prisma/client@6.10.1(prisma@5.22.0)(typescript@5.8.3))(axios@1.11.0)(cache-manager@5.7.6)(class-transformer@0.5.1)(class-validator@0.14.2)(ioredis@5.6.1)(nats@2.29.3)(reflect-metadata@0.1.14) + '@nestjs/cache-manager': + specifier: ^2.3.0 + version: 2.3.0(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(cache-manager@5.7.6)(rxjs@7.8.2) + '@nestjs/common': + specifier: ^10.4.20 + version: 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/core': + specifier: ^10.4.20 + version: 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.20)(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/microservices': + specifier: ^10.4.20 + version: 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(@nestjs/websockets@10.4.20)(cache-manager@5.7.6)(ioredis@5.6.1)(nats@2.29.3)(reflect-metadata@0.1.14)(rxjs@7.8.2) + cache-manager: + specifier: ^5.7.6 + version: 5.7.6 + nats: + specifier: ^2.29.3 + version: 2.29.3 + rxjs: + specifier: ^7.8.2 + version: 7.8.2 libs/aws: dependencies: '@nestjs/common': - specifier: ^10.2.7 - version: 10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + specifier: ^10.4.20 + version: 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) '@nestjs/microservices': - specifier: ^10.1.3 - version: 10.1.3(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/core@10.1.3)(@nestjs/websockets@10.1.3)(cache-manager@5.4.0)(ioredis@5.3.2)(nats@2.15.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) + specifier: ^10.4.20 + version: 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(@nestjs/websockets@10.4.20)(cache-manager@5.7.6)(ioredis@5.6.1)(nats@2.29.3)(reflect-metadata@0.1.14)(rxjs@7.8.2) '@nestjs/testing': - specifier: ^10.1.3 - version: 10.1.3(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/core@10.1.3)(@nestjs/microservices@10.1.3)(@nestjs/platform-express@10.1.3) + specifier: ^10.4.20 + version: 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(@nestjs/microservices@10.4.20)(@nestjs/platform-express@10.4.20) aws-sdk: - specifier: ^2.1510.0 - version: 2.1560.0 + specifier: ^2.1692.0 + version: 2.1692.0 devDependencies: reflect-metadata: - specifier: ^0.1.13 - version: 0.1.13 + specifier: ^0.1.14 + version: 0.1.14 rimraf: - specifier: ^4.4.0 + specifier: ^4.4.1 version: 4.4.1 typescript: - specifier: ^5.1.6 - version: 5.1.6 + specifier: ^5.8.3 + version: 5.8.3 libs/common: dependencies: + '@credebl/prisma-service': + specifier: file:../../credebl-prisma-service-2.0.0.tgz + version: file:credebl-prisma-service-2.0.0.tgz(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(@prisma/client@6.10.1(prisma@5.22.0)(typescript@5.8.3))(cache-manager@5.7.6)(class-transformer@0.5.1)(class-validator@0.14.2)(ioredis@5.6.1)(reflect-metadata@0.1.14)(rxjs@7.8.2) '@nestjs/axios': - specifier: ^3.0.0 - version: 3.0.0(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(axios@1.4.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + specifier: ^3.1.3 + version: 3.1.3(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(axios@1.11.0)(rxjs@7.8.2) '@nestjs/common': - specifier: ^10.2.7 - version: 10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + specifier: ^10.4.20 + version: 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) '@nestjs/core': - specifier: ^10.1.3 - version: 10.1.3(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/microservices@10.1.3)(@nestjs/platform-express@10.1.3)(@nestjs/websockets@10.1.3)(reflect-metadata@0.1.13)(rxjs@7.8.1) + specifier: ^10.4.20 + version: 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.20)(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(reflect-metadata@0.1.14)(rxjs@7.8.2) '@nestjs/microservices': - specifier: ^10.1.3 - version: 10.1.3(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/core@10.1.3)(@nestjs/websockets@10.1.3)(cache-manager@5.4.0)(ioredis@5.3.2)(nats@2.15.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) + specifier: ^10.4.20 + version: 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(@nestjs/websockets@10.4.20)(cache-manager@5.7.6)(ioredis@5.6.1)(nats@2.29.3)(reflect-metadata@0.1.14)(rxjs@7.8.2) '@nestjs/swagger': - specifier: ^7.1.6 - version: 7.1.6(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/core@10.1.3)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13) + specifier: ^7.4.2 + version: 7.4.2(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14) '@nestjs/testing': - specifier: ^10.1.3 - version: 10.1.3(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/core@10.1.3)(@nestjs/microservices@10.1.3)(@nestjs/platform-express@10.1.3) - '@prisma/client': - specifier: ^5.1.1 - version: 5.1.1(prisma@5.1.1) + specifier: ^10.4.20 + version: 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(@nestjs/microservices@10.4.20)(@nestjs/platform-express@10.4.20) '@sendgrid/mail': specifier: ^7.7.0 version: 7.7.0 + axios: + specifier: ^1.11.0 + version: 1.11.0 class-transformer: specifier: ^0.5.1 version: 0.5.1 class-validator: - specifier: ^0.14.0 - version: 0.14.0 + specifier: ^0.14.2 + version: 0.14.2 crypto-js: - specifier: ^4.1.1 - version: 4.1.1 + specifier: ^4.2.0 + version: 4.2.0 dotenv: - specifier: ^16.0.3 - version: 16.1.4 + specifier: ^16.6.1 + version: 16.6.1 nats: - specifier: ^2.15.1 - version: 2.15.1 + specifier: ^2.29.3 + version: 2.29.3 + nestjs-cls: + specifier: ^4.5.0 + version: 4.5.0(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(reflect-metadata@0.1.14)(rxjs@7.8.2) rxjs: - specifier: ^7.8.1 - version: 7.8.1 + specifier: ^7.8.2 + version: 7.8.2 uuid: - specifier: ^9.0.0 - version: 9.0.0 + specifier: ^9.0.1 + version: 9.0.1 devDependencies: '@types/crypto-js': - specifier: ^4.1.1 - version: 4.1.1 + specifier: ^4.2.2 + version: 4.2.2 reflect-metadata: - specifier: ^0.1.13 - version: 0.1.13 + specifier: ^0.1.14 + version: 0.1.14 rimraf: - specifier: ^4.4.0 + specifier: ^4.4.1 version: 4.4.1 typescript: - specifier: ^5.1.6 - version: 5.1.6 + specifier: ^5.8.3 + version: 5.8.3 -packages: + libs/logger: + dependencies: + '@credebl/common': + specifier: file:../../credebl-common-2.0.0.tgz + version: file:credebl-common-2.0.0.tgz(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(@prisma/client@6.10.1(prisma@5.22.0)(typescript@5.8.3))(cache-manager@5.7.6)(ioredis@5.6.1)(reflect-metadata@0.1.14) + '@elastic/ecs-winston-format': + specifier: ^1.5.3 + version: 1.5.3 + '@nestjs/axios': + specifier: ^3.1.3 + version: 3.1.3(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(axios@1.11.0)(rxjs@7.8.2) + '@nestjs/common': + specifier: ^10.4.20 + version: 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/config': + specifier: ^3.3.0 + version: 3.3.0(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(rxjs@7.8.2) + '@nestjs/core': + specifier: ^10.4.20 + version: 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.20)(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/microservices': + specifier: ^10.4.20 + version: 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(@nestjs/websockets@10.4.20)(cache-manager@5.7.6)(ioredis@5.6.1)(nats@2.29.3)(reflect-metadata@0.1.14)(rxjs@7.8.2) + morgan: + specifier: ^1.10.1 + version: 1.10.1 + rxjs: + specifier: ^7.8.2 + version: 7.8.2 + uuid: + specifier: ^9.0.1 + version: 9.0.1 + winston: + specifier: ~3.4.0 + version: 3.4.0 + winston-daily-rotate-file: + specifier: ^5.0.0 + version: 5.0.0(winston@3.4.0) + winston-elasticsearch: + specifier: 0.16.0 + version: 0.16.0 + devDependencies: + '@types/crypto-js': + specifier: ^4.2.2 + version: 4.2.2 + reflect-metadata: + specifier: ^0.1.14 + version: 0.1.14 + rimraf: + specifier: ^4.4.1 + version: 4.4.1 + typescript: + specifier: ^5.8.3 + version: 5.8.3 - '@aashutoshrathi/word-wrap@1.2.6': - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} + libs/prisma-service: + dependencies: + '@credebl/common': + specifier: file:../../credebl-common-2.0.0.tgz + version: file:credebl-common-2.0.0.tgz(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(@prisma/client@5.22.0(prisma@5.22.0))(cache-manager@5.7.6)(ioredis@5.6.1)(reflect-metadata@0.1.14) + '@nestjs/common': + specifier: ^10.4.20 + version: 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@prisma/client': + specifier: ^5.22.0 + version: 5.22.0(prisma@5.22.0) + '@supabase/supabase-js': + specifier: ^2.53.0 + version: 2.53.0 + crypto-js: + specifier: ^4.2.0 + version: 4.2.0 + readline: + specifier: ^1.3.0 + version: 1.3.0 + devDependencies: + '@types/crypto-js': + specifier: ^4.2.2 + version: 4.2.2 + '@types/node': + specifier: ^20.19.9 + version: 20.19.9 + prisma: + specifier: ^5.22.0 + version: 5.22.0 - '@ampproject/remapping@2.2.1': - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} - engines: {node: '>=6.0.0'} + libs/user-management: + dependencies: + '@credebl/common': + specifier: file:../../credebl-common-2.0.0.tgz + version: file:credebl-common-2.0.0.tgz(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(@prisma/client@6.10.1(prisma@5.22.0)(typescript@5.8.3))(cache-manager@5.7.6)(ioredis@5.6.1)(reflect-metadata@0.1.14) + '@credebl/prisma-service': + specifier: file:../../credebl-prisma-service-2.0.0.tgz + version: file:credebl-prisma-service-2.0.0.tgz(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(@prisma/client@6.10.1(prisma@5.22.0)(typescript@5.8.3))(cache-manager@5.7.6)(class-transformer@0.5.1)(class-validator@0.14.2)(ioredis@5.6.1)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/axios': + specifier: ^3.1.3 + version: 3.1.3(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(axios@1.11.0)(rxjs@7.8.2) + '@nestjs/common': + specifier: ^10.4.20 + version: 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/config': + specifier: ^3.3.0 + version: 3.3.0(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(rxjs@7.8.2) + '@nestjs/core': + specifier: ^10.4.20 + version: 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.20)(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/jwt': + specifier: ^10.2.0 + version: 10.2.0(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2)) + '@nestjs/microservices': + specifier: ^10.4.20 + version: 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(@nestjs/websockets@10.4.20)(cache-manager@5.7.6)(ioredis@5.6.1)(nats@2.29.3)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/swagger': + specifier: ^7.4.2 + version: 7.4.2(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14) + '@supabase/supabase-js': + specifier: ^2.53.0 + version: 2.53.0 + morgan: + specifier: ^1.10.1 + version: 1.10.1 + rxjs: + specifier: ^7.8.2 + version: 7.8.2 + uuid: + specifier: ^9.0.1 + version: 9.0.1 + devDependencies: + '@types/crypto-js': + specifier: ^4.2.2 + version: 4.2.2 + reflect-metadata: + specifier: ^0.1.14 + version: 0.1.14 + rimraf: + specifier: ^4.4.1 + version: 4.4.1 + typescript: + specifier: ^5.8.3 + version: 5.8.3 - '@angular-devkit/core@16.1.0': - resolution: {integrity: sha512-mrWpuDvttmhrCGcLc68RIXKtTzUhkBTsE5ZZFZNO1+FSC+vO/ZpyCpPd6C+6coM68NfXYjHlms5XF6KbxeGn/Q==} - engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - peerDependencies: - chokidar: ^3.5.2 - peerDependenciesMeta: - chokidar: - optional: true +packages: + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} - '@angular-devkit/core@16.1.4': - resolution: {integrity: sha512-WCAzNi9LxpFIi2WVPaJQd2kHPqCnCexWzUZN05ltJuBGCQL1O+LgRHGwnQ4WZoqmrF5tcWt2a3GFtJ3DgMc1hw==} - engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@angular-devkit/core@17.3.11': + resolution: {integrity: sha512-vTNDYNsLIWpYk2I969LMQFH29GTsLzxNk/0cLw5q56ARF0v5sIWfHYwGTS88jdDqIpuuettcSczbxeA7EuAmqQ==} + 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 peerDependenciesMeta: chokidar: optional: true - '@angular-devkit/schematics-cli@16.1.4': - resolution: {integrity: sha512-/m05+9jCV6jYcQZhDoQXo8neusE1HGU5oM+Jw2xtl3oube8vzbymhwq1SoDeMlnhMnhnxg4rMsghEgRROAq4bA==} - engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@angular-devkit/schematics-cli@17.3.11': + resolution: {integrity: sha512-kcOMqp+PHAKkqRad7Zd7PbpqJ0LqLaNZdY1+k66lLWmkEBozgq8v4ASn/puPWf9Bo0HpCiK+EzLf0VHE8Z/y6Q==} + engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} hasBin: true - '@angular-devkit/schematics@16.1.0': - resolution: {integrity: sha512-LM35PH9DT3eQRSZgrkk2bx1ZQjjVh8BCByTlr37/c+FnF9mNbeBsa1YkxrlsN/CwO+045OwEwRHnkM9Zcx0U/A==} - engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - - '@angular-devkit/schematics@16.1.4': - resolution: {integrity: sha512-yjRgwHAfFaeuimgbQtjwSUyXzEHpMSdTRb2zg+TOp6skoGvHOG8xXFJ7DjBkSMeAQdFF0fkxhPS9YmlxqNc+7A==} - engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - - '@babel/code-frame@7.22.5': - resolution: {integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.22.9': - resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} - engines: {node: '>=6.9.0'} + '@angular-devkit/schematics@17.3.11': + resolution: {integrity: sha512-I5wviiIqiFwar9Pdk30Lujk8FczEEc18i22A5c6Z9lbmhPQdTroDnEQdsfXjy404wPe8H62s0I15o4pmMGfTYQ==} + engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - '@babel/core@7.22.9': - resolution: {integrity: sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==} + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/generator@7.22.9': - resolution: {integrity: sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==} + '@babel/compat-data@7.28.0': + resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.22.9': - resolution: {integrity: sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==} + '@babel/core@7.28.0': + resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-environment-visitor@7.22.5': - resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} + '@babel/generator@7.28.0': + resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} engines: {node: '>=6.9.0'} - '@babel/helper-function-name@7.22.5': - resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} - '@babel/helper-hoist-variables@7.22.5': - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.22.5': - resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.22.9': - resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} + '@babel/helper-module-transforms@7.27.3': + resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-plugin-utils@7.22.5': - resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} - '@babel/helper-simple-access@7.22.5': - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-split-export-declaration@7.22.6': - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.22.5': - resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.22.5': - resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} + '@babel/helpers@7.28.2': + resolution: {integrity: sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.22.5': - resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.22.6': - resolution: {integrity: sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==} - engines: {node: '>=6.9.0'} - - '@babel/highlight@7.22.5': - resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.22.7': - resolution: {integrity: sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==} + '@babel/parser@7.28.0': + resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} engines: {node: '>=6.0.0'} hasBin: true @@ -578,6 +797,18 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-class-static-block@7.14.5': + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.27.1': + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-import-meta@7.10.4': resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: @@ -588,8 +819,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-jsx@7.22.5': - resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -624,32 +855,34 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-top-level-await@7.14.5': - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + '@babel/plugin-syntax-private-property-in-object@7.14.5': + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.22.5': - resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.22.6': - resolution: {integrity: sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==} + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/template@7.22.5': - resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.22.8': - resolution: {integrity: sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==} + '@babel/traverse@7.28.0': + resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} engines: {node: '>=6.9.0'} - '@babel/types@7.22.5': - resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==} + '@babel/types@7.28.2': + resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@0.2.3': @@ -663,6 +896,28 @@ packages: resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} engines: {node: '>=0.1.90'} + '@credebl/aws@file:credebl-aws-2.0.0.tgz': + resolution: {integrity: sha512-PCMJANqCSy2Ody7NK02ZrRWtBO4pRzEzS43WuLxmzIgonrAwwtYqpwqKbM9F196UElOBRRDj5a0EmN3K1S2YOg==, tarball: file:credebl-aws-2.0.0.tgz} + version: 2.0.0 + + '@credebl/common@file:credebl-common-2.0.0.tgz': + resolution: {integrity: sha512-yD/Wlz0Vg03iW6mzSVoSl2VP7ZFeV1L4hep8WgczVJQnIwNoRRCL3dKzI6nX7g6+5KOj9zsQspQ4SK3TfNCn5A==, tarball: file:credebl-common-2.0.0.tgz} + version: 2.0.0 + + '@credebl/logger@file:credebl-logger-2.0.0.tgz': + resolution: {integrity: sha512-5cy0EEEpK/zFLRkVFN9zCeqV3alJROtZP9yY/bmL+/mdcMSzwSSAynK0ts/66fneUUsULVmYGcN/L4Mf5S+oQw==, tarball: file:credebl-logger-2.0.0.tgz} + version: 2.0.0 + + '@credebl/prisma-service@file:credebl-prisma-service-2.0.0.tgz': + resolution: {integrity: sha512-iCG8P6trUh4AsL/GfLizCrluRzr4M14e1KnmImaC5mRcXo+XeHJWdlkUvUPl1KD/PME1ZzKAoV+d+o4BsnvBnA==, tarball: file:credebl-prisma-service-2.0.0.tgz} + version: 2.0.0 + peerDependencies: + '@prisma/client': ^5.22.0 + + '@credebl/user-management@file:credebl-user-management-2.0.0.tgz': + resolution: {integrity: sha512-1epTx5Npt47bAS7AMLhJkMqvO630236CSgHt6lxIyJpb8I8nFDxImBfwsVAnhIT1te/YZ0fdd+hQ9rUy59D1VQ==, tarball: file:credebl-user-management-2.0.0.tgz} + version: 2.0.0 + '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} @@ -686,39 +941,41 @@ packages: resolution: {integrity: sha512-6uQ1pVXutwz1Krwooo67W+3K8BwH1ASMh1WoHTpomUzw8EXecXN5lHIJ9EPqTHuv1WqR2LKkSJyagcq0HYUJpg==} engines: {node: '>=12'} - '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.6.2': - resolution: {integrity: sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==} + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/eslintrc@2.1.1': - resolution: {integrity: sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA==} + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@eslint/js@8.46.0': - resolution: {integrity: sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA==} + '@eslint/js@8.57.1': + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@humanwhocodes/config-array@0.11.10': - resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@1.2.1': - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} - deprecated: Use @eslint/object-schema instead + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - '@ioredis/commands@1.2.0': - resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} + '@ioredis/commands@1.3.0': + resolution: {integrity: sha512-M/T6Zewn7sDaBQEqIZ8Rb+i9y8qfGmq+5SDFSf9sA2lUZTmdDLVdOiQaeDp+Q4wElZ9HG1GAX5KhDaidp6LQsQ==} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} '@istanbuljs/load-nyc-config@1.1.0': resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} @@ -728,12 +985,12 @@ packages: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} - '@jest/console@29.6.2': - resolution: {integrity: sha512-0N0yZof5hi44HAR2pPS+ikJ3nzKNoZdVu8FffRf3wy47I7Dm7etk/3KetMdRUqzVd16V4O2m2ISpNTbnIuqy1w==} + '@jest/console@29.7.0': + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/core@29.6.2': - resolution: {integrity: sha512-Oj+5B+sDMiMWLhPFF+4/DvHOf+U10rgvCLGPHP8Xlsy/7QxS51aU/eBngudHlJXnaWD5EohAgJ4js+T6pa+zOg==} + '@jest/core@29.7.0': + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -741,28 +998,28 @@ packages: node-notifier: optional: true - '@jest/environment@29.6.2': - resolution: {integrity: sha512-AEcW43C7huGd/vogTddNNTDRpO6vQ2zaQNrttvWV18ArBx9Z56h7BIsXkNFJVOO4/kblWEQz30ckw0+L3izc+Q==} + '@jest/environment@29.7.0': + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/expect-utils@29.6.2': - resolution: {integrity: sha512-6zIhM8go3RV2IG4aIZaZbxwpOzz3ZiM23oxAlkquOIole+G6TrbeXnykxWYlqF7kz2HlBjdKtca20x9atkEQYg==} + '@jest/expect-utils@29.7.0': + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/expect@29.6.2': - resolution: {integrity: sha512-m6DrEJxVKjkELTVAztTLyS/7C92Y2b0VYqmDROYKLLALHn8T/04yPs70NADUYPrV3ruI+H3J0iUIuhkjp7vkfg==} + '@jest/expect@29.7.0': + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/fake-timers@29.6.2': - resolution: {integrity: sha512-euZDmIlWjm1Z0lJ1D0f7a0/y5Kh/koLFMUBE5SUYWrmy8oNhJpbTBDAP6CxKnadcMLDoDf4waRYCe35cH6G6PA==} + '@jest/fake-timers@29.7.0': + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/globals@29.6.2': - resolution: {integrity: sha512-cjuJmNDjs6aMijCmSa1g2TNG4Lby/AeU7/02VtpW+SLcZXzOLK2GpN2nLqcFjmhy3B3AoPeQVx7BnyOf681bAw==} + '@jest/globals@29.7.0': + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/reporters@29.6.2': - resolution: {integrity: sha512-sWtijrvIav8LgfJZlrGCdN0nP2EWbakglJY49J1Y5QihcQLfy7ovyxxjJBRXMNltgt4uPtEcFmIMbVshEDfFWw==} + '@jest/reporters@29.7.0': + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -770,61 +1027,53 @@ packages: node-notifier: optional: true - '@jest/schemas@29.6.0': - resolution: {integrity: sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==} + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/source-map@29.6.0': - resolution: {integrity: sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==} + '@jest/source-map@29.6.3': + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/test-result@29.6.2': - resolution: {integrity: sha512-3VKFXzcV42EYhMCsJQURptSqnyjqCGbtLuX5Xxb6Pm6gUf1wIRIl+mandIRGJyWKgNKYF9cnstti6Ls5ekduqw==} + '@jest/test-result@29.7.0': + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/test-sequencer@29.6.2': - resolution: {integrity: sha512-GVYi6PfPwVejO7slw6IDO0qKVum5jtrJ3KoLGbgBWyr2qr4GaxFV6su+ZAjdTX75Sr1DkMFRk09r2ZVa+wtCGw==} + '@jest/test-sequencer@29.7.0': + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/transform@29.6.2': - resolution: {integrity: sha512-ZqCqEISr58Ce3U+buNFJYUktLJZOggfyvR+bZMaiV1e8B1SIvJbwZMrYz3gx/KAPn9EXmOmN+uB08yLCjWkQQg==} + '@jest/transform@29.7.0': + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/types@29.6.1': - resolution: {integrity: sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==} + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jridgewell/gen-mapping@0.3.3': - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} - - '@jridgewell/resolve-uri@3.1.0': - resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} - engines: {node: '>=6.0.0'} - - '@jridgewell/resolve-uri@3.1.1': - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.12': + resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} - '@jridgewell/set-array@1.1.2': - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/source-map@0.3.5': - resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} - - '@jridgewell/sourcemap-codec@1.4.14': - resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + '@jridgewell/source-map@0.3.10': + resolution: {integrity: sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==} - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.5.4': + resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} - '@jridgewell/trace-mapping@0.3.18': - resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} + '@jridgewell/trace-mapping@0.3.29': + resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@ljharb/through@2.3.14': + resolution: {integrity: sha512-ajBvlKpWucBB17FuQYUShqpqy8GRgYEpJW0vWJbUu1CV9lWyrDCapy0lScU8T8Z6qn49sSwJB3+M+evYIdGg+A==} + engines: {node: '>= 0.4'} + '@lukeed/csprng@1.1.0': resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} engines: {node: '>=8'} @@ -833,71 +1082,73 @@ packages: resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} hasBin: true - '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.2': - resolution: {integrity: sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ==} + '@microsoft/tsdoc@0.15.1': + resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} + + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': + resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==} cpu: [arm64] os: [darwin] - '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.2': - resolution: {integrity: sha512-lwriRAHm1Yg4iDf23Oxm9n/t5Zpw1lVnxYU3HnJPTi2lJRkKTrps1KVgvL6m7WvmhYVt/FIsssWay+k45QHeuw==} + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': + resolution: {integrity: sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==} cpu: [x64] os: [darwin] - '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.2': - resolution: {integrity: sha512-FU20Bo66/f7He9Fp9sP2zaJ1Q8L9uLPZQDub/WlUip78JlPeMbVL8546HbZfcW9LNciEXc8d+tThSJjSC+tmsg==} + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': + resolution: {integrity: sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==} cpu: [arm64] os: [linux] - '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.2': - resolution: {integrity: sha512-MOI9Dlfrpi2Cuc7i5dXdxPbFIgbDBGgKR5F2yWEa6FVEtSWncfVNKW5AKjImAQ6CZlBK9tympdsZJ2xThBiWWA==} + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': + resolution: {integrity: sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==} cpu: [arm] os: [linux] - '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.2': - resolution: {integrity: sha512-gsWNDCklNy7Ajk0vBBf9jEx04RUxuDQfBse918Ww+Qb9HCPoGzS+XJTLe96iN3BVK7grnLiYghP/M4L8VsaHeA==} + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': + resolution: {integrity: sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==} cpu: [x64] os: [linux] - '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.2': - resolution: {integrity: sha512-O+6Gs8UeDbyFpbSh2CPEz/UOrrdWPTBYNblZK5CxxLisYt4kGX3Sc+czffFonyjiGSq3jWLwJS/CCJc7tBr4sQ==} + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': + resolution: {integrity: sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==} cpu: [x64] os: [win32] - '@nestjs/axios@3.0.0': - resolution: {integrity: sha512-ULdH03jDWkS5dy9X69XbUVbhC+0pVnrRcj7bIK/ytTZ76w7CgvTZDJqsIyisg3kNOiljRW/4NIjSf3j6YGvl+g==} + '@nestjs/axios@3.1.3': + resolution: {integrity: sha512-RZ/63c1tMxGLqyG3iOCVt7A72oy4x1eM6QEhd4KzCYpaVWW0igq0WSREeRoEZhIxRcZfDfIIkvsOMiM7yfVGZQ==} peerDependencies: '@nestjs/common': ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 axios: ^1.3.1 - reflect-metadata: ^0.1.12 rxjs: ^6.0.0 || ^7.0.0 - '@nestjs/bull-shared@10.0.1': - resolution: {integrity: sha512-8Td36l2i5x9+iQWjPB5Bd5+6u5Eangb5DclNcwrdwKqvd28xE92MSW97P4JV52C2kxrTjZwx8ck/wObAwtpQPw==} + '@nestjs/bull-shared@10.2.3': + resolution: {integrity: sha512-XcgAjNOgq6b5DVCytxhR5BKiwWo7hsusVeyE7sfFnlXRHeEtIuC2hYWBr/ZAtvL/RH0/O0tqtq0rVl972nbhJw==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 '@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0 - '@nestjs/bull@10.0.1': - resolution: {integrity: sha512-1GcJ8BkHDgQdBMZ7SqAqgUHiFnISXmpGvewFeTc8wf87JLk2PweiKv9j9/KQKU+NI237pCe82XB0bXzTnsdxSw==} + '@nestjs/bull@10.2.3': + resolution: {integrity: sha512-Gy90JjFCfYhWFBeoBSidc7rEEf2BNhkJ3RfK8ym589POOldwAra2xcnFBi0ZuhhOV60GcrCJBBkdrUbAMM670w==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 '@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0 bull: ^3.3 || ^4.0.0 - '@nestjs/cache-manager@2.2.1': - resolution: {integrity: sha512-mXj0zenuyMPJICokwVud4Kjh0+pzBNBAgfpx3I48LozNkd8Qfv/MAhZsb15GihGpbFRxafUo3p6XvtAqRm8GRw==} + '@nestjs/cache-manager@2.3.0': + resolution: {integrity: sha512-pxeBp9w/s99HaW2+pezM1P3fLiWmUEnTUoUMLa9UYViCtjj0E0A19W/vaT5JFACCzFIeNrwH4/16jkpAhQ25Vw==} peerDependencies: '@nestjs/common': ^9.0.0 || ^10.0.0 '@nestjs/core': ^9.0.0 || ^10.0.0 cache-manager: <=5 rxjs: ^7.0.0 - '@nestjs/cli@10.1.11': - resolution: {integrity: sha512-ORkpVFQvcPYtvkLfa0I9dMSPIppkqTOyLqPvJV0wiZofp8iR1+VEVzJVi+PMj53gOkly8TV9+6iy/dBA5Ssrog==} - engines: {node: '>= 16'} + '@nestjs/cli@10.4.9': + resolution: {integrity: sha512-s8qYd97bggqeK7Op3iD49X2MpFtW4LVNLAwXFkfbRxKME6IYT7X0muNTJ2+QfI8hpbNx9isWkrLWIp+g5FOhiA==} + engines: {node: '>= 16.14'} hasBin: true peerDependencies: - '@swc/cli': ^0.1.62 + '@swc/cli': ^0.1.62 || ^0.3.0 || ^0.4.0 || ^0.5.0 '@swc/core': ^1.3.62 peerDependenciesMeta: '@swc/cli': @@ -905,12 +1156,12 @@ packages: '@swc/core': optional: true - '@nestjs/common@10.2.8': - resolution: {integrity: sha512-rmpwcdvq2IWMmsUVP8rsdKub6uDWk7dwCYo0aif50JTwcvcxzaP3iKVFKoSgvp0RKYu8h15+/AEOfaInmPpl0Q==} + '@nestjs/common@10.4.20': + resolution: {integrity: sha512-hxJxZF7jcKGuUzM9EYbuES80Z/36piJbiqmPy86mk8qOn5gglFebBTvcx7PWVbRNSb4gngASYnefBj/Y2HAzpQ==} 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: @@ -918,20 +1169,20 @@ packages: class-validator: optional: true - '@nestjs/config@3.0.0': - resolution: {integrity: sha512-fzASk1Uv6AjdE6uA1na8zpqRCXAhRpcfgpCVv3SAKlgJ3VR3bEjcI4G17WHLgLBsmPzI1ofdkSI451WLD1F1Rw==} + '@nestjs/config@3.3.0': + resolution: {integrity: sha512-pdGTp8m9d0ZCrjTpjkUbZx6gyf2IKf+7zlkrPNMsJzYZ4bFRRTpXrnj+556/5uiI6AfL5mMrJc2u7dB6bvM+VA==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 - reflect-metadata: ^0.1.13 + rxjs: ^7.1.0 - '@nestjs/core@10.1.3': - resolution: {integrity: sha512-VzK54TuacC3Vmq3b5xTyMVTlDNJeKbjpKfV9fNqm4TbIBm8ZPo3FC0osJAbAK4XwbVvv2Flq1yA3CutasupVjw==} + '@nestjs/core@10.4.20': + resolution: {integrity: sha512-kRdtyKA3+Tu70N3RQ4JgmO1E3LzAMs/eppj7SfjabC7TgqNWoS4RLhWl4BqmsNVmjj6D5jgfPVtHtgYkU3AfpQ==} 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': @@ -941,26 +1192,26 @@ packages: '@nestjs/websockets': optional: true - '@nestjs/jwt@10.1.0': - resolution: {integrity: sha512-iLwCGS25ybUxGS7i5j/Mwuyzvp/WxJftHlm8aLEBv5GV92apz6L1QVjxLdZrqXbzo++C8gdJauhzil8qitY+6w==} + '@nestjs/jwt@10.2.0': + resolution: {integrity: sha512-x8cG90SURkEiLOehNaN2aRlotxT0KZESUliOPKKnjWiyJOcWurkF3w345WOX0P4MgFzUjGoZ1Sy0aZnxeihT0g==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 - '@nestjs/mapped-types@2.0.2': - resolution: {integrity: sha512-V0izw6tWs6fTp9+KiiPUbGHWALy563Frn8X6Bm87ANLRuE46iuBMD5acKBDP5lKL/75QFvrzSJT7HkCbB0jTpg==} + '@nestjs/mapped-types@2.0.5': + 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 - '@nestjs/microservices@10.1.3': - resolution: {integrity: sha512-IBKefw+DR6v2SaXjPJ8tRT+gQTJUSGN83gxuaA32uCQNW2rK+CyVapgX3fDeM/zJsLfBkdveSMX+R74w5wuk+Q==} + '@nestjs/microservices@10.4.20': + resolution: {integrity: sha512-zu/o84Z0uTUClNnGIGfIjcrO3z6T60h/pZPSJK50o4mehbEvJ76fijj6R/WTW0VP+1N16qOv/NsiYLKJA5Cc3w==} peerDependencies: '@grpc/grpc-js': '*' '@nestjs/common': ^10.0.0 @@ -973,7 +1224,7 @@ packages: kafkajs: '*' mqtt: '*' nats: '*' - reflect-metadata: ^0.1.12 + reflect-metadata: ^0.1.12 || ^0.2.0 rxjs: ^7.1.0 peerDependenciesMeta: '@grpc/grpc-js': @@ -995,46 +1246,46 @@ packages: nats: optional: true - '@nestjs/passport@10.0.0': - resolution: {integrity: sha512-IlKKc6M7JOe+4dBbW6gZsXBSD05ZYgwfGf3GJhgCmUGYVqffpDdALQSS6JftnExrE+12rACoEmHkzYwKAGVK0Q==} + '@nestjs/passport@10.0.3': + resolution: {integrity: sha512-znJ9Y4S8ZDVY+j4doWAJ8EuuVO7SkQN3yOBmzxbGaXbvcSwFDAdGJ+OMCg52NdzIO4tQoN4pYKx8W6M0ArfFRQ==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 - passport: ^0.4.0 || ^0.5.0 || ^0.6.0 + passport: ^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0 - '@nestjs/platform-express@10.1.3': - resolution: {integrity: sha512-RSf7ooCrxiWJlWl3CLfpaYmAf3U0tRsN7pJakujWdvzVJU2EzVZTLcy1MtnSg/HBm9/Rvg98VI5QI6oOhOpt+A==} + '@nestjs/platform-express@10.4.20': + resolution: {integrity: sha512-rh97mX3rimyf4xLMLHuTOBKe6UD8LOJ14VlJ1F/PTd6C6ZK9Ak6EHuJvdaGcSFQhd3ZMBh3I6CuujKGW9pNdIg==} peerDependencies: '@nestjs/common': ^10.0.0 '@nestjs/core': ^10.0.0 - '@nestjs/platform-socket.io@10.1.3': - resolution: {integrity: sha512-37hykjHdbEomwFd2/zbMlhpgNMxtALvikEbdqS9zgEuGK/zdQkfjYzJGWGOzEeobVTeKJdlGAsbIAkgK3yNajw==} + '@nestjs/platform-socket.io@10.4.20': + resolution: {integrity: sha512-8wqJ7kJnvRC6T1o1U3NNnuzjaMJU43R4hvzKKba7GSdMN6j2Jfzz/vq5gHDx9xbXOAmfsc9bvaIiZegXxvHoJA==} peerDependencies: '@nestjs/common': ^10.0.0 '@nestjs/websockets': ^10.0.0 rxjs: ^7.1.0 - '@nestjs/schedule@3.0.1': - resolution: {integrity: sha512-4CAFu4rE/QPYnz/icRg3GiuLmY1bXopG8bWTJ9d7bXzaHBaPKIjGvZ20wsK8P+MncrVCkmK0iYhQrNj0cwX9+A==} + '@nestjs/schedule@3.0.4': + resolution: {integrity: sha512-uFJpuZsXfpvgx2y7/KrIZW9e1L68TLiwRodZ6+Gc8xqQiHSUzAVn+9F4YMxWFlHITZvvkjWziUFgRNCitDcTZQ==} 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.12 - '@nestjs/schematics@10.0.1': - resolution: {integrity: sha512-buxpYtSwOmWyf0nUJWJCkCkYITwbOfIEKHTnGS7sDbcfaajrOFXb5pPAGD2E1CUb3C1+NkQIURPKzs0IouZTQg==} + '@nestjs/schematics@10.2.3': + resolution: {integrity: sha512-4e8gxaCk7DhBxVUly2PjYL4xC2ifDFexCqq1/u4TtivLGXotVk0wHdYuPYe1tHTHuR1lsOkRbfOCpkdTnigLVg==} peerDependencies: typescript: '>=4.8.2' - '@nestjs/swagger@7.1.6': - resolution: {integrity: sha512-YK5MSIuI2s76tg5W+fZSEVAmnlRe3ZVbb7/AYKi1Cs7exuzNjMgWIsnYxY2VCXhWaiT/ykeTFS9wcBdI54LeFA==} + '@nestjs/swagger@7.4.2': + resolution: {integrity: sha512-Mu6TEn1M/owIvAx2B4DUQObQXqo2028R2s9rSZ/hJEgBK95+doTwS0DjmVA2wTeZTyVtXOoN7CsoM5pONBzvKQ==} peerDependencies: - '@fastify/static': ^6.0.0 + '@fastify/static': ^6.0.0 || ^7.0.0 '@nestjs/common': ^9.0.0 || ^10.0.0 '@nestjs/core': ^9.0.0 || ^10.0.0 class-transformer: '*' class-validator: '*' - reflect-metadata: ^0.1.12 + reflect-metadata: ^0.1.12 || ^0.2.0 peerDependenciesMeta: '@fastify/static': optional: true @@ -1043,8 +1294,8 @@ packages: class-validator: optional: true - '@nestjs/testing@10.1.3': - resolution: {integrity: sha512-zMrO9xLPYnKtC6q1diWubuMshIp0v2aGHa58jcIfZaAlJlU/6RKsgCOiFQ42aFzxUEBRWF0LBF0aiwt04LKMyQ==} + '@nestjs/testing@10.4.20': + resolution: {integrity: sha512-nMkRDukDKskdPruM6EsgMq7yJua+CPZM6I6FrLP8yXw8BiVSPv9Nm0CtcGGwt3kgZF9hfxKjGqLjsvVBsv6Vfw==} peerDependencies: '@nestjs/common': ^10.0.0 '@nestjs/core': ^10.0.0 @@ -1056,27 +1307,31 @@ packages: '@nestjs/platform-express': optional: true - '@nestjs/typeorm@10.0.0': - resolution: {integrity: sha512-WQU4HCDTz4UavsFzvGUKDHqi0MO5K47yFoPXdmh+Z/hCNO7SHCMmV9jLiLukM8n5nKUqJ3jDqiljkWBcZPdCtA==} + '@nestjs/typeorm@10.0.2': + 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 - '@nestjs/websockets@10.1.3': - resolution: {integrity: sha512-6QVjtQgmSfC6klRiNMxbrQFTvm88MOBdA6kP91g3vrpX6fi74khnKf+kGMeQYXBlYCtCCQ2cvEipHc0Gzf46Ag==} + '@nestjs/websockets@10.4.20': + resolution: {integrity: sha512-tafsPPvQfAXc+cfxvuRDzS5V+Ixg8uVJq8xSocU24yVl/Xp6ajmhqiGiaVjYOX8mXY0NV836QwEZxHF7WvKHSw==} 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 + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1098,30 +1353,37 @@ packages: resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} engines: {node: '>=8.0.0'} - '@opentelemetry/core@1.27.0': - resolution: {integrity: sha512-yQPKnK5e+76XuiqUH/gKyS8wv/7qITd5ln56QkBTf3uggr0VkXOXfcaAuG330UfdYu83wsyoBwqwxigpIG+Jkg==} + '@opentelemetry/core@1.30.1': + resolution: {integrity: sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/resources@1.27.0': - resolution: {integrity: sha512-jOwt2VJ/lUD5BLc+PMNymDrUCpm5PKi1E9oSVYAvz01U/VdndGmrtV3DU1pG4AwlYhJRHbHfOUIlpBeXCPw6QQ==} + '@opentelemetry/resources@1.30.1': + resolution: {integrity: sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/sdk-metrics@1.27.0': - resolution: {integrity: sha512-JzWgzlutoXCydhHWIbLg+r76m+m3ncqvkCcsswXAQ4gqKS+LOHKhq+t6fx1zNytvLuaOUBur7EvWxECc4jPQKg==} + '@opentelemetry/sdk-metrics@1.30.1': + resolution: {integrity: sha512-q9zcZ0Okl8jRgmy7eNW3Ku1XSgg3sDLa5evHZpCwjspw7E8Is4K/haRPDJrBcX3YSn/Y7gUvFnByNYEKQNbNog==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' - '@opentelemetry/semantic-conventions@1.27.0': - resolution: {integrity: sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==} + '@opentelemetry/semantic-conventions@1.28.0': + resolution: {integrity: sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==} + engines: {node: '>=14'} + + '@paralleldrive/cuid2@2.2.2': + resolution: {integrity: sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@prisma/client@5.1.1': - resolution: {integrity: sha512-fxcCeK5pMQGcgCqCrWsi+I2rpIbk0rAhdrN+ke7f34tIrgPwA68ensrpin+9+fZvuV2OtzHmuipwduSY6HswdA==} + '@prisma/client@5.22.0': + resolution: {integrity: sha512-M0SVXfyHnQREBKxCgyo7sffrKttwE6R8PMq330MIUF0pTwjUhLbW84pFDlf06B27XyCR++VtjugEnIHdr07SVA==} engines: {node: '>=16.13'} peerDependencies: prisma: '*' @@ -1129,22 +1391,49 @@ packages: prisma: optional: true - '@prisma/engines-version@5.1.1-1.6a3747c37ff169c90047725a05a6ef02e32ac97e': - resolution: {integrity: sha512-owZqbY/wucbr65bXJ/ljrHPgQU5xXTSkmcE/JcbqE1kusuAXV/TLN3/exmz21SZ5rJ7WDkyk70J2G/n68iogbQ==} + '@prisma/client@6.10.1': + resolution: {integrity: sha512-Re4pMlcUsQsUTAYMK7EJ4Bw2kg3WfZAAlr8GjORJaK4VOP6LxRQUQ1TuLnxcF42XqGkWQ36q5CQF1yVadANQ6w==} + engines: {node: '>=18.18'} + peerDependencies: + prisma: '*' + typescript: '>=5.1.0' + peerDependenciesMeta: + prisma: + optional: true + typescript: + optional: true + + '@prisma/debug@5.22.0': + resolution: {integrity: sha512-AUt44v3YJeggO2ZU5BkXI7M4hu9BF2zzH2iF2V5pyXT/lRTyWiElZ7It+bRH1EshoMRxHgpYg4VB6rCM+mG5jQ==} + + '@prisma/engines-version@5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2': + resolution: {integrity: sha512-2PTmxFR2yHW/eB3uqWtcgRcgAbG1rwG9ZriSvQw+nnb7c4uCr3RAcGMb6/zfE88SKlC1Nj2ziUvc96Z379mHgQ==} + + '@prisma/engines@5.22.0': + resolution: {integrity: sha512-UNjfslWhAt06kVL3CjkuYpHAWSO6L4kDCVPegV6itt7nD1kSJavd3vhgAEhjglLJJKEdJ7oIqDJ+yHk6qO8gPA==} - '@prisma/engines@5.1.1': - resolution: {integrity: sha512-NV/4nVNWFZSJCCIA3HIFJbbDKO/NARc9ej0tX5S9k2EVbkrFJC4Xt9b0u4rNZWL4V+F5LAjvta8vzEUw0rw+HA==} + '@prisma/fetch-engine@5.22.0': + resolution: {integrity: sha512-bkrD/Mc2fSvkQBV5EpoFcZ87AvOgDxbG99488a5cexp5Ccny+UM6MAe/UFkUC0wLYD9+9befNOqGiIJhhq+HbA==} + + '@prisma/get-platform@5.22.0': + resolution: {integrity: sha512-pHhpQdr1UPFpt+zFfnPazhulaZYCUqeIcPpJViYoq9R+D/yw4fjE+CtnsnKzPYm0ddUbeXUzjGVGIRVgPDCk4Q==} '@puppeteer/browsers@1.5.0': resolution: {integrity: sha512-za318PweGINh5LnHSph7C4xhs0tmRjCD8EPpzcKlw4nzSPhnULj+LTG3+TGefZvW1ti5gjw2JkdQvQsivBeZlg==} engines: {node: '>=16.3.0'} hasBin: true - '@puppeteer/browsers@1.8.0': - resolution: {integrity: sha512-TkRHIV6k2D8OlUe8RtG+5jgOF/H98Myx0M6AOafC8DdNVOFiBSFa5cpRDtpm8LXOa9sVwe0+e6Q3FC56X/DZfg==} + '@puppeteer/browsers@1.9.1': + resolution: {integrity: sha512-PuvK6xZzGhKPvlx3fpfdM2kYY3P/hB1URtK8wA7XUJ6prn6pp22zvJHu48th0SGcHL9SutbPHrFuQgfXTFobWA==} engines: {node: '>=16.3.0'} hasBin: true + '@rtsao/scc@1.1.0': + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + + '@scarf/scarf@1.4.0': + resolution: {integrity: sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==} + '@sendgrid/client@7.7.0': resolution: {integrity: sha512-SxH+y8jeAQSnDavrTD0uGDXYIIkFylCo+eDofVmZLQ0f862nnqbC3Vd1ej6b7Le7lboyzQF6F7Fodv02rYspuA==} engines: {node: 6.* || 8.* || >=10.*} @@ -1160,44 +1449,55 @@ packages: '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - '@sinonjs/commons@3.0.0': - resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} '@sinonjs/fake-timers@10.3.0': resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - '@socket.io/component-emitter@3.1.0': - resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} + '@socket.io/component-emitter@3.1.2': + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} '@sqltools/formatter@1.2.5': resolution: {integrity: sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==} - '@supabase/functions-js@2.1.2': - resolution: {integrity: sha512-QCR6pwJs9exCl37bmpMisUd6mf+0SUBJ6mUpiAjEkSJ/+xW8TCuO14bvkWHADd5hElJK9MxNlMQXxSA4DRz9nQ==} + '@supabase/auth-js@2.71.1': + resolution: {integrity: sha512-mMIQHBRc+SKpZFRB2qtupuzulaUhFYupNyxqDj5Jp/LyPvcWvjaJzZzObv6URtL/O6lPxkanASnotGtNpS3H2Q==} - '@supabase/gotrue-js@2.47.0': - resolution: {integrity: sha512-3e34/vsKH/DoSZCpB85UZpFWSJ2p4GRUUlqgAgeTPagPlx4xS+Nc5v7g7ic7vp3gK0J5PsYVCn9Qu2JQUp4vXg==} + '@supabase/functions-js@2.4.5': + resolution: {integrity: sha512-v5GSqb9zbosquTo6gBwIiq7W9eQ7rE5QazsK/ezNiQXdCbY+bH8D9qEaBIkhVvX4ZRW5rP03gEfw5yw9tiq4EQ==} - '@supabase/postgrest-js@1.8.0': - resolution: {integrity: sha512-R6leDIC92NgjyG2/tCRJ42rWN7+fZY6ulTEE+c00tcnghn6cX4IYUlnTNMtrdfYC2JYNOTyM+rWj63Wdhr7Zig==} + '@supabase/node-fetch@2.6.15': + resolution: {integrity: sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ==} + engines: {node: 4.x || >=6.0.0} - '@supabase/realtime-js@2.7.3': - resolution: {integrity: sha512-c7TzL81sx2kqyxsxcDduJcHL9KJdCOoKimGP6lQSqiZKX42ATlBZpWbyy9KFGFBjAP4nyopMf5JhPi2ZH9jyNw==} + '@supabase/postgrest-js@1.19.4': + resolution: {integrity: sha512-O4soKqKtZIW3olqmbXXbKugUtByD2jPa8kL2m2c1oozAO11uCcGrRhkZL0kVxjBLrXHE0mdSkFsMj7jDSfyNpw==} - '@supabase/storage-js@2.5.1': - resolution: {integrity: sha512-nkR0fQA9ScAtIKA3vNoPEqbZv1k5B5HVRYEvRWdlP6mUpFphM9TwPL2jZ/ztNGMTG5xT6SrHr+H7Ykz8qzbhjw==} + '@supabase/realtime-js@2.11.15': + resolution: {integrity: sha512-HQKRnwAqdVqJW/P9TjKVK+/ETpW4yQ8tyDPPtRMKOH4Uh3vQD74vmj353CYs8+YwVBKubeUOOEpI9CT8mT4obw==} - '@supabase/supabase-js@2.32.0': - resolution: {integrity: sha512-1ShFhuOI5Du7604nlCelBsRD61daXk2O0qwjumoz35bqrYThnSPPtpJqZOHw6Mg6o7mLjIInYLh/DBlh8UvzRg==} + '@supabase/storage-js@2.10.4': + resolution: {integrity: sha512-cvL02GarJVFcNoWe36VBybQqTVRq6wQSOCvTS64C+eyuxOruFIm1utZAY0xi2qKtHJO3EjKaj8iWJKySusDmAQ==} + + '@supabase/supabase-js@2.53.0': + resolution: {integrity: sha512-Vg9sl0oFn55cCPaEOsDsRDbxOVccxRrK/cikjL1XbywHEOfyA5SOOEypidMvQLwgoAfnC2S4D9BQwJDcZs7/TQ==} '@swc/helpers@0.3.17': resolution: {integrity: sha512-tb7Iu+oZ+zWJZ3HJqwx8oNwSDIU440hmVMDPhpACWQWnrZHK99Bxs70gT1L2dnr5Hg50ZRWEFkQCAnOVVV0z1Q==} + '@tokenizer/inflate@0.2.7': + resolution: {integrity: sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==} + engines: {node: '>=18'} + + '@tokenizer/token@0.3.0': + resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} + '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - '@tsconfig/node10@1.0.9': - resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} '@tsconfig/node12@1.0.11': resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} @@ -1208,164 +1508,167 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - '@types/async-retry@1.4.5': - resolution: {integrity: sha512-YrdjSD+yQv7h6d5Ip+PMxh3H6ZxKyQk0Ts+PvaNRInxneG9PFVZjFg77ILAN+N6qYf7g4giSJ1l+ZjQ1zeegvA==} - - '@types/babel__core@7.20.1': - resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==} + '@types/async-retry@1.4.9': + resolution: {integrity: sha512-s1ciZQJzRh3708X/m3vPExr5KJlzlZJvXsKpbtE2luqNcbROr64qU+3KpJsYHqWMeaxI839OvXf9PrUSw1Xtyg==} - '@types/babel__generator@7.6.4': - resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - '@types/babel__template@7.4.1': - resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} - '@types/babel__traverse@7.20.1': - resolution: {integrity: sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==} + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - '@types/body-parser@1.19.2': - resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} + '@types/babel__traverse@7.20.7': + resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} - '@types/connect@3.4.35': - resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} - '@types/cookie@0.4.1': - resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - '@types/cookiejar@2.1.2': - resolution: {integrity: sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==} + '@types/cookiejar@2.1.5': + resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} - '@types/cors@2.8.13': - resolution: {integrity: sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==} + '@types/cors@2.8.19': + resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} - '@types/crypto-js@4.1.1': - resolution: {integrity: sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA==} + '@types/crypto-js@4.2.2': + resolution: {integrity: sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==} - '@types/eslint-scope@3.7.4': - resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} - '@types/eslint@8.44.1': - resolution: {integrity: sha512-XpNDc4Z5Tb4x+SW1MriMVeIsMoONHCkWFMkR/aPJbzEsxqHy+4Glu/BqTdPrApfDeMaXbtNh6bseNgl5KaWrSg==} + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} - '@types/estree@1.0.1': - resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/express-serve-static-core@4.17.35': - resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} + '@types/express-serve-static-core@4.19.6': + resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} - '@types/express@4.17.17': - resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} + '@types/express@4.17.23': + resolution: {integrity: sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==} - '@types/graceful-fs@4.1.6': - resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} + '@types/graceful-fs@4.1.9': + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} - '@types/http-errors@2.0.1': - resolution: {integrity: sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==} + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} - '@types/istanbul-lib-coverage@2.0.4': - resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - '@types/istanbul-lib-report@3.0.0': - resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} - '@types/istanbul-reports@3.0.1': - resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - '@types/jest@29.5.3': - resolution: {integrity: sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA==} + '@types/jest@29.5.14': + resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==} - '@types/json-schema@7.0.12': - resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/json2csv@5.0.5': - resolution: {integrity: sha512-59UMwrXM22I5uYGp4izB1Jw9AFlWAMCz2/d1A5Y6hm5ZTQFiowZwwsnPjlu9LJ1/Y20zLP746LdMbaZoFVVjPQ==} + '@types/json2csv@5.0.7': + resolution: {integrity: sha512-Ma25zw9G9GEBnX8b12R4EYvnFT6dBh8L3jwsN5EUFXa+fl2dqmbLDbNWN0XuQU3rSXdsbBeCYjI9uHU2PUBxhA==} '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/jsonwebtoken@9.0.2': - resolution: {integrity: sha512-drE6uz7QBKq1fYqqoFKTDRdFCPHd5TCub75BM+D+cMx7NU9hUz7SESLfC2fSCXVFMO5Yj8sOWHuGqPgjc+fz0Q==} + '@types/jsonwebtoken@9.0.10': + resolution: {integrity: sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==} - '@types/mime@1.3.2': - resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==} + '@types/jsonwebtoken@9.0.5': + resolution: {integrity: sha512-VRLSGzik+Unrup6BsouBeHsf4d1hOEgYWTm/7Nmw1sXoN1+tRly/Gy/po3yeahnP4jfnQWWAhQAqcNfH7ngOkA==} - '@types/mime@3.0.1': - resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} + '@types/luxon@3.3.8': + resolution: {integrity: sha512-jYvz8UMLDgy3a5SkGJne8H7VA7zPV2Lwohjx0V8V31+SqAjNmurWMkk9cQhfvlcnXWudBpK9xPM1n4rljOcHYQ==} - '@types/multer@1.4.9': - resolution: {integrity: sha512-9NSvPJ2E8bNTc8XtJq1Cimx2Wrn2Ah48F15B2Du/hM8a8CHLhVbJMlF3ZCqhvMdht7Sa+YdP0aKP7N4fxDcrrg==} + '@types/methods@1.1.4': + resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} - '@types/node@20.4.6': - resolution: {integrity: sha512-q0RkvNgMweWWIvSMDiXhflGUKMdIxBo2M2tYM/0kEGDueQByFzK4KZAgu5YHGFNxziTlppNpTIBcqHQAxlfHdA==} + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - '@types/parse-json@4.0.0': - resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/multer@1.4.13': + resolution: {integrity: sha512-bhhdtPw7JqCiEfC9Jimx5LqX9BDIPJEh2q/fQ4bqbBPtyEZYr3cvF22NwG0DmPZNYA0CAf2CnqDB4KIGGpJcaw==} + + '@types/node@20.19.9': + resolution: {integrity: sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw==} '@types/passport-jwt@3.0.9': resolution: {integrity: sha512-5XJt+79emfgpuBvBQusUPylFIVtW1QVAAkTRwCbRJAmxUjmLtIqUU6V1ovpnHPu6Qut3mR5Juc+s7kd06roNTg==} - '@types/passport-local@1.0.35': - resolution: {integrity: sha512-K4eLTJ8R0yYW8TvCqkjB0pTKoqfUSdl5PfZdidTjV2ETV3604fQxtY6BHKjQWAx50WUS0lqzBvKv3LoI1ZBPeA==} + '@types/passport-local@1.0.38': + resolution: {integrity: sha512-nsrW4A963lYE7lNTv9cr5WmiUD1ibYJvWrpE13oxApFsRt77b0RdtZvKbCdNIY4v/QZ6TRQWaDDEwV1kCTmcXg==} - '@types/passport-strategy@0.2.35': - resolution: {integrity: sha512-o5D19Jy2XPFoX2rKApykY15et3Apgax00RRLf0RUotPDUsYrQa7x4howLYr9El2mlUApHmCMv5CZ1IXqKFQ2+g==} + '@types/passport-strategy@0.2.38': + resolution: {integrity: sha512-GC6eMqqojOooq993Tmnmp7AUTbbQSgilyvpCYQjT+H6JfG/g6RGc7nXEniZlp0zyKJ0WUdOiZWLBZft9Yug1uA==} - '@types/passport@1.0.12': - resolution: {integrity: sha512-QFdJ2TiAEoXfEQSNDISJR1Tm51I78CymqcBa8imbjo6dNNu+l2huDxxbDEIoFIwOSKMkOfHEikyDuZ38WwWsmw==} + '@types/passport@1.0.17': + resolution: {integrity: sha512-aciLyx+wDwT2t2/kJGJR2AEeBz0nJU4WuRX04Wu9Dqc5lSUtwu0WERPHYsLhF9PtseiAMPBGNUOtFjxZ56prsg==} - '@types/pdfkit@0.12.6': - resolution: {integrity: sha512-G7X9Q5sJ2cwOBOR3NcfsjdS+rvYsv3xjiccLTvQ9jZ2A2yaC3jfMd1AfXALetR+QSjogRLurSUEn3TyVWCDvIw==} + '@types/pdfkit@0.12.12': + resolution: {integrity: sha512-plkfKdaPSVIndcsg2qFmQ/qazRivTyHALEiKufsTI6qn4hbXbFVm0n9RuY0RQpoBxM2NNK5SudCfpisDzIdXoA==} - '@types/phoenix@1.6.0': - resolution: {integrity: sha512-qwfpsHmFuhAS/dVd4uBIraMxRd56vwBUYQGZ6GpXnFuM2XMRFJbIyruFKKlW2daQliuYZwe0qfn/UjFCDKic5g==} + '@types/phoenix@1.6.6': + resolution: {integrity: sha512-PIzZZlEppgrpoT2QgbnDU+MMzuR6BbCjllj0bM70lWoejMeNJAxCchxnv7J3XFkI8MpygtRpzXrIlmWUBclP5A==} - '@types/qs@6.9.7': - resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} - '@types/range-parser@1.2.4': - resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - '@types/retry@0.12.2': - resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} + '@types/retry@0.12.5': + resolution: {integrity: sha512-3xSjTp3v03X/lSQLkczaN9UIEwJMoMCA1+Nb5HfbJEQWogdeQIyVtTvxPXDQjZ5zws8rFQfVfRdz03ARihPJgw==} - '@types/semver@7.5.0': - resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} + '@types/semver@7.7.0': + resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} - '@types/send@0.17.1': - resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} + '@types/send@0.17.5': + resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} - '@types/serve-static@1.15.2': - resolution: {integrity: sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==} + '@types/serve-static@1.15.8': + resolution: {integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==} - '@types/stack-utils@2.0.1': - resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - '@types/superagent@4.1.18': - resolution: {integrity: sha512-LOWgpacIV8GHhrsQU+QMZuomfqXiqzz3ILLkCtKx3Us6AmomFViuzKT9D693QTKgyut2oCytMG8/efOop+DB+w==} + '@types/superagent@8.1.9': + resolution: {integrity: sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==} - '@types/supertest@2.0.12': - resolution: {integrity: sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ==} + '@types/supertest@2.0.16': + resolution: {integrity: sha512-6c2ogktZ06tr2ENoZivgm7YnprnhYE4ZoXGMY+oA7IuAf17M8FWvujXZGmxLv8y0PTyts4x5A+erSwVUFA8XSg==} '@types/triple-beam@1.3.5': resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} - '@types/validator@13.9.0': - resolution: {integrity: sha512-NclP0IbzHj/4tJZKFqKh8E7kZdgss+MCUYV9G+TLltFfDA4lFgE4PKPpDIyS2FlcdANIfSx273emkupvChigbw==} + '@types/validator@13.15.2': + resolution: {integrity: sha512-y7pa/oEJJ4iGYBxOpfAKn5b9+xuihvzDVnC/OSvlVnGxVg0pOqmjiMafiJ1KVNQEaPZf9HsEp5icEwGg8uIe5Q==} - '@types/websocket@1.0.5': - resolution: {integrity: sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ==} + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - '@types/yargs-parser@21.0.0': - resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - '@types/yargs@17.0.24': - resolution: {integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==} + '@types/yargs@17.0.33': + resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} - '@types/yauzl@2.10.2': - resolution: {integrity: sha512-Km7XAtUIduROw7QPgvcft0lIupeG8a8rdKL8RiSyKvlE7dYY31fEn41HVuQsRFDuROA8tA4K2UVL+WdfFmErBA==} + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@6.2.1': - resolution: {integrity: sha512-iZVM/ALid9kO0+I81pnp1xmYiFyqibAHzrqX4q5YvvVEyJqY+e6rfTXSCsc2jUxGNqJqTfFSSij/NFkZBiBzLw==} + '@typescript-eslint/eslint-plugin@6.21.0': + resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha @@ -1385,8 +1688,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@6.2.1': - resolution: {integrity: sha512-Ld+uL1kYFU8e6btqBFpsHkwQ35rw30IWpdQxgOqOh4NfxSDH6uCkah1ks8R/RgQqI5hHPXMaLy9fbFseIe+dIg==} + '@typescript-eslint/parser@6.21.0': + resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -1399,12 +1702,12 @@ packages: resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/scope-manager@6.2.1': - resolution: {integrity: sha512-UCqBF9WFqv64xNsIEPfBtenbfodPXsJ3nPAr55mGPkQIkiQvgoWNo+astj9ZUfJfVKiYgAZDMnM6dIpsxUMp3Q==} + '@typescript-eslint/scope-manager@6.21.0': + resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} engines: {node: ^16.0.0 || >=18.0.0} - '@typescript-eslint/type-utils@6.2.1': - resolution: {integrity: sha512-fTfCgomBMIgu2Dh2Or3gMYgoNAnQm3RLtRp+jP7A8fY+LJ2+9PNpi5p6QB5C4RSP+U3cjI0vDlI3mspAkpPVbQ==} + '@typescript-eslint/type-utils@6.21.0': + resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -1417,8 +1720,8 @@ packages: resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/types@6.2.1': - resolution: {integrity: sha512-528bGcoelrpw+sETlyM91k51Arl2ajbNT9L4JwoXE2dvRe1yd8Q64E4OL7vHYw31mlnVsf+BeeLyAZUEQtqahQ==} + '@typescript-eslint/types@6.21.0': + resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} engines: {node: ^16.0.0 || >=18.0.0} '@typescript-eslint/typescript-estree@5.62.0': @@ -1430,8 +1733,8 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@6.2.1': - resolution: {integrity: sha512-G+UJeQx9AKBHRQBpmvr8T/3K5bJa485eu+4tQBxFq0KoT22+jJyzo1B50JDT9QdC1DEmWQfdKsa8ybiNWYsi0Q==} + '@typescript-eslint/typescript-estree@6.21.0': + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' @@ -1439,8 +1742,8 @@ packages: typescript: optional: true - '@typescript-eslint/utils@6.2.1': - resolution: {integrity: sha512-eBIXQeupYmxVB6S7x+B9SdBeB6qIdXKjgQBge2J+Ouv8h9Cxm5dHf/gfAZA6dkMaag+03HdbVInuXMmqFB/lKQ==} + '@typescript-eslint/utils@6.21.0': + resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -1449,54 +1752,57 @@ packages: resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/visitor-keys@6.2.1': - resolution: {integrity: sha512-iTN6w3k2JEZ7cyVdZJTVJx2Lv7t6zFA8DCrJEHD2mwfc16AEvvBWVhbFh34XyG2NORCd0viIgQY1+u7kPI0WpA==} + '@typescript-eslint/visitor-keys@6.21.0': + resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} engines: {node: ^16.0.0 || >=18.0.0} - '@webassemblyjs/ast@1.11.6': - resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@webassemblyjs/ast@1.14.1': + resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} - '@webassemblyjs/floating-point-hex-parser@1.11.6': - resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + '@webassemblyjs/floating-point-hex-parser@1.13.2': + resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} - '@webassemblyjs/helper-api-error@1.11.6': - resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + '@webassemblyjs/helper-api-error@1.13.2': + resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} - '@webassemblyjs/helper-buffer@1.11.6': - resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} + '@webassemblyjs/helper-buffer@1.14.1': + resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} - '@webassemblyjs/helper-numbers@1.11.6': - resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + '@webassemblyjs/helper-numbers@1.13.2': + resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} - '@webassemblyjs/helper-wasm-bytecode@1.11.6': - resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + '@webassemblyjs/helper-wasm-bytecode@1.13.2': + resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} - '@webassemblyjs/helper-wasm-section@1.11.6': - resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} + '@webassemblyjs/helper-wasm-section@1.14.1': + resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} - '@webassemblyjs/ieee754@1.11.6': - resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + '@webassemblyjs/ieee754@1.13.2': + resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} - '@webassemblyjs/leb128@1.11.6': - resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + '@webassemblyjs/leb128@1.13.2': + resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} - '@webassemblyjs/utf8@1.11.6': - resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + '@webassemblyjs/utf8@1.13.2': + resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} - '@webassemblyjs/wasm-edit@1.11.6': - resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} + '@webassemblyjs/wasm-edit@1.14.1': + resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} - '@webassemblyjs/wasm-gen@1.11.6': - resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} + '@webassemblyjs/wasm-gen@1.14.1': + resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} - '@webassemblyjs/wasm-opt@1.11.6': - resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} + '@webassemblyjs/wasm-opt@1.14.1': + resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} - '@webassemblyjs/wasm-parser@1.11.6': - resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} + '@webassemblyjs/wasm-parser@1.14.1': + resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} - '@webassemblyjs/wast-printer@1.11.6': - resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} + '@webassemblyjs/wast-printer@1.14.1': + resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} '@xtuc/ieee754@1.2.0': resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} @@ -1507,10 +1813,6 @@ packages: abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -1525,12 +1827,12 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} engines: {node: '>=0.4.0'} - acorn@8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} hasBin: true @@ -1541,18 +1843,14 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} - agent-base@7.1.0: - resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} - agentkeepalive@4.5.0: - resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} + agentkeepalive@4.6.0: + resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} engines: {node: '>= 8.0.0'} - aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} - ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: @@ -1566,12 +1864,20 @@ packages: peerDependencies: ajv: ^6.9.1 + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} ajv@8.12.0: resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -1580,18 +1886,18 @@ packages: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} + ansi-escapes@5.0.0: + resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} + engines: {node: '>=12'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} engines: {node: '>=12'} - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -1604,8 +1910,9 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} - any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + ansis@3.17.0: + resolution: {integrity: sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==} + engines: {node: '>=14'} anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} @@ -1618,13 +1925,12 @@ packages: append-field@1.0.0: resolution: {integrity: sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==} - aproba@2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + aproba@2.1.0: + resolution: {integrity: sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==} are-we-there-yet@2.0.0: resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} engines: {node: '>=10'} - deprecated: This package is no longer supported. arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} @@ -1635,14 +1941,15 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - array-buffer-byte-length@1.0.0: - resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - array-includes@3.1.6: - resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} engines: {node: '>= 0.4'} array-timsort@1.0.3: @@ -1652,20 +1959,20 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - array.prototype.findlastindex@1.2.2: - resolution: {integrity: sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==} + array.prototype.findlastindex@1.2.6: + resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} engines: {node: '>= 0.4'} - array.prototype.flat@1.3.1: - resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} engines: {node: '>= 0.4'} - array.prototype.flatmap@1.3.1: - resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} engines: {node: '>= 0.4'} - arraybuffer.prototype.slice@1.0.1: - resolution: {integrity: sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==} + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} asap@2.0.6: @@ -1685,13 +1992,12 @@ packages: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} - astral-regex@2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} - engines: {node: '>=8'} - async-cache@1.1.0: resolution: {integrity: sha512-YDQc4vBn5NFhY6g6HhVshyi3Fy9+SQ5ePnE7JLDJn1DoL+i7ER+vMwtTNOYk9leZkYMnOwpBCWqyLDPw8Aig8g==} - deprecated: No longer maintained. Use [lru-cache](http://npm.im/lru-cache) version 7.6 or higher, and provide an asynchronous `fetchMethod` option. + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} async-retry@1.3.3: resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} @@ -1712,34 +2018,34 @@ packages: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} - auth0-js@9.22.1: - resolution: {integrity: sha512-AcyJiWhsyG5zdx40O9i/okpLLEvB23/6CivWynmGtP43s2C4GSq3E+XdCRw64ifmZ7t6ZK4Yzfpiqy5KVXEtJg==} + auth0-js@9.28.0: + resolution: {integrity: sha512-2xIfQIGM0vX3IdPR91ztLO2+Ar2I5+3iFKcjuZO+LV9vRh4Wje+Ka1hnHjMU9dH892Lm3ZxBAHxRo68YToUhfg==} - available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - aws-sdk@2.1560.0: - resolution: {integrity: sha512-nakTZHytnhKWZpwu9d1crqjoegBRG+j1/rflsVnckXxoIwlKM0D/v/NIe+BJmRnCA2aCdwuMx3dtkgLz/AB6VA==} + aws-sdk@2.1692.0: + resolution: {integrity: sha512-x511uiJ/57FIsbgUe5csJ13k3uzu25uWQE+XqfBis/sB0SFoiElJWXRkgEAUh0U6n40eT3ay5Ue4oPkRMu1LYw==} engines: {node: '>= 10.0.0'} aws-sign2@0.7.0: resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} - aws4@1.12.0: - resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==} + aws4@1.13.2: + resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} axios@0.26.1: resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==} - axios@1.4.0: - resolution: {integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==} + axios@1.11.0: + resolution: {integrity: sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==} - b4a@1.6.4: - resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==} + b4a@1.6.7: + resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} - babel-jest@29.6.2: - resolution: {integrity: sha512-BYCzImLos6J3BH/+HvUCHG1dTf2MzmAB4jaVxHV+29RZLjR29XuYTmsf2sdDwkrb+FczkGo3kOhE7ga6sI0P4A==} + babel-jest@29.7.0: + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.8.0 @@ -1748,17 +2054,17 @@ packages: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} - babel-plugin-jest-hoist@29.5.0: - resolution: {integrity: sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==} + babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - babel-preset-current-node-syntax@1.0.1: - resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + babel-preset-current-node-syntax@1.2.0: + resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^7.0.0 || ^8.0.0-0 - babel-preset-jest@29.5.0: - resolution: {integrity: sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==} + babel-preset-jest@29.6.3: + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.0.0 @@ -1766,6 +2072,9 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + bare-events@2.6.0: + resolution: {integrity: sha512-EKZ5BTXYExaNqi3I3f9RtEsaI/xBSGjE0XZCZilPzFAV/goswFHuPd9jEZlPIZ/iNZJwDSao9qRiScySz7MbQg==} + base64-js@0.0.8: resolution: {integrity: sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==} engines: {node: '>= 0.4'} @@ -1781,23 +2090,23 @@ packages: resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} engines: {node: '>= 0.8'} - basic-ftp@5.0.3: - resolution: {integrity: sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==} + basic-ftp@5.0.5: + resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} engines: {node: '>=10.0.0'} bcrypt-pbkdf@1.0.2: resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} - bcrypt@5.1.0: - resolution: {integrity: sha512-RHBS7HI5N5tEnGTmtR/pppX0mmDSBpQ4aCBsj7CEQfYXDcO74A8sIBYcJMuCsis2E81zDxeENYhv66oZwLiA+Q==} + bcrypt@5.1.1: + resolution: {integrity: sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==} engines: {node: '>= 10.0.0'} - big-integer@1.6.51: - resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} + big-integer@1.6.52: + resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} engines: {node: '>=0.6'} - binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} binary-search@1.3.6: @@ -1818,26 +2127,18 @@ packages: bluebird@3.4.7: resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==} - bn.js@4.12.0: - resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} - - body-parser@1.20.1: - resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + bn.js@4.12.2: + resolution: {integrity: sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==} - body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} @@ -1849,8 +2150,8 @@ packages: brotli@1.3.3: resolution: {integrity: sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==} - browserslist@4.21.10: - resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} + browserslist@4.25.1: + resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -1874,10 +2175,6 @@ packages: resolution: {integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==} engines: {node: '>=0.10'} - buffer-writer@2.0.0: - resolution: {integrity: sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==} - engines: {node: '>=4'} - buffer@4.9.2: resolution: {integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==} @@ -1891,15 +2188,11 @@ packages: resolution: {integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==} engines: {node: '>=0.2.0'} - bufferutil@4.0.7: - resolution: {integrity: sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==} - engines: {node: '>=6.14.2'} + builtins@5.1.0: + resolution: {integrity: sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==} - builtins@5.0.1: - resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} - - bull@4.11.4: - resolution: {integrity: sha512-6rPnFkUbN/eWhzGF65mcYM2HWDl2rp0fTidZ8en64Zwplioe/QxpdiWfLLtXX4Yy25piPly4f96wHR0NquiyyQ==} + bull@4.16.5: + resolution: {integrity: sha512-lDsx2BzkKe7gkCYiT5Acj02DpTwDznl/VNN7Psn7M3USPG7Vs/BaClZJJTAG+ufAR9++N1/NiUTdaFBWDIl5TQ==} engines: {node: '>=12'} busboy@1.6.0: @@ -1914,14 +2207,20 @@ packages: resolution: {integrity: sha512-bWLWlUg6nCYHiJLCCYxY2MgvwvKnvlWwrbuynrzpjEIhfArD2GC9LtutIHFEPeyGVQN6C+WEw+P3r+BFBwhswg==} engines: {node: '>= 8.3'} - cache-manager@5.4.0: - resolution: {integrity: sha512-FS7o8vqJosnLpu9rh2gQTo8EOzCRJLF1BJ4XDEUDMqcfvs7SJZs5iuoFTXLauzQ3S5v8sBAST1pCwMaurpyi1A==} + cache-manager@5.7.6: + resolution: {integrity: sha512-wBxnBHjDxF1RXpHCBD6HGvKER003Ts7IIm0CHpggliHzN1RZditb7rXoduE1rplc2DEFYKxhLKgFuchXMJje9w==} + engines: {node: '>= 18'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} - call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} callsites@3.1.0: @@ -1936,8 +2235,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001519: - resolution: {integrity: sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg==} + caniuse-lite@1.0.30001731: + resolution: {integrity: sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg==} caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -1945,16 +2244,16 @@ packages: chainsaw@0.1.0: resolution: {integrity: sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==} - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chalk@5.2.0: - resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + chalk@5.4.1: + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} char-regex@1.0.2: @@ -1964,16 +2263,16 @@ packages: chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} - chrome-trace-event@1.0.3: - resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} chromium-bidi@0.4.20: @@ -1981,49 +2280,40 @@ packages: peerDependencies: devtools-protocol: '*' - chromium-bidi@0.4.33: - resolution: {integrity: sha512-IxoFM5WGQOIAd95qrSXzJUv4eXIrh+RvU3rwwqIiwYuvfE7U/Llj4fejbsJnjJMUYCuGtVQsY2gv7oGl4aTNSQ==} + chromium-bidi@0.5.8: + resolution: {integrity: sha512-blqh+1cEQbHBKmok3rVJkBlBxt9beKBgOsxbFgs7UJcoVbbeZ+K7+6liAsjgpc8l1Xd55cQUy14fXZdGSb4zIw==} peerDependencies: devtools-protocol: '*' - ci-info@3.8.0: - resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} - cjs-module-lexer@1.2.3: - resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + cjs-module-lexer@1.4.3: + resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} class-transformer@0.5.1: resolution: {integrity: sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==} - class-validator@0.14.0: - resolution: {integrity: sha512-ct3ltplN8I9fOwUd8GrP8UQixwff129BkEtuWDKL5W45cQuLd19xqmTLu5ge78YDm/fdje6FMt0hGOhl0lii3A==} - - clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} + class-validator@0.14.2: + resolution: {integrity: sha512-3kMVRF2io8N8pY1IFIXlho9r8IPUUIfHe2hYVtiebvAzU2XeQFXTv+XI4WX+TnXmtwXMDcjngcpkiPM0O9PvLw==} cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} - cli-highlight@2.1.11: - resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==} - engines: {node: '>=8.0.0', npm: '>=5.0.0'} - hasBin: true + cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - cli-spinners@2.9.0: - resolution: {integrity: sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==} + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} - cli-table3@0.6.3: - resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} + cli-table3@0.6.5: + resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} engines: {node: 10.* || >= 12.*} - cli-truncate@2.1.0: - resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} - engines: {node: '>=8'} - cli-truncate@3.1.0: resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2032,12 +2322,13 @@ packages: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} engines: {node: '>= 10'} + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -2094,9 +2385,9 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} - commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} + commander@11.0.0: + resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} + engines: {node: '>=16'} commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -2109,12 +2400,12 @@ packages: resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} engines: {node: '>= 6'} - comment-json@4.2.3: - resolution: {integrity: sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==} + comment-json@4.2.5: + resolution: {integrity: sha512-bKw/r35jR3HGt5PEPm1ljsQQGyCrR8sFGNiN5L+ykDHdpO8Smxkrkla9Yi6NkQyUrb8V54PGhfMs6NrIwtxtdw==} engines: {node: '>= 6'} - component-emitter@1.3.0: - resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} + component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -2123,6 +2414,10 @@ packages: resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} engines: {'0': node >= 0.8} + concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + consola@2.15.3: resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} @@ -2140,23 +2435,24 @@ packages: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} - convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - cookie@0.4.2: - resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} - engines: {node: '>= 0.6'} - cookie@0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} + cookie@0.7.1: + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} + engines: {node: '>= 0.6'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + cookiejar@2.1.4: resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} @@ -2170,10 +2466,6 @@ packages: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} - cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} - cosmiconfig@8.2.0: resolution: {integrity: sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==} engines: {node: '>=14'} @@ -2187,47 +2479,63 @@ packages: typescript: optional: true + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + create-jest@29.7.0: + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - cron-parser@4.8.1: - resolution: {integrity: sha512-jbokKWGcyU4gl6jAfX97E1gDpY12DJ1cLJZmoDzaAln/shZ+S3KBFBuA2Q6WeUN4gJf/8klnV1EfvhA2lK5IRQ==} + cron-parser@4.9.0: + resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} engines: {node: '>=12.0.0'} - cron@2.3.1: - resolution: {integrity: sha512-1eRRlIT0UfIqauwbG9pkg3J6CX9A6My2ytJWqAXoK0T9oJnUZTzGBNPxao0zjodIbPgf8UQWjE62BMb9eVllSQ==} - - cross-fetch@3.1.8: - resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} + cron@2.4.3: + resolution: {integrity: sha512-YBvExkQYF7w0PxyeFLRyr817YVDhGxaCi5/uRRMqa4aWD3IFKRd+uNbpW1VWMdqQy8PZ7CElc+accXJcauPKzQ==} cross-fetch@4.0.0: resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - crypto-js@4.1.1: - resolution: {integrity: sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==} + crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} crypto-random-string@5.0.0: resolution: {integrity: sha512-KWjTXWwxFd6a94m5CdRGW/t82Tr8DoBc9dNnPCAbFI1EBweN6v1tv8y4Y1m7ndkp/nkIBRxUxAzpaBnR2k3bcQ==} engines: {node: '>=14.16'} - d@1.0.1: - resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} - dashdash@1.14.1: resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} engines: {node: '>=0.10'} - data-uri-to-buffer@6.0.1: - resolution: {integrity: sha512-MZd3VlchQkp8rdend6vrx7MmVDJzSNTBvghvKjirLkD+WTChA3KUf0jkE68Q4UyctNqI11zZO9/x2Yx+ub5Cvg==} + data-uri-to-buffer@6.0.2: + resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} engines: {node: '>= 14'} - date-fns@2.30.0: - resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} - engines: {node: '>=0.11'} + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} dayjs@1.11.13: resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} @@ -2257,8 +2565,17 @@ packages: supports-color: optional: true - debug@4.3.5: - resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -2270,16 +2587,17 @@ packages: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} - dedent@1.5.1: - resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} + dedent@1.6.0: + resolution: {integrity: sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==} peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: babel-plugin-macros: optional: true - deep-equal@2.2.2: - resolution: {integrity: sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA==} + deep-equal@2.2.3: + resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} + engines: {node: '>= 0.4'} deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -2295,10 +2613,6 @@ packages: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} - define-properties@1.2.0: - resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} - engines: {node: '>= 0.4'} - define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} @@ -2330,8 +2644,8 @@ packages: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - detect-libc@2.0.2: - resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + detect-libc@2.0.4: + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} engines: {node: '>=8'} detect-newline@3.1.0: @@ -2341,8 +2655,8 @@ packages: devtools-protocol@0.0.1147663: resolution: {integrity: sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==} - devtools-protocol@0.0.1203626: - resolution: {integrity: sha512-nEzHZteIUZfGCZtTiS1fRpC8UZmsfD1SiyPvaUNvS13dvKf666OAm8YTi0+Ca3n1nLEyu49Cy4+dPWpaHFJk9g==} + devtools-protocol@0.0.1232444: + resolution: {integrity: sha512-pM27vqEfxSxRkTMnF+XCmxSEb6duO5R+t8A9DEEJgy4Wz2RVanje2mmj99B6A3zv2r/qGfYlOvYznUhuokizmg==} dezalgo@1.0.4: resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} @@ -2350,8 +2664,8 @@ packages: dfa@1.2.0: resolution: {integrity: sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==} - diff-sequences@29.4.3: - resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} diff@4.0.2: @@ -2377,14 +2691,18 @@ packages: resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} engines: {node: '>=12'} - dotenv@16.0.3: - resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} + dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} - dotenv@16.1.4: - resolution: {integrity: sha512-m55RtE8AsPeJBpOIFKihEmqUcoVncQIwo7x9U8ZwLEZw9ZpXboz2c+rvog+jUaJvVrZ5kBOeYQBX5+8Aa/OZQw==} + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + duplexer2@0.1.4: resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} @@ -2400,12 +2718,17 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - elastic-apm-node@3.51.0: - resolution: {integrity: sha512-GvZyoV4uhHB9qW4QE4pGcYZLbDCay2VzbeE5zN5v9vrQQ7j72GbzE5wGmtryNHwqP4DGCuXUk/jerArfpIquOQ==} + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + elastic-apm-node@3.52.2: + resolution: {integrity: sha512-NVFthDcoBOpTwtppF7b+BIeIu4Xon3RBNpddIaJv+DtjL6Q61x4j7ClYdiXjv3XKgyp7yUlOnLjU6PY/EYXwLQ==} engines: {node: '>=8.6.0'} - electron-to-chromium@1.4.483: - resolution: {integrity: sha512-YLwU0iF//9R3cCEfq0wgL+pf9vglE4kwAg4S5tkVVZljUDKv7Wcz67mTY4OOj+T7YUbTGuqlbqgdl/s+7Q8KTw==} + electron-to-chromium@1.5.193: + resolution: {integrity: sha512-eePuBZXM9OVCwfYUhd2OzESeNGnWmLyeu0XAEjf7xjijNjHFdeJSzuRUGN4ueT2tEYo5YqjHramKEFxz67p3XA==} emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} @@ -2420,31 +2743,36 @@ packages: enabled@2.0.0: resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} - encode-utf8@1.0.3: - resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} - encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - engine.io-client@6.5.2: - resolution: {integrity: sha512-CQZqbrpEYnrpGqC07a9dJDz4gePZUgTPMU3NKJPSeQOyw27Tst4Pl3FemKoFGAlHzgZmKjoRmiJvbWfhCXUlIg==} + engine.io-client@6.6.3: + resolution: {integrity: sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==} - engine.io-parser@5.2.1: - resolution: {integrity: sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==} + engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} engines: {node: '>=10.0.0'} - engine.io@6.5.2: - resolution: {integrity: sha512-IXsMcGpw/xRfjra46sVZVHiSWo/nJ/3g1337q9KNXtS6YRzbW5yIzTCb9DjhrBe7r3GZQR0I4+nq+4ODk5g/cA==} + engine.io@6.6.4: + resolution: {integrity: sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==} engines: {node: '>=10.2.0'} - enhanced-resolve@5.15.0: - resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} + enhanced-resolve@5.18.2: + resolution: {integrity: sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==} engines: {node: '>=10.13.0'} + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + error-callsites@2.0.4: resolution: {integrity: sha512-V877Ch4FC4FN178fDK1fsrHN4I1YQIBdtjKrHh3BUHMnh3SMvwUVrqkaOgDpUuevgSNna0RBq6Ox9SGlxYrigA==} engines: {node: '>=6.x'} @@ -2455,12 +2783,12 @@ packages: error-stack-parser@2.1.4: resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} - es-abstract@1.22.1: - resolution: {integrity: sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==} + es-abstract@1.24.0: + resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} engines: {node: '>= 0.4'} - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} es-errors@1.3.0: @@ -2470,39 +2798,30 @@ packages: es-get-iterator@1.1.3: resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - es-module-lexer@1.3.0: - resolution: {integrity: sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==} + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} - es-set-tostringtag@2.0.1: - resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - es-shim-unscopables@1.0.0: - resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} - - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} engines: {node: '>= 0.4'} - es5-ext@0.10.62: - resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==} - engines: {node: '>=0.10'} - - es6-iterator@2.0.3: - resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} es6-promise@4.2.8: resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - es6-symbol@3.1.3: - resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} - - escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} escape-html@1.0.3: @@ -2525,8 +2844,8 @@ packages: engines: {node: '>=6.0'} hasBin: true - eslint-config-prettier@8.10.0: - resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} + eslint-config-prettier@8.10.2: + resolution: {integrity: sha512-/IGJ6+Dka158JnP5n5YFMOszjDWrXggGz1LaK/guZq9vZTmniaKlHcsscvkAhn9y4U+BU3JuUdYvtAMcv30y4A==} hasBin: true peerDependencies: eslint: '>=7.0.0' @@ -2550,11 +2869,11 @@ packages: eslint-plugin-n: '^15.0.0 || ^16.0.0 ' eslint-plugin-promise: ^6.0.0 - eslint-import-resolver-node@0.3.7: - resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-module-utils@2.8.0: - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + eslint-module-utils@2.12.1: + resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -2580,12 +2899,12 @@ packages: peerDependencies: eslint: '>=4.19.1' - eslint-plugin-import@2.28.0: - resolution: {integrity: sha512-B8s/n+ZluN7sxj9eUf7/pRFERX0r5bnFA2dCaLHy2ZeaQEAz0k+ZZkFWRFHJAqxfxQDx6KLv9LeIki7cFdwW+Q==} + eslint-plugin-import@2.32.0: + resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 peerDependenciesMeta: '@typescript-eslint/parser': optional: true @@ -2596,8 +2915,8 @@ packages: peerDependencies: eslint: '>=7.0.0' - eslint-plugin-prettier@4.2.1: - resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} + eslint-plugin-prettier@4.2.5: + resolution: {integrity: sha512-9Ni+xgemM2IWLq6aXEpP2+V/V30GeA/46Ar629vcMqVPodFFWC9skHu/D1phvuqtS8bJCFnNf01/qcmqYEwNfg==} engines: {node: '>=12.0.0'} peerDependencies: eslint: '>=7.28.0' @@ -2607,11 +2926,11 @@ packages: eslint-config-prettier: optional: true - eslint-plugin-promise@6.1.1: - resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} + eslint-plugin-promise@6.6.0: + resolution: {integrity: sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} @@ -2639,12 +2958,12 @@ packages: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} - eslint-visitor-keys@3.4.2: - resolution: {integrity: sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==} + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint@8.46.0: - resolution: {integrity: sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg==} + eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true @@ -2657,8 +2976,8 @@ packages: engines: {node: '>=4'} hasBin: true - esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} esrecurse@4.3.0: @@ -2681,9 +3000,8 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} - event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} events@1.1.1: resolution: {integrity: sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==} @@ -2693,10 +3011,6 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - execa@4.1.0: - resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} - engines: {node: '>=10'} - execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -2709,17 +3023,14 @@ packages: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} - expect@29.6.2: - resolution: {integrity: sha512-iAErsLxJ8C+S02QbLAwgSGSezLQK+XXRDt8IuFXFpwCNw2ECmzZSmjKcCaFVp5VRMk+WAvz6h6jokzEzBFZEuA==} + expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - express@4.18.2: - resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + express@4.21.2: + resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} engines: {node: '>= 0.10.0'} - ext@1.7.0: - resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} - extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -2749,8 +3060,8 @@ packages: fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} fast-json-stable-stringify@2.1.0: @@ -2769,8 +3080,11 @@ packages: fast-stream-to-buffer@1.0.0: resolution: {integrity: sha512-bI/544WUQlD2iXBibQbOMSmG07Hay7YrpXlKaeGTPT7H7pC0eitt3usak5vUwEvCGK/O7rUAM3iyQValGU22TQ==} - fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} @@ -2781,6 +3095,9 @@ packages: fecha@4.2.3: resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} @@ -2792,16 +3109,19 @@ packages: file-stream-rotator@0.6.1: resolution: {integrity: sha512-u+dBid4PvZw17PmDeRcNOtCP9CCK/9lRN2w+r1xIS7yOL9JFrIBKTvrYsxT4P0pGtThYTn++QS5ChHaUov3+zQ==} - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} + file-type@20.4.1: + resolution: {integrity: sha512-hw9gNZXUfZ02Jo0uafWLaFVPter5/k2rfcrjFJJHX/77xtSDOfJuEFb6oKlFV86FLP1SuyHMW1PSk0U9M5tKkQ==} + engines: {node: '>=18'} + + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} engines: {node: '>= 0.8'} find-up@4.1.0: @@ -2812,21 +3132,21 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - flat-cache@3.0.4: - resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} flatstr@1.0.12: resolution: {integrity: sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==} - flatted@3.2.7: - resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} fn.name@1.1.0: resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} - follow-redirects@1.15.2: - resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -2837,14 +3157,19 @@ packages: fontkit@1.9.0: resolution: {integrity: sha512-HkW/8Lrk8jl18kzQHvAw9aTHe1cqsyx5sDnxncx652+CIfhawokEPkeM3BoIC+z/Xv7a0yMr0f3pRRwhGH455g==} - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} forever-agent@0.6.1: resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} - fork-ts-checker-webpack-plugin@8.0.0: - resolution: {integrity: sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==} + fork-ts-checker-webpack-plugin@9.0.2: + resolution: {integrity: sha512-Uochze2R8peoN1XqlSi/rGUkDQpRogtLFocP9+PGu68zk1BDAKXfdeCdyVZpgTk8V8WFVQXdEz426VKjXLO1Gg==} engines: {node: '>=12.13.0', yarn: '>=1.0.0'} peerDependencies: typescript: '>3.6.0' @@ -2854,12 +3179,12 @@ packages: resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} engines: {node: '>= 0.12'} - form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + form-data@4.0.4: + resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} engines: {node: '>= 6'} - formidable@2.1.2: - resolution: {integrity: sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==} + formidable@2.1.5: + resolution: {integrity: sha512-Oz5Hwvwak/DCaXVVUtPn4oLMLLy1CdclLKO1LFgU7XzDpVMUU5UjlSLpGMocyQNNk8F6IJW9M/YdooSn2MRI+Q==} forwarded-parse@2.1.2: resolution: {integrity: sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==} @@ -2879,16 +3204,12 @@ packages: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} - fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} - fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} - fs-monkey@1.0.4: - resolution: {integrity: sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==} + fs-monkey@1.1.0: + resolution: {integrity: sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==} fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -2896,24 +3217,20 @@ packages: fs@0.0.1-security: resolution: {integrity: sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==} - fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] fstream@1.0.12: resolution: {integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==} engines: {node: '>=0.6'} - deprecated: This package is no longer supported. - - function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.5: - resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} engines: {node: '>= 0.4'} functions-have-names@1.2.3: @@ -2922,10 +3239,9 @@ packages: gauge@3.0.2: resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} engines: {node: '>=10'} - deprecated: This package is no longer supported. - generate-password@1.7.0: - resolution: {integrity: sha512-WPCtlfy0jexf7W5IbwxGUgpIDvsZIohbI2DAq2Q6TSlKKis+G4GT9sxvPxrZUGL8kP6WUXMWNqYnxY6DDKAdFA==} + generate-password@1.7.1: + resolution: {integrity: sha512-9bVYY+16m7W7GczRBDqXE+VVuCX+bWNrfYKC/2p2JkZukFb2sKxT6E3zZ3mJGz7GMe5iRK0A/WawSL3jQfJuNQ==} gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} @@ -2935,11 +3251,8 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-intrinsic@1.2.1: - resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} - - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} get-package-type@0.1.0: @@ -2950,6 +3263,10 @@ packages: resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} engines: {node: '>=8'} + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + get-stream@5.2.0: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} @@ -2958,12 +3275,12 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} - get-symbol-description@1.0.0: - resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-uri@6.0.2: - resolution: {integrity: sha512-5KLucCJobh8vBY1K07EFV4+cPZH3mrV9YeAruUseCQKHB58SGjjT2l9/eA9LD082IiuMjSlFJEcdJ27TXvbZNw==} + get-uri@6.0.5: + resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} engines: {node: '>= 14'} getpass@0.1.7: @@ -2980,32 +3297,32 @@ packages: glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported glob@9.3.5: resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} engines: {node: '>=16 || 14 >=14.17'} - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - - globals@13.20.0: - resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} - globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -3025,14 +3342,10 @@ packages: har-validator@5.1.5: resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} engines: {node: '>=6'} - deprecated: this library is no longer supported - - has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} @@ -3042,31 +3355,24 @@ packages: resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==} engines: {node: '>=8'} - has-property-descriptors@1.0.0: - resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} - has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} engines: {node: '>= 0.4'} - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} - has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} has-unicode@2.0.1: resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - hasha@2.2.0: resolution: {integrity: sha512-jZ38TU/EBiGKrmyTNNZgnvCZHNowiRI4+w/I9noMlekHTZH3KyGgvJLmhSgykeAQ9j2SYPDosM0Bg3wHfzibAQ==} engines: {node: '>=0.10.0'} @@ -3075,17 +3381,10 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - helmet@7.1.0: - resolution: {integrity: sha512-g+HZqgfbpXdCkme/Cd/mZkV0aV3BZZZSugecH03kl38m/Kmdx8jKjBikpDj2cr+Iynv4KpYEviojNdTJActJAg==} + helmet@7.2.0: + resolution: {integrity: sha512-ZRiwvN089JfMXokizgqEPXsl2Guk094yExfoDXR0cBYWxtBbaSww/w+vT4WEJsBW2iTUi1GgZ6swmoug3Oy4Xw==} engines: {node: '>=16.0.0'} - hexoid@1.0.0: - resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} - engines: {node: '>=8'} - - highlight.js@10.7.3: - resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} - hpagent@0.1.2: resolution: {integrity: sha512-ePqFXHtSQWAFXYmj+JtOTHr84iNrII4/QRlAAPPE+zqnKy4xJo7Ie1Y4kC7AdB+LxLxSTTzBMASsEcy0q8YyvQ==} @@ -3095,11 +3394,10 @@ packages: html-pdf@3.0.1: resolution: {integrity: sha512-CKNSacmQn+CKJ2GNfT4UYKaPy/T3Ndj82yJ2aju/UPmnvWNjIpyumqRqkFU0mwT6BTHBFhFGTnXN8dBn4Bdj0Q==} engines: {node: '>=4.0.0'} - deprecated: Please migrate your projects to a newer library like puppeteer hasBin: true - html-to-image@1.11.11: - resolution: {integrity: sha512-9gux8QhvjRO/erSnDPv28noDZcPZmYE7e1vFsBLKLlRlKDSqNJYebj6Qz1TGd5lsRV+X+xYyjCKjuZdABinWjA==} + html-to-image@1.11.13: + resolution: {integrity: sha512-cuOPoI7WApyhBElTTb9oqsawRvZ0rHhaHwghRLlTuffoD1B2aDemlCruLeZrUIIdvG7gs9xeELEPm6PhuASqrg==} http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} @@ -3108,30 +3406,26 @@ packages: http-headers@3.0.2: resolution: {integrity: sha512-87E1I+2Wg4dxxz4rcxElo3dxO/w1ZtgL1yA0Sb6vH3qU16vRKq1NjWQv9SCY3ly2OQROcoxHZOUpmelS+k6wOw==} - http-proxy-agent@7.0.0: - resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==} + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} http-signature@1.2.0: resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} engines: {node: '>=0.8', npm: '>=1.3.7'} - http_ece@1.1.0: - resolution: {integrity: sha512-bptAfCDdPJxOs5zYSe7Y3lpr772s1G346R4Td5LgRUeCwIGpCGDUTJxRrhTNcAXbx37spge0kWEIH7QAYWNTlA==} - engines: {node: '>=4'} + http_ece@1.2.0: + resolution: {integrity: sha512-JrF8SSLVmcvc5NducxgyOrKXe3EsyHMgBFgSaIUGmArKe+rwr0uphRkRXvwiom3I+fpIfoItveHrfudL8/rxuA==} + engines: {node: '>=16'} https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} - https-proxy-agent@7.0.2: - resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==} + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} - human-signals@1.1.1: - resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} - engines: {node: '>=8.12.0'} - human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -3152,8 +3446,8 @@ packages: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} - idtoken-verifier@2.2.3: - resolution: {integrity: sha512-hhpzB+MRgEvbwqzRLFdVbG55lKdXQVfeYEjAA2qu0UC72MSLeR0nX7P7rY5Dycz1aISHPOwq80hIPFoJ/+SItA==} + idtoken-verifier@2.2.4: + resolution: {integrity: sha512-5t7O8cNHpJBB8FnwLD0qFZqy/+qGICObQKUl0njD6vXKHhpZPLEe8LU7qv/GBWB3Qv5e/wAIFHYVi4SoQwdOxQ==} ieee754@1.1.13: resolution: {integrity: sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==} @@ -3161,19 +3455,19 @@ packages: ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} import-in-the-middle@1.4.2: resolution: {integrity: sha512-9WOz1Yh/cvO/p69sxRmhyQwrIGGSp7EIdcb+fFNVi7CzQGQB8U1/1XrKVSbEd/GNOAeM0peJtmi7+qphe7NvAw==} - import-local@3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} engines: {node: '>=8'} hasBin: true @@ -3181,10 +3475,6 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} @@ -3194,42 +3484,37 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - inquirer@8.2.4: - resolution: {integrity: sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==} + inquirer@8.2.6: + resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} engines: {node: '>=12.0.0'} - inquirer@8.2.5: - resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} - engines: {node: '>=12.0.0'} + inquirer@9.2.15: + resolution: {integrity: sha512-vI2w4zl/mDluHt9YEQ/543VTCwPKWiHzKtm9dM2V0NdFcqEexDAjUHzO1oA60HRNaVifGXXM1tRRNluLVHa0Kg==} + engines: {node: '>=18'} - internal-slot@1.0.5: - resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} - interpret@1.4.0: - resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} - engines: {node: '>= 0.10'} - - ioredis@5.3.2: - resolution: {integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==} + ioredis@5.6.1: + resolution: {integrity: sha512-UxC0Yv1Y4WRJiGQxQkP0hfdL0/5/6YvdfOOClRgJ0qppSarkhneSa6UvkMkms0AkdGimSH3Ikqm+6mkMmX7vGA==} engines: {node: '>=12.22.0'} - ip@1.1.8: - resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==} - - ip@2.0.0: - resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} + ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} - is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} engines: {node: '>= 0.4'} - is-array-buffer@3.0.2: - resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} @@ -3237,36 +3522,46 @@ packages: is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.12.1: - resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==} + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} - is-core-module@2.15.1: - resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} engines: {node: '>= 0.4'} - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + is-finite@1.1.0: resolution: {integrity: sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==} engines: {node: '>=0.10.0'} @@ -3283,8 +3578,8 @@ packages: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} - is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} engines: {node: '>= 0.4'} is-glob@4.0.3: @@ -3298,21 +3593,22 @@ packages: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} - is-map@2.0.2: - resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} is-native@1.0.1: resolution: {integrity: sha512-I4z9hx+4u3/zyvpvGtAR+n7SodJugE+i2jiS8yfq1A9QAZY0KldLQz0SBptLC9ti7kBlpghWUwTKE2BA62eCcw==} - is-negative-zero@2.0.2: - resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} is-nil@1.0.1: resolution: {integrity: sha512-m2Rm8PhUFDNNhgvwZJjJG74a9h5CHU0fkA8WT+WGlCjyEbZ2jPwgb+ZxHu4np284EqNVyOsgppReK4qy/TwEwg==} - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} is-number@7.0.0: @@ -3323,15 +3619,17 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} - is-set@2.0.2: - resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} - is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} is-stream@1.1.0: resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} @@ -3345,16 +3643,16 @@ packages: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} engines: {node: '>= 0.4'} - is-typed-array@1.1.12: - resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} is-typedarray@1.0.0: @@ -3364,14 +3662,17 @@ packages: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} - is-weakmap@2.0.1: - resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} - is-weakset@2.0.2: - resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} @@ -3382,17 +3683,26 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isows@1.0.7: + resolution: {integrity: sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==} + peerDependencies: + ws: '*' + isstream@0.1.2: resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} - istanbul-lib-coverage@3.2.0: - resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} istanbul-lib-instrument@5.2.1: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} + engines: {node: '>=10'} + istanbul-lib-report@3.0.1: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} @@ -3401,24 +3711,32 @@ packages: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} - istanbul-reports@3.1.6: - resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} iterare@1.2.1: resolution: {integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==} engines: {node: '>=6'} - jest-changed-files@29.5.0: - resolution: {integrity: sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==} + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} + engines: {node: '>=10'} + hasBin: true + + jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-circus@29.6.2: - resolution: {integrity: sha512-G9mN+KOYIUe2sB9kpJkO9Bk18J4dTDArNFPwoZ7WKHKel55eKIS/u2bLthxgojwlf9NLCVQfgzM/WsOVvoC6Fw==} + jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-cli@29.6.2: - resolution: {integrity: sha512-TT6O247v6dCEX2UGHGyflMpxhnrL0DNqP2fRTKYm3nJJpCTfXX3GCMQPGFjXDoj0i5/Blp3jriKXFgdfmbYB6Q==} + jest-cli@29.7.0: + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: @@ -3427,8 +3745,8 @@ packages: node-notifier: optional: true - jest-config@29.6.2: - resolution: {integrity: sha512-VxwFOC8gkiJbuodG9CPtMRjBUNZEHxwfQXmIudSTzFWxaci3Qub1ddTRbFNQlD/zUeaifLndh/eDccFX4wCMQw==} + jest-config@29.7.0: + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@types/node': '*' @@ -3439,44 +3757,44 @@ packages: ts-node: optional: true - jest-diff@29.6.2: - resolution: {integrity: sha512-t+ST7CB9GX5F2xKwhwCf0TAR17uNDiaPTZnVymP9lw0lssa9vG+AFyDZoeIHStU3WowFFwT+ky+er0WVl2yGhA==} + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-docblock@29.4.3: - resolution: {integrity: sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==} + jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-each@29.6.2: - resolution: {integrity: sha512-MsrsqA0Ia99cIpABBc3izS1ZYoYfhIy0NNWqPSE0YXbQjwchyt6B1HD2khzyPe1WiJA7hbxXy77ZoUQxn8UlSw==} + jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-environment-node@29.6.2: - resolution: {integrity: sha512-YGdFeZ3T9a+/612c5mTQIllvWkddPbYcN2v95ZH24oWMbGA4GGS2XdIF92QMhUhvrjjuQWYgUGW2zawOyH63MQ==} + jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-get-type@29.4.3: - resolution: {integrity: sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==} + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-haste-map@29.6.2: - resolution: {integrity: sha512-+51XleTDAAysvU8rT6AnS1ZJ+WHVNqhj1k6nTvN2PYP+HjU3kqlaKQ1Lnw3NYW3bm2r8vq82X0Z1nDDHZMzHVA==} + jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-leak-detector@29.6.2: - resolution: {integrity: sha512-aNqYhfp5uYEO3tdWMb2bfWv6f0b4I0LOxVRpnRLAeque2uqOVVMLh6khnTcE2qJ5wAKop0HcreM1btoysD6bPQ==} + jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-matcher-utils@29.6.2: - resolution: {integrity: sha512-4LiAk3hSSobtomeIAzFTe+N8kL6z0JtF3n6I4fg29iIW7tt99R7ZcIFW34QkX+DuVrf+CUe6wuVOpm7ZKFJzZQ==} + jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-message-util@29.6.2: - resolution: {integrity: sha512-vnIGYEjoPSuRqV8W9t+Wow95SDp6KPX2Uf7EoeG9G99J2OVh7OSwpS4B6J0NfpEIpfkBNHlBZpA2rblEuEFhZQ==} + jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-mock@29.6.2: - resolution: {integrity: sha512-hoSv3lb3byzdKfwqCuT6uTscan471GUECqgNYykg6ob0yiAw3zYc7OrPnI9Qv8Wwoa4lC7AZ9hyS4AiIx5U2zg==} + jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} jest-pnp-resolver@1.2.3: @@ -3488,52 +3806,52 @@ packages: jest-resolve: optional: true - jest-regex-util@29.4.3: - resolution: {integrity: sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==} + jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-resolve-dependencies@29.6.2: - resolution: {integrity: sha512-LGqjDWxg2fuQQm7ypDxduLu/m4+4Lb4gczc13v51VMZbVP5tSBILqVx8qfWcsdP8f0G7aIqByIALDB0R93yL+w==} + jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-resolve@29.6.2: - resolution: {integrity: sha512-G/iQUvZWI5e3SMFssc4ug4dH0aZiZpsDq9o1PtXTV1210Ztyb2+w+ZgQkB3iOiC5SmAEzJBOHWz6Hvrd+QnNPw==} + jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-runner@29.6.2: - resolution: {integrity: sha512-wXOT/a0EspYgfMiYHxwGLPCZfC0c38MivAlb2lMEAlwHINKemrttu1uSbcGbfDV31sFaPWnWJPmb2qXM8pqZ4w==} + jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-runtime@29.6.2: - resolution: {integrity: sha512-2X9dqK768KufGJyIeLmIzToDmsN0m7Iek8QNxRSI/2+iPFYHF0jTwlO3ftn7gdKd98G/VQw9XJCk77rbTGZnJg==} + jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-snapshot@29.6.2: - resolution: {integrity: sha512-1OdjqvqmRdGNvWXr/YZHuyhh5DeaLp1p/F8Tht/MrMw4Kr1Uu/j4lRG+iKl1DAqUJDWxtQBMk41Lnf/JETYBRA==} + jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-util@29.6.2: - resolution: {integrity: sha512-3eX1qb6L88lJNCFlEADKOkjpXJQyZRiavX1INZ4tRnrBVr2COd3RgcTLyUiEXMNBlDU/cgYq6taUS0fExrWW4w==} + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-validate@29.6.2: - resolution: {integrity: sha512-vGz0yMN5fUFRRbpJDPwxMpgSXW1LDKROHfBopAvDcmD6s+B/s8WJrwi+4bfH4SdInBA5C3P3BI19dBtKzx1Arg==} + jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-watcher@29.6.2: - resolution: {integrity: sha512-GZitlqkMkhkefjfN/p3SJjrDaxPflqxEAv3/ik10OirZqJGYH5rPiIsgVcfof0Tdqg3shQGdEIxDBx+B4tuLzA==} + jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} jest-worker@27.5.1: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} - jest-worker@29.6.2: - resolution: {integrity: sha512-l3ccBOabTdkng8I/ORCkADz4eSMKejTYv1vB/Z83UiubqhC1oQ5Li6dWCyqOIvSifGjUBxuvxvlm6KGK2DtuAQ==} + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest@29.6.2: - resolution: {integrity: sha512-8eQg2mqFbaP7CwfsTpCxQ+sHzw1WuNWL5UUvjnWP4hx2riGz9fPSzYOaU5q8/GqWn1TfgZIVTqYJygbGbWAANg==} + jest@29.7.0: + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: @@ -3546,8 +3864,8 @@ packages: resolution: {integrity: sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==} engines: {node: '>= 0.6.0'} - jose@4.14.4: - resolution: {integrity: sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g==} + jose@4.15.9: + resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==} js-cookie@2.2.1: resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} @@ -3569,11 +3887,14 @@ packages: jsbn@1.1.0: resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} hasBin: true + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} @@ -3595,7 +3916,6 @@ packages: json2csv@5.0.7: resolution: {integrity: sha512-YRZbUnyaJZLZUJSRi2G/MqahCyRv9n/ds+4oIetjDF3jWQA7AG7iSeKTiZiCNqtMZM7HDyt0e/W6lEnoGEmMGA==} engines: {node: '>= 10', npm: '>= 6.13.0'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. hasBin: true json5@1.0.2: @@ -3607,15 +3927,15 @@ packages: engines: {node: '>=6'} hasBin: true - jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + jsonc-parser@3.2.1: + resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} jsonfile@2.4.0: resolution: {integrity: sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==} - jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} @@ -3623,26 +3943,22 @@ packages: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} - jsonwebtoken@9.0.0: - resolution: {integrity: sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==} - engines: {node: '>=12', npm: '>=6'} - - jsonwebtoken@9.0.1: - resolution: {integrity: sha512-K8wx7eJ5TPvEjuiVSkv167EVboBDv9PZdDoF7BgeQnBLVvZWW9clr2PsQHVJDTKaEIH5JBIwHujGcHp7GgI2eg==} + jsonwebtoken@9.0.2: + resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} engines: {node: '>=12', npm: '>=6'} jsprim@1.4.2: resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} engines: {node: '>=0.6.0'} - jwa@1.4.1: - resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + jwa@1.4.2: + resolution: {integrity: sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==} - jwa@2.0.0: - resolution: {integrity: sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==} + jwa@2.0.1: + resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} - jwks-rsa@3.0.1: - resolution: {integrity: sha512-UUOZ0CVReK1QVU3rbi9bC7N5/le8ziUj0A2ef1Q0M7OPD2KvjEYizptqIxGIo6fSLYDkqBrazILS18tYuRc8gw==} + jwks-rsa@3.2.0: + resolution: {integrity: sha512-PwchfHcQK/5PSydeKCs1ylNym0w/SSv8a62DgHJ//7x2ZclCoinlsjAfDxAAbpoTPybOum/Jgy+vkvMmKz89Ww==} engines: {node: '>=14'} jws@3.2.2: @@ -3654,6 +3970,9 @@ packages: kew@0.7.0: resolution: {integrity: sha512-IG6nm0+QtAMdXt9KvbgbGdvY50RSrw+U4sGZg+KlrSKPJEwVE5JVoI3d7RWfSMdBQneRheeAOj3lIjX5VL/9RQ==} + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + klaw@1.3.1: resolution: {integrity: sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==} @@ -3672,8 +3991,8 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - libphonenumber-js@1.10.39: - resolution: {integrity: sha512-iPMM/NbSNIrdwbr94rAOos6krB7snhfzEptmk/DJUtTPs+P9gOhZ1YXVPcRgjpp3jJByclfm/Igvz45spfJK7g==} + libphonenumber-js@1.12.10: + resolution: {integrity: sha512-E91vHJD61jekHHR/RF/E83T/CMoaLXT7cwYA75T4gim4FZjnM6hbJjVIGg7chqlSqRsSvQ3izGmOjHy1SQzcGQ==} lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} @@ -3691,17 +4010,17 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - lint-staged@13.2.3: - resolution: {integrity: sha512-zVVEXLuQIhr1Y7R7YAWx4TZLdvuzk7DnmrsTNL0fax6Z3jrpFcas+vKbzxhhvp6TA55m1SQuWkpzI1qbfDZbAg==} - engines: {node: ^14.13.1 || >=16.0.0} + lint-staged@13.3.0: + resolution: {integrity: sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ==} + engines: {node: ^16.14.0 || >=18.0.0} hasBin: true listenercount@1.0.1: resolution: {integrity: sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==} - listr2@5.0.8: - resolution: {integrity: sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==} - engines: {node: ^14.13.1 || >=16.0.0} + listr2@6.6.1: + resolution: {integrity: sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==} + engines: {node: '>=16.0.0'} peerDependencies: enquirer: '>= 2.3.0 < 3' peerDependenciesMeta: @@ -3729,9 +4048,27 @@ packages: lodash.get@4.4.2: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + lodash.isarguments@3.1.0: resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} + lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + + lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + + lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} @@ -3741,6 +4078,9 @@ packages: lodash.omit@4.5.0: resolution: {integrity: sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==} + lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} @@ -3751,20 +4091,19 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} - log-update@4.0.0: - resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} - engines: {node: '>=10'} + log-update@5.0.1: + resolution: {integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - logform@2.6.1: - resolution: {integrity: sha512-CdaO738xRapbKIMVn2m4F6KTj4j7ooJ8POVnebSgKo3KBz5axNXRAL7ZdRjIV6NOr2Uf4vjtRkxrFETOioCqSA==} + logform@2.7.0: + resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} engines: {node: '>= 12.0.0'} - lru-cache@10.2.0: - resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} - engines: {node: 14 || >=16.14} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@4.0.2: - resolution: {integrity: sha512-uQw9OqphAGiZhkuPlpFGmdTU2tEuhxTourM/19qGJrxBPHAr/f8BT1a0i/lOclESnGatdJG/UCkP9kZB/Lh1iw==} + lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -3777,19 +4116,19 @@ packages: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} - lru-memoizer@2.2.0: - resolution: {integrity: sha512-QfOZ6jNkxCcM/BkIPnFsqDhtrazLRsghi9mBwFAzol5GCvj4EkFT899Za3+QwikCg5sRX8JstioBDwOxEyzaNw==} + lru-memoizer@2.3.0: + resolution: {integrity: sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==} - luxon@3.4.4: - resolution: {integrity: sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==} + luxon@3.3.0: + resolution: {integrity: sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==} engines: {node: '>=12'} - macos-release@2.5.1: - resolution: {integrity: sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==} - engines: {node: '>=6'} + luxon@3.7.1: + resolution: {integrity: sha512-RkRWjA926cTvz5rAb1BqyWkKbbjzCGchDUIKMCUvNi17j6f6j8uHGDV82Aqcqtzd+icoYpELmG3ksgGiFNNcNg==} + engines: {node: '>=12'} - magic-string@0.30.0: - resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} + magic-string@0.30.8: + resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} engines: {node: '>=12'} make-dir@3.1.0: @@ -3809,6 +4148,10 @@ packages: mapcap@1.0.0: resolution: {integrity: sha512-KcNlZSlFPx+r1jYZmxEbTVymG+dIctf10WmWkuhrhrblM+KMoF77HelwihL5cxYlORye79KoR4IlOOk99lUJ0g==} + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + measured-core@1.51.1: resolution: {integrity: sha512-DZQP9SEwdqqYRvT2slMK81D/7xwdxXosZZBtLVfPSo6y5P672FBTbzHVdN4IQyUkUpcVOR9pIvtUy5Ryl7NKyg==} engines: {node: '>= 5.12'} @@ -3825,8 +4168,8 @@ packages: resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} engines: {node: '>= 4.0.0'} - merge-descriptors@1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -3839,8 +4182,12 @@ packages: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} - micromatch@4.0.7: - resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} mime-db@1.52.0: @@ -3875,10 +4222,22 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + minimatch@8.0.4: resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -3894,8 +4253,8 @@ packages: resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} engines: {node: '>=8'} - minipass@7.0.2: - resolution: {integrity: sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==} + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} minizlib@2.1.2: @@ -3917,17 +4276,17 @@ packages: engines: {node: '>=10'} hasBin: true - module-details-from-path@1.0.3: - resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==} + module-details-from-path@1.0.4: + resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} - moment@2.29.3: - resolution: {integrity: sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==} + moment@2.30.1: + resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} monitor-event-loop-delay@1.0.0: resolution: {integrity: sha512-YRIr1exCIfBDLZle8WHOfSo7Xg3M+phcZfq9Fx1L6Abo+atGp7cge5pM7PjyBn4s1oZI/BRD4EMrzQBbPpVb5Q==} - morgan@1.10.0: - resolution: {integrity: sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==} + morgan@1.10.1: + resolution: {integrity: sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==} engines: {node: '>= 0.8.0'} ms@2.0.0: @@ -3939,39 +4298,37 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - msgpackr-extract@3.0.2: - resolution: {integrity: sha512-SdzXp4kD/Qf8agZ9+iTu6eql0m3kWm1A2y1hkpTeVNENutaB0BwHlSvAIaMxwntmRUAUjon2V4L8Z/njd0Ct8A==} + msgpackr-extract@3.0.3: + resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} hasBin: true - msgpackr@1.9.6: - resolution: {integrity: sha512-50rmb6+ZWvEm0vJn8R8CwI1Eavss3h5rgtKrcdUal3EkZcpqw82+xsmc7RoHb8fYB5V4EOU2NDaOitDAdO0t+w==} - - multer@1.4.4-lts.1: - resolution: {integrity: sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg==} - engines: {node: '>= 6.0.0'} + msgpackr@1.11.5: + resolution: {integrity: sha512-UjkUHN0yqp9RWKy0Lplhh+wlpdt9oQBYgULZOiFhV3VclSF1JnSQWZ5r9gORQlNYaUKQoR8itv7g7z1xDDuACA==} multer@1.4.5-lts.1: resolution: {integrity: sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==} engines: {node: '>= 6.0.0'} + multer@2.0.2: + resolution: {integrity: sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==} + engines: {node: '>= 10.16.0'} + mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} nanoid@4.0.2: resolution: {integrity: sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==} engines: {node: ^14 || ^16 || >=18} hasBin: true - nats@2.15.1: - resolution: {integrity: sha512-MMCQXxOLv3dUwh0CRai0RGdMdAHjA3LNOYEAdNkLT8GX4CJFVKlYqkM3K9qVkYhvWwiCUVPHWFSktcrhexSzSw==} + nats@2.29.3: + resolution: {integrity: sha512-tOQCRCwC74DgBTk4pWZ9V45sk4d7peoE2njVprMRCBXrhJ5q5cYM7i6W+Uvw2qUrcfOSnuisrX7bEx3b3Wx4QA==} engines: {node: '>= 14.0.0'} - natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -3982,8 +4339,8 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - nestjs-cls@4.4.1: - resolution: {integrity: sha512-4yhldwm/cJ02lQ8ZAdM8KQ7gMfjAc1z3fo5QAQgXNyN4N6X5So9BCwv+BTLRugDCkELUo3qtzQHnKhGYL/ftPg==} + nestjs-cls@4.5.0: + resolution: {integrity: sha512-oi3GNCc5pnsnVI5WJKMDwmg4NP+JyEw+edlwgepyUba5+RGGtJzpbVaaxXGW1iPbDuQde3/fA8Jdjq9j88BVcQ==} engines: {node: '>=16'} peerDependencies: '@nestjs/common': '> 7.0.0 < 11' @@ -3997,10 +4354,10 @@ packages: nestjs-supabase-auth@1.0.9: resolution: {integrity: sha512-1Aar5K2WuGggPV8q/xzJCIeAQz5wkPcvKGLPTUXwt1he1EKLg+OdWK2C0T7LzTgO4uX2WLakNWZBsUTZEOvt4Q==} - nestjs-typeorm-paginate@4.0.4: - resolution: {integrity: sha512-arinWDc78wPV/EYWMmLYyeMSE5Lae1FHWD/2QpOdTmHaOVqK4PYf19EqZBqT9gbbPugkNW9JAMz3G2WmvSgR/A==} + nestjs-typeorm-paginate@4.1.0: + resolution: {integrity: sha512-IzMbLDrWmpi/+UIScPYsWN6kDJ6OaI/TSU3MgZr6hL9ELeDN2Fq3jhtpsvKwKYSSk80M2t6jx/ESQwsitFrl4A==} peerDependencies: - '@nestjs/common': ^6.1.1 || ^5.6.2 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 + '@nestjs/common': ^6.1.1 || ^5.6.2 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 typeorm: ^0.3.0 netmask@2.0.2: @@ -4010,11 +4367,8 @@ packages: next-line@1.1.0: resolution: {integrity: sha512-+I10J3wKNoKddNxn0CNpoZ3eTZuqxjNM3b1GImVx22+ePI+Y15P8g/j3WsbP0fhzzrFzrtjOAoq5NCCucswXOQ==} - next-tick@1.1.0: - resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - - nkeys.js@1.0.5: - resolution: {integrity: sha512-u25YnRPHiGVsNzwyHnn+PT90sgAhnS8jUJ1nxmkHMFYCJ6+Ic0lv291w7uhRBpJVJ3PH2GWbYqA151lGCRrB5g==} + nkeys.js@1.1.0: + resolution: {integrity: sha512-tB/a0shZL5UZWSwsoeyqfTszONTt4k2YS0tuQioMOD180+MbombYVgzDUYHlx+gejYK6rgf08n/2Df99WY0Sxg==} engines: {node: '>=10.0.0'} node-abort-controller@3.1.1: @@ -4026,8 +4380,8 @@ packages: node-emoji@1.11.0: resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} - node-fetch@2.6.12: - resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} peerDependencies: encoding: ^0.1.0 @@ -4035,12 +4389,8 @@ packages: encoding: optional: true - node-gyp-build-optional-packages@5.0.7: - resolution: {integrity: sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w==} - hasBin: true - - node-gyp-build@4.6.0: - resolution: {integrity: sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==} + node-gyp-build-optional-packages@5.2.2: + resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} hasBin: true node-html-to-image@4.0.0: @@ -4053,8 +4403,8 @@ packages: resolution: {integrity: sha512-Xoxe53XsEriaVLWJTl3YtHE54qaZnO2GeoNKKALLy6cKUAjYZuFlTaNCcsVkfoIbZv2YYWuggeuqhTQ1XPbvgw==} engines: {node: '>=10.17.0'} - node-releases@2.0.13: - resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} nopt@5.0.0: resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} @@ -4069,13 +4419,12 @@ packages: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} - npm-run-path@5.1.0: - resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} npmlog@5.0.1: resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} - deprecated: This package is no longer supported. oauth-sign@0.9.0: resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} @@ -4094,34 +4443,36 @@ packages: object-identity-map@1.0.2: resolution: {integrity: sha512-a2XZDGyYTngvGS67kWnqVdpoaJWsY7C1GhPJvejWAFCsUioTAaiTu8oBad7c6cI4McZxr4CmvnZeycK05iav5A==} - object-inspect@1.12.3: - resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} - object-is@1.1.5: - resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} + object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} engines: {node: '>= 0.4'} object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} - object.assign@4.1.4: - resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} - object.entries@1.1.8: - resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} + object.entries@1.1.9: + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} engines: {node: '>= 0.4'} - object.fromentries@2.0.6: - resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} engines: {node: '>= 0.4'} - object.groupby@1.0.0: - resolution: {integrity: sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==} + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} - object.values@1.1.6: - resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} on-finished@2.3.0: @@ -4132,8 +4483,8 @@ packages: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} - on-headers@1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + on-headers@1.1.0: + resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==} engines: {node: '>= 0.8'} once@1.4.0: @@ -4153,8 +4504,8 @@ packages: optional-js@2.3.0: resolution: {integrity: sha512-B0LLi+Vg+eko++0z/b8zIv57kp7HKEzaPJo7LowJXMUKYdf+3XJGu/cw03h/JhIOsLnP+cG5QnTHAuicjA5fMw==} - optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} ora@5.4.1: @@ -4164,14 +4515,14 @@ packages: original-url@1.2.3: resolution: {integrity: sha512-BYm+pKYLtS4mVe/mgT3YKGtWV5HzN/XKiaIu1aK4rsxyjuHeTW9N+xVBEpJcY1onB3nccfH0RbzUEoimMqFUHQ==} - os-name@4.0.1: - resolution: {integrity: sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==} - engines: {node: '>=10'} - os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -4188,30 +4539,26 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} - p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - pac-proxy-agent@7.0.1: - resolution: {integrity: sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==} + pac-proxy-agent@7.2.0: + resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} engines: {node: '>= 14'} - pac-resolver@7.0.0: - resolution: {integrity: sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==} + pac-resolver@7.0.1: + resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} engines: {node: '>= 14'} - packet-reader@1.0.0: - resolution: {integrity: sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==} + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} pako@0.2.9: resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} - papaparse@5.4.1: - resolution: {integrity: sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==} + papaparse@5.5.3: + resolution: {integrity: sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A==} parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} @@ -4221,15 +4568,6 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} - parse5-htmlparser2-tree-adapter@6.0.1: - resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} - - parse5@5.1.1: - resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==} - - parse5@6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -4268,15 +4606,15 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} - path-to-regexp@0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} - path-to-regexp@3.2.0: - resolution: {integrity: sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==} + path-to-regexp@3.3.0: + resolution: {integrity: sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==} path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} @@ -4297,31 +4635,31 @@ packages: performance-now@2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} - pg-cloudflare@1.1.1: - resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} + pg-cloudflare@1.2.7: + resolution: {integrity: sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==} - pg-connection-string@2.6.2: - resolution: {integrity: sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==} + pg-connection-string@2.9.1: + resolution: {integrity: sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==} pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} engines: {node: '>=4.0.0'} - pg-pool@3.6.1: - resolution: {integrity: sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==} + pg-pool@3.10.1: + resolution: {integrity: sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==} peerDependencies: pg: '>=8.0' - pg-protocol@1.6.0: - resolution: {integrity: sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==} + pg-protocol@1.10.3: + resolution: {integrity: sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==} pg-types@2.2.0: resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} engines: {node: '>=4'} - pg@8.11.2: - resolution: {integrity: sha512-l4rmVeV8qTIrrPrIR3kZQqBgSN93331s9i6wiUiLOSk0Q7PmUxZD/m1rQI622l3NfqBby9Ar5PABfS/SulfieQ==} - engines: {node: '>= 8.0.0'} + pg@8.16.3: + resolution: {integrity: sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==} + engines: {node: '>= 16.0.0'} peerDependencies: pg-native: '>=3.0.1' peerDependenciesMeta: @@ -4336,13 +4674,17 @@ packages: deprecated: this package is now deprecated hasBin: true - picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.1: + resolution: {integrity: sha512-xUXwsxNjwTQ8K3GnT4pCJm+xq3RUPQbmkYJTP5aFIfNIvbcc/4MUxgBaaRSZJ6yGJZiGSyYlM6MzwTsRk8SYCg==} + engines: {node: '>=12'} + pidtree@0.6.0: resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} engines: {node: '>=0.10'} @@ -4363,8 +4705,8 @@ packages: resolution: {integrity: sha512-iuhEDel3Z3hF9Jfe44DPXR8l07bhjuFY3GMHIXbjnY9XcafbyDDwl2sN2vw2GjMPf5Nkoe+OFao7ffn9SXaKDg==} hasBin: true - pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} pkg-dir@4.2.0: @@ -4382,6 +4724,10 @@ packages: resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} engines: {node: '>=10.13.0'} + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + postgres-array@2.0.0: resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} engines: {node: '>=4'} @@ -4406,17 +4752,17 @@ packages: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} - prettier@3.0.1: - resolution: {integrity: sha512-fcOWSnnpCrovBsmFZIGIy9UqK2FaI7Hqax+DIO0A9UxeVoY4iweyaFjS5TavZN97Hfehph0nhsZnjlVKzEQSrQ==} + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} engines: {node: '>=14'} hasBin: true - pretty-format@29.6.2: - resolution: {integrity: sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==} + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - prisma@5.1.1: - resolution: {integrity: sha512-WJFG/U7sMmcc6TjJTTifTfpI6Wjoh55xl4AzopVwAdyK68L9/ogNo8QQ2cxuUjJf/Wa82z/uhyh3wMzvRIBphg==} + prisma@5.22.0: + resolution: {integrity: sha512-vtpjW3XuYCSnMsNVBjLMNkTj6OZbudcPPTPYHqX0CJfpcdWciI1dM8uHETwmDxxiqEwCIE6WvXucWUetJgfu/A==} engines: {node: '>=16.13'} hasBin: true @@ -4467,17 +4813,17 @@ packages: pseudomap@1.0.2: resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} - pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} punycode@1.3.2: resolution: {integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==} - punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} puppeteer-cluster@0.23.0: @@ -4489,33 +4835,33 @@ packages: resolution: {integrity: sha512-E8eWLGhaZZpa7dYe/58qGX7SLb4mTg42NP5M7B+ibPrncgNjTOQa9x1sFIlTn1chF/BmoZqOcMIvwuxcb/9XzQ==} engines: {node: '>=16.3.0'} - puppeteer-core@21.5.0: - resolution: {integrity: sha512-qG0RJ6qKgFz09UUZxDB9IcyTJGypQXMuE8WmEoHk7kgjutmRiOVv5RgsyUkY67AxDdBWx21bn1PHHRJnO/6b4A==} - engines: {node: '>=16.3.0'} + puppeteer-core@21.11.0: + resolution: {integrity: sha512-ArbnyA3U5SGHokEvkfWjW+O8hOxV1RSJxOgriX/3A4xZRqixt9ZFHD0yPgZQF05Qj0oAqi8H/7stDorjoHY90Q==} + engines: {node: '>=16.13.2'} puppeteer@21.0.1: resolution: {integrity: sha512-KTjmSdPZ6bMkq3EbAzAUhcB3gMDXvdwd6912rxG9hNtjwRJzHSA568vh6vIbO2WQeNmozRdt1LtiUMLSWfeMrg==} engines: {node: '>=16.3.0'} - deprecated: < 22.6.4 is no longer supported - puppeteer@21.5.0: - resolution: {integrity: sha512-prvy9rdauyIaaEgefQRcw9zhQnYQbl8O1Gj5VJazKJ7kwNx703+Paw/1bwA+b96jj/S+r55hrmF5SfiEG5PUcg==} - engines: {node: '>=16.3.0'} + puppeteer@21.11.0: + resolution: {integrity: sha512-9jTHuYe22TD3sNxy0nEIzC7ZrlRnDgeX3xPkbS7PnbdwYjl2o/z/YuCrRBwezdKpbTDTJ4VqIggzNyeRcKq3cg==} + engines: {node: '>=16.13.2'} + hasBin: true - pure-rand@6.0.2: - resolution: {integrity: sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==} + pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} - qrcode@1.5.3: - resolution: {integrity: sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==} + qrcode@1.5.4: + resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} engines: {node: '>=10.13.0'} hasBin: true - qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} - qs@6.11.2: - resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} engines: {node: '>=0.6'} qs@6.5.3: @@ -4525,14 +4871,10 @@ packages: querystring@0.2.0: resolution: {integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==} engines: {node: '>=0.4.x'} - deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - queue-tick@1.0.1: - resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} - quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} @@ -4546,16 +4888,12 @@ packages: rate-limiter-flexible@2.1.10: resolution: {integrity: sha512-Pa+8TPD4xYaiCUB5K4a/+j2FHDUe4HP1g49JmKEmkOkhqPaeVqxJsZuuVaza/svSCOT+V73vtsyBiSFK/e1yXw==} - raw-body@2.5.1: - resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} - engines: {node: '>= 0.8'} - raw-body@2.5.2: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} - react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -4564,17 +4902,12 @@ packages: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} - readable-stream@4.5.2: - resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} - rechoir@0.6.2: - resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} - engines: {node: '>= 0.10'} + readline@1.3.0: + resolution: {integrity: sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==} redis-commands@1.7.0: resolution: {integrity: sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==} @@ -4591,14 +4924,15 @@ packages: resolution: {integrity: sha512-grn5KoZLr/qrRQVwoSkmzdbw6pwF+/rwODtrOr6vuBRiR/f3rjSTGupbF90Zpqm2oenix8Do6RV7pYEkGwlKkw==} engines: {node: '>=10'} - reflect-metadata@0.1.13: - resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} + reflect-metadata@0.1.14: + resolution: {integrity: sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==} - regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} - regexp.prototype.flags@1.5.0: - resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} regexpp@3.2.0: @@ -4618,7 +4952,6 @@ packages: request@2.88.2: resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} engines: {node: '>= 6'} - deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} @@ -4628,8 +4961,8 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - require-in-the-middle@7.4.0: - resolution: {integrity: sha512-X34iHADNbNDfr6OTStIAHWSAvvKQRYgLO6duASaVf7J2VA3lvmNYboAHOuLC2huav1IwgZJtyEcJCKVzFxOSMQ==} + require-in-the-middle@7.5.2: + resolution: {integrity: sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==} engines: {node: '>=8.6.0'} require-main-filename@2.0.0: @@ -4647,26 +4980,23 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - resolve.exports@2.0.2: - resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + resolve.exports@2.0.3: + resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} engines: {node: '>=10'} - resolve@1.22.2: - resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} - hasBin: true - - resolve@1.22.3: - resolution: {integrity: sha512-P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw==} - hasBin: true - - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} hasBin: true restore-cursor@3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} + restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + restructure@2.0.1: resolution: {integrity: sha512-e0dOpjm5DseomnXx2M5lpdZ5zoHqF1+bqdMJUohoYVVQa7cBdnk7fdmeI6byNWP/kiME72EeTiSypTCVnpLiDg==} @@ -4674,21 +5004,19 @@ packages: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rfdc@1.3.0: - resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} rimraf@2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} - deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rimraf@4.4.1: @@ -4703,14 +5031,21 @@ packages: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} + run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + engines: {node: '>=0.12.0'} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} - safe-array-concat@1.0.0: - resolution: {integrity: sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==} + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} safe-buffer@5.1.2: @@ -4719,8 +5054,13 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-regex-test@1.0.0: - resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} safe-stable-stringify@2.5.0: resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} @@ -4732,13 +5072,17 @@ packages: sax@1.2.1: resolution: {integrity: sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==} - sax@1.2.4: - resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} schema-utils@3.3.0: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} + schema-utils@4.3.2: + resolution: {integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==} + engines: {node: '>= 10.13.0'} + secure-json-parse@2.7.0: resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} @@ -4746,20 +5090,20 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} engines: {node: '>=10'} hasBin: true - send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} - serialize-javascript@6.0.1: - resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} set-blocking@2.0.0: @@ -4769,14 +5113,23 @@ packages: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - sha.js@2.4.11: - resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + sha.js@2.4.12: + resolution: {integrity: sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==} + engines: {node: '>= 0.10'} hasBin: true shallow-clone-shim@2.0.0: @@ -4790,17 +5143,29 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shelljs@0.8.5: - resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} - engines: {node: '>=4'} - hasBin: true + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} - side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} @@ -4811,14 +5176,6 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - slice-ansi@3.0.0: - resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} - engines: {node: '>=8'} - - slice-ansi@4.0.0: - resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} - engines: {node: '>=10'} - slice-ansi@5.0.0: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} @@ -4827,28 +5184,28 @@ packages: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - socket.io-adapter@2.5.2: - resolution: {integrity: sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==} + socket.io-adapter@2.5.5: + resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==} - socket.io-client@4.7.1: - resolution: {integrity: sha512-Qk3Xj8ekbnzKu3faejo4wk2MzXA029XppiXtTF/PkbTg+fcwaTw1PlDrTrrrU4mKoYC4dvlApOnSeyLCKwek2w==} + socket.io-client@4.8.1: + resolution: {integrity: sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==} engines: {node: '>=10.0.0'} socket.io-parser@4.2.4: resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} engines: {node: '>=10.0.0'} - socket.io@4.7.1: - resolution: {integrity: sha512-W+utHys2w//dhFjy7iQQu9sGd3eokCjGbl2r59tyLqNiJJBdIebn3GAKEXBr3osqHTObJi2die/25bCx2zsaaw==} - engines: {node: '>=10.0.0'} + socket.io@4.8.1: + resolution: {integrity: sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==} + engines: {node: '>=10.2.0'} - socks-proxy-agent@8.0.2: - resolution: {integrity: sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==} + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} engines: {node: '>= 14'} - socks@2.7.1: - resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} - engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} + socks@2.8.6: + resolution: {integrity: sha512-pe4Y2yzru68lXCb38aAqRf5gvN8YdjP1lok5o0J7BOHljkyCGKVz7H3vpVIXKD27rj2giOJ7DwVyk/GWrPHDWA==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} sonic-boom@1.4.1: resolution: {integrity: sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg==} @@ -4867,6 +5224,10 @@ packages: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} @@ -4878,11 +5239,18 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + sql-highlight@6.1.0: + resolution: {integrity: sha512-ed7OK4e9ywpE7pgRMkMQmZDPKSVdm0oX5IEtZiKnFucSF0zu6c80GZBe38UqHuVhTWJ9xsKgSMjCG2bml86KvA==} + engines: {node: '>=14'} + sql-summary@1.0.1: resolution: {integrity: sha512-IpCr2tpnNkP3Jera4ncexsZUp0enJBLr+pHCyTweMUBrbJsTgQeLWx1FXLhoBj/MvcnUQpkgOn2EY8FKOkUzww==} - sshpk@1.17.0: - resolution: {integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==} + sshpk@1.18.0: + resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} engines: {node: '>=0.10.0'} hasBin: true @@ -4903,8 +5271,8 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} - stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} stream-chopper@3.0.1: @@ -4914,8 +5282,8 @@ packages: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} - streamx@2.15.2: - resolution: {integrity: sha512-b62pAV/aeMjUoRN2C/9F0n+G8AfcJjNC0zw/ZmOHeFsIe4m4GzjVW9m6VHXVjk536NbdU9JRwKMJRfkc+zUFTg==} + streamx@2.22.1: + resolution: {integrity: sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==} string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} @@ -4933,15 +5301,17 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string.prototype.trim@1.2.7: - resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} engines: {node: '>= 0.4'} - string.prototype.trimend@1.0.6: - resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} - string.prototype.trimstart@1.0.6: - resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -4977,24 +5347,22 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - superagent@7.1.5: - resolution: {integrity: sha512-HQYyGuDRFGmZ6GNC4hq2f37KnsY9Lr0/R1marNZTgMweVDQLTLJJ6DGQ9Tj/xVVs5HEnop9EMmTbywb5P30aqw==} + strtok3@10.3.4: + resolution: {integrity: sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==} + engines: {node: '>=18'} + + superagent@7.1.6: + resolution: {integrity: sha512-gZkVCQR1gy/oUXr+kxJMLDjla434KmSOKbx5iGD30Ql+AkJQ/YlPKECJy2nhqOsHLjGHzoDTXNSjhnvWhzKk7g==} engines: {node: '>=6.4.0 <13 || >=14'} - deprecated: Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.net - superagent@8.0.9: - resolution: {integrity: sha512-4C7Bh5pyHTvU33KpZgwrNKh/VQnvgtCSqPRfJAUdmrtSYePVzVg4E4OzsrbkhJj9O7SO6Bnv75K/F8XVZT8YHA==} + superagent@8.1.2: + resolution: {integrity: sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==} engines: {node: '>=6.4.0 <13 || >=14'} - deprecated: Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.net - 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'} - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -5007,14 +5375,14 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - swagger-ui-dist@5.1.0: - resolution: {integrity: sha512-c1KmAjuVODxw+vwkNLALQZrgdlBAuBbr2xSPfYrJgseEi7gFKcTvShysPmyuDI4kcUa1+5rFpjWvXdusKY74mg==} + swagger-ui-dist@5.17.14: + resolution: {integrity: sha512-CVbSfaLpstV65OnSjbXfVd6Sta3q3F7Cj/yYuvHMp1P90LztOLs6PfUnKEVAeiIVQt9u2SaPwv0LiH/OyMjHRw==} - swagger-ui-dist@5.3.1: - resolution: {integrity: sha512-El78OvXp9zMasfPrshtkW1CRx8AugAKoZuGGOTW+8llJzOV1RtDJYqQRz/6+2OakjeWWnZuRlN2Qj1Y0ilux3w==} + swagger-ui-dist@5.27.0: + resolution: {integrity: sha512-tS6LRyBhY6yAqxrfsA9IYpGWPUJOri6sclySa7TdC7XQfGLvTwDY531KLgfQwHEtQsn+sT4JlUspbeQDBVGWig==} - swagger-ui-express@5.0.0: - resolution: {integrity: sha512-tsU9tODVvhyfkNSvf03E6FAk+z+5cU3lXAzMy6Pv4av2Gt2xA0++fogwC4qo19XuFf6hdxevPuVCSKFuMHJhFA==} + swagger-ui-express@5.0.1: + resolution: {integrity: sha512-SrNU3RiBGTLLmFU8GIJdOdanJTl4TOmT27tt3bWWHppqYmAZ6IDuEuBvMU6nZq0zLEe6b/1rACXCgLZqO6ZfrA==} engines: {node: '>= v0.10.32'} peerDependencies: express: '>=4.0.0 || >=5.0.0-beta' @@ -5023,22 +5391,22 @@ packages: resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} engines: {node: '>=0.10'} - tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + tapable@2.2.2: + resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} engines: {node: '>=6'} tar-fs@3.0.4: resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==} - tar-stream@3.1.6: - resolution: {integrity: sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==} + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} - tar@6.1.15: - resolution: {integrity: sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==} + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} - terser-webpack-plugin@5.3.9: - resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} + terser-webpack-plugin@5.3.14: + resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==} engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' @@ -5053,8 +5421,8 @@ packages: uglify-js: optional: true - terser@5.19.2: - resolution: {integrity: sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==} + terser@5.43.1: + resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==} engines: {node: '>=10'} hasBin: true @@ -5062,21 +5430,17 @@ packages: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} + text-decoder@1.2.3: + resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} + text-hex@1.0.0: resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - - thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - - throttleit@1.0.0: - resolution: {integrity: sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==} + throttleit@1.0.1: + resolution: {integrity: sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==} through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} @@ -5091,9 +5455,9 @@ packages: tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} + to-buffer@1.2.1: + resolution: {integrity: sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==} + engines: {node: '>= 0.4'} to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} @@ -5106,6 +5470,10 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + token-types@6.0.4: + resolution: {integrity: sha512-MD9MjpVNhVyH4fyd5rKphjvt/1qj+PtQUz65aFqAZA6XniWAuSFRjLk3e2VALEFlh9OwBpXUN7rfeqSnT/Fmkw==} + engines: {node: '>=14.16'} + tough-cookie@2.5.0: resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} engines: {node: '>=0.8'} @@ -5127,42 +5495,48 @@ packages: resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} engines: {node: '>= 14.0.0'} - ts-api-utils@1.0.1: - resolution: {integrity: sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==} - engines: {node: '>=16.13.0'} + ts-api-utils@1.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} + engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' - ts-jest@29.1.1: - resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + ts-jest@29.4.0: + resolution: {integrity: sha512-d423TJMnJGu80/eSgfQ5w/R+0zFJvdtTxwtF9KzFFunOpSeD+79lHJQIiAhluJoyGRbvj9NZJsl9WjCUo0ND7Q==} + engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 + '@jest/transform': ^29.0.0 || ^30.0.0 + '@jest/types': ^29.0.0 || ^30.0.0 + babel-jest: ^29.0.0 || ^30.0.0 esbuild: '*' - jest: ^29.0.0 + jest: ^29.0.0 || ^30.0.0 + jest-util: ^29.0.0 || ^30.0.0 typescript: '>=4.3 <6' peerDependenciesMeta: '@babel/core': optional: true + '@jest/transform': + optional: true '@jest/types': optional: true babel-jest: optional: true esbuild: optional: true + jest-util: + optional: true - ts-loader@9.4.4: - resolution: {integrity: sha512-MLukxDHBl8OJ5Dk3y69IsKVFRA/6MwzEqBgh+OXMPB/OD01KQuWPFd1WAQP8a5PeSCAxfnkhiuWqfmFJzJQt9w==} + ts-loader@9.5.2: + resolution: {integrity: sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw==} engines: {node: '>=12.0.0'} peerDependencies: typescript: '*' webpack: ^5.0.0 - ts-node@10.9.1: - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: '@swc/core': '>=1.2.50' @@ -5175,12 +5549,12 @@ packages: '@swc/wasm': optional: true - tsconfig-paths-webpack-plugin@4.1.0: - resolution: {integrity: sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==} + tsconfig-paths-webpack-plugin@4.2.0: + resolution: {integrity: sha512-zbem3rfRS8BgeNK50Zz5SIQgXzLafiHjOwUAvk/38/o1jHn/V5QAgVUcz884or7WYcPaH3N2CIfUc2u0ul7UcA==} engines: {node: '>=10.13.0'} - tsconfig-paths@3.14.2: - resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} tsconfig-paths@4.2.0: resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} @@ -5189,14 +5563,8 @@ packages: tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - tslib@2.6.0: - resolution: {integrity: sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==} - - tslib@2.6.1: - resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} - - tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} tsutils@3.21.0: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} @@ -5229,63 +5597,64 @@ packages: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} + type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + type-fest@2.19.0: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} - type@1.2.0: - resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} - - type@2.7.2: - resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} - - typed-array-buffer@1.0.0: - resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} - typed-array-byte-length@1.0.0: - resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} engines: {node: '>= 0.4'} - typed-array-byte-offset@1.0.0: - resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} engines: {node: '>= 0.4'} - typed-array-length@1.0.4: - resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} - - typedarray-to-buffer@3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - typeorm@0.3.10: - resolution: {integrity: sha512-VMKiM84EpJQ+Mz9xDIPqnfplWhyUy1d8ccaKdMY9obifxJOTFnv8GYVyPsGwG8Lk7Nb8MlttHyHWENGAhBA3WA==} - engines: {node: '>= 12.9.0'} + typeorm@0.3.25: + resolution: {integrity: sha512-fTKDFzWXKwAaBdEMU4k661seZewbNYET4r1J/z3Jwf+eAvlzMVpTLKAVcAzg75WwQk7GDmtsmkZ5MfkmXCiFWg==} + engines: {node: '>=16.13.0'} hasBin: true peerDependencies: - '@google-cloud/spanner': ^5.18.0 + '@google-cloud/spanner': ^5.18.0 || ^6.0.0 || ^7.0.0 '@sap/hana-client': ^2.12.25 - better-sqlite3: ^7.1.2 + better-sqlite3: ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 hdb-pool: ^0.1.6 ioredis: ^5.0.4 - mongodb: ^3.6.0 - mssql: ^7.3.0 - mysql2: ^2.2.5 - oracledb: ^5.1.0 + mongodb: ^5.8.0 || ^6.0.0 + mssql: ^9.1.1 || ^10.0.1 || ^11.0.1 + mysql2: ^2.2.5 || ^3.0.1 + oracledb: ^6.3.0 pg: ^8.5.1 pg-native: ^3.0.0 pg-query-stream: ^4.0.0 redis: ^3.1.1 || ^4.0.0 + reflect-metadata: ^0.1.14 || ^0.2.0 sql.js: ^1.4.0 sqlite3: ^5.0.3 ts-node: ^10.7.0 - typeorm-aurora-data-api-driver: ^2.0.0 + typeorm-aurora-data-api-driver: ^2.0.0 || ^3.0.0 peerDependenciesMeta: '@google-cloud/spanner': optional: true @@ -5322,13 +5691,18 @@ packages: typeorm-aurora-data-api-driver: optional: true - typescript@5.1.6: - resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + typescript@5.7.2: + resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} hasBin: true - uglify-js@3.17.4: - resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} engines: {node: '>=0.8.0'} hasBin: true @@ -5336,12 +5710,20 @@ packages: resolution: {integrity: sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==} engines: {node: '>=8'} - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + uint8array-extras@1.4.0: + resolution: {integrity: sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==} + engines: {node: '>=18'} + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} unbzip2-stream@1.4.3: resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + unfetch@4.2.0: resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} @@ -5357,12 +5739,8 @@ packages: unicode-trie@2.0.0: resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} - universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - - universalify@2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} unpipe@1.0.0: @@ -5372,8 +5750,8 @@ packages: unzipper@0.10.14: resolution: {integrity: sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==} - update-browserslist-db@1.0.11: - resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -5387,15 +5765,8 @@ packages: url@0.10.3: resolution: {integrity: sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==} - urlpattern-polyfill@9.0.0: - resolution: {integrity: sha512-WHN8KDQblxd32odxeIgo83rdVDE2bvdkb86it7bMhYZwWKJz0+O0RK/eZiHYnM+zgt/U7hAHOlCQGfjjvSkw2g==} - - urlsafe-base64@1.0.0: - resolution: {integrity: sha512-RtuPeMy7c1UrHwproMZN9gN6kiZ0SvJwRaEzwZY0j9MypEkFqyBaKv176jvlPtg58Zh36bOkS0NFABXMHvvGCA==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} + urlpattern-polyfill@10.0.0: + resolution: {integrity: sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==} util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -5410,9 +5781,12 @@ packages: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} + uuid@11.1.0: + resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + hasBin: true + uuid@3.4.0: resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} - deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. hasBin: true uuid@8.0.0: @@ -5423,19 +5797,19 @@ packages: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true - uuid@9.0.0: - resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - v8-to-istanbul@9.1.0: - resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} + v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} - validator@13.11.0: - resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} + validator@13.15.15: + resolution: {integrity: sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A==} engines: {node: '>= 0.10'} vary@1.1.2: @@ -5449,15 +5823,15 @@ packages: walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - watchpack@2.4.0: - resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + watchpack@2.4.4: + resolution: {integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==} engines: {node: '>=10.13.0'} wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - web-push@3.6.4: - resolution: {integrity: sha512-An4nhiYuCPJkD51hXid7OIO3TACJsSUhj6XWDNvCDiLCS5ucEkhPUnh/s+jOWAJUUDASGHkuU8hFHg+mX+4vLQ==} + web-push@3.6.7: + resolution: {integrity: sha512-OpiIUe8cuGjrj3mMBFWY+e4MMIkW3SVT+7vEIjvD9kejGUypv8GPDf84JdPWskK8zMRIJ6xYGm+Kxr8YkPyA0A==} engines: {node: '>= 16'} hasBin: true @@ -5471,12 +5845,12 @@ packages: resolution: {integrity: sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==} engines: {node: '>=6'} - webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + webpack-sources@3.3.3: + resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} engines: {node: '>=10.13.0'} - webpack@5.88.1: - resolution: {integrity: sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ==} + webpack@5.97.1: + resolution: {integrity: sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -5485,27 +5859,29 @@ packages: webpack-cli: optional: true - websocket@1.0.34: - resolution: {integrity: sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==} - engines: {node: '>=4.0.0'} - whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} - which-collection@1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - which-typed-array@1.1.11: - resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} engines: {node: '>= 0.4'} which@1.3.1: @@ -5523,10 +5899,6 @@ packages: winchan@0.2.2: resolution: {integrity: sha512-pvN+IFAbRP74n/6mc6phNyCH8oVkzXsto4KCHPJ2AScniAnA1AmeLI03I2BzjePpaClGSI4GUMowzsD3qz5PRQ==} - windows-release@4.0.0: - resolution: {integrity: sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==} - engines: {node: '>=10'} - winston-daily-rotate-file@5.0.0: resolution: {integrity: sha512-JDjiXXkM5qvwY06733vf09I2wnMXpZEhxEVOSPenZMii+g7pcDcTBt2MRugnoi8BwVSuCT2jfRXBUy+n1Zz/Yw==} engines: {node: '>=8'} @@ -5537,14 +5909,18 @@ packages: resolution: {integrity: sha512-OYpw/dCnt7s50HTJIDa7Nyz+7rchHaS77Jz3uMixahF++G5Xejrq4ZLJ4N/vMAY6tAdnwWmAqnOCJ+/GDnWktA==} engines: {node: '>= 8.0.0'} - winston-transport@4.8.0: - resolution: {integrity: sha512-qxSTKswC6llEMZKgCQdaWgDuMJQnhuvF5f2Nk3SNXc4byfQ+voo2mX1Px9dkNOuR8p0KAjfPG29PuYUSIb+vSA==} + winston-transport@4.9.0: + resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} engines: {node: '>= 12.0.0'} winston@3.4.0: resolution: {integrity: sha512-FqilVj+5HKwCfIHQzMxrrd5tBIH10JTS3koFGbLVWBODjiIYq7zir08rFyBT4rrTYG/eaTqDcfSIbcjSM78YSw==} engines: {node: '>= 6.4.0'} + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} @@ -5556,6 +5932,10 @@ packages: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -5563,20 +5943,20 @@ packages: resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - ws@8.11.0: - resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} + ws@8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 + utf-8-validate: '>=5.0.2' peerDependenciesMeta: bufferutil: optional: true utf-8-validate: optional: true - ws@8.13.0: - resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + ws@8.16.0: + resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -5587,8 +5967,20 @@ packages: utf-8-validate: optional: true - ws@8.14.2: - resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -5603,10 +5995,6 @@ packages: resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==} hasBin: true - xml2js@0.4.23: - resolution: {integrity: sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==} - engines: {node: '>=4.0.0'} - xml2js@0.6.2: resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==} engines: {node: '>=4.0.0'} @@ -5615,8 +6003,8 @@ packages: resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} engines: {node: '>=4.0'} - xmlhttprequest-ssl@2.0.0: - resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} + xmlhttprequest-ssl@2.1.2: + resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==} engines: {node: '>=0.4.0'} xtend@4.0.2: @@ -5630,10 +6018,6 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - yaeti@0.0.6: - resolution: {integrity: sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==} - engines: {node: '>=0.10.32'} - yallist@2.1.2: resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} @@ -5643,10 +6027,6 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} - yaml@2.3.1: resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} engines: {node: '>= 14'} @@ -5655,10 +6035,6 @@ packages: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} - yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -5667,10 +6043,6 @@ packages: resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} engines: {node: '>=8'} - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - yargs@17.7.1: resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==} engines: {node: '>=12'} @@ -5692,264 +6064,229 @@ packages: snapshots: - '@aashutoshrathi/word-wrap@1.2.6': {} - - '@ampproject/remapping@2.2.1': + '@ampproject/remapping@2.3.0': dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 - - '@angular-devkit/core@16.1.0(chokidar@3.5.3)': - dependencies: - ajv: 8.12.0 - ajv-formats: 2.1.1(ajv@8.12.0) - jsonc-parser: 3.2.0 - rxjs: 7.8.1 - source-map: 0.7.4 - optionalDependencies: - chokidar: 3.5.3 + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 - '@angular-devkit/core@16.1.4(chokidar@3.5.3)': + '@angular-devkit/core@17.3.11(chokidar@3.6.0)': dependencies: ajv: 8.12.0 ajv-formats: 2.1.1(ajv@8.12.0) - jsonc-parser: 3.2.0 + jsonc-parser: 3.2.1 + picomatch: 4.0.1 rxjs: 7.8.1 source-map: 0.7.4 optionalDependencies: - chokidar: 3.5.3 + chokidar: 3.6.0 - '@angular-devkit/schematics-cli@16.1.4(chokidar@3.5.3)': + '@angular-devkit/schematics-cli@17.3.11(chokidar@3.6.0)': dependencies: - '@angular-devkit/core': 16.1.4(chokidar@3.5.3) - '@angular-devkit/schematics': 16.1.4(chokidar@3.5.3) + '@angular-devkit/core': 17.3.11(chokidar@3.6.0) + '@angular-devkit/schematics': 17.3.11(chokidar@3.6.0) ansi-colors: 4.1.3 - inquirer: 8.2.4 + inquirer: 9.2.15 symbol-observable: 4.0.0 yargs-parser: 21.1.1 transitivePeerDependencies: - chokidar - '@angular-devkit/schematics@16.1.0(chokidar@3.5.3)': - dependencies: - '@angular-devkit/core': 16.1.0(chokidar@3.5.3) - jsonc-parser: 3.2.0 - magic-string: 0.30.0 - ora: 5.4.1 - rxjs: 7.8.1 - transitivePeerDependencies: - - chokidar - - '@angular-devkit/schematics@16.1.4(chokidar@3.5.3)': + '@angular-devkit/schematics@17.3.11(chokidar@3.6.0)': dependencies: - '@angular-devkit/core': 16.1.4(chokidar@3.5.3) - jsonc-parser: 3.2.0 - magic-string: 0.30.0 + '@angular-devkit/core': 17.3.11(chokidar@3.6.0) + jsonc-parser: 3.2.1 + magic-string: 0.30.8 ora: 5.4.1 rxjs: 7.8.1 transitivePeerDependencies: - chokidar - '@babel/code-frame@7.22.5': - dependencies: - '@babel/highlight': 7.22.5 - - '@babel/compat-data@7.22.9': {} - - '@babel/core@7.22.9': + '@babel/code-frame@7.27.1': dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.5 - '@babel/generator': 7.22.9 - '@babel/helper-compilation-targets': 7.22.9(@babel/core@7.22.9) - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.9) - '@babel/helpers': 7.22.6 - '@babel/parser': 7.22.7 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.8 - '@babel/types': 7.22.5 - convert-source-map: 1.9.0 - debug: 4.3.5 + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.0': {} + + '@babel/core@7.28.0': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.0 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) + '@babel/helpers': 7.28.2 + '@babel/parser': 7.28.0 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.2 + convert-source-map: 2.0.0 + debug: 4.4.1 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/generator@7.22.9': + '@babel/generator@7.28.0': dependencies: - '@babel/types': 7.22.5 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 - jsesc: 2.5.2 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.2 + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 + jsesc: 3.1.0 - '@babel/helper-compilation-targets@7.22.9(@babel/core@7.22.9)': + '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.22.9 - '@babel/core': 7.22.9 - '@babel/helper-validator-option': 7.22.5 - browserslist: 4.21.10 + '@babel/compat-data': 7.28.0 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.25.1 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-environment-visitor@7.22.5': {} + '@babel/helper-globals@7.28.0': {} - '@babel/helper-function-name@7.22.5': + '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/template': 7.22.5 - '@babel/types': 7.22.5 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.2 + transitivePeerDependencies: + - supports-color - '@babel/helper-hoist-variables@7.22.5': + '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0)': dependencies: - '@babel/types': 7.22.5 + '@babel/core': 7.28.0 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color - '@babel/helper-module-imports@7.22.5': - dependencies: - '@babel/types': 7.22.5 + '@babel/helper-plugin-utils@7.27.1': {} - '@babel/helper-module-transforms@7.22.9(@babel/core@7.22.9)': - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-module-imports': 7.22.5 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.5 + '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-plugin-utils@7.22.5': {} + '@babel/helper-validator-identifier@7.27.1': {} - '@babel/helper-simple-access@7.22.5': - dependencies: - '@babel/types': 7.22.5 + '@babel/helper-validator-option@7.27.1': {} - '@babel/helper-split-export-declaration@7.22.6': + '@babel/helpers@7.28.2': dependencies: - '@babel/types': 7.22.5 - - '@babel/helper-string-parser@7.22.5': {} - - '@babel/helper-validator-identifier@7.22.5': {} - - '@babel/helper-validator-option@7.22.5': {} + '@babel/template': 7.27.2 + '@babel/types': 7.28.2 - '@babel/helpers@7.22.6': + '@babel/parser@7.28.0': dependencies: - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.8 - '@babel/types': 7.22.5 - transitivePeerDependencies: - - supports-color + '@babel/types': 7.28.2 - '@babel/highlight@7.22.5': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.0)': dependencies: - '@babel/helper-validator-identifier': 7.22.5 - chalk: 2.4.2 - js-tokens: 4.0.0 + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/parser@7.22.7': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.0)': dependencies: - '@babel/types': 7.22.5 + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.9)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.22.9)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.9)': + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.9)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.9)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.22.9)': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.9)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.9)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.9)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.9)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.9)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.9)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.9)': + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.22.9)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/runtime@7.22.6': + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.0)': dependencies: - regenerator-runtime: 0.13.11 + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/template@7.22.5': + '@babel/template@7.27.2': dependencies: - '@babel/code-frame': 7.22.5 - '@babel/parser': 7.22.7 - '@babel/types': 7.22.5 + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.2 - '@babel/traverse@7.22.8': + '@babel/traverse@7.28.0': dependencies: - '@babel/code-frame': 7.22.5 - '@babel/generator': 7.22.9 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.22.7 - '@babel/types': 7.22.5 - debug: 4.3.5 - globals: 11.12.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.0 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.0 + '@babel/template': 7.27.2 + '@babel/types': 7.28.2 + debug: 4.4.1 transitivePeerDependencies: - supports-color - '@babel/types@7.22.5': + '@babel/types@7.28.2': dependencies: - '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.5 - to-fast-properties: 2.0.0 + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 '@bcoe/v8-coverage@0.2.3': {} @@ -5958,6 +6295,313 @@ snapshots: '@colors/colors@1.6.0': {} + '@credebl/aws@file:credebl-aws-2.0.0.tgz(@nestjs/core@10.4.20)(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(cache-manager@5.7.6)(class-transformer@0.5.1)(class-validator@0.14.2)(ioredis@5.6.1)(nats@2.29.3)(reflect-metadata@0.1.14)(rxjs@7.8.2)': + dependencies: + '@nestjs/common': 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/microservices': 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(@nestjs/websockets@10.4.20)(cache-manager@5.7.6)(ioredis@5.6.1)(nats@2.29.3)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/testing': 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(@nestjs/microservices@10.4.20)(@nestjs/platform-express@10.4.20) + aws-sdk: 2.1692.0 + transitivePeerDependencies: + - '@grpc/grpc-js' + - '@nestjs/core' + - '@nestjs/platform-express' + - '@nestjs/websockets' + - amqp-connection-manager + - amqplib + - cache-manager + - class-transformer + - class-validator + - ioredis + - kafkajs + - mqtt + - nats + - reflect-metadata + - rxjs + - supports-color + + '@credebl/common@file:credebl-common-2.0.0.tgz(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(@prisma/client@5.22.0(prisma@5.22.0))(cache-manager@5.7.6)(ioredis@5.6.1)(reflect-metadata@0.1.14)': + dependencies: + '@credebl/prisma-service': file:credebl-prisma-service-2.0.0.tgz(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(@prisma/client@5.22.0(prisma@5.22.0))(cache-manager@5.7.6)(class-transformer@0.5.1)(class-validator@0.14.2)(ioredis@5.6.1)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/axios': 3.1.3(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(axios@1.11.0)(rxjs@7.8.2) + '@nestjs/common': 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/core': 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.20)(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/microservices': 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(@nestjs/websockets@10.4.20)(cache-manager@5.7.6)(ioredis@5.6.1)(nats@2.29.3)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/swagger': 7.4.2(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14) + '@nestjs/testing': 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(@nestjs/microservices@10.4.20)(@nestjs/platform-express@10.4.20) + '@sendgrid/mail': 7.7.0 + axios: 1.11.0 + class-transformer: 0.5.1 + class-validator: 0.14.2 + crypto-js: 4.2.0 + dotenv: 16.6.1 + nats: 2.29.3 + nestjs-cls: 4.5.0(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(reflect-metadata@0.1.14)(rxjs@7.8.2) + rxjs: 7.8.2 + uuid: 9.0.1 + transitivePeerDependencies: + - '@fastify/static' + - '@grpc/grpc-js' + - '@nestjs/platform-express' + - '@nestjs/websockets' + - '@prisma/client' + - amqp-connection-manager + - amqplib + - bufferutil + - cache-manager + - debug + - encoding + - ioredis + - kafkajs + - mqtt + - reflect-metadata + - supports-color + - utf-8-validate + + '@credebl/common@file:credebl-common-2.0.0.tgz(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(@prisma/client@6.10.1(prisma@5.22.0)(typescript@5.8.3))(cache-manager@5.7.6)(ioredis@5.6.1)(reflect-metadata@0.1.14)': + dependencies: + '@credebl/prisma-service': file:credebl-prisma-service-2.0.0.tgz(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(@prisma/client@6.10.1(prisma@5.22.0)(typescript@5.8.3))(cache-manager@5.7.6)(class-transformer@0.5.1)(class-validator@0.14.2)(ioredis@5.6.1)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/axios': 3.1.3(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(axios@1.11.0)(rxjs@7.8.2) + '@nestjs/common': 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/core': 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.20)(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/microservices': 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(@nestjs/websockets@10.4.20)(cache-manager@5.7.6)(ioredis@5.6.1)(nats@2.29.3)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/swagger': 7.4.2(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14) + '@nestjs/testing': 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(@nestjs/microservices@10.4.20)(@nestjs/platform-express@10.4.20) + '@sendgrid/mail': 7.7.0 + axios: 1.11.0 + class-transformer: 0.5.1 + class-validator: 0.14.2 + crypto-js: 4.2.0 + dotenv: 16.6.1 + nats: 2.29.3 + nestjs-cls: 4.5.0(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(reflect-metadata@0.1.14)(rxjs@7.8.2) + rxjs: 7.8.2 + uuid: 9.0.1 + transitivePeerDependencies: + - '@fastify/static' + - '@grpc/grpc-js' + - '@nestjs/platform-express' + - '@nestjs/websockets' + - '@prisma/client' + - amqp-connection-manager + - amqplib + - bufferutil + - cache-manager + - debug + - encoding + - ioredis + - kafkajs + - mqtt + - reflect-metadata + - supports-color + - utf-8-validate + + '@credebl/logger@file:credebl-logger-2.0.0.tgz(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(@prisma/client@6.10.1(prisma@5.22.0)(typescript@5.8.3))(axios@1.11.0)(cache-manager@5.7.6)(class-transformer@0.5.1)(class-validator@0.14.2)(ioredis@5.6.1)(nats@2.29.3)(reflect-metadata@0.1.14)': + dependencies: + '@credebl/common': file:credebl-common-2.0.0.tgz(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(@prisma/client@6.10.1(prisma@5.22.0)(typescript@5.8.3))(cache-manager@5.7.6)(ioredis@5.6.1)(reflect-metadata@0.1.14) + '@elastic/ecs-winston-format': 1.5.3 + '@nestjs/axios': 3.1.3(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(axios@1.11.0)(rxjs@7.8.2) + '@nestjs/common': 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/config': 3.3.0(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(rxjs@7.8.2) + '@nestjs/core': 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.20)(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/microservices': 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(@nestjs/websockets@10.4.20)(cache-manager@5.7.6)(ioredis@5.6.1)(nats@2.29.3)(reflect-metadata@0.1.14)(rxjs@7.8.2) + morgan: 1.10.1 + rxjs: 7.8.2 + uuid: 9.0.1 + winston: 3.4.0 + winston-daily-rotate-file: 5.0.0(winston@3.4.0) + winston-elasticsearch: 0.16.0 + transitivePeerDependencies: + - '@fastify/static' + - '@grpc/grpc-js' + - '@nestjs/platform-express' + - '@nestjs/websockets' + - '@prisma/client' + - amqp-connection-manager + - amqplib + - axios + - bufferutil + - cache-manager + - class-transformer + - class-validator + - debug + - encoding + - ioredis + - kafkajs + - mqtt + - nats + - reflect-metadata + - supports-color + - utf-8-validate + + '@credebl/logger@file:credebl-logger-2.0.0.tgz(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(axios@1.11.0)(cache-manager@5.7.6)(class-transformer@0.5.1)(class-validator@0.14.2)(ioredis@5.6.1)(nats@2.29.3)(reflect-metadata@0.1.14)': + dependencies: + '@credebl/common': file:credebl-common-2.0.0.tgz(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(@prisma/client@5.22.0(prisma@5.22.0))(cache-manager@5.7.6)(ioredis@5.6.1)(reflect-metadata@0.1.14) + '@elastic/ecs-winston-format': 1.5.3 + '@nestjs/axios': 3.1.3(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(axios@1.11.0)(rxjs@7.8.2) + '@nestjs/common': 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/config': 3.3.0(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(rxjs@7.8.2) + '@nestjs/core': 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.20)(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/microservices': 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(@nestjs/websockets@10.4.20)(cache-manager@5.7.6)(ioredis@5.6.1)(nats@2.29.3)(reflect-metadata@0.1.14)(rxjs@7.8.2) + morgan: 1.10.1 + rxjs: 7.8.2 + uuid: 9.0.1 + winston: 3.4.0 + winston-daily-rotate-file: 5.0.0(winston@3.4.0) + winston-elasticsearch: 0.16.0 + transitivePeerDependencies: + - '@fastify/static' + - '@grpc/grpc-js' + - '@nestjs/platform-express' + - '@nestjs/websockets' + - amqp-connection-manager + - amqplib + - axios + - cache-manager + - class-transformer + - class-validator + - debug + - encoding + - ioredis + - kafkajs + - mqtt + - nats + - reflect-metadata + - supports-color + + '@credebl/prisma-service@file:credebl-prisma-service-2.0.0.tgz(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(@prisma/client@5.22.0(prisma@5.22.0))(cache-manager@5.7.6)(class-transformer@0.5.1)(class-validator@0.14.2)(ioredis@5.6.1)(reflect-metadata@0.1.14)(rxjs@7.8.2)': + dependencies: + '@credebl/common': file:credebl-common-2.0.0.tgz(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(@prisma/client@5.22.0(prisma@5.22.0))(cache-manager@5.7.6)(ioredis@5.6.1)(reflect-metadata@0.1.14) + '@nestjs/common': 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@prisma/client': 5.22.0(prisma@5.22.0) + '@supabase/supabase-js': 2.53.0 + crypto-js: 4.2.0 + readline: 1.3.0 + transitivePeerDependencies: + - '@fastify/static' + - '@grpc/grpc-js' + - '@nestjs/platform-express' + - '@nestjs/websockets' + - amqp-connection-manager + - amqplib + - bufferutil + - cache-manager + - class-transformer + - class-validator + - debug + - encoding + - ioredis + - kafkajs + - mqtt + - reflect-metadata + - rxjs + - supports-color + - utf-8-validate + + '@credebl/prisma-service@file:credebl-prisma-service-2.0.0.tgz(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(@prisma/client@6.10.1(prisma@5.22.0)(typescript@5.8.3))(cache-manager@5.7.6)(class-transformer@0.5.1)(class-validator@0.14.2)(ioredis@5.6.1)(reflect-metadata@0.1.14)(rxjs@7.8.2)': + dependencies: + '@credebl/common': file:credebl-common-2.0.0.tgz(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(@prisma/client@6.10.1(prisma@5.22.0)(typescript@5.8.3))(cache-manager@5.7.6)(ioredis@5.6.1)(reflect-metadata@0.1.14) + '@nestjs/common': 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@prisma/client': 6.10.1(prisma@5.22.0)(typescript@5.8.3) + '@supabase/supabase-js': 2.53.0 + crypto-js: 4.2.0 + readline: 1.3.0 + transitivePeerDependencies: + - '@fastify/static' + - '@grpc/grpc-js' + - '@nestjs/platform-express' + - '@nestjs/websockets' + - amqp-connection-manager + - amqplib + - bufferutil + - cache-manager + - class-transformer + - class-validator + - debug + - encoding + - ioredis + - kafkajs + - mqtt + - reflect-metadata + - rxjs + - supports-color + - utf-8-validate + + '@credebl/user-management@file:credebl-user-management-2.0.0.tgz(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(@prisma/client@5.22.0(prisma@5.22.0))(axios@1.11.0)(cache-manager@5.7.6)(class-transformer@0.5.1)(class-validator@0.14.2)(ioredis@5.6.1)(nats@2.29.3)(reflect-metadata@0.1.14)': + dependencies: + '@credebl/common': file:credebl-common-2.0.0.tgz(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(@prisma/client@5.22.0(prisma@5.22.0))(cache-manager@5.7.6)(ioredis@5.6.1)(reflect-metadata@0.1.14) + '@credebl/prisma-service': file:credebl-prisma-service-2.0.0.tgz(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(@prisma/client@5.22.0(prisma@5.22.0))(cache-manager@5.7.6)(class-transformer@0.5.1)(class-validator@0.14.2)(ioredis@5.6.1)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/axios': 3.1.3(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(axios@1.11.0)(rxjs@7.8.2) + '@nestjs/common': 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/config': 3.3.0(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(rxjs@7.8.2) + '@nestjs/core': 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.20)(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/jwt': 10.2.0(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2)) + '@nestjs/microservices': 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(@nestjs/websockets@10.4.20)(cache-manager@5.7.6)(ioredis@5.6.1)(nats@2.29.3)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/swagger': 7.4.2(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14) + '@supabase/supabase-js': 2.53.0 + morgan: 1.10.1 + rxjs: 7.8.2 + uuid: 9.0.1 + transitivePeerDependencies: + - '@fastify/static' + - '@grpc/grpc-js' + - '@nestjs/platform-express' + - '@nestjs/websockets' + - '@prisma/client' + - amqp-connection-manager + - amqplib + - axios + - bufferutil + - cache-manager + - class-transformer + - class-validator + - debug + - encoding + - ioredis + - kafkajs + - mqtt + - nats + - reflect-metadata + - supports-color + - utf-8-validate + + '@credebl/user-management@file:credebl-user-management-2.0.0.tgz(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(@prisma/client@6.10.1(prisma@5.22.0)(typescript@5.8.3))(axios@1.11.0)(cache-manager@5.7.6)(class-transformer@0.5.1)(class-validator@0.14.2)(ioredis@5.6.1)(nats@2.29.3)(reflect-metadata@0.1.14)': + dependencies: + '@credebl/common': file:credebl-common-2.0.0.tgz(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(@prisma/client@6.10.1(prisma@5.22.0)(typescript@5.8.3))(cache-manager@5.7.6)(ioredis@5.6.1)(reflect-metadata@0.1.14) + '@credebl/prisma-service': file:credebl-prisma-service-2.0.0.tgz(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(@prisma/client@6.10.1(prisma@5.22.0)(typescript@5.8.3))(cache-manager@5.7.6)(class-transformer@0.5.1)(class-validator@0.14.2)(ioredis@5.6.1)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/axios': 3.1.3(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(axios@1.11.0)(rxjs@7.8.2) + '@nestjs/common': 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/config': 3.3.0(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(rxjs@7.8.2) + '@nestjs/core': 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.20)(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/jwt': 10.2.0(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2)) + '@nestjs/microservices': 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(@nestjs/websockets@10.4.20)(cache-manager@5.7.6)(ioredis@5.6.1)(nats@2.29.3)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/swagger': 7.4.2(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14) + '@supabase/supabase-js': 2.53.0 + morgan: 1.10.1 + rxjs: 7.8.2 + uuid: 9.0.1 + transitivePeerDependencies: + - '@fastify/static' + - '@grpc/grpc-js' + - '@nestjs/platform-express' + - '@nestjs/websockets' + - '@prisma/client' + - amqp-connection-manager + - amqplib + - axios + - bufferutil + - cache-manager + - class-transformer + - class-validator + - debug + - encoding + - ioredis + - kafkajs + - mqtt + - nats + - reflect-metadata + - supports-color + - utf-8-validate + '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 @@ -5983,49 +6627,58 @@ snapshots: '@elastic/elasticsearch@7.17.14': dependencies: - debug: 4.3.5 + debug: 4.4.1 hpagent: 0.1.2 ms: 2.1.3 secure-json-parse: 2.7.0 transitivePeerDependencies: - supports-color - '@eslint-community/eslint-utils@4.4.0(eslint@8.46.0)': + '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)': dependencies: - eslint: 8.46.0 - eslint-visitor-keys: 3.4.2 + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.6.2': {} + '@eslint-community/regexpp@4.12.1': {} - '@eslint/eslintrc@2.1.1': + '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.5 + debug: 4.4.1 espree: 9.6.1 - globals: 13.20.0 - ignore: 5.2.4 - import-fresh: 3.3.0 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.1 js-yaml: 4.1.0 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - '@eslint/js@8.46.0': {} + '@eslint/js@8.57.1': {} - '@humanwhocodes/config-array@0.11.10': + '@humanwhocodes/config-array@0.13.0': dependencies: - '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.5 + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.1 minimatch: 3.1.2 transitivePeerDependencies: - supports-color '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@1.2.1': {} + '@humanwhocodes/object-schema@2.0.3': {} + + '@ioredis/commands@1.3.0': {} - '@ioredis/commands@1.2.0': {} + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 '@istanbuljs/load-nyc-config@1.1.0': dependencies: @@ -6037,43 +6690,43 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@jest/console@29.6.2': + '@jest/console@29.7.0': dependencies: - '@jest/types': 29.6.1 - '@types/node': 20.4.6 + '@jest/types': 29.6.3 + '@types/node': 20.19.9 chalk: 4.1.2 - jest-message-util: 29.6.2 - jest-util: 29.6.2 + jest-message-util: 29.7.0 + jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.6.2(ts-node@10.9.1(@types/node@20.4.6)(typescript@5.1.6))': + '@jest/core@29.7.0(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))': dependencies: - '@jest/console': 29.6.2 - '@jest/reporters': 29.6.2 - '@jest/test-result': 29.6.2 - '@jest/transform': 29.6.2 - '@jest/types': 29.6.1 - '@types/node': 20.4.6 + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.19.9 ansi-escapes: 4.3.2 chalk: 4.1.2 - ci-info: 3.8.0 + ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 - jest-changed-files: 29.5.0 - jest-config: 29.6.2(@types/node@20.4.6)(ts-node@10.9.1(@types/node@20.4.6)(typescript@5.1.6)) - jest-haste-map: 29.6.2 - jest-message-util: 29.6.2 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.2 - jest-resolve-dependencies: 29.6.2 - jest-runner: 29.6.2 - jest-runtime: 29.6.2 - jest-snapshot: 29.6.2 - jest-util: 29.6.2 - jest-validate: 29.6.2 - jest-watcher: 29.6.2 - micromatch: 4.0.7 - pretty-format: 29.6.2 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@20.19.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3)) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.8 + pretty-format: 29.7.0 slash: 3.0.0 strip-ansi: 6.0.1 transitivePeerDependencies: @@ -6081,404 +6734,415 @@ snapshots: - supports-color - ts-node - '@jest/environment@29.6.2': + '@jest/environment@29.7.0': dependencies: - '@jest/fake-timers': 29.6.2 - '@jest/types': 29.6.1 - '@types/node': 20.4.6 - jest-mock: 29.6.2 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.19.9 + jest-mock: 29.7.0 - '@jest/expect-utils@29.6.2': + '@jest/expect-utils@29.7.0': dependencies: - jest-get-type: 29.4.3 + jest-get-type: 29.6.3 - '@jest/expect@29.6.2': + '@jest/expect@29.7.0': dependencies: - expect: 29.6.2 - jest-snapshot: 29.6.2 + expect: 29.7.0 + jest-snapshot: 29.7.0 transitivePeerDependencies: - supports-color - '@jest/fake-timers@29.6.2': + '@jest/fake-timers@29.7.0': dependencies: - '@jest/types': 29.6.1 + '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.4.6 - jest-message-util: 29.6.2 - jest-mock: 29.6.2 - jest-util: 29.6.2 + '@types/node': 20.19.9 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 - '@jest/globals@29.6.2': + '@jest/globals@29.7.0': dependencies: - '@jest/environment': 29.6.2 - '@jest/expect': 29.6.2 - '@jest/types': 29.6.1 - jest-mock: 29.6.2 + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/types': 29.6.3 + jest-mock: 29.7.0 transitivePeerDependencies: - supports-color - '@jest/reporters@29.6.2': + '@jest/reporters@29.7.0': dependencies: '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.6.2 - '@jest/test-result': 29.6.2 - '@jest/transform': 29.6.2 - '@jest/types': 29.6.1 - '@jridgewell/trace-mapping': 0.3.18 - '@types/node': 20.4.6 + '@jest/console': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.29 + '@types/node': 20.19.9 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 glob: 7.2.3 graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-instrument: 5.2.1 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.3 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.6 - jest-message-util: 29.6.2 - jest-util: 29.6.2 - jest-worker: 29.6.2 + istanbul-reports: 3.1.7 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + jest-worker: 29.7.0 slash: 3.0.0 string-length: 4.0.2 strip-ansi: 6.0.1 - v8-to-istanbul: 9.1.0 + v8-to-istanbul: 9.3.0 transitivePeerDependencies: - supports-color - '@jest/schemas@29.6.0': + '@jest/schemas@29.6.3': dependencies: '@sinclair/typebox': 0.27.8 - '@jest/source-map@29.6.0': + '@jest/source-map@29.6.3': dependencies: - '@jridgewell/trace-mapping': 0.3.18 + '@jridgewell/trace-mapping': 0.3.29 callsites: 3.1.0 graceful-fs: 4.2.11 - '@jest/test-result@29.6.2': + '@jest/test-result@29.7.0': dependencies: - '@jest/console': 29.6.2 - '@jest/types': 29.6.1 - '@types/istanbul-lib-coverage': 2.0.4 + '@jest/console': 29.7.0 + '@jest/types': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 collect-v8-coverage: 1.0.2 - '@jest/test-sequencer@29.6.2': + '@jest/test-sequencer@29.7.0': dependencies: - '@jest/test-result': 29.6.2 + '@jest/test-result': 29.7.0 graceful-fs: 4.2.11 - jest-haste-map: 29.6.2 + jest-haste-map: 29.7.0 slash: 3.0.0 - '@jest/transform@29.6.2': + '@jest/transform@29.7.0': dependencies: - '@babel/core': 7.22.9 - '@jest/types': 29.6.1 - '@jridgewell/trace-mapping': 0.3.18 + '@babel/core': 7.28.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.29 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 convert-source-map: 2.0.0 fast-json-stable-stringify: 2.1.0 graceful-fs: 4.2.11 - jest-haste-map: 29.6.2 - jest-regex-util: 29.4.3 - jest-util: 29.6.2 - micromatch: 4.0.7 - pirates: 4.0.6 + jest-haste-map: 29.7.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + micromatch: 4.0.8 + pirates: 4.0.7 slash: 3.0.0 write-file-atomic: 4.0.2 transitivePeerDependencies: - supports-color - '@jest/types@29.6.1': + '@jest/types@29.6.3': dependencies: - '@jest/schemas': 29.6.0 - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.1 - '@types/node': 20.4.6 - '@types/yargs': 17.0.24 + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 20.19.9 + '@types/yargs': 17.0.33 chalk: 4.1.2 - '@jridgewell/gen-mapping@0.3.3': + '@jridgewell/gen-mapping@0.3.12': dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.18 + '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/trace-mapping': 0.3.29 - '@jridgewell/resolve-uri@3.1.0': {} + '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/resolve-uri@3.1.1': {} - - '@jridgewell/set-array@1.1.2': {} - - '@jridgewell/source-map@0.3.5': + '@jridgewell/source-map@0.3.10': dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 - '@jridgewell/sourcemap-codec@1.4.14': {} + '@jridgewell/sourcemap-codec@1.5.4': {} - '@jridgewell/sourcemap-codec@1.4.15': {} - - '@jridgewell/trace-mapping@0.3.18': + '@jridgewell/trace-mapping@0.3.29': dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.4 '@jridgewell/trace-mapping@0.3.9': dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.4 + + '@ljharb/through@2.3.14': + dependencies: + call-bind: 1.0.8 '@lukeed/csprng@1.1.0': {} '@mapbox/node-pre-gyp@1.0.11': dependencies: - detect-libc: 2.0.2 + detect-libc: 2.0.4 https-proxy-agent: 5.0.1 make-dir: 3.1.0 - node-fetch: 2.6.12 + node-fetch: 2.7.0 nopt: 5.0.0 npmlog: 5.0.1 rimraf: 3.0.2 - semver: 7.5.4 - tar: 6.1.15 + semver: 7.7.2 + tar: 6.2.1 transitivePeerDependencies: - encoding - supports-color - '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.2': + '@microsoft/tsdoc@0.15.1': {} + + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': optional: true - '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.2': + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': optional: true - '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.2': + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': optional: true - '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.2': + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': optional: true - '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.2': + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': optional: true - '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.2': + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': optional: true - '@nestjs/axios@3.0.0(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(axios@1.4.0)(reflect-metadata@0.1.13)(rxjs@7.8.1)': + '@nestjs/axios@3.1.3(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(axios@1.11.0)(rxjs@7.8.2)': dependencies: - '@nestjs/common': 10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - axios: 1.4.0 - reflect-metadata: 0.1.13 - rxjs: 7.8.1 + '@nestjs/common': 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + axios: 1.11.0 + rxjs: 7.8.2 - '@nestjs/bull-shared@10.0.1(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/core@10.1.3)': + '@nestjs/bull-shared@10.2.3(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)': dependencies: - '@nestjs/common': 10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.1.3(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/microservices@10.1.3)(@nestjs/platform-express@10.1.3)(@nestjs/websockets@10.1.3)(reflect-metadata@0.1.13)(rxjs@7.8.1) - tslib: 2.6.0 + '@nestjs/common': 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/core': 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.20)(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(reflect-metadata@0.1.14)(rxjs@7.8.2) + tslib: 2.8.1 - '@nestjs/bull@10.0.1(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/core@10.1.3)(bull@4.11.4)': + '@nestjs/bull@10.2.3(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(bull@4.16.5)': dependencies: - '@nestjs/bull-shared': 10.0.1(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/core@10.1.3) - '@nestjs/common': 10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.1.3(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/microservices@10.1.3)(@nestjs/platform-express@10.1.3)(@nestjs/websockets@10.1.3)(reflect-metadata@0.1.13)(rxjs@7.8.1) - bull: 4.11.4 - tslib: 2.6.0 + '@nestjs/bull-shared': 10.2.3(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20) + '@nestjs/common': 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/core': 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.20)(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(reflect-metadata@0.1.14)(rxjs@7.8.2) + bull: 4.16.5 + tslib: 2.8.1 - '@nestjs/cache-manager@2.2.1(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/core@10.1.3)(cache-manager@5.4.0)(rxjs@7.8.1)': + '@nestjs/cache-manager@2.3.0(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(cache-manager@5.7.6)(rxjs@7.8.2)': dependencies: - '@nestjs/common': 10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.1.3(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/microservices@10.1.3)(@nestjs/platform-express@10.1.3)(@nestjs/websockets@10.1.3)(reflect-metadata@0.1.13)(rxjs@7.8.1) - cache-manager: 5.4.0 - rxjs: 7.8.1 + '@nestjs/common': 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/core': 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.20)(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(reflect-metadata@0.1.14)(rxjs@7.8.2) + cache-manager: 5.7.6 + rxjs: 7.8.2 - '@nestjs/cli@10.1.11': + '@nestjs/cli@10.4.9': dependencies: - '@angular-devkit/core': 16.1.4(chokidar@3.5.3) - '@angular-devkit/schematics': 16.1.4(chokidar@3.5.3) - '@angular-devkit/schematics-cli': 16.1.4(chokidar@3.5.3) - '@nestjs/schematics': 10.0.1(chokidar@3.5.3)(typescript@5.1.6) + '@angular-devkit/core': 17.3.11(chokidar@3.6.0) + '@angular-devkit/schematics': 17.3.11(chokidar@3.6.0) + '@angular-devkit/schematics-cli': 17.3.11(chokidar@3.6.0) + '@nestjs/schematics': 10.2.3(chokidar@3.6.0)(typescript@5.7.2) chalk: 4.1.2 - chokidar: 3.5.3 - cli-table3: 0.6.3 + chokidar: 3.6.0 + cli-table3: 0.6.5 commander: 4.1.1 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.1.6)(webpack@5.88.1) - inquirer: 8.2.5 + fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.7.2)(webpack@5.97.1) + glob: 10.4.5 + inquirer: 8.2.6 node-emoji: 1.11.0 ora: 5.4.1 - os-name: 4.0.1 - rimraf: 4.4.1 - shelljs: 0.8.5 - source-map-support: 0.5.21 tree-kill: 1.2.2 tsconfig-paths: 4.2.0 - tsconfig-paths-webpack-plugin: 4.1.0 - typescript: 5.1.6 - webpack: 5.88.1 + tsconfig-paths-webpack-plugin: 4.2.0 + typescript: 5.7.2 + webpack: 5.97.1 webpack-node-externals: 3.0.0 transitivePeerDependencies: - esbuild - uglify-js - webpack-cli - '@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1)': + '@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2)': dependencies: + file-type: 20.4.1 iterare: 1.2.1 - reflect-metadata: 0.1.13 - rxjs: 7.8.1 - tslib: 2.6.2 + reflect-metadata: 0.1.14 + rxjs: 7.8.2 + tslib: 2.8.1 uid: 2.0.2 optionalDependencies: class-transformer: 0.5.1 - class-validator: 0.14.0 + class-validator: 0.14.2 + transitivePeerDependencies: + - supports-color - '@nestjs/config@3.0.0(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(reflect-metadata@0.1.13)': + '@nestjs/config@3.3.0(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(rxjs@7.8.2)': dependencies: - '@nestjs/common': 10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - dotenv: 16.1.4 + '@nestjs/common': 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + dotenv: 16.4.5 dotenv-expand: 10.0.0 lodash: 4.17.21 - reflect-metadata: 0.1.13 - uuid: 9.0.0 + rxjs: 7.8.2 - '@nestjs/core@10.1.3(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/microservices@10.1.3)(@nestjs/platform-express@10.1.3)(@nestjs/websockets@10.1.3)(reflect-metadata@0.1.13)(rxjs@7.8.1)': + '@nestjs/core@10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.20)(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(reflect-metadata@0.1.14)(rxjs@7.8.2)': dependencies: - '@nestjs/common': 10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) '@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.13 - rxjs: 7.8.1 - tslib: 2.6.1 + path-to-regexp: 3.3.0 + reflect-metadata: 0.1.14 + rxjs: 7.8.2 + tslib: 2.8.1 uid: 2.0.2 optionalDependencies: - '@nestjs/microservices': 10.1.3(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/core@10.1.3)(@nestjs/websockets@10.1.3)(cache-manager@5.4.0)(ioredis@5.3.2)(nats@2.15.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/platform-express': 10.1.3(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/core@10.1.3) - '@nestjs/websockets': 10.1.3(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/core@10.1.3)(@nestjs/platform-socket.io@10.1.3)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/microservices': 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(@nestjs/websockets@10.4.20)(cache-manager@5.7.6)(ioredis@5.6.1)(nats@2.29.3)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/platform-express': 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20) + '@nestjs/websockets': 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(@nestjs/platform-socket.io@10.4.20)(reflect-metadata@0.1.14)(rxjs@7.8.2) transitivePeerDependencies: - encoding - '@nestjs/jwt@10.1.0(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))': + '@nestjs/jwt@10.2.0(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))': dependencies: - '@nestjs/common': 10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@types/jsonwebtoken': 9.0.2 - jsonwebtoken: 9.0.0 + '@nestjs/common': 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@types/jsonwebtoken': 9.0.5 + jsonwebtoken: 9.0.2 - '@nestjs/mapped-types@2.0.2(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)': + '@nestjs/mapped-types@2.0.5(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)': dependencies: - '@nestjs/common': 10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - reflect-metadata: 0.1.13 + '@nestjs/common': 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + reflect-metadata: 0.1.14 optionalDependencies: class-transformer: 0.5.1 - class-validator: 0.14.0 + class-validator: 0.14.2 - '@nestjs/microservices@10.1.3(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/core@10.1.3)(@nestjs/websockets@10.1.3)(cache-manager@5.4.0)(ioredis@5.3.2)(nats@2.15.1)(reflect-metadata@0.1.13)(rxjs@7.8.1)': + '@nestjs/microservices@10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(@nestjs/websockets@10.4.20)(cache-manager@5.7.6)(ioredis@5.6.1)(nats@2.29.3)(reflect-metadata@0.1.14)(rxjs@7.8.2)': dependencies: - '@nestjs/common': 10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.1.3(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/microservices@10.1.3)(@nestjs/platform-express@10.1.3)(@nestjs/websockets@10.1.3)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/core': 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.20)(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(reflect-metadata@0.1.14)(rxjs@7.8.2) iterare: 1.2.1 - reflect-metadata: 0.1.13 - rxjs: 7.8.1 - tslib: 2.6.1 + reflect-metadata: 0.1.14 + rxjs: 7.8.2 + tslib: 2.8.1 optionalDependencies: - '@nestjs/websockets': 10.1.3(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/core@10.1.3)(@nestjs/platform-socket.io@10.1.3)(reflect-metadata@0.1.13)(rxjs@7.8.1) - cache-manager: 5.4.0 - ioredis: 5.3.2 - nats: 2.15.1 + '@nestjs/websockets': 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(@nestjs/platform-socket.io@10.4.20)(reflect-metadata@0.1.14)(rxjs@7.8.2) + cache-manager: 5.7.6 + ioredis: 5.6.1 + nats: 2.29.3 - '@nestjs/passport@10.0.0(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(passport@0.6.0)': + '@nestjs/passport@10.0.3(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(passport@0.6.0)': dependencies: - '@nestjs/common': 10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) passport: 0.6.0 - '@nestjs/platform-express@10.1.3(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/core@10.1.3)': + '@nestjs/platform-express@10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)': dependencies: - '@nestjs/common': 10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.1.3(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/microservices@10.1.3)(@nestjs/platform-express@10.1.3)(@nestjs/websockets@10.1.3)(reflect-metadata@0.1.13)(rxjs@7.8.1) - body-parser: 1.20.2 + '@nestjs/common': 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/core': 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.20)(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(reflect-metadata@0.1.14)(rxjs@7.8.2) + body-parser: 1.20.3 cors: 2.8.5 - express: 4.18.2 - multer: 1.4.4-lts.1 - tslib: 2.6.1 + express: 4.21.2 + multer: 2.0.2 + tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@nestjs/platform-socket.io@10.1.3(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/websockets@10.1.3)(bufferutil@4.0.7)(rxjs@7.8.1)(utf-8-validate@5.0.10)': + '@nestjs/platform-socket.io@10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/websockets@10.4.20)(rxjs@7.8.2)': dependencies: - '@nestjs/common': 10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/websockets': 10.1.3(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/core@10.1.3)(@nestjs/platform-socket.io@10.1.3)(reflect-metadata@0.1.13)(rxjs@7.8.1) - rxjs: 7.8.1 - socket.io: 4.7.1(bufferutil@4.0.7)(utf-8-validate@5.0.10) - tslib: 2.6.1 + '@nestjs/common': 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/websockets': 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(@nestjs/platform-socket.io@10.4.20)(reflect-metadata@0.1.14)(rxjs@7.8.2) + rxjs: 7.8.2 + socket.io: 4.8.1 + tslib: 2.8.1 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@nestjs/schedule@3.0.1(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/core@10.1.3)(reflect-metadata@0.1.13)': + '@nestjs/schedule@3.0.4(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(reflect-metadata@0.1.14)': + dependencies: + '@nestjs/common': 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/core': 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.20)(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(reflect-metadata@0.1.14)(rxjs@7.8.2) + cron: 2.4.3 + reflect-metadata: 0.1.14 + uuid: 9.0.1 + + '@nestjs/schematics@10.2.3(chokidar@3.6.0)(typescript@5.7.2)': dependencies: - '@nestjs/common': 10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.1.3(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/microservices@10.1.3)(@nestjs/platform-express@10.1.3)(@nestjs/websockets@10.1.3)(reflect-metadata@0.1.13)(rxjs@7.8.1) - cron: 2.3.1 - reflect-metadata: 0.1.13 - uuid: 9.0.0 + '@angular-devkit/core': 17.3.11(chokidar@3.6.0) + '@angular-devkit/schematics': 17.3.11(chokidar@3.6.0) + comment-json: 4.2.5 + jsonc-parser: 3.3.1 + pluralize: 8.0.0 + typescript: 5.7.2 + transitivePeerDependencies: + - chokidar - '@nestjs/schematics@10.0.1(chokidar@3.5.3)(typescript@5.1.6)': + '@nestjs/schematics@10.2.3(chokidar@3.6.0)(typescript@5.8.3)': dependencies: - '@angular-devkit/core': 16.1.0(chokidar@3.5.3) - '@angular-devkit/schematics': 16.1.0(chokidar@3.5.3) - comment-json: 4.2.3 - jsonc-parser: 3.2.0 + '@angular-devkit/core': 17.3.11(chokidar@3.6.0) + '@angular-devkit/schematics': 17.3.11(chokidar@3.6.0) + comment-json: 4.2.5 + jsonc-parser: 3.3.1 pluralize: 8.0.0 - typescript: 5.1.6 + typescript: 5.8.3 transitivePeerDependencies: - chokidar - '@nestjs/swagger@7.1.6(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/core@10.1.3)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)': + '@nestjs/swagger@7.4.2(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)': dependencies: - '@nestjs/common': 10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.1.3(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/microservices@10.1.3)(@nestjs/platform-express@10.1.3)(@nestjs/websockets@10.1.3)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/mapped-types': 2.0.2(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13) + '@microsoft/tsdoc': 0.15.1 + '@nestjs/common': 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/core': 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.20)(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/mapped-types': 2.0.5(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14) js-yaml: 4.1.0 lodash: 4.17.21 - path-to-regexp: 3.2.0 - reflect-metadata: 0.1.13 - swagger-ui-dist: 5.1.0 + path-to-regexp: 3.3.0 + reflect-metadata: 0.1.14 + swagger-ui-dist: 5.17.14 optionalDependencies: class-transformer: 0.5.1 - class-validator: 0.14.0 + class-validator: 0.14.2 - '@nestjs/testing@10.1.3(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/core@10.1.3)(@nestjs/microservices@10.1.3)(@nestjs/platform-express@10.1.3)': + '@nestjs/testing@10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(@nestjs/microservices@10.4.20)(@nestjs/platform-express@10.4.20)': dependencies: - '@nestjs/common': 10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.1.3(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/microservices@10.1.3)(@nestjs/platform-express@10.1.3)(@nestjs/websockets@10.1.3)(reflect-metadata@0.1.13)(rxjs@7.8.1) - tslib: 2.6.1 + '@nestjs/common': 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/core': 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.20)(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(reflect-metadata@0.1.14)(rxjs@7.8.2) + tslib: 2.8.1 optionalDependencies: - '@nestjs/microservices': 10.1.3(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/core@10.1.3)(@nestjs/websockets@10.1.3)(cache-manager@5.4.0)(ioredis@5.3.2)(nats@2.15.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/platform-express': 10.1.3(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/core@10.1.3) + '@nestjs/microservices': 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(@nestjs/websockets@10.4.20)(cache-manager@5.7.6)(ioredis@5.6.1)(nats@2.29.3)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/platform-express': 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20) - '@nestjs/typeorm@10.0.0(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/core@10.1.3)(reflect-metadata@0.1.13)(rxjs@7.8.1)(typeorm@0.3.10(ioredis@5.3.2)(pg@8.11.2)(redis@3.1.2)(ts-node@10.9.1(@types/node@20.4.6)(typescript@5.1.6)))': + '@nestjs/typeorm@10.0.2(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(reflect-metadata@0.1.14)(rxjs@7.8.2)(typeorm@0.3.25(ioredis@5.6.1)(pg@8.16.3)(redis@3.1.2)(reflect-metadata@0.1.14)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3)))': dependencies: - '@nestjs/common': 10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.1.3(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/microservices@10.1.3)(@nestjs/platform-express@10.1.3)(@nestjs/websockets@10.1.3)(reflect-metadata@0.1.13)(rxjs@7.8.1) - reflect-metadata: 0.1.13 - rxjs: 7.8.1 - typeorm: 0.3.10(ioredis@5.3.2)(pg@8.11.2)(redis@3.1.2)(ts-node@10.9.1(@types/node@20.4.6)(typescript@5.1.6)) - uuid: 9.0.0 + '@nestjs/common': 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/core': 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.20)(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(reflect-metadata@0.1.14)(rxjs@7.8.2) + reflect-metadata: 0.1.14 + rxjs: 7.8.2 + typeorm: 0.3.25(ioredis@5.6.1)(pg@8.16.3)(redis@3.1.2)(reflect-metadata@0.1.14)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3)) + uuid: 9.0.1 - '@nestjs/websockets@10.1.3(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/core@10.1.3)(@nestjs/platform-socket.io@10.1.3)(reflect-metadata@0.1.13)(rxjs@7.8.1)': + '@nestjs/websockets@10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(@nestjs/platform-socket.io@10.4.20)(reflect-metadata@0.1.14)(rxjs@7.8.2)': dependencies: - '@nestjs/common': 10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.1.3(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/microservices@10.1.3)(@nestjs/platform-express@10.1.3)(@nestjs/websockets@10.1.3)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/core': 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.20)(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(reflect-metadata@0.1.14)(rxjs@7.8.2) iterare: 1.2.1 object-hash: 3.0.0 - reflect-metadata: 0.1.13 - rxjs: 7.8.1 - tslib: 2.6.1 + reflect-metadata: 0.1.14 + rxjs: 7.8.2 + tslib: 2.8.1 optionalDependencies: - '@nestjs/platform-socket.io': 10.1.3(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/websockets@10.1.3)(bufferutil@4.0.7)(rxjs@7.8.1)(utf-8-validate@5.0.10) + '@nestjs/platform-socket.io': 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/websockets@10.4.20)(rxjs@7.8.2) + + '@noble/hashes@1.8.0': {} '@nodelib/fs.scandir@2.1.5': dependencies: @@ -6490,51 +7154,78 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 + fastq: 1.19.1 '@nuxtjs/opencollective@0.3.2': dependencies: chalk: 4.1.2 consola: 2.15.3 - node-fetch: 2.6.12 + node-fetch: 2.7.0 transitivePeerDependencies: - encoding '@opentelemetry/api@1.9.0': optional: true - '@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.27.0 + '@opentelemetry/semantic-conventions': 1.28.0 optional: true - '@opentelemetry/resources@1.27.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.27.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.27.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.28.0 optional: true - '@opentelemetry/sdk-metrics@1.27.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/sdk-metrics@1.30.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.27.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.27.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) optional: true - '@opentelemetry/semantic-conventions@1.27.0': + '@opentelemetry/semantic-conventions@1.28.0': optional: true - '@prisma/client@5.1.1(prisma@5.1.1)': + '@paralleldrive/cuid2@2.2.2': dependencies: - '@prisma/engines-version': 5.1.1-1.6a3747c37ff169c90047725a05a6ef02e32ac97e + '@noble/hashes': 1.8.0 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@prisma/client@5.22.0(prisma@5.22.0)': + optionalDependencies: + prisma: 5.22.0 + + '@prisma/client@6.10.1(prisma@5.22.0)(typescript@5.8.3)': optionalDependencies: - prisma: 5.1.1 + prisma: 5.22.0 + typescript: 5.8.3 + + '@prisma/debug@5.22.0': {} + + '@prisma/engines-version@5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2': {} + + '@prisma/engines@5.22.0': + dependencies: + '@prisma/debug': 5.22.0 + '@prisma/engines-version': 5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2 + '@prisma/fetch-engine': 5.22.0 + '@prisma/get-platform': 5.22.0 - '@prisma/engines-version@5.1.1-1.6a3747c37ff169c90047725a05a6ef02e32ac97e': {} + '@prisma/fetch-engine@5.22.0': + dependencies: + '@prisma/debug': 5.22.0 + '@prisma/engines-version': 5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2 + '@prisma/get-platform': 5.22.0 - '@prisma/engines@5.1.1': {} + '@prisma/get-platform@5.22.0': + dependencies: + '@prisma/debug': 5.22.0 '@puppeteer/browsers@1.5.0': dependencies: @@ -6548,7 +7239,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@puppeteer/browsers@1.8.0': + '@puppeteer/browsers@1.9.1': dependencies: debug: 4.3.4 extract-zip: 2.0.1 @@ -6560,6 +7251,10 @@ snapshots: transitivePeerDependencies: - supports-color + '@rtsao/scc@1.1.0': {} + + '@scarf/scarf@1.4.0': {} + '@sendgrid/client@7.7.0': dependencies: '@sendgrid/helpers': 7.7.0 @@ -6580,69 +7275,78 @@ snapshots: '@sinclair/typebox@0.27.8': {} - '@sinonjs/commons@3.0.0': + '@sinonjs/commons@3.0.1': dependencies: type-detect: 4.0.8 '@sinonjs/fake-timers@10.3.0': dependencies: - '@sinonjs/commons': 3.0.0 + '@sinonjs/commons': 3.0.1 - '@socket.io/component-emitter@3.1.0': {} + '@socket.io/component-emitter@3.1.2': {} '@sqltools/formatter@1.2.5': {} - '@supabase/functions-js@2.1.2': + '@supabase/auth-js@2.71.1': dependencies: - cross-fetch: 3.1.8 - transitivePeerDependencies: - - encoding + '@supabase/node-fetch': 2.6.15 - '@supabase/gotrue-js@2.47.0': + '@supabase/functions-js@2.4.5': dependencies: - cross-fetch: 3.1.8 - transitivePeerDependencies: - - encoding + '@supabase/node-fetch': 2.6.15 - '@supabase/postgrest-js@1.8.0': + '@supabase/node-fetch@2.6.15': dependencies: - cross-fetch: 3.1.8 - transitivePeerDependencies: - - encoding + whatwg-url: 5.0.0 - '@supabase/realtime-js@2.7.3': + '@supabase/postgrest-js@1.19.4': dependencies: - '@types/phoenix': 1.6.0 - '@types/websocket': 1.0.5 - websocket: 1.0.34 - transitivePeerDependencies: - - supports-color + '@supabase/node-fetch': 2.6.15 - '@supabase/storage-js@2.5.1': + '@supabase/realtime-js@2.11.15': dependencies: - cross-fetch: 3.1.8 + '@supabase/node-fetch': 2.6.15 + '@types/phoenix': 1.6.6 + '@types/ws': 8.18.1 + isows: 1.0.7(ws@8.18.3) + ws: 8.18.3 transitivePeerDependencies: - - encoding + - bufferutil + - utf-8-validate - '@supabase/supabase-js@2.32.0': + '@supabase/storage-js@2.10.4': dependencies: - '@supabase/functions-js': 2.1.2 - '@supabase/gotrue-js': 2.47.0 - '@supabase/postgrest-js': 1.8.0 - '@supabase/realtime-js': 2.7.3 - '@supabase/storage-js': 2.5.1 - cross-fetch: 3.1.8 + '@supabase/node-fetch': 2.6.15 + + '@supabase/supabase-js@2.53.0': + dependencies: + '@supabase/auth-js': 2.71.1 + '@supabase/functions-js': 2.4.5 + '@supabase/node-fetch': 2.6.15 + '@supabase/postgrest-js': 1.19.4 + '@supabase/realtime-js': 2.11.15 + '@supabase/storage-js': 2.10.4 transitivePeerDependencies: - - encoding - - supports-color + - bufferutil + - utf-8-validate '@swc/helpers@0.3.17': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 + + '@tokenizer/inflate@0.2.7': + dependencies: + debug: 4.4.1 + fflate: 0.8.2 + token-types: 6.0.4 + transitivePeerDependencies: + - supports-color + + '@tokenizer/token@0.3.0': {} '@tootallnate/quickjs-emscripten@0.23.0': {} - '@tsconfig/node10@1.0.9': {} + '@tsconfig/node10@1.0.11': {} '@tsconfig/node12@1.0.11': {} @@ -6650,240 +7354,248 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@types/async-retry@1.4.5': + '@types/async-retry@1.4.9': dependencies: - '@types/retry': 0.12.2 + '@types/retry': 0.12.5 - '@types/babel__core@7.20.1': + '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.22.7 - '@babel/types': 7.22.5 - '@types/babel__generator': 7.6.4 - '@types/babel__template': 7.4.1 - '@types/babel__traverse': 7.20.1 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.2 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.7 - '@types/babel__generator@7.6.4': + '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.28.2 - '@types/babel__template@7.4.1': + '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.22.7 - '@babel/types': 7.22.5 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.2 - '@types/babel__traverse@7.20.1': + '@types/babel__traverse@7.20.7': dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.28.2 - '@types/body-parser@1.19.2': + '@types/body-parser@1.19.6': dependencies: - '@types/connect': 3.4.35 - '@types/node': 20.4.6 + '@types/connect': 3.4.38 + '@types/node': 20.19.9 - '@types/connect@3.4.35': + '@types/connect@3.4.38': dependencies: - '@types/node': 20.4.6 - - '@types/cookie@0.4.1': {} + '@types/node': 20.19.9 - '@types/cookiejar@2.1.2': {} + '@types/cookiejar@2.1.5': {} - '@types/cors@2.8.13': + '@types/cors@2.8.19': dependencies: - '@types/node': 20.4.6 + '@types/node': 20.19.9 - '@types/crypto-js@4.1.1': {} + '@types/crypto-js@4.2.2': {} - '@types/eslint-scope@3.7.4': + '@types/eslint-scope@3.7.7': dependencies: - '@types/eslint': 8.44.1 - '@types/estree': 1.0.1 + '@types/eslint': 9.6.1 + '@types/estree': 1.0.8 - '@types/eslint@8.44.1': + '@types/eslint@9.6.1': dependencies: - '@types/estree': 1.0.1 - '@types/json-schema': 7.0.12 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 - '@types/estree@1.0.1': {} + '@types/estree@1.0.8': {} - '@types/express-serve-static-core@4.17.35': + '@types/express-serve-static-core@4.19.6': dependencies: - '@types/node': 20.4.6 - '@types/qs': 6.9.7 - '@types/range-parser': 1.2.4 - '@types/send': 0.17.1 + '@types/node': 20.19.9 + '@types/qs': 6.14.0 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.5 - '@types/express@4.17.17': + '@types/express@4.17.23': dependencies: - '@types/body-parser': 1.19.2 - '@types/express-serve-static-core': 4.17.35 - '@types/qs': 6.9.7 - '@types/serve-static': 1.15.2 + '@types/body-parser': 1.19.6 + '@types/express-serve-static-core': 4.19.6 + '@types/qs': 6.14.0 + '@types/serve-static': 1.15.8 - '@types/graceful-fs@4.1.6': + '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 20.4.6 + '@types/node': 20.19.9 - '@types/http-errors@2.0.1': {} + '@types/http-errors@2.0.5': {} - '@types/istanbul-lib-coverage@2.0.4': {} + '@types/istanbul-lib-coverage@2.0.6': {} - '@types/istanbul-lib-report@3.0.0': + '@types/istanbul-lib-report@3.0.3': dependencies: - '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports@3.0.1': + '@types/istanbul-reports@3.0.4': dependencies: - '@types/istanbul-lib-report': 3.0.0 + '@types/istanbul-lib-report': 3.0.3 - '@types/jest@29.5.3': + '@types/jest@29.5.14': dependencies: - expect: 29.6.2 - pretty-format: 29.6.2 + expect: 29.7.0 + pretty-format: 29.7.0 - '@types/json-schema@7.0.12': {} + '@types/json-schema@7.0.15': {} - '@types/json2csv@5.0.5': + '@types/json2csv@5.0.7': dependencies: - '@types/node': 20.4.6 + '@types/node': 20.19.9 '@types/json5@0.0.29': {} - '@types/jsonwebtoken@9.0.2': + '@types/jsonwebtoken@9.0.10': dependencies: - '@types/node': 20.4.6 + '@types/ms': 2.1.0 + '@types/node': 20.19.9 - '@types/mime@1.3.2': {} + '@types/jsonwebtoken@9.0.5': + dependencies: + '@types/node': 20.19.9 - '@types/mime@3.0.1': {} + '@types/luxon@3.3.8': {} - '@types/multer@1.4.9': - dependencies: - '@types/express': 4.17.17 + '@types/methods@1.1.4': {} + + '@types/mime@1.3.5': {} + + '@types/ms@2.1.0': {} - '@types/node@20.4.6': {} + '@types/multer@1.4.13': + dependencies: + '@types/express': 4.17.23 - '@types/parse-json@4.0.0': {} + '@types/node@20.19.9': + dependencies: + undici-types: 6.21.0 '@types/passport-jwt@3.0.9': dependencies: - '@types/express': 4.17.17 - '@types/jsonwebtoken': 9.0.2 - '@types/passport-strategy': 0.2.35 + '@types/express': 4.17.23 + '@types/jsonwebtoken': 9.0.10 + '@types/passport-strategy': 0.2.38 - '@types/passport-local@1.0.35': + '@types/passport-local@1.0.38': dependencies: - '@types/express': 4.17.17 - '@types/passport': 1.0.12 - '@types/passport-strategy': 0.2.35 + '@types/express': 4.17.23 + '@types/passport': 1.0.17 + '@types/passport-strategy': 0.2.38 - '@types/passport-strategy@0.2.35': + '@types/passport-strategy@0.2.38': dependencies: - '@types/express': 4.17.17 - '@types/passport': 1.0.12 + '@types/express': 4.17.23 + '@types/passport': 1.0.17 - '@types/passport@1.0.12': + '@types/passport@1.0.17': dependencies: - '@types/express': 4.17.17 + '@types/express': 4.17.23 - '@types/pdfkit@0.12.6': + '@types/pdfkit@0.12.12': dependencies: - '@types/node': 20.4.6 + '@types/node': 20.19.9 - '@types/phoenix@1.6.0': {} + '@types/phoenix@1.6.6': {} - '@types/qs@6.9.7': {} + '@types/qs@6.14.0': {} - '@types/range-parser@1.2.4': {} + '@types/range-parser@1.2.7': {} - '@types/retry@0.12.2': {} + '@types/retry@0.12.5': {} - '@types/semver@7.5.0': {} + '@types/semver@7.7.0': {} - '@types/send@0.17.1': + '@types/send@0.17.5': dependencies: - '@types/mime': 1.3.2 - '@types/node': 20.4.6 + '@types/mime': 1.3.5 + '@types/node': 20.19.9 - '@types/serve-static@1.15.2': + '@types/serve-static@1.15.8': dependencies: - '@types/http-errors': 2.0.1 - '@types/mime': 3.0.1 - '@types/node': 20.4.6 + '@types/http-errors': 2.0.5 + '@types/node': 20.19.9 + '@types/send': 0.17.5 - '@types/stack-utils@2.0.1': {} + '@types/stack-utils@2.0.3': {} - '@types/superagent@4.1.18': + '@types/superagent@8.1.9': dependencies: - '@types/cookiejar': 2.1.2 - '@types/node': 20.4.6 + '@types/cookiejar': 2.1.5 + '@types/methods': 1.1.4 + '@types/node': 20.19.9 + form-data: 4.0.4 - '@types/supertest@2.0.12': + '@types/supertest@2.0.16': dependencies: - '@types/superagent': 4.1.18 + '@types/superagent': 8.1.9 '@types/triple-beam@1.3.5': {} - '@types/validator@13.9.0': {} + '@types/validator@13.15.2': {} - '@types/websocket@1.0.5': + '@types/ws@8.18.1': dependencies: - '@types/node': 20.4.6 + '@types/node': 20.19.9 - '@types/yargs-parser@21.0.0': {} + '@types/yargs-parser@21.0.3': {} - '@types/yargs@17.0.24': + '@types/yargs@17.0.33': dependencies: - '@types/yargs-parser': 21.0.0 + '@types/yargs-parser': 21.0.3 - '@types/yauzl@2.10.2': + '@types/yauzl@2.10.3': dependencies: - '@types/node': 20.4.6 + '@types/node': 20.19.9 optional: true - '@typescript-eslint/eslint-plugin@6.2.1(@typescript-eslint/parser@6.2.1(eslint@8.46.0)(typescript@5.1.6))(eslint@8.46.0)(typescript@5.1.6)': + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)': dependencies: - '@eslint-community/regexpp': 4.6.2 - '@typescript-eslint/parser': 6.2.1(eslint@8.46.0)(typescript@5.1.6) - '@typescript-eslint/scope-manager': 6.2.1 - '@typescript-eslint/type-utils': 6.2.1(eslint@8.46.0)(typescript@5.1.6) - '@typescript-eslint/utils': 6.2.1(eslint@8.46.0)(typescript@5.1.6) - '@typescript-eslint/visitor-keys': 6.2.1 - debug: 4.3.5 - eslint: 8.46.0 + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.4.1 + eslint: 8.57.1 graphemer: 1.4.0 - ignore: 5.2.4 + ignore: 5.3.2 natural-compare: 1.4.0 - natural-compare-lite: 1.4.0 - semver: 7.5.4 - ts-api-utils: 1.0.1(typescript@5.1.6) + semver: 7.7.2 + ts-api-utils: 1.4.3(typescript@5.8.3) optionalDependencies: - typescript: 5.1.6 + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@5.62.0(eslint@8.46.0)(typescript@5.1.6)': + '@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.1.6) - debug: 4.3.5 - eslint: 8.46.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.3) + debug: 4.4.1 + eslint: 8.57.1 optionalDependencies: - typescript: 5.1.6 + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@6.2.1(eslint@8.46.0)(typescript@5.1.6)': + '@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3)': dependencies: - '@typescript-eslint/scope-manager': 6.2.1 - '@typescript-eslint/types': 6.2.1 - '@typescript-eslint/typescript-estree': 6.2.1(typescript@5.1.6) - '@typescript-eslint/visitor-keys': 6.2.1 - debug: 4.3.5 - eslint: 8.46.0 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.4.1 + eslint: 8.57.1 optionalDependencies: - typescript: 5.1.6 + typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -6892,65 +7604,66 @@ snapshots: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - '@typescript-eslint/scope-manager@6.2.1': + '@typescript-eslint/scope-manager@6.21.0': dependencies: - '@typescript-eslint/types': 6.2.1 - '@typescript-eslint/visitor-keys': 6.2.1 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 - '@typescript-eslint/type-utils@6.2.1(eslint@8.46.0)(typescript@5.1.6)': + '@typescript-eslint/type-utils@6.21.0(eslint@8.57.1)(typescript@5.8.3)': dependencies: - '@typescript-eslint/typescript-estree': 6.2.1(typescript@5.1.6) - '@typescript-eslint/utils': 6.2.1(eslint@8.46.0)(typescript@5.1.6) - debug: 4.3.5 - eslint: 8.46.0 - ts-api-utils: 1.0.1(typescript@5.1.6) + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.8.3) + debug: 4.4.1 + eslint: 8.57.1 + ts-api-utils: 1.4.3(typescript@5.8.3) optionalDependencies: - typescript: 5.1.6 + typescript: 5.8.3 transitivePeerDependencies: - supports-color '@typescript-eslint/types@5.62.0': {} - '@typescript-eslint/types@6.2.1': {} + '@typescript-eslint/types@6.21.0': {} - '@typescript-eslint/typescript-estree@5.62.0(typescript@5.1.6)': + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.8.3)': dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.5 + debug: 4.4.1 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.5.4 - tsutils: 3.21.0(typescript@5.1.6) + semver: 7.7.2 + tsutils: 3.21.0(typescript@5.8.3) optionalDependencies: - typescript: 5.1.6 + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@6.2.1(typescript@5.1.6)': + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.8.3)': dependencies: - '@typescript-eslint/types': 6.2.1 - '@typescript-eslint/visitor-keys': 6.2.1 - debug: 4.3.5 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.4.1 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.5.4 - ts-api-utils: 1.0.1(typescript@5.1.6) + minimatch: 9.0.3 + semver: 7.7.2 + ts-api-utils: 1.4.3(typescript@5.8.3) optionalDependencies: - typescript: 5.1.6 + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@6.2.1(eslint@8.46.0)(typescript@5.1.6)': + '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.46.0) - '@types/json-schema': 7.0.12 - '@types/semver': 7.5.0 - '@typescript-eslint/scope-manager': 6.2.1 - '@typescript-eslint/types': 6.2.1 - '@typescript-eslint/typescript-estree': 6.2.1(typescript@5.1.6) - eslint: 8.46.0 - semver: 7.5.4 + '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) + '@types/json-schema': 7.0.15 + '@types/semver': 7.7.0 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3) + eslint: 8.57.1 + semver: 7.7.2 transitivePeerDependencies: - supports-color - typescript @@ -6958,87 +7671,89 @@ snapshots: '@typescript-eslint/visitor-keys@5.62.0': dependencies: '@typescript-eslint/types': 5.62.0 - eslint-visitor-keys: 3.4.2 + eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@6.2.1': + '@typescript-eslint/visitor-keys@6.21.0': dependencies: - '@typescript-eslint/types': 6.2.1 - eslint-visitor-keys: 3.4.2 + '@typescript-eslint/types': 6.21.0 + eslint-visitor-keys: 3.4.3 - '@webassemblyjs/ast@1.11.6': + '@ungap/structured-clone@1.3.0': {} + + '@webassemblyjs/ast@1.14.1': dependencies: - '@webassemblyjs/helper-numbers': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-numbers': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/floating-point-hex-parser@1.11.6': {} + '@webassemblyjs/floating-point-hex-parser@1.13.2': {} - '@webassemblyjs/helper-api-error@1.11.6': {} + '@webassemblyjs/helper-api-error@1.13.2': {} - '@webassemblyjs/helper-buffer@1.11.6': {} + '@webassemblyjs/helper-buffer@1.14.1': {} - '@webassemblyjs/helper-numbers@1.11.6': + '@webassemblyjs/helper-numbers@1.13.2': dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.11.6 - '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/floating-point-hex-parser': 1.13.2 + '@webassemblyjs/helper-api-error': 1.13.2 '@xtuc/long': 4.2.2 - '@webassemblyjs/helper-wasm-bytecode@1.11.6': {} + '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} - '@webassemblyjs/helper-wasm-section@1.11.6': + '@webassemblyjs/helper-wasm-section@1.14.1': dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/wasm-gen': 1.14.1 - '@webassemblyjs/ieee754@1.11.6': + '@webassemblyjs/ieee754@1.13.2': dependencies: '@xtuc/ieee754': 1.2.0 - '@webassemblyjs/leb128@1.11.6': + '@webassemblyjs/leb128@1.13.2': dependencies: '@xtuc/long': 4.2.2 - '@webassemblyjs/utf8@1.11.6': {} + '@webassemblyjs/utf8@1.13.2': {} - '@webassemblyjs/wasm-edit@1.11.6': + '@webassemblyjs/wasm-edit@1.14.1': dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/helper-wasm-section': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - '@webassemblyjs/wasm-opt': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - '@webassemblyjs/wast-printer': 1.11.6 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/helper-wasm-section': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-opt': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + '@webassemblyjs/wast-printer': 1.14.1 - '@webassemblyjs/wasm-gen@1.11.6': + '@webassemblyjs/wasm-gen@1.14.1': dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 - '@webassemblyjs/wasm-opt@1.11.6': + '@webassemblyjs/wasm-opt@1.14.1': dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 - '@webassemblyjs/wasm-parser@1.11.6': + '@webassemblyjs/wasm-parser@1.14.1': dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-api-error': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-api-error': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 - '@webassemblyjs/wast-printer@1.11.6': + '@webassemblyjs/wast-printer@1.14.1': dependencies: - '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 '@xtuc/ieee754@1.2.0': {} @@ -7047,60 +7762,59 @@ snapshots: abbrev@1.1.1: {} - abort-controller@3.0.0: - dependencies: - event-target-shim: 5.0.1 - accepts@1.3.8: dependencies: mime-types: 2.1.35 negotiator: 0.6.3 - acorn-import-assertions@1.9.0(acorn@8.10.0): + acorn-import-assertions@1.9.0(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + optional: true + + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: - acorn: 8.10.0 + acorn: 8.15.0 - acorn-jsx@5.3.2(acorn@8.10.0): + acorn-walk@8.3.4: dependencies: - acorn: 8.10.0 + acorn: 8.15.0 - acorn-walk@8.2.0: {} - - acorn@8.10.0: {} + acorn@8.15.0: {} after-all-results@2.0.0: optional: true agent-base@6.0.2: dependencies: - debug: 4.3.5 + debug: 4.4.1 transitivePeerDependencies: - supports-color - agent-base@7.1.0: - dependencies: - debug: 4.3.5 - transitivePeerDependencies: - - supports-color + agent-base@7.1.4: {} - agentkeepalive@4.5.0: + agentkeepalive@4.6.0: dependencies: humanize-ms: 1.2.1 optional: true - aggregate-error@3.1.0: - dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 - ajv-formats@2.1.1(ajv@8.12.0): optionalDependencies: ajv: 8.12.0 + ajv-formats@2.1.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + ajv-keywords@3.5.2(ajv@6.12.6): dependencies: ajv: 6.12.6 + ajv-keywords@5.1.0(ajv@8.17.1): + dependencies: + ajv: 8.17.1 + fast-deep-equal: 3.1.3 + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -7115,19 +7829,26 @@ snapshots: require-from-string: 2.0.2 uri-js: 4.4.1 + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.6 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + ansi-colors@4.1.3: {} ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 - ansi-regex@5.0.1: {} + ansi-escapes@5.0.0: + dependencies: + type-fest: 1.4.0 - ansi-regex@6.0.1: {} + ansi-regex@5.0.1: {} - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 + ansi-regex@6.1.0: {} ansi-styles@4.3.0: dependencies: @@ -7137,7 +7858,7 @@ snapshots: ansi-styles@6.2.1: {} - any-promise@1.3.0: {} + ansis@3.17.0: {} anymatch@3.1.3: dependencies: @@ -7148,7 +7869,7 @@ snapshots: append-field@1.0.0: {} - aproba@2.0.0: {} + aproba@2.1.0: {} are-we-there-yet@2.0.0: dependencies: @@ -7163,61 +7884,67 @@ snapshots: argparse@2.0.1: {} - array-buffer-byte-length@1.0.0: + array-buffer-byte-length@1.0.2: dependencies: - call-bind: 1.0.2 - is-array-buffer: 3.0.2 + call-bound: 1.0.4 + is-array-buffer: 3.0.5 array-flatten@1.1.1: {} - array-includes@3.1.6: + array-includes@3.1.9: dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - get-intrinsic: 1.2.1 - is-string: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + math-intrinsics: 1.1.0 array-timsort@1.0.3: {} array-union@2.1.0: {} - array.prototype.findlastindex@1.2.2: + array.prototype.findlastindex@1.2.6: dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - es-shim-unscopables: 1.0.0 - get-intrinsic: 1.2.1 + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 - array.prototype.flat@1.3.1: + array.prototype.flat@1.3.3: dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - es-shim-unscopables: 1.0.0 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-shim-unscopables: 1.1.0 - array.prototype.flatmap@1.3.1: + array.prototype.flatmap@1.3.3: dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - es-shim-unscopables: 1.0.0 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-shim-unscopables: 1.1.0 - arraybuffer.prototype.slice@1.0.1: + arraybuffer.prototype.slice@1.0.4: dependencies: - array-buffer-byte-length: 1.0.0 - call-bind: 1.0.2 - define-properties: 1.2.0 - get-intrinsic: 1.2.1 - is-array-buffer: 3.0.2 - is-shared-array-buffer: 1.0.2 + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 asap@2.0.6: {} asn1.js@5.4.1: dependencies: - bn.js: 4.12.0 + bn.js: 4.12.2 inherits: 2.0.4 minimalistic-assert: 1.0.1 safer-buffer: 2.1.2 @@ -7232,15 +7959,15 @@ snapshots: ast-types@0.13.4: dependencies: - tslib: 2.6.2 - - astral-regex@2.0.0: {} + tslib: 2.8.1 async-cache@1.1.0: dependencies: - lru-cache: 4.0.2 + lru-cache: 4.1.5 optional: true + async-function@1.0.0: {} + async-retry@1.3.3: dependencies: retry: 0.13.1 @@ -7260,22 +7987,24 @@ snapshots: atomic-sleep@1.0.0: optional: true - auth0-js@9.22.1: + auth0-js@9.28.0: dependencies: base64-js: 1.5.1 - idtoken-verifier: 2.2.3 + idtoken-verifier: 2.2.4 js-cookie: 2.2.1 minimist: 1.2.8 - qs: 6.11.2 - superagent: 7.1.5 + qs: 6.14.0 + superagent: 7.1.6 url-join: 4.0.1 winchan: 0.2.2 transitivePeerDependencies: - supports-color - available-typed-arrays@1.0.5: {} + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 - aws-sdk@2.1560.0: + aws-sdk@2.1692.0: dependencies: buffer: 4.9.2 events: 1.1.1 @@ -7291,32 +8020,32 @@ snapshots: aws-sign2@0.7.0: optional: true - aws4@1.12.0: + aws4@1.13.2: optional: true axios@0.26.1: dependencies: - follow-redirects: 1.15.2 + follow-redirects: 1.15.9 transitivePeerDependencies: - debug - axios@1.4.0: + axios@1.11.0: dependencies: - follow-redirects: 1.15.2 - form-data: 4.0.0 + follow-redirects: 1.15.9 + form-data: 4.0.4 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - b4a@1.6.4: {} + b4a@1.6.7: {} - babel-jest@29.6.2(@babel/core@7.22.9): + babel-jest@29.7.0(@babel/core@7.28.0): dependencies: - '@babel/core': 7.22.9 - '@jest/transform': 29.6.2 - '@types/babel__core': 7.20.1 + '@babel/core': 7.28.0 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.5.0(@babel/core@7.22.9) + babel-preset-jest: 29.6.3(@babel/core@7.28.0) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -7325,7 +8054,7 @@ snapshots: babel-plugin-istanbul@6.1.1: dependencies: - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.27.1 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 @@ -7333,37 +8062,43 @@ snapshots: transitivePeerDependencies: - supports-color - babel-plugin-jest-hoist@29.5.0: - dependencies: - '@babel/template': 7.22.5 - '@babel/types': 7.22.5 - '@types/babel__core': 7.20.1 - '@types/babel__traverse': 7.20.1 - - babel-preset-current-node-syntax@1.0.1(@babel/core@7.22.9): - dependencies: - '@babel/core': 7.22.9 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.9) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.9) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.9) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.9) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.9) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.9) - - babel-preset-jest@29.5.0(@babel/core@7.22.9): - dependencies: - '@babel/core': 7.22.9 - babel-plugin-jest-hoist: 29.5.0 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.9) + babel-plugin-jest-hoist@29.6.3: + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.2 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.7 + + babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.0): + dependencies: + '@babel/core': 7.28.0 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.0) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.0) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.0) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.0) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.0) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.0) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.0) + + babel-preset-jest@29.6.3(@babel/core@7.28.0): + dependencies: + '@babel/core': 7.28.0 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.0) balanced-match@1.0.2: {} + bare-events@2.6.0: + optional: true + base64-js@0.0.8: {} base64-js@1.5.1: {} @@ -7374,14 +8109,14 @@ snapshots: dependencies: safe-buffer: 5.1.2 - basic-ftp@5.0.3: {} + basic-ftp@5.0.5: {} bcrypt-pbkdf@1.0.2: dependencies: tweetnacl: 0.14.5 optional: true - bcrypt@5.1.0: + bcrypt@5.1.1: dependencies: '@mapbox/node-pre-gyp': 1.0.11 node-addon-api: 5.1.0 @@ -7389,9 +8124,9 @@ snapshots: - encoding - supports-color - big-integer@1.6.51: {} + big-integer@1.6.52: {} - binary-extensions@2.2.0: {} + binary-extensions@2.3.0: {} binary-search@1.3.6: optional: true @@ -7415,26 +8150,9 @@ snapshots: bluebird@3.4.7: {} - bn.js@4.12.0: {} - - body-parser@1.20.1: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.1 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color + bn.js@4.12.2: {} - body-parser@1.20.2: + body-parser@1.20.3: dependencies: bytes: 3.1.2 content-type: 1.0.5 @@ -7444,45 +8162,41 @@ snapshots: http-errors: 2.0.0 iconv-lite: 0.4.24 on-finished: 2.4.1 - qs: 6.11.0 + qs: 6.13.0 raw-body: 2.5.2 type-is: 1.6.18 unpipe: 1.0.0 transitivePeerDependencies: - supports-color - brace-expansion@1.1.11: + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.1: + brace-expansion@2.0.2: dependencies: balanced-match: 1.0.2 - braces@3.0.2: - dependencies: - fill-range: 7.0.1 - braces@3.0.3: dependencies: fill-range: 7.1.1 breadth-filter@2.0.0: dependencies: - object.entries: 1.1.8 + object.entries: 1.1.9 optional: true brotli@1.3.3: dependencies: base64-js: 1.5.1 - browserslist@4.21.10: + browserslist@4.25.1: dependencies: - caniuse-lite: 1.0.30001519 - electron-to-chromium: 1.4.483 - node-releases: 2.0.13 - update-browserslist-db: 1.0.11(browserslist@4.21.10) + caniuse-lite: 1.0.30001731 + electron-to-chromium: 1.5.193 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.25.1) bs-logger@0.2.6: dependencies: @@ -7500,8 +8214,6 @@ snapshots: buffer-indexof-polyfill@1.0.2: {} - buffer-writer@2.0.0: {} - buffer@4.9.2: dependencies: base64-js: 1.5.1 @@ -7520,22 +8232,18 @@ snapshots: buffers@0.1.1: {} - bufferutil@4.0.7: - dependencies: - node-gyp-build: 4.6.0 - - builtins@5.0.1: + builtins@5.1.0: dependencies: - semver: 7.5.4 + semver: 7.7.2 - bull@4.11.4: + bull@4.16.5: dependencies: - cron-parser: 4.8.1 + cron-parser: 4.9.0 get-port: 5.1.1 - ioredis: 5.3.2 + ioredis: 5.6.1 lodash: 4.17.21 - msgpackr: 1.9.6 - semver: 7.5.4 + msgpackr: 1.11.5 + semver: 7.7.2 uuid: 8.3.2 transitivePeerDependencies: - supports-color @@ -7550,25 +8258,29 @@ snapshots: dependencies: redis: 3.1.2 - cache-manager@5.4.0: + cache-manager@5.7.6: dependencies: + eventemitter3: 5.0.1 lodash.clonedeep: 4.5.0 - lru-cache: 10.2.0 + lru-cache: 10.4.3 promise-coalesce: 1.1.2 - call-bind@1.0.2: - dependencies: - function-bind: 1.1.1 - get-intrinsic: 1.2.1 - - call-bind@1.0.7: + call-bind-apply-helpers@1.0.2: dependencies: - es-define-property: 1.0.0 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 set-function-length: 1.2.2 - optional: true + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 callsites@3.1.0: {} @@ -7576,7 +8288,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001519: {} + caniuse-lite@1.0.30001731: {} caseless@0.12.0: optional: true @@ -7585,90 +8297,74 @@ snapshots: dependencies: traverse: 0.3.9 - chalk@2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.2.0: {} + chalk@5.3.0: {} + + chalk@5.4.1: {} char-regex@1.0.2: {} chardet@0.7.0: {} - chokidar@3.5.3: + chokidar@3.6.0: dependencies: anymatch: 3.1.3 - braces: 3.0.2 + braces: 3.0.3 glob-parent: 5.1.2 is-binary-path: 2.1.0 is-glob: 4.0.3 normalize-path: 3.0.0 readdirp: 3.6.0 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 chownr@2.0.0: {} - chrome-trace-event@1.0.3: {} + chrome-trace-event@1.0.4: {} chromium-bidi@0.4.20(devtools-protocol@0.0.1147663): dependencies: devtools-protocol: 0.0.1147663 mitt: 3.0.1 - chromium-bidi@0.4.33(devtools-protocol@0.0.1203626): + chromium-bidi@0.5.8(devtools-protocol@0.0.1232444): dependencies: - devtools-protocol: 0.0.1203626 + devtools-protocol: 0.0.1232444 mitt: 3.0.1 - urlpattern-polyfill: 9.0.0 + urlpattern-polyfill: 10.0.0 - ci-info@3.8.0: {} + ci-info@3.9.0: {} - cjs-module-lexer@1.2.3: {} + cjs-module-lexer@1.4.3: {} class-transformer@0.5.1: {} - class-validator@0.14.0: + class-validator@0.14.2: dependencies: - '@types/validator': 13.9.0 - libphonenumber-js: 1.10.39 - validator: 13.11.0 - - clean-stack@2.2.0: {} + '@types/validator': 13.15.2 + libphonenumber-js: 1.12.10 + validator: 13.15.15 cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 - cli-highlight@2.1.11: + cli-cursor@4.0.0: dependencies: - chalk: 4.1.2 - highlight.js: 10.7.3 - mz: 2.7.0 - parse5: 5.1.1 - parse5-htmlparser2-tree-adapter: 6.0.1 - yargs: 16.2.0 + restore-cursor: 4.0.0 - cli-spinners@2.9.0: {} + cli-spinners@2.9.2: {} - cli-table3@0.6.3: + cli-table3@0.6.5: dependencies: string-width: 4.2.3 optionalDependencies: '@colors/colors': 1.5.0 - cli-truncate@2.1.0: - dependencies: - slice-ansi: 3.0.0 - string-width: 4.2.3 - cli-truncate@3.1.0: dependencies: slice-ansi: 5.0.0 @@ -7676,18 +8372,14 @@ snapshots: cli-width@3.0.0: {} + cli-width@4.1.0: {} + cliui@6.0.0: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 6.2.0 - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -7739,7 +8431,7 @@ snapshots: dependencies: delayed-stream: 1.0.0 - commander@10.0.1: {} + commander@11.0.0: {} commander@2.20.3: {} @@ -7747,7 +8439,7 @@ snapshots: commander@6.2.1: {} - comment-json@4.2.3: + comment-json@4.2.5: dependencies: array-timsort: 1.0.3 core-util-is: 1.0.3 @@ -7755,7 +8447,7 @@ snapshots: has-own-prop: 2.0.0 repeat-string: 1.6.1 - component-emitter@1.3.0: {} + component-emitter@1.3.1: {} concat-map@0.0.1: {} @@ -7766,6 +8458,13 @@ snapshots: readable-stream: 2.3.8 typedarray: 0.0.6 + concat-stream@2.0.0: + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + typedarray: 0.0.6 + consola@2.15.3: {} console-control-strings@1.1.0: {} @@ -7779,15 +8478,16 @@ snapshots: content-type@1.0.5: {} - convert-source-map@1.9.0: {} - convert-source-map@2.0.0: {} cookie-signature@1.0.6: {} - cookie@0.4.2: {} + cookie@0.5.0: + optional: true + + cookie@0.7.1: {} - cookie@0.5.0: {} + cookie@0.7.2: {} cookiejar@2.1.4: {} @@ -7801,79 +8501,99 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 - cosmiconfig@7.1.0: + cosmiconfig@8.2.0: dependencies: - '@types/parse-json': 4.0.0 - import-fresh: 3.3.0 + import-fresh: 3.3.1 + js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 - yaml: 1.10.2 - cosmiconfig@8.2.0: + cosmiconfig@8.3.6(typescript@5.7.2): dependencies: - import-fresh: 3.3.0 + import-fresh: 3.3.1 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 + optionalDependencies: + typescript: 5.7.2 - cosmiconfig@8.3.6(typescript@5.1.6): + cosmiconfig@9.0.0(typescript@5.8.3): dependencies: - import-fresh: 3.3.0 + env-paths: 2.2.1 + import-fresh: 3.3.1 js-yaml: 4.1.0 parse-json: 5.2.0 - path-type: 4.0.0 optionalDependencies: - typescript: 5.1.6 - - create-require@1.1.1: {} + typescript: 5.8.3 - cron-parser@4.8.1: + create-jest@29.7.0(@types/node@20.19.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3)): dependencies: - luxon: 3.4.4 + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@20.19.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3)) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + create-require@1.1.1: {} - cron@2.3.1: + cron-parser@4.9.0: dependencies: - luxon: 3.4.4 + luxon: 3.7.1 - cross-fetch@3.1.8: + cron@2.4.3: dependencies: - node-fetch: 2.6.12 - transitivePeerDependencies: - - encoding + '@types/luxon': 3.3.8 + luxon: 3.3.0 cross-fetch@4.0.0: dependencies: - node-fetch: 2.6.12 + node-fetch: 2.7.0 transitivePeerDependencies: - encoding - cross-spawn@7.0.3: + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - crypto-js@4.1.1: {} + crypto-js@4.2.0: {} crypto-random-string@5.0.0: dependencies: type-fest: 2.19.0 - d@1.0.1: - dependencies: - es5-ext: 0.10.62 - type: 1.2.0 - dashdash@1.14.1: dependencies: assert-plus: 1.0.0 optional: true - data-uri-to-buffer@6.0.1: {} + data-uri-to-buffer@6.0.2: {} - date-fns@2.30.0: + data-view-buffer@1.0.2: dependencies: - '@babel/runtime': 7.22.6 + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 dayjs@1.11.13: {} @@ -7889,34 +8609,38 @@ snapshots: dependencies: ms: 2.1.2 - debug@4.3.5: + debug@4.3.7: dependencies: - ms: 2.1.2 + ms: 2.1.3 + + debug@4.4.1: + dependencies: + ms: 2.1.3 decamelize@1.2.0: {} - dedent@1.5.1: {} + dedent@1.6.0: {} - deep-equal@2.2.2: + deep-equal@2.2.3: dependencies: - array-buffer-byte-length: 1.0.0 - call-bind: 1.0.2 + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 es-get-iterator: 1.1.3 - get-intrinsic: 1.2.1 - is-arguments: 1.1.1 - is-array-buffer: 3.0.2 - is-date-object: 1.0.5 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 + get-intrinsic: 1.3.0 + is-arguments: 1.2.0 + is-array-buffer: 3.0.5 + is-date-object: 1.1.0 + is-regex: 1.2.1 + is-shared-array-buffer: 1.0.4 isarray: 2.0.5 - object-is: 1.1.5 + object-is: 1.1.6 object-keys: 1.1.1 - object.assign: 4.1.4 - regexp.prototype.flags: 1.5.0 - side-channel: 1.0.4 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.11 + object.assign: 4.1.7 + regexp.prototype.flags: 1.5.4 + side-channel: 1.1.0 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.19 deep-is@0.1.4: {} @@ -7928,22 +8652,15 @@ snapshots: define-data-property@1.1.4: dependencies: - es-define-property: 1.0.0 + es-define-property: 1.0.1 es-errors: 1.3.0 - gopd: 1.0.1 - optional: true - - define-properties@1.2.0: - dependencies: - has-property-descriptors: 1.0.0 - object-keys: 1.1.1 + gopd: 1.2.0 define-properties@1.2.1: dependencies: define-data-property: 1.1.4 - has-property-descriptors: 1.0.0 + has-property-descriptors: 1.0.2 object-keys: 1.1.1 - optional: true degenerator@5.0.1: dependencies: @@ -7963,13 +8680,13 @@ snapshots: destroy@1.2.0: {} - detect-libc@2.0.2: {} + detect-libc@2.0.4: {} detect-newline@3.1.0: {} devtools-protocol@0.0.1147663: {} - devtools-protocol@0.0.1203626: {} + devtools-protocol@0.0.1232444: {} dezalgo@1.0.4: dependencies: @@ -7978,7 +8695,7 @@ snapshots: dfa@1.2.0: {} - diff-sequences@29.4.3: {} + diff-sequences@29.6.3: {} diff@4.0.2: {} @@ -7998,9 +8715,15 @@ snapshots: dotenv-expand@10.0.0: {} - dotenv@16.0.3: {} + dotenv@16.4.5: {} - dotenv@16.1.4: {} + dotenv@16.6.1: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 duplexer2@0.1.4: dependencies: @@ -8020,21 +8743,25 @@ snapshots: ee-first@1.1.1: {} - elastic-apm-node@3.51.0: + ejs@3.1.10: + dependencies: + jake: 10.9.2 + + elastic-apm-node@3.52.2: dependencies: '@elastic/ecs-pino-format': 1.5.0 '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.27.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 1.27.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 1.30.1(@opentelemetry/api@1.9.0) after-all-results: 2.0.0 - agentkeepalive: 4.5.0 + agentkeepalive: 4.6.0 async-cache: 1.1.0 async-value-promise: 1.1.1 basic-auth: 2.0.1 breadth-filter: 2.0.0 cookie: 0.5.0 core-util-is: 1.0.3 - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 error-callsites: 2.0.4 error-stack-parser: 2.1.4 escape-string-regexp: 4.0.0 @@ -8045,7 +8772,7 @@ snapshots: is-native: 1.0.1 lru-cache: 6.0.0 measured-reporting: 1.51.1 - module-details-from-path: 1.0.3 + module-details-from-path: 1.0.4 monitor-event-loop-delay: 1.0.0 object-filter-sequence: 1.0.0 object-identity-map: 1.0.2 @@ -8053,7 +8780,7 @@ snapshots: pino: 6.14.0 readable-stream: 3.6.2 relative-microtime: 2.0.0 - require-in-the-middle: 7.4.0 + require-in-the-middle: 7.5.2 semver: 6.3.1 shallow-clone-shim: 2.0.0 source-map: 0.8.0-beta.0 @@ -8064,7 +8791,7 @@ snapshots: - supports-color optional: true - electron-to-chromium@1.4.483: {} + electron-to-chromium@1.5.193: {} emittery@0.13.1: {} @@ -8074,49 +8801,50 @@ snapshots: enabled@2.0.0: {} - encode-utf8@1.0.3: {} - encodeurl@1.0.2: {} - end-of-stream@1.4.4: + encodeurl@2.0.0: {} + + end-of-stream@1.4.5: dependencies: once: 1.4.0 - engine.io-client@6.5.2(bufferutil@4.0.7)(utf-8-validate@5.0.10): + engine.io-client@6.6.3: dependencies: - '@socket.io/component-emitter': 3.1.0 - debug: 4.3.5 - engine.io-parser: 5.2.1 - ws: 8.11.0(bufferutil@4.0.7)(utf-8-validate@5.0.10) - xmlhttprequest-ssl: 2.0.0 + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + engine.io-parser: 5.2.3 + ws: 8.17.1 + xmlhttprequest-ssl: 2.1.2 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - engine.io-parser@5.2.1: {} + engine.io-parser@5.2.3: {} - engine.io@6.5.2(bufferutil@4.0.7)(utf-8-validate@5.0.10): + engine.io@6.6.4: dependencies: - '@types/cookie': 0.4.1 - '@types/cors': 2.8.13 - '@types/node': 20.4.6 + '@types/cors': 2.8.19 + '@types/node': 20.19.9 accepts: 1.3.8 base64id: 2.0.0 - cookie: 0.4.2 + cookie: 0.7.2 cors: 2.8.5 - debug: 4.3.5 - engine.io-parser: 5.2.1 - ws: 8.11.0(bufferutil@4.0.7)(utf-8-validate@5.0.10) + debug: 4.3.7 + engine.io-parser: 5.2.3 + ws: 8.17.1 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - enhanced-resolve@5.15.0: + enhanced-resolve@5.18.2: dependencies: graceful-fs: 4.2.11 - tapable: 2.2.1 + tapable: 2.2.2 + + env-paths@2.2.1: {} error-callsites@2.0.4: optional: true @@ -8130,111 +8858,105 @@ snapshots: stackframe: 1.3.4 optional: true - es-abstract@1.22.1: - dependencies: - array-buffer-byte-length: 1.0.0 - arraybuffer.prototype.slice: 1.0.1 - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - es-set-tostringtag: 2.0.1 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.5 - get-intrinsic: 1.2.1 - get-symbol-description: 1.0.0 - globalthis: 1.0.3 - gopd: 1.0.1 - has: 1.0.3 - has-property-descriptors: 1.0.0 - has-proto: 1.0.1 - has-symbols: 1.0.3 - internal-slot: 1.0.5 - is-array-buffer: 3.0.2 + es-abstract@1.24.0: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 is-callable: 1.2.7 - is-negative-zero: 2.0.2 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - is-string: 1.0.7 - is-typed-array: 1.1.12 - is-weakref: 1.0.2 - object-inspect: 1.12.3 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 object-keys: 1.1.1 - object.assign: 4.1.4 - regexp.prototype.flags: 1.5.0 - safe-array-concat: 1.0.0 - safe-regex-test: 1.0.0 - string.prototype.trim: 1.2.7 - string.prototype.trimend: 1.0.6 - string.prototype.trimstart: 1.0.6 - typed-array-buffer: 1.0.0 - typed-array-byte-length: 1.0.0 - typed-array-byte-offset: 1.0.0 - typed-array-length: 1.0.4 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.11 - - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 - optional: true - - es-errors@1.3.0: - optional: true + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.19 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} es-get-iterator@1.1.3: dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - has-symbols: 1.0.3 - is-arguments: 1.1.1 - is-map: 2.0.2 - is-set: 2.0.2 - is-string: 1.0.7 + call-bind: 1.0.8 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + is-arguments: 1.2.0 + is-map: 2.0.3 + is-set: 2.0.3 + is-string: 1.1.1 isarray: 2.0.5 - stop-iteration-iterator: 1.0.0 + stop-iteration-iterator: 1.1.0 - es-module-lexer@1.3.0: {} + es-module-lexer@1.7.0: {} - es-object-atoms@1.0.0: + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 - optional: true - es-set-tostringtag@2.0.1: + es-set-tostringtag@2.1.0: dependencies: - get-intrinsic: 1.2.1 - has: 1.0.3 - has-tostringtag: 1.0.0 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 - es-shim-unscopables@1.0.0: + es-shim-unscopables@1.1.0: dependencies: - has: 1.0.3 + hasown: 2.0.2 - es-to-primitive@1.2.1: + es-to-primitive@1.3.0: dependencies: is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - - es5-ext@0.10.62: - dependencies: - es6-iterator: 2.0.3 - es6-symbol: 3.1.3 - next-tick: 1.1.0 - - es6-iterator@2.0.3: - dependencies: - d: 1.0.1 - es5-ext: 0.10.62 - es6-symbol: 3.1.3 + is-date-object: 1.1.0 + is-symbol: 1.1.1 es6-promise@4.2.8: {} - es6-symbol@3.1.3: - dependencies: - d: 1.0.1 - ext: 1.7.0 - - escalade@3.1.1: {} + escalade@3.2.0: {} escape-html@1.0.3: {} @@ -8252,105 +8974,106 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-prettier@8.10.0(eslint@8.46.0): + eslint-config-prettier@8.10.2(eslint@8.57.1): dependencies: - eslint: 8.46.0 + eslint: 8.57.1 - eslint-config-standard-with-typescript@37.0.0(@typescript-eslint/eslint-plugin@6.2.1(@typescript-eslint/parser@6.2.1(eslint@8.46.0)(typescript@5.1.6))(eslint@8.46.0)(typescript@5.1.6))(eslint-plugin-import@2.28.0(@typescript-eslint/parser@6.2.1(eslint@8.46.0)(typescript@5.1.6))(eslint@8.46.0))(eslint-plugin-n@15.7.0(eslint@8.46.0))(eslint-plugin-promise@6.1.1(eslint@8.46.0))(eslint@8.46.0)(typescript@5.1.6): + eslint-config-standard-with-typescript@37.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.8.3): dependencies: - '@typescript-eslint/eslint-plugin': 6.2.1(@typescript-eslint/parser@6.2.1(eslint@8.46.0)(typescript@5.1.6))(eslint@8.46.0)(typescript@5.1.6) - '@typescript-eslint/parser': 5.62.0(eslint@8.46.0)(typescript@5.1.6) - eslint: 8.46.0 - eslint-config-standard: 17.1.0(eslint-plugin-import@2.28.0(@typescript-eslint/parser@6.2.1(eslint@8.46.0)(typescript@5.1.6))(eslint@8.46.0))(eslint-plugin-n@15.7.0(eslint@8.46.0))(eslint-plugin-promise@6.1.1(eslint@8.46.0))(eslint@8.46.0) - eslint-plugin-import: 2.28.0(@typescript-eslint/parser@6.2.1(eslint@8.46.0)(typescript@5.1.6))(eslint@8.46.0) - eslint-plugin-n: 15.7.0(eslint@8.46.0) - eslint-plugin-promise: 6.1.1(eslint@8.46.0) - typescript: 5.1.6 + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.8.3) + eslint: 8.57.1 + eslint-config-standard: 17.1.0(eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1) + eslint-plugin-n: 15.7.0(eslint@8.57.1) + eslint-plugin-promise: 6.6.0(eslint@8.57.1) + typescript: 5.8.3 transitivePeerDependencies: - supports-color - eslint-config-standard@17.1.0(eslint-plugin-import@2.28.0(@typescript-eslint/parser@6.2.1(eslint@8.46.0)(typescript@5.1.6))(eslint@8.46.0))(eslint-plugin-n@15.7.0(eslint@8.46.0))(eslint-plugin-promise@6.1.1(eslint@8.46.0))(eslint@8.46.0): + eslint-config-standard@17.1.0(eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1): dependencies: - eslint: 8.46.0 - eslint-plugin-import: 2.28.0(@typescript-eslint/parser@6.2.1(eslint@8.46.0)(typescript@5.1.6))(eslint@8.46.0) - eslint-plugin-n: 15.7.0(eslint@8.46.0) - eslint-plugin-promise: 6.1.1(eslint@8.46.0) + eslint: 8.57.1 + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1) + eslint-plugin-n: 15.7.0(eslint@8.57.1) + eslint-plugin-promise: 6.6.0(eslint@8.57.1) - eslint-import-resolver-node@0.3.7: + eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 - is-core-module: 2.12.1 - resolve: 1.22.3 + is-core-module: 2.16.1 + resolve: 1.22.10 transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.0(@typescript-eslint/parser@6.2.1(eslint@8.46.0)(typescript@5.1.6))(eslint-import-resolver-node@0.3.7)(eslint@8.46.0): + eslint-module-utils@2.12.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 6.2.1(eslint@8.46.0)(typescript@5.1.6) - eslint: 8.46.0 - eslint-import-resolver-node: 0.3.7 + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.3) + eslint: 8.57.1 + eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-es@4.1.0(eslint@8.46.0): + eslint-plugin-es@4.1.0(eslint@8.57.1): dependencies: - eslint: 8.46.0 + eslint: 8.57.1 eslint-utils: 2.1.0 regexpp: 3.2.0 - eslint-plugin-import@2.28.0(@typescript-eslint/parser@6.2.1(eslint@8.46.0)(typescript@5.1.6))(eslint@8.46.0): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1): dependencies: - array-includes: 3.1.6 - array.prototype.findlastindex: 1.2.2 - array.prototype.flat: 1.3.1 - array.prototype.flatmap: 1.3.1 + '@rtsao/scc': 1.1.0 + array-includes: 3.1.9 + array.prototype.findlastindex: 1.2.6 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.46.0 - eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.2.1(eslint@8.46.0)(typescript@5.1.6))(eslint-import-resolver-node@0.3.7)(eslint@8.46.0) - has: 1.0.3 - is-core-module: 2.12.1 + eslint: 8.57.1 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) + hasown: 2.0.2 + is-core-module: 2.16.1 is-glob: 4.0.3 minimatch: 3.1.2 - object.fromentries: 2.0.6 - object.groupby: 1.0.0 - object.values: 1.1.6 - resolve: 1.22.3 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 semver: 6.3.1 - tsconfig-paths: 3.14.2 + string.prototype.trimend: 1.0.9 + tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 6.2.1(eslint@8.46.0)(typescript@5.1.6) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-n@15.7.0(eslint@8.46.0): + eslint-plugin-n@15.7.0(eslint@8.57.1): dependencies: - builtins: 5.0.1 - eslint: 8.46.0 - eslint-plugin-es: 4.1.0(eslint@8.46.0) - eslint-utils: 3.0.0(eslint@8.46.0) - ignore: 5.2.4 - is-core-module: 2.12.1 + builtins: 5.1.0 + eslint: 8.57.1 + eslint-plugin-es: 4.1.0(eslint@8.57.1) + eslint-utils: 3.0.0(eslint@8.57.1) + ignore: 5.3.2 + is-core-module: 2.16.1 minimatch: 3.1.2 - resolve: 1.22.2 - semver: 7.5.4 + resolve: 1.22.10 + semver: 7.7.2 - eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0(eslint@8.46.0))(eslint@8.46.0)(prettier@3.0.1): + eslint-plugin-prettier@4.2.5(eslint-config-prettier@8.10.2(eslint@8.57.1))(eslint@8.57.1)(prettier@3.6.2): dependencies: - eslint: 8.46.0 - prettier: 3.0.1 + eslint: 8.57.1 + prettier: 3.6.2 prettier-linter-helpers: 1.0.0 optionalDependencies: - eslint-config-prettier: 8.10.0(eslint@8.46.0) + eslint-config-prettier: 8.10.2(eslint@8.57.1) - eslint-plugin-promise@6.1.1(eslint@8.46.0): + eslint-plugin-promise@6.6.0(eslint@8.57.1): dependencies: - eslint: 8.46.0 + eslint: 8.57.1 eslint-scope@5.1.1: dependencies: @@ -8366,44 +9089,45 @@ snapshots: dependencies: eslint-visitor-keys: 1.3.0 - eslint-utils@3.0.0(eslint@8.46.0): + eslint-utils@3.0.0(eslint@8.57.1): dependencies: - eslint: 8.46.0 + eslint: 8.57.1 eslint-visitor-keys: 2.1.0 eslint-visitor-keys@1.3.0: {} eslint-visitor-keys@2.1.0: {} - eslint-visitor-keys@3.4.2: {} + eslint-visitor-keys@3.4.3: {} - eslint@8.46.0: + eslint@8.57.1: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.46.0) - '@eslint-community/regexpp': 4.6.2 - '@eslint/eslintrc': 2.1.1 - '@eslint/js': 8.46.0 - '@humanwhocodes/config-array': 0.11.10 + '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.1 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.3.0 ajv: 6.12.6 chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.5 + cross-spawn: 7.0.6 + debug: 4.4.1 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.2 + eslint-visitor-keys: 3.4.3 espree: 9.6.1 - esquery: 1.5.0 + esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.20.0 + globals: 13.24.0 graphemer: 1.4.0 - ignore: 5.2.4 + ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -8413,7 +9137,7 @@ snapshots: lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.3 + optionator: 0.9.4 strip-ansi: 6.0.1 text-table: 0.2.0 transitivePeerDependencies: @@ -8421,13 +9145,13 @@ snapshots: espree@9.6.1: dependencies: - acorn: 8.10.0 - acorn-jsx: 5.3.2(acorn@8.10.0) - eslint-visitor-keys: 3.4.2 + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} - esquery@1.5.0: + esquery@1.6.0: dependencies: estraverse: 5.3.0 @@ -8443,27 +9167,15 @@ snapshots: etag@1.8.1: {} - event-target-shim@5.0.1: {} + eventemitter3@5.0.1: {} events@1.1.1: {} events@3.3.0: {} - execa@4.1.0: - dependencies: - cross-spawn: 7.0.3 - get-stream: 5.2.0 - human-signals: 1.1.1 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - execa@5.1.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 6.0.1 human-signals: 2.1.0 is-stream: 2.0.1 @@ -8475,55 +9187,54 @@ snapshots: execa@7.2.0: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 6.0.1 human-signals: 4.3.1 is-stream: 3.0.0 merge-stream: 2.0.0 - npm-run-path: 5.1.0 + npm-run-path: 5.3.0 onetime: 6.0.0 signal-exit: 3.0.7 strip-final-newline: 3.0.0 exit@0.1.2: {} - expect@29.6.2: + expect@29.7.0: dependencies: - '@jest/expect-utils': 29.6.2 - '@types/node': 20.4.6 - jest-get-type: 29.4.3 - jest-matcher-utils: 29.6.2 - jest-message-util: 29.6.2 - jest-util: 29.6.2 + '@jest/expect-utils': 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 - express@4.18.2: + express@4.21.2: dependencies: accepts: 1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.1 + body-parser: 1.20.3 content-disposition: 0.5.4 content-type: 1.0.5 - cookie: 0.5.0 + cookie: 0.7.1 cookie-signature: 1.0.6 debug: 2.6.9 depd: 2.0.0 - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 - finalhandler: 1.2.0 + finalhandler: 1.3.1 fresh: 0.5.2 http-errors: 2.0.0 - merge-descriptors: 1.0.1 + merge-descriptors: 1.0.3 methods: 1.1.2 on-finished: 2.4.1 parseurl: 1.3.3 - path-to-regexp: 0.1.7 + path-to-regexp: 0.1.12 proxy-addr: 2.0.7 - qs: 6.11.0 + qs: 6.13.0 range-parser: 1.2.1 safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 + send: 0.19.0 + serve-static: 1.16.2 setprototypeof: 1.2.0 statuses: 2.0.1 type-is: 1.6.18 @@ -8532,10 +9243,6 @@ snapshots: transitivePeerDependencies: - supports-color - ext@1.7.0: - dependencies: - type: 2.7.2 - extend@3.0.2: optional: true @@ -8557,11 +9264,11 @@ snapshots: extract-zip@2.0.1: dependencies: - debug: 4.3.5 + debug: 4.3.4 get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: - '@types/yauzl': 2.10.2 + '@types/yauzl': 2.10.3 transitivePeerDependencies: - supports-color @@ -8574,13 +9281,13 @@ snapshots: fast-fifo@1.3.2: {} - fast-glob@3.3.1: + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.7 + micromatch: 4.0.8 fast-json-stable-stringify@2.1.0: {} @@ -8593,12 +9300,14 @@ snapshots: fast-stream-to-buffer@1.0.0: dependencies: - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 optional: true - fastq@1.15.0: + fast-uri@3.0.6: {} + + fastq@1.19.1: dependencies: - reusify: 1.0.4 + reusify: 1.1.0 fb-watchman@2.0.2: dependencies: @@ -8610,30 +9319,41 @@ snapshots: fecha@4.2.3: {} + fflate@0.8.2: {} + figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 file-entry-cache@6.0.1: dependencies: - flat-cache: 3.0.4 + flat-cache: 3.2.0 file-stream-rotator@0.6.1: dependencies: - moment: 2.29.3 + moment: 2.30.1 - fill-range@7.0.1: + file-type@20.4.1: dependencies: - to-regex-range: 5.0.1 + '@tokenizer/inflate': 0.2.7 + strtok3: 10.3.4 + token-types: 6.0.4 + uint8array-extras: 1.4.0 + transitivePeerDependencies: + - supports-color + + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 - finalhandler@1.2.0: + finalhandler@1.3.1: dependencies: debug: 2.6.9 - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 parseurl: 1.3.3 @@ -8652,55 +9372,61 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - flat-cache@3.0.4: + flat-cache@3.2.0: dependencies: - flatted: 3.2.7 + flatted: 3.3.3 + keyv: 4.5.4 rimraf: 3.0.2 flatstr@1.0.12: optional: true - flatted@3.2.7: {} + flatted@3.3.3: {} fn.name@1.1.0: {} - follow-redirects@1.15.2: {} + follow-redirects@1.15.9: {} fontkit@1.9.0: dependencies: '@swc/helpers': 0.3.17 brotli: 1.3.3 clone: 2.1.2 - deep-equal: 2.2.2 + deep-equal: 2.2.3 dfa: 1.2.0 restructure: 2.0.1 tiny-inflate: 1.0.3 unicode-properties: 1.4.1 unicode-trie: 2.0.0 - for-each@0.3.3: + for-each@0.3.5: dependencies: is-callable: 1.2.7 + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + forever-agent@0.6.1: optional: true - fork-ts-checker-webpack-plugin@8.0.0(typescript@5.1.6)(webpack@5.88.1): + fork-ts-checker-webpack-plugin@9.0.2(typescript@5.7.2)(webpack@5.97.1): dependencies: - '@babel/code-frame': 7.22.5 + '@babel/code-frame': 7.27.1 chalk: 4.1.2 - chokidar: 3.5.3 - cosmiconfig: 7.1.0 + chokidar: 3.6.0 + cosmiconfig: 8.3.6(typescript@5.7.2) deepmerge: 4.3.1 fs-extra: 10.1.0 memfs: 3.5.3 minimatch: 3.1.2 node-abort-controller: 3.1.1 schema-utils: 3.3.0 - semver: 7.5.4 - tapable: 2.2.1 - typescript: 5.1.6 - webpack: 5.88.1 + semver: 7.7.2 + tapable: 2.2.2 + typescript: 5.7.2 + webpack: 5.97.1 form-data@2.3.3: dependencies: @@ -8709,18 +9435,20 @@ snapshots: mime-types: 2.1.35 optional: true - form-data@4.0.0: + form-data@4.0.4: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 mime-types: 2.1.35 - formidable@2.1.2: + formidable@2.1.5: dependencies: + '@paralleldrive/cuid2': 2.2.2 dezalgo: 1.0.4 - hexoid: 1.0.0 once: 1.4.0 - qs: 6.11.2 + qs: 6.14.0 forwarded-parse@2.1.2: optional: true @@ -8740,25 +9468,19 @@ snapshots: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 - universalify: 2.0.0 - - fs-extra@8.1.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 + universalify: 2.0.1 fs-minipass@2.1.0: dependencies: minipass: 3.3.6 - fs-monkey@1.0.4: {} + fs-monkey@1.1.0: {} fs.realpath@1.0.0: {} fs@0.0.1-security: {} - fsevents@2.3.2: + fsevents@2.3.3: optional: true fstream@1.0.12: @@ -8768,23 +9490,22 @@ snapshots: mkdirp: 0.5.6 rimraf: 2.7.1 - function-bind@1.1.1: {} - - function-bind@1.1.2: - optional: true + function-bind@1.1.2: {} - function.prototype.name@1.1.5: + function.prototype.name@1.1.8: dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 functions-have-names@1.2.3: {} gauge@3.0.2: dependencies: - aproba: 2.0.0 + aproba: 2.1.0 color-support: 1.1.3 console-control-strings: 1.1.0 has-unicode: 2.0.1 @@ -8794,49 +9515,51 @@ snapshots: strip-ansi: 6.0.1 wide-align: 1.1.5 - generate-password@1.7.0: {} + generate-password@1.7.1: {} gensync@1.0.0-beta.2: {} get-caller-file@2.0.5: {} - get-intrinsic@1.2.1: - dependencies: - function-bind: 1.1.1 - has: 1.0.3 - has-proto: 1.0.1 - has-symbols: 1.0.3 - - get-intrinsic@1.2.4: + get-intrinsic@1.3.0: dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 es-errors: 1.3.0 + es-object-atoms: 1.1.1 function-bind: 1.1.2 - has-proto: 1.0.1 - has-symbols: 1.0.3 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 hasown: 2.0.2 - optional: true + math-intrinsics: 1.1.0 get-package-type@0.1.0: {} get-port@5.1.1: {} + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + get-stream@5.2.0: dependencies: - pump: 3.0.0 + pump: 3.0.3 get-stream@6.0.1: {} - get-symbol-description@1.0.0: + get-symbol-description@1.1.0: dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 - get-uri@6.0.2: + get-uri@6.0.5: dependencies: - basic-ftp: 5.0.3 - data-uri-to-buffer: 6.0.1 - debug: 4.3.5 - fs-extra: 8.1.0 + basic-ftp: 5.0.5 + data-uri-to-buffer: 6.0.2 + debug: 4.3.4 transitivePeerDependencies: - supports-color @@ -8855,6 +9578,15 @@ snapshots: glob-to-regexp@0.4.1: {} + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -8869,30 +9601,27 @@ snapshots: fs.realpath: 1.0.0 minimatch: 8.0.4 minipass: 4.2.8 - path-scurry: 1.10.1 + path-scurry: 1.11.1 - globals@11.12.0: {} - - globals@13.20.0: + globals@13.24.0: dependencies: type-fest: 0.20.2 - globalthis@1.0.3: + globalthis@1.0.4: dependencies: - define-properties: 1.2.0 + define-properties: 1.2.1 + gopd: 1.2.0 globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.1 - ignore: 5.2.4 + fast-glob: 3.3.3 + ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.1 + gopd@1.2.0: {} graceful-fs@4.2.11: {} @@ -8905,7 +9634,7 @@ snapshots: source-map: 0.6.1 wordwrap: 1.0.0 optionalDependencies: - uglify-js: 3.17.4 + uglify-js: 3.19.3 har-schema@2.0.0: optional: true @@ -8916,37 +9645,28 @@ snapshots: har-schema: 2.0.0 optional: true - has-bigints@1.0.2: {} - - has-flag@3.0.0: {} + has-bigints@1.1.0: {} has-flag@4.0.0: {} has-own-prop@2.0.0: {} - has-property-descriptors@1.0.0: - dependencies: - get-intrinsic: 1.2.1 - has-property-descriptors@1.0.2: dependencies: - es-define-property: 1.0.0 - optional: true + es-define-property: 1.0.1 - has-proto@1.0.1: {} + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 - has-symbols@1.0.3: {} + has-symbols@1.1.0: {} - has-tostringtag@1.0.0: + has-tostringtag@1.0.2: dependencies: - has-symbols: 1.0.3 + has-symbols: 1.1.0 has-unicode@2.0.1: {} - has@1.0.3: - dependencies: - function-bind: 1.1.1 - hasha@2.2.0: dependencies: is-stream: 1.1.0 @@ -8956,13 +9676,8 @@ snapshots: hasown@2.0.2: dependencies: function-bind: 1.1.2 - optional: true - - helmet@7.1.0: {} - hexoid@1.0.0: {} - - highlight.js@10.7.3: {} + helmet@7.2.0: {} hpagent@0.1.2: {} @@ -8974,7 +9689,7 @@ snapshots: transitivePeerDependencies: - supports-color - html-to-image@1.11.11: {} + html-to-image@1.11.13: {} http-errors@2.0.0: dependencies: @@ -8989,10 +9704,10 @@ snapshots: next-line: 1.1.0 optional: true - http-proxy-agent@7.0.0: + http-proxy-agent@7.0.2: dependencies: - agent-base: 7.1.0 - debug: 4.3.5 + agent-base: 7.1.4 + debug: 4.3.4 transitivePeerDependencies: - supports-color @@ -9000,29 +9715,25 @@ snapshots: dependencies: assert-plus: 1.0.0 jsprim: 1.4.2 - sshpk: 1.17.0 + sshpk: 1.18.0 optional: true - http_ece@1.1.0: - dependencies: - urlsafe-base64: 1.0.0 + http_ece@1.2.0: {} https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.5 + debug: 4.4.1 transitivePeerDependencies: - supports-color - https-proxy-agent@7.0.2: + https-proxy-agent@7.0.6: dependencies: - agent-base: 7.1.0 - debug: 4.3.5 + agent-base: 7.1.4 + debug: 4.4.1 transitivePeerDependencies: - supports-color - human-signals@1.1.1: {} - human-signals@2.1.0: {} human-signals@4.3.1: {} @@ -9038,10 +9749,10 @@ snapshots: dependencies: safer-buffer: 2.1.2 - idtoken-verifier@2.2.3: + idtoken-verifier@2.2.4: dependencies: base64-js: 1.5.1 - crypto-js: 4.1.1 + crypto-js: 4.2.0 es6-promise: 4.2.8 jsbn: 1.1.0 unfetch: 4.2.0 @@ -9051,30 +9762,28 @@ snapshots: ieee754@1.2.1: {} - ignore@5.2.4: {} + ignore@5.3.2: {} - import-fresh@3.3.0: + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 import-in-the-middle@1.4.2: dependencies: - acorn: 8.10.0 - acorn-import-assertions: 1.9.0(acorn@8.10.0) - cjs-module-lexer: 1.2.3 - module-details-from-path: 1.0.3 + acorn: 8.15.0 + acorn-import-assertions: 1.9.0(acorn@8.15.0) + cjs-module-lexer: 1.4.3 + module-details-from-path: 1.0.4 optional: true - import-local@3.1.0: + import-local@3.2.0: dependencies: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 imurmurhash@0.1.4: {} - indent-string@4.0.0: {} - inflight@1.0.6: dependencies: once: 1.4.0 @@ -9084,7 +9793,7 @@ snapshots: inherits@2.0.4: {} - inquirer@8.2.4: + inquirer@8.2.6: dependencies: ansi-escapes: 4.3.2 chalk: 4.1.2 @@ -9096,43 +9805,41 @@ snapshots: mute-stream: 0.0.8 ora: 5.4.1 run-async: 2.4.1 - rxjs: 7.8.1 + rxjs: 7.8.2 string-width: 4.2.3 strip-ansi: 6.0.1 through: 2.3.8 - wrap-ansi: 7.0.0 + wrap-ansi: 6.2.0 - inquirer@8.2.5: + inquirer@9.2.15: dependencies: + '@ljharb/through': 2.3.14 ansi-escapes: 4.3.2 - chalk: 4.1.2 + chalk: 5.4.1 cli-cursor: 3.1.0 - cli-width: 3.0.0 + cli-width: 4.1.0 external-editor: 3.1.0 figures: 3.2.0 lodash: 4.17.21 - mute-stream: 0.0.8 + mute-stream: 1.0.0 ora: 5.4.1 - run-async: 2.4.1 - rxjs: 7.8.1 + run-async: 3.0.0 + rxjs: 7.8.2 string-width: 4.2.3 strip-ansi: 6.0.1 - through: 2.3.8 - wrap-ansi: 7.0.0 + wrap-ansi: 6.2.0 - internal-slot@1.0.5: + internal-slot@1.1.0: dependencies: - get-intrinsic: 1.2.1 - has: 1.0.3 - side-channel: 1.0.4 - - interpret@1.4.0: {} + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 - ioredis@5.3.2: + ioredis@5.6.1: dependencies: - '@ioredis/commands': 1.2.0 + '@ioredis/commands': 1.3.0 cluster-key-slot: 1.1.2 - debug: 4.3.5 + debug: 4.4.1 denque: 2.1.0 lodash.defaults: 4.2.0 lodash.isarguments: 3.1.0 @@ -9142,57 +9849,72 @@ snapshots: transitivePeerDependencies: - supports-color - ip@1.1.8: {} - - ip@2.0.0: {} + ip-address@9.0.5: + dependencies: + jsbn: 1.1.0 + sprintf-js: 1.1.3 ipaddr.js@1.9.1: {} - is-arguments@1.1.1: + is-arguments@1.2.0: dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 + call-bound: 1.0.4 + has-tostringtag: 1.0.2 - is-array-buffer@3.0.2: + is-array-buffer@3.0.5: dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - is-typed-array: 1.1.12 + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 is-arrayish@0.2.1: {} is-arrayish@0.3.2: {} - is-bigint@1.0.4: + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: dependencies: - has-bigints: 1.0.2 + has-bigints: 1.1.0 is-binary-path@2.1.0: dependencies: - binary-extensions: 2.2.0 + binary-extensions: 2.3.0 - is-boolean-object@1.1.2: + is-boolean-object@1.2.2: dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 + call-bound: 1.0.4 + has-tostringtag: 1.0.2 is-callable@1.2.7: {} - is-core-module@2.12.1: + is-core-module@2.16.1: dependencies: - has: 1.0.3 + hasown: 2.0.2 - is-core-module@2.15.1: + is-data-view@1.0.2: dependencies: - hasown: 2.0.2 - optional: true + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 - is-date-object@1.0.5: + is-date-object@1.1.0: dependencies: - has-tostringtag: 1.0.0 + call-bound: 1.0.4 + has-tostringtag: 1.0.2 is-extglob@2.1.1: {} + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + is-finite@1.1.0: optional: true @@ -9202,9 +9924,12 @@ snapshots: is-generator-fn@2.1.0: {} - is-generator-function@1.0.10: + is-generator-function@1.1.0: dependencies: - has-tostringtag: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 is-glob@4.0.3: dependencies: @@ -9217,7 +9942,7 @@ snapshots: is-interactive@1.0.0: {} - is-map@2.0.2: {} + is-map@2.0.3: {} is-native@1.0.1: dependencies: @@ -9225,29 +9950,32 @@ snapshots: to-source-code: 1.0.2 optional: true - is-negative-zero@2.0.2: {} + is-negative-zero@2.0.3: {} is-nil@1.0.1: optional: true - is-number-object@1.0.7: + is-number-object@1.1.1: dependencies: - has-tostringtag: 1.0.0 + call-bound: 1.0.4 + has-tostringtag: 1.0.2 is-number@7.0.0: {} is-path-inside@3.0.3: {} - is-regex@1.1.4: + is-regex@1.2.1: dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 - is-set@2.0.2: {} + is-set@2.0.3: {} - is-shared-array-buffer@1.0.2: + is-shared-array-buffer@1.0.4: dependencies: - call-bind: 1.0.2 + call-bound: 1.0.4 is-stream@1.1.0: optional: true @@ -9256,32 +9984,36 @@ snapshots: is-stream@3.0.0: {} - is-string@1.0.7: + is-string@1.1.1: dependencies: - has-tostringtag: 1.0.0 + call-bound: 1.0.4 + has-tostringtag: 1.0.2 - is-symbol@1.0.4: + is-symbol@1.1.1: dependencies: - has-symbols: 1.0.3 + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 - is-typed-array@1.1.12: + is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.11 + which-typed-array: 1.1.19 - is-typedarray@1.0.0: {} + is-typedarray@1.0.0: + optional: true is-unicode-supported@0.1.0: {} - is-weakmap@2.0.1: {} + is-weakmap@2.0.2: {} - is-weakref@1.0.2: + is-weakref@1.1.1: dependencies: - call-bind: 1.0.2 + call-bound: 1.0.4 - is-weakset@2.0.2: + is-weakset@2.0.4: dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 isarray@1.0.0: {} @@ -9289,86 +10021,113 @@ snapshots: isexe@2.0.0: {} + isows@1.0.7(ws@8.18.3): + dependencies: + ws: 8.18.3 + isstream@0.1.2: optional: true - istanbul-lib-coverage@3.2.0: {} + istanbul-lib-coverage@3.2.2: {} istanbul-lib-instrument@5.2.1: dependencies: - '@babel/core': 7.22.9 - '@babel/parser': 7.22.7 + '@babel/core': 7.28.0 + '@babel/parser': 7.28.0 '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 + istanbul-lib-coverage: 3.2.2 semver: 6.3.1 transitivePeerDependencies: - supports-color + istanbul-lib-instrument@6.0.3: + dependencies: + '@babel/core': 7.28.0 + '@babel/parser': 7.28.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.7.2 + transitivePeerDependencies: + - supports-color + istanbul-lib-report@3.0.1: dependencies: - istanbul-lib-coverage: 3.2.0 + istanbul-lib-coverage: 3.2.2 make-dir: 4.0.0 supports-color: 7.2.0 istanbul-lib-source-maps@4.0.1: dependencies: - debug: 4.3.5 - istanbul-lib-coverage: 3.2.0 + debug: 4.4.1 + istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: - supports-color - istanbul-reports@3.1.6: + istanbul-reports@3.1.7: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - iterare@1.2.1: {} + iterare@1.2.1: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jake@10.9.2: + dependencies: + async: 3.2.6 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 - jest-changed-files@29.5.0: + jest-changed-files@29.7.0: dependencies: execa: 5.1.1 + jest-util: 29.7.0 p-limit: 3.1.0 - jest-circus@29.6.2: + jest-circus@29.7.0: dependencies: - '@jest/environment': 29.6.2 - '@jest/expect': 29.6.2 - '@jest/test-result': 29.6.2 - '@jest/types': 29.6.1 - '@types/node': 20.4.6 + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.19.9 chalk: 4.1.2 co: 4.6.0 - dedent: 1.5.1 + dedent: 1.6.0 is-generator-fn: 2.1.0 - jest-each: 29.6.2 - jest-matcher-utils: 29.6.2 - jest-message-util: 29.6.2 - jest-runtime: 29.6.2 - jest-snapshot: 29.6.2 - jest-util: 29.6.2 + jest-each: 29.7.0 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 p-limit: 3.1.0 - pretty-format: 29.6.2 - pure-rand: 6.0.2 + pretty-format: 29.7.0 + pure-rand: 6.1.0 slash: 3.0.0 stack-utils: 2.0.6 transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-cli@29.6.2(@types/node@20.4.6)(ts-node@10.9.1(@types/node@20.4.6)(typescript@5.1.6)): + jest-cli@29.7.0(@types/node@20.19.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3)): dependencies: - '@jest/core': 29.6.2(ts-node@10.9.1(@types/node@20.4.6)(typescript@5.1.6)) - '@jest/test-result': 29.6.2 - '@jest/types': 29.6.1 + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3)) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 chalk: 4.1.2 + create-jest: 29.7.0(@types/node@20.19.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3)) exit: 0.1.2 - graceful-fs: 4.2.11 - import-local: 3.1.0 - jest-config: 29.6.2(@types/node@20.4.6)(ts-node@10.9.1(@types/node@20.4.6)(typescript@5.1.6)) - jest-util: 29.6.2 - jest-validate: 29.6.2 - prompts: 2.4.2 + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@20.19.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3)) + jest-util: 29.7.0 + jest-validate: 29.7.0 yargs: 17.7.2 transitivePeerDependencies: - '@types/node' @@ -9376,264 +10135,264 @@ snapshots: - supports-color - ts-node - jest-config@29.6.2(@types/node@20.4.6)(ts-node@10.9.1(@types/node@20.4.6)(typescript@5.1.6)): + jest-config@29.7.0(@types/node@20.19.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3)): dependencies: - '@babel/core': 7.22.9 - '@jest/test-sequencer': 29.6.2 - '@jest/types': 29.6.1 - babel-jest: 29.6.2(@babel/core@7.22.9) + '@babel/core': 7.28.0 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.28.0) chalk: 4.1.2 - ci-info: 3.8.0 + ci-info: 3.9.0 deepmerge: 4.3.1 glob: 7.2.3 graceful-fs: 4.2.11 - jest-circus: 29.6.2 - jest-environment-node: 29.6.2 - jest-get-type: 29.4.3 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.2 - jest-runner: 29.6.2 - jest-util: 29.6.2 - jest-validate: 29.6.2 - micromatch: 4.0.7 + 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.8 parse-json: 5.2.0 - pretty-format: 29.6.2 + pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 20.4.6 - ts-node: 10.9.1(@types/node@20.4.6)(typescript@5.1.6) + '@types/node': 20.19.9 + ts-node: 10.9.2(@types/node@20.19.9)(typescript@5.8.3) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-diff@29.6.2: + jest-diff@29.7.0: dependencies: chalk: 4.1.2 - diff-sequences: 29.4.3 - jest-get-type: 29.4.3 - pretty-format: 29.6.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 - jest-docblock@29.4.3: + jest-docblock@29.7.0: dependencies: detect-newline: 3.1.0 - jest-each@29.6.2: + jest-each@29.7.0: dependencies: - '@jest/types': 29.6.1 + '@jest/types': 29.6.3 chalk: 4.1.2 - jest-get-type: 29.4.3 - jest-util: 29.6.2 - pretty-format: 29.6.2 + jest-get-type: 29.6.3 + jest-util: 29.7.0 + pretty-format: 29.7.0 - jest-environment-node@29.6.2: + jest-environment-node@29.7.0: dependencies: - '@jest/environment': 29.6.2 - '@jest/fake-timers': 29.6.2 - '@jest/types': 29.6.1 - '@types/node': 20.4.6 - jest-mock: 29.6.2 - jest-util: 29.6.2 + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.19.9 + jest-mock: 29.7.0 + jest-util: 29.7.0 - jest-get-type@29.4.3: {} + jest-get-type@29.6.3: {} - jest-haste-map@29.6.2: + jest-haste-map@29.7.0: dependencies: - '@jest/types': 29.6.1 - '@types/graceful-fs': 4.1.6 - '@types/node': 20.4.6 + '@jest/types': 29.6.3 + '@types/graceful-fs': 4.1.9 + '@types/node': 20.19.9 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 - jest-regex-util: 29.4.3 - jest-util: 29.6.2 - jest-worker: 29.6.2 - micromatch: 4.0.7 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + jest-worker: 29.7.0 + micromatch: 4.0.8 walker: 1.0.8 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 - jest-leak-detector@29.6.2: + jest-leak-detector@29.7.0: dependencies: - jest-get-type: 29.4.3 - pretty-format: 29.6.2 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 - jest-matcher-utils@29.6.2: + jest-matcher-utils@29.7.0: dependencies: chalk: 4.1.2 - jest-diff: 29.6.2 - jest-get-type: 29.4.3 - pretty-format: 29.6.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 - jest-message-util@29.6.2: + jest-message-util@29.7.0: dependencies: - '@babel/code-frame': 7.22.5 - '@jest/types': 29.6.1 - '@types/stack-utils': 2.0.1 + '@babel/code-frame': 7.27.1 + '@jest/types': 29.6.3 + '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 - micromatch: 4.0.7 - pretty-format: 29.6.2 + micromatch: 4.0.8 + pretty-format: 29.7.0 slash: 3.0.0 stack-utils: 2.0.6 - jest-mock@29.6.2: + jest-mock@29.7.0: dependencies: - '@jest/types': 29.6.1 - '@types/node': 20.4.6 - jest-util: 29.6.2 + '@jest/types': 29.6.3 + '@types/node': 20.19.9 + jest-util: 29.7.0 - jest-pnp-resolver@1.2.3(jest-resolve@29.6.2): + jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): optionalDependencies: - jest-resolve: 29.6.2 + jest-resolve: 29.7.0 - jest-regex-util@29.4.3: {} + jest-regex-util@29.6.3: {} - jest-resolve-dependencies@29.6.2: + jest-resolve-dependencies@29.7.0: dependencies: - jest-regex-util: 29.4.3 - jest-snapshot: 29.6.2 + jest-regex-util: 29.6.3 + jest-snapshot: 29.7.0 transitivePeerDependencies: - supports-color - jest-resolve@29.6.2: + jest-resolve@29.7.0: dependencies: chalk: 4.1.2 graceful-fs: 4.2.11 - jest-haste-map: 29.6.2 - jest-pnp-resolver: 1.2.3(jest-resolve@29.6.2) - jest-util: 29.6.2 - jest-validate: 29.6.2 - resolve: 1.22.3 - resolve.exports: 2.0.2 + jest-haste-map: 29.7.0 + jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) + jest-util: 29.7.0 + jest-validate: 29.7.0 + resolve: 1.22.10 + resolve.exports: 2.0.3 slash: 3.0.0 - jest-runner@29.6.2: + jest-runner@29.7.0: dependencies: - '@jest/console': 29.6.2 - '@jest/environment': 29.6.2 - '@jest/test-result': 29.6.2 - '@jest/transform': 29.6.2 - '@jest/types': 29.6.1 - '@types/node': 20.4.6 + '@jest/console': 29.7.0 + '@jest/environment': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.19.9 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 - jest-docblock: 29.4.3 - jest-environment-node: 29.6.2 - jest-haste-map: 29.6.2 - jest-leak-detector: 29.6.2 - jest-message-util: 29.6.2 - jest-resolve: 29.6.2 - jest-runtime: 29.6.2 - jest-util: 29.6.2 - jest-watcher: 29.6.2 - jest-worker: 29.6.2 + jest-docblock: 29.7.0 + jest-environment-node: 29.7.0 + jest-haste-map: 29.7.0 + jest-leak-detector: 29.7.0 + jest-message-util: 29.7.0 + jest-resolve: 29.7.0 + jest-runtime: 29.7.0 + jest-util: 29.7.0 + jest-watcher: 29.7.0 + jest-worker: 29.7.0 p-limit: 3.1.0 source-map-support: 0.5.13 transitivePeerDependencies: - supports-color - jest-runtime@29.6.2: + jest-runtime@29.7.0: dependencies: - '@jest/environment': 29.6.2 - '@jest/fake-timers': 29.6.2 - '@jest/globals': 29.6.2 - '@jest/source-map': 29.6.0 - '@jest/test-result': 29.6.2 - '@jest/transform': 29.6.2 - '@jest/types': 29.6.1 - '@types/node': 20.4.6 + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/globals': 29.7.0 + '@jest/source-map': 29.6.3 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.19.9 chalk: 4.1.2 - cjs-module-lexer: 1.2.3 + cjs-module-lexer: 1.4.3 collect-v8-coverage: 1.0.2 glob: 7.2.3 graceful-fs: 4.2.11 - jest-haste-map: 29.6.2 - jest-message-util: 29.6.2 - jest-mock: 29.6.2 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.2 - jest-snapshot: 29.6.2 - jest-util: 29.6.2 + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 slash: 3.0.0 strip-bom: 4.0.0 transitivePeerDependencies: - supports-color - jest-snapshot@29.6.2: - dependencies: - '@babel/core': 7.22.9 - '@babel/generator': 7.22.9 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.9) - '@babel/types': 7.22.5 - '@jest/expect-utils': 29.6.2 - '@jest/transform': 29.6.2 - '@jest/types': 29.6.1 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.9) + jest-snapshot@29.7.0: + dependencies: + '@babel/core': 7.28.0 + '@babel/generator': 7.28.0 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.0) + '@babel/types': 7.28.2 + '@jest/expect-utils': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.0) chalk: 4.1.2 - expect: 29.6.2 + expect: 29.7.0 graceful-fs: 4.2.11 - jest-diff: 29.6.2 - jest-get-type: 29.4.3 - jest-matcher-utils: 29.6.2 - jest-message-util: 29.6.2 - jest-util: 29.6.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 natural-compare: 1.4.0 - pretty-format: 29.6.2 - semver: 7.5.4 + pretty-format: 29.7.0 + semver: 7.7.2 transitivePeerDependencies: - supports-color - jest-util@29.6.2: + jest-util@29.7.0: dependencies: - '@jest/types': 29.6.1 - '@types/node': 20.4.6 + '@jest/types': 29.6.3 + '@types/node': 20.19.9 chalk: 4.1.2 - ci-info: 3.8.0 + ci-info: 3.9.0 graceful-fs: 4.2.11 picomatch: 2.3.1 - jest-validate@29.6.2: + jest-validate@29.7.0: dependencies: - '@jest/types': 29.6.1 + '@jest/types': 29.6.3 camelcase: 6.3.0 chalk: 4.1.2 - jest-get-type: 29.4.3 + jest-get-type: 29.6.3 leven: 3.1.0 - pretty-format: 29.6.2 + pretty-format: 29.7.0 - jest-watcher@29.6.2: + jest-watcher@29.7.0: dependencies: - '@jest/test-result': 29.6.2 - '@jest/types': 29.6.1 - '@types/node': 20.4.6 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.19.9 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 - jest-util: 29.6.2 + jest-util: 29.7.0 string-length: 4.0.2 jest-worker@27.5.1: dependencies: - '@types/node': 20.4.6 + '@types/node': 20.19.9 merge-stream: 2.0.0 supports-color: 8.1.1 - jest-worker@29.6.2: + jest-worker@29.7.0: dependencies: - '@types/node': 20.4.6 - jest-util: 29.6.2 + '@types/node': 20.19.9 + jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.6.2(@types/node@20.4.6)(ts-node@10.9.1(@types/node@20.4.6)(typescript@5.1.6)): + jest@29.7.0(@types/node@20.19.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3)): dependencies: - '@jest/core': 29.6.2(ts-node@10.9.1(@types/node@20.4.6)(typescript@5.1.6)) - '@jest/types': 29.6.1 - import-local: 3.1.0 - jest-cli: 29.6.2(@types/node@20.4.6)(ts-node@10.9.1(@types/node@20.4.6)(typescript@5.1.6)) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3)) + '@jest/types': 29.6.3 + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@20.19.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -9642,7 +10401,7 @@ snapshots: jmespath@0.16.0: {} - jose@4.14.4: {} + jose@4.15.9: {} js-cookie@2.2.1: {} @@ -9662,7 +10421,9 @@ snapshots: jsbn@1.1.0: {} - jsesc@2.5.2: {} + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} json-parse-even-better-errors@2.3.1: {} @@ -9690,38 +10451,35 @@ snapshots: json5@2.2.3: {} - jsonc-parser@3.2.0: {} + jsonc-parser@3.2.1: {} + + jsonc-parser@3.3.1: {} jsonfile@2.4.0: optionalDependencies: graceful-fs: 4.2.11 optional: true - jsonfile@4.0.0: - optionalDependencies: - graceful-fs: 4.2.11 - jsonfile@6.1.0: dependencies: - universalify: 2.0.0 + universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 jsonparse@1.3.1: {} - jsonwebtoken@9.0.0: - dependencies: - jws: 3.2.2 - lodash: 4.17.21 - ms: 2.1.3 - semver: 7.5.4 - - jsonwebtoken@9.0.1: + jsonwebtoken@9.0.2: dependencies: jws: 3.2.2 - lodash: 4.17.21 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 ms: 2.1.3 - semver: 7.5.4 + semver: 7.7.2 jsprim@1.4.2: dependencies: @@ -9731,42 +10489,46 @@ snapshots: verror: 1.10.0 optional: true - jwa@1.4.1: + jwa@1.4.2: dependencies: buffer-equal-constant-time: 1.0.1 ecdsa-sig-formatter: 1.0.11 safe-buffer: 5.2.1 - jwa@2.0.0: + jwa@2.0.1: dependencies: buffer-equal-constant-time: 1.0.1 ecdsa-sig-formatter: 1.0.11 safe-buffer: 5.2.1 - jwks-rsa@3.0.1: + jwks-rsa@3.2.0: dependencies: - '@types/express': 4.17.17 - '@types/jsonwebtoken': 9.0.2 - debug: 4.3.5 - jose: 4.14.4 + '@types/express': 4.17.23 + '@types/jsonwebtoken': 9.0.10 + debug: 4.4.1 + jose: 4.15.9 limiter: 1.1.5 - lru-memoizer: 2.2.0 + lru-memoizer: 2.3.0 transitivePeerDependencies: - supports-color jws@3.2.2: dependencies: - jwa: 1.4.1 + jwa: 1.4.2 safe-buffer: 5.2.1 jws@4.0.0: dependencies: - jwa: 2.0.0 + jwa: 2.0.1 safe-buffer: 5.2.1 kew@0.7.0: optional: true + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + klaw@1.3.1: optionalDependencies: graceful-fs: 4.2.11 @@ -9783,7 +10545,7 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - libphonenumber-js@1.10.39: {} + libphonenumber-js@1.12.10: {} lilconfig@2.1.0: {} @@ -9798,18 +10560,15 @@ snapshots: lines-and-columns@1.2.4: {} - lint-staged@13.2.3: + lint-staged@13.3.0: dependencies: - chalk: 5.2.0 - cli-truncate: 3.1.0 - commander: 10.0.1 - debug: 4.3.5 + chalk: 5.3.0 + commander: 11.0.0 + debug: 4.3.4 execa: 7.2.0 lilconfig: 2.1.0 - listr2: 5.0.8 - micromatch: 4.0.7 - normalize-path: 3.0.0 - object-inspect: 1.12.3 + listr2: 6.6.1 + micromatch: 4.0.5 pidtree: 0.6.0 string-argv: 0.3.2 yaml: 2.3.1 @@ -9819,16 +10578,14 @@ snapshots: listenercount@1.0.1: {} - listr2@5.0.8: + listr2@6.6.1: dependencies: - cli-truncate: 2.1.0 + cli-truncate: 3.1.0 colorette: 2.0.20 - log-update: 4.0.0 - p-map: 4.0.0 - rfdc: 1.3.0 - rxjs: 7.8.1 - through: 2.3.8 - wrap-ansi: 7.0.0 + eventemitter3: 5.0.1 + log-update: 5.0.1 + rfdc: 1.4.1 + wrap-ansi: 8.1.0 loader-runner@4.3.0: {} @@ -9846,14 +10603,28 @@ snapshots: lodash.get@4.4.2: {} + lodash.includes@4.3.0: {} + lodash.isarguments@3.1.0: {} + lodash.isboolean@3.0.3: {} + + lodash.isinteger@4.0.4: {} + + lodash.isnumber@3.0.3: {} + + lodash.isplainobject@4.0.6: {} + + lodash.isstring@4.0.1: {} + lodash.memoize@4.1.2: {} lodash.merge@4.6.2: {} lodash.omit@4.5.0: {} + lodash.once@4.1.1: {} + lodash.sortby@4.7.0: optional: true @@ -9864,14 +10635,15 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 - log-update@4.0.0: + log-update@5.0.1: dependencies: - ansi-escapes: 4.3.2 - cli-cursor: 3.1.0 - slice-ansi: 4.0.0 - wrap-ansi: 6.2.0 + ansi-escapes: 5.0.0 + cli-cursor: 4.0.0 + slice-ansi: 5.0.0 + strip-ansi: 7.1.0 + wrap-ansi: 8.1.0 - logform@2.6.1: + logform@2.7.0: dependencies: '@colors/colors': 1.6.0 '@types/triple-beam': 1.3.5 @@ -9880,12 +10652,13 @@ snapshots: safe-stable-stringify: 2.5.0 triple-beam: 1.4.1 - lru-cache@10.2.0: {} + lru-cache@10.4.3: {} - lru-cache@4.0.2: + lru-cache@4.1.5: dependencies: pseudomap: 1.0.2 yallist: 2.1.2 + optional: true lru-cache@5.1.1: dependencies: @@ -9897,18 +10670,18 @@ snapshots: lru-cache@7.18.3: {} - lru-memoizer@2.2.0: + lru-memoizer@2.3.0: dependencies: lodash.clonedeep: 4.5.0 - lru-cache: 4.0.2 + lru-cache: 6.0.0 - luxon@3.4.4: {} + luxon@3.3.0: {} - macos-release@2.5.1: {} + luxon@3.7.1: {} - magic-string@0.30.0: + magic-string@0.30.8: dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.4 make-dir@3.1.0: dependencies: @@ -9916,7 +10689,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.5.4 + semver: 7.7.2 make-error@1.3.6: {} @@ -9927,6 +10700,8 @@ snapshots: mapcap@1.0.0: optional: true + math-intrinsics@1.1.0: {} + measured-core@1.51.1: dependencies: binary-search: 1.3.6 @@ -9945,9 +10720,9 @@ snapshots: memfs@3.5.3: dependencies: - fs-monkey: 1.0.4 + fs-monkey: 1.1.0 - merge-descriptors@1.0.1: {} + merge-descriptors@1.0.3: {} merge-stream@2.0.0: {} @@ -9955,7 +10730,12 @@ snapshots: methods@1.1.2: {} - micromatch@4.0.7: + micromatch@4.0.5: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + micromatch@4.0.8: dependencies: braces: 3.0.3 picomatch: 2.3.1 @@ -9978,11 +10758,23 @@ snapshots: minimatch@3.1.2: dependencies: - brace-expansion: 1.1.11 + brace-expansion: 1.1.12 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.2 minimatch@8.0.4: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 + + minimatch@9.0.3: + dependencies: + brace-expansion: 2.0.2 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 minimist@1.2.8: {} @@ -9994,7 +10786,7 @@ snapshots: minipass@5.0.0: {} - minipass@7.0.2: {} + minipass@7.1.2: {} minizlib@2.1.2: dependencies: @@ -10011,21 +10803,21 @@ snapshots: mkdirp@1.0.4: {} - module-details-from-path@1.0.3: + module-details-from-path@1.0.4: optional: true - moment@2.29.3: {} + moment@2.30.1: {} monitor-event-loop-delay@1.0.0: optional: true - morgan@1.10.0: + morgan@1.10.1: dependencies: basic-auth: 2.0.1 debug: 2.6.9 depd: 2.0.0 on-finished: 2.3.0 - on-headers: 1.0.2 + on-headers: 1.1.0 transitivePeerDependencies: - supports-color @@ -10035,23 +10827,23 @@ snapshots: ms@2.1.3: {} - msgpackr-extract@3.0.2: + msgpackr-extract@3.0.3: dependencies: - node-gyp-build-optional-packages: 5.0.7 + node-gyp-build-optional-packages: 5.2.2 optionalDependencies: - '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.2 - '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.2 - '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.2 - '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.2 - '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.2 - '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.2 + '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3 optional: true - msgpackr@1.9.6: + msgpackr@1.11.5: optionalDependencies: - msgpackr-extract: 3.0.2 + msgpackr-extract: 3.0.3 - multer@1.4.4-lts.1: + multer@1.4.5-lts.1: dependencies: append-field: 1.0.0 busboy: 1.6.0 @@ -10061,11 +10853,11 @@ snapshots: type-is: 1.6.18 xtend: 4.0.2 - multer@1.4.5-lts.1: + multer@2.0.2: dependencies: append-field: 1.0.0 busboy: 1.6.0 - concat-stream: 1.6.2 + concat-stream: 2.0.0 mkdirp: 0.5.6 object-assign: 4.1.1 type-is: 1.6.18 @@ -10073,19 +10865,13 @@ snapshots: mute-stream@0.0.8: {} - mz@2.7.0: - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 + mute-stream@1.0.0: {} nanoid@4.0.2: {} - nats@2.15.1: + nats@2.29.3: dependencies: - nkeys.js: 1.0.5 - - natural-compare-lite@1.4.0: {} + nkeys.js: 1.1.0 natural-compare@1.4.0: {} @@ -10093,12 +10879,12 @@ snapshots: neo-async@2.6.2: {} - nestjs-cls@4.4.1(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/core@10.1.3)(reflect-metadata@0.1.13)(rxjs@7.8.1): + nestjs-cls@4.5.0(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.20)(reflect-metadata@0.1.14)(rxjs@7.8.2): dependencies: - '@nestjs/common': 10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.1.3(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(@nestjs/microservices@10.1.3)(@nestjs/platform-express@10.1.3)(@nestjs/websockets@10.1.3)(reflect-metadata@0.1.13)(rxjs@7.8.1) - reflect-metadata: 0.1.13 - rxjs: 7.8.1 + '@nestjs/common': 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/core': 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.20)(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(reflect-metadata@0.1.14)(rxjs@7.8.2) + reflect-metadata: 0.1.14 + rxjs: 7.8.2 nestjs-rate-limiter@3.1.0: dependencies: @@ -10106,19 +10892,17 @@ snapshots: nestjs-supabase-auth@1.0.9: {} - nestjs-typeorm-paginate@4.0.4(@nestjs/common@10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(typeorm@0.3.10(ioredis@5.3.2)(pg@8.11.2)(redis@3.1.2)(ts-node@10.9.1(@types/node@20.4.6)(typescript@5.1.6))): + nestjs-typeorm-paginate@4.1.0(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(typeorm@0.3.25(ioredis@5.6.1)(pg@8.16.3)(redis@3.1.2)(reflect-metadata@0.1.14)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))): dependencies: - '@nestjs/common': 10.2.8(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - typeorm: 0.3.10(ioredis@5.3.2)(pg@8.11.2)(redis@3.1.2)(ts-node@10.9.1(@types/node@20.4.6)(typescript@5.1.6)) + '@nestjs/common': 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + typeorm: 0.3.25(ioredis@5.6.1)(pg@8.16.3)(redis@3.1.2)(reflect-metadata@0.1.14)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3)) netmask@2.0.2: {} next-line@1.1.0: optional: true - next-tick@1.1.0: {} - - nkeys.js@1.0.5: + nkeys.js@1.1.0: dependencies: tweetnacl: 1.0.3 @@ -10130,20 +10914,20 @@ snapshots: dependencies: lodash: 4.17.21 - node-fetch@2.6.12: + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 - node-gyp-build-optional-packages@5.0.7: + node-gyp-build-optional-packages@5.2.2: + dependencies: + detect-libc: 2.0.4 optional: true - node-gyp-build@4.6.0: {} - - node-html-to-image@4.0.0(bufferutil@4.0.7)(utf-8-validate@5.0.10): + node-html-to-image@4.0.0: dependencies: handlebars: 4.7.8 - puppeteer: 21.0.1(bufferutil@4.0.7)(utf-8-validate@5.0.10) - puppeteer-cluster: 0.23.0(puppeteer@21.0.1(bufferutil@4.0.7)(utf-8-validate@5.0.10)) + puppeteer: 21.0.1 + puppeteer-cluster: 0.23.0(puppeteer@21.0.1) transitivePeerDependencies: - bufferutil - encoding @@ -10154,7 +10938,7 @@ snapshots: node-qpdf2@2.0.0: {} - node-releases@2.0.13: {} + node-releases@2.0.19: {} nopt@5.0.0: dependencies: @@ -10166,7 +10950,7 @@ snapshots: dependencies: path-key: 3.1.1 - npm-run-path@5.1.0: + npm-run-path@5.3.0: dependencies: path-key: 4.0.0 @@ -10189,50 +10973,54 @@ snapshots: object-identity-map@1.0.2: dependencies: - object.entries: 1.1.8 + object.entries: 1.1.9 optional: true - object-inspect@1.12.3: {} + object-inspect@1.13.4: {} - object-is@1.1.5: + object-is@1.1.6: dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 + call-bind: 1.0.8 + define-properties: 1.2.1 object-keys@1.1.1: {} - object.assign@4.1.4: + object.assign@4.1.7: dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - has-symbols: 1.0.3 + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 object-keys: 1.1.1 - object.entries@1.1.8: + object.entries@1.1.9: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 optional: true - object.fromentries@2.0.6: + object.fromentries@2.0.8: dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 - object.groupby@1.0.0: + object.groupby@1.0.3: dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - get-intrinsic: 1.2.1 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 - object.values@1.1.6: + object.values@1.2.1: dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 on-finished@2.3.0: dependencies: @@ -10242,7 +11030,7 @@ snapshots: dependencies: ee-first: 1.1.1 - on-headers@1.0.2: {} + on-headers@1.1.0: {} once@1.4.0: dependencies: @@ -10263,21 +11051,21 @@ snapshots: optional-js@2.3.0: optional: true - optionator@0.9.3: + optionator@0.9.4: dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 + word-wrap: 1.2.5 ora@5.4.1: dependencies: bl: 4.1.0 chalk: 4.1.2 cli-cursor: 3.1.0 - cli-spinners: 2.9.0 + cli-spinners: 2.9.2 is-interactive: 1.0.0 is-unicode-supported: 0.1.0 log-symbols: 4.1.0 @@ -10289,13 +11077,14 @@ snapshots: forwarded-parse: 2.1.2 optional: true - os-name@4.0.1: - dependencies: - macos-release: 2.5.1 - windows-release: 4.0.0 - os-tmpdir@1.0.2: {} + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -10312,36 +11101,31 @@ snapshots: dependencies: p-limit: 3.1.0 - p-map@4.0.0: - dependencies: - aggregate-error: 3.1.0 - p-try@2.2.0: {} - pac-proxy-agent@7.0.1: + pac-proxy-agent@7.2.0: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 - agent-base: 7.1.0 - debug: 4.3.5 - get-uri: 6.0.2 - http-proxy-agent: 7.0.0 - https-proxy-agent: 7.0.2 - pac-resolver: 7.0.0 - socks-proxy-agent: 8.0.2 + agent-base: 7.1.4 + debug: 4.3.4 + get-uri: 6.0.5 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + pac-resolver: 7.0.1 + socks-proxy-agent: 8.0.5 transitivePeerDependencies: - supports-color - pac-resolver@7.0.0: + pac-resolver@7.0.1: dependencies: degenerator: 5.0.1 - ip: 1.1.8 netmask: 2.0.2 - packet-reader@1.0.0: {} + package-json-from-dist@1.0.1: {} pako@0.2.9: {} - papaparse@5.4.1: {} + papaparse@5.5.3: {} parent-module@1.0.1: dependencies: @@ -10349,24 +11133,16 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.22.5 + '@babel/code-frame': 7.27.1 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - parse5-htmlparser2-tree-adapter@6.0.1: - dependencies: - parse5: 6.0.1 - - parse5@5.1.1: {} - - parse5@6.0.1: {} - parseurl@1.3.3: {} passport-jwt@4.0.1: dependencies: - jsonwebtoken: 9.0.1 + jsonwebtoken: 9.0.2 passport-strategy: 1.0.0 passport-local@1.0.0: @@ -10391,14 +11167,14 @@ snapshots: path-parse@1.0.7: {} - path-scurry@1.10.1: + path-scurry@1.11.1: dependencies: - lru-cache: 10.2.0 - minipass: 7.0.2 + lru-cache: 10.4.3 + minipass: 7.1.2 - path-to-regexp@0.1.7: {} + path-to-regexp@0.1.12: {} - path-to-regexp@3.2.0: {} + path-to-regexp@3.3.0: {} path-type@4.0.0: {} @@ -10411,7 +11187,7 @@ snapshots: pdfkit@0.13.0: dependencies: - crypto-js: 4.1.1 + crypto-js: 4.2.0 fontkit: 1.9.0 linebreak: 1.1.0 png-js: 1.0.0 @@ -10421,18 +11197,18 @@ snapshots: performance-now@2.1.0: optional: true - pg-cloudflare@1.1.1: + pg-cloudflare@1.2.7: optional: true - pg-connection-string@2.6.2: {} + pg-connection-string@2.9.1: {} pg-int8@1.0.1: {} - pg-pool@3.6.1(pg@8.11.2): + pg-pool@3.10.1(pg@8.16.3): dependencies: - pg: 8.11.2 + pg: 8.16.3 - pg-protocol@1.6.0: {} + pg-protocol@1.10.3: {} pg-types@2.2.0: dependencies: @@ -10442,17 +11218,15 @@ snapshots: postgres-date: 1.0.7 postgres-interval: 1.2.0 - pg@8.11.2: + pg@8.16.3: dependencies: - buffer-writer: 2.0.0 - packet-reader: 1.0.0 - pg-connection-string: 2.6.2 - pg-pool: 3.6.1(pg@8.11.2) - pg-protocol: 1.6.0 + pg-connection-string: 2.9.1 + pg-pool: 3.10.1(pg@8.16.3) + pg-protocol: 1.10.3 pg-types: 2.2.0 pgpass: 1.0.5 optionalDependencies: - pg-cloudflare: 1.1.1 + pg-cloudflare: 1.2.7 pgpass@1.0.5: dependencies: @@ -10473,10 +11247,12 @@ snapshots: - supports-color optional: true - picocolors@1.0.0: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} + picomatch@4.0.1: {} + pidtree@0.6.0: {} pinkie-promise@2.0.1: @@ -10501,7 +11277,7 @@ snapshots: sonic-boom: 1.4.1 optional: true - pirates@4.0.6: {} + pirates@4.0.7: {} pkg-dir@4.2.0: dependencies: @@ -10513,6 +11289,8 @@ snapshots: pngjs@5.0.0: {} + possible-typed-array-names@1.1.0: {} + postgres-array@2.0.0: {} postgres-bytea@1.0.0: {} @@ -10529,17 +11307,19 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier@3.0.1: {} + prettier@3.6.2: {} - pretty-format@29.6.2: + pretty-format@29.7.0: dependencies: - '@jest/schemas': 29.6.0 + '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 - react-is: 18.2.0 + react-is: 18.3.1 - prisma@5.1.1: + prisma@5.22.0: dependencies: - '@prisma/engines': 5.1.1 + '@prisma/engines': 5.22.0 + optionalDependencies: + fsevents: 2.3.3 process-nextick-args@2.0.1: {} @@ -10571,97 +11351,100 @@ snapshots: proxy-agent@6.3.0: dependencies: - agent-base: 7.1.0 - debug: 4.3.5 - http-proxy-agent: 7.0.0 - https-proxy-agent: 7.0.2 + agent-base: 7.1.4 + debug: 4.3.4 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 lru-cache: 7.18.3 - pac-proxy-agent: 7.0.1 + pac-proxy-agent: 7.2.0 proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.2 + socks-proxy-agent: 8.0.5 transitivePeerDependencies: - supports-color proxy-agent@6.3.1: dependencies: - agent-base: 7.1.0 - debug: 4.3.5 - http-proxy-agent: 7.0.0 - https-proxy-agent: 7.0.2 + agent-base: 7.1.4 + debug: 4.3.4 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 lru-cache: 7.18.3 - pac-proxy-agent: 7.0.1 + pac-proxy-agent: 7.2.0 proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.2 + socks-proxy-agent: 8.0.5 transitivePeerDependencies: - supports-color proxy-from-env@1.1.0: {} - pseudomap@1.0.2: {} + pseudomap@1.0.2: + optional: true - psl@1.9.0: + psl@1.15.0: + dependencies: + punycode: 2.3.1 optional: true - pump@3.0.0: + pump@3.0.3: dependencies: - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 once: 1.4.0 punycode@1.3.2: {} - punycode@2.3.0: {} + punycode@2.3.1: {} - puppeteer-cluster@0.23.0(puppeteer@21.0.1(bufferutil@4.0.7)(utf-8-validate@5.0.10)): + puppeteer-cluster@0.23.0(puppeteer@21.0.1): dependencies: - debug: 4.3.5 - puppeteer: 21.0.1(bufferutil@4.0.7)(utf-8-validate@5.0.10) + debug: 4.4.1 + puppeteer: 21.0.1 transitivePeerDependencies: - supports-color - puppeteer-core@21.0.1(bufferutil@4.0.7)(utf-8-validate@5.0.10): + puppeteer-core@21.0.1: dependencies: '@puppeteer/browsers': 1.5.0 chromium-bidi: 0.4.20(devtools-protocol@0.0.1147663) cross-fetch: 4.0.0 debug: 4.3.4 devtools-protocol: 0.0.1147663 - ws: 8.13.0(bufferutil@4.0.7)(utf-8-validate@5.0.10) + ws: 8.13.0 transitivePeerDependencies: - bufferutil - encoding - supports-color - utf-8-validate - puppeteer-core@21.5.0(bufferutil@4.0.7)(utf-8-validate@5.0.10): + puppeteer-core@21.11.0: dependencies: - '@puppeteer/browsers': 1.8.0 - chromium-bidi: 0.4.33(devtools-protocol@0.0.1203626) + '@puppeteer/browsers': 1.9.1 + chromium-bidi: 0.5.8(devtools-protocol@0.0.1232444) cross-fetch: 4.0.0 debug: 4.3.4 - devtools-protocol: 0.0.1203626 - ws: 8.14.2(bufferutil@4.0.7)(utf-8-validate@5.0.10) + devtools-protocol: 0.0.1232444 + ws: 8.16.0 transitivePeerDependencies: - bufferutil - encoding - supports-color - utf-8-validate - puppeteer@21.0.1(bufferutil@4.0.7)(utf-8-validate@5.0.10): + puppeteer@21.0.1: dependencies: '@puppeteer/browsers': 1.5.0 cosmiconfig: 8.2.0 - puppeteer-core: 21.0.1(bufferutil@4.0.7)(utf-8-validate@5.0.10) + puppeteer-core: 21.0.1 transitivePeerDependencies: - bufferutil - encoding - supports-color - utf-8-validate - puppeteer@21.5.0(bufferutil@4.0.7)(typescript@5.1.6)(utf-8-validate@5.0.10): + puppeteer@21.11.0(typescript@5.8.3): dependencies: - '@puppeteer/browsers': 1.8.0 - cosmiconfig: 8.3.6(typescript@5.1.6) - puppeteer-core: 21.5.0(bufferutil@4.0.7)(utf-8-validate@5.0.10) + '@puppeteer/browsers': 1.9.1 + cosmiconfig: 9.0.0(typescript@5.8.3) + puppeteer-core: 21.11.0 transitivePeerDependencies: - bufferutil - encoding @@ -10669,22 +11452,21 @@ snapshots: - typescript - utf-8-validate - pure-rand@6.0.2: {} + pure-rand@6.1.0: {} - qrcode@1.5.3: + qrcode@1.5.4: dependencies: dijkstrajs: 1.0.3 - encode-utf8: 1.0.3 pngjs: 5.0.0 yargs: 15.4.1 - qs@6.11.0: + qs@6.13.0: dependencies: - side-channel: 1.0.4 + side-channel: 1.1.0 - qs@6.11.2: + qs@6.14.0: dependencies: - side-channel: 1.0.4 + side-channel: 1.1.0 qs@6.5.3: optional: true @@ -10693,8 +11475,6 @@ snapshots: queue-microtask@1.2.3: {} - queue-tick@1.0.1: {} - quick-format-unescaped@4.0.4: optional: true @@ -10706,13 +11486,6 @@ snapshots: rate-limiter-flexible@2.1.10: {} - raw-body@2.5.1: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - raw-body@2.5.2: dependencies: bytes: 3.1.2 @@ -10720,7 +11493,7 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 - react-is@18.2.0: {} + react-is@18.3.1: {} readable-stream@2.3.8: dependencies: @@ -10738,21 +11511,11 @@ snapshots: string_decoder: 1.3.0 util-deprecate: 1.0.2 - readable-stream@4.5.2: - dependencies: - abort-controller: 3.0.0 - buffer: 6.0.3 - events: 3.3.0 - process: 0.11.10 - string_decoder: 1.3.0 - readdirp@3.6.0: dependencies: picomatch: 2.3.1 - rechoir@0.6.2: - dependencies: - resolve: 1.22.3 + readline@1.3.0: {} redis-commands@1.7.0: {} @@ -10769,15 +11532,27 @@ snapshots: redis-errors: 1.2.0 redis-parser: 3.0.0 - reflect-metadata@0.1.13: {} + reflect-metadata@0.1.14: {} - regenerator-runtime@0.13.11: {} + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 - regexp.prototype.flags@1.5.0: + regexp.prototype.flags@1.5.4: dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - functions-have-names: 1.2.3 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 regexpp@3.2.0: {} @@ -10788,13 +11563,13 @@ snapshots: request-progress@2.0.1: dependencies: - throttleit: 1.0.0 + throttleit: 1.0.1 optional: true request@2.88.2: dependencies: aws-sign2: 0.7.0 - aws4: 1.12.0 + aws4: 1.13.2 caseless: 0.12.0 combined-stream: 1.0.8 extend: 3.0.2 @@ -10819,11 +11594,11 @@ snapshots: require-from-string@2.0.2: {} - require-in-the-middle@7.4.0: + require-in-the-middle@7.5.2: dependencies: - debug: 4.3.5 - module-details-from-path: 1.0.3 - resolve: 1.22.8 + debug: 4.4.1 + module-details-from-path: 1.0.4 + resolve: 1.22.10 transitivePeerDependencies: - supports-color optional: true @@ -10838,28 +11613,20 @@ snapshots: resolve-from@5.0.0: {} - resolve.exports@2.0.2: {} - - resolve@1.22.2: - dependencies: - is-core-module: 2.12.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 + resolve.exports@2.0.3: {} - resolve@1.22.3: + resolve@1.22.10: dependencies: - is-core-module: 2.12.1 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - resolve@1.22.8: + restore-cursor@3.1.0: dependencies: - is-core-module: 2.15.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - optional: true + onetime: 5.1.2 + signal-exit: 3.0.7 - restore-cursor@3.1.0: + restore-cursor@4.0.0: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 @@ -10868,9 +11635,9 @@ snapshots: retry@0.13.1: {} - reusify@1.0.4: {} + reusify@1.1.0: {} - rfdc@1.3.0: {} + rfdc@1.4.1: {} rimraf@2.7.1: dependencies: @@ -10888,30 +11655,42 @@ snapshots: run-async@2.4.1: {} + run-async@3.0.0: {} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 rxjs@7.8.1: dependencies: - tslib: 2.6.2 + tslib: 2.8.1 + + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 - safe-array-concat@1.0.0: + safe-array-concat@1.1.3: dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - has-symbols: 1.0.3 + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 isarray: 2.0.5 safe-buffer@5.1.2: {} safe-buffer@5.2.1: {} - safe-regex-test@1.0.0: + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - is-regex: 1.1.4 + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 safe-stable-stringify@2.5.0: {} @@ -10919,23 +11698,28 @@ snapshots: sax@1.2.1: {} - sax@1.2.4: {} + sax@1.4.1: {} schema-utils@3.3.0: dependencies: - '@types/json-schema': 7.0.12 + '@types/json-schema': 7.0.15 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) + schema-utils@4.3.2: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + ajv-keywords: 5.1.0(ajv@8.17.1) + secure-json-parse@2.7.0: {} semver@6.3.1: {} - semver@7.5.4: - dependencies: - lru-cache: 6.0.0 + semver@7.7.2: {} - send@0.18.0: + send@0.19.0: dependencies: debug: 2.6.9 depd: 2.0.0 @@ -10953,16 +11737,16 @@ snapshots: transitivePeerDependencies: - supports-color - serialize-javascript@6.0.1: + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 - serve-static@1.15.0: + serve-static@1.16.2: dependencies: - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 parseurl: 1.3.3 - send: 0.18.0 + send: 0.19.0 transitivePeerDependencies: - supports-color @@ -10973,19 +11757,32 @@ snapshots: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 has-property-descriptors: 1.0.2 - optional: true + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 setimmediate@1.0.5: {} setprototypeof@1.2.0: {} - sha.js@2.4.11: + sha.js@2.4.12: dependencies: inherits: 2.0.4 safe-buffer: 5.2.1 + to-buffer: 1.2.1 shallow-clone-shim@2.0.0: optional: true @@ -10996,20 +11793,38 @@ snapshots: shebang-regex@3.0.0: {} - shelljs@0.8.5: + side-channel-list@1.0.0: dependencies: - glob: 7.2.3 - interpret: 1.4.0 - rechoir: 0.6.2 + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 - side-channel@1.0.4: + side-channel@1.1.0: dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - object-inspect: 1.12.3 + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 signal-exit@3.0.7: {} + signal-exit@4.1.0: {} + simple-swizzle@0.2.2: dependencies: is-arrayish: 0.3.2 @@ -11018,18 +11833,6 @@ snapshots: slash@3.0.0: {} - slice-ansi@3.0.0: - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - - slice-ansi@4.0.0: - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - slice-ansi@5.0.0: dependencies: ansi-styles: 6.2.1 @@ -11037,18 +11840,20 @@ snapshots: smart-buffer@4.2.0: {} - socket.io-adapter@2.5.2(bufferutil@4.0.7)(utf-8-validate@5.0.10): + socket.io-adapter@2.5.5: dependencies: - ws: 8.11.0(bufferutil@4.0.7)(utf-8-validate@5.0.10) + debug: 4.3.7 + ws: 8.17.1 transitivePeerDependencies: - bufferutil + - supports-color - utf-8-validate - socket.io-client@4.7.1(bufferutil@4.0.7)(utf-8-validate@5.0.10): + socket.io-client@4.8.1: dependencies: - '@socket.io/component-emitter': 3.1.0 - debug: 4.3.5 - engine.io-client: 6.5.2(bufferutil@4.0.7)(utf-8-validate@5.0.10) + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + engine.io-client: 6.6.3 socket.io-parser: 4.2.4 transitivePeerDependencies: - bufferutil @@ -11057,36 +11862,36 @@ snapshots: socket.io-parser@4.2.4: dependencies: - '@socket.io/component-emitter': 3.1.0 - debug: 4.3.5 + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 transitivePeerDependencies: - supports-color - socket.io@4.7.1(bufferutil@4.0.7)(utf-8-validate@5.0.10): + socket.io@4.8.1: dependencies: accepts: 1.3.8 base64id: 2.0.0 cors: 2.8.5 - debug: 4.3.5 - engine.io: 6.5.2(bufferutil@4.0.7)(utf-8-validate@5.0.10) - socket.io-adapter: 2.5.2(bufferutil@4.0.7)(utf-8-validate@5.0.10) + debug: 4.3.7 + engine.io: 6.6.4 + socket.io-adapter: 2.5.5 socket.io-parser: 4.2.4 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - socks-proxy-agent@8.0.2: + socks-proxy-agent@8.0.5: dependencies: - agent-base: 7.1.0 - debug: 4.3.5 - socks: 2.7.1 + agent-base: 7.1.4 + debug: 4.3.4 + socks: 2.8.6 transitivePeerDependencies: - supports-color - socks@2.7.1: + socks@2.8.6: dependencies: - ip: 2.0.0 + ip-address: 9.0.5 smart-buffer: 4.2.0 sonic-boom@1.4.1: @@ -11109,6 +11914,8 @@ snapshots: source-map@0.7.4: {} + source-map@0.7.6: {} + source-map@0.8.0-beta.0: dependencies: whatwg-url: 7.1.0 @@ -11118,10 +11925,14 @@ snapshots: sprintf-js@1.0.3: {} + sprintf-js@1.1.3: {} + + sql-highlight@6.1.0: {} + sql-summary@1.0.1: optional: true - sshpk@1.17.0: + sshpk@1.18.0: dependencies: asn1: 0.2.6 assert-plus: 1.0.0 @@ -11147,9 +11958,10 @@ snapshots: statuses@2.0.1: {} - stop-iteration-iterator@1.0.0: + stop-iteration-iterator@1.1.0: dependencies: - internal-slot: 1.0.5 + es-errors: 1.3.0 + internal-slot: 1.1.0 stream-chopper@3.0.1: dependencies: @@ -11158,10 +11970,12 @@ snapshots: streamsearch@1.1.0: {} - streamx@2.15.2: + streamx@2.22.1: dependencies: fast-fifo: 1.3.2 - queue-tick: 1.0.1 + text-decoder: 1.2.3 + optionalDependencies: + bare-events: 2.6.0 string-argv@0.3.2: {} @@ -11182,23 +11996,28 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - string.prototype.trim@1.2.7: + string.prototype.trim@1.2.10: dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 - string.prototype.trimend@1.0.6: + string.prototype.trimend@1.0.9: dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 - string.prototype.trimstart@1.0.6: + string.prototype.trimstart@1.0.8: dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 string_decoder@1.1.1: dependencies: @@ -11214,7 +12033,7 @@ snapshots: strip-ansi@7.1.0: dependencies: - ansi-regex: 6.0.1 + ansi-regex: 6.1.0 strip-bom@3.0.0: {} @@ -11226,48 +12045,48 @@ snapshots: strip-json-comments@3.1.1: {} - superagent@7.1.5: + strtok3@10.3.4: + dependencies: + '@tokenizer/token': 0.3.0 + + superagent@7.1.6: dependencies: - component-emitter: 1.3.0 + component-emitter: 1.3.1 cookiejar: 2.1.4 - debug: 4.3.5 + debug: 4.4.1 fast-safe-stringify: 2.1.1 - form-data: 4.0.0 - formidable: 2.1.2 + form-data: 4.0.4 + formidable: 2.1.5 methods: 1.1.2 mime: 2.6.0 - qs: 6.11.2 + qs: 6.14.0 readable-stream: 3.6.2 - semver: 7.5.4 + semver: 7.7.2 transitivePeerDependencies: - supports-color - superagent@8.0.9: + superagent@8.1.2: dependencies: - component-emitter: 1.3.0 + component-emitter: 1.3.1 cookiejar: 2.1.4 - debug: 4.3.5 + debug: 4.4.1 fast-safe-stringify: 2.1.1 - form-data: 4.0.0 - formidable: 2.1.2 + form-data: 4.0.4 + formidable: 2.1.5 methods: 1.1.2 mime: 2.6.0 - qs: 6.11.2 - semver: 7.5.4 + qs: 6.14.0 + semver: 7.7.2 transitivePeerDependencies: - supports-color - supertest@6.3.3: + supertest@6.3.4: dependencies: methods: 1.1.2 - superagent: 8.0.9 + superagent: 8.1.2 transitivePeerDependencies: - supports-color - supports-color@5.5.0: - dependencies: - has-flag: 3.0.0 - supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -11278,32 +12097,34 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - swagger-ui-dist@5.1.0: {} + swagger-ui-dist@5.17.14: {} - swagger-ui-dist@5.3.1: {} + swagger-ui-dist@5.27.0: + dependencies: + '@scarf/scarf': 1.4.0 - swagger-ui-express@5.0.0(express@4.18.2): + swagger-ui-express@5.0.1(express@4.21.2): dependencies: - express: 4.18.2 - swagger-ui-dist: 5.3.1 + express: 4.21.2 + swagger-ui-dist: 5.27.0 symbol-observable@4.0.0: {} - tapable@2.2.1: {} + tapable@2.2.2: {} tar-fs@3.0.4: dependencies: mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 3.1.6 + pump: 3.0.3 + tar-stream: 3.1.7 - tar-stream@3.1.6: + tar-stream@3.1.7: dependencies: - b4a: 1.6.4 + b4a: 1.6.7 fast-fifo: 1.3.2 - streamx: 2.15.2 + streamx: 2.22.1 - tar@6.1.15: + tar@6.2.1: dependencies: chownr: 2.0.0 fs-minipass: 2.1.0 @@ -11312,19 +12133,19 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 - terser-webpack-plugin@5.3.9(webpack@5.88.1): + terser-webpack-plugin@5.3.14(webpack@5.97.1): dependencies: - '@jridgewell/trace-mapping': 0.3.18 + '@jridgewell/trace-mapping': 0.3.29 jest-worker: 27.5.1 - schema-utils: 3.3.0 - serialize-javascript: 6.0.1 - terser: 5.19.2 - webpack: 5.88.1 + schema-utils: 4.3.2 + serialize-javascript: 6.0.2 + terser: 5.43.1 + webpack: 5.97.1 - terser@5.19.2: + terser@5.43.1: dependencies: - '@jridgewell/source-map': 0.3.5 - acorn: 8.10.0 + '@jridgewell/source-map': 0.3.10 + acorn: 8.15.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -11334,19 +12155,15 @@ snapshots: glob: 7.2.3 minimatch: 3.1.2 + text-decoder@1.2.3: + dependencies: + b4a: 1.6.7 + text-hex@1.0.0: {} text-table@0.2.0: {} - thenify-all@1.6.0: - dependencies: - thenify: 3.3.1 - - thenify@3.3.1: - dependencies: - any-promise: 1.3.0 - - throttleit@1.0.0: + throttleit@1.0.1: optional: true through@2.3.8: {} @@ -11359,7 +12176,11 @@ snapshots: tmpl@1.0.5: {} - to-fast-properties@2.0.0: {} + to-buffer@1.2.1: + dependencies: + isarray: 2.0.5 + safe-buffer: 5.2.1 + typed-array-buffer: 1.0.3 to-regex-range@5.0.1: dependencies: @@ -11372,17 +12193,22 @@ snapshots: toidentifier@1.0.1: {} + token-types@6.0.4: + dependencies: + '@tokenizer/token': 0.3.0 + ieee754: 1.2.1 + tough-cookie@2.5.0: dependencies: - psl: 1.9.0 - punycode: 2.3.0 + psl: 1.15.0 + punycode: 2.3.1 optional: true tr46@0.0.3: {} tr46@1.0.1: dependencies: - punycode: 2.3.0 + punycode: 2.3.1 optional: true traverse@0.3.9: {} @@ -11391,61 +12217,66 @@ snapshots: triple-beam@1.4.1: {} - ts-api-utils@1.0.1(typescript@5.1.6): + ts-api-utils@1.4.3(typescript@5.8.3): dependencies: - typescript: 5.1.6 + typescript: 5.8.3 - ts-jest@29.1.1(@babel/core@7.22.9)(@jest/types@29.6.1)(babel-jest@29.6.2(@babel/core@7.22.9))(jest@29.6.2(@types/node@20.4.6)(ts-node@10.9.1(@types/node@20.4.6)(typescript@5.1.6)))(typescript@5.1.6): + ts-jest@29.4.0(@babel/core@7.28.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.0))(jest-util@29.7.0)(jest@29.7.0(@types/node@20.19.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3)))(typescript@5.8.3): dependencies: bs-logger: 0.2.6 + ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.6.2(@types/node@20.4.6)(ts-node@10.9.1(@types/node@20.4.6)(typescript@5.1.6)) - jest-util: 29.6.2 + jest: 29.7.0(@types/node@20.19.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3)) json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.5.4 - typescript: 5.1.6 + semver: 7.7.2 + type-fest: 4.41.0 + typescript: 5.8.3 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.22.9 - '@jest/types': 29.6.1 - babel-jest: 29.6.2(@babel/core@7.22.9) + '@babel/core': 7.28.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.28.0) + jest-util: 29.7.0 - ts-loader@9.4.4(typescript@5.1.6)(webpack@5.88.1): + ts-loader@9.5.2(typescript@5.8.3)(webpack@5.97.1): dependencies: chalk: 4.1.2 - enhanced-resolve: 5.15.0 - micromatch: 4.0.7 - semver: 7.5.4 - typescript: 5.1.6 - webpack: 5.88.1 + enhanced-resolve: 5.18.2 + micromatch: 4.0.8 + semver: 7.7.2 + source-map: 0.7.6 + typescript: 5.8.3 + webpack: 5.97.1 - ts-node@10.9.1(@types/node@20.4.6)(typescript@5.1.6): + ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 + '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.4.6 - acorn: 8.10.0 - acorn-walk: 8.2.0 + '@types/node': 20.19.9 + acorn: 8.15.0 + acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.1.6 + typescript: 5.8.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - tsconfig-paths-webpack-plugin@4.1.0: + tsconfig-paths-webpack-plugin@4.2.0: dependencies: chalk: 4.1.2 - enhanced-resolve: 5.15.0 + enhanced-resolve: 5.18.2 + tapable: 2.2.2 tsconfig-paths: 4.2.0 - tsconfig-paths@3.14.2: + tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 json5: 1.0.2 @@ -11460,16 +12291,12 @@ snapshots: tslib@1.14.1: {} - tslib@2.6.0: {} + tslib@2.8.1: {} - tslib@2.6.1: {} - - tslib@2.6.2: {} - - tsutils@3.21.0(typescript@5.1.6): + tsutils@3.21.0(typescript@5.8.3): dependencies: tslib: 1.14.1 - typescript: 5.1.6 + typescript: 5.8.3 tunnel-agent@0.6.0: dependencies: @@ -11491,98 +12318,105 @@ snapshots: type-fest@0.21.3: {} + type-fest@1.4.0: {} + type-fest@2.19.0: {} + type-fest@4.41.0: {} + type-is@1.6.18: dependencies: media-typer: 0.3.0 mime-types: 2.1.35 - type@1.2.0: {} - - type@2.7.2: {} - - typed-array-buffer@1.0.0: - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - is-typed-array: 1.1.12 - - typed-array-byte-length@1.0.0: + typed-array-buffer@1.0.3: dependencies: - call-bind: 1.0.2 - for-each: 0.3.3 - has-proto: 1.0.1 - is-typed-array: 1.1.12 + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 - typed-array-byte-offset@1.0.0: + typed-array-byte-length@1.0.3: dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - for-each: 0.3.3 - has-proto: 1.0.1 - is-typed-array: 1.1.12 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 - typed-array-length@1.0.4: + typed-array-byte-offset@1.0.4: dependencies: - call-bind: 1.0.2 - for-each: 0.3.3 - is-typed-array: 1.1.12 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 - typedarray-to-buffer@3.1.5: + typed-array-length@1.0.7: dependencies: - is-typedarray: 1.0.0 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 typedarray@0.0.6: {} - typeorm@0.3.10(ioredis@5.3.2)(pg@8.11.2)(redis@3.1.2)(ts-node@10.9.1(@types/node@20.4.6)(typescript@5.1.6)): + typeorm@0.3.25(ioredis@5.6.1)(pg@8.16.3)(redis@3.1.2)(reflect-metadata@0.1.14)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3)): dependencies: '@sqltools/formatter': 1.2.5 + ansis: 3.17.0 app-root-path: 3.1.0 buffer: 6.0.3 - chalk: 4.1.2 - cli-highlight: 2.1.11 - date-fns: 2.30.0 - debug: 4.3.5 - dotenv: 16.0.3 - glob: 7.2.3 - js-yaml: 4.1.0 - mkdirp: 1.0.4 - reflect-metadata: 0.1.13 - sha.js: 2.4.11 - tslib: 2.6.1 - uuid: 8.3.2 - xml2js: 0.4.23 + dayjs: 1.11.13 + debug: 4.4.1 + dedent: 1.6.0 + dotenv: 16.6.1 + glob: 10.4.5 + reflect-metadata: 0.1.14 + sha.js: 2.4.12 + sql-highlight: 6.1.0 + tslib: 2.8.1 + uuid: 11.1.0 yargs: 17.7.2 optionalDependencies: - ioredis: 5.3.2 - pg: 8.11.2 + ioredis: 5.6.1 + pg: 8.16.3 redis: 3.1.2 - ts-node: 10.9.1(@types/node@20.4.6)(typescript@5.1.6) + ts-node: 10.9.2(@types/node@20.19.9)(typescript@5.8.3) transitivePeerDependencies: + - babel-plugin-macros - supports-color - typescript@5.1.6: {} + typescript@5.7.2: {} + + typescript@5.8.3: {} - uglify-js@3.17.4: + uglify-js@3.19.3: optional: true uid@2.0.2: dependencies: '@lukeed/csprng': 1.1.0 - unbox-primitive@1.0.2: + uint8array-extras@1.4.0: {} + + unbox-primitive@1.1.0: dependencies: - call-bind: 1.0.2 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 unbzip2-stream@1.4.3: dependencies: buffer: 5.7.1 through: 2.3.8 + undici-types@6.21.0: {} + unfetch@4.2.0: {} unicode-byte-truncate@1.0.0: @@ -11604,15 +12438,13 @@ snapshots: pako: 0.2.9 tiny-inflate: 1.0.3 - universalify@0.1.2: {} - - universalify@2.0.0: {} + universalify@2.0.1: {} unpipe@1.0.0: {} unzipper@0.10.14: dependencies: - big-integer: 1.6.51 + big-integer: 1.6.52 binary: 0.3.0 bluebird: 3.4.7 buffer-indexof-polyfill: 1.0.2 @@ -11623,15 +12455,15 @@ snapshots: readable-stream: 2.3.8 setimmediate: 1.0.5 - update-browserslist-db@1.0.11(browserslist@4.21.10): + update-browserslist-db@1.1.3(browserslist@4.25.1): dependencies: - browserslist: 4.21.10 - escalade: 3.1.1 - picocolors: 1.0.0 + browserslist: 4.25.1 + escalade: 3.2.0 + picocolors: 1.1.1 uri-js@4.4.1: dependencies: - punycode: 2.3.0 + punycode: 2.3.1 url-join@4.0.1: {} @@ -11640,13 +12472,7 @@ snapshots: punycode: 1.3.2 querystring: 0.2.0 - urlpattern-polyfill@9.0.0: {} - - urlsafe-base64@1.0.0: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.6.0 + urlpattern-polyfill@10.0.0: {} util-deprecate@1.0.2: {} @@ -11657,13 +12483,15 @@ snapshots: util@0.12.5: dependencies: inherits: 2.0.4 - is-arguments: 1.1.1 - is-generator-function: 1.0.10 - is-typed-array: 1.1.12 - which-typed-array: 1.1.11 + is-arguments: 1.2.0 + is-generator-function: 1.1.0 + is-typed-array: 1.1.15 + which-typed-array: 1.1.19 utils-merge@1.0.1: {} + uuid@11.1.0: {} + uuid@3.4.0: optional: true @@ -11671,17 +12499,17 @@ snapshots: uuid@8.3.2: {} - uuid@9.0.0: {} + uuid@9.0.1: {} v8-compile-cache-lib@3.0.1: {} - v8-to-istanbul@9.1.0: + v8-to-istanbul@9.3.0: dependencies: - '@jridgewell/trace-mapping': 0.3.18 - '@types/istanbul-lib-coverage': 2.0.4 - convert-source-map: 1.9.0 + '@jridgewell/trace-mapping': 0.3.29 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 - validator@13.11.0: {} + validator@13.15.15: {} vary@1.1.2: {} @@ -11696,7 +12524,7 @@ snapshots: dependencies: makeerror: 1.0.12 - watchpack@2.4.0: + watchpack@2.4.4: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 @@ -11705,11 +12533,11 @@ snapshots: dependencies: defaults: 1.0.4 - web-push@3.6.4: + web-push@3.6.7: dependencies: asn1.js: 5.4.1 - http_ece: 1.1.0 - https-proxy-agent: 7.0.2 + http_ece: 1.2.0 + https-proxy-agent: 7.0.6 jws: 4.0.0 minimist: 1.2.8 transitivePeerDependencies: @@ -11722,21 +12550,20 @@ snapshots: webpack-node-externals@3.0.0: {} - webpack-sources@3.2.3: {} - - webpack@5.88.1: - dependencies: - '@types/eslint-scope': 3.7.4 - '@types/estree': 1.0.1 - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/wasm-edit': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - acorn: 8.10.0 - acorn-import-assertions: 1.9.0(acorn@8.10.0) - browserslist: 4.21.10 - chrome-trace-event: 1.0.3 - enhanced-resolve: 5.15.0 - es-module-lexer: 1.3.0 + webpack-sources@3.3.3: {} + + webpack@5.97.1: + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.8 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.15.0 + browserslist: 4.25.1 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.18.2 + es-module-lexer: 1.7.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -11746,26 +12573,15 @@ snapshots: mime-types: 2.1.35 neo-async: 2.6.2 schema-utils: 3.3.0 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(webpack@5.88.1) - watchpack: 2.4.0 - webpack-sources: 3.2.3 + tapable: 2.2.2 + terser-webpack-plugin: 5.3.14(webpack@5.97.1) + watchpack: 2.4.4 + webpack-sources: 3.3.3 transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - websocket@1.0.34: - dependencies: - bufferutil: 4.0.7 - debug: 2.6.9 - es5-ext: 0.10.62 - typedarray-to-buffer: 3.1.5 - utf-8-validate: 5.0.10 - yaeti: 0.0.6 - transitivePeerDependencies: - - supports-color - whatwg-url@5.0.0: dependencies: tr46: 0.0.3 @@ -11778,30 +12594,48 @@ snapshots: webidl-conversions: 4.0.2 optional: true - which-boxed-primitive@1.0.2: + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.19 - which-collection@1.0.1: + which-collection@1.0.2: dependencies: - is-map: 2.0.2 - is-set: 2.0.2 - is-weakmap: 2.0.1 - is-weakset: 2.0.2 + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 which-module@2.0.1: {} - which-typed-array@1.1.11: + which-typed-array@1.1.19: dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 which@1.3.1: dependencies: @@ -11818,38 +12652,34 @@ snapshots: winchan@0.2.2: {} - windows-release@4.0.0: - dependencies: - execa: 4.1.0 - winston-daily-rotate-file@5.0.0(winston@3.4.0): dependencies: file-stream-rotator: 0.6.1 object-hash: 3.0.0 triple-beam: 1.4.1 winston: 3.4.0 - winston-transport: 4.8.0 + winston-transport: 4.9.0 winston-elasticsearch@0.16.0: dependencies: '@elastic/elasticsearch': 7.17.14 dayjs: 1.11.13 - debug: 4.3.5 + debug: 4.4.1 lodash.defaults: 4.2.0 lodash.omit: 4.5.0 promise: 8.3.0 retry: 0.13.1 winston: 3.4.0 - winston-transport: 4.8.0 + winston-transport: 4.9.0 optionalDependencies: - elastic-apm-node: 3.51.0 + elastic-apm-node: 3.52.2 transitivePeerDependencies: - supports-color - winston-transport@4.8.0: + winston-transport@4.9.0: dependencies: - logform: 2.6.1 - readable-stream: 4.5.2 + logform: 2.7.0 + readable-stream: 3.6.2 triple-beam: 1.4.1 winston@3.4.0: @@ -11857,12 +12687,14 @@ snapshots: '@dabh/diagnostics': 2.0.3 async: 3.2.6 is-stream: 2.0.1 - logform: 2.6.1 + logform: 2.7.0 one-time: 1.0.0 readable-stream: 3.6.2 stack-trace: 0.0.10 triple-beam: 1.4.1 - winston-transport: 4.8.0 + winston-transport: 4.9.0 + + word-wrap@1.2.5: {} wordwrap@1.0.0: {} @@ -11878,6 +12710,12 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + wrappy@1.0.2: {} write-file-atomic@4.0.2: @@ -11885,38 +12723,26 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 3.0.7 - ws@8.11.0(bufferutil@4.0.7)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.7 - utf-8-validate: 5.0.10 + ws@8.13.0: {} - ws@8.13.0(bufferutil@4.0.7)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.7 - utf-8-validate: 5.0.10 + ws@8.16.0: {} - ws@8.14.2(bufferutil@4.0.7)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.7 - utf-8-validate: 5.0.10 + ws@8.17.1: {} - xml-js@1.6.11: - dependencies: - sax: 1.2.4 + ws@8.18.3: {} - xml2js@0.4.23: + xml-js@1.6.11: dependencies: - sax: 1.2.4 - xmlbuilder: 11.0.1 + sax: 1.4.1 xml2js@0.6.2: dependencies: - sax: 1.2.4 + sax: 1.2.1 xmlbuilder: 11.0.1 xmlbuilder@11.0.1: {} - xmlhttprequest-ssl@2.0.0: {} + xmlhttprequest-ssl@2.1.2: {} xtend@4.0.2: {} @@ -11924,16 +12750,13 @@ snapshots: y18n@5.0.8: {} - yaeti@0.0.6: {} - - yallist@2.1.2: {} + yallist@2.1.2: + optional: true yallist@3.1.1: {} yallist@4.0.0: {} - yaml@1.10.2: {} - yaml@2.3.1: {} yargs-parser@18.1.3: @@ -11941,8 +12764,6 @@ snapshots: camelcase: 5.3.1 decamelize: 1.2.0 - yargs-parser@20.2.9: {} - yargs-parser@21.1.1: {} yargs@15.4.1: @@ -11959,20 +12780,10 @@ snapshots: y18n: 4.0.3 yargs-parser: 18.1.3 - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - yargs@17.7.1: dependencies: cliui: 8.0.1 - escalade: 3.1.1 + escalade: 3.2.0 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 @@ -11982,7 +12793,7 @@ snapshots: yargs@17.7.2: dependencies: cliui: 8.0.1 - escalade: 3.1.1 + escalade: 3.2.0 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 diff --git a/tsconfig.build.json b/tsconfig.build.json index ea4da31b2..70d7c0493 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -2,14 +2,19 @@ "compilerOptions": { "module": "commonjs", "declaration": true, - "removeComments": true, "emitDecoratorMetadata": true, "experimentalDecorators": true, - "target": "es2017", + "declarationMap": true, + "target": "es2020", "sourceMap": true, - "outDir": "./dist", - "baseUrl": "./", + // "outDir": "./dist/apps/", + "baseUrl": ".", "incremental": true, + "allowSyntheticDefaultImports": true, + "resolveJsonModule": true, + "noEmitOnError": true, + "skipLibCheck": true, + // "esModuleInterop": true, }, - "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] + "exclude": ["node_modules", "test", "dist", "**/*spec.ts", "scripts", "resources"] } \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 74a5fa904..59d01bca5 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,113 +1,108 @@ { "extends": "./tsconfig.build.json", + "ts-node": { + "files": true + }, "compilerOptions": { "paths": { - "@credebl/common": [ - "libs/common/src" - ], - "@credebl/common/*": [ - "libs/common/src/*" - ], - "@credebl/keycloak-url": [ - "libs/keycloak-url/src" - ], - "@credebl/keycloak-url/*": [ - "libs/keycloak-url/src/*" - ], - "@credebl/client-registration": [ - "libs/client-registration/src" - ], - "@credebl/client-registration/*": [ - "libs/client-registration/src/*" - ], - "@credebl/prisma": [ - "libs/prisma/src" - ], - "@credebl/prisma/*": [ - "libs/prisma/src/*" - ], - "@credebl/repositories": [ - "libs/repositories/src" - ], - "@credebl/repositories/*": [ - "libs/repositories/src/*" - ], - "@credebl/user-request": [ - "libs/user-request/src" - ], - "@credebl/user-request/*": [ - "libs/user-request/src/*" - ], - "@credebl/logger": [ - "libs/logger/src" - ], - "@credebl/logger/*": [ - "libs/logger/src/*" - ], - "@credebl/enum": [ - "libs/enum/src" - ], - "@credebl/enum/*": [ - "libs/enum/src/*" - ], - "@credebl/prisma-service": [ - "libs/prisma-service/src" - ], - "@credebl/prisma-service/*": [ - "libs/prisma-service/src/*" - ], - "@credebl/org-roles": [ - "libs/org-roles/src" - ], - "@credebl/org-roles/*": [ - "libs/org-roles/src/*" - ], - "@credebl/user-org-roles": [ - "libs/user-org-roles/src" - ], - "@credebl/user-org-roles/*": [ - "libs/user-org-roles/src/*" - ], - "@credebl/user-activity": [ - "libs/user-activity/src" - ], - "@credebl/user-activity/*": [ - "libs/user-activity/src/*" - ], - "@credebl/supabase": [ - "libs/supabase/src" - ], - "@credebl/supabase/*": [ - "libs/supabase/src/*" - ], - "@credebl/aws": [ - "libs/aws/src" - ], - "@credebl/aws/*": [ - "libs/aws/src/*" - ], - "credebl/utility": [ - "libs/utility/src" - ], - "credebl/utility/*": [ - "libs/utility/src/*" - ], - "@credebl/config": [ - "libs/config/src" - ], - "@credebl/config/*": [ - "libs/config/src/*" - ], - "@credebl/context": [ - "libs/context/src" - ], - "@credebl/context/*": [ - "libs/context/src/*" + // "@credebl/common": [ + // "libs/common/src" + // ], + // "@credebl/common/*": [ + // "libs/common/src/*" + // ], + // "@credebl/keycloak-url": [ + // "libs/keycloak-url/src" + // ], + // "@credebl/keycloak-url/*": [ + // "libs/keycloak-url/src/*" + // ], + // "@credebl/client-registration": [ + // "libs/client-registration/src" + // ], + // "@credebl/client-registration/*": [ + // "libs/client-registration/src/*" + // ], + // "@credebl/user-request": [ + // "libs/user-request/src" + // ], + // "@credebl/user-request/*": [ + // "libs/user-request/src/*" + // ], + // "@credebl/logger": [ + // "libs/logger/src" + // ], + // "@credebl/logger/*": [ + // "libs/logger/src/*" + // ], + // "@credebl/enum": [ + // "libs/common/src/enum/src" + // ], + // "@credebl/enum/*": [ + // "libs/common/src/enum/src/*" + // ], + // "@credebl/prisma-service": [ + // "libs/prisma-service/src" + // ], + // "@credebl/prisma-service/*": [ + // "libs/prisma-service/src/*" + // ], + // "@credebl/org-roles": [ + // "libs/org-roles/src" + // ], + // "@credebl/org-roles/*": [ + // "libs/org-roles/src/*" + // ], + // "@credebl/user-org-roles": [ + // "libs/user-org-roles/src" + // ], + // "@credebl/user-org-roles/*": [ + // "libs/user-org-roles/src/*" + // ], + // "@credebl/user-activity": [ + // "libs/user-activity/src" + // ], + // "@credebl/user-activity/*": [ + // "libs/user-activity/src/*" + // ], + // "@credebl/supabase": [ + // "libs/supabase/src" + // ], + // "@credebl/supabase/*": [ + // "libs/supabase/src/*" + // ], + // "@credebl/aws": [ + // "libs/aws/src" + // ], + // "@credebl/aws/*": [ + // "libs/aws/src/*" + // ], + // "@credebl/config": [ + // "libs/config/src" + // ], + // "@credebl/config/*": [ + // "libs/config/src/*" + // ], + // "@credebl/context": [ + // "libs/common/src/src" + // ], + // "@credebl/context/*": [ + // "libs/common/src/src/*" + // ], + "@credebl/*": [ + "libs/*" + ], + "@credebl/*": [ + "apps/*/src" ] } }, "exclude": [ "node_modules", - "dist" + "test", + "dist", + "**/*spec.ts", + "scripts", + "resources" ] } \ No newline at end of file