From d37a87eb15cd5f3fe63a21df7fbc62d48909d24f Mon Sep 17 00:00:00 2001 From: Sahil Kamble Date: Wed, 25 Jun 2025 17:33:34 +0530 Subject: [PATCH 01/60] fix: update upload-artifact-version to v4 and artifact name in scorecard workflow (#1301) Signed-off-by: Sahil Kamble --- .github/workflows/scorecard.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 89a7cbf1f..971dc081f 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -59,9 +59,9 @@ jobs: # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF # format to the repository Actions tab. - name: "Upload artifact" - uses: actions/upload-artifact@97a0fba1372883ab732affbe8f94b823f91727db # v3.pre.node20 + uses: actions/upload-artifact@v4 with: - name: SARIF file + name: sarif-file path: results.sarif retention-days: 5 From f5ce1976a33f758abed7d43c296da100fe74e8d6 Mon Sep 17 00:00:00 2001 From: Tipu_Singh Date: Fri, 27 Jun 2025 17:41:35 +0530 Subject: [PATCH 02/60] feat: otel and signoz implementation (#1297) * feat: otel and signoz implementation Signed-off-by: Tipu_Singh * fix:resolve suggested comments Signed-off-by: Tipu_Singh * fix:resolve suggested for logging Signed-off-by: Tipu_Singh * feat: added flag for local setup Signed-off-by: Tipu_Singh * refactor: updated env sample and demo Signed-off-by: Tipu_Singh --------- Signed-off-by: Tipu_Singh --- .env.demo | 12 +- .env.sample | 11 +- apps/api-gateway/src/main.ts | 18 +- apps/api-gateway/src/tracer.ts | 71 + libs/logger/src/logger.service.ts | 105 +- libs/logger/src/logging.interceptor.ts | 52 +- libs/logger/src/nestjsLoggerServiceAdapter.ts | 34 +- package.json | 14 +- pnpm-lock.yaml | 8128 +++++++++-------- 9 files changed, 4687 insertions(+), 3758 deletions(-) create mode 100644 apps/api-gateway/src/tracer.ts diff --git a/.env.demo b/.env.demo index 369af85d3..fe2554c9f 100644 --- a/.env.demo +++ b/.env.demo @@ -145,4 +145,14 @@ APP=api #Schema-file-server APP_PORT=4000 JWT_TOKEN_SECRET= -ISSUER=Credebl \ No newline at end of file +ISSUER=Credebl + +#Signoz and OTel +IS_ENABLE_OTEL=false +OTEL_SERVICE_NAME='CREDEBL-PLATFORM-SERVICE' +OTEL_SERVICE_VERSION='1.0.0' +OTEL_TRACES_OTLP_ENDPOINT='http://localhost:4318/v1/traces' +OTEL_LOGS_OTLP_ENDPOINT='http://localhost:4318/v1/logs' +OTEL_HEADERS_KEY=88ca6b1XXXXXXXXXXXXXXXXXXXXXXXXXXX +OTEL_LOGGER_NAME='credebl-platform-logger' +HOSTNAME='localhost' \ No newline at end of file diff --git a/.env.sample b/.env.sample index 2e44a0293..b9b0c5252 100644 --- a/.env.sample +++ b/.env.sample @@ -166,4 +166,13 @@ ELK_PASSWORD=xxxxxx // ELK user password ORGANIZATION=credebl CONTEXT=platform -APP=api \ No newline at end of file +APP=api + +IS_ENABLE_OTEL=false # Flag to enable/disable OpenTelemetry (true = enabled, false = disabled) +OTEL_SERVICE_NAME='CREDEBL-PLATFORM-SERVICE' # Logical name of the service shown in observability tools (e.g., SigNoz) +OTEL_SERVICE_VERSION='1.0.0' # Version of the service; helps in tracking changes over time +OTEL_TRACES_OTLP_ENDPOINT='http://localhost:4318/v1/traces' # Endpoint where traces are exported (OTLP over HTTP) +OTEL_LOGS_OTLP_ENDPOINT='http://localhost:4318/v1/logs' # Endpoint where logs are exported (OTLP over HTTP) +OTEL_HEADERS_KEY=88ca6b1XXXXXXXXXXXXXXXXXXXXXXXXXXX # API key or token used for authenticating with the OTel collector (e.g., SigNoz) +OTEL_LOGGER_NAME='credebl-platform-logger' # Name of the logger used for OpenTelemetry log records +HOSTNAME='localhost' # Hostname or unique identifier for the service instance diff --git a/apps/api-gateway/src/main.ts b/apps/api-gateway/src/main.ts index 47fa61094..3bbe4b317 100644 --- a/apps/api-gateway/src/main.ts +++ b/apps/api-gateway/src/main.ts @@ -1,3 +1,4 @@ +import { otelSDK } from './tracer'; import * as dotenv from 'dotenv'; import * as express from 'express'; @@ -7,7 +8,7 @@ import { Logger, VERSION_NEUTRAL, VersioningType } from '@nestjs/common'; 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 { type MicroserviceOptions, Transport } from '@nestjs/microservices'; import { getNatsOptions } from '@credebl/common/nats.config'; import helmet from 'helmet'; @@ -18,6 +19,19 @@ import { UpdatableValidationPipe } from '@credebl/common/custom-overrideable-val dotenv.config(); async function bootstrap(): Promise { + try { + if (otelSDK) { + await otelSDK.start(); + // eslint-disable-next-line no-console + console.log('OpenTelemetry SDK started successfully'); + } else { + // eslint-disable-next-line no-console + console.log('OpenTelemetry SDK disabled for this environment'); + } + } catch (error) { + // eslint-disable-next-line no-console + console.error('Failed to start OpenTelemetry SDK:', error); + } const app = await NestFactory.create(AppModule); app.useLogger(app.get(NestjsLoggerServiceAdapter)); @@ -32,7 +46,7 @@ async function bootstrap(): Promise { app.use(express.json({ limit: '100mb' })); app.use(express.urlencoded({ limit: '100mb', extended: true })); - app.use(function (req, res, next) { + app.use((req, res, next) => { let err = null; try { decodeURIComponent(req.path); diff --git a/apps/api-gateway/src/tracer.ts b/apps/api-gateway/src/tracer.ts new file mode 100644 index 000000000..898c8b228 --- /dev/null +++ b/apps/api-gateway/src/tracer.ts @@ -0,0 +1,71 @@ +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-nocheck TODO: Facing issues with types, need to fix later +// tracer.ts +import * as dotenv from 'dotenv'; +dotenv.config(); + +import { NodeSDK } from '@opentelemetry/sdk-node'; +import * as process from 'process'; + +import { HttpInstrumentation } from '@opentelemetry/instrumentation-http'; +import { ExpressInstrumentation } from '@opentelemetry/instrumentation-express'; +import { NestInstrumentation } from '@opentelemetry/instrumentation-nestjs-core'; + +import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'; +import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http'; + +import { resourceFromAttributes } from '@opentelemetry/resources'; +import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions'; + +import { LoggerProvider, BatchLogRecordProcessor } from '@opentelemetry/sdk-logs'; +import { DiagConsoleLogger, DiagLogLevel, diag } from '@opentelemetry/api'; +import type { Logger } from '@opentelemetry/api-logs'; + +let otelSDK: NodeSDK | null = null; +let otelLogger: Logger | null = null; +let otelLoggerProviderInstance: LoggerProvider | null = null; +if ('true' === process.env.IS_ENABLE_OTEL) { + diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.INFO); + + const resource = resourceFromAttributes({ + [SemanticResourceAttributes.SERVICE_NAME]: process.env.OTEL_SERVICE_NAME, + [SemanticResourceAttributes.SERVICE_VERSION]: process.env.OTEL_SERVICE_VERSION, + [SemanticResourceAttributes.SERVICE_INSTANCE_ID]: process.env.HOSTNAME + }); + + const traceExporter = new OTLPTraceExporter({ + url: process.env.OTEL_TRACES_OTLP_ENDPOINT, + headers: { + Authorization: `Api-Key ${process.env.OTEL_HEADERS_KEY}` + } + }); + + const logExporter = new OTLPLogExporter({ + url: process.env.OTEL_LOGS_OTLP_ENDPOINT, + headers: { + Authorization: `Api-Key ${process.env.OTEL_HEADERS_KEY}` + } + }); + + const logProvider = new LoggerProvider({ resource }); + logProvider.addLogRecordProcessor(new BatchLogRecordProcessor(logExporter)); + otelLogger = logProvider.getLogger(process.env.OTEL_LOGGER_NAME); + otelLoggerProviderInstance = logProvider; + + otelSDK = new NodeSDK({ + traceExporter, + resource, + instrumentations: [new HttpInstrumentation(), new ExpressInstrumentation(), new NestInstrumentation()] + }); + + process.on('SIGTERM', () => { + Promise.all([otelSDK!.shutdown(), logProvider.shutdown()]) + // eslint-disable-next-line no-console + .then(() => console.log('SDK and Logger shut down successfully')) + // eslint-disable-next-line no-console + .catch((err) => console.log('Error during shutdown', err)) + .finally(() => process.exit(0)); + }); +} + +export { otelSDK, otelLogger, otelLoggerProviderInstance }; diff --git a/libs/logger/src/logger.service.ts b/libs/logger/src/logger.service.ts index 69e3e69d5..ca92fd1f6 100644 --- a/libs/logger/src/logger.service.ts +++ b/libs/logger/src/logger.service.ts @@ -1,14 +1,11 @@ import { Inject, Injectable, Scope } from '@nestjs/common'; import { INQUIRER } from '@nestjs/core'; -import Logger, { - LoggerBaseKey -} from '@credebl/logger/logger.interface'; +import Logger, { LoggerBaseKey } from '@credebl/logger/logger.interface'; import { LogData, LogLevel } from '@credebl/logger/log'; import { ConfigService } from '@nestjs/config'; -import ContextStorageService, { - ContextStorageServiceKey -} from '@credebl/context/contextStorageService.interface'; +import ContextStorageService, { ContextStorageServiceKey } from '@credebl/context/contextStorageService.interface'; import { MICRO_SERVICE_NAME } from '@credebl/common/common.constant'; +import { otelLogger } from '../../../apps/api-gateway/src/tracer'; @Injectable({ scope: Scope.TRANSIENT }) export default class LoggerService implements Logger { @@ -25,45 +22,92 @@ export default class LoggerService implements Logger { private readonly contextStorageService: ContextStorageService, @Inject(MICRO_SERVICE_NAME) private readonly microserviceName: string ) { - // Set the source class from the parent class this.sourceClass = parentClass?.constructor?.name; - // Set the organization, context and app from the environment variables this.organization = configService.get('ORGANIZATION'); this.context = configService.get('CONTEXT'); this.app = configService.get('APP'); } - public log( - level: LogLevel, - message: string | Error, - data?: LogData, - profile?: string, - ): void { - return this.logger.log(level, message, this.getLogData(data), profile); + public log(level: LogLevel, message: string | Error, data?: LogData, profile?: string): void { + this.emitToOtel(level, message, data); + this.logger.log(level, message, this.getLogData(data), profile); } - public debug(message: string, data?: LogData, profile?: string) : void { - return this.logger.debug(message, this.getLogData(data), profile); + public debug(message: string, data?: LogData, profile?: string): void { + this.emitToOtel('DEBUG', message, data); + this.logger.debug(message, this.getLogData(data), profile); } - public info(message: string, data?: LogData, profile?: string) : void { - return this.logger.info(message, this.getLogData(data), profile); + public info(message: string, data?: LogData, profile?: string): void { + this.emitToOtel('INFO', message, data); + this.logger.info(message, this.getLogData(data), profile); } - public warn(message: string | Error, data?: LogData, profile?: string) : void { - return this.logger.warn(message, this.getLogData(data), profile); + public warn(message: string | Error, data?: LogData, profile?: string): void { + this.emitToOtel('WARN', message, data); + this.logger.warn(message, this.getLogData(data), profile); } - public error(message: string | Error, data?: LogData, profile?: string) : void { - return this.logger.error(message, this.getLogData(data), profile); + public error(message: string | Error, data?: LogData, profile?: string): void { + this.emitToOtel('ERROR', message, data); + this.logger.error(message, this.getLogData(data), profile); } - public fatal(message: string | Error, data?: LogData, profile?: string) : void { - return this.logger.fatal(message, this.getLogData(data), profile); + public fatal(message: string | Error, data?: LogData, profile?: string): void { + this.emitToOtel('FATAL', message, data); + this.logger.fatal(message, this.getLogData(data), profile); } - public emergency(message: string | Error, data?: LogData, profile?: string) : void { - return this.logger.emergency(message, this.getLogData(data), profile); + public emergency(message: string | Error, data?: LogData, profile?: string): void { + this.emitToOtel('EMERGENCY', message, data); + this.logger.emergency(message, this.getLogData(data), profile); + } + + public startProfile(id: string): void { + this.logger.startProfile(id); + } + + private emitToOtel(severityText: string, message: string | Error, data?: LogData): void { + try { + if (!otelLogger) { + return; + } + const correlationId = data?.correlationId || this.contextStorageService.getContextId(); + + const attributes = { + app: data?.app || this.app, + organization: data?.organization || this.organization, + context: data?.context || this.context, + sourceClass: data?.sourceClass || this.sourceClass, + correlationId, + microservice: this.microserviceName, + ...(data ?? {}) + }; + + if (data?.error) { + attributes.error = + 'string' === typeof data.error + ? data.error + : data.error instanceof Error + ? { + name: data.error.name, + message: data.error.message, + stack: data.error.stack + } + : 'object' === typeof data.error + ? JSON.parse(JSON.stringify(data.error)) + : String(data.error); + } + + otelLogger.emit({ + body: `${correlationId} ${'string' === typeof message ? message : message.message}`, + severityText, + attributes + }); + } catch (err) { + // eslint-disable-next-line no-console + console.error('Failed to emit log to OpenTelemetry:', err); + } } private getLogData(data?: LogData): LogData { @@ -73,12 +117,7 @@ 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 { - this.logger.startProfile(id); - } } diff --git a/libs/logger/src/logging.interceptor.ts b/libs/logger/src/logging.interceptor.ts index 7a96ee996..6ac3a0611 100644 --- a/libs/logger/src/logging.interceptor.ts +++ b/libs/logger/src/logging.interceptor.ts @@ -7,41 +7,39 @@ 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); +// 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, + 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); - }) - ); - - }); + return this.clsService.run(() => { + this._logger.info('In LoggingInterceptor configuration'); + const rpcContext = context.switchToRpc().getContext(); + const headers = rpcContext.getHeaders(); + if (!isNullUndefinedOrEmpty(headers) && headers._description) { + 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/nestjsLoggerServiceAdapter.ts index 9ebae39d0..e2aecffaa 100644 --- a/libs/logger/src/nestjsLoggerServiceAdapter.ts +++ b/libs/logger/src/nestjsLoggerServiceAdapter.ts @@ -1,43 +1,41 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ import { ConsoleLogger } from '@nestjs/common'; import Logger from '@credebl/logger/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 default class NestjsLoggerServiceAdapter extends ConsoleLogger implements LoggerService { public constructor(private readonly logger: Logger) { super(); } - public info(message: any, ...optionalParams: any[]) : void { - return this.logger.info(message, this.getLogData(optionalParams)); + public info(message: any, ...optionalParams: any[]): void { + this.logger.info(message, this.getLogData(optionalParams)); } - public log(message: any, ...optionalParams: any[]) : void { - return this.logger.info(message, this.getLogData(optionalParams)); + public log(message: any, ...optionalParams: any[]): void { + this.logger.info(message, this.getLogData(optionalParams)); } - public error(message: any, ...optionalParams: any[]) : void { - return this.logger.error(message, this.getLogData(optionalParams)); + public error(message: any, ...optionalParams: any[]): void { + this.logger.error(message, this.getLogData(optionalParams)); } - public warn(message: any, ...optionalParams: any[]) : void { - return this.logger.warn(message, this.getLogData(optionalParams)); + public warn(message: any, ...optionalParams: any[]): void { + this.logger.warn(message, this.getLogData(optionalParams)); } - public debug(message: any, ...optionalParams: any[]) : void { - return this.logger.debug(message, this.getLogData(optionalParams)); + public debug(message: any, ...optionalParams: any[]): void { + this.logger.debug(message, this.getLogData(optionalParams)); } - public verbose(message: any, ...optionalParams: any[]) : void { - return this.logger.info(message, this.getLogData(optionalParams)); + public verbose(message: any, ...optionalParams: any[]): void { + 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/package.json b/package.json index b4217c6ee..3bae65e70 100755 --- a/package.json +++ b/package.json @@ -42,6 +42,16 @@ "@nestjs/swagger": "^7.1.6", "@nestjs/typeorm": "^10.0.0", "@nestjs/websockets": "^10.1.3", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/exporter-logs-otlp-http": "^0.202.0", + "@opentelemetry/exporter-trace-otlp-http": "^0.202.0", + "@opentelemetry/instrumentation-express": "^0.51.0", + "@opentelemetry/instrumentation-http": "^0.202.0", + "@opentelemetry/instrumentation-nestjs-core": "^0.48.0", + "@opentelemetry/resources": "^2.0.1", + "@opentelemetry/sdk-logs": "^0.202.0", + "@opentelemetry/sdk-node": "^0.202.0", + "@opentelemetry/semantic-conventions": "^1.34.0", "@prisma/client": "^5.1.1", "@sendgrid/mail": "^7.7.0", "@supabase/supabase-js": "^2.32.0", @@ -75,12 +85,12 @@ "jwks-rsa": "^3.0.1", "linebyline": "^1.3.0", "moment": "^2.29.3", - "multer": "1.4.5-lts.1", "morgan": "^1.10.0", + "multer": "1.4.5-lts.1", "nanoid": "^4.0.2", "nats": "^2.15.1", - "nestjs-rate-limiter": "^3.1.0", "nestjs-cls": "^4.3.0", + "nestjs-rate-limiter": "^3.1.0", "nestjs-supabase-auth": "^1.0.9", "nestjs-typeorm-paginate": "^4.0.4", "node-html-to-image": "^4.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 83708c63d..05fd8cd04 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,97 +13,127 @@ importers: 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) + version: 3.1.3(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(axios@0.26.1)(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) + version: 10.2.3(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2))(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) + version: 2.3.0(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2))(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) + version: 10.4.19(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) + version: 3.3.0(@nestjs/common@10.4.19(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) + version: 10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(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)) + version: 10.2.0(@nestjs/common@10.4.19(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) + version: 10.4.19(@grpc/grpc-js@1.13.4)(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(@nestjs/websockets@10.4.19)(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) + version: 10.0.3(@nestjs/common@10.4.19(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) + version: 10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19) '@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) + version: 10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/websockets@10.4.19)(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) + version: 3.0.4(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2))(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) + version: 7.4.2(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2))(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))) + version: 10.0.2(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(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.2)(redis@3.1.2)(reflect-metadata@0.1.14)(ts-node@10.9.2(@types/node@20.19.1)(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) + version: 10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(@nestjs/platform-socket.io@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@opentelemetry/api': + specifier: ^1.9.0 + version: 1.9.0 + '@opentelemetry/exporter-logs-otlp-http': + specifier: ^0.202.0 + version: 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-http': + specifier: ^0.202.0 + version: 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-express': + specifier: ^0.51.0 + version: 0.51.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-http': + specifier: ^0.202.0 + version: 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-nestjs-core': + specifier: ^0.48.0 + version: 0.48.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': + specifier: ^2.0.1 + version: 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': + specifier: ^0.202.0 + version: 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-node': + specifier: ^0.202.0 + version: 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': + specifier: ^1.34.0 + version: 1.34.0 '@prisma/client': specifier: ^5.1.1 - version: 5.1.1(prisma@5.1.1) + 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 + version: 2.50.0 '@types/async-retry': specifier: ^1.4.5 - version: 1.4.5 + version: 1.4.9 '@types/crypto-js': specifier: ^4.1.1 - version: 4.1.1 + version: 4.2.2 '@types/json2csv': specifier: ^5.0.5 - version: 5.0.5 + version: 5.0.7 '@types/pdfkit': specifier: ^0.12.6 - version: 0.12.6 + version: 0.12.12 async-retry: specifier: ^1.3.3 version: 1.3.3 auth0-js: specifier: ^9.22.1 - version: 9.22.1 + version: 9.28.0 aws-sdk: specifier: ^2.1510.0 - version: 2.1560.0 + version: 2.1692.0 bcrypt: specifier: ^5.1.0 - version: 5.1.0 + version: 5.1.1 blob-stream: specifier: ^0.1.3 version: 0.1.3 body-parser: specifier: ^1.20.1 - version: 1.20.1 + version: 1.20.3 buffer: specifier: ^6.0.3 version: 6.0.3 bull: specifier: ^4.11.4 - version: 4.11.4 + version: 4.16.5 cache-manager: specifier: ^5.2.4 - version: 5.4.0 + version: 5.7.6 cache-manager-redis-store: specifier: ^2.0.0 version: 2.0.0 @@ -112,49 +142,49 @@ importers: version: 0.5.1 class-validator: specifier: ^0.14.0 - version: 0.14.0 + version: 0.14.2 crypto-js: specifier: ^4.1.1 - version: 4.1.1 + version: 4.2.0 crypto-random-string: specifier: ^5.0.0 version: 5.0.0 dotenv: specifier: ^16.0.3 - version: 16.0.3 + version: 16.5.0 express: specifier: ^4.18.2 - version: 4.18.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 + version: 1.7.1 helmet: specifier: ^7.0.0 - version: 7.1.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 + version: 1.11.13 json2csv: specifier: ^5.0.7 version: 5.0.7 jsonwebtoken: specifier: ^9.0.1 - version: 9.0.1 + version: 9.0.2 jwks-rsa: specifier: ^3.0.1 - version: 3.0.1 + version: 3.2.0 linebyline: specifier: ^1.3.0 version: 1.3.0 moment: specifier: ^2.29.3 - version: 2.29.3 + version: 2.30.1 morgan: specifier: ^1.10.0 version: 1.10.0 @@ -166,10 +196,10 @@ importers: version: 4.0.2 nats: specifier: ^2.15.1 - version: 2.15.1 + 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) + version: 4.5.0(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2) nestjs-rate-limiter: specifier: ^3.1.0 version: 3.1.0 @@ -178,10 +208,10 @@ importers: 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))) + version: 4.1.0(@nestjs/common@10.4.19(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.2)(redis@3.1.2)(reflect-metadata@0.1.14)(ts-node@10.9.2(@types/node@20.19.1)(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 @@ -190,7 +220,7 @@ importers: version: 3.1.0 papaparse: specifier: ^5.4.1 - version: 5.4.1 + version: 5.5.3 passport: specifier: ^0.6.0 version: 0.6.0 @@ -208,19 +238,19 @@ importers: version: 0.13.0 pg: specifier: ^8.11.2 - version: 8.11.2 + version: 8.16.2 puppeteer: specifier: ^21.5.0 - version: 21.5.0(bufferutil@4.0.7)(typescript@5.1.6)(utf-8-validate@5.0.10) + version: 21.11.0(typescript@5.8.3) qrcode: specifier: ^1.5.3 - version: 1.5.3 + version: 1.5.4 qs: specifier: ^6.11.2 - version: 6.11.2 + version: 6.14.0 reflect-metadata: specifier: ^0.1.13 - version: 0.1.13 + version: 0.1.14 rimraf: specifier: ^3.0.2 version: 3.0.2 @@ -229,28 +259,28 @@ importers: version: 0.6.1 rxjs: specifier: ^7.8.1 - version: 7.8.1 + 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) + version: 4.8.1 swagger-ui-express: specifier: ^5.0.0 - version: 5.0.0(express@4.18.2) + 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)) + version: 0.3.25(ioredis@5.6.1)(pg@8.16.2)(redis@3.1.2)(reflect-metadata@0.1.14)(ts-node@10.9.2(@types/node@20.19.1)(typescript@5.8.3)) unzipper: specifier: ^0.10.14 version: 0.10.14 uuid: specifier: ^9.0.0 - version: 9.0.0 + version: 9.0.1 validator: specifier: ^13.11.0 - version: 13.11.0 + version: 13.15.15 web-push: specifier: ^3.6.4 - version: 3.6.4 + version: 3.6.7 winston: specifier: '3.4' version: 3.4.0 @@ -266,143 +296,143 @@ importers: devDependencies: '@nestjs/cli': specifier: ^10.1.11 - version: 10.1.11 + version: 10.4.9 '@nestjs/schematics': specifier: ^10.0.1 - version: 10.0.1(chokidar@3.5.3)(typescript@5.1.6) + 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) + version: 10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19(@grpc/grpc-js@1.13.4)(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(@nestjs/websockets@10.4.19)(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.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)) '@types/express': specifier: ^4.17.17 - version: 4.17.17 + version: 4.17.23 '@types/jest': specifier: ^29.5.3 - version: 29.5.3 + version: 29.5.14 '@types/multer': specifier: ^1.4.9 - version: 1.4.9 + version: 1.4.13 '@types/node': specifier: ^20.4.6 - version: 20.4.6 + version: 20.19.1 '@types/passport-jwt': specifier: 3.0.9 version: 3.0.9 '@types/passport-local': specifier: ^1.0.35 - version: 1.0.35 + version: 1.0.38 '@types/supertest': specifier: ^2.0.12 - version: 2.0.12 + 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) + 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) + version: 6.21.0(eslint@8.57.1)(typescript@5.8.3) eslint: specifier: ^8.46.0 - version: 8.46.0 + version: 8.57.1 eslint-config-prettier: specifier: ^8.10.0 - version: 8.10.0(eslint@8.46.0) + version: 8.10.0(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) + 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) + version: 4.2.1(eslint-config-prettier@8.10.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.6.0) eslint-plugin-promise: specifier: ^6.1.1 - version: 6.1.1(eslint@8.46.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)) + version: 29.7.0(@types/node@20.19.1)(ts-node@10.9.2(@types/node@20.19.1)(typescript@5.8.3)) lint-staged: specifier: ^13.2.3 - version: 13.2.3 + version: 13.3.0 prettier: specifier: ^3.0.1 - version: 3.0.1 + version: 3.6.0 prisma: specifier: ^5.1.1 - version: 5.1.1 + version: 5.22.0 supertest: specifier: ^6.3.3 - version: 6.3.3 + 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) + version: 29.4.0(@babel/core@7.27.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.4))(jest-util@29.7.0)(jest@29.7.0(@types/node@20.19.1)(ts-node@10.9.2(@types/node@20.19.1)(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) + 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) + version: 10.9.2(@types/node@20.19.1)(typescript@5.8.3) tsconfig-paths: specifier: ^4.2.0 version: 4.2.0 typescript: specifier: ^5.1.6 - version: 5.1.6 + version: 5.8.3 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) + version: 10.4.19(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) + version: 10.4.19(@grpc/grpc-js@1.13.4)(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(@nestjs/websockets@10.4.19)(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) + version: 10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19(@grpc/grpc-js@1.13.4)(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(@nestjs/websockets@10.4.19)(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.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)) aws-sdk: specifier: ^2.1510.0 - version: 2.1560.0 + version: 2.1692.0 devDependencies: reflect-metadata: specifier: ^0.1.13 - version: 0.1.13 + version: 0.1.14 rimraf: specifier: ^4.4.0 version: 4.4.1 typescript: specifier: ^5.1.6 - version: 5.1.6 + version: 5.8.3 libs/common: dependencies: '@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) + version: 3.1.3(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(axios@0.26.1)(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) + version: 10.4.19(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) + version: 10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(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) + version: 10.4.19(@grpc/grpc-js@1.13.4)(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(@nestjs/websockets@10.4.19)(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) + version: 7.4.2(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2))(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) + version: 10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19(@grpc/grpc-js@1.13.4)(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(@nestjs/websockets@10.4.19)(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.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)) '@prisma/client': specifier: ^5.1.1 - version: 5.1.1(prisma@5.1.1) + version: 5.22.0(prisma@5.22.0) '@sendgrid/mail': specifier: ^7.7.0 version: 7.7.0 @@ -411,155 +441,112 @@ importers: version: 0.5.1 class-validator: specifier: ^0.14.0 - version: 0.14.0 + version: 0.14.2 crypto-js: specifier: ^4.1.1 - version: 4.1.1 + version: 4.2.0 dotenv: specifier: ^16.0.3 - version: 16.1.4 + version: 16.5.0 nats: specifier: ^2.15.1 - version: 2.15.1 + version: 2.29.3 rxjs: specifier: ^7.8.1 - version: 7.8.1 + version: 7.8.2 uuid: specifier: ^9.0.0 - version: 9.0.0 + version: 9.0.1 devDependencies: '@types/crypto-js': specifier: ^4.1.1 - version: 4.1.1 + version: 4.2.2 reflect-metadata: specifier: ^0.1.13 - version: 0.1.13 + version: 0.1.14 rimraf: specifier: ^4.4.0 version: 4.4.1 typescript: specifier: ^5.1.6 - version: 5.1.6 + version: 5.8.3 packages: - '@aashutoshrathi/word-wrap@1.2.6': - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - - '@ampproject/remapping@2.2.1': - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@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 - - '@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@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'} - '@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'} - - '@babel/core@7.22.9': - resolution: {integrity: sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.22.9': - resolution: {integrity: sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==} + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.22.9': - resolution: {integrity: sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==} + '@babel/compat-data@7.27.5': + resolution: {integrity: sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==} 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/core@7.27.4': + resolution: {integrity: sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==} engines: {node: '>=6.9.0'} - '@babel/helper-function-name@7.22.5': - resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} + '@babel/generator@7.27.5': + resolution: {integrity: sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==} engines: {node: '>=6.9.0'} - '@babel/helper-hoist-variables@7.22.5': - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} 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==} - engines: {node: '>=6.9.0'} - - '@babel/helper-simple-access@7.22.5': - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} - engines: {node: '>=6.9.0'} - - '@babel/helper-split-export-declaration@7.22.6': - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.22.5': - resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.22.5': - resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.22.5': - resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.22.6': - resolution: {integrity: sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==} + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.22.5': - resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==} + '@babel/helpers@7.27.6': + resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} engines: {node: '>=6.9.0'} - '@babel/parser@7.22.7': - resolution: {integrity: sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==} + '@babel/parser@7.27.5': + resolution: {integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==} engines: {node: '>=6.0.0'} hasBin: true @@ -578,6 +565,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 +587,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 +623,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.27.4': + resolution: {integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==} engines: {node: '>=6.9.0'} - '@babel/types@7.22.5': - resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==} + '@babel/types@7.27.6': + resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@0.2.3': @@ -686,26 +687,35 @@ 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==} + '@grpc/grpc-js@1.13.4': + resolution: {integrity: sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg==} + engines: {node: '>=12.10.0'} + + '@grpc/proto-loader@0.7.15': + resolution: {integrity: sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==} + engines: {node: '>=6'} + hasBin: true + + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} deprecated: Use @eslint/config-array instead @@ -713,13 +723,17 @@ packages: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@1.2.1': - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead '@ioredis/commands@1.2.0': resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} + '@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==} engines: {node: '>=8'} @@ -728,12 +742,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 +755,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 +784,61 @@ 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==} + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} - '@jridgewell/resolve-uri@3.1.1': - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.1.2': - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 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.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - '@jridgewell/trace-mapping@0.3.18': - resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@js-sdsl/ordered-map@4.4.2': + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + + '@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 +847,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 +921,12 @@ packages: '@swc/core': optional: true - '@nestjs/common@10.2.8': - resolution: {integrity: sha512-rmpwcdvq2IWMmsUVP8rsdKub6uDWk7dwCYo0aif50JTwcvcxzaP3iKVFKoSgvp0RKYu8h15+/AEOfaInmPpl0Q==} + '@nestjs/common@10.4.19': + resolution: {integrity: sha512-0TZJ8H+7qtaqZt6YfZJkDRp0e+v6jjo5/pevPAjUy0WYxaTy16bNNQxFPRKLMe/v1hUr2oGV9imvL2477zNt5g==} 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 +934,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.19': + resolution: {integrity: sha512-gahghu0y4Rn4gn/xPjTgNHFMpUM8TxfhdeMowVWTGVnYMZtGeEGbIXMFhJS0Dce3E4VKyqAglzgO9ecAZd4Ong==} 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 +957,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.19': + resolution: {integrity: sha512-GaWRqFug/ctACF7T9CcQJ4UYr1Q5B44nqYnWoeqnzLN0Ov1ta9dBQmPGxBHYbLN2vP8d9zQHf1G+iBsaH29YEQ==} peerDependencies: '@grpc/grpc-js': '*' '@nestjs/common': ^10.0.0 @@ -973,7 +989,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 +1011,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.19': + resolution: {integrity: sha512-IeQkBZUtPeJoO4E0QqSLwkB+60KcThw8/s4gGvAwIRJ5ViuXoxnwU59eBDy84PUuVbNe4VdKjfAF9fuQOEh11Q==} 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.19': + resolution: {integrity: sha512-Pfz9dBcXaoUFdVpA/I96NoOTiTQ7eYfDNhQ2sZdQzne3oISEvts5G2SWyQNouoyjqkUPt6X5r/CQ++M4AzSlEQ==} 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 +1059,8 @@ packages: class-validator: optional: true - '@nestjs/testing@10.1.3': - resolution: {integrity: sha512-zMrO9xLPYnKtC6q1diWubuMshIp0v2aGHa58jcIfZaAlJlU/6RKsgCOiFQ42aFzxUEBRWF0LBF0aiwt04LKMyQ==} + '@nestjs/testing@10.4.19': + resolution: {integrity: sha512-YfzkjTmwEcoWqo8xr8YiTZMC4FjBEOg4uRTAPI2p6iGLWu+27tYau1CtAKFHY0uSAK3FzgtsAuYoxBSlfr9mWA==} peerDependencies: '@nestjs/common': ^10.0.0 '@nestjs/core': ^10.0.0 @@ -1056,27 +1072,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.19': + resolution: {integrity: sha512-3HhNZU40/ozB64ZZJ1W1bOOYSbxGuJwmM5Ui8y1uPwbzpL1Uov3wOG3eRp1IflSBK4Ia0wb8Iv3ChpFSTzrNiA==} 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'} @@ -1094,34 +1114,217 @@ packages: engines: {node: '>=8.0.0', npm: '>=5.0.0'} hasBin: true + '@opentelemetry/api-logs@0.202.0': + resolution: {integrity: sha512-fTBjMqKCfotFWfLzaKyhjLvyEyq5vDKTTFfBmx21btv3gvy8Lq6N5Dh2OzqeuN4DjtpSvNT1uNVfg08eD2Rfxw==} + engines: {node: '>=8.0.0'} + '@opentelemetry/api@1.9.0': 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/context-async-hooks@2.0.1': + resolution: {integrity: sha512-XuY23lSI3d4PEqKA+7SLtAgwqIfc6E/E9eAQWLN1vlpC53ybO3o6jW4BsXo1xvz9lYyyWItfQDDLzezER01mCw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@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/core@2.0.1': + resolution: {integrity: sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/exporter-logs-otlp-grpc@0.202.0': + resolution: {integrity: sha512-Y84L8Yja/A2qjGEzC/To0yrMUXHrtwJzHtZ2za1/ulZplRe5QFsLNyHixIS42ZYUKuNyWMDgOFhnN2Pz5uThtg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-logs-otlp-http@0.202.0': + resolution: {integrity: sha512-mJWLkmoG+3r+SsYQC+sbWoy1rjowJhMhFvFULeIPTxSI+EZzKPya0+NZ3+vhhgx2UTybGQlye3FBtCH3o6Rejg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-logs-otlp-proto@0.202.0': + resolution: {integrity: sha512-qYwbmNWPkP7AbzX8o4DRu5bb/a0TWYNcpZc1NEAOhuV7pgBpAUPEClxRWPN94ulIia+PfQjzFGMaRwmLGmNP6g==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-metrics-otlp-grpc@0.202.0': + resolution: {integrity: sha512-/dq/rf4KCkTYoP+NyPXTE+5wjvfhAHSqK62vRsJ/IalG61VPQvwaL18yWcavbI+44ImQwtMeZxfIJSox7oQL0w==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-metrics-otlp-http@0.202.0': + resolution: {integrity: sha512-ooYcrf/m9ZuVGpQnER7WRH+JZbDPD389HG7VS/EnvIEF5WpNYEqf+NdmtaAcs51d81QrytTYAubc5bVWi//28w==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-metrics-otlp-proto@0.202.0': + resolution: {integrity: sha512-X0RpPpPjyCAmIq9tySZm0Hk3Ltw8KWsqeNq5I7gS9AR9RzbVHb/l+eiMI1CqSRvW9R47HXcUu/epmEzY8ebFAg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-prometheus@0.202.0': + resolution: {integrity: sha512-6RvQqZHAPFiwL1OKRJe4ta6SgJx/g8or41B+OovVVEie3HeCDhDGL9S1VJNkBozUz6wTY8a47fQwdMrCOUdMhQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-trace-otlp-grpc@0.202.0': + resolution: {integrity: sha512-d5wLdbNA3ahpSeD0I34vbDFMTh4vPsXemH0bKDXLeCVULCAjOJXuZmEiuRammiDgVvvX7CAb/IGLDz8d2QHvoA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-trace-otlp-http@0.202.0': + resolution: {integrity: sha512-/hKE8DaFCJuaQqE1IxpgkcjOolUIwgi3TgHElPVKGdGRBSmJMTmN/cr6vWa55pCJIXPyhKvcMrbrya7DZ3VmzA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-trace-otlp-proto@0.202.0': + resolution: {integrity: sha512-z3vzdMclCETGIn8uUBgpz7w651ftCiH2qh3cewhBk+rF0EYPNQ3mJvyxktLnKIBZ/ci0zUknAzzYC7LIIZmggQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-zipkin@2.0.1': + resolution: {integrity: sha512-a9eeyHIipfdxzCfc2XPrE+/TI3wmrZUDFtG2RRXHSbZZULAny7SyybSvaDvS77a7iib5MPiAvluwVvbGTsHxsw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/instrumentation-express@0.51.0': + resolution: {integrity: sha512-v1mgfvyeQh7yfsZ8wZlr+jgFGk9FxzLfNH0EH0UYGO9das8fCIkixsEasZMWhjwAJKjlf+ElTZ2jE2pT7I3DyQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-http@0.202.0': + resolution: {integrity: sha512-oX+jyY2KBg4/nVH3vZhSWDbhywkHgE0fq3YinhUBx0jv+YUWC2UKA7qLkxr/CSzfKsFi/Km0NKV+llH17yYGKw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-nestjs-core@0.48.0': + resolution: {integrity: sha512-ytK4ABSkWcD9vyMU8GpinvodAGaRxBFuxybP/m7sgLtEboXMJjdWnEHb7lH/CX1ICiVKRXWdYg9npdu6yBCW5Q==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation@0.202.0': + resolution: {integrity: sha512-Uz3BxZWPgDwgHM2+vCKEQRh0R8WKrd/q6Tus1vThRClhlPO39Dyz7mDrOr6KuqGXAlBQ1e5Tnymzri4RMZNaWA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-exporter-base@0.202.0': + resolution: {integrity: sha512-nMEOzel+pUFYuBJg2znGmHJWbmvMbdX5/RhoKNKowguMbURhz0fwik5tUKplLcUtl8wKPL1y9zPnPxeBn65N0Q==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-grpc-exporter-base@0.202.0': + resolution: {integrity: sha512-yIEHVxFA5dmYif7lZbbB66qulLLhrklj6mI2X3cuGW5hYPyUErztEmbroM+6teu/XobBi9bLHid2VT4NIaRuGg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-transformer@0.202.0': + resolution: {integrity: sha512-5XO77QFzs9WkexvJQL9ksxL8oVFb/dfi9NWQSq7Sv0Efr9x3N+nb1iklP1TeVgxqJ7m1xWiC/Uv3wupiQGevMw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/propagator-b3@2.0.1': + resolution: {integrity: sha512-Hc09CaQ8Tf5AGLmf449H726uRoBNGPBL4bjr7AnnUpzWMvhdn61F78z9qb6IqB737TffBsokGAK1XykFEZ1igw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/propagator-jaeger@2.0.1': + resolution: {integrity: sha512-7PMdPBmGVH2eQNb/AtSJizQNgeNTfh6jQFqys6lfhd6P4r+m/nTh3gKPPpaCXVdRQ+z93vfKk+4UGty390283w==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@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/resources@2.0.1': + resolution: {integrity: sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-logs@0.202.0': + resolution: {integrity: sha512-pv8QiQLQzk4X909YKm0lnW4hpuQg4zHwJ4XBd5bZiXcd9urvrJNoNVKnxGHPiDVX/GiLFvr5DMYsDBQbZCypRQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.4.0 <1.10.0' + + '@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/sdk-metrics@2.0.1': + resolution: {integrity: sha512-wf8OaJoSnujMAHWR3g+/hGvNcsC16rf9s1So4JlMiFaFHiE4HpIA3oUh+uWZQ7CNuK8gVW/pQSkgoa5HkkOl0g==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.9.0 <1.10.0' + + '@opentelemetry/sdk-node@0.202.0': + resolution: {integrity: sha512-SF9vXWVd9I5CZ69mW3GfwfLI2SHgyvEqntcg0en5y8kRp5+2PPoa3Mkgj0WzFLrbSgTw4PsXn7c7H6eSdrtV0w==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@2.0.1': + resolution: {integrity: sha512-xYLlvk/xdScGx1aEqvxLwf6sXQLXCjk3/1SQT9X9AoN5rXRhkdvIFShuNNmtTEPRBqcsMbS4p/gJLNI2wXaDuQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-node@2.0.1': + resolution: {integrity: sha512-UhdbPF19pMpBtCWYP5lHbTogLWx9N0EBxtdagvkn5YtsAnCBZzL7SjktG+ZmupRgifsHMjwUaCCaVmqGfSADmA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/semantic-conventions@1.28.0': + resolution: {integrity: sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==} + engines: {node: '>=14'} + + '@opentelemetry/semantic-conventions@1.34.0': + resolution: {integrity: sha512-aKcOkyrorBGlajjRdVoJWHTxfxO1vCNHLJVlSDaRHDIdjU+pX8IYQPvPDkYiujKLbRnWU+1TBwEt0QRgSm4SGA==} engines: {node: '>=14'} - '@prisma/client@5.1.1': - resolution: {integrity: sha512-fxcCeK5pMQGcgCqCrWsi+I2rpIbk0rAhdrN+ke7f34tIrgPwA68ensrpin+9+fZvuV2OtzHmuipwduSY6HswdA==} + '@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.22.0': + resolution: {integrity: sha512-M0SVXfyHnQREBKxCgyo7sffrKttwE6R8PMq330MIUF0pTwjUhLbW84pFDlf06B27XyCR++VtjugEnIHdr07SVA==} engines: {node: '>=16.13'} peerDependencies: prisma: '*' @@ -1129,22 +1332,67 @@ packages: prisma: optional: true - '@prisma/engines-version@5.1.1-1.6a3747c37ff169c90047725a05a6ef02e32ac97e': - resolution: {integrity: sha512-owZqbY/wucbr65bXJ/ljrHPgQU5xXTSkmcE/JcbqE1kusuAXV/TLN3/exmz21SZ5rJ7WDkyk70J2G/n68iogbQ==} + '@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/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==} + + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.4': + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + '@protobufjs/eventemitter@1.1.0': + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + '@protobufjs/fetch@1.1.0': + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.0': + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} - '@prisma/engines@5.1.1': - resolution: {integrity: sha512-NV/4nVNWFZSJCCIA3HIFJbbDKO/NARc9ej0tX5S9k2EVbkrFJC4Xt9b0u4rNZWL4V+F5LAjvta8vzEUw0rw+HA==} + '@protobufjs/utf8@1.1.0': + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} '@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 +1408,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.70.0': + resolution: {integrity: sha512-BaAK/tOAZFJtzF1sE3gJ2FwTjLf4ky3PSvcvLGEgEmO4BSBkwWKu8l67rLLIBZPDnCyV7Owk2uPyKHa0kj5QGg==} - '@supabase/gotrue-js@2.47.0': - resolution: {integrity: sha512-3e34/vsKH/DoSZCpB85UZpFWSJ2p4GRUUlqgAgeTPagPlx4xS+Nc5v7g7ic7vp3gK0J5PsYVCn9Qu2JQUp4vXg==} + '@supabase/functions-js@2.4.4': + resolution: {integrity: sha512-WL2p6r4AXNGwop7iwvul2BvOtuJ1YQy8EbOd0dhG1oN1q8el/BIRSFCFnWAMM/vJJlHWLi4ad22sKbKr9mvjoA==} + + '@supabase/node-fetch@2.6.15': + resolution: {integrity: sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ==} + engines: {node: 4.x || >=6.0.0} - '@supabase/postgrest-js@1.8.0': - resolution: {integrity: sha512-R6leDIC92NgjyG2/tCRJ42rWN7+fZY6ulTEE+c00tcnghn6cX4IYUlnTNMtrdfYC2JYNOTyM+rWj63Wdhr7Zig==} + '@supabase/postgrest-js@1.19.4': + resolution: {integrity: sha512-O4soKqKtZIW3olqmbXXbKugUtByD2jPa8kL2m2c1oozAO11uCcGrRhkZL0kVxjBLrXHE0mdSkFsMj7jDSfyNpw==} - '@supabase/realtime-js@2.7.3': - resolution: {integrity: sha512-c7TzL81sx2kqyxsxcDduJcHL9KJdCOoKimGP6lQSqiZKX42ATlBZpWbyy9KFGFBjAP4nyopMf5JhPi2ZH9jyNw==} + '@supabase/realtime-js@2.11.10': + resolution: {integrity: sha512-SJKVa7EejnuyfImrbzx+HaD9i6T784khuw1zP+MBD7BmJYChegGxYigPzkKX8CK8nGuDntmeSD3fvriaH0EGZA==} - '@supabase/storage-js@2.5.1': - resolution: {integrity: sha512-nkR0fQA9ScAtIKA3vNoPEqbZv1k5B5HVRYEvRWdlP6mUpFphM9TwPL2jZ/ztNGMTG5xT6SrHr+H7Ykz8qzbhjw==} + '@supabase/storage-js@2.7.1': + resolution: {integrity: sha512-asYHcyDR1fKqrMpytAS1zjyEfvxuOIp1CIXX7ji4lHHcJKqyk+sLl/Vxgm4sN6u8zvuUtae9e4kDxQP2qrwWBA==} - '@supabase/supabase-js@2.32.0': - resolution: {integrity: sha512-1ShFhuOI5Du7604nlCelBsRD61daXk2O0qwjumoz35bqrYThnSPPtpJqZOHw6Mg6o7mLjIInYLh/DBlh8UvzRg==} + '@supabase/supabase-js@2.50.0': + resolution: {integrity: sha512-M1Gd5tPaaghYZ9OjeO1iORRqbTWFEz/cF3pPubRnMPzA+A8SiUsXXWDP+DWsASZcjEcVEcVQIAF38i5wrijYOg==} '@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 +1467,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/async-retry@1.4.9': + resolution: {integrity: sha512-s1ciZQJzRh3708X/m3vPExr5KJlzlZJvXsKpbtE2luqNcbROr64qU+3KpJsYHqWMeaxI839OvXf9PrUSw1Xtyg==} - '@types/babel__core@7.20.1': - resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==} + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - '@types/babel__generator@7.6.4': - resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} - '@types/babel__template@7.4.1': - resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - '@types/babel__traverse@7.20.1': - resolution: {integrity: sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==} + '@types/babel__traverse@7.20.7': + resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} - '@types/body-parser@1.19.2': - resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} - '@types/connect@3.4.35': - resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - '@types/cookie@0.4.1': - resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} + '@types/cookiejar@2.1.5': + resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} - '@types/cookiejar@2.1.2': - resolution: {integrity: sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==} + '@types/cors@2.8.19': + resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} - '@types/cors@2.8.13': - resolution: {integrity: sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==} + '@types/crypto-js@4.2.2': + resolution: {integrity: sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==} - '@types/crypto-js@4.1.1': - resolution: {integrity: sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA==} + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} - '@types/eslint-scope@3.7.4': - resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} - '@types/eslint@8.44.1': - resolution: {integrity: sha512-XpNDc4Z5Tb4x+SW1MriMVeIsMoONHCkWFMkR/aPJbzEsxqHy+4Glu/BqTdPrApfDeMaXbtNh6bseNgl5KaWrSg==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/estree@1.0.1': - resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} + '@types/express-serve-static-core@4.19.6': + resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} - '@types/express-serve-static-core@4.17.35': - resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} + '@types/express@4.17.23': + resolution: {integrity: sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==} - '@types/express@4.17.17': - resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} + '@types/graceful-fs@4.1.9': + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} - '@types/graceful-fs@4.1.6': - resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} - '@types/http-errors@2.0.1': - resolution: {integrity: sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==} + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - '@types/istanbul-lib-coverage@2.0.4': - resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} - '@types/istanbul-lib-report@3.0.0': - resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - '@types/istanbul-reports@3.0.1': - resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} + '@types/jest@29.5.14': + resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==} - '@types/jest@29.5.3': - resolution: {integrity: sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA==} + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/json-schema@7.0.12': - resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} - - '@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/jsonwebtoken@9.0.5': + resolution: {integrity: sha512-VRLSGzik+Unrup6BsouBeHsf4d1hOEgYWTm/7Nmw1sXoN1+tRly/Gy/po3yeahnP4jfnQWWAhQAqcNfH7ngOkA==} - '@types/mime@1.3.2': - resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==} + '@types/luxon@3.3.8': + resolution: {integrity: sha512-jYvz8UMLDgy3a5SkGJne8H7VA7zPV2Lwohjx0V8V31+SqAjNmurWMkk9cQhfvlcnXWudBpK9xPM1n4rljOcHYQ==} - '@types/mime@3.0.1': - resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} + '@types/methods@1.1.4': + resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} - '@types/multer@1.4.9': - resolution: {integrity: sha512-9NSvPJ2E8bNTc8XtJq1Cimx2Wrn2Ah48F15B2Du/hM8a8CHLhVbJMlF3ZCqhvMdht7Sa+YdP0aKP7N4fxDcrrg==} + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - '@types/node@20.4.6': - resolution: {integrity: sha512-q0RkvNgMweWWIvSMDiXhflGUKMdIxBo2M2tYM/0kEGDueQByFzK4KZAgu5YHGFNxziTlppNpTIBcqHQAxlfHdA==} + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/parse-json@4.0.0': - resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + '@types/multer@1.4.13': + resolution: {integrity: sha512-bhhdtPw7JqCiEfC9Jimx5LqX9BDIPJEh2q/fQ4bqbBPtyEZYr3cvF22NwG0DmPZNYA0CAf2CnqDB4KIGGpJcaw==} + + '@types/node@20.19.1': + resolution: {integrity: sha512-jJD50LtlD2dodAEO653i3YF04NWak6jN3ky+Ri3Em3mGR39/glWiboM/IePaRbgwSfqM1TpGXfAg8ohn/4dTgA==} '@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 +1647,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 +1661,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 +1679,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 +1692,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 +1701,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 +1711,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,16 +1772,18 @@ 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'} acorn-import-assertions@1.9.0: resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + deprecated: package has been renamed to acorn-import-attributes + peerDependencies: + acorn: ^8 + + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} peerDependencies: acorn: ^8 @@ -1525,12 +1792,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 +1808,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.3: + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} 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 +1829,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 +1851,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 +1875,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==} @@ -1635,14 +1907,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 +1925,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,14 +1958,14 @@ 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 +1985,31 @@ 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==} - - 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 +2018,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.1.0: + resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} peerDependencies: '@babel/core': ^7.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 +2036,9 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + bare-events@2.5.4: + resolution: {integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==} + base64-js@0.0.8: resolution: {integrity: sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==} engines: {node: '>= 0.4'} @@ -1781,23 +2054,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 +2091,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@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - 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 +2114,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.0: + resolution: {integrity: sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -1874,10 +2139,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 +2152,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.0.1: - resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} + builtins@5.1.0: + resolution: {integrity: sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==} - 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 +2171,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 +2199,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001519: - resolution: {integrity: sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg==} + caniuse-lite@1.0.30001724: + resolution: {integrity: sha512-WqJo7p0TbHDOythNTqYujmaJTvtYRZrjpP8TCvH6Vb9CYJerJNKamKzIWOM4BkQatWj9H2lYulpdAQNBe7QhNA==} caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -1945,16 +2208,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 +2227,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 +2244,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 +2286,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 +2349,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 +2364,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 +2378,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 +2399,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 +2430,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 +2443,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 +2529,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 +2551,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 +2577,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 +2608,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 +2619,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 +2628,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 +2655,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.5.0: + resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} 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 +2682,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==} - engines: {node: '>=8.6.0'} + 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.173: + resolution: {integrity: sha512-2bFhXP2zqSfQHugjqJIDFVwa+qIxyNApenmXTp9EjaKtdPrES5Qcn9/aSFy/NaP2E+fWG/zxKu/LBvY36p5VNQ==} emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} @@ -2420,31 +2707,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 +2747,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 +2762,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: @@ -2533,6 +2816,7 @@ packages: eslint-config-standard-with-typescript@37.0.0: resolution: {integrity: sha512-V8I/Q1eFf9tiOuFHkbksUdWO3p1crFmewecfBtRxXdnvb71BCJx+1xAknlIRZMwZioMX3/bPtMVCZsf1+AjjOw==} + deprecated: Please use eslint-config-love, instead. peerDependencies: '@typescript-eslint/eslint-plugin': ^5.52.0 eslint: ^8.0.1 @@ -2550,11 +2834,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 +2864,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 @@ -2607,11 +2891,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,13 +2923,14 @@ 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} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true espree@9.6.1: @@ -2657,8 +2942,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 +2966,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 +2977,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 +2989,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 +3026,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 +3046,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 +3061,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 +3075,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 +3098,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 +3123,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 +3145,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.3: + resolution: {integrity: sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==} 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 +3170,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.0.6: + resolution: {integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==} fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -2896,8 +3183,8 @@ 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] @@ -2906,14 +3193,11 @@ packages: 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: @@ -2924,8 +3208,8 @@ packages: 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 +3219,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 +3231,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 +3243,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.4: + resolution: {integrity: sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==} engines: {node: '>= 14'} getpass@0.1.7: @@ -2980,6 +3265,10 @@ 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 @@ -2992,20 +3281,21 @@ packages: 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==} @@ -3027,12 +3317,9 @@ packages: 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 +3329,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 +3355,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==} @@ -3098,8 +3371,8 @@ packages: 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 +3381,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 +3421,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 +3430,22 @@ 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.14.2: + resolution: {integrity: sha512-5tCuY9BV8ujfOpwtAGgsTx9CGUapcFMEEyByLv1B+v2+6DhAcw+Zr0nhQT7uwaZ7DiourxFEscghOR8e1aPLQw==} + 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,12 +3453,9 @@ 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==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.3: resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} @@ -3194,42 +3463,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 +3501,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 +3557,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 +3572,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 +3598,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 +3622,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 +3641,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==} @@ -3385,14 +3665,18 @@ packages: 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 +3685,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 +3719,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 +3731,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 +3780,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 +3838,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 +3861,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==} @@ -3607,15 +3902,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 +3918,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 +3945,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 +3966,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.9: + resolution: {integrity: sha512-VWwAdNeJgN7jFOD+wN4qx83DTPMVPPAUyx9/TUkBXKLiNkuWWk6anV0439tgdtwaJDrEdqkvdN22iA6J4bUCZg==} lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} @@ -3691,17 +3985,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: @@ -3720,6 +4014,9 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + lodash.clonedeep@4.5.0: resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} @@ -3728,10 +4025,29 @@ packages: lodash.get@4.4.2: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. + + 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==} @@ -3740,6 +4056,10 @@ packages: lodash.omit@4.5.0: resolution: {integrity: sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==} + deprecated: This package is deprecated. Use destructuring assignment syntax instead. + + lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} @@ -3751,20 +4071,22 @@ 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} + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + + 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 +4099,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.6.1: + resolution: {integrity: sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==} + 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 +4131,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 +4151,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 +4165,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 +4205,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 +4236,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,11 +4259,11 @@ 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==} @@ -3939,39 +4281,38 @@ 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.4: + resolution: {integrity: sha512-uaff7RG9VIC4jacFW9xzL3jc0iM32DNHe4jYVycBcjUePT/Klnfj7pqtWJt9khvDFizmjN2TlYniYmSS2LIaZg==} multer@1.4.5-lts.1: resolution: {integrity: sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==} engines: {node: '>= 6.0.0'} + deprecated: Multer 1.x is impacted by a number of vulnerabilities, which have been patched in 2.x. You should upgrade to the latest 2.x version. + + multer@2.0.1: + resolution: {integrity: sha512-Ug8bXeTIUlxurg8xLTEskKShvcKDZALo1THEX5E41pYCD2sCVub5/kIRIGqWNoqV6szyLyQKV6mD4QUrWE5GCQ==} + 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 +4323,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 +4338,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 +4351,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 +4364,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 +4373,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 +4387,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,8 +4403,8 @@ 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: @@ -4094,34 +4428,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: @@ -4153,8 +4489,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 +4500,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 +4524,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 +4553,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 +4591,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 +4620,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.6: + resolution: {integrity: sha512-uxmJAnmIgmYgnSFzgOf2cqGQBzwnRYcrEgXuFjJNEkpedEIPBSEzxY7ph4uA9k1mI+l/GR0HjPNS6FKNZe8SBQ==} - 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.2: + resolution: {integrity: sha512-Ci7jy8PbaWxfsck2dwZdERcDG2A0MG8JoQILs+uZNjABFuBuItAZCWUNz8sXRDMoui24rJw7WlXqgpMdBSN/vQ==} 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.2: + resolution: {integrity: sha512-OtLWF0mKLmpxelOt9BqVq83QV6bTfsS0XLegIeAKqKjurRnRKie1Dc1iL89MugmSLhftxw6NNCyZhm1yQFLMEQ==} + engines: {node: '>= 16.0.0'} peerDependencies: pg-native: '>=3.0.1' peerDependenciesMeta: @@ -4336,13 +4659,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 +4690,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 +4709,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 +4737,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.0: + resolution: {integrity: sha512-ujSB9uXHJKzM/2GBuE0hBOUgC77CN3Bnpqa+g80bkv3T3A93wL/xlzDATHhnhkzifz/UE2SNOvmbTz5hSkDlHw==} 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 @@ -4449,6 +4780,10 @@ packages: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} + protobufjs@7.5.3: + resolution: {integrity: sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw==} + engines: {node: '>=12.0.0'} + proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -4467,17 +4802,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 +4824,35 @@ 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 + deprecated: < 22.8.2 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'} + deprecated: < 22.8.2 is no longer supported + 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: @@ -4530,9 +4867,6 @@ packages: 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 +4880,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,18 +4894,10 @@ 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'} - redis-commands@1.7.0: resolution: {integrity: sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==} @@ -4591,14 +4913,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: @@ -4628,8 +4951,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 +4970,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,12 +4994,12 @@ 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==} @@ -4703,14 +5023,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 +5046,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 +5064,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 +5082,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,6 +5105,14 @@ 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==} @@ -4790,17 +5134,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-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.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + 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 +5167,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 +5175,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.5: + resolution: {integrity: sha512-iF+tNDQla22geJdTyJB1wM/qrX9DMRwWrciEPwWLPRWAUEM8sQiyxgckLxWT1f7+9VabJS0jTGGr4QgBuvi6Ww==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} sonic-boom@1.4.1: resolution: {integrity: sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg==} @@ -4878,11 +5226,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 +5258,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 +5269,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 +5288,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 +5334,24 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - superagent@7.1.5: - resolution: {integrity: sha512-HQYyGuDRFGmZ6GNC4hq2f37KnsY9Lr0/R1marNZTgMweVDQLTLJJ6DGQ9Tj/xVVs5HEnop9EMmTbywb5P30aqw==} + strtok3@10.3.1: + resolution: {integrity: sha512-3JWEZM6mfix/GCJBBUrkA8p2Id2pBkyTkVCJKto55w080QBKZ+8R171fGrbiSp+yMO/u6F8/yUh7K4V9K+YCnw==} + 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 +5364,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.25.2: + resolution: {integrity: sha512-V4JyoygUe5nCbn7bAD0fVKSC0yNcL3ROIQtGC7M0NATKuyosCSmMU6T0yDZIIuGpSxjsjZh/D2Ejb8lnF2jjxw==} - 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 +5380,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 +5410,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 +5419,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,10 +5444,6 @@ 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-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -5106,6 +5455,10 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + token-types@6.0.0: + resolution: {integrity: sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA==} + engines: {node: '>=14.16'} + tough-cookie@2.5.0: resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} engines: {node: '>=0.8'} @@ -5127,42 +5480,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 +5534,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 +5548,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 +5582,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 +5676,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 - uglify-js@3.17.4: - resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + engines: {node: '>=14.17'} + hasBin: true + + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} engines: {node: '>=0.8.0'} hasBin: true @@ -5336,12 +5695,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 +5724,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 +5735,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 +5750,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,6 +5766,10 @@ 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. @@ -5423,19 +5783,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 +5809,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 +5831,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 +5845,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 +5885,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 +5895,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 +5918,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 +5929,32 @@ 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 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -5587,8 +5965,8 @@ packages: utf-8-validate: optional: true - ws@8.14.2: - resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} + ws@8.18.2: + resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -5603,10 +5981,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 +5989,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 +6004,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 +6013,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 +6021,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 +6029,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 +6050,227 @@ packages: snapshots: - '@aashutoshrathi/word-wrap@1.2.6': {} - - '@ampproject/remapping@2.2.1': - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 - - '@angular-devkit/core@16.1.0(chokidar@3.5.3)': + '@ampproject/remapping@2.3.0': 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.8 + '@jridgewell/trace-mapping': 0.3.25 - '@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)': + '@angular-devkit/schematics@17.3.11(chokidar@3.6.0)': dependencies: - '@angular-devkit/core': 16.1.0(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 - '@angular-devkit/schematics@16.1.4(chokidar@3.5.3)': + '@babel/code-frame@7.27.1': dependencies: - '@angular-devkit/core': 16.1.4(chokidar@3.5.3) - jsonc-parser: 3.2.0 - magic-string: 0.30.0 - 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': - 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.27.5': {} + + '@babel/core@7.27.4': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/helpers': 7.27.6 + '@babel/parser': 7.27.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 + 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.27.5': 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.27.5 + '@babel/types': 7.27.6 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + 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.27.5 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.25.0 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-environment-visitor@7.22.5': {} - - '@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.27.4 + '@babel/types': 7.27.6 + transitivePeerDependencies: + - supports-color - '@babel/helper-hoist-variables@7.22.5': + '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.4)': dependencies: - '@babel/types': 7.22.5 + '@babel/core': 7.27.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.4 + 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.27.6': dependencies: - '@babel/types': 7.22.5 - - '@babel/helper-string-parser@7.22.5': {} + '@babel/template': 7.27.2 + '@babel/types': 7.27.6 - '@babel/helper-validator-identifier@7.22.5': {} - - '@babel/helper-validator-option@7.22.5': {} - - '@babel/helpers@7.22.6': + '@babel/parser@7.27.5': dependencies: - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.8 - '@babel/types': 7.22.5 - transitivePeerDependencies: - - supports-color + '@babel/types': 7.27.6 - '@babel/highlight@7.22.5': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.27.4)': dependencies: - '@babel/helper-validator-identifier': 7.22.5 - chalk: 2.4.2 - js-tokens: 4.0.0 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/parser@7.22.7': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.27.4)': dependencies: - '@babel/types': 7.22.5 + '@babel/core': 7.27.4 + '@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.27.4)': dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.27.4 + '@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.27.4)': dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.27.4 + '@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.27.4)': dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.27.4 + '@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.27.4)': dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.27.4 + '@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.27.4)': dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.27.4 + '@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.27.4)': dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.27.4 + '@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.27.4)': dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.27.4 + '@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.27.4)': dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.27.4 + '@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.27.4)': dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.27.4 + '@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.27.4)': dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.27.4 + '@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.27.4)': dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.27.4 + '@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.27.4)': dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.27.4 + '@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.27.4)': dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.27.4 + '@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.27.4)': dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/runtime@7.22.6': + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.27.4)': dependencies: - regenerator-runtime: 0.13.11 + '@babel/core': 7.27.4 + '@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.27.5 + '@babel/types': 7.27.6 - '@babel/traverse@7.22.8': + '@babel/traverse@7.27.4': 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 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.5 + '@babel/parser': 7.27.5 + '@babel/template': 7.27.2 + '@babel/types': 7.27.6 + debug: 4.4.1 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.22.5': + '@babel/types@7.27.6': 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': {} @@ -5983,50 +6304,71 @@ 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': {} + + '@grpc/grpc-js@1.13.4': + dependencies: + '@grpc/proto-loader': 0.7.15 + '@js-sdsl/ordered-map': 4.4.2 + + '@grpc/proto-loader@0.7.15': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.3.2 + protobufjs: 7.5.3 + yargs: 17.7.2 - '@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.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: camelcase: 5.3.1 @@ -6037,43 +6379,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.1 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.1)(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.1 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.1)(ts-node@10.9.2(@types/node@20.19.1)(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 +6423,421 @@ 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.1 + 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.1 + 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.25 + '@types/node': 20.19.1 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.25 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.27.4 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 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.1 + '@types/yargs': 17.0.33 chalk: 4.1.2 - '@jridgewell/gen-mapping@0.3.3': + '@jridgewell/gen-mapping@0.3.8': dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.18 + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 - '@jridgewell/resolve-uri@3.1.0': {} + '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/resolve-uri@3.1.1': {} + '@jridgewell/set-array@1.2.1': {} - '@jridgewell/set-array@1.1.2': {} - - '@jridgewell/source-map@0.3.5': + '@jridgewell/source-map@0.3.6': dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 - - '@jridgewell/sourcemap-codec@1.4.14': {} + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 - '@jridgewell/sourcemap-codec@1.4.15': {} + '@jridgewell/sourcemap-codec@1.5.0': {} - '@jridgewell/trace-mapping@0.3.18': + '@jridgewell/trace-mapping@0.3.25': dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 '@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.0 + + '@js-sdsl/ordered-map@4.4.2': {} + + '@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.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(axios@0.26.1)(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.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + axios: 0.26.1 + 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.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(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) - tslib: 2.6.0 + '@nestjs/common': 10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/core': 10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(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.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2))(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.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2)) + '@nestjs/common': 10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/core': 10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(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.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2))(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.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/core': 10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(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.19(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.19(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.19(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.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(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.19(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.19(@grpc/grpc-js@1.13.4)(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(@nestjs/websockets@10.4.19)(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.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19) + '@nestjs/websockets': 10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(@nestjs/platform-socket.io@10.4.19)(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.19(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.19(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.19(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.19(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.19(@grpc/grpc-js@1.13.4)(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(@nestjs/websockets@10.4.19)(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.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/core': 10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(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 + '@grpc/grpc-js': 1.13.4 + '@nestjs/websockets': 10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(@nestjs/platform-socket.io@10.4.19)(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.19(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.19(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.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)': 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.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/core': 10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(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.1 + 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.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/websockets@10.4.19)(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.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/websockets': 10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(@nestjs/platform-socket.io@10.4.19)(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.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.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) - cron: 2.3.1 - reflect-metadata: 0.1.13 - uuid: 9.0.0 + '@nestjs/common': 10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/core': 10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(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.0.1(chokidar@3.5.3)(typescript@5.1.6)': + '@nestjs/schematics@10.2.3(chokidar@3.6.0)(typescript@5.7.2)': 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.7.2 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/schematics@10.2.3(chokidar@3.6.0)(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) - '@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) + '@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.8.3 + transitivePeerDependencies: + - chokidar + + '@nestjs/swagger@7.4.2(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(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: + '@microsoft/tsdoc': 0.15.1 + '@nestjs/common': 10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/core': 10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/mapped-types': 2.0.5(@nestjs/common@10.4.19(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.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19(@grpc/grpc-js@1.13.4)(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(@nestjs/websockets@10.4.19)(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.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19))': 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.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/core': 10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(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.19(@grpc/grpc-js@1.13.4)(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(@nestjs/websockets@10.4.19)(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.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19) - '@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.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(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.2)(redis@3.1.2)(reflect-metadata@0.1.14)(ts-node@10.9.2(@types/node@20.19.1)(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.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/core': 10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(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.2)(redis@3.1.2)(reflect-metadata@0.1.14)(ts-node@10.9.2(@types/node@20.19.1)(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.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(@nestjs/platform-socket.io@10.4.19)(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.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/core': 10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(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.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/websockets@10.4.19)(rxjs@7.8.2) + + '@noble/hashes@1.8.0': {} '@nodelib/fs.scandir@2.1.5': dependencies: @@ -6490,51 +6849,347 @@ 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/api-logs@0.202.0': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/api@1.9.0': {} + + '@opentelemetry/context-async-hooks@2.0.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 - '@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/core@2.0.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.34.0 + + '@opentelemetry/exporter-logs-otlp-grpc@0.202.0(@opentelemetry/api@1.9.0)': + dependencies: + '@grpc/grpc-js': 1.13.4 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-grpc-exporter-base': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.202.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-logs-otlp-http@0.202.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.202.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.202.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-logs-otlp-proto@0.202.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.202.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-metrics-otlp-grpc@0.202.0(@opentelemetry/api@1.9.0)': + dependencies: + '@grpc/grpc-js': 1.13.4 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-http': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-grpc-exporter-base': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-metrics-otlp-http@0.202.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-metrics-otlp-proto@0.202.0(@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': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-http': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-prometheus@0.202.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-trace-otlp-grpc@0.202.0(@opentelemetry/api@1.9.0)': + dependencies: + '@grpc/grpc-js': 1.13.4 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-grpc-exporter-base': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-trace-otlp-http@0.202.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-trace-otlp-proto@0.202.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-zipkin@2.0.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.34.0 + + '@opentelemetry/instrumentation-express@0.51.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.34.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-http@0.202.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.34.0 + forwarded-parse: 2.1.2 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-nestjs-core@0.48.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.34.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation@0.202.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.202.0 + import-in-the-middle: 1.14.2 + require-in-the-middle: 7.5.2 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/otlp-exporter-base@0.202.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.202.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/otlp-grpc-exporter-base@0.202.0(@opentelemetry/api@1.9.0)': + dependencies: + '@grpc/grpc-js': 1.13.4 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.202.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/otlp-transformer@0.202.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.202.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + protobufjs: 7.5.3 + + '@opentelemetry/propagator-b3@2.0.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/propagator-jaeger@2.0.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.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/resources@2.0.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': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.34.0 + + '@opentelemetry/sdk-logs@0.202.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.202.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@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.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/sdk-metrics@2.0.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/sdk-node@0.202.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.202.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-logs-otlp-grpc': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-logs-otlp-http': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-logs-otlp-proto': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-grpc': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-http': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-proto': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-prometheus': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-grpc': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-http': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-proto': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-zipkin': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/propagator-b3': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/propagator-jaeger': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-node': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.34.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.34.0 + + '@opentelemetry/sdk-trace-node@2.0.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/semantic-conventions@1.28.0': optional: true - '@prisma/client@5.1.1(prisma@5.1.1)': + '@opentelemetry/semantic-conventions@1.34.0': {} + + '@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.1.1 + prisma: 5.22.0 + + '@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/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/get-platform@5.22.0': + dependencies: + '@prisma/debug': 5.22.0 + + '@protobufjs/aspromise@1.1.2': {} + + '@protobufjs/base64@1.1.2': {} + + '@protobufjs/codegen@2.0.4': {} + + '@protobufjs/eventemitter@1.1.0': {} + + '@protobufjs/fetch@1.1.0': + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + + '@protobufjs/float@1.0.2': {} + + '@protobufjs/inquire@1.1.0': {} + + '@protobufjs/path@1.1.2': {} - '@prisma/engines-version@5.1.1-1.6a3747c37ff169c90047725a05a6ef02e32ac97e': {} + '@protobufjs/pool@1.1.0': {} - '@prisma/engines@5.1.1': {} + '@protobufjs/utf8@1.1.0': {} '@puppeteer/browsers@1.5.0': dependencies: @@ -6548,7 +7203,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 +7215,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 +7239,77 @@ 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.70.0': 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.4': 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.10': dependencies: - cross-fetch: 3.1.8 + '@supabase/node-fetch': 2.6.15 + '@types/phoenix': 1.6.6 + '@types/ws': 8.18.1 + ws: 8.18.2 transitivePeerDependencies: - - encoding + - bufferutil + - utf-8-validate + + '@supabase/storage-js@2.7.1': + dependencies: + '@supabase/node-fetch': 2.6.15 - '@supabase/supabase-js@2.32.0': + '@supabase/supabase-js@2.50.0': 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/auth-js': 2.70.0 + '@supabase/functions-js': 2.4.4 + '@supabase/node-fetch': 2.6.15 + '@supabase/postgrest-js': 1.19.4 + '@supabase/realtime-js': 2.11.10 + '@supabase/storage-js': 2.7.1 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.0 + 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 +7317,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.27.5 + '@babel/types': 7.27.6 + '@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.27.6 - '@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.27.5 + '@babel/types': 7.27.6 - '@types/babel__traverse@7.20.1': + '@types/babel__traverse@7.20.7': dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.27.6 - '@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.1 - '@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.1 - '@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.1 - '@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.1 + '@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.1 - '@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.1 '@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.1 - '@types/mime@1.3.2': {} + '@types/jsonwebtoken@9.0.5': + dependencies: + '@types/node': 20.19.1 - '@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/node@20.4.6': {} + '@types/ms@2.1.0': {} + + '@types/multer@1.4.13': + dependencies: + '@types/express': 4.17.23 - '@types/parse-json@4.0.0': {} + '@types/node@20.19.1': + 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.1 - '@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.1 - '@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.1 + '@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.1 + form-data: 4.0.3 - '@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.1 - '@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.1 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 +7567,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 +7634,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 + + '@ungap/structured-clone@1.3.0': {} - '@webassemblyjs/ast@1.11.6': + '@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 +7725,63 @@ 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.10.0 + acorn: 8.15.0 + optional: true + + acorn-import-attributes@1.9.5(acorn@8.15.0): + dependencies: + acorn: 8.15.0 - acorn-jsx@5.3.2(acorn@8.10.0): + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: - acorn: 8.10.0 + acorn: 8.15.0 - acorn-walk@8.2.0: {} + acorn-walk@8.3.4: + dependencies: + acorn: 8.15.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.3: {} - 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 +7796,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 +7825,7 @@ snapshots: ansi-styles@6.2.1: {} - any-promise@1.3.0: {} + ansis@3.17.0: {} anymatch@3.1.3: dependencies: @@ -7163,61 +7851,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 +7926,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 +7954,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 +7987,24 @@ 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: - dependencies: - follow-redirects: 1.15.2 - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug + b4a@1.6.7: {} - b4a@1.6.4: {} - - babel-jest@29.6.2(@babel/core@7.22.9): + babel-jest@29.7.0(@babel/core@7.27.4): dependencies: - '@babel/core': 7.22.9 - '@jest/transform': 29.6.2 - '@types/babel__core': 7.20.1 + '@babel/core': 7.27.4 + '@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.27.4) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -7325,7 +8013,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 +8021,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.27.6 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.7 + + babel-preset-current-node-syntax@1.1.0(@babel/core@7.27.4): + dependencies: + '@babel/core': 7.27.4 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.27.4) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.27.4) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.27.4) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.27.4) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.27.4) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.27.4) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.27.4) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.27.4) + + babel-preset-jest@29.6.3(@babel/core@7.27.4): + dependencies: + '@babel/core': 7.27.4 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.4) balanced-match@1.0.2: {} + bare-events@2.5.4: + optional: true + base64-js@0.0.8: {} base64-js@1.5.1: {} @@ -7374,14 +8068,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 +8083,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 +8109,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 +8121,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.0: 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.30001724 + electron-to-chromium: 1.5.173 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.25.0) bs-logger@0.2.6: dependencies: @@ -7500,8 +8173,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 +8191,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.4 + semver: 7.7.2 uuid: 8.3.2 transitivePeerDependencies: - supports-color @@ -7550,25 +8217,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: + call-bind-apply-helpers@1.0.2: dependencies: - function-bind: 1.1.1 - get-intrinsic: 1.2.1 - - call-bind@1.0.7: - 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 +8247,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001519: {} + caniuse-lite@1.0.30001724: {} caseless@0.12.0: optional: true @@ -7585,90 +8256,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.9 + 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 +8331,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 +8390,7 @@ snapshots: dependencies: delayed-stream: 1.0.0 - commander@10.0.1: {} + commander@11.0.0: {} commander@2.20.3: {} @@ -7747,7 +8398,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 +8406,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 +8417,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 +8437,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 +8460,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.1)(ts-node@10.9.2(@types/node@20.19.1)(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.1)(ts-node@10.9.2(@types/node@20.19.1)(typescript@5.8.3)) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node - cron@2.3.1: + create-require@1.1.1: {} + + cron-parser@4.9.0: dependencies: - luxon: 3.4.4 + luxon: 3.6.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 +8568,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 +8611,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 +8639,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 +8654,7 @@ snapshots: dfa@1.2.0: {} - diff-sequences@29.4.3: {} + diff-sequences@29.6.3: {} diff@4.0.2: {} @@ -7998,9 +8674,15 @@ snapshots: dotenv-expand@10.0.0: {} - dotenv@16.0.3: {} + dotenv@16.4.5: {} - dotenv@16.1.4: {} + dotenv@16.5.0: {} + + 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 +8702,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 +8731,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 +8739,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 +8750,7 @@ snapshots: - supports-color optional: true - electron-to-chromium@1.4.483: {} + electron-to-chromium@1.5.173: {} emittery@0.13.1: {} @@ -8074,49 +8760,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.1 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 +8817,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 +8933,106 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-prettier@8.10.0(eslint@8.46.0): + eslint-config-prettier@8.10.0(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.1(eslint-config-prettier@8.10.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.6.0): dependencies: - eslint: 8.46.0 - prettier: 3.0.1 + eslint: 8.57.1 + prettier: 3.6.0 prettier-linter-helpers: 1.0.0 optionalDependencies: - eslint-config-prettier: 8.10.0(eslint@8.46.0) + eslint-config-prettier: 8.10.0(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 +9048,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 +9096,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 +9104,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 +9126,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 +9146,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 +9202,6 @@ snapshots: transitivePeerDependencies: - supports-color - ext@1.7.0: - dependencies: - type: 2.7.2 - extend@3.0.2: optional: true @@ -8557,11 +9223,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 +9240,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 +9259,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 +9278,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.1 + token-types: 6.0.0 + 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 +9331,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,21 +9394,22 @@ snapshots: mime-types: 2.1.35 optional: true - form-data@4.0.0: + form-data@4.0.3: 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 + forwarded-parse@2.1.2: {} forwarded@0.2.0: {} @@ -8740,25 +9426,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.0.6: {} 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,17 +9448,16 @@ snapshots: mkdirp: 0.5.6 rimraf: 2.7.1 - function-bind@1.1.1: {} + function-bind@1.1.2: {} - function-bind@1.1.2: - optional: true - - 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: {} @@ -8794,49 +9473,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.4: 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 +9536,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 +9559,29 @@ 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 +9594,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 +9605,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 +9636,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 +9649,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 +9664,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.3 + debug: 4.3.4 transitivePeerDependencies: - supports-color @@ -9000,29 +9675,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.3 + debug: 4.4.1 transitivePeerDependencies: - supports-color - human-signals@1.1.1: {} - human-signals@2.1.0: {} human-signals@4.3.1: {} @@ -9038,10 +9709,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 +9722,35 @@ 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.14.2: + dependencies: + acorn: 8.15.0 + acorn-import-attributes: 1.9.5(acorn@8.15.0) + cjs-module-lexer: 1.4.3 + module-details-from-path: 1.0.4 + 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 +9760,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 +9772,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 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 +9816,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: - has-bigints: 1.0.2 + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 is-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 +9891,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 +9909,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 +9917,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 +9951,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: {} @@ -9292,83 +9991,106 @@ snapshots: 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.27.4 + '@babel/parser': 7.27.5 '@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.27.4 + '@babel/parser': 7.27.5 + '@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: {} - jest-changed-files@29.5.0: + 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.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.1 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.1)(ts-node@10.9.2(@types/node@20.19.1)(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.1)(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.1)(ts-node@10.9.2(@types/node@20.19.1)(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.1)(ts-node@10.9.2(@types/node@20.19.1)(typescript@5.8.3)) + jest-util: 29.7.0 + jest-validate: 29.7.0 yargs: 17.7.2 transitivePeerDependencies: - '@types/node' @@ -9376,264 +10098,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.1)(ts-node@10.9.2(@types/node@20.19.1)(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.27.4 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.27.4) 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.1 + ts-node: 10.9.2(@types/node@20.19.1)(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.1 + 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.1 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.1 + 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.1 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.1 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.27.4 + '@babel/generator': 7.27.5 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.4) + '@babel/types': 7.27.6 + '@jest/expect-utils': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.4) 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.1 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.1 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.1 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.1 + 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.1)(ts-node@10.9.2(@types/node@20.19.1)(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.1)(typescript@5.8.3)) + '@jest/types': 29.6.3 + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@20.19.1)(ts-node@10.9.2(@types/node@20.19.1)(typescript@5.8.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -9642,7 +10364,7 @@ snapshots: jmespath@0.16.0: {} - jose@4.14.4: {} + jose@4.15.9: {} js-cookie@2.2.1: {} @@ -9662,7 +10384,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 +10414,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: + jsonwebtoken@9.0.2: dependencies: jws: 3.2.2 - lodash: 4.17.21 - ms: 2.1.3 - semver: 7.5.4 - - jsonwebtoken@9.0.1: - 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 +10452,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 +10508,7 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - libphonenumber-js@1.10.39: {} + libphonenumber-js@1.12.9: {} lilconfig@2.1.0: {} @@ -9798,18 +10523,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 +10541,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: {} @@ -9840,20 +10560,36 @@ snapshots: dependencies: p-locate: 5.0.0 + lodash.camelcase@4.3.0: {} + lodash.clonedeep@4.5.0: {} lodash.defaults@4.2.0: {} 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 +10600,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 +10617,15 @@ snapshots: safe-stable-stringify: 2.5.0 triple-beam: 1.4.1 - lru-cache@10.2.0: {} + long@5.3.2: {} - lru-cache@4.0.2: + lru-cache@10.4.3: {} + + lru-cache@4.1.5: dependencies: pseudomap: 1.0.2 yallist: 2.1.2 + optional: true lru-cache@5.1.1: dependencies: @@ -9897,18 +10637,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.6.1: {} - magic-string@0.30.0: + magic-string@0.30.8: dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 make-dir@3.1.0: dependencies: @@ -9916,7 +10656,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.5.4 + semver: 7.7.2 make-error@1.3.6: {} @@ -9927,6 +10667,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 +10687,9 @@ snapshots: memfs@3.5.3: dependencies: - fs-monkey: 1.0.4 + fs-monkey: 1.0.6 - merge-descriptors@1.0.1: {} + merge-descriptors@1.0.3: {} merge-stream@2.0.0: {} @@ -9955,7 +10697,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 +10725,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 +10753,7 @@ snapshots: minipass@5.0.0: {} - minipass@7.0.2: {} + minipass@7.1.2: {} minizlib@2.1.2: dependencies: @@ -10011,10 +10770,9 @@ snapshots: mkdirp@1.0.4: {} - module-details-from-path@1.0.3: - optional: true + module-details-from-path@1.0.4: {} - moment@2.29.3: {} + moment@2.30.1: {} monitor-event-loop-delay@1.0.0: optional: true @@ -10035,23 +10793,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.4: 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 +10819,11 @@ snapshots: type-is: 1.6.18 xtend: 4.0.2 - multer@1.4.5-lts.1: + multer@2.0.1: 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 +10831,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 +10845,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.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.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) - '@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.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/core': 10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(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 +10858,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.19(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.2)(redis@3.1.2)(reflect-metadata@0.1.14)(ts-node@10.9.2(@types/node@20.19.1)(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.19(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.2)(redis@3.1.2)(reflect-metadata@0.1.14)(ts-node@10.9.2(@types/node@20.19.1)(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 +10880,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 +10904,7 @@ snapshots: node-qpdf2@2.0.0: {} - node-releases@2.0.13: {} + node-releases@2.0.19: {} nopt@5.0.0: dependencies: @@ -10166,7 +10916,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 +10939,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: @@ -10263,21 +11017,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 +11043,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 +11067,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.3 + debug: 4.3.4 + get-uri: 6.0.4 + 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 +11099,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 +11133,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 +11153,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 +11163,18 @@ snapshots: performance-now@2.1.0: optional: true - pg-cloudflare@1.1.1: + pg-cloudflare@1.2.6: 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.2): dependencies: - pg: 8.11.2 + pg: 8.16.2 - pg-protocol@1.6.0: {} + pg-protocol@1.10.2: {} pg-types@2.2.0: dependencies: @@ -10442,17 +11184,15 @@ snapshots: postgres-date: 1.0.7 postgres-interval: 1.2.0 - pg@8.11.2: + pg@8.16.2: 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.2) + pg-protocol: 1.10.2 pg-types: 2.2.0 pgpass: 1.0.5 optionalDependencies: - pg-cloudflare: 1.1.1 + pg-cloudflare: 1.2.6 pgpass@1.0.5: dependencies: @@ -10473,10 +11213,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 +11243,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 +11255,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 +11273,19 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier@3.0.1: {} + prettier@3.6.0: {} - 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: {} @@ -10564,6 +11310,21 @@ snapshots: kleur: 3.0.3 sisteransi: 1.0.5 + protobufjs@7.5.3: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 20.19.1 + long: 5.3.2 + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 @@ -10571,97 +11332,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.3 + 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.3 + 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 +11433,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 +11456,6 @@ snapshots: queue-microtask@1.2.3: {} - queue-tick@1.0.1: {} - quick-format-unescaped@4.0.4: optional: true @@ -10706,13 +11467,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 +11474,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,22 +11492,10 @@ 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 - redis-commands@1.7.0: {} redis-errors@1.2.0: {} @@ -10769,15 +11511,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 +11542,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,14 +11573,13 @@ 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 require-main-filename@2.0.0: {} @@ -10838,28 +11591,20 @@ snapshots: resolve-from@5.0.0: {} - resolve.exports@2.0.2: {} + resolve.exports@2.0.3: {} - resolve@1.22.2: + 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.3: - dependencies: - is-core-module: 2.12.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 +11613,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 +11633,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 - safe-array-concat@1.0.0: + rxjs@7.8.2: dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - has-symbols: 1.0.3 + tslib: 2.8.1 + + safe-array-concat@1.1.3: + dependencies: + 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 +11676,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 +11715,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,10 +11735,22 @@ 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: {} @@ -10996,20 +11770,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 +11810,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 +11817,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 +11839,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.3 + debug: 4.3.4 + socks: 2.8.5 transitivePeerDependencies: - supports-color - socks@2.7.1: + socks@2.8.5: dependencies: - ip: 2.0.0 + ip-address: 9.0.5 smart-buffer: 4.2.0 sonic-boom@1.4.1: @@ -11118,10 +11900,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 +11933,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 +11945,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.5.4 string-argv@0.3.2: {} @@ -11182,23 +11971,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 +12008,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 +12020,48 @@ snapshots: strip-json-comments@3.1.1: {} - superagent@7.1.5: + strtok3@10.3.1: + 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.3 + 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.3 + 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 +12072,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.25.2: + 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.25.2 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 +12108,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.25 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.6 + acorn: 8.15.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -11334,19 +12130,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,8 +12151,6 @@ snapshots: tmpl@1.0.5: {} - to-fast-properties@2.0.0: {} - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -11372,17 +12162,22 @@ snapshots: toidentifier@1.0.1: {} + token-types@6.0.0: + 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 +12186,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.27.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.4))(jest-util@29.7.0)(jest@29.7.0(@types/node@20.19.1)(ts-node@10.9.2(@types/node@20.19.1)(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.1)(ts-node@10.9.2(@types/node@20.19.1)(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.27.4 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.27.4) + 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.4 + 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.1)(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.1 + 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 +12260,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 +12287,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.2)(redis@3.1.2)(reflect-metadata@0.1.14)(ts-node@10.9.2(@types/node@20.19.1)(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 + dayjs: 1.11.13 + debug: 4.4.1 + dedent: 1.6.0 + dotenv: 16.5.0 + glob: 10.4.5 + reflect-metadata: 0.1.14 sha.js: 2.4.11 - tslib: 2.6.1 - uuid: 8.3.2 - xml2js: 0.4.23 + 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.2 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.1)(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 +12407,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 +12424,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.0): dependencies: - browserslist: 4.21.10 - escalade: 3.1.1 - picocolors: 1.0.0 + browserslist: 4.25.0 + 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 +12441,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 +12452,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 +12468,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.25 + '@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 +12493,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 +12502,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 +12519,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.0 + 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 +12542,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 +12563,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 +12621,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 +12656,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 +12679,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 +12692,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.2: {} - 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 +12719,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 +12733,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 +12749,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 +12762,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 From fca8aba8feb3a9098617cd215136bb56ba3200fe Mon Sep 17 00:00:00 2001 From: bhavanakarwade Date: Tue, 1 Jul 2025 17:17:38 +0530 Subject: [PATCH 03/60] feat: single sign on (#1305) * feat: single sign on Signed-off-by: bhavanakarwade * fix: rabbit suggestions Signed-off-by: bhavanakarwade * update: send verification mail template Signed-off-by: bhavanakarwade --------- Signed-off-by: bhavanakarwade --- .env.demo | 24 +- .env.sample | 22 + .../api-gateway/src/authz/authz.controller.ts | 225 +++++---- apps/api-gateway/src/authz/authz.service.ts | 31 +- .../src/authz/decorators/user-auth-client.ts | 26 ++ .../src/user/dto/create-user.dto.ts | 50 +- apps/api-gateway/src/user/utils/index.ts | 46 ++ .../repositories/organization.repository.ts | 3 +- apps/user/repositories/user.repository.ts | 67 ++- apps/user/src/user.controller.ts | 136 ++++-- apps/user/src/user.service.ts | 433 +++++++++++------- apps/user/templates/user-email-template.ts | 30 +- docker-compose.yml | 1 + libs/common/src/cast.helper.ts | 21 +- libs/common/src/common.module.ts | 9 +- libs/common/src/interfaces/user.interface.ts | 116 +++-- libs/common/src/response-messages/index.ts | 1 + .../migration.sql | 10 + libs/prisma-service/prisma/schema.prisma | 8 + 19 files changed, 826 insertions(+), 433 deletions(-) create mode 100644 apps/api-gateway/src/authz/decorators/user-auth-client.ts create mode 100644 apps/api-gateway/src/user/utils/index.ts create mode 100644 libs/prisma-service/prisma/migrations/20250701025741_added_client_alias/migration.sql diff --git a/.env.demo b/.env.demo index fe2554c9f..d66ba3ca9 100644 --- a/.env.demo +++ b/.env.demo @@ -155,4 +155,26 @@ OTEL_TRACES_OTLP_ENDPOINT='http://localhost:4318/v1/traces' OTEL_LOGS_OTLP_ENDPOINT='http://localhost:4318/v1/logs' OTEL_HEADERS_KEY=88ca6b1XXXXXXXXXXXXXXXXXXXXXXXXXXX OTEL_LOGGER_NAME='credebl-platform-logger' -HOSTNAME='localhost' \ No newline at end of file +HOSTNAME='localhost' + +# SSO +# To add more clients, simply add comma separated values of client names +SUPPORTED_SSO_CLIENTS=CREDEBL + +# To add more client add the following variables for each additional client. +# Replace the `CLIENT-NAME` with the appropriate client name as added in `SUPPORTED_SSO_CLIENTS` +# Default client will not need the following details + +# CLIENT-NAME_CLIENT_ALIAS=VERIFIER + # # Domain represents the redirection url once the client logs-in + # # TODO: Can be taken from keycloak instead +# CLIENT-NAME_DOMAIN=https://VERIFIER-domain.com + # # Encrypted client credentials using the `CRYPTO_PRIVATE_KEY` +# CLIENT-NAME_KEYCLOAK_MANAGEMENT_CLIENT_ID= +# CLIENT-NAME_KEYCLOAK_MANAGEMENT_CLIENT_SECRET= + +# Sample values: +# VERIFIER_CLIENT_ALIAS=VERIFIER +# VERIFIER_DOMAIN=https://VERIFIER-domain.com +# VERIFIER_KEYCLOAK_MANAGEMENT_CLIENT_ID=encryptedKeyCloakClientId +# VERIFIER_KEYCLOAK_MANAGEMENT_CLIENT_SECRET=encryptedKeyCloakClientSecret \ No newline at end of file diff --git a/.env.sample b/.env.sample index b9b0c5252..ef971b384 100644 --- a/.env.sample +++ b/.env.sample @@ -176,3 +176,25 @@ OTEL_LOGS_OTLP_ENDPOINT='http://localhost:4318/v1/logs' # Endpoint where lo OTEL_HEADERS_KEY=88ca6b1XXXXXXXXXXXXXXXXXXXXXXXXXXX # API key or token used for authenticating with the OTel collector (e.g., SigNoz) OTEL_LOGGER_NAME='credebl-platform-logger' # Name of the logger used for OpenTelemetry log records HOSTNAME='localhost' # Hostname or unique identifier for the service instance + +# SSO +# To add more clients, simply add comma separated values of client names +SUPPORTED_SSO_CLIENTS=CREDEBL + +# To add more client add the following variables for each additional client. +# Replace the `CLIENT-NAME` with the appropriate client name as added in `SUPPORTED_SSO_CLIENTS` +# Default client will not need the following details + +# CLIENT-NAME_CLIENT_ALIAS=MYAPP + # # Domain represents the redirection url once the client logs-in + # # TODO: Can be taken from keycloak instead +# CLIENT-NAME_DOMAIN=https://myapp.com + # # Encrypted client credentials using the `CRYPTO_PRIVATE_KEY` +# CLIENT-NAME_KEYCLOAK_MANAGEMENT_CLIENT_ID= +# CLIENT-NAME_KEYCLOAK_MANAGEMENT_CLIENT_SECRET + +# Sample values: +# VERIFIER_CLIENT_ALIAS=VERIFIER +# VERIFIER_DOMAIN=https://VERIFIER-domain.com +# VERIFIER_KEYCLOAK_MANAGEMENT_CLIENT_ID=encryptedKeyCloakClientId +# VERIFIER_KEYCLOAK_MANAGEMENT_CLIENT_SECRET=encryptedKeyCloakClientSecret \ No newline at end of file diff --git a/apps/api-gateway/src/authz/authz.controller.ts b/apps/api-gateway/src/authz/authz.controller.ts index 5821d6bed..ef55abec9 100644 --- a/apps/api-gateway/src/authz/authz.controller.ts +++ b/apps/api-gateway/src/authz/authz.controller.ts @@ -13,7 +13,7 @@ import { } 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 { ApiBody, ApiOperation, ApiQuery, 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'; @@ -28,7 +28,8 @@ 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'; - +import { getDefaultClient } from '../user/utils'; +import { ClientAliasValidationPipe } from './decorators/user-auth-client'; @Controller('auth') @ApiTags('auth') @@ -36,19 +37,46 @@ import { RefreshTokenDto } from './dtos/refresh-token.dto'; 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 + ) {} + + /** + * Fetch client aliase. + * + * @returns Returns client alias and its url. + */ + @Get('/clientAliases') + @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) + @ApiOperation({ + summary: 'Get client aliases', + description: 'Fetch client aliases and itr url' + }) + async getClientAlias(@Res() res: Response): Promise { + const clientAliases = await this.authzService.getClientAlias(); + const finalResponse: IResponseType = { + statusCode: HttpStatus.OK, + message: ResponseMessages.user.success.fetchClientAliases, + data: clientAliases + }; + + return res.status(HttpStatus.OK).json(finalResponse); + } /** * 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,15 +88,28 @@ 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 }) + @ApiQuery({ + name: 'clientAlias', + required: false, + enum: (process.env.SUPPORTED_SSO_CLIENTS || '') + .split(',') + .map((alias) => alias.trim()?.toUpperCase()) + .filter(Boolean) + }) @ApiOperation({ summary: 'Send verification email', description: 'Send verification email to new user' }) - async create(@Body() userEmailVerification: UserEmailVerificationDto, @Res() res: Response): Promise { + async create( + @Query('clientAlias', ClientAliasValidationPipe) clientAlias: string, + @Body() userEmailVerification: UserEmailVerificationDto, + @Res() res: Response + ): Promise { + userEmailVerification.clientAlias = clientAlias ?? (await getDefaultClient()).alias; await this.authzService.sendVerificationMail(userEmailVerification); const finalResponse: IResponseType = { statusCode: HttpStatus.CREATED, @@ -78,30 +119,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,7 +153,6 @@ 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); @@ -126,36 +168,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 + }; + 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 +203,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 + }; - 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 +229,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 + }; + 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 + }; - 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.service.ts b/apps/api-gateway/src/authz/authz.service.ts index 83d4d8358..8ee8a5b4d 100644 --- a/apps/api-gateway/src/authz/authz.service.ts +++ b/apps/api-gateway/src/authz/authz.service.ts @@ -1,20 +1,22 @@ 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 { + IClientAliases, + IResetPasswordResponse, + ISignInUser, + ISignUpUserResponse, + IVerifyUserEmail +} from '@credebl/common/interfaces/user.interface'; 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 { user } from '@prisma/client'; @Injectable() @WebSocketGateway() export class AuthzService extends BaseService { @@ -22,18 +24,21 @@ 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'); } + getClientAlias(): Promise { + return this.natsClient.sendNatsMessage(this.authServiceProxy, 'get-client-alias-and-url', ''); + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any getUserByKeycloakUserId(keycloakUserId: string): Promise { return this.natsClient.sendNats(this.authServiceProxy, 'get-user-by-keycloakUserId', keycloakUserId); } - async sendVerificationMail(userEmailVerification: UserEmailVerificationDto): Promise { + async sendVerificationMail(userEmailVerification: UserEmailVerificationDto): Promise { const payload = { userEmailVerification }; return this.natsClient.sendNatsMessage(this.authServiceProxy, 'send-verification-mail', payload); } @@ -47,11 +52,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 +73,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/user-auth-client.ts b/apps/api-gateway/src/authz/decorators/user-auth-client.ts new file mode 100644 index 000000000..fd5bf3371 --- /dev/null +++ b/apps/api-gateway/src/authz/decorators/user-auth-client.ts @@ -0,0 +1,26 @@ +import { BadRequestException, Injectable, PipeTransform } from '@nestjs/common'; + +@Injectable() +export class ClientAliasValidationPipe implements PipeTransform { + private readonly allowedAliases: string[]; + + constructor() { + this.allowedAliases = (process.env.SUPPORTED_SSO_CLIENTS || '') + .split(',') + .map((alias) => alias.trim()) + .filter(Boolean); + } + + transform(value: string): string { + if (!value) { + return value; + } // allow empty if it's optional + const upperValue = value.toUpperCase(); + + if (!this.allowedAliases.includes(upperValue)) { + throw new BadRequestException(`Invalid clientAlias. Allowed values are: ${this.allowedAliases.join(', ')}`); + } + + return upperValue; + } +} 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..b52f3dc71 100644 --- a/apps/api-gateway/src/user/dto/create-user.dto.ts +++ b/apps/api-gateway/src/user/dto/create-user.dto.ts @@ -1,41 +1,41 @@ +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { IsEmail, IsNotEmpty, IsOptional, IsString, IsUrl, MaxLength } from 'class-validator'; import { toLowerCase, trim } from '@credebl/common/cast.helper'; -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: '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: '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; - @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() + @IsOptional() + @IsString({ message: 'clientAlias should be string' }) + @Transform(({ value }) => trim(value)) + clientAlias?: string; } diff --git a/apps/api-gateway/src/user/utils/index.ts b/apps/api-gateway/src/user/utils/index.ts new file mode 100644 index 000000000..0dd9f1da7 --- /dev/null +++ b/apps/api-gateway/src/user/utils/index.ts @@ -0,0 +1,46 @@ +import { IClientDetailsSSO } from '@credebl/common/interfaces/user.interface'; +import { encryptClientCredential } from '@credebl/common/cast.helper'; + +export const getDefaultClient = async (): Promise => ({ + alias: process.env.PLATFORM_NAME?.toUpperCase(), + domain: process.env.FRONT_END_URL, + clientId: await encryptClientCredential(process.env.KEYCLOAK_MANAGEMENT_CLIENT_ID), + clientSecret: await encryptClientCredential(process.env.KEYCLOAK_MANAGEMENT_CLIENT_SECRET) +}); + +// Now getting from env, but can get from DB +function getClientDetails(alias: string): IClientDetailsSSO { + const clientIdKey = `${alias}_KEYCLOAK_MANAGEMENT_CLIENT_ID`; + const clientSecretKey = `${alias}_KEYCLOAK_MANAGEMENT_CLIENT_SECRET`; + const domainKey = `${alias}_DOMAIN`; + const aliasNameKey = `${alias}_ALIAS`; + + const clientId = process.env[clientIdKey]; + const clientSecret = process.env[clientSecretKey]; + const domain = process.env[domainKey]; + const aliasName = process.env[aliasNameKey] || alias; + + const clientDetails: IClientDetailsSSO = { + clientId, + clientSecret, + domain, + alias: aliasName + }; + + return clientDetails; +} + +export async function getCredentialsByAlias(alias: string): Promise { + const defaultClient = await getDefaultClient(); + if (alias.toUpperCase() === defaultClient.alias) { + return defaultClient; + } + + const clientDetails = await getClientDetails(alias); + + if (!clientDetails.clientId || !clientDetails.clientSecret || !clientDetails.domain) { + throw new Error(`Missing configuration for SSO client: ${alias}`); + } + + return clientDetails; +} diff --git a/apps/organization/repositories/organization.repository.ts b/apps/organization/repositories/organization.repository.ts index 017c6816f..d5dab6222 100644 --- a/apps/organization/repositories/organization.repository.ts +++ b/apps/organization/repositories/organization.repository.ts @@ -682,7 +682,8 @@ export class OrganizationRepository { }, org_agents: { select: { - orgDid: true + orgDid: true, + tenantId: true } } }, diff --git a/apps/user/repositories/user.repository.ts b/apps/user/repositories/user.repository.ts index 1cc3efad2..2e21c4ec8 100644 --- a/apps/user/repositories/user.repository.ts +++ b/apps/user/repositories/user.repository.ts @@ -1,23 +1,24 @@ /* eslint-disable prefer-destructuring */ -import { Injectable, Logger, NotFoundException, InternalServerErrorException } from '@nestjs/common'; import { IOrgUsers, - PlatformSettings, - IShareUserCertificate, - UpdateUserProfile, ISendVerificationEmail, - IUsersProfile, + IShareUserCertificate, + IUserDeletedActivity, IUserInformation, + IUsersProfile, IVerifyUserEmail, - IUserDeletedActivity, + PlatformSettings, + UpdateUserProfile, UserKeycloakId, - UserRoleMapping, - UserRoleDetails + UserRoleDetails, + UserRoleMapping } from '../interfaces/user.interface'; -import { PrismaService } from '@credebl/prisma-service'; +import { Injectable, InternalServerErrorException, Logger, NotFoundException } from '@nestjs/common'; // eslint-disable-next-line camelcase -import { RecordType, schema, token, user, user_org_roles } from '@prisma/client'; +import { RecordType, client_aliases, schema, token, user, user_org_roles } from '@prisma/client'; + +import { PrismaService } from '@credebl/prisma-service'; import { UserRole } from '@credebl/enum/enum'; interface UserQueryOptions { @@ -34,6 +35,21 @@ export class UserRepository { private readonly logger: Logger ) {} + /** + * + * @returns Client alias and its url + */ + + // eslint-disable-next-line camelcase + async fetchClientAliases(): Promise { + try { + return this.prisma.client_aliases.findMany(); + } catch (error) { + this.logger.error(`checkUserExist: ${JSON.stringify(error)}`); + throw error; + } + } + /** * * @param userEmailVerification @@ -700,7 +716,14 @@ export class UserRepository { } } - async updateOrgDeletedActivity(orgId: string, userId: string, deletedBy: string, recordType: RecordType, userEmail: string, txnMetadata: object): Promise { + async updateOrgDeletedActivity( + orgId: string, + userId: string, + deletedBy: string, + recordType: RecordType, + userEmail: string, + txnMetadata: object + ): Promise { try { const orgDeletedActivity = await this.prisma.user_org_delete_activity.create({ data: { @@ -754,10 +777,12 @@ export class UserRepository { }); // Create a map for quick lookup of keycloakUserId, id, and email by email - const userMap = new Map(users.map(user => [user.email, { id: user.id, keycloakUserId: user.keycloakUserId, email: user.email }])); + const userMap = new Map( + users.map((user) => [user.email, { id: user.id, keycloakUserId: user.keycloakUserId, email: user.email }]) + ); // Collect the keycloakUserId, id, and email in the order of input emails - const result = userEmails.map(email => { + const result = userEmails.map((email) => { const user = userMap.get(email); return { id: user?.id || null, keycloakUserId: user?.keycloakUserId || null, email }; }); @@ -768,7 +793,7 @@ export class UserRepository { throw error; } } - + async storeUserRole(userId: string, userRoleId: string): Promise { try { const userRoleMapping = await this.prisma.user_role_mapping.create({ @@ -798,21 +823,19 @@ export class UserRepository { } } - // eslint-disable-next-line camelcase - async handleGetUserOrganizations(userId: string): Promise { - try { + // eslint-disable-next-line camelcase + async handleGetUserOrganizations(userId: string): Promise { + try { const getUserOrgs = await this.prisma.user_org_roles.findMany({ where: { userId } }); - + return getUserOrgs; } catch (error) { - this.logger.error( - `Error in handleGetUserOrganizations: ${error.message}` - ); + this.logger.error(`Error in handleGetUserOrganizations: ${error.message}`); throw error; } } -} \ No newline at end of file +} diff --git a/apps/user/src/user.controller.ts b/apps/user/src/user.controller.ts index 3616b2d92..580de2c4f 100644 --- a/apps/user/src/user.controller.ts +++ b/apps/user/src/user.controller.ts @@ -1,26 +1,58 @@ -import { IOrgUsers, Payload, ICheckUserDetails, PlatformSettings, UpdateUserProfile, IUsersProfile, IUserInformation, IUserSignIn, IUserResetPassword, IUserDeletedActivity, UserKeycloakId, IUserForgotPassword} from '../interfaces/user.interface'; +import { + ICheckUserDetails, + IOrgUsers, + IUserDeletedActivity, + IUserForgotPassword, + IUserInformation, + IUserResetPassword, + IUserSignIn, + IUsersProfile, + Payload, + PlatformSettings, + UpdateUserProfile, + UserKeycloakId +} from '../interfaces/user.interface'; +import { + IResetPasswordResponse, + ISendVerificationEmail, + ISignInUser, + ISignUpUserResponse, + IUserInvitations, + IVerifyUserEmail +} from '@credebl/common/interfaces/user.interface'; +// eslint-disable-next-line camelcase +import { client_aliases, user, user_org_roles } from '@prisma/client'; + import { AcceptRejectInvitationDto } from '../dtos/accept-reject-invitation.dto'; +import { AddPasskeyDetailsDto } from 'apps/api-gateway/src/user/dto/add-user.dto'; import { Controller } from '@nestjs/common'; +import { IUsersActivity } from 'libs/user-activity/interface'; import { MessagePattern } from '@nestjs/microservices'; 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 { ISendVerificationEmail, ISignInUser, IVerifyUserEmail, IUserInvitations, IResetPasswordResponse, ISignUpUserResponse } from '@credebl/common/interfaces/user.interface'; -import { AddPasskeyDetailsDto } from 'apps/api-gateway/src/user/dto/add-user.dto'; @Controller() export class UserController { - constructor(private readonly userService: UserService) { } + constructor(private readonly userService: UserService) {} + + /** + * Description: Fetch client aliases are its url + * @param email + * @returns Client alias and its url + */ + @MessagePattern({ cmd: 'get-client-alias-and-url' }) + // eslint-disable-next-line camelcase + async getClientAliases(): Promise { + return this.userService.getClientAliases(); + } /** * Description: Registers new user - * @param email + * @param email * @returns User's verification email sent status */ @MessagePattern({ cmd: 'send-verification-mail' }) - async sendVerificationMail(payload: { userEmailVerification: ISendVerificationEmail }): Promise { + async sendVerificationMail(payload: { userEmailVerification: ISendVerificationEmail }): Promise { return this.userService.sendVerificationMail(payload.userEmailVerification); } @@ -28,41 +60,41 @@ export class UserController { * Description: Verify user's email * @param email * @param verificationcode - * @returns User's email verification status + * @returns User's email verification status */ @MessagePattern({ cmd: 'user-email-verification' }) async verifyEmail(payload: { param: VerifyEmailTokenDto }): Promise { return this.userService.verifyEmail(payload.param); } - /** - * @body loginUserDto - * @returns User's access token details - */ + /** + * @body loginUserDto + * @returns User's access token details + */ @MessagePattern({ cmd: 'user-holder-login' }) async login(payload: IUserSignIn): Promise { - const loginRes = await this.userService.login(payload); - return loginRes; + const loginRes = await this.userService.login(payload); + return loginRes; } @MessagePattern({ cmd: 'refresh-token-details' }) async refreshTokenDetails(refreshToken: string): Promise { - return this.userService.refreshTokenDetails(refreshToken); + return this.userService.refreshTokenDetails(refreshToken); } @MessagePattern({ cmd: 'user-reset-password' }) async resetPassword(payload: IUserResetPassword): Promise { - return this.userService.resetPassword(payload); + return this.userService.resetPassword(payload); } @MessagePattern({ cmd: 'user-set-token-password' }) - async resetTokenPassword(payload: IUserResetPassword): Promise { + async resetTokenPassword(payload: IUserResetPassword): Promise { return this.userService.resetTokenPassword(payload); } @MessagePattern({ cmd: 'user-forgot-password' }) async forgotPassword(payload: IUserForgotPassword): Promise { - return this.userService.forgotPassword(payload); + return this.userService.forgotPassword(payload); } @MessagePattern({ cmd: 'get-user-profile' }) @@ -74,7 +106,7 @@ export class UserController { async getPublicProfile(payload: { username }): Promise { return this.userService.getPublicProfile(payload); } - /** + /** * @returns User details */ @MessagePattern({ cmd: 'update-user-profile' }) @@ -106,10 +138,10 @@ export class UserController { * @returns Organization invitation data */ @MessagePattern({ cmd: 'get-org-invitations' }) - async invitations(payload: { id; status; pageNumber; pageSize; search; }): Promise { - return this.userService.invitations(payload); + async invitations(payload: { id; status; pageNumber; pageSize; search }): Promise { + return this.userService.invitations(payload); } - + /** * * @param payload @@ -129,32 +161,32 @@ export class UserController { * @returns organization users list */ @MessagePattern({ cmd: 'fetch-organization-user' }) - async getOrganizationUsers(payload: {orgId:string} & Payload): Promise { + async getOrganizationUsers(payload: { orgId: string } & Payload): Promise { return this.userService.getOrgUsers(payload.orgId, payload.pageNumber, payload.pageSize, payload.search); } /** - * @param payload - * @returns organization users list - */ + * @param payload + * @returns organization users list + */ @MessagePattern({ cmd: 'fetch-users' }) - async get(payload: { pageNumber: number, pageSize: number, search: string }): Promise { + async get(payload: { pageNumber: number; pageSize: number; search: string }): Promise { const users = this.userService.get(payload.pageNumber, payload.pageSize, payload.search); return users; } - - /** - * @param email - * @returns User's email exist status - * */ + + /** + * @param email + * @returns User's email exist status + * */ @MessagePattern({ cmd: 'check-user-exist' }) async checkUserExist(payload: { userEmail: string }): Promise { return this.userService.checkUserExist(payload.userEmail); } /** - * @body userInfo - * @returns User's registration status - */ + * @body userInfo + * @returns User's registration status + */ @MessagePattern({ cmd: 'add-user' }) async addUserDetailsInKeyCloak(payload: { userInfo: IUserInformation }): Promise { return this.userService.createUserForToken(payload.userInfo); @@ -162,15 +194,15 @@ export class UserController { // Fetch Users recent activities @MessagePattern({ cmd: 'get-user-activity' }) - async getUserActivity(payload: { userId: string, limit: number }): Promise { + async getUserActivity(payload: { userId: string; limit: number }): Promise { return this.userService.getUserActivity(payload.userId, payload.limit); } @MessagePattern({ cmd: 'add-passkey' }) - async addPasskey(payload: { userEmail: string, userInfo: AddPasskeyDetailsDto }): Promise { + async addPasskey(payload: { userEmail: string; userInfo: AddPasskeyDetailsDto }): Promise { return this.userService.addPasskey(payload.userEmail, payload.userInfo); } - /** + /** * @returns platform settings updated status */ @MessagePattern({ cmd: 'update-platform-settings' }) @@ -186,8 +218,22 @@ export class UserController { } @MessagePattern({ cmd: 'org-deleted-activity' }) - async updateOrgDeletedActivity(payload: { orgId, userId, deletedBy, recordType, userEmail, txnMetadata }): Promise { - return this.userService.updateOrgDeletedActivity(payload.orgId, payload.userId, payload.deletedBy, payload.recordType, payload.userEmail, payload.txnMetadata); + async updateOrgDeletedActivity(payload: { + orgId; + userId; + deletedBy; + recordType; + userEmail; + txnMetadata; + }): Promise { + return this.userService.updateOrgDeletedActivity( + payload.orgId, + payload.userId, + payload.deletedBy, + payload.recordType, + payload.userEmail, + payload.txnMetadata + ); } @MessagePattern({ cmd: 'get-user-details-by-userId' }) @@ -202,13 +248,13 @@ export class UserController { } @MessagePattern({ cmd: 'get-user-info-by-user-email-keycloak' }) - async getUserByUserIdInKeycloak(payload: {email}): Promise { + async getUserByUserIdInKeycloak(payload: { email }): Promise { return this.userService.getUserByUserIdInKeycloak(payload.email); } @MessagePattern({ cmd: 'get-user-organizations' }) // eslint-disable-next-line camelcase - async getuserOrganizationByUserId(payload: {userId: string}): Promise { + async getuserOrganizationByUserId(payload: { userId: string }): Promise { return this.userService.getuserOrganizationByUserId(payload.userId); } -} \ No newline at end of file +} diff --git a/apps/user/src/user.service.ts b/apps/user/src/user.service.ts index aec67200e..e102079de 100644 --- a/apps/user/src/user.service.ts +++ b/apps/user/src/user.service.ts @@ -11,7 +11,6 @@ import { HttpException } from '@nestjs/common'; - import { ClientRegistrationService } from '@credebl/client-registration'; import { CommonService } from '@credebl/common'; import { EmailDto } from '@credebl/common/dtos/email.dto'; @@ -27,20 +26,20 @@ import { UserRepository } from '../repositories/user.repository'; import { VerifyEmailTokenDto } from '../dtos/verify-email.dto'; import { sendEmail } from '@credebl/common/send-grid-helper-file'; // eslint-disable-next-line camelcase -import { RecordType, user, user_org_roles } from '@prisma/client'; +import { client_aliases, RecordType, user, user_org_roles } from '@prisma/client'; import { ICheckUserDetails, OrgInvitations, PlatformSettings, IOrgUsers, UpdateUserProfile, - IUserInformation, - IUsersProfile, - IUserResetPassword, - IUserDeletedActivity, - UserKeycloakId, - IEcosystemConfig, - IUserForgotPassword + IUserInformation, + IUsersProfile, + IUserResetPassword, + IUserDeletedActivity, + UserKeycloakId, + IEcosystemConfig, + IUserForgotPassword } from '../interfaces/user.interface'; import { AcceptRejectInvitationDto } from '../dtos/accept-reject-invitation.dto'; import { UserActivityService } from '@credebl/user-activity'; @@ -52,12 +51,20 @@ 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 { ISendVerificationEmail, ISignInUser, IVerifyUserEmail, IUserInvitations, IResetPasswordResponse, ISignUpUserResponse } from '@credebl/common/interfaces/user.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 * as jwt from 'jsonwebtoken'; import { NATSClient } from '@credebl/common/NATSClient'; +import { getCredentialsByAlias } from 'apps/api-gateway/src/user/utils'; @Injectable() export class UserService { @@ -74,9 +81,25 @@ export class UserService { private readonly userDevicesRepository: UserDevicesRepository, private readonly logger: Logger, @Inject('NATS_CLIENT') private readonly userServiceProxy: ClientProxy, - private readonly natsClient : NATSClient + private readonly natsClient: NATSClient ) {} + /** + * + * @returns client alias and its url + */ + + // eslint-disable-next-line camelcase + async getClientAliases(): Promise { + try { + const clientAliases = await this.userRepository.fetchClientAliases(); + return clientAliases; + } catch (error) { + this.logger.error(`In Create User : ${JSON.stringify(error)}`); + throw new RpcException(error.response ? error.response : error); + } + } + /** * * @param userEmailVerification @@ -85,8 +108,8 @@ export class UserService { async sendVerificationMail(userEmailVerification: ISendVerificationEmail): Promise { try { - const { email, brandLogoUrl, platformName, clientId, clientSecret } = userEmailVerification; - + const { email, brandLogoUrl, platformName, clientAlias } = userEmailVerification; + if ('PROD' === process.env.PLATFORM_PROFILE_MODE) { // eslint-disable-next-line prefer-destructuring const domain = email.split('@')[1]; @@ -94,9 +117,9 @@ export class UserService { throw new BadRequestException(ResponseMessages.user.error.InvalidEmailDomain); } } - + const userDetails = await this.userRepository.checkUserExist(email); - + if (userDetails) { if (userDetails.isEmailVerified) { throw new ConflictException(ResponseMessages.user.error.exists); @@ -104,34 +127,47 @@ export class UserService { throw new ConflictException(ResponseMessages.user.error.verificationAlreadySent); } } - + const verifyCode = uuidv4(); let sendVerificationMail: boolean; - try { + const clientDetails = await getCredentialsByAlias(clientAlias); - const token = await this.clientRegistrationService.getManagementToken(clientId, clientSecret); - const getClientData = await this.clientRegistrationService.getClientRedirectUrl(clientId, token); + try { + const token = await this.clientRegistrationService.getManagementToken( + clientDetails.clientId, + clientDetails.clientSecret + ); + const getClientData = await this.clientRegistrationService.getClientRedirectUrl(clientDetails.clientId, token); const [redirectUrl] = getClientData[0]?.redirectUris || []; - + if (!redirectUrl) { throw new NotFoundException(ResponseMessages.user.error.redirectUrlNotFound); } - - sendVerificationMail = await this.sendEmailForVerification(email, verifyCode, redirectUrl, clientId, brandLogoUrl, platformName); + + sendVerificationMail = await this.sendEmailForVerification( + email, + verifyCode, + redirectUrl, + clientDetails.clientId, + brandLogoUrl, + platformName, + clientDetails.domain, + clientAlias + ); } catch (error) { throw new InternalServerErrorException(ResponseMessages.user.error.emailSend); } - + if (sendVerificationMail) { const uniqueUsername = await this.createUsername(email, verifyCode); userEmailVerification.username = uniqueUsername; - userEmailVerification.clientId = clientId; - userEmailVerification.clientSecret = clientSecret; + userEmailVerification.clientId = clientDetails.clientId; + userEmailVerification.clientSecret = clientDetails.clientSecret; const resUser = await this.userRepository.createUser(userEmailVerification, verifyCode); return resUser; - } + } } catch (error) { this.logger.error(`In Create User : ${JSON.stringify(error)}`); throw new RpcException(error.response ? error.response : error); @@ -168,11 +204,20 @@ export class UserService { * @returns */ - async sendEmailForVerification(email: string, verificationCode: string, redirectUrl: string, clientId: string, brandLogoUrl:string, platformName: string): Promise { + async sendEmailForVerification( + email: string, + verificationCode: string, + redirectUrl: string, + clientId: string, + brandLogoUrl: string, + platformName: string, + redirectTo?: string, + clientAlias?: string + ): Promise { try { const platformConfigData = await this.prisma.platform_config.findMany(); - const decryptClientId = await this.commonService.decryptPassword(clientId); + const decryptedClientId = await this.commonService.decryptPassword(clientId); const urlEmailTemplate = new URLUserEmailTemplate(); const emailData = new EmailDto(); emailData.emailFrom = platformConfigData[0].emailFrom; @@ -180,7 +225,16 @@ export class UserService { const platform = platformName || process.env.PLATFORM_NAME; emailData.emailSubject = `[${platform}] Verify your email to activate your account`; - emailData.emailHtml = await urlEmailTemplate.getUserURLTemplate(email, verificationCode, redirectUrl, decryptClientId, brandLogoUrl, platformName); + emailData.emailHtml = await urlEmailTemplate.getUserURLTemplate( + email, + verificationCode, + redirectUrl, + decryptedClientId, + brandLogoUrl, + platformName, + redirectTo, + clientAlias + ); const isEmailSent = await sendEmail(emailData); if (isEmailSent) { return isEmailSent; @@ -252,9 +306,12 @@ export class UserService { if (!userDetails) { throw new NotFoundException(ResponseMessages.user.error.adduser); } - let keycloakDetails = null; - - const token = await this.clientRegistrationService.getManagementToken(checkUserDetails.clientId, checkUserDetails.clientSecret); + let keycloakDetails = null; + + const token = await this.clientRegistrationService.getManagementToken( + checkUserDetails.clientId, + checkUserDetails.clientSecret + ); if (userInfo.isPasskey) { const resUser = await this.userRepository.addUserPassword(email.toLowerCase(), userInfo.password); const userDetails = await this.userRepository.getUserDetails(email.toLowerCase()); @@ -265,8 +322,12 @@ export class UserService { } userInfo.password = decryptedPassword; - try { - keycloakDetails = await this.clientRegistrationService.createUser(userInfo, process.env.KEYCLOAK_REALM, token); + try { + keycloakDetails = await this.clientRegistrationService.createUser( + userInfo, + process.env.KEYCLOAK_REALM, + token + ); } catch (error) { throw new InternalServerErrorException('Error while registering user on keycloak'); } @@ -275,16 +336,18 @@ export class UserService { userInfo.password = decryptedPassword; - try { - keycloakDetails = await this.clientRegistrationService.createUser(userInfo, process.env.KEYCLOAK_REALM, token); + try { + keycloakDetails = await this.clientRegistrationService.createUser( + userInfo, + process.env.KEYCLOAK_REALM, + token + ); } catch (error) { throw new InternalServerErrorException('Error while registering user on keycloak'); } } - await this.userRepository.updateUserDetails(userDetails.id, - keycloakDetails.keycloakUserId.toString() - ); + await this.userRepository.updateUserDetails(userDetails.id, keycloakDetails.keycloakUserId.toString()); if (userInfo?.isHolder) { const getUserRole = await this.userRepository.getUserRole(UserRole.HOLDER); @@ -296,9 +359,9 @@ export class UserService { } const realmRoles = await this.clientRegistrationService.getAllRealmRoles(token); - - const holderRole = realmRoles.filter(role => role.name === OrgRoles.HOLDER); - const holderRoleData = 0 < holderRole.length && holderRole[0]; + + const holderRole = realmRoles.filter((role) => role.name === OrgRoles.HOLDER); + const holderRoleData = 0 < holderRole.length && holderRole[0]; const payload = [ { @@ -307,7 +370,11 @@ export class UserService { } ]; - await this.clientRegistrationService.createUserHolderRole(token, keycloakDetails.keycloakUserId.toString(), payload); + await this.clientRegistrationService.createUserHolderRole( + token, + keycloakDetails.keycloakUserId.toString(), + payload + ); const holderOrgRole = await this.orgRoleService.getRole(OrgRoles.HOLDER); await this.userOrgRoleService.createUserOrgRole(userDetails.id, holderOrgRole.id, null, holderRoleData.id); @@ -368,7 +435,6 @@ export class UserService { const { email, password, isPasskey } = loginUserDto; try { - this.validateEmail(email.toLowerCase()); const userData = await this.userRepository.checkUserExist(email.toLowerCase()); if (!userData) { @@ -388,9 +454,8 @@ export class UserService { const decryptedPassword = await this.commonService.decryptPassword(getUserDetails.password); return await this.generateToken(email.toLowerCase(), decryptedPassword, userData); } else { - const decryptedPassword = await this.commonService.decryptPassword(password); - return await this.generateToken(email.toLowerCase(), decryptedPassword, userData); + return await this.generateToken(email.toLowerCase(), decryptedPassword, userData); } } catch (error) { this.logger.error(`In Login User : ${JSON.stringify(error)}`); @@ -399,21 +464,22 @@ export class UserService { } async refreshTokenDetails(refreshToken: string): Promise { - try { - try { - const data = jwt.decode(refreshToken) as jwt.JwtPayload; - const userByKeycloakId = await this.userRepository.getUserByKeycloakId(data?.sub); - const tokenResponse = await this.clientRegistrationService.getAccessToken(refreshToken, userByKeycloakId?.['clientId'], userByKeycloakId?.['clientSecret']); - return tokenResponse; - } catch (error) { - throw new BadRequestException(ResponseMessages.user.error.invalidRefreshToken); - } - + try { + const data = jwt.decode(refreshToken) as jwt.JwtPayload; + const userByKeycloakId = await this.userRepository.getUserByKeycloakId(data?.sub); + const tokenResponse = await this.clientRegistrationService.getAccessToken( + refreshToken, + userByKeycloakId?.['clientId'], + userByKeycloakId?.['clientSecret'] + ); + return tokenResponse; + } catch (error) { + throw new BadRequestException(ResponseMessages.user.error.invalidRefreshToken); + } } catch (error) { this.logger.error(`In refreshTokenDetails : ${JSON.stringify(error)}`); throw new RpcException(error.response ? error.response : error); - } } @@ -426,8 +492,8 @@ export class UserService { /** * Forgot password - * @param forgotPasswordDto - * @returns + * @param forgotPasswordDto + * @returns */ async forgotPassword(forgotPasswordDto: IUserForgotPassword): Promise { const { email, brandLogoUrl, platformName, endpoint } = forgotPasswordDto; @@ -445,7 +511,7 @@ export class UserService { const token = uuidv4(); const expirationTime = new Date(); expirationTime.setHours(expirationTime.getHours() + 1); // Set expiration time to 1 hour from now - + const tokenCreated = await this.userRepository.createTokenForResetPassword(userData.id, token, expirationTime); if (!tokenCreated) { @@ -462,7 +528,6 @@ export class UserService { id: tokenCreated.id, email: userData.email }; - } catch (error) { this.logger.error(`Error In forgotPassword : ${JSON.stringify(error)}`); throw new RpcException(error.response ? error.response : error); @@ -471,11 +536,17 @@ export class UserService { /** * Send email for token verification of reset password - * @param email - * @param verificationCode - * @returns + * @param email + * @param verificationCode + * @returns */ - async sendEmailForResetPassword(email: string, brandLogoUrl: string, platformName: string, endpoint: string, verificationCode: string): Promise { + async sendEmailForResetPassword( + email: string, + brandLogoUrl: string, + platformName: string, + endpoint: string, + verificationCode: string + ): Promise { try { const platformConfigData = await this.prisma.platform_config.findMany(); @@ -487,7 +558,13 @@ export class UserService { const platform = platformName || process.env.PLATFORM_NAME; emailData.emailSubject = `[${platform}] Important: Password Reset Request`; - emailData.emailHtml = await urlEmailTemplate.getUserResetPasswordTemplate(email, platform, brandLogoUrl, endpoint, verificationCode); + emailData.emailHtml = await urlEmailTemplate.getUserResetPasswordTemplate( + email, + platform, + brandLogoUrl, + endpoint, + verificationCode + ); const isEmailSent = await sendEmail(emailData); if (isEmailSent) { return isEmailSent; @@ -502,11 +579,10 @@ export class UserService { /** * Create reset password token - * @param resetPasswordDto + * @param resetPasswordDto * @returns user details */ async resetTokenPassword(resetPasswordDto: IUserResetPassword): Promise { - const { email, password, token } = resetPasswordDto; try { @@ -519,30 +595,32 @@ export class UserService { if (userData && !userData.isEmailVerified) { throw new BadRequestException(ResponseMessages.user.error.verifyMail); } - + const tokenDetails = await this.userRepository.getResetPasswordTokenDetails(userData.id, token); - if (!tokenDetails || (new Date() > tokenDetails.expiresAt)) { + if (!tokenDetails || new Date() > tokenDetails.expiresAt) { throw new BadRequestException(ResponseMessages.user.error.invalidResetLink); } const decryptedPassword = await this.commonService.decryptPassword(password); - try { - - - const authToken = await this.clientRegistrationService.getManagementToken(userData.clientId, userData.clientSecret); + try { + const authToken = await this.clientRegistrationService.getManagementToken( + userData.clientId, + userData.clientSecret + ); userData.password = decryptedPassword; if (userData.keycloakUserId) { await this.clientRegistrationService.resetPasswordOfUser(userData, process.env.KEYCLOAK_REALM, authToken); - } else { - const keycloakDetails = await this.clientRegistrationService.createUser(userData, process.env.KEYCLOAK_REALM, authToken); - await this.userRepository.updateUserDetails(userData.id, - keycloakDetails.keycloakUserId.toString() + } else { + const keycloakDetails = await this.clientRegistrationService.createUser( + userData, + process.env.KEYCLOAK_REALM, + authToken ); + await this.userRepository.updateUserDetails(userData.id, keycloakDetails.keycloakUserId.toString()); } await this.updateFidoVerifiedUser(email.toLowerCase(), userData.isFidoVerified, password); - } catch (error) { this.logger.error(`Error reseting the password`, error); throw new InternalServerErrorException('Error while reseting user password'); @@ -554,7 +632,6 @@ export class UserService { id: userData.id, email: userData.email }; - } catch (error) { this.logger.error(`Error In resetTokenPassword : ${JSON.stringify(error)}`); throw new RpcException(error.response ? error.response : error); @@ -563,7 +640,6 @@ export class UserService { findUserByUserId(id: string): Promise { return this.userRepository.getUserById(id); - } async resetPassword(resetPasswordDto: IUserResetPassword): Promise { @@ -588,23 +664,30 @@ export class UserService { } const tokenResponse = await this.generateToken(email.toLowerCase(), oldDecryptedPassword, userData); - + if (tokenResponse) { userData.password = newDecryptedPassword; - try { - let keycloakDetails = null; - const token = await this.clientRegistrationService.getManagementToken(userData.clientId, userData.clientSecret); + try { + let keycloakDetails = null; + const token = await this.clientRegistrationService.getManagementToken( + userData.clientId, + userData.clientSecret + ); if (userData.keycloakUserId) { - - keycloakDetails = await this.clientRegistrationService.resetPasswordOfUser(userData, process.env.KEYCLOAK_REALM, token); + keycloakDetails = await this.clientRegistrationService.resetPasswordOfUser( + userData, + process.env.KEYCLOAK_REALM, + token + ); await this.updateFidoVerifiedUser(email.toLowerCase(), userData.isFidoVerified, newPassword); - } else { - keycloakDetails = await this.clientRegistrationService.createUser(userData, process.env.KEYCLOAK_REALM, token); - await this.userRepository.updateUserDetails(userData.id, - keycloakDetails.keycloakUserId.toString() + keycloakDetails = await this.clientRegistrationService.createUser( + userData, + process.env.KEYCLOAK_REALM, + token ); + await this.userRepository.updateUserDetails(userData.id, keycloakDetails.keycloakUserId.toString()); await this.updateFidoVerifiedUser(email.toLowerCase(), userData.isFidoVerified, newPassword); } @@ -612,14 +695,12 @@ export class UserService { id: userData.id, email: userData.email }; - } catch (error) { throw new InternalServerErrorException('Error while registering user on keycloak'); } } else { throw new BadRequestException(ResponseMessages.user.error.invalidCredentials); } - } catch (error) { this.logger.error(`In Login User : ${JSON.stringify(error)}`); throw new RpcException(error.response ? error.response : error); @@ -627,44 +708,46 @@ export class UserService { } async generateToken(email: string, password: string, userData: user): Promise { - - if (userData.keycloakUserId) { - - try { - const tokenResponse = await this.clientRegistrationService.getUserToken(email, password, userData.clientId, userData.clientSecret); - tokenResponse.isRegisteredToSupabase = false; - return tokenResponse; - } catch (error) { - throw new UnauthorizedException(ResponseMessages.user.error.invalidCredentials); - } - - } else { - const supaInstance = await this.supabaseService.getClient(); - const { data, error } = await supaInstance.auth.signInWithPassword({ + if (userData.keycloakUserId) { + try { + const tokenResponse = await this.clientRegistrationService.getUserToken( email, - password - }); - - this.logger.error(`Supa Login Error::`, JSON.stringify(error)); - - if (error) { - throw new BadRequestException(error?.message); - } - - const token = data?.session; + password, + userData.clientId, + userData.clientSecret + ); + tokenResponse.isRegisteredToSupabase = false; + return tokenResponse; + } catch (error) { + throw new UnauthorizedException(ResponseMessages.user.error.invalidCredentials); + } + } else { + const supaInstance = await this.supabaseService.getClient(); + const { data, error } = await supaInstance.auth.signInWithPassword({ + email, + password + }); - return { - // eslint-disable-next-line camelcase - access_token: token.access_token, - // eslint-disable-next-line camelcase - token_type: token.token_type, - // eslint-disable-next-line camelcase - expires_in: token.expires_in, - // eslint-disable-next-line camelcase - expires_at: token.expires_at, - isRegisteredToSupabase: true - }; + this.logger.error(`Supa Login Error::`, JSON.stringify(error)); + + if (error) { + throw new BadRequestException(error?.message); } + + const token = data?.session; + + return { + // eslint-disable-next-line camelcase + access_token: token.access_token, + // eslint-disable-next-line camelcase + token_type: token.token_type, + // eslint-disable-next-line camelcase + expires_in: token.expires_in, + // eslint-disable-next-line camelcase + expires_at: token.expires_at, + isRegisteredToSupabase: true + }; + } } async getProfile(payload: { id }): Promise { @@ -677,7 +760,7 @@ export class UserService { userData[setting.key] = 'true' === setting.value; } } - + return userData; } catch (error) { this.logger.error(`get user: ${JSON.stringify(error)}`); @@ -685,9 +768,9 @@ export class UserService { } } - async _getEcosystemConfig(): Promise { + async _getEcosystemConfig(): Promise { const pattern = { cmd: 'get-ecosystem-config-details' }; - const payload = { }; + const payload = {}; const getEcosystemConfigDetails = await this.userServiceProxy .send(pattern, payload) @@ -779,13 +862,12 @@ export class UserService { payload.pageNumber, payload.pageSize, payload.search - ); - - const invitations: OrgInvitations[] = await this.updateOrgInvitations(invitationsData['invitations']); - invitationsData['invitations'] = invitations; + ); + + const invitations: OrgInvitations[] = await this.updateOrgInvitations(invitationsData['invitations']); + invitationsData['invitations'] = invitations; return invitationsData; - } catch (error) { this.logger.error(`Error in get invitations: ${JSON.stringify(error)}`); throw new RpcException(error.response ? error.response : error); @@ -810,7 +892,7 @@ export class UserService { const invitationsData = await this.natsClient .send(this.userServiceProxy, pattern, payload) - + .catch((error) => { this.logger.error(`catch: ${JSON.stringify(error)}`); throw new HttpException( @@ -826,8 +908,6 @@ export class UserService { } async updateOrgInvitations(invitations: OrgInvitations[]): Promise { - - const updatedInvitations = []; for (const invitation of invitations) { @@ -854,17 +934,20 @@ export class UserService { * @param userId * @returns Organization invitation status */ - async acceptRejectInvitations(acceptRejectInvitation: AcceptRejectInvitationDto, userId: string): Promise { + async acceptRejectInvitations( + acceptRejectInvitation: AcceptRejectInvitationDto, + userId: string + ): Promise { try { const userData = await this.userRepository.getUserById(userId); - + if (Invitation.ACCEPTED === acceptRejectInvitation.status) { - const payload = {userId}; + const payload = { userId }; const TotalOrgs = await this._getTotalOrgCount(payload); - + if (TotalOrgs >= toNumber(`${process.env.MAX_ORG_LIMIT}`)) { - throw new BadRequestException(ResponseMessages.user.error.userOrgsLimit); - } + throw new BadRequestException(ResponseMessages.user.error.userOrgsLimit); + } } return this.fetchInvitationsStatus(acceptRejectInvitation, userData.keycloakUserId, userData.email, userId); } catch (error) { @@ -873,12 +956,12 @@ export class UserService { } } - async _getTotalOrgCount(payload): Promise { + async _getTotalOrgCount(payload): Promise { const pattern = { cmd: 'get-organizations-count' }; const getOrganizationCount = await this.natsClient .send(this.userServiceProxy, pattern, payload) - + .catch((error) => { this.logger.error(`catch: ${JSON.stringify(error)}`); throw new HttpException( @@ -915,7 +998,7 @@ export class UserService { const invitationsData = await this.natsClient .send(this.userServiceProxy, pattern, payload) - + .catch((error) => { this.logger.error(`catch: ${JSON.stringify(error)}`); throw new HttpException( @@ -942,7 +1025,6 @@ export class UserService { */ async getOrgUsers(orgId: string, pageNumber: number, pageSize: number, search: string): Promise { try { - const query = { userOrgRoles: { some: { orgId } @@ -990,16 +1072,15 @@ export class UserService { async checkUserExist(email: string): Promise { try { const userDetails = await this.userRepository.checkUniqueUserExist(email.toLowerCase()); - let userVerificationDetails; + let userVerificationDetails; if (userDetails) { userVerificationDetails = { isEmailVerified: userDetails.isEmailVerified, isFidoVerified: userDetails.isFidoVerified, isRegistrationCompleted: null !== userDetails.keycloakUserId && undefined !== userDetails.keycloakUserId, - message:'', + message: '', userId: userDetails.id }; - } if (userDetails && !userDetails.isEmailVerified) { userVerificationDetails.message = ResponseMessages.user.error.verificationAlreadySent; @@ -1011,11 +1092,11 @@ export class UserService { userVerificationDetails.message = ResponseMessages.user.error.exists; return userVerificationDetails; } else if (null === userDetails) { - return { + return { isRegistrationCompleted: false, - isEmailVerified: false, - userId:null, - message: ResponseMessages.user.error.notFound + isEmailVerified: false, + userId: null, + message: ResponseMessages.user.error.notFound }; } else { return userVerificationDetails; @@ -1069,9 +1150,23 @@ export class UserService { } } - async updateOrgDeletedActivity(orgId: string, userId: string, deletedBy: string, recordType: RecordType, userEmail: string, txnMetadata: object): Promise { + async updateOrgDeletedActivity( + orgId: string, + userId: string, + deletedBy: string, + recordType: RecordType, + userEmail: string, + txnMetadata: object + ): Promise { try { - return await this.userRepository.updateOrgDeletedActivity(orgId, userId, deletedBy, recordType, userEmail, txnMetadata); + return await this.userRepository.updateOrgDeletedActivity( + orgId, + userId, + deletedBy, + recordType, + userEmail, + txnMetadata + ); } catch (error) { this.logger.error(`In updateOrgDeletedActivity : ${JSON.stringify(error)}`); throw error; @@ -1091,7 +1186,6 @@ export class UserService { async getUserKeycloakIdByEmail(userEmails: string[]): Promise { try { - const getkeycloakUserIds = await this.userRepository.getUserKeycloak(userEmails); return getkeycloakUserIds; } catch (error) { @@ -1102,7 +1196,6 @@ export class UserService { async getUserByUserIdInKeycloak(email: string): Promise { try { - const userData = await this.userRepository.checkUserExist(email.toLowerCase()); if (!userData) { @@ -1119,19 +1212,19 @@ export class UserService { } } - // eslint-disable-next-line camelcase - async getuserOrganizationByUserId(userId: string): Promise { + // eslint-disable-next-line camelcase + async getuserOrganizationByUserId(userId: string): Promise { try { - const getOrganizationDetails = await this.userRepository.handleGetUserOrganizations(userId); + const getOrganizationDetails = await this.userRepository.handleGetUserOrganizations(userId); - if (!getOrganizationDetails) { - throw new NotFoundException(ResponseMessages.ledger.error.NotFound); - } + if (!getOrganizationDetails) { + throw new NotFoundException(ResponseMessages.ledger.error.NotFound); + } - return getOrganizationDetails; + return getOrganizationDetails; } catch (error) { - this.logger.error(`Error in getuserOrganizationByUserId: ${error}`); - throw new RpcException(error.response ? error.response : error); + this.logger.error(`Error in getuserOrganizationByUserId: ${error}`); + throw new RpcException(error.response ? error.response : error); } + } } -} \ No newline at end of file diff --git a/apps/user/templates/user-email-template.ts b/apps/user/templates/user-email-template.ts index 31cfbcdab..21318eb85 100644 --- a/apps/user/templates/user-email-template.ts +++ b/apps/user/templates/user-email-template.ts @@ -1,14 +1,28 @@ export class URLUserEmailTemplate { - public getUserURLTemplate(email: string, verificationCode: string, redirectUrl: string, clientId: string, brandLogoUrl:string, platformName:string): string { - - const apiUrl = new URL( - clientId === process.env.KEYCLOAK_MANAGEMENT_CLIENT_ID ? '/verify-email-success' : '', - redirectUrl - ); + public getUserURLTemplate( + email: string, + verificationCode: string, + redirectUrl: string, + clientId: string, + brandLogoUrl: string, + platformName: string, + redirectTo?: string, + clientAlias?: string + ): string { + const baseDomain = `${process.env.FRONT_END_URL}`; + const apiUrl = new URL('/verify-email-success', baseDomain); apiUrl.searchParams.append('verificationCode', verificationCode); apiUrl.searchParams.append('email', encodeURIComponent(email)); + if (redirectTo) { + apiUrl.searchParams.append('redirectTo', redirectTo); + } + + if (clientAlias) { + apiUrl.searchParams.append('clientAlias', clientAlias); + } + const validUrl = apiUrl.href; const logoUrl = brandLogoUrl || process.env.BRAND_LOGO; @@ -64,6 +78,8 @@ export class URLUserEmailTemplate { `; - } catch (error) {} + } catch (error) { + throw new Error('Error creating email verification template'); + } } } diff --git a/docker-compose.yml b/docker-compose.yml index 854b63eb3..95aee4d67 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -61,6 +61,7 @@ services: issuance: depends_on: - nats # Use depends_on instead of needs + - redis - api-gateway - user - connection diff --git a/libs/common/src/cast.helper.ts b/libs/common/src/cast.helper.ts index a425f7dbf..315e74377 100644 --- a/libs/common/src/cast.helper.ts +++ b/libs/common/src/cast.helper.ts @@ -1,4 +1,6 @@ -import { BadRequestException, PipeTransform } from '@nestjs/common'; +import * as CryptoJS from 'crypto-js'; + +import { BadRequestException, Logger, PipeTransform } from '@nestjs/common'; import { DidMethod, JSONSchemaType, @@ -23,6 +25,7 @@ import { ISchemaFields } from './interfaces/schema.interface'; import { ResponseMessages } from './response-messages'; import { plainToClass } from 'class-transformer'; +const logger = new Logger(); interface ToNumberOptions { default?: number; min?: number; @@ -436,6 +439,22 @@ export function validateAndUpdateIssuanceDates(data: ICredentialData[]): ICreden }); } +export const encryptClientCredential = async (clientCredential: string): Promise => { + try { + const encryptedToken = CryptoJS.AES.encrypt( + JSON.stringify(clientCredential), + process.env.CRYPTO_PRIVATE_KEY + ).toString(); + + logger.debug('Client credentials encrypted successfully'); + + return encryptedToken; + } catch (error) { + logger.error('An error occurred during encryptClientCredential:', error); + throw error; + } +}; + export function ValidateNestedStructureFields(validationOptions?: ValidationOptions) { return function (object: object, propertyName: string): void { registerDecorator({ diff --git a/libs/common/src/common.module.ts b/libs/common/src/common.module.ts index 2b7967c30..e2a537a30 100644 --- a/libs/common/src/common.module.ts +++ b/libs/common/src/common.module.ts @@ -1,11 +1,12 @@ -import { HttpModule } from '@nestjs/axios'; -import { Module } from '@nestjs/common'; +import { Logger, Module } from '@nestjs/common'; import { CommonService } from './common.service'; +import { HttpModule } from '@nestjs/axios'; +import { LoggerModule } from '@credebl/logger/logger.module'; @Module({ - imports: [HttpModule], - providers: [CommonService], + imports: [HttpModule, LoggerModule], + providers: [CommonService, Logger], exports: [CommonService] }) export class CommonModule {} diff --git a/libs/common/src/interfaces/user.interface.ts b/libs/common/src/interfaces/user.interface.ts index 998be0e70..900a1a843 100644 --- a/libs/common/src/interfaces/user.interface.ts +++ b/libs/common/src/interfaces/user.interface.ts @@ -1,53 +1,69 @@ 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; + redirectTo?: string; + clientAlias?: string; +} + +export interface IClientDetailsSSO { + alias: string; + domain: string; + clientId: string; + clientSecret: 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; +} export interface ISignUpUserResponse { - userId: string -} \ No newline at end of file + userId: string; +} + +export interface IClientAliases { + id: string; + createDateTime: string; + lastChangedDateTime: string; + clientAlias: string; + clientUrl: string; +} diff --git a/libs/common/src/response-messages/index.ts b/libs/common/src/response-messages/index.ts index 3a2457f08..44f049c21 100644 --- a/libs/common/src/response-messages/index.ts +++ b/libs/common/src/response-messages/index.ts @@ -4,6 +4,7 @@ export const ResponseMessages = { create: 'User registered successfully', update: 'User details updated successfully', emaiVerified: 'Email verified successfully', + fetchClientAliases: 'Client aliases fetched successfully', login: 'User login successfully', fetchProfile: 'User fetched successfully', fetchInvitations: 'Org invitations fetched successfully', diff --git a/libs/prisma-service/prisma/migrations/20250701025741_added_client_alias/migration.sql b/libs/prisma-service/prisma/migrations/20250701025741_added_client_alias/migration.sql new file mode 100644 index 000000000..998dfa1a6 --- /dev/null +++ b/libs/prisma-service/prisma/migrations/20250701025741_added_client_alias/migration.sql @@ -0,0 +1,10 @@ +-- CreateTable +CREATE TABLE "client_aliases" ( + "id" UUID NOT NULL, + "createDateTime" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "lastChangedDateTime" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "clientAlias" TEXT, + "clientUrl" TEXT NOT NULL, + + CONSTRAINT "client_aliases_pkey" PRIMARY KEY ("id") +); diff --git a/libs/prisma-service/prisma/schema.prisma b/libs/prisma-service/prisma/schema.prisma index f5c842b4a..89fee4629 100644 --- a/libs/prisma-service/prisma/schema.prisma +++ b/libs/prisma-service/prisma/schema.prisma @@ -519,4 +519,12 @@ model cloud_wallet_user_info { enum CloudWalletType { CLOUD_BASE_WALLET CLOUD_SUB_WALLET +} + +model client_aliases { + id String @id @default(uuid()) @db.Uuid + createDateTime DateTime @default(now()) @db.Timestamptz(6) + lastChangedDateTime DateTime @default(now()) @db.Timestamptz(6) + clientAlias String? + clientUrl String } \ No newline at end of file From 0ca57b210a566a7962adb519ea7d35e5b77599c0 Mon Sep 17 00:00:00 2001 From: Sujit Date: Fri, 11 Jul 2025 20:16:25 +0530 Subject: [PATCH 04/60] feat/added org name for get all schema api's response Signed-off-by: Sujit --- .../schema/repositories/schema.repository.ts | 39 ++-- apps/ledger/src/schema/schema.service.ts | 4 +- .../common/src/interfaces/schema.interface.ts | 214 +++++++++--------- 3 files changed, 137 insertions(+), 120 deletions(-) diff --git a/apps/ledger/src/schema/repositories/schema.repository.ts b/apps/ledger/src/schema/repositories/schema.repository.ts index 381eef7bd..f21c0678d 100644 --- a/apps/ledger/src/schema/repositories/schema.repository.ts +++ b/apps/ledger/src/schema/repositories/schema.repository.ts @@ -1,13 +1,14 @@ +import { AgentDetails, ISchemasWithCount, IUpdateSchema, UpdateSchemaResponse } from '../interfaces/schema.interface'; /* eslint-disable camelcase */ import { ConflictException, Injectable, InternalServerErrorException, Logger } from '@nestjs/common'; -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 { AgentDetails, ISchemasWithCount, IUpdateSchema, UpdateSchemaResponse } from '../interfaces/schema.interface'; +import { ICredDefWithCount, IPlatformSchemasWithOrg } from '@credebl/common/interfaces/schema.interface'; +import { ISaveSchema, ISchema, ISchemaExist, ISchemaSearchCriteria } from '../interfaces/schema-payload.interface'; +import { Prisma, ledgers, org_agents, org_agents_type, organisation, schema } from '@prisma/client'; import { SchemaType, SortValue } from '@credebl/enum/enum'; -import { ICredDefWithCount, IPlatformSchemas } from '@credebl/common/interfaces/schema.interface'; + import { ISchemaId } from '../schema.interface'; +import { PrismaService } from '@credebl/prisma-service'; +import { ResponseMessages } from '@credebl/common/response-messages'; @Injectable() export class SchemaRepository { @@ -297,7 +298,7 @@ export class SchemaRepository { } } - async getAllSchemaDetails(payload: ISchemaSearchCriteria): Promise { + async getAllSchemaDetails(payload: ISchemaSearchCriteria): Promise { try { const { ledgerId, schemaType, searchByText, sortField, sortBy, pageSize, pageNumber } = payload; let schemaResult; @@ -334,7 +335,12 @@ export class SchemaRepository { orgId: true, // This field can be null issuerId: true, type: true, - alias: true + alias: true, + organisation: { + select: { + name: true + } + } }, orderBy: { [sortField]: SortValue.DESC === sortBy ? SortValue.DESC : SortValue.ASC @@ -363,7 +369,12 @@ export class SchemaRepository { orgId: true, // This field can be null issuerId: true, type: true, - alias: true + alias: true, + organisation: { + select: { + name: true + } + } }, orderBy: { [sortField]: SortValue.DESC === sortBy ? SortValue.DESC : SortValue.ASC @@ -468,13 +479,13 @@ export class SchemaRepository { const { alias, schemaLedgerId, orgId } = schemaDetails; try { - return await this.prisma.schema.updateMany({ - where: orgId ? { schemaLedgerId, orgId } : { schemaLedgerId }, - data: { alias } - }); + return await this.prisma.schema.updateMany({ + where: orgId ? { schemaLedgerId, orgId } : { schemaLedgerId }, + data: { alias } + }); } catch (error) { this.logger.error(`Error in updating schema details: ${error}`); throw error; } } -} \ No newline at end of file +} diff --git a/apps/ledger/src/schema/schema.service.ts b/apps/ledger/src/schema/schema.service.ts index a2fc33c63..a640cbc23 100644 --- a/apps/ledger/src/schema/schema.service.ts +++ b/apps/ledger/src/schema/schema.service.ts @@ -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); @@ -658,10 +657,9 @@ export class SchemaService extends BaseService { async getAllSchema(schemaSearchCriteria: ISchemaSearchCriteria): Promise { try { const response = await this.schemaRepository.getAllSchemaDetails(schemaSearchCriteria); - const schemasDetails = response?.schemasResult.map((schemaAttributeItem) => { const attributes = JSON.parse(schemaAttributeItem.attributes); - return { ...schemaAttributeItem, attributes }; + return { ...schemaAttributeItem, attributes, organizationName: schemaAttributeItem.organisation.name }; }); const schemasResponse = { diff --git a/libs/common/src/interfaces/schema.interface.ts b/libs/common/src/interfaces/schema.interface.ts index 2e9467280..34dc9b028 100644 --- a/libs/common/src/interfaces/schema.interface.ts +++ b/libs/common/src/interfaces/schema.interface.ts @@ -1,4 +1,3 @@ - export interface IPaginationDetails { totalItems: number; hasNextPage: boolean; @@ -8,111 +7,120 @@ export interface IPaginationDetails { 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 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; +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; - 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 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 INetworkUrl { + networkUrl: 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 IW3CSchemaAttributesValue { + title: string; + type: string; +} + +export interface ISchemaDataWithOrg extends ISchemaData { + 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 ICredDefWithCount { - credDefCount: number; - credDefResult: ICredDefData[]; - } - - export interface INetworkUrl { - networkUrl: 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 IW3CSchemaAttributesValue { - title: string; - type: string; - } - + }; +} + +export interface IPlatformSchemasWithOrg { + schemasCount: number; + schemasResult: ISchemaDataWithOrg[]; +} From 8557feb8c27162074458c5f36ef881bed0c421f7 Mon Sep 17 00:00:00 2001 From: Sujit Date: Tue, 15 Jul 2025 16:53:06 +0530 Subject: [PATCH 05/60] wip/fixed email not saving on verification request Signed-off-by: Sujit --- .../src/interfaces/verification.interface.ts | 352 +++++++++--------- .../repositories/verification.repository.ts | 19 +- apps/verification/src/verification.service.ts | 10 +- 3 files changed, 200 insertions(+), 181 deletions(-) diff --git a/apps/verification/src/interfaces/verification.interface.ts b/apps/verification/src/interfaces/verification.interface.ts index fb7520a87..0eb86b934 100644 --- a/apps/verification/src/interfaces/verification.interface.ts +++ b/apps/verification/src/interfaces/verification.interface.ts @@ -2,275 +2,279 @@ import { AutoAccept } from '@credebl/enum/enum'; import { IUserRequest } from '@credebl/user-request/user-request.interface'; export interface IProofRequestAttribute { - attributeName?: string; - attributeNames?:string[]; - condition?: string; - value?: string; - credDefId?: string; - schemaId?: string; - credentialName?: string; + attributeName?: string; + attributeNames?: string[]; + condition?: string; + value?: string; + credDefId?: string; + schemaId?: string; + credentialName?: string; } export enum ProofRequestType { - INDY = 'indy', - PRESENTATIONEXCHANGE = 'presentationExchange' + INDY = 'indy', + PRESENTATIONEXCHANGE = 'presentationExchange' } export interface IRequestProof { - orgId: string; - version:string; - connectionId?: string | string[]; - attributes?: IProofRequestAttribute[]; - type: ProofRequestType; - presentationDefinition?:IProofRequestPresentationDefinition; - comment: string; - autoAcceptProof: AutoAccept; - protocolVersion?: string; - emailId?: string[]; - goalCode?: string; - parentThreadId?: string; - willConfirm?: boolean; + orgId: string; + version: string; + connectionId?: string | string[]; + attributes?: IProofRequestAttribute[]; + type: ProofRequestType; + presentationDefinition?: IProofRequestPresentationDefinition; + comment: string; + autoAcceptProof: AutoAccept; + protocolVersion?: string; + emailId?: string[]; + goalCode?: string; + parentThreadId?: string; + willConfirm?: boolean; } export interface IGetAllProofPresentations { - url: string; - apiKey: string; + url: string; + apiKey: string; } export interface IGetProofPresentationById { - url: string; - apiKey?: string; - orgId?: string; + url: string; + apiKey?: string; + orgId?: string; } export interface IVerifyPresentation { - url: string; - apiKey?: string; - orgId?: string; + url: string; + apiKey?: string; + orgId?: string; } export interface IVerifiedProofData { - url: string; - apiKey?: string; - orgId?: string + url: string; + apiKey?: string; + orgId?: string; } export interface IProofPresentationData { - proofId: string; - orgId: string; - user: IUserRequest; + proofId: string; + orgId: string; + user: IUserRequest; } interface IProofFormats { - indy: IndyProof + indy: IndyProof; } interface IndyProof { - name: string; - version: string; - requested_attributes: IRequestedAttributes; - requested_predicates: IRequestedPredicates; + name: string; + version: string; + requested_attributes: IRequestedAttributes; + requested_predicates: IRequestedPredicates; } interface IRequestedAttributes { - [key: string]: IRequestedAttributesName; + [key: string]: IRequestedAttributesName; } interface IRequestedAttributesName { - name?: string; - names?: string; - restrictions: IRequestedRestriction[] + name?: string; + names?: string; + restrictions: IRequestedRestriction[]; } interface IRequestedPredicates { - [key: string]: IRequestedPredicatesName; + [key: string]: IRequestedPredicatesName; } interface IRequestedPredicatesName { - name: string; - restrictions: IRequestedRestriction[] + name: string; + restrictions: IRequestedRestriction[]; } interface IRequestedRestriction { - cred_def_id?: string; - schema_id?: string; - schema_issuer_did?: string; - schema_name?: string; - issuer_did?: string; - schema_version?: string; + cred_def_id?: string; + schema_id?: string; + schema_issuer_did?: string; + schema_name?: string; + issuer_did?: string; + schema_version?: string; } export interface ISchema { - uri:string; + uri: string; } export interface IFields { - path: string[]; - } + path: string[]; +} export interface IConstraints { - fields: IFields[]; - } + fields: IFields[]; +} export interface IInputDescriptors { - - id:string; - name?:string; - purpose?:string; - schema:ISchema[]; - constraints?:IConstraints; - + id: string; + name?: string; + purpose?: string; + schema: ISchema[]; + constraints?: IConstraints; } export interface IProofRequestPresentationDefinition { - id:string; - name: string; - purpose?: string; - input_descriptors:IInputDescriptors[]; + id: string; + name: string; + purpose?: string; + input_descriptors: IInputDescriptors[]; } export interface IPresentationExchange { - presentationDefinition:IProofRequestPresentationDefinition; - + presentationDefinition: IProofRequestPresentationDefinition; } export interface IPresentationExchangeProofFormats { - presentationExchange? : IPresentationExchange; - indy?: IndyProof + presentationExchange?: IPresentationExchange; + indy?: IndyProof; } export interface ISendPresentationExchangeProofRequestPayload { - protocolVersion: string; - comment: string; - parentThreadId?: string; - proofFormats: IPresentationExchangeProofFormats; - autoAcceptProof: string; - label?: string; + protocolVersion: string; + comment: string; + parentThreadId?: string; + proofFormats: IPresentationExchangeProofFormats; + autoAcceptProof: string; + label?: string; } export interface IPresentationExchangeProofRequestPayload { - url: string; - apiKey?: string; - proofRequestPayload: ISendPresentationExchangeProofRequestPayload; - orgId?: string; + url: string; + apiKey?: string; + proofRequestPayload: ISendPresentationExchangeProofRequestPayload; + orgId?: string; } export interface ISendProofRequestPayload { - protocolVersion?: string; - comment?: string; - connectionId?: string; - proofFormats?: IProofFormats; - autoAcceptProof?: AutoAccept; - label?: string; - goalCode?: string; - // TODO: [Credo-ts] Issue with parentThreadId in creating an OOB proof request. - // This causes failures in OOB connection establishment. - // parentThreadId?: string; - willConfirm?: boolean; - imageUrl?: string; - emailId?: string[] - isShortenUrl?: boolean; - type?:string; - orgId?: string; - presentationDefinition?:IProofRequestPresentationDefinition; - reuseConnection?: boolean; - recipientKey?:string; - invitationDid?: string + protocolVersion?: string; + comment?: string; + connectionId?: string; + proofFormats?: IProofFormats; + autoAcceptProof?: AutoAccept; + label?: string; + goalCode?: string; + // TODO: [Credo-ts] Issue with parentThreadId in creating an OOB proof request. + // This causes failures in OOB connection establishment. + // parentThreadId?: string; + willConfirm?: boolean; + imageUrl?: string; + emailId?: string[]; + isShortenUrl?: boolean; + type?: string; + orgId?: string; + presentationDefinition?: IProofRequestPresentationDefinition; + reuseConnection?: boolean; + recipientKey?: string; + invitationDid?: string; } export interface IWSendProofRequestPayload { - protocolVersion?: string; - comment?: string; - connectionId?: string; - proofFormats?: IProofFormats; - autoAcceptProof?: string; - label?: string; - goalCode?: string; - parentThreadId?: string; - willConfirm?: boolean; - imageUrl?: string; - emailId?: string[]; - type?:string; - presentationDefinition?:IProofRequestPresentationDefinition; + protocolVersion?: string; + comment?: string; + connectionId?: string; + proofFormats?: IProofFormats; + autoAcceptProof?: string; + label?: string; + goalCode?: string; + parentThreadId?: string; + willConfirm?: boolean; + imageUrl?: string; + emailId?: string[]; + type?: string; + presentationDefinition?: IProofRequestPresentationDefinition; } export interface IProofRequestPayload { - url: string; - apiKey?: string; - orgId?: string; - proofRequestPayload: ISendProofRequestPayload | ISendPresentationExchangeProofRequestPayload; + url: string; + apiKey?: string; + orgId?: string; + proofRequestPayload: ISendProofRequestPayload | ISendPresentationExchangeProofRequestPayload; } interface IWebhookPresentationProof { - threadId: string; - state: string; - connectionId + threadId: string; + state: string; + connectionId; } export interface IWebhookProofPresentation { - metadata: object; - _tags: IWebhookPresentationProof; - id: string; - createdAt: string; - protocolVersion: string; - state: string; - connectionId: string; - presentationId: string; - threadId: string; - parentThreadId?: string; - autoAcceptProof: string; - updatedAt: string; - isVerified: boolean; - contextCorrelationId: string; - errorMessage?: string; + metadata: object; + _tags: IWebhookPresentationProof; + id: string; + createdAt: string; + protocolVersion: string; + state: string; + connectionId: string; + presentationId: string; + threadId: string; + parentThreadId?: string; + autoAcceptProof: string; + updatedAt: string; + isVerified: boolean; + contextCorrelationId: string; + errorMessage?: string; } export interface IProofPresentation { - proofPresentationPayload: IWebhookProofPresentation; - orgId: string; + proofPresentationPayload: IWebhookProofPresentation; + orgId: string; } export interface IProofRequests { - proofRequestsSearchCriteria: IProofRequestSearchCriteria; - user: IUserRequest; - orgId: string; + proofRequestsSearchCriteria: IProofRequestSearchCriteria; + user: IUserRequest; + orgId: string; } export interface IProofRequestSearchCriteria { - pageNumber: number; - pageSize: number; - sortField: string; - sortBy: string; - search: string; + pageNumber: number; + pageSize: number; + sortField: string; + sortBy: string; + search: string; } -export interface IInvitation{ - invitationUrl?: string; - deepLinkURL?: string; +export interface IInvitation { + invitationUrl?: string; + deepLinkURL?: string; } export interface IProofRequestData { - goalCode?: string; - version:string; - parentThreadId?: string; - willConfirm?: boolean; - protocolVersion?: string; - proofFormats?:IProofFormat; - orgId: string; - connectionId?: string | string[]; - attributes?: IProofRequestAttribute[]; - type: ProofRequestType; - presentationDefinition?:IProofRequestPresentationDefinition; - comment: string; - autoAcceptProof: AutoAccept; + goalCode?: string; + version: string; + parentThreadId?: string; + willConfirm?: boolean; + protocolVersion?: string; + proofFormats?: IProofFormat; + orgId: string; + connectionId?: string | string[]; + attributes?: IProofRequestAttribute[]; + type: ProofRequestType; + presentationDefinition?: IProofRequestPresentationDefinition; + comment: string; + autoAcceptProof: AutoAccept; } export interface IProofFormat { - indy: Indy; + indy: Indy; } export interface Indy { - attributes: IProofAttributesData[]; + attributes: IProofAttributesData[]; } export interface IProofAttributesData { - attributeName: string; - attributeNames?: string[]; - condition: string; - value: string; - credDefId: string; - schemaId: string; -} \ No newline at end of file + attributeName: string; + attributeNames?: string[]; + condition: string; + value: string; + credDefId: string; + schemaId: string; +} + +export interface IEmailResponse { + email: string; + isEmailSent: boolean; + outOfBandRecordId: string; + proofRecordThId: string; +} diff --git a/apps/verification/src/repositories/verification.repository.ts b/apps/verification/src/repositories/verification.repository.ts index 13587c094..0ebc8917e 100644 --- a/apps/verification/src/repositories/verification.repository.ts +++ b/apps/verification/src/repositories/verification.repository.ts @@ -1,4 +1,4 @@ -import { IProofPresentation, IProofRequestSearchCriteria } from '../interfaces/verification.interface'; +import { IEmailResponse, IProofPresentation, IProofRequestSearchCriteria } from '../interfaces/verification.interface'; import { IProofPresentationsListCount, IVerificationRecords } from '@credebl/common/interfaces/verification.interface'; import { Injectable, Logger, NotFoundException } from '@nestjs/common'; // eslint-disable-next-line camelcase @@ -156,7 +156,6 @@ export class VerificationRepository { let encryptEmailId; let organisationId: string; let schemaId; - const { proofPresentationPayload, orgId } = payload; //For Educreds @@ -182,7 +181,6 @@ export class VerificationRepository { } else { organisationId = orgId; } - const proofPresentationsDetails = await this.prisma.presentations.upsert({ where: { threadId: proofPresentationPayload?.threadId @@ -293,4 +291,19 @@ export class VerificationRepository { throw error; } } + + async addEmailAfterVerification(emailList: IEmailResponse[]): Promise { + try { + for (const { proofRecordThId, email } of emailList) { + await this.prisma.presentations.updateMany({ + where: { threadId: proofRecordThId }, + data: { emailId: email } + }); + } + // return this.prisma.organisation.findFirst({ where: { id: orgId } }); + } catch (error) { + this.logger.error(`[getOrganization] - error: ${JSON.stringify(error)}`); + throw error; + } + } } diff --git a/apps/verification/src/verification.service.ts b/apps/verification/src/verification.service.ts index fe99e8cf8..b0a27a032 100644 --- a/apps/verification/src/verification.service.ts +++ b/apps/verification/src/verification.service.ts @@ -21,7 +21,8 @@ import { IVerifyPresentation, IVerifiedProofData, IInvitation, - IProofRequestData + IProofRequestData, + IEmailResponse } from './interfaces/verification.interface'; import { VerificationRepository } from './repositories/verification.repository'; import { ATTRIBUTE_NAME_REGEX, CommonConstants } from '@credebl/common/common.constant'; @@ -88,7 +89,6 @@ export class VerificationService { orgId, proofRequestsSearchCriteria ); - const schemaIds = getProofRequestsList?.proofRequestsList?.map((schema) => schema?.schemaId).filter(Boolean); const getSchemaDetails = await this._getSchemaAndOrganizationDetails(schemaIds); @@ -243,7 +243,9 @@ export class VerificationService { const getProofPresentationById = await this._getProofPresentationById(payload); return getProofPresentationById?.response; } catch (error) { - this.logger.error(`[getProofPresentationById] - error in get proof presentation by proofId : ${JSON.stringify(error)}`); + this.logger.error( + `[getProofPresentationById] - error in get proof presentation by proofId : ${JSON.stringify(error)}` + ); const errorMessage = error?.response?.error?.reason || error?.message; if (errorMessage?.includes('not found')) { @@ -566,9 +568,9 @@ export class VerificationService { } }; } - if (emailId) { const emailResponse = await this.sendEmailInBatches(payload, emailId, getAgentDetails, getOrganization); + await this.verificationRepository.addEmailAfterVerification(emailResponse as IEmailResponse[]); return emailResponse; } else { const presentationProof: IInvitation = await this.generateOOBProofReq(payload); From e5b3611aa36566a80750126caa7215a8c46fe8b1 Mon Sep 17 00:00:00 2001 From: Sujit Date: Tue, 15 Jul 2025 18:05:51 +0530 Subject: [PATCH 06/60] feat/added their label for connections to show in verification table Signed-off-by: Sujit --- .../repositories/verification.repository.ts | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/apps/verification/src/repositories/verification.repository.ts b/apps/verification/src/repositories/verification.repository.ts index 0ebc8917e..059ca07c5 100644 --- a/apps/verification/src/repositories/verification.repository.ts +++ b/apps/verification/src/repositories/verification.repository.ts @@ -87,7 +87,7 @@ export class VerificationRepository { proofRequestsSearchCriteria: IProofRequestSearchCriteria ): Promise { try { - const proofRequestsList = await this.prisma.presentations.findMany({ + const proofRequestsListData = await this.prisma.presentations.findMany({ where: { orgId, OR: [ @@ -115,6 +115,23 @@ export class VerificationRepository { take: Number(proofRequestsSearchCriteria.pageSize), skip: (proofRequestsSearchCriteria.pageNumber - 1) * proofRequestsSearchCriteria.pageSize }); + + const proofRequestsList = await Promise.all( + proofRequestsListData.map(async (presentation) => { + if (!presentation.connectionId) { + return { ...presentation, theirLabel: null }; + } + const connection = await this.prisma.connections.findUnique({ + where: { connectionId: presentation.connectionId }, + select: { theirLabel: true } + }); + return { + ...presentation, + theirLabel: connection?.theirLabel ?? null + }; + }) + ); + const proofRequestsCount = await this.prisma.presentations.count({ where: { orgId, From 9aa5c8fa93ba5d9343a378f7749777008b3546dc Mon Sep 17 00:00:00 2001 From: Sujit Date: Thu, 24 Jul 2025 19:36:01 +0530 Subject: [PATCH 07/60] fix/schema migration Signed-off-by: Sujit --- .../repositories/verification.repository.ts | 30 ++++++------------- apps/verification/src/verification.service.ts | 2 +- .../migration.sql | 2 ++ libs/prisma-service/prisma/schema.prisma | 5 +++- 4 files changed, 16 insertions(+), 23 deletions(-) create mode 100644 libs/prisma-service/prisma/migrations/20250721132721_added_relation_for_presentation_with_connection_table/migration.sql diff --git a/apps/verification/src/repositories/verification.repository.ts b/apps/verification/src/repositories/verification.repository.ts index 059ca07c5..256fa951d 100644 --- a/apps/verification/src/repositories/verification.repository.ts +++ b/apps/verification/src/repositories/verification.repository.ts @@ -87,7 +87,7 @@ export class VerificationRepository { proofRequestsSearchCriteria: IProofRequestSearchCriteria ): Promise { try { - const proofRequestsListData = await this.prisma.presentations.findMany({ + const proofRequestsList = await this.prisma.presentations.findMany({ where: { orgId, OR: [ @@ -106,7 +106,12 @@ export class VerificationRepository { presentationId: true, schemaId: true, emailId: true, - errorMessage: true + errorMessage: true, + connections: { + select: { + theirLabel: true + } + } }, orderBy: { [proofRequestsSearchCriteria.sortField]: SortValue.ASC === proofRequestsSearchCriteria.sortBy ? 'asc' : 'desc' @@ -116,22 +121,6 @@ export class VerificationRepository { skip: (proofRequestsSearchCriteria.pageNumber - 1) * proofRequestsSearchCriteria.pageSize }); - const proofRequestsList = await Promise.all( - proofRequestsListData.map(async (presentation) => { - if (!presentation.connectionId) { - return { ...presentation, theirLabel: null }; - } - const connection = await this.prisma.connections.findUnique({ - where: { connectionId: presentation.connectionId }, - select: { theirLabel: true } - }); - return { - ...presentation, - theirLabel: connection?.theirLabel ?? null - }; - }) - ); - const proofRequestsCount = await this.prisma.presentations.count({ where: { orgId, @@ -309,7 +298,7 @@ export class VerificationRepository { } } - async addEmailAfterVerification(emailList: IEmailResponse[]): Promise { + async saveEmail(emailList: IEmailResponse[]): Promise { try { for (const { proofRecordThId, email } of emailList) { await this.prisma.presentations.updateMany({ @@ -317,9 +306,8 @@ export class VerificationRepository { data: { emailId: email } }); } - // return this.prisma.organisation.findFirst({ where: { id: orgId } }); } catch (error) { - this.logger.error(`[getOrganization] - error: ${JSON.stringify(error)}`); + this.logger.error(`[Verification Save Email] - error: ${JSON.stringify(error)}`); throw error; } } diff --git a/apps/verification/src/verification.service.ts b/apps/verification/src/verification.service.ts index b0a27a032..ed9b8b0c3 100644 --- a/apps/verification/src/verification.service.ts +++ b/apps/verification/src/verification.service.ts @@ -570,7 +570,7 @@ export class VerificationService { } if (emailId) { const emailResponse = await this.sendEmailInBatches(payload, emailId, getAgentDetails, getOrganization); - await this.verificationRepository.addEmailAfterVerification(emailResponse as IEmailResponse[]); + await this.verificationRepository.saveEmail(emailResponse as IEmailResponse[]); return emailResponse; } else { const presentationProof: IInvitation = await this.generateOOBProofReq(payload); diff --git a/libs/prisma-service/prisma/migrations/20250721132721_added_relation_for_presentation_with_connection_table/migration.sql b/libs/prisma-service/prisma/migrations/20250721132721_added_relation_for_presentation_with_connection_table/migration.sql new file mode 100644 index 000000000..a28508bea --- /dev/null +++ b/libs/prisma-service/prisma/migrations/20250721132721_added_relation_for_presentation_with_connection_table/migration.sql @@ -0,0 +1,2 @@ +-- AddForeignKey +ALTER TABLE "presentations" ADD CONSTRAINT "presentations_connectionId_fkey" FOREIGN KEY ("connectionId") REFERENCES "connections"("connectionId") ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/libs/prisma-service/prisma/schema.prisma b/libs/prisma-service/prisma/schema.prisma index 89fee4629..52e0ce035 100644 --- a/libs/prisma-service/prisma/schema.prisma +++ b/libs/prisma-service/prisma/schema.prisma @@ -325,6 +325,7 @@ model connections { state String orgId String? @db.Uuid organisation organisation? @relation(fields: [orgId], references: [id]) + presentations presentations[] } model credentials { @@ -349,7 +350,7 @@ model presentations { createdBy String @db.Uuid lastChangedDateTime DateTime @default(now()) @db.Timestamptz(6) lastChangedBy String @db.Uuid - connectionId String? + connectionId String? state String? threadId String @unique isVerified Boolean? @@ -359,6 +360,8 @@ model presentations { emailId String? orgId String? @db.Uuid organisation organisation? @relation(fields: [orgId], references: [id]) + connections connections? @relation(fields: [connectionId], references: [connectionId]) + } model file_upload { From 97a2b7e508251c6892e21ce499227599ade6e7b1 Mon Sep 17 00:00:00 2001 From: Sujit Date: Thu, 24 Jul 2025 22:06:23 +0530 Subject: [PATCH 08/60] feat/updated connection for credentials with connection table Signed-off-by: Sujit --- apps/issuance/src/issuance.repository.ts | 10 +++++++++- libs/common/src/response-messages/index.ts | 2 +- .../migration.sql | 2 ++ libs/prisma-service/prisma/schema.prisma | 4 +++- 4 files changed, 15 insertions(+), 3 deletions(-) create mode 100644 libs/prisma-service/prisma/migrations/20250724161232_added_connection_for_credentials_with_connection_table/migration.sql diff --git a/apps/issuance/src/issuance.repository.ts b/apps/issuance/src/issuance.repository.ts index c825cb96a..d85a9849b 100644 --- a/apps/issuance/src/issuance.repository.ts +++ b/apps/issuance/src/issuance.repository.ts @@ -121,6 +121,9 @@ export class IssuanceRepository { schemaId: string; state: string; orgId: string; + connections: { + theirLabel: string; + }; }[]; }> { try { @@ -144,7 +147,12 @@ export class IssuanceRepository { orgId: true, state: true, schemaId: true, - connectionId: true + connectionId: true, + connections: { + select: { + theirLabel: true + } + } }, orderBy: { [issuedCredentialsSearchCriteria?.sortField]: diff --git a/libs/common/src/response-messages/index.ts b/libs/common/src/response-messages/index.ts index 44f049c21..0c56ef999 100644 --- a/libs/common/src/response-messages/index.ts +++ b/libs/common/src/response-messages/index.ts @@ -79,7 +79,7 @@ export const ResponseMessages = { updateUserRoles: 'User roles updated successfully', delete: 'Organization deleted successfully', orgInvitationDeleted: 'Organization invitation deleted successfully', - orgCredentials: 'Organization credentials created successfully', + orgCredentials: 'Client credentials created successfully', fetchedOrgCredentials: 'Organization credentials fetched successfully', clientCredentials: 'Client credentials fetched successfully', deleteCredentials: 'Organization client credentials deleted', diff --git a/libs/prisma-service/prisma/migrations/20250724161232_added_connection_for_credentials_with_connection_table/migration.sql b/libs/prisma-service/prisma/migrations/20250724161232_added_connection_for_credentials_with_connection_table/migration.sql new file mode 100644 index 000000000..9f43bd90c --- /dev/null +++ b/libs/prisma-service/prisma/migrations/20250724161232_added_connection_for_credentials_with_connection_table/migration.sql @@ -0,0 +1,2 @@ +-- AddForeignKey +ALTER TABLE "credentials" ADD CONSTRAINT "credentials_connectionId_fkey" FOREIGN KEY ("connectionId") REFERENCES "connections"("connectionId") ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/libs/prisma-service/prisma/schema.prisma b/libs/prisma-service/prisma/schema.prisma index 52e0ce035..02bcbb91d 100644 --- a/libs/prisma-service/prisma/schema.prisma +++ b/libs/prisma-service/prisma/schema.prisma @@ -326,6 +326,7 @@ model connections { orgId String? @db.Uuid organisation organisation? @relation(fields: [orgId], references: [id]) presentations presentations[] + credentials credentials[] } model credentials { @@ -342,6 +343,7 @@ model credentials { credDefId String @default("") orgId String? @db.Uuid organisation organisation? @relation(fields: [orgId], references: [id]) + connections connections? @relation(fields: [connectionId], references: [connectionId]) } model presentations { @@ -530,4 +532,4 @@ model client_aliases { lastChangedDateTime DateTime @default(now()) @db.Timestamptz(6) clientAlias String? clientUrl String -} \ No newline at end of file +} From 855603d2d0d5618be01b97497f3dc9ca75c95f98 Mon Sep 17 00:00:00 2001 From: Tipu_Singh Date: Tue, 5 Aug 2025 09:56:52 +0530 Subject: [PATCH 09/60] feat: refactor agent endpoint for token (#1375) * feat: added logic for updated routes for agent Signed-off-by: Tipu_Singh * refactor: uncommented required code Signed-off-by: Tipu_Singh * feat:added logic to get token from cloudwatch Signed-off-by: Sahil Kamble * feat: update credo image in taskdef Signed-off-by: Sahil Kamble * feat: change service name for testing Signed-off-by: Sahil Kamble * chore: WIP Signed-off-by: Sahil Kamble * debug: added logs for agent details Signed-off-by: Tipu_Singh * refactor:removed console logs Signed-off-by: Tipu_Singh * refactor:removed commented code Signed-off-by: Tipu_Singh * feat: added token for old wallet Signed-off-by: Tipu_Singh * refactor: cloud wallet urls and token changes Signed-off-by: Tipu_Singh * refactor: removed logs from shell scripts Signed-off-by: Tipu_Singh * refactor: resolve comment Signed-off-by: Tipu_Singh * refactor: resolve comments for getOrgAgentApiKey Signed-off-by: Tipu_Singh * refactor: agent service comments Signed-off-by: Tipu_Singh --------- Signed-off-by: Tipu_Singh Signed-off-by: Sahil Kamble Co-authored-by: Sahil Kamble --- .eslintrc.js | 2 +- .../AFJ/scripts/start_agent.sh | 9 +- .../AFJ/scripts/start_agent_ecs.sh | 75 +++++- .../src/agent-provisioning.service.ts | 32 ++- .../src/agent-service.service.ts | 215 +++++++----------- .../src/interface/agent-service.interface.ts | 31 +-- .../repositories/agent-service.repository.ts | 29 ++- .../agent-service/agent-service.controller.ts | 1 - apps/cloud-wallet/src/cloud-wallet.service.ts | 202 ++++++++-------- apps/connection/src/connection.service.ts | 155 +++++-------- apps/issuance/src/issuance.service.ts | 103 +-------- apps/verification/src/verification.service.ts | 164 +------------ libs/common/src/common.constant.ts | 58 +++-- libs/common/src/common.service.ts | 41 +++- libs/common/src/common.utils.ts | 57 ++++- libs/common/src/response-messages/index.ts | 12 +- package.json | 0 17 files changed, 516 insertions(+), 670 deletions(-) mode change 100755 => 100644 package.json diff --git a/.eslintrc.js b/.eslintrc.js index f55a1efc2..6b733d326 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -101,4 +101,4 @@ module.exports = { 'prefer-template': 'error', quotes: ['warn', 'single', { allowTemplateLiterals: true }] } -}; \ No newline at end of file +}; diff --git a/apps/agent-provisioning/AFJ/scripts/start_agent.sh b/apps/agent-provisioning/AFJ/scripts/start_agent.sh index c18fd5c52..e46a87073 100755 --- a/apps/agent-provisioning/AFJ/scripts/start_agent.sh +++ b/apps/agent-provisioning/AFJ/scripts/start_agent.sh @@ -19,7 +19,7 @@ AFJ_VERSION=${14} INDY_LEDGER=${15} INBOUND_ENDPOINT=${16} SCHEMA_FILE_SERVER_URL=${17} - +AGENT_API_KEY="${18}" ADMIN_PORT_FILE="$PWD/apps/agent-provisioning/AFJ/port-file/last-admin-port.txt" INBOUND_PORT_FILE="$PWD/apps/agent-provisioning/AFJ/port-file/last-inbound-port.txt" ADMIN_PORT=8001 @@ -122,7 +122,7 @@ if [ -f "$CONFIG_FILE" ]; then rm "$CONFIG_FILE" fi -cat <${CONFIG_FILE} +cat <"$CONFIG_FILE" { "label": "${AGENCY}_${CONTAINER_NAME}", "walletId": "$WALLET_NAME", @@ -154,7 +154,8 @@ cat <${CONFIG_FILE} "webhookUrl": "$WEBHOOK_HOST/wh/$AGENCY", "adminPort": $ADMIN_PORT, "tenancy": $TENANT, - "schemaFileServerURL": "$SCHEMA_FILE_SERVER_URL" + "schemaFileServerURL": "$SCHEMA_FILE_SERVER_URL", + "apiKey": "$AGENT_API_KEY" } EOF @@ -238,7 +239,7 @@ if [ $? -eq 0 ]; then container_logs=$(docker logs $(docker ps -q --filter "name=${AGENCY}_${CONTAINER_NAME}")) # Extract the token from the logs using sed - token=$(echo "$container_logs" | sed -nE 's/.*API Token: ([^ ]+).*/\1/p') + token=$(echo "$container_logs" | sed -nE 's/.*** API Key: ([^ ]+).*/\1/p') # Print the extracted token echo "Token: $token" diff --git a/apps/agent-provisioning/AFJ/scripts/start_agent_ecs.sh b/apps/agent-provisioning/AFJ/scripts/start_agent_ecs.sh index 27f984451..372552e82 100644 --- a/apps/agent-provisioning/AFJ/scripts/start_agent_ecs.sh +++ b/apps/agent-provisioning/AFJ/scripts/start_agent_ecs.sh @@ -37,7 +37,7 @@ random_string=$(generate_random_string) # Print the generated random string echo "Random String: $random_string" -SERVICE_NAME="${AGENCY}-${CONTAINER_NAME}-service-${random_string}" +SERVICE_NAME="${CONTAINER_NAME}-service-test" EXTERNAL_IP=$(echo "$2" | tr -d '[:space:]') ADMIN_PORT_FILE="$PWD/agent-provisioning/AFJ/port-file/last-admin-port.txt" INBOUND_PORT_FILE="$PWD/agent-provisioning/AFJ/port-file/last-inbound-port.txt" @@ -153,7 +153,7 @@ CONTAINER_DEFINITIONS=$( [ { "name": "$CONTAINER_NAME", - "image": "${AFJ_IMAGE_URL}", + "image": "${AFJ_VERSION}", "cpu": 154, "memory": 307, "portMappings": [ @@ -194,6 +194,14 @@ CONTAINER_DEFINITIONS=$( } ], "volumesFrom": [], + "logConfiguration": { + "logDriver": "awslogs", + "options": { + "awslogs-group": "/ecs/$TESKDEFINITION_FAMILY", + "awslogs-create-group": "true", + "awslogs-region": "ap-south-1", + "awslogs-stream-prefix": "ecs" + }, "ulimits": [] } ] @@ -262,6 +270,67 @@ if [ $? -eq 0 ]; then sleep 10 fi done +# Describe the ECS service and filter by service name +service_description=$(aws ecs describe-services --service $SERVICE_NAME --cluster $CLUSTER_NAME --region $AWS_PUBLIC_REGION) +echo "service_description=$service_description" + + +# Extract Task ID from the service description events +task_id=$(echo "$service_description" | jq -r '.services[0].events[] | select(.message | test("has started 1 tasks")) | .message | capture("\\(task (?[^)]+)\\)") | .id') +#echo "task_id=$task_id" + +# to fetch log group of container +............................................................. +log_group=/ecs/$TESKDEFINITION_FAMILY +echo "log_group=$log_group" + +# Get Log Stream Name +log_stream=ecs/$CONTAINER_NAME/$task_id + +echo "logstrem=$log_stream" + + +# Fetch logs +#echo "$(aws logs get-log-events --log-group-name "/ecs/$TESKDEFINITION_FAMILY/$CONTAINER_NAME" --log-stream-name "$log_stream" --region $AWS_PUBLIC_REGION)" + +# Check if the token folder exists, and create it if it doesn't +token_folder="$PWD/agent-provisioning/AFJ/token" +if [ ! -d "$token_folder" ]; then + mkdir -p "$token_folder" +fi + +# Set maximum retry attempts +RETRIES=3 + +# Loop to attempt retrieving token from logs +# Loop to attempt retrieving token from logs +for attempt in $(seq 1 $RETRIES); do + echo "Attempt $attempt: Checking service logs for token..." + + # Fetch logs and grep for API token + token=$(aws logs get-log-events \ + --log-group-name "$log_group" \ + --log-stream-name "$log_stream" \ + --region ap-southeast-1 \ + | grep -o '*** API Key: [^ ]*' \ + | cut -d ' ' -f 3 +) + # echo "token=$token" + if [ -n "$token" ]; then + echo "Token found: $token" + # Write token to a file + echo "{\"token\": \"$token\"}" > "$PWD/agent-provisioning/AFJ/token/${AGENCY}_${CONTAINER_NAME}.json" + break # Exit loop if token is found + else + echo "Token not found in logs. Retrying..." + if [ $attempt -eq $RETRIES ]; then + echo "Reached maximum retry attempts. Token not found." + fi + fi + # Add a delay of 10 seconds between retries + sleep 10 +done + echo "Creating agent config" cat <${PWD}/agent-provisioning/AFJ/endpoints/${AGENCY}_${CONTAINER_NAME}.json @@ -273,7 +342,7 @@ EOF cat <${PWD}/agent-provisioning/AFJ/token/${AGENCY}_${CONTAINER_NAME}.json { - "token" : "" + "token" : "$token" } EOF diff --git a/apps/agent-provisioning/src/agent-provisioning.service.ts b/apps/agent-provisioning/src/agent-provisioning.service.ts index 92d382358..f7d5f34c9 100644 --- a/apps/agent-provisioning/src/agent-provisioning.service.ts +++ b/apps/agent-provisioning/src/agent-provisioning.service.ts @@ -9,25 +9,39 @@ dotenv.config(); @Injectable() export class AgentProvisioningService { - - constructor( - private readonly logger: Logger - ) { } + constructor(private readonly logger: Logger) {} /** * Description: Wallet provision - * @param payload + * @param payload * @returns Get DID and verkey */ async walletProvision(payload: IWalletProvision): Promise { try { - - const { containerName, externalIp, orgId, seed, walletName, walletPassword, walletStorageHost, walletStoragePassword, walletStoragePort, walletStorageUser, webhookEndpoint, agentType, protocol, credoImage, tenant, indyLedger, inboundEndpoint } = payload; + const { + containerName, + externalIp, + orgId, + seed, + walletName, + walletPassword, + walletStorageHost, + walletStoragePassword, + walletStoragePort, + walletStorageUser, + webhookEndpoint, + agentType, + protocol, + credoImage, + tenant, + indyLedger, + inboundEndpoint, + apiKey + } = payload; if (agentType === AgentType.AFJ) { // The wallet provision command is used to invoke a shell script - const walletProvision = `${process.cwd() + process.env.AFJ_AGENT_SPIN_UP} ${orgId} "${externalIp}" "${walletName}" "${walletPassword}" ${seed} ${webhookEndpoint} ${walletStorageHost} ${walletStoragePort} ${walletStorageUser} ${walletStoragePassword} ${containerName} ${protocol} ${tenant} ${credoImage} "${indyLedger}" ${inboundEndpoint} ${process.env.SCHEMA_FILE_SERVER_URL} ${process.env.AGENT_HOST} ${process.env.AWS_ACCOUNT_ID} ${process.env.S3_BUCKET_ARN} ${process.env.CLUSTER_NAME} ${process.env.TESKDEFINITION_FAMILY}`; + const walletProvision = `${process.cwd() + process.env.AFJ_AGENT_SPIN_UP} ${orgId} "${externalIp}" "${walletName}" "${walletPassword}" ${seed} ${webhookEndpoint} ${walletStorageHost} ${walletStoragePort} ${walletStorageUser} ${walletStoragePassword} ${containerName} ${protocol} ${tenant} ${credoImage} "${indyLedger}" ${inboundEndpoint} ${process.env.SCHEMA_FILE_SERVER_URL} ${apiKey} ${process.env.AGENT_HOST} ${process.env.AWS_ACCOUNT_ID} ${process.env.S3_BUCKET_ARN} ${process.env.CLUSTER_NAME} ${process.env.TESKDEFINITION_FAMILY}`; const spinUpResponse: object = new Promise(async (resolve) => { - await exec(walletProvision, async (err, stdout, stderr) => { this.logger.log(`shell script output: ${stdout}`); if (stderr) { diff --git a/apps/agent-service/src/agent-service.service.ts b/apps/agent-service/src/agent-service.service.ts index 4a61dba6f..648dfd947 100644 --- a/apps/agent-service/src/agent-service.service.ts +++ b/apps/agent-service/src/agent-service.service.ts @@ -54,7 +54,8 @@ import { IAgentStore, IAgentConfigure, OrgDid, - IBasicMessage + IBasicMessage, + WalletDetails } from './interface/agent-service.interface'; import { AgentSpinUpStatus, AgentType, DidMethod, Ledgers, OrgAgentType, PromiseResult } from '@credebl/enum/enum'; import { AgentServiceRepository } from './repositories/agent-service.repository'; @@ -78,6 +79,7 @@ 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 { getAgentUrl } from '@credebl/common/common.utils'; @Injectable() @WebSocketGateway() export class AgentServiceService { @@ -420,7 +422,7 @@ export class AgentServiceService { credoImage: process.env.AFJ_VERSION || '', protocol: process.env.AGENT_PROTOCOL || '', tenant: agentSpinupDto.tenant || false, - apiKey: agentSpinupDto.apiKey + apiKey: process.env.AGENT_API_KEY }; return walletProvisionPayload; } @@ -524,9 +526,17 @@ export class AgentServiceService { socket.emit('did-publish-process-initiated', { clientId: agentSpinupDto.clientSocketId }); socket.emit('invitation-url-creation-started', { clientId: agentSpinupDto.clientSocketId }); } - - const encryptedToken = await this.tokenEncryption(agentDetails?.agentToken); - + const agentBaseWalletToken = await this.commonService.getBaseAgentToken( + agentDetails.gentEndPoint, + agentDetails?.agentToken + ); + if (!agentBaseWalletToken) { + throw new BadRequestException(ResponseMessages.agent.error.baseWalletToken, { + cause: new Error(), + description: ResponseMessages.errorMessages.badRequest + }); + } + const encryptedToken = await this.tokenEncryption(agentBaseWalletToken); const agentPayload: IStoreOrgAgentDetails = { agentEndPoint, seed: agentSpinupDto.seed, @@ -566,9 +576,6 @@ export class AgentServiceService { socket.emit('did-publish-process-completed', { clientId: agentSpinupDto.clientSocketId }); } - const getOrganization = await this.agentServiceRepository.getOrgDetails(orgData?.id); - - await this._createConnectionInvitation(orgData?.id, user, getOrganization.name); if (agentSpinupDto.clientSocketId) { socket.emit('invitation-url-creation-success', { clientId: agentSpinupDto.clientSocketId }); } @@ -596,21 +603,11 @@ export class AgentServiceService { async _storeOrgAgentDetails(payload: IStoreOrgAgentDetails): Promise { try { - /** - * Get orgaization agent type and agent details - */ - const [agentDid, orgAgentTypeId] = await Promise.all([ - this._getAgentDid(payload), - this.agentServiceRepository.getOrgAgentTypeDetails(OrgAgentType.DEDICATED) - ]); - /** - * Get DID method by agent - */ - const getDidMethod = await this._getDidMethod(payload, agentDid); + const orgAgentTypeId = await this.agentServiceRepository.getOrgAgentTypeDetails(OrgAgentType.DEDICATED); /** * Organization storage data */ - const storeOrgAgentData = await this._buildStoreOrgAgentData(payload, getDidMethod, `${orgAgentTypeId}`); + const storeOrgAgentData = await this._buildStoreOrgAgentData(payload, `${orgAgentTypeId}`); /** * Store org agent details */ @@ -622,39 +619,10 @@ export class AgentServiceService { } } - private async _getAgentDid(payload: IStoreOrgAgentDetails): Promise { - const { agentEndPoint, apiKey, ledgerId, seed, keyType, method, network, role, did } = payload; - const writeDid = 'write-did'; - const ledgerDetails = await this.agentServiceRepository.getGenesisUrl(ledgerId); - const agentDidWriteUrl = `${agentEndPoint}${CommonConstants.URL_AGENT_WRITE_DID}`; - return this._retryAgentSpinup(agentDidWriteUrl, apiKey, writeDid, seed, keyType, method, network, role, did); - } - - private async _getDidMethod(payload: IStoreOrgAgentDetails, agentDid: object): Promise { - const { agentEndPoint, apiKey, seed, keyType, method, network, role } = payload; - const getDidDoc = 'get-did-doc'; - const getDidMethodUrl = `${agentEndPoint}${CommonConstants.URL_AGENT_GET_DID}/${agentDid['did']}`; - return this._retryAgentSpinup( - getDidMethodUrl, - apiKey, - getDidDoc, - seed, - keyType, - method, - network, - role, - `${agentDid['did']}` - ); - } - - private _buildStoreOrgAgentData( - payload: IStoreOrgAgentDetails, - getDidMethod: object, - orgAgentTypeId: string - ): IStoreOrgAgentDetails { + private _buildStoreOrgAgentData(payload: IStoreOrgAgentDetails, orgAgentTypeId: string): IStoreOrgAgentDetails { return { - did: getDidMethod['didDocument']?.id, - verkey: getDidMethod['didDocument']?.verificationMethod[0]?.publicKeyBase58, + did: '', + verkey: '', isDidPublic: true, agentSpinUpStatus: AgentSpinUpStatus.COMPLETED, walletName: payload.walletName, @@ -777,7 +745,6 @@ export class AgentServiceService { const agentStatusResponse = { agentSpinupStatus: AgentSpinUpStatus.PROCESSED }; - const getOrgAgent = await this.agentServiceRepository.getAgentDetails(payload.orgId); if (AgentSpinUpStatus.COMPLETED === getOrgAgent?.agentSpinUpStatus) { @@ -863,7 +830,6 @@ export class AgentServiceService { const orgAgentTypeId = await this.agentServiceRepository.getOrgAgentTypeDetails(OrgAgentType.SHARED); // Get agent type details const agentTypeId = await this.agentServiceRepository.getAgentTypeId(AgentType.AFJ); - const storeOrgAgentData: IStoreOrgAgentDetails = { did: tenantDetails.DIDCreationOption.did, isDidPublic: true, @@ -876,9 +842,9 @@ export class AgentServiceService { tenantId: tenantDetails.walletResponseDetails['id'], walletName: payload.label, ledgerId: ledgerIdData.map((item) => item.id), - id: agentProcess?.id + id: agentProcess?.id, + apiKey: await this.commonService.dataEncryption(tenantDetails.walletResponseDetails['token']) }; - // Get organization data const getOrganization = await this.agentServiceRepository.getOrgDetails(payload.orgId); @@ -1157,14 +1123,13 @@ export class AgentServiceService { platformAdminSpinnedUp.org_agents[0].agentEndPoint, getDcryptedToken ); - if (!walletResponseDetails && !walletResponseDetails.id) { + if (!walletResponseDetails && !walletResponseDetails.id && !walletResponseDetails.token) { throw new InternalServerErrorException('Error while creating the wallet'); } const didCreateOption = { didPayload: WalletSetupPayload, agentEndpoint: platformAdminSpinnedUp.org_agents[0].agentEndPoint, - apiKey: getDcryptedToken, - tenantId: walletResponseDetails.id + apiKey: walletResponseDetails.token }; const DIDCreationOption = await this._createDID(didCreateOption); if (!DIDCreationOption) { @@ -1203,10 +1168,10 @@ export class AgentServiceService { * @returns Get tanant status */ private async _createDID(didCreateOption): Promise { - const { didPayload, agentEndpoint, apiKey, tenantId } = didCreateOption; + const { didPayload, agentEndpoint, apiKey } = didCreateOption; // Invoke an API request from the agent to create multi-tenant agent const didDetails = await this.commonService.httpPost( - `${agentEndpoint}${CommonConstants.URL_SHAGENT_CREATE_DID}${tenantId}`, + `${agentEndpoint}${CommonConstants.URL_AGENT_WRITE_DID}`, didPayload, { headers: { authorization: apiKey } } ); @@ -1584,14 +1549,7 @@ export class AgentServiceService { description: ResponseMessages.errorMessages.notFound }); } - const orgAgentType = await this.agentServiceRepository.getOrgAgentType(orgAgentDetails?.orgAgentTypeId); - - const url = this.getAgentUrl( - 'sign-data-from-agent', - orgAgentType.agent, - orgAgentDetails.agentEndPoint, - orgAgentDetails.tenantId - ); + const url = getAgentUrl(orgAgentDetails.agentEndPoint, CommonConstants.SIGN_DATA_FROM_AGENT); const { dataTypeToSign, credentialPayload, rawPayload, storeCredential } = data; @@ -1651,14 +1609,7 @@ export class AgentServiceService { description: ResponseMessages.errorMessages.notFound }); } - const orgAgentType = await this.agentServiceRepository.getOrgAgentType(orgAgentDetails?.orgAgentTypeId); - - const url = this.getAgentUrl( - 'verify-signed-data-from-agent', - orgAgentType.agent, - orgAgentDetails.agentEndPoint, - orgAgentDetails.tenantId - ); + const url = getAgentUrl(orgAgentDetails.agentEndPoint, CommonConstants.VERIFY_SIGNED_DATA_FROM_AGENT); // Invoke an API request from the agent to assess its current status const signedDataFromAgent = await this.commonService @@ -1822,9 +1773,8 @@ export class AgentServiceService { // Perform the deletion in a transaction return await this.prisma.$transaction(async (prisma) => { // Delete org agent and related records - const { orgDid, agentInvitation, deleteOrgAgent } = await this.agentServiceRepository.deleteOrgAgentByOrg( - orgId - ); + const { orgDid, agentInvitation, deleteOrgAgent } = + await this.agentServiceRepository.deleteOrgAgentByOrg(orgId); // Make the HTTP DELETE request const deleteWallet = await this.commonService.httpDelete(url, { @@ -1921,26 +1871,40 @@ export class AgentServiceService { async getOrgAgentApiKey(orgId: string): Promise { try { - const orgAgentApiKey = await this.agentServiceRepository.getAgentApiKey(orgId); + const orgAgentDetails = await this.agentServiceRepository.getAgentApiKey(orgId); const orgAgentId = await this.agentServiceRepository.getOrgAgentTypeDetails(OrgAgentType.SHARED); - let apiKey; - if (orgAgentApiKey?.orgAgentTypeId === orgAgentId) { + let agentApiKey; + if ( + orgAgentDetails?.orgAgentTypeId === orgAgentId && + (orgAgentDetails.apiKey === '' || orgAgentDetails.apiKey === null) + ) { const platformAdminSpinnedUp = await this.agentServiceRepository.platformAdminAgent( CommonConstants.PLATFORM_ADMIN_ORG ); if (!platformAdminSpinnedUp) { - throw new InternalServerErrorException('Agent not able to spin-up'); + throw new InternalServerErrorException(ResponseMessages.agent.error.notConfigured); + } + const walletDetails: WalletDetails = { + agentEndPoint: platformAdminSpinnedUp.org_agents[0]?.agentEndPoint, + apiKey: platformAdminSpinnedUp.org_agents[0]?.apiKey, + tenantId: orgAgentDetails.tenantId, + orgId: orgAgentDetails.orgId + }; + const { apiKey } = await this.getTenantToken(walletDetails); + if (!apiKey) { + throw new NotFoundException(ResponseMessages.agent.error.tenantWalletToken, { + cause: new Error(), + description: ResponseMessages.errorMessages.notFound + }); } - apiKey = platformAdminSpinnedUp.org_agents[0]?.apiKey; + agentApiKey = apiKey; } else { - apiKey = orgAgentApiKey?.apiKey; - } - - if (!apiKey) { - throw new NotFoundException(ResponseMessages.agent.error.apiKeyNotExist); + if (!orgAgentDetails?.apiKey) { + throw new NotFoundException(ResponseMessages.agent.error.apiKeyNotExist); + } + agentApiKey = orgAgentDetails?.apiKey; } - - const decryptedToken = await this.commonService.decryptPassword(apiKey); + const decryptedToken = await this.commonService.decryptPassword(agentApiKey); return decryptedToken; } catch (error) { this.logger.error(`Agent api key details : ${JSON.stringify(error)}`); @@ -1948,6 +1912,31 @@ export class AgentServiceService { } } + async getTenantToken(walletDetails: WalletDetails): Promise { + try { + const { agentEndPoint, apiKey, tenantId, orgId } = walletDetails; + if (!agentEndPoint || !apiKey || !tenantId || !orgId) { + throw new BadRequestException(ResponseMessages.agent.error.invalidTenantDetails, { + cause: new Error(), + description: ResponseMessages.errorMessages.badRequest + }); + } + const tenantWalletToken = await this.commonService.getTenantWalletToken(agentEndPoint, apiKey, tenantId); + if (!tenantWalletToken) { + throw new NotFoundException(ResponseMessages.agent.error.tenantWalletToken, { + cause: new Error(), + description: ResponseMessages.errorMessages.notFound + }); + } + const EncryptedTenantToken = await this.tokenEncryption(tenantWalletToken); + const updatedTenantDetails = await this.agentServiceRepository.updateTenantToken(orgId, EncryptedTenantToken); + return updatedTenantDetails; + } catch (error) { + this.logger.error(`Error in getting org agent type : ${JSON.stringify(error)}`); + throw error; + } + } + async handleAgentSpinupStatusErrors(error: string): Promise { if (error && Object.keys(error).length === 0) { throw new InternalServerErrorException(ResponseMessages.agent.error.agentDown, { @@ -2026,7 +2015,6 @@ export class AgentServiceService { ): Promise { try { const getApiKey = await this.getOrgAgentApiKey(orgId); - const createConnectionInvitation = await this.commonService .httpPost(url, connectionPayload, { headers: { authorization: getApiKey } }) .then(async (response) => response); @@ -2072,45 +2060,4 @@ export class AgentServiceService { throw error; } } - - /** - * Description: Fetch agent url - * @param referenceId - * @returns agent URL - */ - getAgentUrl(agentMethodLabel: string, orgAgentType: string, agentEndPoint: string, tenantId: string): string { - try { - let url; - switch (agentMethodLabel) { - case 'sign-data-from-agent': { - url = - orgAgentType === OrgAgentType.DEDICATED - ? `${agentEndPoint}${CommonConstants.URL_AGENT_SIGN_DATA}` - : orgAgentType === OrgAgentType.SHARED - ? `${agentEndPoint}${CommonConstants.URL_SHARED_AGENT_SIGN_DATA}`.replace('#', tenantId) - : null; - break; - } - case 'verify-signed-data-from-agent': { - url = - orgAgentType === OrgAgentType.DEDICATED - ? `${agentEndPoint}${CommonConstants.URL_AGENT_VERIFY_SIGNED_DATA}` - : orgAgentType === OrgAgentType.SHARED - ? `${agentEndPoint}${CommonConstants.URL_SHARED_AGENT_VERIFY_SIGNED_DATA}`.replace('#', tenantId) - : null; - break; - } - default: { - break; - } - } - if (!url) { - throw new NotFoundException(ResponseMessages.issuance.error.agentUrlNotFound); - } - return url; - } catch (error) { - this.logger.error(`Error in get agent url: ${JSON.stringify(error)}`); - throw error; - } - } } diff --git a/apps/agent-service/src/interface/agent-service.interface.ts b/apps/agent-service/src/interface/agent-service.interface.ts index b4927f98c..4121cf4c3 100644 --- a/apps/agent-service/src/interface/agent-service.interface.ts +++ b/apps/agent-service/src/interface/agent-service.interface.ts @@ -643,16 +643,21 @@ export interface OrgDid { } export interface ILedgers { - id: string; - createDateTime: Date; - lastChangedDateTime: Date; - name: string; - networkType: string; - poolConfig: string; - isActive: boolean; - networkString: string; - nymTxnEndpoint: string; - indyNamespace: string; - networkUrl: string; - -} \ No newline at end of file + id: string; + createDateTime: Date; + lastChangedDateTime: Date; + name: string; + networkType: string; + poolConfig: string; + isActive: boolean; + networkString: string; + nymTxnEndpoint: string; + indyNamespace: string; + networkUrl: string; +} +export interface WalletDetails { + agentEndPoint: string; + apiKey: string; + tenantId: string; + orgId: string; +} diff --git a/apps/agent-service/src/repositories/agent-service.repository.ts b/apps/agent-service/src/repositories/agent-service.repository.ts index 4eb239932..f561694e5 100644 --- a/apps/agent-service/src/repositories/agent-service.repository.ts +++ b/apps/agent-service/src/repositories/agent-service.repository.ts @@ -1,6 +1,6 @@ import { PrismaService } from '@credebl/prisma-service'; import { ConflictException, Injectable, Logger } from '@nestjs/common'; -// eslint-disable-next-line camelcase +/* eslint-disable camelcase */ import { Prisma, ledgerConfig, @@ -566,4 +566,31 @@ export class AgentServiceRepository { throw error; } } + + /** + * update tenant token + * @param orgId + * @param token + * @returns updated org_agents + * @throws NotFoundException if the orgId does not exist + * @throws Error if there is an issue updating the org_agents + */ + // eslint-disable-next-line camelcase + async updateTenantToken(orgId: string, token: string): Promise { + try { + const updatedAgent = await this.prisma.org_agents.update({ + where: { + orgId + }, + data: { + apiKey: token + } + }); + + return updatedAgent; + } catch (error) { + this.logger.error(`[updateTenantToken] - Update tenant records details: ${JSON.stringify(error)}`); + throw error; + } + } } 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..6ef12047c 100644 --- a/apps/api-gateway/src/agent-service/agent-service.controller.ts +++ b/apps/api-gateway/src/agent-service/agent-service.controller.ts @@ -259,7 +259,6 @@ export class AgentController { @Res() res: Response ): Promise { createTenantDto.orgId = orgId; - const tenantDetails = await this.agentService.createTenant(createTenantDto, user); const finalResponse: IResponse = { diff --git a/apps/cloud-wallet/src/cloud-wallet.service.ts b/apps/cloud-wallet/src/cloud-wallet.service.ts index 5dcd378c1..03ab2b50d 100644 --- a/apps/cloud-wallet/src/cloud-wallet.service.ts +++ b/apps/cloud-wallet/src/cloud-wallet.service.ts @@ -31,7 +31,7 @@ import { IConnectionDetailsById, ITenantDetail, ICredentialDetails, - ICreateConnection, + ICreateConnection, IConnectionInvitationResponse, GetAllCloudWalletConnections, IBasicMessage, @@ -61,13 +61,6 @@ export class CloudWalletService { const { agentEndpoint, apiKey, email, walletKey, userId } = configureBaseWalletPayload; try { - const getAgentInfo = await this.commonService.httpGet( - `${agentEndpoint}${CommonConstants.URL_AGENT_GET_ENDPOINT}` - ); - if (!getAgentInfo?.isInitialized) { - throw new BadRequestException(ResponseMessages.cloudWallet.error.notReachable); - } - const existingWalletInfo = await this.cloudWalletRepository.getCloudWalletInfo(email); if (existingWalletInfo) { throw new ConflictException(ResponseMessages.cloudWallet.error.agentAlreadyExist); @@ -99,24 +92,23 @@ export class CloudWalletService { /** * Create connection - * @param createConnection + * @param createConnection * @returns connection details */ async createConnection(createConnection: ICreateConnection): Promise { try { - const { userId, ...connectionPayload } = createConnection; - const [baseWalletDetails, getTenant, decryptedApiKey] = await this._commonCloudWalletInfo(userId); + const [baseWalletDetails, decryptedApiKey] = await this._commonCloudWalletInfo(userId); - delete connectionPayload.email; + delete connectionPayload.email; + const { agentEndpoint } = baseWalletDetails; - const { tenantId } = getTenant; - const { agentEndpoint } = baseWalletDetails; + const url = `${agentEndpoint}${CommonConstants.URL_CONN_INVITE}`; - const url = `${agentEndpoint}${CommonConstants.CLOUD_WALLET_CREATE_CONNECTION_INVITATION}/${tenantId}`; - - const createConnectionDetails = await this.commonService.httpPost(url, connectionPayload, { headers: { authorization: decryptedApiKey } }); - return createConnectionDetails; + const createConnectionDetails = await this.commonService.httpPost(url, connectionPayload, { + headers: { authorization: decryptedApiKey } + }); + return createConnectionDetails; } catch (error) { await this.commonService.handleError(error); throw error; @@ -132,12 +124,10 @@ export class CloudWalletService { const { proofRecordId, comment, filterByNonRevocationRequirements, filterByPresentationPreview, userId } = acceptProofRequest; try { - const [baseWalletDetails, getTenant, decryptedApiKey] = await this._commonCloudWalletInfo(userId); - - const { tenantId } = getTenant; + const [baseWalletDetails, decryptedApiKey] = await this._commonCloudWalletInfo(userId); const { agentEndpoint } = baseWalletDetails; - const url = `${agentEndpoint}${CommonConstants.CLOUD_WALLET_GET_PROOF_REQUEST}/${proofRecordId}${CommonConstants.CLOUD_WALLET_ACCEPT_PROOF_REQUEST}${tenantId}`; + const url = `${agentEndpoint}${CommonConstants.CLOUD_WALLET_GET_PROOF_REQUEST}/${proofRecordId}${CommonConstants.CLOUD_WALLET_ACCEPT_PROOF_REQUEST}`; const proofAcceptRequestPayload = { comment, filterByNonRevocationRequirements, @@ -162,12 +152,9 @@ export class CloudWalletService { async getProofById(proofPrsentationByIdPayload: IGetProofPresentationById): Promise { try { const { proofRecordId, userId } = proofPrsentationByIdPayload; - const [baseWalletDetails, getTenant, decryptedApiKey] = await this._commonCloudWalletInfo(userId); - - const { tenantId } = getTenant; + const [baseWalletDetails, decryptedApiKey] = await this._commonCloudWalletInfo(userId); const { agentEndpoint } = baseWalletDetails; - - const url = `${agentEndpoint}${CommonConstants.CLOUD_WALLET_GET_PROOF_REQUEST}/${proofRecordId}/${tenantId}`; + const url = `${agentEndpoint}${CommonConstants.CLOUD_WALLET_GET_PROOF_REQUEST}/${proofRecordId}}`; const getProofById = await this.commonService.httpGet(url, { headers: { authorization: decryptedApiKey } }); return getProofById; @@ -186,15 +173,9 @@ export class CloudWalletService { try { const { threadId, userId } = proofPresentationPayload; - const [baseWalletDetails, getTenant, decryptedApiKey] = await this._commonCloudWalletInfo(userId); - - const { tenantId } = getTenant; + const [baseWalletDetails, decryptedApiKey] = await this._commonCloudWalletInfo(userId); const { agentEndpoint } = baseWalletDetails; - - const url = `${agentEndpoint}${CommonConstants.CLOUD_WALLET_GET_PROOF_REQUEST}/${tenantId}${ - threadId ? `?threadId=${threadId}` : '' - }`; - + const url = `${agentEndpoint}${CommonConstants.CLOUD_WALLET_GET_PROOF_REQUEST}/${threadId ? `?threadId=${threadId}` : ''}`; const getProofById = await this.commonService.httpGet(url, { headers: { authorization: decryptedApiKey } }); return getProofById; } catch (error) { @@ -208,7 +189,7 @@ export class CloudWalletService { * @param userId * @returns cloud wallet info */ - async _commonCloudWalletInfo(userId: string): Promise<[CloudWallet, CloudWallet, string]> { + async _commonCloudWalletInfo(userId: string): Promise<[CloudWallet, string]> { const baseWalletDetails = await this.cloudWalletRepository.getCloudWalletDetails(CloudWalletType.BASE_WALLET); if (!baseWalletDetails) { @@ -223,14 +204,14 @@ export class CloudWalletService { } const getTenant = await this.cloudWalletRepository.getCloudSubWallet(userId); - + if (!getTenant || !getTenant?.tenantId) { throw new NotFoundException(ResponseMessages.cloudWallet.error.walletRecordNotFound); } const decryptedApiKey = await this.commonService.decryptPassword(getTenant?.agentApiKey); - return [baseWalletDetails, getTenant, decryptedApiKey]; + return [baseWalletDetails, decryptedApiKey]; } /** @@ -253,10 +234,13 @@ export class CloudWalletService { if (checkUserExist) { throw new ConflictException(ResponseMessages.cloudWallet.error.userExist); } - + const baseWalletDetails = await this.cloudWalletRepository.getCloudWalletDetails(CloudWalletType.BASE_WALLET); const { agentEndpoint, agentApiKey } = baseWalletDetails; + if (!agentEndpoint || !agentApiKey) { + throw new NotFoundException(ResponseMessages.cloudWallet.error.notFoundBaseWallet); + } const url = `${agentEndpoint}${CommonConstants.URL_SHAGENT_CREATE_TENANT}`; const decryptedApiKey = await this.commonService.decryptPassword(agentApiKey); @@ -276,7 +260,7 @@ export class CloudWalletService { }); } - const walletKey = await this.commonService.dataEncryption(createCloudWalletResponse.config.walletConfig.key); + const walletKey = await this.commonService.dataEncryption(createCloudWalletResponse.config.walletConfig.token); if (!walletKey) { throw new BadRequestException(ResponseMessages.cloudWallet.error.encryptCloudWalletKey, { @@ -292,7 +276,7 @@ export class CloudWalletService { tenantId: createCloudWalletResponse.id, type: CloudWalletType.SUB_WALLET, userId, - agentApiKey, + agentApiKey: this.commonService.dataEncryption(createCloudWalletResponse.token), agentEndpoint, email, key: walletKey, @@ -321,12 +305,10 @@ export class CloudWalletService { if (!checkUserExist) { throw new ConflictException(ResponseMessages.cloudWallet.error.walletNotExist); } + const [baseWalletDetails, decryptedApiKey] = await this._commonCloudWalletInfo(userId); - const [baseWalletDetails, getTenant, decryptedApiKey] = await this._commonCloudWalletInfo(userId); - - const { tenantId } = getTenant; const { agentEndpoint } = baseWalletDetails; - const url = `${agentEndpoint}${CommonConstants.RECEIVE_INVITATION_BY_URL}${tenantId}`; + const url = `${agentEndpoint}${CommonConstants.RECEIVE_INVITATION_BY_URL}`; const checkCloudWalletAgentHealth = await this.commonService.checkAgentHealth(agentEndpoint, decryptedApiKey); @@ -366,12 +348,10 @@ export class CloudWalletService { if (!checkUserExist) { throw new ConflictException(ResponseMessages.cloudWallet.error.walletNotExist); } - const [baseWalletDetails, getTenant, decryptedApiKey] = await this._commonCloudWalletInfo(userId); - - const { tenantId } = getTenant; + const [baseWalletDetails, decryptedApiKey] = await this._commonCloudWalletInfo(userId); const { agentEndpoint } = baseWalletDetails; - const url = `${agentEndpoint}${CommonConstants.ACCEPT_OFFER}${tenantId}`; + const url = `${agentEndpoint}${CommonConstants.ACCEPT_OFFER}`; const checkCloudWalletAgentHealth = await this.commonService.checkAgentHealth(agentEndpoint, decryptedApiKey); @@ -411,12 +391,10 @@ export class CloudWalletService { if (!checkUserExist) { throw new ConflictException(ResponseMessages.cloudWallet.error.walletNotExist); } - const [baseWalletDetails, getTenant, decryptedApiKey] = await this._commonCloudWalletInfo(userId); - - const { tenantId } = getTenant; + const [baseWalletDetails, decryptedApiKey] = await this._commonCloudWalletInfo(userId); const { agentEndpoint } = baseWalletDetails; - const url = `${agentEndpoint}${CommonConstants.URL_SHAGENT_CREATE_DID}${tenantId}`; + const url = `${agentEndpoint}${CommonConstants.URL_AGENT_WRITE_DID}`; const checkCloudWalletAgentHealth = await this.commonService.checkAgentHealth(agentEndpoint, decryptedApiKey); @@ -449,12 +427,11 @@ export class CloudWalletService { async getDidList(walletDetails: IWalletDetailsForDidList): Promise { try { const { userId } = walletDetails; - const [baseWalletDetails, getTenant, decryptedApiKey] = await this._commonCloudWalletInfo(userId); + const [baseWalletDetails, decryptedApiKey] = await this._commonCloudWalletInfo(userId); - const { tenantId } = getTenant; const { agentEndpoint } = baseWalletDetails; - const url = `${agentEndpoint}${CommonConstants.CLOUD_WALLET_DID_LIST}${tenantId}`; + const url = `${agentEndpoint}${CommonConstants.URL_AGENT_GET_DID}`; const didList = await this.commonService.httpGet(url, { headers: { authorization: decryptedApiKey } }); return didList; @@ -472,14 +449,14 @@ export class CloudWalletService { async getconnectionById(connectionDetails: IConnectionDetailsById): Promise { try { const { userId, connectionId } = connectionDetails; - const [baseWalletDetails, getTenant, decryptedApiKey] = await this._commonCloudWalletInfo(userId); - - const { tenantId } = getTenant; + const [baseWalletDetails, decryptedApiKey] = await this._commonCloudWalletInfo(userId); const { agentEndpoint } = baseWalletDetails; - const url = `${agentEndpoint}${CommonConstants.CLOUD_WALLET_CONNECTION_BY_ID}${connectionId}/${tenantId}`; + const url = `${agentEndpoint}${CommonConstants.CLOUD_WALLET_CONNECTION_BY_ID}/${connectionId}`; - const connectionDetailResponse = await this.commonService.httpGet(url, { headers: { authorization: decryptedApiKey } }); + const connectionDetailResponse = await this.commonService.httpGet(url, { + headers: { authorization: decryptedApiKey } + }); return connectionDetailResponse; } catch (error) { await this.commonService.handleError(error); @@ -487,35 +464,36 @@ export class CloudWalletService { } } - /** + /** * Get connection list by tenant id * @param connectionDetails * @returns Connection Details */ - async getAllconnectionById(connectionDetails: GetAllCloudWalletConnections): Promise { - try { - const { userId, alias, myDid, outOfBandId, theirDid, theirLabel } = connectionDetails; - const [baseWalletDetails, getTenant, decryptedApiKey] = await this._commonCloudWalletInfo(userId); - const urlOptions = { - alias, - myDid, - outOfBandId, - theirDid, - theirLabel - }; - const optionalParameter = await this.commonService.createDynamicUrl(urlOptions); - const { tenantId } = getTenant; - const { agentEndpoint } = baseWalletDetails; - - const url = `${agentEndpoint}${CommonConstants.CLOUD_WALLET_CONNECTION_BY_ID}${tenantId}${optionalParameter}`; - - const connectionDetailList = await this.commonService.httpGet(url, { headers: { authorization: decryptedApiKey } }); - return connectionDetailList; - } catch (error) { - await this.commonService.handleError(error); - throw error; - } + async getAllconnectionById(connectionDetails: GetAllCloudWalletConnections): Promise { + try { + const { userId, alias, myDid, outOfBandId, theirDid, theirLabel } = connectionDetails; + const [baseWalletDetails, decryptedApiKey] = await this._commonCloudWalletInfo(userId); + const urlOptions = { + alias, + myDid, + outOfBandId, + theirDid, + theirLabel + }; + const optionalParameter = await this.commonService.createDynamicUrl(urlOptions); + const { agentEndpoint } = baseWalletDetails; + + const url = `${agentEndpoint}${CommonConstants.CLOUD_WALLET_CONNECTION_BY_ID}${optionalParameter}`; + + const connectionDetailList = await this.commonService.httpGet(url, { + headers: { authorization: decryptedApiKey } + }); + return connectionDetailList; + } catch (error) { + await this.commonService.handleError(error); + throw error; } + } /** * Get credential list by tenant id @@ -525,20 +503,21 @@ export class CloudWalletService { async getCredentialListById(tenantDetails: ITenantDetail): Promise { try { const { userId, connectionId, state, threadId } = tenantDetails; - const [baseWalletDetails, getTenant, decryptedApiKey] = await this._commonCloudWalletInfo(userId); + const [baseWalletDetails, decryptedApiKey] = await this._commonCloudWalletInfo(userId); const urlOptions = { connectionId, state, threadId }; - const {tenantId} = getTenant; - const optionalParameter = await this.commonService.createDynamicUrl(urlOptions); - + const optionalParameter = await this.commonService.createDynamicUrl(urlOptions); + const { agentEndpoint } = baseWalletDetails; - const url = `${agentEndpoint}${CommonConstants.CLOUD_WALLET_CREDENTIAL}/${tenantId}${optionalParameter}`; + const url = `${agentEndpoint}${CommonConstants.CLOUD_WALLET_CREDENTIAL}${optionalParameter}`; - const credentialDetailResponse = await this.commonService.httpGet(url, { headers: { authorization: decryptedApiKey } }); + const credentialDetailResponse = await this.commonService.httpGet(url, { + headers: { authorization: decryptedApiKey } + }); return credentialDetailResponse; } catch (error) { await this.commonService.handleError(error); @@ -554,14 +533,13 @@ export class CloudWalletService { async getCredentialByRecord(credentialDetails: ICredentialDetails): Promise { try { const { userId, credentialRecordId } = credentialDetails; - const [baseWalletDetails, getTenant, decryptedApiKey] = await this._commonCloudWalletInfo(userId); - - const {tenantId} = getTenant; + const [baseWalletDetails, decryptedApiKey] = await this._commonCloudWalletInfo(userId); const { agentEndpoint } = baseWalletDetails; + const url = `${agentEndpoint}${CommonConstants.CLOUD_WALLET_CREDENTIAL}/${credentialRecordId}`; - const url = `${agentEndpoint}${CommonConstants.CLOUD_WALLET_CREDENTIAL}/${credentialRecordId}${tenantId}`; - - const credentialDetailResponse = await this.commonService.httpGet(url, { headers: { authorization: decryptedApiKey } }); + const credentialDetailResponse = await this.commonService.httpGet(url, { + headers: { authorization: decryptedApiKey } + }); return credentialDetailResponse; } catch (error) { await this.commonService.handleError(error); @@ -577,14 +555,14 @@ export class CloudWalletService { async getBasicMessageByConnectionId(connectionDetails: IBasicMessage): Promise { try { const { userId, connectionId } = connectionDetails; - const [baseWalletDetails, getTenant, decryptedApiKey] = await this._commonCloudWalletInfo(userId); - - const {tenantId} = getTenant; + const [baseWalletDetails, decryptedApiKey] = await this._commonCloudWalletInfo(userId); const { agentEndpoint } = baseWalletDetails; - const url = `${agentEndpoint}${CommonConstants.CLOUD_WALLET_BASIC_MESSAGE}${connectionId}/${tenantId}`; + const url = `${agentEndpoint}${CommonConstants.CLOUD_WALLET_BASIC_MESSAGE}${connectionId}`; - const basicMessageResponse = await this.commonService.httpGet(url, { headers: { authorization: decryptedApiKey } }); + const basicMessageResponse = await this.commonService.httpGet(url, { + headers: { authorization: decryptedApiKey } + }); return basicMessageResponse; } catch (error) { await this.commonService.handleError(error); @@ -592,23 +570,25 @@ export class CloudWalletService { } } - /** + /** * Send basic-message by connection id * @param messageDetails * @returns Basic message Details */ - async sendBasicMessage(messageDetails: IBasicMessageDetails): Promise { + async sendBasicMessage(messageDetails: IBasicMessageDetails): Promise { try { const { userId, connectionId, content } = messageDetails; - const [baseWalletDetails, getTenant, decryptedApiKey] = await this._commonCloudWalletInfo(userId); - - const {tenantId} = getTenant; + const [baseWalletDetails, decryptedApiKey] = await this._commonCloudWalletInfo(userId); const { agentEndpoint } = baseWalletDetails; - const url = `${agentEndpoint}${CommonConstants.CLOUD_WALLET_BASIC_MESSAGE}${connectionId}/${tenantId}`; - const basicMessageResponse = await this.commonService.httpPost(url, {content}, { - headers: { authorization: decryptedApiKey } - }); + const url = `${agentEndpoint}${CommonConstants.CLOUD_WALLET_BASIC_MESSAGE}${connectionId}`; + const basicMessageResponse = await this.commonService.httpPost( + url, + { content }, + { + headers: { authorization: decryptedApiKey } + } + ); return basicMessageResponse; } catch (error) { await this.commonService.handleError(error); diff --git a/apps/connection/src/connection.service.ts b/apps/connection/src/connection.service.ts index 0efa7a8bf..3f11dde53 100644 --- a/apps/connection/src/connection.service.ts +++ b/apps/connection/src/connection.service.ts @@ -21,13 +21,18 @@ import { IUserRequest } from '@credebl/user-request/user-request.interface'; import { OrgAgentType, ConnectionProcessState } from '@credebl/enum/enum'; import { Cache } from 'cache-manager'; import { CACHE_MANAGER } from '@nestjs/cache-manager'; -import { IConnectionList, ICreateConnectionUrl, IDeletedConnectionsRecord } from '@credebl/common/interfaces/connection.interface'; +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 { getAgentUrl } from '@credebl/common/common.utils'; @Injectable() export class ConnectionService { constructor( @@ -37,7 +42,7 @@ 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 ) {} /** @@ -98,7 +103,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)}` ); @@ -332,43 +336,6 @@ export class ConnectionService { return this.natsCall(pattern, payload); } - /** - * Description: Fetch agent url - * @param referenceId - * @returns agent URL - */ - async getAgentUrl( - orgAgentType: string, - agentEndPoint: string, - tenantId?: string, - connectionInvitationFlag?: string - ): Promise { - try { - let url; - if ('connection-invitation' === connectionInvitationFlag) { - if (orgAgentType === OrgAgentType.DEDICATED) { - url = `${agentEndPoint}${CommonConstants.URL_CONN_INVITE}`; - } else if (orgAgentType === OrgAgentType.SHARED) { - url = `${agentEndPoint}${CommonConstants.URL_SHAGENT_CREATE_CONNECTION_INVITATION}`.replace('#', tenantId); - } else { - throw new NotFoundException(ResponseMessages.connection.error.agentUrlNotFound); - } - } else { - if (orgAgentType === OrgAgentType.DEDICATED) { - url = `${agentEndPoint}${CommonConstants.URL_CONN_LEGACY_INVITE}`; - } else if (orgAgentType === OrgAgentType.SHARED) { - url = `${agentEndPoint}${CommonConstants.URL_SHAGENT_CREATE_INVITATION}`.replace('#', tenantId); - } else { - throw new NotFoundException(ResponseMessages.connection.error.agentUrlNotFound); - } - } - return url; - } catch (error) { - this.logger.error(`Error in get agent url: ${JSON.stringify(error)}`); - throw error; - } - } - async getQuestionAnswerAgentUrl( label: string, orgAgentType: string, @@ -384,10 +351,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 +363,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 +442,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 +461,6 @@ export class ConnectionService { ): Promise<{ response; }> { - const pattern = { cmd: 'agent-receive-invitation-url' }; const payload = { url, orgId, receiveInvitationUrl }; @@ -644,7 +609,6 @@ export class ConnectionService { */ async createConnectionInvitation(payload: ICreateOutOfbandConnectionInvitation): Promise { try { - const { alias, appendedAttachments, @@ -676,18 +640,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, @@ -705,15 +668,7 @@ export class ConnectionService { recipientKey: recipientKey || undefined, invitationDid: connectionInvitationDid || undefined }; - - const createConnectionInvitationFlag = 'connection-invitation'; - const orgAgentType = await this.connectionRepository.getOrgAgentType(agentDetails?.orgAgentTypeId); - const url = await this.getAgentUrl( - orgAgentType, - agentEndPoint, - agentDetails?.tenantId, - createConnectionInvitationFlag - ); + const url = await getAgentUrl(agentEndPoint, CommonConstants.CONNECTION_INVITATION); const createConnectionInvitation = await this._createOutOfBandConnectionInvitation(connectionPayload, url, orgId); const connectionInvitationUrl = createConnectionInvitation?.response?.invitationUrl; const shortenedUrl = await this.storeConnectionObjectAndReturnUrl( @@ -726,7 +681,7 @@ export class ConnectionService { shortenedUrl, agentId, orgId, - invitationsDid + invitationsDid ); const connectionStorePayload: ConnectionResponseDetail = { id: saveConnectionDetails.id, @@ -785,8 +740,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 +778,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 + }; - const deletedConnectionData = { - deletedConnectionsRecordsCount: deleteConnections?.deleteConnectionRecords?.count, - deletedRecordsStatusCount: filteredStatusCounts - }; + await Promise.all( + deleteConnections.getConnectionRecords.map(async (record) => { + statusCounts[record.state]++; + }) + ); - await this.userActivityRepository._orgDeletedActivity(orgId, user, deletedConnectionData, RecordType.CONNECTION); + const filteredStatusCounts = Object.fromEntries(Object.entries(statusCounts).filter((entry) => 0 < entry[1])); - return deleteConnections; + const deletedConnectionData = { + deletedConnectionsRecordsCount: deleteConnections?.deleteConnectionRecords?.count, + deletedRecordsStatusCount: filteredStatusCounts + }; + 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 +867,4 @@ export class ConnectionService { // eslint-disable-next-line no-return-await return await this.natsCall(pattern, payload); } - } diff --git a/apps/issuance/src/issuance.service.ts b/apps/issuance/src/issuance.service.ts index 7030d2b0c..c315acab2 100644 --- a/apps/issuance/src/issuance.service.ts +++ b/apps/issuance/src/issuance.service.ts @@ -47,7 +47,6 @@ import { import { AutoAccept, IssuanceProcessState, - OrgAgentType, PromiseResult, SchemaType, TemplateIdentifier, @@ -63,7 +62,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, getAgentUrl, paginator } from '@credebl/common/common.utils'; import { InjectQueue } from '@nestjs/bull'; import { Queue } from 'bull'; import { FileUploadStatus, FileUploadType } from 'apps/api-gateway/src/enum'; @@ -185,8 +184,7 @@ export class IssuanceService { throw new NotFoundException(ResponseMessages.issuance.error.orgAgentTypeNotFound); } - const issuanceMethodLabel = 'create-offer'; - const url = await this.getAgentUrl(issuanceMethodLabel, orgAgentType, agentEndPoint, agentDetails?.tenantId); + const url = await getAgentUrl(agentEndPoint, CommonConstants.CREATE_OFFER); if (payload.credentialType === IssueCredentialType.JSONLD) { await validateAndUpdateIssuanceDates(credentialData); @@ -371,10 +369,7 @@ export class IssuanceService { throw new NotFoundException(ResponseMessages.issuance.error.agentEndPointNotFound); } - const orgAgentType = await this.issuanceRepository.getOrgAgentType(agentDetails?.orgAgentTypeId); - - const issuanceMethodLabel = 'create-offer-oob'; - const url = await this.getAgentUrl(issuanceMethodLabel, orgAgentType, agentEndPoint, agentDetails?.tenantId); + const url = await getAgentUrl(agentEndPoint, CommonConstants.CREATE_OFFER_OUT_OF_BAND); let issueData; if (credentialType === IssueCredentialType.INDY) { @@ -687,15 +682,7 @@ export class IssuanceService { throw new NotFoundException(ResponseMessages.issuance.error.agentEndPointNotFound); } - const orgAgentType = await this.issuanceRepository.getOrgAgentType(agentDetails?.orgAgentTypeId); - const issuanceMethodLabel = 'get-issue-credential-by-credential-id'; - const url = await this.getAgentUrl( - issuanceMethodLabel, - orgAgentType, - agentEndPoint, - agentDetails?.tenantId, - credentialRecordId - ); + const url = await getAgentUrl(agentEndPoint, CommonConstants.GET_OFFER_BY_CRED_ID, credentialRecordId); const createConnectionInvitation = await this._getIssueCredentialsbyCredentialRecordId(url, orgId); return createConnectionInvitation?.response; @@ -836,15 +823,8 @@ export class IssuanceService { if (!agentDetails) { throw new NotFoundException(ResponseMessages.issuance.error.agentEndPointNotFound); } - const orgAgentType = await this.issuanceRepository.getOrgAgentType(agentDetails?.orgAgentTypeId); - const issuanceMethodLabel = 'create-offer-oob'; - const url = await this.getAgentUrl( - issuanceMethodLabel, - orgAgentType, - agentDetails.agentEndPoint, - agentDetails.tenantId - ); + const url = await getAgentUrl(agentDetails.agentEndPoint, CommonConstants.CREATE_OFFER_OUT_OF_BAND); const organizationDetails = await this.issuanceRepository.getOrganization(orgId); if (!organizationDetails) { @@ -1131,79 +1111,6 @@ export class IssuanceService { } } - /** - * Description: Fetch agent url - * @param referenceId - * @returns agent URL - */ - async getAgentUrl( - issuanceMethodLabel: string, - orgAgentType: string, - agentEndPoint: string, - tenantId: string, - credentialRecordId?: string - ): Promise { - try { - let url; - switch (issuanceMethodLabel) { - case 'create-offer': { - url = - orgAgentType === OrgAgentType.DEDICATED - ? `${agentEndPoint}${CommonConstants.URL_ISSUE_CREATE_CRED_OFFER_AFJ}` - : orgAgentType === OrgAgentType.SHARED - ? `${agentEndPoint}${CommonConstants.URL_SHAGENT_CREATE_OFFER}`.replace('#', tenantId) - : null; - break; - } - - case 'create-offer-oob': { - url = - orgAgentType === OrgAgentType.DEDICATED - ? `${agentEndPoint}${CommonConstants.URL_OUT_OF_BAND_CREDENTIAL_OFFER}` - : orgAgentType === OrgAgentType.SHARED - ? `${agentEndPoint}${CommonConstants.URL_SHAGENT_CREATE_OFFER_OUT_OF_BAND}`.replace('#', tenantId) - : null; - break; - } - - case 'get-issue-credentials': { - url = - orgAgentType === OrgAgentType.DEDICATED - ? `${agentEndPoint}${CommonConstants.URL_ISSUE_GET_CREDS_AFJ}` - : orgAgentType === OrgAgentType.SHARED - ? `${agentEndPoint}${CommonConstants.URL_SHAGENT_GET_CREDENTIALS}`.replace('#', tenantId) - : null; - break; - } - - case 'get-issue-credential-by-credential-id': { - url = - orgAgentType === OrgAgentType.DEDICATED - ? `${agentEndPoint}${CommonConstants.URL_ISSUE_GET_CREDS_AFJ_BY_CRED_REC_ID}/${credentialRecordId}` - : orgAgentType === OrgAgentType.SHARED - ? `${agentEndPoint}${CommonConstants.URL_SHAGENT_GET_CREDENTIALS_BY_CREDENTIAL_ID}` - .replace('#', credentialRecordId) - .replace('@', tenantId) - : null; - break; - } - - default: { - break; - } - } - - if (!url) { - throw new NotFoundException(ResponseMessages.issuance.error.agentUrlNotFound); - } - - return url; - } catch (error) { - this.logger.error(`Error in get agent url: ${JSON.stringify(error)}`); - throw error; - } - } - async downloadBulkIssuanceCSVTemplate(orgId: string, templateDetails: TemplateDetailsInterface): Promise { try { let schemaResponse: SchemaDetails; diff --git a/apps/verification/src/verification.service.ts b/apps/verification/src/verification.service.ts index ed9b8b0c3..d2eceb264 100644 --- a/apps/verification/src/verification.service.ts +++ b/apps/verification/src/verification.service.ts @@ -27,7 +27,7 @@ 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 { AutoAccept, VerificationProcessState } from '@credebl/enum/enum'; import { ResponseMessages } from '@credebl/common/response-messages'; import * as QRCode from 'qrcode'; import { OutOfBandVerification } from '../templates/out-of-band-verification.template'; @@ -46,11 +46,10 @@ import { ProofRequestLabel, ProofRequestType, ProofVersion, - ProtocolVersionType, - VerificationMethodLabel + ProtocolVersionType } from 'apps/api-gateway/src/verification/enum/verification.enum'; import { UserActivityService } from '@credebl/user-activity'; -import { convertUrlToDeepLinkUrl } from '@credebl/common/common.utils'; +import { convertUrlToDeepLinkUrl, getAgentUrl } from '@credebl/common/common.utils'; import { UserActivityRepository } from 'libs/user-activity/repositories'; import { ISchemaDetail } from '@credebl/common/interfaces/schema.interface'; import { NATSClient } from '@credebl/common/NATSClient'; @@ -226,15 +225,9 @@ export class VerificationService { async getProofPresentationById(proofId: string, orgId: string): Promise { try { const getAgentDetails = await this.verificationRepository.getAgentEndPoint(orgId); - - const verificationMethodLabel = 'get-proof-presentation-by-id'; - const orgAgentType = await this.verificationRepository.getOrgAgentType(getAgentDetails?.orgAgentTypeId); - const url = await this.getAgentUrl( - verificationMethodLabel, - orgAgentType, + const url = await getAgentUrl( getAgentDetails?.agentEndPoint, - getAgentDetails?.tenantId, - '', + CommonConstants.URL_GET_PROOF_PRESENTATION_BY_ID_FLAG, proofId ); @@ -288,15 +281,7 @@ export class VerificationService { try { const comment = requestProof.comment ? requestProof.comment : ''; const getAgentDetails = await this.verificationRepository.getAgentEndPoint(requestProof.orgId); - const orgAgentType = await this.verificationRepository.getOrgAgentType(getAgentDetails?.orgAgentTypeId); - const verificationMethodLabel = VerificationMethodLabel.REQUEST_PROOF; - const url = await this.getAgentUrl( - verificationMethodLabel, - orgAgentType, - getAgentDetails?.agentEndPoint, - getAgentDetails?.tenantId - ); - + const url = await getAgentUrl(getAgentDetails?.agentEndPoint, CommonConstants.REQUEST_PROOF); // Function to create a payload const createPayload = async (connectionId: string): Promise => { const proofRequestPayload = { @@ -417,18 +402,7 @@ export class VerificationService { async verifyPresentation(proofId: string, orgId: string): Promise { try { const getAgentData = await this.verificationRepository.getAgentEndPoint(orgId); - const orgAgentTypeData = await this.verificationRepository.getOrgAgentType(getAgentData?.orgAgentTypeId); - - const verificationMethod = 'accept-presentation'; - - const url = await this.getAgentUrl( - verificationMethod, - orgAgentTypeData, - getAgentData?.agentEndPoint, - getAgentData?.tenantId, - '', - proofId - ); + const url = await getAgentUrl(getAgentData?.agentEndPoint, CommonConstants.ACCEPT_PRESENTATION, proofId); const payload = { orgId, url }; const getProofPresentationById = await this._verifyPresentation(payload); @@ -506,13 +480,9 @@ export class VerificationService { outOfBandRequestProof['label'] = label; - const orgAgentType = await this.verificationRepository.getOrgAgentType(getAgentDetails?.orgAgentTypeId); - const verificationMethodLabel = 'create-request-out-of-band'; - const url = await this.getAgentUrl( - verificationMethodLabel, - orgAgentType, + const url = await getAgentUrl( getAgentDetails?.agentEndPoint, - getAgentDetails?.tenantId + CommonConstants.CREATE_OUT_OF_BAND_PROOF_PRESENTATION ); // Destructuring 'outOfBandRequestProof' to remove emailId, as it is not used while agent operation @@ -786,127 +756,13 @@ export class VerificationService { } } - /** - * Description: Fetch agent url - * @param referenceId - * @returns agent URL - */ - async getAgentUrl( - verificationMethodLabel: string, - orgAgentType: string, - agentEndPoint: string, - tenantId: string, - threadId?: string, - proofPresentationId?: string - ): Promise { - try { - let url; - switch (verificationMethodLabel) { - case 'get-proof-presentation': { - url = - orgAgentType === OrgAgentType.DEDICATED && threadId - ? `${agentEndPoint}${CommonConstants.URL_GET_PROOF_PRESENTATIONS}?threadId=${threadId}` - : orgAgentType === OrgAgentType.SHARED && threadId - ? `${agentEndPoint}${CommonConstants.URL_SHAGENT_GET_PROOFS}?threadId=${threadId}`.replace( - '#', - tenantId - ) - : orgAgentType === OrgAgentType.DEDICATED - ? `${agentEndPoint}${CommonConstants.URL_GET_PROOF_PRESENTATIONS}` - : orgAgentType === OrgAgentType.SHARED - ? `${agentEndPoint}${CommonConstants.URL_SHAGENT_GET_PROOFS}`.replace('#', tenantId) - : null; - break; - } - - case 'get-proof-presentation-by-id': { - url = - orgAgentType === OrgAgentType.DEDICATED - ? `${agentEndPoint}${CommonConstants.URL_GET_PROOF_PRESENTATION_BY_ID}`.replace('#', proofPresentationId) - : orgAgentType === OrgAgentType.SHARED - ? `${agentEndPoint}${CommonConstants.URL_SHAGENT_GET_PROOFS_BY_PRESENTATION_ID}` - .replace('#', proofPresentationId) - .replace('@', tenantId) - : null; - break; - } - - case 'request-proof': { - url = - orgAgentType === OrgAgentType.DEDICATED - ? `${agentEndPoint}${CommonConstants.URL_SEND_PROOF_REQUEST}` - : orgAgentType === OrgAgentType.SHARED - ? `${agentEndPoint}${CommonConstants.URL_SHAGENT_REQUEST_PROOF}`.replace('#', tenantId) - : null; - break; - } - - case 'accept-presentation': { - url = - orgAgentType === OrgAgentType.DEDICATED - ? `${agentEndPoint}${CommonConstants.URL_VERIFY_PRESENTATION}`.replace('#', proofPresentationId) - : orgAgentType === OrgAgentType.SHARED - ? `${agentEndPoint}${CommonConstants.URL_SHAGENT_ACCEPT_PRESENTATION}` - .replace('@', proofPresentationId) - .replace('#', tenantId) - : null; - break; - } - - case 'create-request-out-of-band': { - url = - orgAgentType === OrgAgentType.DEDICATED - ? `${agentEndPoint}${CommonConstants.URL_SEND_OUT_OF_BAND_CREATE_REQUEST}` - : orgAgentType === OrgAgentType.SHARED - ? `${agentEndPoint}${CommonConstants.URL_SHAGENT_OUT_OF_BAND_CREATE_REQUEST}`.replace('#', tenantId) - : null; - break; - } - - case 'get-verified-proof': { - url = - orgAgentType === OrgAgentType.DEDICATED - ? `${agentEndPoint}${CommonConstants.URL_PROOF_FORM_DATA}`.replace('#', proofPresentationId) - : orgAgentType === OrgAgentType.SHARED - ? `${agentEndPoint}${CommonConstants.URL_SHAGENT_PROOF_FORM_DATA}` - .replace('@', proofPresentationId) - .replace('#', tenantId) - : null; - break; - } - - default: { - break; - } - } - - if (!url) { - throw new NotFoundException(ResponseMessages.verification.error.agentUrlNotFound); - } - - return url; - } catch (error) { - this.logger.error(`Error in get agent url: ${JSON.stringify(error)}`); - throw error; - } - } - async getVerifiedProofdetails(proofId: string, orgId: string): Promise { try { const getAgentDetails = await this.verificationRepository.getAgentEndPoint(orgId); - const verificationMethodLabel = 'get-verified-proof'; let credDefId; let schemaId; let certificate; - const orgAgentType = await this.verificationRepository.getOrgAgentType(getAgentDetails?.orgAgentTypeId); - const url = await this.getAgentUrl( - verificationMethodLabel, - orgAgentType, - getAgentDetails?.agentEndPoint, - getAgentDetails?.tenantId, - '', - proofId - ); + const url = await getAgentUrl(getAgentDetails?.agentEndPoint, CommonConstants.GET_VERIFIED_PROOF); const payload = { orgId, url }; diff --git a/libs/common/src/common.constant.ts b/libs/common/src/common.constant.ts index 1698f3f43..3aff75f98 100644 --- a/libs/common/src/common.constant.ts +++ b/libs/common/src/common.constant.ts @@ -23,11 +23,13 @@ export enum CommonConstants { URL_CONN_ACCEPT_CONNECTION_REQUEST = '/connections/#/accept-request', URL_CONN_REMOVE_CONNECTION_BY_ID = '/connections/#/remove', URL_CONN_METADATA = '/connections/#/metadata', - URL_CONN_LEGACY_INVITE = '/oob/create-legacy-invitation', - URL_CONN_INVITE = '/oob/create-invitation', + URL_CONN_LEGACY_INVITE = '/didcomm/oob/create-legacy-invitation', + URL_CONN_INVITE = '/didcomm/oob/create-invitation', URL_RECEIVE_INVITATION_URL = '/oob/receive-invitation-url', URL_RECEIVE_INVITATION = '/oob/receive-invitation', URL_CONN_INVITATION = '/url', + URL_AGENT_TOKEN = '/agent/token', + URL_SHARED_WALLET_TOKEN = '/multi-tenancy/get-token/', // WALLET SERVICES URL_WALLET_CREATE_DID = '/wallet/did/create', @@ -67,12 +69,12 @@ export enum CommonConstants { URL_PUBLISH_REVOCATION = '/issue-credential/publish-revocations', URL_CREATE_ISSUE_CREDENTIAL_OUT_OF_BAND = '/issue-credential/create', URL_CREATE_OUT_OF_BAND_INVITATION = '/out-of-band/create-invitation', - URL_ISSUE_CREATE_CRED_OFFER_AFJ = '/credentials/create-offer', + URL_ISSUANCE_CREATE_OFFER = '/didcomm/credentials/create-offer', // eslint-disable-next-line @typescript-eslint/no-duplicate-enum-values URL_ISSUE_GET_CREDS_AFJ = '/credentials', // eslint-disable-next-line @typescript-eslint/no-duplicate-enum-values - URL_ISSUE_GET_CREDS_AFJ_BY_CRED_REC_ID = '/credentials', - URL_OUT_OF_BAND_CREDENTIAL_OFFER = '/credentials/create-offer-oob', + URL_ISSUE_GET_CREDS_BY_CRED_REC_ID = '/didcomm/credentials/#', + URL_OUT_OF_BAND_CREDENTIAL_OFFER = '/didcomm/credentials/create-offer-oob', URL_ACCEPT_CREDENTIALS = '/credentials/accept-offer', URL_SEND_QUESTION = '/question-answer/question/#', URL_QUESTION_ANSWER_RECORD = '/question-answer', @@ -125,12 +127,12 @@ export enum CommonConstants { URL_SHARED_AGENT_VERIFY_SIGNED_DATA = '/multi-tenancy/credential/verify/#', // PROOF SERVICES - URL_SEND_PROOF_REQUEST = '/proofs/request-proof', + URL_SEND_PROOF_REQUEST = '/didcomm/proofs/request-proof', URL_GET_PROOF_PRESENTATIONS = '/proofs', - URL_GET_PROOF_PRESENTATION_BY_ID = '/proofs/#', - URL_VERIFY_PRESENTATION = '/proofs/#/accept-presentation', - URL_SEND_OUT_OF_BAND_CREATE_REQUEST = '/proofs/create-request-oob', - URL_PROOF_FORM_DATA = '/proofs/#/form-data', + URL_GET_PROOF_PRESENTATION_BY_ID = '/didcomm/proofs/#', + URL_ACCEPT_PRESENTATION = '/didcomm/proofs/#/accept-presentation', + URL_CREATE_OUT_OF_BAND_CREATE_REQUEST = '/didcomm/proofs/create-request-oob', + URL_PROOF_FORM_DATA = '/didcomm/proofs/#/form-data', // server or agent URL_SERVER_STATUS = '/status', @@ -139,8 +141,8 @@ export enum CommonConstants { URL_AGENT_GET_ENDPOINT = '/agent', // sign data from agent - URL_AGENT_SIGN_DATA = '/credential/sign', - URL_AGENT_VERIFY_SIGNED_DATA = '/credential/verify', + URL_AGENT_SIGN_DATA = '/agent/credential/sign/#', + URL_AGENT_VERIFY_SIGNED_DATA = '/agent/credential/verify', // CREATE KEYS CREATE_POLYGON_SECP256k1_KEY = '/polygon/create-keys', @@ -355,13 +357,11 @@ export enum CommonConstants { CACHE_APIKEY_KEY = 'sharedApiKey', CACHE_TTL_SECONDS = 604800, - CLOUD_WALLET_GET_PROOF_REQUEST = '/multi-tenancy/proofs', - CLOUD_WALLET_CREATE_CONNECTION_INVITATION = '/multi-tenancy/create-invitation', - CLOUD_WALLET_ACCEPT_PROOF_REQUEST = '/accept-request/', - CLOUD_WALLET_DID_LIST = '/multi-tenancy/dids/', - CLOUD_WALLET_CONNECTION_BY_ID = '/multi-tenancy/connections/', - CLOUD_WALLET_CREDENTIAL = '/multi-tenancy/credentials', - CLOUD_WALLET_BASIC_MESSAGE = '/multi-tenancy/basic-messages/', + CLOUD_WALLET_GET_PROOF_REQUEST = '/didcomm/proofs', + CLOUD_WALLET_ACCEPT_PROOF_REQUEST = '/accept-request', + CLOUD_WALLET_CONNECTION_BY_ID = '/didcomm/connections', + CLOUD_WALLET_CREDENTIAL = '/didcomm/credentials', + CLOUD_WALLET_BASIC_MESSAGE = '/didcomm/basic-messages/', // Bulk-issuance BATCH_SIZE = 100, @@ -393,9 +393,23 @@ export enum CommonConstants { CLOUD_WALLET_SERVICE = 'cloud-wallet', //CLOUD WALLET - RECEIVE_INVITATION_BY_URL = '/multi-tenancy/receive-invitation-url/', - ACCEPT_OFFER = '/multi-tenancy/credentials/accept-offer/', - SEED_LENGTH = 32 + RECEIVE_INVITATION_BY_URL = '/didcomm/oob/receive-invitation-url', + ACCEPT_OFFER = '/didcomm/credentials/accept-offer', + SEED_LENGTH = 32, + + //Agent URL flags + CONNECTION_INVITATION = 'connection-invitation', + LEGACY_INVITATION = 'legacy-invitation', + SIGN_DATA_FROM_AGENT = 'sign-data-from-agent', + VERIFY_SIGNED_DATA_FROM_AGENT = 'verify-signed-data-from-agent', + CREATE_OFFER = 'create-offer', + CREATE_OFFER_OUT_OF_BAND = 'create-offer-oob', + GET_OFFER_BY_CRED_ID = 'get-offer-by-cred-id', + URL_GET_PROOF_PRESENTATION_BY_ID_FLAG = 'get-proof-presentation-by-id', + REQUEST_PROOF = 'request-proof', + ACCEPT_PRESENTATION = 'accept-presentation', + CREATE_OUT_OF_BAND_PROOF_PRESENTATION = 'create-request-out-of-band', + GET_VERIFIED_PROOF = 'get-verified-proof' } export const MICRO_SERVICE_NAME = Symbol('MICRO_SERVICE_NAME'); export const ATTRIBUTE_NAME_REGEX = /\['(.*?)'\]/; diff --git a/libs/common/src/common.service.ts b/libs/common/src/common.service.ts index 68d251fce..364635720 100644 --- a/libs/common/src/common.service.ts +++ b/libs/common/src/common.service.ts @@ -326,10 +326,10 @@ export class CommonService { orgAgentType === OrgAgentType.DEDICATED ? `${agentEndPoint}${CommonConstants.URL_SEND_BASIC_MESSAGE}`.replace('#', connectionId) : orgAgentType === OrgAgentType.SHARED - ? `${agentEndPoint}${CommonConstants.URL_SHARED_SEND_BASIC_MESSAGE}` - .replace('#', connectionId) - .replace('@', tenantId) - : null; + ? `${agentEndPoint}${CommonConstants.URL_SHARED_SEND_BASIC_MESSAGE}` + .replace('#', connectionId) + .replace('@', tenantId) + : null; break; } @@ -347,4 +347,37 @@ export class CommonService { throw error; } } + + async getBaseAgentToken(agentEndPoint: string, apiKey: string): Promise { + const agentBaseWalletDetils = await this.httpPost( + `${process.env.API_GATEWAY_PROTOCOL}://${agentEndPoint}${CommonConstants.URL_AGENT_TOKEN}`, + '', + { + headers: { + Accept: 'application/json', + Authorization: apiKey + } + } + ); + if (HttpStatus.OK !== agentBaseWalletDetils?.status) { + throw new NotFoundException(ResponseMessages.common.error.invalidEndpoint); + } + return agentBaseWalletDetils.token; + } + + async getTenantWalletToken(agentEndPoint: string, apiKey: string, tenantId: string): Promise { + const tenantWalletDetails = await this.httpPost( + `${process.env.API_GATEWAY_PROTOCOL}://${agentEndPoint}${CommonConstants.URL_SHARED_WALLET_TOKEN}${tenantId}`, + { + headers: { + Accept: 'application/json', + Authorization: apiKey + } + } + ); + if (HttpStatus.OK !== tenantWalletDetails?.status) { + throw new NotFoundException(ResponseMessages.common.error.invalidEndpoint); + } + return tenantWalletDetails.token; + } } diff --git a/libs/common/src/common.utils.ts b/libs/common/src/common.utils.ts index ed84515c3..cfef3dc05 100644 --- a/libs/common/src/common.utils.ts +++ b/libs/common/src/common.utils.ts @@ -5,11 +5,7 @@ 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 -export function paginator( - items: T[], - current_page: number, - items_per_page: number -) { +export function paginator(items: T[], current_page: number, items_per_page: number) { const page: number = Number(current_page) || 1; const per_page: number = Number(items_per_page) || 10; const offset: number = (page - 1) * per_page; @@ -50,11 +46,10 @@ export function orderValues(key, order = 'asc') { }; } - export function convertUrlToDeepLinkUrl(url: string): string { - const deepLinkDomain = process.env.DEEPLINK_DOMAIN - if(!deepLinkDomain) { - throw new NotFoundException(ResponseMessages.shorteningUrl.error.deepLinkDomainNotFound) + const deepLinkDomain = process.env.DEEPLINK_DOMAIN; + if (!deepLinkDomain) { + throw new NotFoundException(ResponseMessages.shorteningUrl.error.deepLinkDomainNotFound); } const deepLinkUrl = deepLinkDomain.concat(url); return deepLinkUrl; @@ -63,11 +58,49 @@ export function convertUrlToDeepLinkUrl(url: string): string { export const networkNamespace = (did: string): string => { // Split the DID into segments using the colon as a delimiter const segments = did.split(':'); - const hasPolygon = segments.some(segment => segment.includes(CommonConstants.POLYGON)); - const hasTestnet = segments.some(segment => segment.includes(CommonConstants.TESTNET)); + const hasPolygon = segments.some((segment) => segment.includes(CommonConstants.POLYGON)); + const hasTestnet = segments.some((segment) => segment.includes(CommonConstants.TESTNET)); if (hasPolygon) { return hasTestnet ? `${segments[1]}:${segments[2]}` : `${segments[1]}:${CommonConstants.MAINNET}`; } return segments[1]; -}; \ No newline at end of file +}; + +export const getAgentUrl = async (agentEndPoint: string, urlFlag: string, paramId?: string): Promise => { + if (!agentEndPoint) { + throw new NotFoundException(ResponseMessages.common.error.invalidEndpoint); + } + + const agentUrlMap: Map = new Map([ + [String(CommonConstants.CONNECTION_INVITATION), String(CommonConstants.URL_CONN_INVITE)], + [String(CommonConstants.LEGACY_INVITATION), String(CommonConstants.URL_CONN_LEGACY_INVITE)], + [String(CommonConstants.SIGN_DATA_FROM_AGENT), String(CommonConstants.URL_AGENT_SIGN_DATA)], + [String(CommonConstants.VERIFY_SIGNED_DATA_FROM_AGENT), String(CommonConstants.URL_AGENT_VERIFY_SIGNED_DATA)], + [String(CommonConstants.CREATE_OFFER), String(CommonConstants.URL_ISSUANCE_CREATE_OFFER)], + [String(CommonConstants.CREATE_OFFER_OUT_OF_BAND), String(CommonConstants.URL_ISSUANCE_CREATE_OFFER)], + [String(CommonConstants.GET_OFFER_BY_CRED_ID), String(CommonConstants.URL_ISSUE_GET_CREDS_BY_CRED_REC_ID)], + [ + String(CommonConstants.URL_GET_PROOF_PRESENTATION_BY_ID_FLAG), + String(CommonConstants.URL_GET_PROOF_PRESENTATION_BY_ID) + ], + [String(CommonConstants.REQUEST_PROOF), String(CommonConstants.URL_SEND_PROOF_REQUEST)], + [String(CommonConstants.ACCEPT_PRESENTATION), String(CommonConstants.URL_ACCEPT_PRESENTATION)], + [ + String(CommonConstants.CREATE_OUT_OF_BAND_PROOF_PRESENTATION), + String(CommonConstants.URL_CREATE_OUT_OF_BAND_CREATE_REQUEST) + ], + [String(CommonConstants.GET_VERIFIED_PROOF), String(CommonConstants.URL_PROOF_FORM_DATA)] + ]); + + const urlSuffix = agentUrlMap.get(urlFlag); + + if (!urlSuffix) { + throw new NotFoundException(ResponseMessages.common.error.invalidUrl); + } + // Add paramId as a path parameter if provided + const resolvedUrlPath = paramId ? urlSuffix.replace('#', paramId) : urlSuffix; + + const url = `${agentEndPoint}${resolvedUrlPath}`; + return url; +}; diff --git a/libs/common/src/response-messages/index.ts b/libs/common/src/response-messages/index.ts index 0c56ef999..04b7239e3 100644 --- a/libs/common/src/response-messages/index.ts +++ b/libs/common/src/response-messages/index.ts @@ -240,6 +240,7 @@ export const ResponseMessages = { ledgerNotFound: 'Ledgers not found', agentNotExists: 'Agent not spun up for this organization', agentDown: 'Agent is down or not spun up', + notConfigured: 'Agent is not configured properly', walletAlreadyCreated: 'Your wallet is already been created', walletAlreadyProcessing: 'Your wallet is already processing', notAbleToSpinp: 'Agent not able to spun up', @@ -270,7 +271,10 @@ export const ResponseMessages = { requiredEndorserDid: 'Role or endorser DID is required', requiredPrivateKey: 'Privatekey is required for polygon method', privateKeyLength: 'Private key must be exactly 64 characters long', - requiredSeed: 'Seed is required' + requiredSeed: 'Seed is required', + baseWalletToken: 'Error while fetching base wallet token', + tenantWalletToken: 'Error while fetching tenant wallet token', + invalidTenantDetails: 'Invalid wallet details provided' } }, connection: { @@ -491,5 +495,11 @@ export const ResponseMessages = { 'No subscribers for the requested message. Error while connecting to NATS, service might not be started', natsConnect: 'Empty response. There are no subscribers listening to that message' } + }, + common: { + error: { + invalidUrl: 'Please check the url suffix.', + invalidEndpoint: 'Invalid agent endpoint provided' + } } }; diff --git a/package.json b/package.json old mode 100755 new mode 100644 From 255236ad09bc80044b2468dcbede87a569acf186 Mon Sep 17 00:00:00 2001 From: Tipu_Singh Date: Wed, 6 Aug 2025 21:57:23 +0530 Subject: [PATCH 10/60] refactor: changes agent endpoint (#1378) Signed-off-by: Tipu_Singh --- .../src/agent-service.service.ts | 49 +++---- apps/connection/src/connection.service.ts | 132 ++---------------- apps/verification/src/verification.service.ts | 2 +- libs/common/src/common.constant.ts | 64 +++------ libs/common/src/common.service.ts | 47 +------ libs/common/src/common.utils.ts | 7 +- libs/common/src/response-messages/index.ts | 4 +- 7 files changed, 62 insertions(+), 243 deletions(-) diff --git a/apps/agent-service/src/agent-service.service.ts b/apps/agent-service/src/agent-service.service.ts index 648dfd947..d0838048b 100644 --- a/apps/agent-service/src/agent-service.service.ts +++ b/apps/agent-service/src/agent-service.service.ts @@ -930,9 +930,7 @@ export class AgentServiceService { } const getApiKey = await this.getOrgAgentApiKey(orgId); - const getOrgAgentType = await this.agentServiceRepository.getOrgAgentType(agentDetails?.orgAgentTypeId); - - const url = this.constructUrl(agentDetails, getOrgAgentType); + const url = this.constructUrl(agentDetails); if (createDidPayload.method === DidMethod.POLYGON) { createDidPayload.endpoint = agentDetails.agentEndPoint; @@ -977,12 +975,8 @@ export class AgentServiceService { } } - private constructUrl(agentDetails, getOrgAgentType): string { - if (getOrgAgentType.agent === OrgAgentType.DEDICATED) { - return `${agentDetails.agentEndPoint}${CommonConstants.URL_AGENT_WRITE_DID}`; - } else if (getOrgAgentType.agent === OrgAgentType.SHARED) { - return `${agentDetails.agentEndPoint}${CommonConstants.URL_SHAGENT_CREATE_DID}${agentDetails.tenantId}`; - } + private constructUrl(agentDetails): string { + return `${agentDetails.agentEndPoint}${CommonConstants.URL_AGENT_WRITE_DID}`; } private async getDidDetails(url, payload, apiKey): Promise { @@ -1053,14 +1047,16 @@ export class AgentServiceService { */ async createSecp256k1KeyPair(orgId: string): Promise { try { - const platformAdminSpinnedUp = await this.agentServiceRepository.platformAdminAgent( - CommonConstants.PLATFORM_ADMIN_ORG - ); - - const getPlatformAgentEndPoint = platformAdminSpinnedUp.org_agents[0].agentEndPoint; - const getDcryptedToken = await this.commonService.decryptPassword(platformAdminSpinnedUp?.org_agents[0].apiKey); + const orgAgentDetails = await this.agentServiceRepository.getAgentApiKey(orgId); + if (!orgAgentDetails) { + throw new NotFoundException(ResponseMessages.agent.error.orgAgentNotFound, { + cause: new Error(), + description: ResponseMessages.errorMessages.notFound + }); + } + const getDcryptedToken = await this.commonService.decryptPassword(orgAgentDetails.apiKey); - const url = `${getPlatformAgentEndPoint}${CommonConstants.CREATE_POLYGON_SECP256k1_KEY}`; + const url = `${orgAgentDetails.agentEndPoint}${CommonConstants.CREATE_POLYGON_SECP256k1_KEY}`; const createKeyPairResponse = await this.commonService.httpPost( url, @@ -1226,7 +1222,7 @@ export class AgentServiceService { }); }); } else if (OrgAgentType.SHARED === payload.agentType) { - const url = `${payload.agentEndPoint}${CommonConstants.URL_SHAGENT_CREATE_SCHEMA}`.replace( + const url = `${payload.agentEndPoint}${CommonConstants.URL_SCHM_CREATE_SCHEMA}`.replace( '#', `${payload.tenantId}` ); @@ -1267,9 +1263,10 @@ export class AgentServiceService { .httpGet(url, { headers: { authorization: getApiKey } }) .then(async (schema) => schema); } else if (OrgAgentType.SHARED === payload.agentType) { - const url = `${payload.agentEndPoint}${CommonConstants.URL_SHAGENT_GET_SCHEMA}` - .replace('@', `${payload.payload.schemaId}`) - .replace('#', `${payload.tenantId}`); + const url = `${payload.agentEndPoint}${CommonConstants.URL_SCHM_GET_SCHEMA_BY_ID}`.replace( + '#', + `${payload.tenantId}` + ); schemaResponse = await this.commonService .httpGet(url, { headers: { authorization: getApiKey } }) @@ -1299,10 +1296,7 @@ export class AgentServiceService { .httpPost(url, credDefPayload, { headers: { authorization: getApiKey } }) .then(async (credDef) => credDef); } else if (OrgAgentType.SHARED === payload.agentType) { - const url = `${payload.agentEndPoint}${CommonConstants.URL_SHAGENT_CREATE_CRED_DEF}`.replace( - '#', - `${payload.tenantId}` - ); + const url = `${payload.agentEndPoint}${CommonConstants.URL_SCHM_CREATE_CRED_DEF}`; const credDefPayload = { tag: payload.payload.tag, schemaId: payload.payload.schemaId, @@ -1334,9 +1328,10 @@ export class AgentServiceService { .httpGet(url, { headers: { authorization: getApiKey } }) .then(async (credDef) => credDef); } else if (OrgAgentType.SHARED === payload.agentType) { - const url = `${payload.agentEndPoint}${CommonConstants.URL_SHAGENT_GET_CRED_DEF}` - .replace('@', `${payload.payload.credentialDefinitionId}`) - .replace('#', `${payload.tenantId}`); + const url = `${payload.agentEndPoint}${CommonConstants.URL_SCHM_GET_CRED_DEF_BY_ID}`.replace( + '#', + `${payload.payload.credentialDefinitionId}` + ); credDefResponse = await this.commonService .httpGet(url, { headers: { authorization: getApiKey } }) .then(async (credDef) => credDef); diff --git a/apps/connection/src/connection.service.ts b/apps/connection/src/connection.service.ts index 3f11dde53..410a3b2ec 100644 --- a/apps/connection/src/connection.service.ts +++ b/apps/connection/src/connection.service.ts @@ -18,7 +18,7 @@ import { 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 { ConnectionProcessState } from '@credebl/enum/enum'; import { Cache } from 'cache-manager'; import { CACHE_MANAGER } from '@nestjs/cache-manager'; import { @@ -188,23 +188,13 @@ export class ConnectionService { try { const { alias, myDid, outOfBandId, state, theirDid, theirLabel } = connectionSearchCriteria; const agentDetails = await this.connectionRepository.getAgentEndPoint(orgId); - const orgAgentType = await this.connectionRepository.getOrgAgentType(agentDetails?.orgAgentTypeId); const { agentEndPoint } = agentDetails; if (!agentDetails) { throw new NotFoundException(ResponseMessages.issuance.error.agentEndPointNotFound); } let url: string; - if (orgAgentType === OrgAgentType.DEDICATED) { - url = `${agentEndPoint}${CommonConstants.URL_CONN_GET_CONNECTIONS}`; - } else if (orgAgentType === OrgAgentType.SHARED) { - url = `${agentEndPoint}${CommonConstants.URL_SHAGENT_GET_CREATEED_INVITATIONS}`.replace( - '#', - agentDetails.tenantId - ); - } else { - throw new NotFoundException(ResponseMessages.connection.error.agentUrlNotFound); - } + url = `${agentEndPoint}${CommonConstants.URL_CONN_GET_CONNECTIONS}`; //Create the dynamic URL for Search Criteria const criteriaParams = []; @@ -263,24 +253,11 @@ export class ConnectionService { async getConnectionsById(user: IUserRequest, connectionId: string, orgId: string): Promise { try { const agentDetails = await this.connectionRepository.getAgentEndPoint(orgId); - const orgAgentType = await this.connectionRepository.getOrgAgentType(agentDetails?.orgAgentTypeId); - const { agentEndPoint } = agentDetails; if (!agentDetails) { throw new NotFoundException(ResponseMessages.issuance.error.agentEndPointNotFound); } - - let url; - if (orgAgentType === OrgAgentType.DEDICATED) { - url = `${agentEndPoint}${CommonConstants.URL_CONN_GET_CONNECTION_BY_ID}`.replace('#', connectionId); - } else if (orgAgentType === OrgAgentType.SHARED) { - url = `${agentEndPoint}${CommonConstants.URL_SHAGENT_GET_CREATEED_INVITATION_BY_CONNECTIONID}` - .replace('#', connectionId) - .replace('@', agentDetails.tenantId); - } else { - throw new NotFoundException(ResponseMessages.connection.error.agentUrlNotFound); - } - + const url = `${agentEndPoint}${CommonConstants.URL_CONN_GET_CONNECTION_BY_ID}`.replace('#', connectionId); const createConnectionInvitation = await this._getConnectionsByConnectionId(url, orgId); return createConnectionInvitation?.response; } catch (error) { @@ -301,14 +278,11 @@ export class ConnectionService { async getQuestionAnswersRecord(orgId: string): Promise { try { const agentDetails = await this.connectionRepository.getAgentEndPoint(orgId); - const orgAgentType = await this.connectionRepository.getOrgAgentType(agentDetails?.orgAgentTypeId); const { agentEndPoint } = agentDetails; if (!agentDetails) { throw new NotFoundException(ResponseMessages.issuance.error.agentEndPointNotFound); } - - const label = 'get-question-answer-record'; - const url = await this.getQuestionAnswerAgentUrl(label, orgAgentType, agentEndPoint, agentDetails?.tenantId); + const url = await getAgentUrl(agentEndPoint, CommonConstants.GET_QUESTION_ANSWER_RECORD); const record = await this._getQuestionAnswersRecord(url, orgId); return record; @@ -336,54 +310,6 @@ export class ConnectionService { return this.natsCall(pattern, payload); } - async getQuestionAnswerAgentUrl( - label: string, - orgAgentType: string, - agentEndPoint: string, - tenantId?: string, - connectionId?: string - ): Promise { - try { - let url; - switch (label) { - case 'send-question': { - url = - orgAgentType === OrgAgentType.DEDICATED - ? `${agentEndPoint}${CommonConstants.URL_SEND_QUESTION}`.replace('#', connectionId) - : orgAgentType === OrgAgentType.SHARED - ? `${agentEndPoint}${CommonConstants.URL_SHAGENT_SEND_QUESTION}` - .replace('#', connectionId) - .replace('@', tenantId) - : null; - break; - } - - case 'get-question-answer-record': { - url = - orgAgentType === OrgAgentType.DEDICATED - ? `${agentEndPoint}${CommonConstants.URL_QUESTION_ANSWER_RECORD}` - : orgAgentType === OrgAgentType.SHARED - ? `${agentEndPoint}${CommonConstants.URL_SHAGENT_QUESTION_ANSWER_RECORD}`.replace('#', tenantId) - : null; - break; - } - - default: { - break; - } - } - - if (!url) { - throw new NotFoundException(ResponseMessages.issuance.error.agentUrlNotFound); - } - - return url; - } catch (error) { - this.logger.error(`Error get question answer agent Url: ${JSON.stringify(error)}`); - throw error; - } - } - async _getOrgAgentApiKey(orgId: string): Promise<{ response: string; }> { @@ -411,25 +337,11 @@ export class ConnectionService { ): Promise { try { const agentDetails = await this.connectionRepository.getAgentEndPoint(orgId); - const orgAgentType = await this.connectionRepository.getOrgAgentType(agentDetails?.orgAgentTypeId); - const { agentEndPoint } = agentDetails; if (!agentDetails) { throw new NotFoundException(ResponseMessages.issuance.error.agentEndPointNotFound); } - - let url; - if (orgAgentType === OrgAgentType.DEDICATED) { - url = `${agentEndPoint}${CommonConstants.URL_RECEIVE_INVITATION_URL}`; - } else if (orgAgentType === OrgAgentType.SHARED) { - url = `${agentEndPoint}${CommonConstants.URL_SHAGENT_RECEIVE_INVITATION_URL}`.replace( - '#', - agentDetails.tenantId - ); - } else { - throw new NotFoundException(ResponseMessages.connection.error.agentUrlNotFound); - } - + const url = `${agentEndPoint}${CommonConstants.URL_RECEIVE_INVITATION_URL}`; const createConnectionInvitation = await this._receiveInvitationUrl(url, orgId, receiveInvitationUrl); return createConnectionInvitation.response; } catch (error) { @@ -485,22 +397,11 @@ export class ConnectionService { ): Promise { try { const agentDetails = await this.connectionRepository.getAgentEndPoint(orgId); - const orgAgentType = await this.connectionRepository.getOrgAgentType(agentDetails?.orgAgentTypeId); - const { agentEndPoint } = agentDetails; if (!agentDetails) { throw new NotFoundException(ResponseMessages.issuance.error.agentEndPointNotFound); } - - let url; - if (orgAgentType === OrgAgentType.DEDICATED) { - url = `${agentEndPoint}${CommonConstants.URL_RECEIVE_INVITATION}`; - } else if (orgAgentType === OrgAgentType.SHARED) { - url = `${agentEndPoint}${CommonConstants.URL_SHAGENT_RECEIVE_INVITATION}`.replace('#', agentDetails.tenantId); - } else { - throw new NotFoundException(ResponseMessages.connection.error.agentUrlNotFound); - } - + const url = `${agentEndPoint}${CommonConstants.URL_RECEIVE_INVITATION}`; const createConnectionInvitation = await this._receiveInvitation(url, orgId, receiveInvitation); return createConnectionInvitation?.response; } catch (error) { @@ -553,15 +454,7 @@ export class ConnectionService { question }; - const orgAgentType = await this.connectionRepository.getOrgAgentType(agentDetails?.orgAgentTypeId); - const label = 'send-question'; - const url = await this.getQuestionAnswerAgentUrl( - label, - orgAgentType, - agentEndPoint, - agentDetails?.tenantId, - connectionId - ); + const url = await getAgentUrl(agentEndPoint, CommonConstants.SEND_QUESTION, connectionId); const createQuestion = await this._sendQuestion(questionPayload, url, orgId); return createQuestion; @@ -833,16 +726,7 @@ export class ConnectionService { const questionPayload = { content }; - - const organizationAgentType = await this.connectionRepository.getOrgAgentType(agentDetails?.orgAgentTypeId); - const label = 'send-basic-message'; - const agentUrl = await this.commonService.sendBasicMessageAgentUrl( - label, - organizationAgentType, - agentEndPoint, - agentDetails?.tenantId, - connectionId - ); + const agentUrl = await getAgentUrl(agentEndPoint, CommonConstants.SEND_BASIC_MESSAGE, connectionId); const sendBasicMessage = await this._sendBasicMessageToAgent(questionPayload, agentUrl, orgId); return sendBasicMessage; diff --git a/apps/verification/src/verification.service.ts b/apps/verification/src/verification.service.ts index d2eceb264..86657a266 100644 --- a/apps/verification/src/verification.service.ts +++ b/apps/verification/src/verification.service.ts @@ -762,7 +762,7 @@ export class VerificationService { let credDefId; let schemaId; let certificate; - const url = await getAgentUrl(getAgentDetails?.agentEndPoint, CommonConstants.GET_VERIFIED_PROOF); + const url = await getAgentUrl(getAgentDetails?.agentEndPoint, CommonConstants.GET_VERIFIED_PROOF, proofId); const payload = { orgId, url }; diff --git a/libs/common/src/common.constant.ts b/libs/common/src/common.constant.ts index 3aff75f98..4925f4b01 100644 --- a/libs/common/src/common.constant.ts +++ b/libs/common/src/common.constant.ts @@ -15,8 +15,8 @@ export enum CommonConstants { RESP_CONFLICT = 409, // URL constants for various GET/POST calls // CONNECTION SERVICES - URL_CONN_GET_CONNECTIONS = '/connections', - URL_CONN_GET_CONNECTION_BY_ID = '/connections/#', + URL_CONN_GET_CONNECTIONS = '/didcomm/connections', + URL_CONN_GET_CONNECTION_BY_ID = '/didcomm/connections/#', URL_CONN_CREATE_CONNECTION_INVITE = '/connections/create-invitation', URL_CONN_RECEIVE_CONNECTION_INVITE = '/connections/receive-invitation', URL_CONN_ACCEPT_CONNECTION_INVITE = '/connections/#/accept-invitation', @@ -25,8 +25,8 @@ export enum CommonConstants { URL_CONN_METADATA = '/connections/#/metadata', URL_CONN_LEGACY_INVITE = '/didcomm/oob/create-legacy-invitation', URL_CONN_INVITE = '/didcomm/oob/create-invitation', - URL_RECEIVE_INVITATION_URL = '/oob/receive-invitation-url', - URL_RECEIVE_INVITATION = '/oob/receive-invitation', + URL_RECEIVE_INVITATION_URL = '/didcomm/oob/receive-invitation-url', + URL_RECEIVE_INVITATION = '/didcomm/oob/receive-invitation', URL_CONN_INVITATION = '/url', URL_AGENT_TOKEN = '/agent/token', URL_SHARED_WALLET_TOKEN = '/multi-tenancy/get-token/', @@ -76,17 +76,15 @@ export enum CommonConstants { URL_ISSUE_GET_CREDS_BY_CRED_REC_ID = '/didcomm/credentials/#', URL_OUT_OF_BAND_CREDENTIAL_OFFER = '/didcomm/credentials/create-offer-oob', URL_ACCEPT_CREDENTIALS = '/credentials/accept-offer', - URL_SEND_QUESTION = '/question-answer/question/#', - URL_QUESTION_ANSWER_RECORD = '/question-answer', - URL_SEND_BASIC_MESSAGE = '/basic-messages/#', + URL_SEND_QUESTION = '/didcomm/question-answer/question/#', + URL_QUESTION_ANSWER_RECORD = '/didcomm/question-answer', + URL_SEND_BASIC_MESSAGE = '/didcomm/basic-messages/#', // SCHEMA & CRED DEF SERVICES - URL_SCHM_CREATE_SCHEMA = '/schemas', - URL_SCHM_GET_SCHEMA_BY_ID = '/schemas/#', - URL_SCHM_GET_SCHEMA_BY_ATTRB = '/schemas/created', - URL_SCHM_CREATE_CRED_DEF = '/credential-definitions', - URL_SCHM_GET_CRED_DEF_BY_ID = '/credential-definitions/#', - URL_SCHM_GET_CRED_DEF_BY_ATTRB = '/credential-definitions/created', + URL_SCHM_CREATE_SCHEMA = '/anoncreds/schemas', + URL_SCHM_GET_SCHEMA_BY_ID = '/anoncreds/schemas/#', + URL_SCHM_CREATE_CRED_DEF = '/anoncreds/credential-definitions', + URL_SCHM_GET_CRED_DEF_BY_ID = '/anoncreds/credential-definitions/#', // POLYGON BASED W3C SCHEMAS DEDICATED_CREATE_POLYGON_W3C_SCHEMA = '/polygon/create-schema', @@ -94,37 +92,7 @@ export enum CommonConstants { // SHARED AGENT URL_SHAGENT_CREATE_TENANT = '/multi-tenancy/create-tenant', - URL_SHAGENT_CREATE_DID = '/multi-tenancy/create-did/', - URL_SHAGENT_WITH_TENANT_AGENT = '/multi-tenancy/with-tenant-agent', - URL_SHAGENT_CREATE_SCHEMA = '/multi-tenancy/schema/#', - URL_SHAGENT_GET_SCHEMA = '/multi-tenancy/schema/@/#', - URL_SHAGENT_CREATE_CRED_DEF = '/multi-tenancy/credential-definition/#', - URL_SHAGENT_GET_CRED_DEF = '/multi-tenancy/credential-definition/@/#', - URL_SHAGENT_CREATE_INVITATION = '/multi-tenancy/create-legacy-invitation/#', - URL_SHAGENT_CREATE_CONNECTION_INVITATION = '/multi-tenancy/create-invitation/#', - URL_SHAGENT_GET_CREATEED_INVITATIONS = '/multi-tenancy/connections/#', - URL_SHAGENT_GET_CREATEED_INVITATION_BY_CONNECTIONID = '/multi-tenancy/connections/#/@', - URL_SHAGENT_CREATE_OFFER = '/multi-tenancy/credentials/create-offer/#', - URL_SHAGENT_CREATE_OFFER_OUT_OF_BAND = '/multi-tenancy/credentials/create-offer-oob/#', - URL_SHAGENT_GET_CREDENTIALS = '/multi-tenancy/credentials/#', - URL_SHAGENT_GET_CREDENTIALS_BY_CREDENTIAL_ID = '/multi-tenancy/credentials/#/@', - URL_SHAGENT_GET_PROOFS = '/multi-tenancy/proofs/#', - URL_SHAGENT_GET_PROOFS_BY_PRESENTATION_ID = '/multi-tenancy/proofs/#/@', - URL_SHAGENT_REQUEST_PROOF = '/multi-tenancy/proofs/request-proof/#', - URL_SHAGENT_ACCEPT_PRESENTATION = '/multi-tenancy/proofs/@/accept-presentation/#', - URL_SHAGENT_OUT_OF_BAND_CREATE_REQUEST = '/multi-tenancy/proofs/create-request-oob/#', - URL_SHAGENT_PROOF_FORM_DATA = '/multi-tenancy/form-data/#/@', - URL_SHAGENT_ACCEPT_OFFER = '/multi-tenancy/credentials/accept-offer/#', - URL_SHAGENT_RECEIVE_INVITATION_URL = '/multi-tenancy/receive-invitation-url/#', - URL_SHAGENT_RECEIVE_INVITATION = '/multi-tenancy/receive-invitation/#', - URL_SHAGENT_SEND_QUESTION = '/multi-tenancy/question-answer/question/#/@', - URL_SHAGENT_SEND_ANSWER = '/multi-tenancy/question-answer/answer/#/@', - URL_SHAGENT_QUESTION_ANSWER_RECORD = '/multi-tenancy/question-answer/#', URL_SHAGENT_DELETE_SUB_WALLET = '/multi-tenancy/#', - URL_SHARED_SEND_BASIC_MESSAGE = '/multi-tenancy/basic-messages/#/@', - URL_SHAGENT_ACCEPT_PROOF_REQUEST = '/multi-tenancy/proofs/#/accept-request/@', - URL_SHARED_AGENT_SIGN_DATA = '/multi-tenancy/credential/sign/#', - URL_SHARED_AGENT_VERIFY_SIGNED_DATA = '/multi-tenancy/credential/verify/#', // PROOF SERVICES URL_SEND_PROOF_REQUEST = '/didcomm/proofs/request-proof', @@ -359,7 +327,10 @@ export enum CommonConstants { CLOUD_WALLET_GET_PROOF_REQUEST = '/didcomm/proofs', CLOUD_WALLET_ACCEPT_PROOF_REQUEST = '/accept-request', + // eslint-disable-next-line @typescript-eslint/no-duplicate-enum-values CLOUD_WALLET_CONNECTION_BY_ID = '/didcomm/connections', + // eslint-disable-next-line @typescript-eslint/no-duplicate-enum-values + RECEIVE_INVITATION_BY_URL = '/didcomm/oob/receive-invitation-url', CLOUD_WALLET_CREDENTIAL = '/didcomm/credentials', CLOUD_WALLET_BASIC_MESSAGE = '/didcomm/basic-messages/', @@ -392,8 +363,6 @@ export enum CommonConstants { GEO_LOCATION_SERVICE = 'geo-location', CLOUD_WALLET_SERVICE = 'cloud-wallet', - //CLOUD WALLET - RECEIVE_INVITATION_BY_URL = '/didcomm/oob/receive-invitation-url', ACCEPT_OFFER = '/didcomm/credentials/accept-offer', SEED_LENGTH = 32, @@ -409,7 +378,10 @@ export enum CommonConstants { REQUEST_PROOF = 'request-proof', ACCEPT_PRESENTATION = 'accept-presentation', CREATE_OUT_OF_BAND_PROOF_PRESENTATION = 'create-request-out-of-band', - GET_VERIFIED_PROOF = 'get-verified-proof' + GET_VERIFIED_PROOF = 'get-verified-proof', + GET_QUESTION_ANSWER_RECORD = 'get-question-answer-record', + SEND_QUESTION = 'send-question', + SEND_BASIC_MESSAGE = 'send-basic-message' } export const MICRO_SERVICE_NAME = Symbol('MICRO_SERVICE_NAME'); export const ATTRIBUTE_NAME_REGEX = /\['(.*?)'\]/; diff --git a/libs/common/src/common.service.ts b/libs/common/src/common.service.ts index 364635720..7650f043d 100644 --- a/libs/common/src/common.service.ts +++ b/libs/common/src/common.service.ts @@ -13,7 +13,6 @@ import { HttpService } from '@nestjs/axios'; import * as dotenv from 'dotenv'; import { ResponseMessages } from './response-messages'; import { IFormattedResponse, IOptionalParams } from './interfaces/interface'; -import { OrgAgentType } from '../../enum/src/enum'; import { RpcException } from '@nestjs/microservices'; dotenv.config(); @@ -311,43 +310,6 @@ export class CommonService { } } - async sendBasicMessageAgentUrl( - label: string, - orgAgentType: string, - agentEndPoint: string, - tenantId?: string, - connectionId?: string - ): Promise { - try { - let url; - switch (label) { - case 'send-basic-message': { - url = - orgAgentType === OrgAgentType.DEDICATED - ? `${agentEndPoint}${CommonConstants.URL_SEND_BASIC_MESSAGE}`.replace('#', connectionId) - : orgAgentType === OrgAgentType.SHARED - ? `${agentEndPoint}${CommonConstants.URL_SHARED_SEND_BASIC_MESSAGE}` - .replace('#', connectionId) - .replace('@', tenantId) - : null; - break; - } - - default: { - break; - } - } - - if (!url) { - throw new NotFoundException(ResponseMessages.issuance.error.agentUrlNotFound); - } - return url; - } catch (error) { - this.logger.error(`Error in getting basic-message Url: ${JSON.stringify(error)}`); - throw error; - } - } - async getBaseAgentToken(agentEndPoint: string, apiKey: string): Promise { const agentBaseWalletDetils = await this.httpPost( `${process.env.API_GATEWAY_PROTOCOL}://${agentEndPoint}${CommonConstants.URL_AGENT_TOKEN}`, @@ -359,8 +321,8 @@ export class CommonService { } } ); - if (HttpStatus.OK !== agentBaseWalletDetils?.status) { - throw new NotFoundException(ResponseMessages.common.error.invalidEndpoint); + if (!agentBaseWalletDetils) { + throw new NotFoundException(ResponseMessages.common.error.fetchBaseWalletToken); } return agentBaseWalletDetils.token; } @@ -368,6 +330,7 @@ export class CommonService { async getTenantWalletToken(agentEndPoint: string, apiKey: string, tenantId: string): Promise { const tenantWalletDetails = await this.httpPost( `${process.env.API_GATEWAY_PROTOCOL}://${agentEndPoint}${CommonConstants.URL_SHARED_WALLET_TOKEN}${tenantId}`, + {}, { headers: { Accept: 'application/json', @@ -375,8 +338,8 @@ export class CommonService { } } ); - if (HttpStatus.OK !== tenantWalletDetails?.status) { - throw new NotFoundException(ResponseMessages.common.error.invalidEndpoint); + if (!tenantWalletDetails) { + throw new NotFoundException(ResponseMessages.common.error.fetchTenantWalletToken); } return tenantWalletDetails.token; } diff --git a/libs/common/src/common.utils.ts b/libs/common/src/common.utils.ts index cfef3dc05..938e795c3 100644 --- a/libs/common/src/common.utils.ts +++ b/libs/common/src/common.utils.ts @@ -78,7 +78,7 @@ export const getAgentUrl = async (agentEndPoint: string, urlFlag: string, paramI [String(CommonConstants.SIGN_DATA_FROM_AGENT), String(CommonConstants.URL_AGENT_SIGN_DATA)], [String(CommonConstants.VERIFY_SIGNED_DATA_FROM_AGENT), String(CommonConstants.URL_AGENT_VERIFY_SIGNED_DATA)], [String(CommonConstants.CREATE_OFFER), String(CommonConstants.URL_ISSUANCE_CREATE_OFFER)], - [String(CommonConstants.CREATE_OFFER_OUT_OF_BAND), String(CommonConstants.URL_ISSUANCE_CREATE_OFFER)], + [String(CommonConstants.CREATE_OFFER_OUT_OF_BAND), String(CommonConstants.URL_OUT_OF_BAND_CREDENTIAL_OFFER)], [String(CommonConstants.GET_OFFER_BY_CRED_ID), String(CommonConstants.URL_ISSUE_GET_CREDS_BY_CRED_REC_ID)], [ String(CommonConstants.URL_GET_PROOF_PRESENTATION_BY_ID_FLAG), @@ -90,7 +90,10 @@ export const getAgentUrl = async (agentEndPoint: string, urlFlag: string, paramI String(CommonConstants.CREATE_OUT_OF_BAND_PROOF_PRESENTATION), String(CommonConstants.URL_CREATE_OUT_OF_BAND_CREATE_REQUEST) ], - [String(CommonConstants.GET_VERIFIED_PROOF), String(CommonConstants.URL_PROOF_FORM_DATA)] + [String(CommonConstants.GET_VERIFIED_PROOF), String(CommonConstants.URL_PROOF_FORM_DATA)], + [String(CommonConstants.GET_QUESTION_ANSWER_RECORD), String(CommonConstants.URL_QUESTION_ANSWER_RECORD)], + [String(CommonConstants.SEND_QUESTION), String(CommonConstants.URL_SEND_QUESTION)], + [String(CommonConstants.SEND_BASIC_MESSAGE), String(CommonConstants.URL_SEND_BASIC_MESSAGE)] ]); const urlSuffix = agentUrlMap.get(urlFlag); diff --git a/libs/common/src/response-messages/index.ts b/libs/common/src/response-messages/index.ts index 04b7239e3..3205a4a24 100644 --- a/libs/common/src/response-messages/index.ts +++ b/libs/common/src/response-messages/index.ts @@ -499,7 +499,9 @@ export const ResponseMessages = { common: { error: { invalidUrl: 'Please check the url suffix.', - invalidEndpoint: 'Invalid agent endpoint provided' + invalidEndpoint: 'Invalid agent endpoint provided', + fetchBaseWalletToken: 'Error while fetching base wallet token', + fetchTenantWalletToken: 'Error while fetching tenant wallet token' } } }; From 259395136134545a992d79d55d6aea842d8773c1 Mon Sep 17 00:00:00 2001 From: Tipu_Singh Date: Thu, 7 Aug 2025 11:31:33 +0530 Subject: [PATCH 11/60] refactore: schema id in get schema (#1379) * fix: schema by id Signed-off-by: Tipu_Singh * fix: schema by id Signed-off-by: Tipu_Singh --------- Signed-off-by: Tipu_Singh --- apps/agent-service/src/agent-service.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/agent-service/src/agent-service.service.ts b/apps/agent-service/src/agent-service.service.ts index d0838048b..b1daa0053 100644 --- a/apps/agent-service/src/agent-service.service.ts +++ b/apps/agent-service/src/agent-service.service.ts @@ -1265,7 +1265,7 @@ export class AgentServiceService { } else if (OrgAgentType.SHARED === payload.agentType) { const url = `${payload.agentEndPoint}${CommonConstants.URL_SCHM_GET_SCHEMA_BY_ID}`.replace( '#', - `${payload.tenantId}` + `${payload.payload.schemaId}` ); schemaResponse = await this.commonService From 9deb93ad138ce785aa0194c4967595c1a737c93d Mon Sep 17 00:00:00 2001 From: Tipu_Singh Date: Thu, 7 Aug 2025 15:05:45 +0530 Subject: [PATCH 12/60] refactor: token API for tenant and create keypair (#1380) * fix: schema by id Signed-off-by: Tipu_Singh * fix: schema by id Signed-off-by: Tipu_Singh * fix: duplicate URL creation Signed-off-by: Tipu_Singh * fix: added await in common method Signed-off-by: Tipu_Singh * fix: added logic for get token Signed-off-by: Tipu_Singh * fix: polygon routes Signed-off-by: Tipu_Singh --------- Signed-off-by: Tipu_Singh --- .../src/agent-service.service.ts | 18 ++++++------- apps/ledger/src/schema/schema.service.ts | 12 +-------- libs/common/src/common.constant.ts | 3 +-- libs/common/src/common.service.ts | 27 ++++++++++++------- 4 files changed, 27 insertions(+), 33 deletions(-) diff --git a/apps/agent-service/src/agent-service.service.ts b/apps/agent-service/src/agent-service.service.ts index b1daa0053..ae092b204 100644 --- a/apps/agent-service/src/agent-service.service.ts +++ b/apps/agent-service/src/agent-service.service.ts @@ -1047,17 +1047,15 @@ export class AgentServiceService { */ async createSecp256k1KeyPair(orgId: string): Promise { try { - const orgAgentDetails = await this.agentServiceRepository.getAgentApiKey(orgId); - if (!orgAgentDetails) { - throw new NotFoundException(ResponseMessages.agent.error.orgAgentNotFound, { - cause: new Error(), - description: ResponseMessages.errorMessages.notFound - }); - } - const getDcryptedToken = await this.commonService.decryptPassword(orgAgentDetails.apiKey); + const platformAdminSpinnedUp = await this.agentServiceRepository.platformAdminAgent( + CommonConstants.PLATFORM_ADMIN_ORG + ); - const url = `${orgAgentDetails.agentEndPoint}${CommonConstants.CREATE_POLYGON_SECP256k1_KEY}`; + const getPlatformAgentEndPoint = platformAdminSpinnedUp.org_agents[0].agentEndPoint; + const getDcryptedToken = await this.commonService.decryptPassword(platformAdminSpinnedUp?.org_agents[0].apiKey); + const url = `${getPlatformAgentEndPoint}${CommonConstants.CREATE_POLYGON_SECP256k1_KEY}`; + this.logger.log(`Creating Secp256k1 key pair at URL: ${url}`); const createKeyPairResponse = await this.commonService.httpPost( url, {}, @@ -1881,7 +1879,7 @@ export class AgentServiceService { } const walletDetails: WalletDetails = { agentEndPoint: platformAdminSpinnedUp.org_agents[0]?.agentEndPoint, - apiKey: platformAdminSpinnedUp.org_agents[0]?.apiKey, + apiKey: await this.commonService.decryptPassword(platformAdminSpinnedUp.org_agents[0]?.apiKey), tenantId: orgAgentDetails.tenantId, orgId: orgAgentDetails.orgId }; diff --git a/apps/ledger/src/schema/schema.service.ts b/apps/ledger/src/schema/schema.service.ts index a640cbc23..f3f7bd5a2 100644 --- a/apps/ledger/src/schema/schema.service.ts +++ b/apps/ledger/src/schema/schema.service.ts @@ -297,17 +297,7 @@ export class SchemaService extends BaseService { description: ResponseMessages.errorMessages.badRequest }); } - - const getAgentDetails = await this.schemaRepository.getAgentType(orgId); - const orgAgentType = await this.schemaRepository.getOrgAgentType(getAgentDetails.org_agents[0].orgAgentTypeId); - let url; - if (OrgAgentType.DEDICATED === orgAgentType) { - url = `${agentEndPoint}${CommonConstants.DEDICATED_CREATE_POLYGON_W3C_SCHEMA}`; - } else if (OrgAgentType.SHARED === orgAgentType) { - const { tenantId } = await this.schemaRepository.getAgentDetailsByOrgId(orgId); - url = `${agentEndPoint}${CommonConstants.SHARED_CREATE_POLYGON_W3C_SCHEMA}${tenantId}`; - } - + const url = `${agentEndPoint}${CommonConstants.CREATE_POLYGON_W3C_SCHEMA}`; const schemaObject = await w3cSchemaBuilder(attributes, schemaName, description); if (!schemaObject) { throw new BadRequestException(ResponseMessages.schema.error.schemaBuilder, { diff --git a/libs/common/src/common.constant.ts b/libs/common/src/common.constant.ts index 4925f4b01..dd282e009 100644 --- a/libs/common/src/common.constant.ts +++ b/libs/common/src/common.constant.ts @@ -87,8 +87,7 @@ export enum CommonConstants { URL_SCHM_GET_CRED_DEF_BY_ID = '/anoncreds/credential-definitions/#', // POLYGON BASED W3C SCHEMAS - DEDICATED_CREATE_POLYGON_W3C_SCHEMA = '/polygon/create-schema', - SHARED_CREATE_POLYGON_W3C_SCHEMA = '/multi-tenancy/polygon-w3c/schema/', + CREATE_POLYGON_W3C_SCHEMA = '/polygon/create-schema', // SHARED AGENT URL_SHAGENT_CREATE_TENANT = '/multi-tenancy/create-tenant', diff --git a/libs/common/src/common.service.ts b/libs/common/src/common.service.ts index 7650f043d..7d031b7a5 100644 --- a/libs/common/src/common.service.ts +++ b/libs/common/src/common.service.ts @@ -311,16 +311,14 @@ export class CommonService { } async getBaseAgentToken(agentEndPoint: string, apiKey: string): Promise { - const agentBaseWalletDetils = await this.httpPost( - `${process.env.API_GATEWAY_PROTOCOL}://${agentEndPoint}${CommonConstants.URL_AGENT_TOKEN}`, - '', - { - headers: { - Accept: 'application/json', - Authorization: apiKey - } + const normalizedBaseUrl = await this.normalizeUrlWithProtocol(agentEndPoint); + this.logger.log(`Fetching base agent token from ${normalizedBaseUrl}`); + const agentBaseWalletDetils = await this.httpPost(`${normalizedBaseUrl}${CommonConstants.URL_AGENT_TOKEN}`, '', { + headers: { + Accept: 'application/json', + Authorization: apiKey } - ); + }); if (!agentBaseWalletDetils) { throw new NotFoundException(ResponseMessages.common.error.fetchBaseWalletToken); } @@ -328,8 +326,10 @@ export class CommonService { } async getTenantWalletToken(agentEndPoint: string, apiKey: string, tenantId: string): Promise { + const normalizedBaseUrl = await this.normalizeUrlWithProtocol(agentEndPoint); + this.logger.log(`Fetching tenant wallet token for tenantId: ${tenantId} from ${normalizedBaseUrl}`); const tenantWalletDetails = await this.httpPost( - `${process.env.API_GATEWAY_PROTOCOL}://${agentEndPoint}${CommonConstants.URL_SHARED_WALLET_TOKEN}${tenantId}`, + `${normalizedBaseUrl}${CommonConstants.URL_SHARED_WALLET_TOKEN}${tenantId}`, {}, { headers: { @@ -343,4 +343,11 @@ export class CommonService { } return tenantWalletDetails.token; } + + async normalizeUrlWithProtocol(baseUrl: string): Promise { + if (baseUrl.startsWith('http://') || baseUrl.startsWith('https://')) { + return baseUrl; + } + return `${process.env.API_GATEWAY_PROTOCOL}://${baseUrl}`; + } } From b45186fb3c9e14af1f118ae80f0983fe9bad7519 Mon Sep 17 00:00:00 2001 From: Sahil Kamble Date: Thu, 7 Aug 2025 15:51:37 +0530 Subject: [PATCH 13/60] feat: update workflow file to build and push multi-architecture Docker images (#1376) Signed-off-by: Sahil Kamble --- .github/workflows/continuous-delivery.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/continuous-delivery.yml b/.github/workflows/continuous-delivery.yml index 775c21be7..8bc6c7bb0 100644 --- a/.github/workflows/continuous-delivery.yml +++ b/.github/workflows/continuous-delivery.yml @@ -44,6 +44,12 @@ jobs: id: get_tag run: echo "TAG=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Log in to GitHub Container Registry uses: docker/login-action@v3 with: @@ -57,6 +63,7 @@ jobs: context: . file: Dockerfiles/Dockerfile.${{ matrix.service }} push: true + platforms: linux/amd64,linux/arm64 tags: | ${{ env.REGISTRY }}/${{ github.repository_owner }}/${{ matrix.service }}:${{ env.TAG }} - ${{ env.REGISTRY }}/${{ github.repository_owner }}/${{ matrix.service }}:latest + ${{ env.REGISTRY }}/${{ github.repository_owner }}/${{ matrix.service }}:latest \ No newline at end of file From 4481091f06f917f89726b4965613cad83e0272f6 Mon Sep 17 00:00:00 2001 From: Krishna Waske Date: Thu, 7 Aug 2025 17:19:16 +0530 Subject: [PATCH 14/60] fix: DCO remediation ability (#1382) Signed-off-by: Krishna Waske --- .github/dco.yml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .github/dco.yml diff --git a/.github/dco.yml b/.github/dco.yml new file mode 100644 index 000000000..1f94d940b --- /dev/null +++ b/.github/dco.yml @@ -0,0 +1,3 @@ +allowRemediationCommits: + individual: true + thirdParty: true From 732ac885d2e944d5c4fccd6cd3de8f03b4d180b1 Mon Sep 17 00:00:00 2001 From: Tipu_Singh Date: Thu, 7 Aug 2025 17:51:27 +0530 Subject: [PATCH 15/60] feat: added env key in sample and demo file (#1384) Signed-off-by: Tipu_Singh --- .env.demo | 3 +++ .env.sample | 3 +++ 2 files changed, 6 insertions(+) diff --git a/.env.demo b/.env.demo index d66ba3ca9..f520dbc17 100644 --- a/.env.demo +++ b/.env.demo @@ -161,6 +161,9 @@ HOSTNAME='localhost' # To add more clients, simply add comma separated values of client names SUPPORTED_SSO_CLIENTS=CREDEBL +# Key for agent base wallet +AGENT_API_KEY='supersecret-that-too-16chars' + # To add more client add the following variables for each additional client. # Replace the `CLIENT-NAME` with the appropriate client name as added in `SUPPORTED_SSO_CLIENTS` # Default client will not need the following details diff --git a/.env.sample b/.env.sample index ef971b384..7b50c2c6a 100644 --- a/.env.sample +++ b/.env.sample @@ -181,6 +181,9 @@ HOSTNAME='localhost' # Hostname or unique identifier # To add more clients, simply add comma separated values of client names SUPPORTED_SSO_CLIENTS=CREDEBL +# Key for agent base wallet +AGENT_API_KEY='supersecret-that-too-16chars' + # To add more client add the following variables for each additional client. # Replace the `CLIENT-NAME` with the appropriate client name as added in `SUPPORTED_SSO_CLIENTS` # Default client will not need the following details From ff3c27350e9d05b3dffcb269238933e84553a00a Mon Sep 17 00:00:00 2001 From: Krishna Waske Date: Tue, 12 Aug 2025 14:02:49 +0530 Subject: [PATCH 16/60] fix: agent auth issue due to incorrect token (#1388) Signed-off-by: Krishna Waske --- apps/agent-service/src/agent-service.service.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/apps/agent-service/src/agent-service.service.ts b/apps/agent-service/src/agent-service.service.ts index ae092b204..b844083cd 100644 --- a/apps/agent-service/src/agent-service.service.ts +++ b/apps/agent-service/src/agent-service.service.ts @@ -1748,7 +1748,6 @@ export class AgentServiceService { throw new InternalServerErrorException(`Failed to get agent information: ${orgAgentResult.reason}`); } - const getApiKey = getApiKeyResult?.value; const orgAgent = orgAgentResult?.value; const orgAgentTypeResult = await this.agentServiceRepository.getOrgAgentType(orgAgent.orgAgentTypeId); @@ -1757,6 +1756,17 @@ export class AgentServiceService { throw new NotFoundException(ResponseMessages.agent.error.orgAgentNotFound); } + let getApiKey; + if (OrgAgentType.SHARED) { + const platformAdminSpinnedUp = await this.agentServiceRepository.platformAdminAgent( + CommonConstants.PLATFORM_ADMIN_ORG + ); + + getApiKey = await this.commonService.decryptPassword(platformAdminSpinnedUp?.org_agents[0].apiKey); + } else { + getApiKey = getApiKeyResult?.value; + } + // Determine the URL based on the agent type const url = orgAgentTypeResult.agent === OrgAgentType.SHARED From 4816fb6559e83be1eeae38cbeab6827fa50566dd Mon Sep 17 00:00:00 2001 From: Sujit Date: Wed, 13 Aug 2025 05:30:31 +0530 Subject: [PATCH 17/60] fix/all schema api Signed-off-by: Sujit --- apps/ledger/src/schema/schema.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/ledger/src/schema/schema.service.ts b/apps/ledger/src/schema/schema.service.ts index f3f7bd5a2..1fd599611 100644 --- a/apps/ledger/src/schema/schema.service.ts +++ b/apps/ledger/src/schema/schema.service.ts @@ -649,7 +649,7 @@ export class SchemaService extends BaseService { const response = await this.schemaRepository.getAllSchemaDetails(schemaSearchCriteria); const schemasDetails = response?.schemasResult.map((schemaAttributeItem) => { const attributes = JSON.parse(schemaAttributeItem.attributes); - return { ...schemaAttributeItem, attributes, organizationName: schemaAttributeItem.organisation.name }; + return { ...schemaAttributeItem, attributes, organizationName: schemaAttributeItem.organisation?.name || '' }; }); const schemasResponse = { From addfec5607548ed013ad0decfb8661f5a4c18d8d Mon Sep 17 00:00:00 2001 From: bhavanakarwade Date: Wed, 16 Jul 2025 17:27:50 +0530 Subject: [PATCH 18/60] fix: taking variable value from env Signed-off-by: bhavanakarwade --- libs/prisma-service/prisma/seed.ts | 800 ++++++++++++++--------------- 1 file changed, 392 insertions(+), 408 deletions(-) diff --git a/libs/prisma-service/prisma/seed.ts b/libs/prisma-service/prisma/seed.ts index 22919fec1..c3983f250 100644 --- a/libs/prisma-service/prisma/seed.ts +++ b/libs/prisma-service/prisma/seed.ts @@ -6,7 +6,7 @@ import { CommonConstants } from '../../common/src/common.constant'; import * as CryptoJS from 'crypto-js'; import { exec } from 'child_process'; import * as util from 'util'; -const execPromise = util.promisify(exec); +const execPromise = util.promisify(exec); const prisma = new PrismaClient(); const logger = new Logger('Init seed DB'); @@ -14,494 +14,478 @@ let platformUserId = ''; const configData = fs.readFileSync(`${process.cwd()}/prisma/data/credebl-master-table.json`, 'utf8'); const createPlatformConfig = async (): Promise => { - try { - const existPlatformAdmin = await prisma.platform_config.findMany(); - - if (0 === existPlatformAdmin.length) { - const { platformConfigData } = JSON.parse(configData); - const platformConfig = await prisma.platform_config.create({ - data: platformConfigData - }); - - logger.log(platformConfig); - } else { - logger.log('Already seeding in platform config'); - } - } catch (error) { - logger.error('An error occurred seeding platformConfig:', error); - throw error; + try { + const existPlatformAdmin = await prisma.platform_config.findMany(); + + if (0 === existPlatformAdmin.length) { + const { platformConfigData } = JSON.parse(configData); + const platformConfig = await prisma.platform_config.create({ + data: platformConfigData + }); + + logger.log(platformConfig); + } else { + logger.log('Already seeding in platform config'); } + } catch (error) { + logger.error('An error occurred seeding platformConfig:', error); + throw error; + } }; const createOrgRoles = async (): Promise => { - try { - const { orgRoleData } = JSON.parse(configData); - const roleNames = orgRoleData.map(role => role.name); - const existOrgRole = await prisma.org_roles.findMany({ - where: { - name: { - in: roleNames - } - } - }); - - if (0 === existOrgRole.length) { - const orgRoles = await prisma.org_roles.createMany({ - data: orgRoleData - }); - - logger.log(orgRoles); - } else { - logger.log('Already seeding in org role'); + try { + const { orgRoleData } = JSON.parse(configData); + const roleNames = orgRoleData.map((role) => role.name); + const existOrgRole = await prisma.org_roles.findMany({ + where: { + name: { + in: roleNames } + } + }); + + if (0 === existOrgRole.length) { + const orgRoles = await prisma.org_roles.createMany({ + data: orgRoleData + }); - } catch (error) { - logger.error('An error occurred seeding orgRoles:', error); - throw error; + logger.log(orgRoles); + } else { + logger.log('Already seeding in org role'); } + } catch (error) { + logger.error('An error occurred seeding orgRoles:', error); + throw error; + } }; const createAgentTypes = async (): Promise => { - try { - const { agentTypeData } = JSON.parse(configData); - - const agentType = agentTypeData.map(agentType => agentType.agent); - const existAgentType = await prisma.agents_type.findMany({ - where: { - agent: { - in: agentType - } - } - }); - - if (0 === existAgentType.length) { - const agentTypes = await prisma.agents_type.createMany({ - data: agentTypeData - }); - - logger.log(agentTypes); - } else { - logger.log('Already seeding in agent type'); + try { + const { agentTypeData } = JSON.parse(configData); + + const agentType = agentTypeData.map((agentType) => agentType.agent); + const existAgentType = await prisma.agents_type.findMany({ + where: { + agent: { + in: agentType } + } + }); + if (0 === existAgentType.length) { + const agentTypes = await prisma.agents_type.createMany({ + data: agentTypeData + }); - } catch (error) { - logger.error('An error occurred seeding agentTypes:', error); - throw error; + logger.log(agentTypes); + } else { + logger.log('Already seeding in agent type'); } + } catch (error) { + logger.error('An error occurred seeding agentTypes:', error); + throw error; + } }; const createOrgAgentTypes = async (): Promise => { - try { - const { orgAgentTypeData } = JSON.parse(configData); - const orgAgentType = orgAgentTypeData.map(orgAgentType => orgAgentType.agent); - const existAgentType = await prisma.org_agents_type.findMany({ - where: { - agent: { - in: orgAgentType - } - } - }); - - if (0 === existAgentType.length) { - const orgAgentTypes = await prisma.org_agents_type.createMany({ - data: orgAgentTypeData - }); - - logger.log(orgAgentTypes); - } else { - logger.log('Already seeding in org agent type'); + try { + const { orgAgentTypeData } = JSON.parse(configData); + const orgAgentType = orgAgentTypeData.map((orgAgentType) => orgAgentType.agent); + const existAgentType = await prisma.org_agents_type.findMany({ + where: { + agent: { + in: orgAgentType } + } + }); + if (0 === existAgentType.length) { + const orgAgentTypes = await prisma.org_agents_type.createMany({ + data: orgAgentTypeData + }); - } catch (error) { - logger.error('An error occurred seeding orgAgentTypes:', error); - throw error; + logger.log(orgAgentTypes); + } else { + logger.log('Already seeding in org agent type'); } + } catch (error) { + logger.error('An error occurred seeding orgAgentTypes:', error); + throw error; + } }; const createPlatformUser = async (): Promise => { - try { - const { platformAdminData } = JSON.parse(configData); - platformAdminData.email = process.env.PLATFORM_ADMIN_EMAIL; - platformAdminData.username = process.env.PLATFORM_ADMIN_EMAIL; - - const existPlatformAdminUser = await prisma.user.findMany({ - where: { - email: platformAdminData.email - } - }); + try { + const { platformAdminData } = JSON.parse(configData); + platformAdminData.email = process.env.PLATFORM_ADMIN_EMAIL; + platformAdminData.username = process.env.PLATFORM_ADMIN_EMAIL; + + const existPlatformAdminUser = await prisma.user.findMany({ + where: { + email: platformAdminData.email + } + }); - if (0 === existPlatformAdminUser.length) { - const platformUser = await prisma.user.create({ - data: platformAdminData - }); + if (0 === existPlatformAdminUser.length) { + const platformUser = await prisma.user.create({ + data: platformAdminData + }); - platformUserId = platformUser.id; + platformUserId = platformUser.id; - logger.log(platformUser); - } else { - logger.log('Already seeding in user'); - } - - } catch (error) { - logger.error('An error occurred seeding platformUser:', error); - throw error; + logger.log(platformUser); + } else { + logger.log('Already seeding in user'); } + } catch (error) { + logger.error('An error occurred seeding platformUser:', error); + throw error; + } }; - const createPlatformOrganization = async (): Promise => { - try { - const { platformAdminOrganizationData } = JSON.parse(configData); - platformAdminOrganizationData.createdBy = platformUserId; - platformAdminOrganizationData.lastChangedBy = platformUserId; - - const existPlatformAdminUser = await prisma.organisation.findMany({ - where: { - name: platformAdminOrganizationData.name - } - }); - - if (0 === existPlatformAdminUser.length) { - const platformOrganization = await prisma.organisation.create({ - data: platformAdminOrganizationData - }); - - logger.log(platformOrganization); - } else { - logger.log('Already seeding in organization'); - } + try { + const { platformAdminOrganizationData } = JSON.parse(configData); + platformAdminOrganizationData.createdBy = platformUserId; + platformAdminOrganizationData.lastChangedBy = platformUserId; + + const existPlatformAdminUser = await prisma.organisation.findMany({ + where: { + name: platformAdminOrganizationData.name + } + }); + + if (0 === existPlatformAdminUser.length) { + const platformOrganization = await prisma.organisation.create({ + data: platformAdminOrganizationData + }); - } catch (error) { - logger.error('An error occurred seeding platformOrganization:', error); - throw error; + logger.log(platformOrganization); + } else { + logger.log('Already seeding in organization'); } + } catch (error) { + logger.error('An error occurred seeding platformOrganization:', error); + throw error; + } }; const createPlatformUserOrgRoles = async (): Promise => { - try { - - const userId = await prisma.user.findUnique({ - where: { - email: `${CommonConstants.PLATFORM_ADMIN_EMAIL}` - } - }); - - const orgId = await prisma.organisation.findFirst({ - where: { - name: `${CommonConstants.PLATFORM_ADMIN_ORG}` - } - }); - - const orgRoleId = await prisma.org_roles.findUnique({ - where: { - name: `${CommonConstants.PLATFORM_ADMIN_ORG_ROLE}` - } - }); - - if (!userId && !orgId && !orgRoleId) { - const platformOrganization = await prisma.user_org_roles.create({ - data: { - userId: userId.id, - orgRoleId: orgRoleId.id, - orgId: orgId.id - } - }); - logger.log(platformOrganization); - } else { - logger.log('Already seeding in org_roles'); - } + try { + const userId = await prisma.user.findUnique({ + where: { + email: `${process.env.PLATFORM_ADMIN_EMAIL}` + } + }); + const orgId = await prisma.organisation.findFirst({ + where: { + name: `${CommonConstants.PLATFORM_ADMIN_ORG}` + } + }); - } catch (error) { - logger.error('An error occurred seeding platformOrganization:', error); - throw error; + const orgRoleId = await prisma.org_roles.findUnique({ + where: { + name: `${CommonConstants.PLATFORM_ADMIN_ORG_ROLE}` + } + }); + + if (!userId && !orgId && !orgRoleId) { + const platformOrganization = await prisma.user_org_roles.create({ + data: { + userId: userId.id, + orgRoleId: orgRoleId.id, + orgId: orgId.id + } + }); + logger.log(platformOrganization); + } else { + logger.log('Already seeding in org_roles'); } + } catch (error) { + logger.error('An error occurred seeding platformOrganization:', error); + throw error; + } }; const createLedger = async (): Promise => { - try { - const { ledgerData } = JSON.parse(configData); - - const existingLedgers = await prisma.ledgers.findMany(); - - if (0 === existingLedgers.length) { - const createLedger = await prisma.ledgers.createMany({ - data: ledgerData - }); - logger.log('All ledgers inserted:', createLedger); - } else { - const updatesNeeded = []; - - if (existingLedgers.length !== ledgerData.length) { - updatesNeeded.push(ledgerData); - if (0 < updatesNeeded.length) { - await prisma.ledgers.deleteMany(); - - const createLedger = await prisma.ledgers.createMany({ - data: ledgerData - }); - logger.log('Updated ledgers:', createLedger); - } else { - logger.log('No changes in ledger data'); - } + try { + const { ledgerData } = JSON.parse(configData); + + const existingLedgers = await prisma.ledgers.findMany(); + + if (0 === existingLedgers.length) { + const createLedger = await prisma.ledgers.createMany({ + data: ledgerData + }); + logger.log('All ledgers inserted:', createLedger); + } else { + const updatesNeeded = []; + + if (existingLedgers.length !== ledgerData.length) { + updatesNeeded.push(ledgerData); + if (0 < updatesNeeded.length) { + await prisma.ledgers.deleteMany(); + + const createLedger = await prisma.ledgers.createMany({ + data: ledgerData + }); + logger.log('Updated ledgers:', createLedger); } else { - logger.log('No changes in ledger data'); + logger.log('No changes in ledger data'); } + } else { + logger.log('No changes in ledger data'); } - } catch (error) { - logger.error('An error occurred seeding createLedger:', error); - throw error; } - }; + } catch (error) { + logger.error('An error occurred seeding createLedger:', error); + throw error; + } +}; const createLedgerConfig = async (): Promise => { - try { - const { ledgerConfig } = JSON.parse(configData); - - const ledgerConfigList = await prisma.ledgerConfig.findMany(); - - const checkDataIsEqual = (ledgerConfig, ledgerConfigList): boolean => { - if (ledgerConfig.length !== ledgerConfigList.length) { - return false; - } - - for (let i = 0; i < ledgerConfig.length; i++) { - const config1 = ledgerConfig[i]; - const config2 = ledgerConfigList.find(item => item.name === config1.name && JSON.stringify(item.details) === JSON.stringify(config1.details)); - - if (!config2) { - return false; - } - } - return true; - }; - - if (0 === ledgerConfigList.length) { - const configDetails = await prisma.ledgerConfig.createMany({ - data: ledgerConfig - }); - logger.log('Ledger config created:', configDetails); - - } else if (!checkDataIsEqual(ledgerConfig, ledgerConfigList)) { - await prisma.ledgerConfig.deleteMany({}); - const configDetails = await prisma.ledgerConfig.createMany({ - data: ledgerConfig - }); - logger.log('Existing ledger config deleted and new ones created:', configDetails); - } else { - logger.log('Already seeding in ledger config'); + try { + const { ledgerConfig } = JSON.parse(configData); + + const ledgerConfigList = await prisma.ledgerConfig.findMany(); + + const checkDataIsEqual = (ledgerConfig, ledgerConfigList): boolean => { + if (ledgerConfig.length !== ledgerConfigList.length) { + return false; + } + + for (let i = 0; i < ledgerConfig.length; i++) { + const config1 = ledgerConfig[i]; + const config2 = ledgerConfigList.find( + (item) => item.name === config1.name && JSON.stringify(item.details) === JSON.stringify(config1.details) + ); + + if (!config2) { + return false; } - } catch (error) { - logger.error('An error occurred while configuring ledger:', error); - throw error; + } + return true; + }; + + if (0 === ledgerConfigList.length) { + const configDetails = await prisma.ledgerConfig.createMany({ + data: ledgerConfig + }); + logger.log('Ledger config created:', configDetails); + } else if (!checkDataIsEqual(ledgerConfig, ledgerConfigList)) { + await prisma.ledgerConfig.deleteMany({}); + const configDetails = await prisma.ledgerConfig.createMany({ + data: ledgerConfig + }); + logger.log('Existing ledger config deleted and new ones created:', configDetails); + } else { + logger.log('Already seeding in ledger config'); } + } catch (error) { + logger.error('An error occurred while configuring ledger:', error); + throw error; + } }; const createUserRole = async (): Promise => { - try { - const { userRoleData } = JSON.parse(configData); - - const userRoleDetails = userRoleData.map(userRole => userRole.role); - const existUserRole = await prisma.user_role.findMany({ - where: { - role: { - in: userRoleDetails - } - } - }); - - if (0 === existUserRole.length) { - const userRole = await prisma.user_role.createMany({ - data: userRoleData - }); - - logger.log(userRole); - } else { - logger.log('Already seeding in user role'); + try { + const { userRoleData } = JSON.parse(configData); + + const userRoleDetails = userRoleData.map((userRole) => userRole.role); + const existUserRole = await prisma.user_role.findMany({ + where: { + role: { + in: userRoleDetails } + } + }); + if (0 === existUserRole.length) { + const userRole = await prisma.user_role.createMany({ + data: userRoleData + }); - } catch (error) { - logger.error('An error occurred seeding user role:', error); - throw error; + logger.log(userRole); + } else { + logger.log('Already seeding in user role'); } + } catch (error) { + logger.error('An error occurred seeding user role:', error); + throw error; + } }; const migrateOrgAgentDids = async (): Promise => { - try { - const orgAgents = await prisma.org_agents.findMany({ - where: { - walletName: { - not: 'platform-admin' - } - } - }); - - const orgDids = orgAgents.map((agent) => agent.orgDid).filter((did) => null !== did && '' !== did); - const existingDids = await prisma.org_dids.findMany({ - where: { - did: { - in: orgDids - } - } - }); - - const filteredOrgAgents = orgAgents.filter( - (agent) => null !== agent.orgDid && '' !== agent.orgDid - ); + try { + const orgAgents = await prisma.org_agents.findMany({ + where: { + walletName: { + not: 'platform-admin' + } + } + }); - // If there are org DIDs that do not exist in org_dids table - if (orgDids.length !== existingDids.length) { - const newOrgAgents = filteredOrgAgents.filter( - (agent) => !existingDids.some((did) => did.did === agent.orgDid) - ); - - const newDidRecords = newOrgAgents.map((agent) => ({ - orgId: agent.orgId, - did: agent.orgDid, - didDocument: agent.didDocument, - isPrimaryDid: true, - createdBy: agent.createdBy, - lastChangedBy: agent.lastChangedBy, - orgAgentId: agent.id - })); - - const didInsertResult = await prisma.org_dids.createMany({ - data: newDidRecords - }); - - logger.log(didInsertResult); - } else { - logger.log('No new DIDs to migrate in migrateOrgAgentDids'); + const orgDids = orgAgents.map((agent) => agent.orgDid).filter((did) => null !== did && '' !== did); + const existingDids = await prisma.org_dids.findMany({ + where: { + did: { + in: orgDids } - } catch (error) { - logger.error('An error occurred during migrateOrgAgentDids:', error); - throw error; + } + }); + + const filteredOrgAgents = orgAgents.filter((agent) => null !== agent.orgDid && '' !== agent.orgDid); + + // If there are org DIDs that do not exist in org_dids table + if (orgDids.length !== existingDids.length) { + const newOrgAgents = filteredOrgAgents.filter((agent) => !existingDids.some((did) => did.did === agent.orgDid)); + + const newDidRecords = newOrgAgents.map((agent) => ({ + orgId: agent.orgId, + did: agent.orgDid, + didDocument: agent.didDocument, + isPrimaryDid: true, + createdBy: agent.createdBy, + lastChangedBy: agent.lastChangedBy, + orgAgentId: agent.id + })); + + const didInsertResult = await prisma.org_dids.createMany({ + data: newDidRecords + }); + + logger.log(didInsertResult); + } else { + logger.log('No new DIDs to migrate in migrateOrgAgentDids'); } + } catch (error) { + logger.error('An error occurred during migrateOrgAgentDids:', error); + throw error; + } }; const addSchemaType = async (): Promise => { - try { - const emptyTypeSchemaList = await prisma.schema.findMany({ - where: { - OR: [ - { type: null }, - { type: '' } - ] - } - }); - if (0 < emptyTypeSchemaList.length) { - const updatePromises = emptyTypeSchemaList.map((schema) => prisma.schema.update({ - where: { id: schema.id }, - data: { type: 'indy' } - }) - ); - await Promise.all(updatePromises); - - logger.log('Schemas updated successfully'); - } else { - logger.log('No schemas to update'); - } - } catch (error) { - logger.error('An error occurred during addSchemaType:', error); - throw error; + try { + const emptyTypeSchemaList = await prisma.schema.findMany({ + where: { + OR: [{ type: null }, { type: '' }] + } + }); + if (0 < emptyTypeSchemaList.length) { + const updatePromises = emptyTypeSchemaList.map((schema) => + prisma.schema.update({ + where: { id: schema.id }, + data: { type: 'indy' } + }) + ); + await Promise.all(updatePromises); + + logger.log('Schemas updated successfully'); + } else { + logger.log('No schemas to update'); } + } catch (error) { + logger.error('An error occurred during addSchemaType:', error); + throw error; + } }; const importGeoLocationMasterData = async (): Promise => { - try { - const scriptPath = process.env.GEO_LOCATION_MASTER_DATA_IMPORT_SCRIPT; - const dbUrl = process.env.DATABASE_URL; - - if (!scriptPath || !dbUrl) { - throw new Error('Environment variables GEO_LOCATION_MASTER_DATA_IMPORT_SCRIPT or DATABASE_URL are not set.'); - } - - const command = `${process.cwd()}/${scriptPath} ${dbUrl}`; - - const { stdout, stderr } = await execPromise(command); - - if (stdout) { - logger.log(`Shell script output: ${stdout}`); - } - if (stderr) { - logger.error(`Shell script error: ${stderr}`); - } - } catch (error) { - logger.error('An error occurred during importGeoLocationMasterData:', error); - throw error; + try { + const scriptPath = process.env.GEO_LOCATION_MASTER_DATA_IMPORT_SCRIPT; + const dbUrl = process.env.DATABASE_URL; + + if (!scriptPath || !dbUrl) { + throw new Error('Environment variables GEO_LOCATION_MASTER_DATA_IMPORT_SCRIPT or DATABASE_URL are not set.'); } - }; -const encryptClientCredential = async (clientCredential: string): Promise => { - try { - const encryptedToken = CryptoJS.AES.encrypt(JSON.stringify(clientCredential), process.env.CRYPTO_PRIVATE_KEY).toString(); + const command = `${process.cwd()}/${scriptPath} ${dbUrl}`; + + const { stdout, stderr } = await execPromise(command); - return encryptedToken; - } catch (error) { - logger.error('An error occurred during encryptClientCredential:', error); - throw error; + if (stdout) { + logger.log(`Shell script output: ${stdout}`); + } + if (stderr) { + logger.error(`Shell script error: ${stderr}`); } + } catch (error) { + logger.error('An error occurred during importGeoLocationMasterData:', error); + throw error; + } +}; + +const encryptClientCredential = async (clientCredential: string): Promise => { + try { + const encryptedToken = CryptoJS.AES.encrypt( + JSON.stringify(clientCredential), + process.env.CRYPTO_PRIVATE_KEY + ).toString(); + + return encryptedToken; + } catch (error) { + logger.error('An error occurred during encryptClientCredential:', error); + throw error; + } }; const updateClientCredential = async (): Promise => { - try { - const scriptPath = process.env.UPDATE_CLIENT_CREDENTIAL_SCRIPT; - const dbUrl = process.env.DATABASE_URL; - const clientId = process.env.KEYCLOAK_MANAGEMENT_CLIENT_ID; - const clientSecret = process.env.KEYCLOAK_MANAGEMENT_CLIENT_SECRET; - - if (!scriptPath || !dbUrl || !clientId || !clientSecret) { - throw new Error('Environment variables UPDATE_CLIENT_CREDENTIAL_SCRIPT or DATABASE_URL or clientId or clientSecret are not set.'); - } - - const encryptedClientId = await encryptClientCredential(process.env.KEYCLOAK_MANAGEMENT_CLIENT_ID); - const encryptedClientSecret = await encryptClientCredential(process.env.KEYCLOAK_MANAGEMENT_CLIENT_SECRET); - - const command = `${process.cwd()}/${scriptPath} ${dbUrl} ${encryptedClientId} ${encryptedClientSecret}`; - - const { stdout, stderr } = await execPromise(command); - - if (stdout) { - logger.log(`Shell script output: ${stdout}`); - } - if (stderr) { - logger.error(`Shell script error: ${stderr}`); - } - - } catch (error) { - logger.error('An error occurred during updateClientCredential:', error); - throw error; + try { + const scriptPath = process.env.UPDATE_CLIENT_CREDENTIAL_SCRIPT; + const dbUrl = process.env.DATABASE_URL; + const clientId = process.env.KEYCLOAK_MANAGEMENT_CLIENT_ID; + const clientSecret = process.env.KEYCLOAK_MANAGEMENT_CLIENT_SECRET; + + if (!scriptPath || !dbUrl || !clientId || !clientSecret) { + throw new Error( + 'Environment variables UPDATE_CLIENT_CREDENTIAL_SCRIPT or DATABASE_URL or clientId or clientSecret are not set.' + ); } -}; + const encryptedClientId = await encryptClientCredential(process.env.KEYCLOAK_MANAGEMENT_CLIENT_ID); + const encryptedClientSecret = await encryptClientCredential(process.env.KEYCLOAK_MANAGEMENT_CLIENT_SECRET); -async function main(): Promise { + const command = `${process.cwd()}/${scriptPath} ${dbUrl} ${encryptedClientId} ${encryptedClientSecret}`; + + const { stdout, stderr } = await execPromise(command); + + if (stdout) { + logger.log(`Shell script output: ${stdout}`); + } + if (stderr) { + logger.error(`Shell script error: ${stderr}`); + } + } catch (error) { + logger.error('An error occurred during updateClientCredential:', error); + throw error; + } +}; - await createPlatformConfig(); - await createOrgRoles(); - await createAgentTypes(); - await createPlatformUser(); - await createPlatformOrganization(); - await createPlatformUserOrgRoles(); - await createOrgAgentTypes(); - await createLedger(); - await createLedgerConfig(); - await createUserRole(); - await migrateOrgAgentDids(); - await addSchemaType(); - await importGeoLocationMasterData(); - await updateClientCredential(); +async function main(): Promise { + await createPlatformConfig(); + await createOrgRoles(); + await createAgentTypes(); + await createPlatformUser(); + await createPlatformOrganization(); + await createPlatformUserOrgRoles(); + await createOrgAgentTypes(); + await createLedger(); + await createLedgerConfig(); + await createUserRole(); + await migrateOrgAgentDids(); + await addSchemaType(); + await importGeoLocationMasterData(); + await updateClientCredential(); } main() - .then(async () => { - await prisma.$disconnect(); - }) - .catch(async (error) => { - logger.error(`In prisma seed initialize`, error); - await prisma.$disconnect(); - process.exit(1); - }); \ No newline at end of file + .then(async () => { + await prisma.$disconnect(); + }) + .catch(async (error) => { + logger.error(`In prisma seed initialize`, error); + await prisma.$disconnect(); + process.exit(1); + }); From 804c0b95928eee0a3b2281180df3ec073bbb7e89 Mon Sep 17 00:00:00 2001 From: bhavanakarwade Date: Wed, 23 Jul 2025 16:14:18 +0530 Subject: [PATCH 19/60] wip: implemented fetch session details api Signed-off-by: bhavanakarwade --- .../api-gateway/src/authz/authz.controller.ts | 34 +++++++ apps/api-gateway/src/authz/authz.service.ts | 6 ++ apps/api-gateway/src/main.ts | 3 +- apps/user/interfaces/user.interface.ts | 97 +++++++++++-------- apps/user/repositories/user.repository.ts | 90 ++++++++++++++++- apps/user/src/user.controller.ts | 6 ++ apps/user/src/user.service.ts | 42 +++++++- libs/common/src/interfaces/user.interface.ts | 1 + libs/common/src/response-messages/index.ts | 1 + libs/enum/src/enum.ts | 10 ++ .../migration.sql | 53 ++++++++++ libs/prisma-service/prisma/schema.prisma | 32 ++++++ package.json | 1 + 13 files changed, 334 insertions(+), 42 deletions(-) create mode 100644 libs/prisma-service/prisma/migrations/20250718131738_added_session_account_user/migration.sql diff --git a/apps/api-gateway/src/authz/authz.controller.ts b/apps/api-gateway/src/authz/authz.controller.ts index ef55abec9..fd708d773 100644 --- a/apps/api-gateway/src/authz/authz.controller.ts +++ b/apps/api-gateway/src/authz/authz.controller.ts @@ -7,6 +7,7 @@ import { Param, Post, Query, + Req, Res, UnauthorizedException, UseFilters @@ -30,6 +31,7 @@ import { ResetTokenPasswordDto } from './dtos/reset-token-password'; import { RefreshTokenDto } from './dtos/refresh-token.dto'; import { getDefaultClient } from '../user/utils'; import { ClientAliasValidationPipe } from './decorators/user-auth-client'; +import { Request } from 'express'; @Controller('auth') @ApiTags('auth') @@ -162,12 +164,44 @@ export class AuthzController { data: userData }; + res.cookie('session_id', userData.sessionId, { + httpOnly: true, + sameSite: 'lax', + secure: false, + maxAge: 30 * 24 * 60 * 60 * 1000 + }); + return res.status(HttpStatus.OK).json(finalResponse); } else { throw new UnauthorizedException(`Please provide valid credentials`); } } + /** + * Fetch session details + * + * @returns User's access token details + */ + @Get('/sessionDetails') + @ApiOperation({ + summary: 'Fetch session details', + description: 'Fetch session details against logged in user' + }) + @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: AuthTokenResponse }) + async sessionDetails(@Req() req: Request, @Res() res: Response): Promise { + const sessionId = req.cookies['session_id']; + + const sessionDetails = await this.authzService.getSession(sessionId); + + const finalResponse: IResponseType = { + statusCode: HttpStatus.OK, + message: ResponseMessages.user.success.fetchSession, + data: sessionDetails + }; + + return res.status(HttpStatus.OK).json(finalResponse); + } + /** * Resets user's password. * diff --git a/apps/api-gateway/src/authz/authz.service.ts b/apps/api-gateway/src/authz/authz.service.ts index 8ee8a5b4d..03188eec3 100644 --- a/apps/api-gateway/src/authz/authz.service.ts +++ b/apps/api-gateway/src/authz/authz.service.ts @@ -53,6 +53,12 @@ export class AuthzService extends BaseService { return this.natsClient.sendNatsMessage(this.authServiceProxy, 'user-holder-login', payload); } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + async getSession(sessionId: string): Promise { + const payload = { sessionId }; + return this.natsClient.sendNatsMessage(this.authServiceProxy, 'fetch-session-details', payload); + } + async resetPassword(resetPasswordDto: ResetPasswordDto): Promise { return this.natsClient.sendNatsMessage(this.authServiceProxy, 'user-reset-password', resetPasswordDto); } diff --git a/apps/api-gateway/src/main.ts b/apps/api-gateway/src/main.ts index 3bbe4b317..aabe4b3a5 100644 --- a/apps/api-gateway/src/main.ts +++ b/apps/api-gateway/src/main.ts @@ -4,7 +4,7 @@ import * as express from 'express'; import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; import { Logger, VERSION_NEUTRAL, VersioningType } from '@nestjs/common'; - +import * as cookieParser from 'cookie-parser'; import { AppModule } from './app.module'; import { HttpAdapterHost, NestFactory, Reflector } from '@nestjs/core'; import { AllExceptionsFilter } from '@credebl/common/exception-handler'; @@ -45,6 +45,7 @@ async function bootstrap(): Promise { expressApp.set('x-powered-by', false); app.use(express.json({ limit: '100mb' })); app.use(express.urlencoded({ limit: '100mb', extended: true })); + app.use(cookieParser()); app.use((req, res, next) => { let err = null; diff --git a/apps/user/interfaces/user.interface.ts b/apps/user/interfaces/user.interface.ts index dd6c1d60d..8cdf48a49 100644 --- a/apps/user/interfaces/user.interface.ts +++ b/apps/user/interfaces/user.interface.ts @@ -12,20 +12,20 @@ export interface IUsersProfile { } interface IUserOrgRole { - id: string; - userId: string; - orgRoleId: string; - orgId: string; - orgRole :IOrgRole; - organisation:IOrganisation; -} - export interface IOrgRole{ - id: string; + 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; +} +export interface IOrganisation { + id: string; name: string; description: string; orgSlug: string; @@ -106,12 +106,12 @@ export interface ICheckUserDetails { isFidoVerified?: boolean; isRegistrationCompleted?: boolean; userId?: number; - message?:string; + message?: string; } export interface IOrgUsers { - totalPages: number, - users: OrgUser[] + totalPages: number; + users: OrgUser[]; } export interface IDidList { @@ -137,7 +137,7 @@ interface UserOrgRoles { orgId: string; orgRoleId: string; orgRole: OrgRole; - organisation: Organization + organisation: Organization; } interface OrgRole { id: string; @@ -146,22 +146,22 @@ interface OrgRole { } interface Organization { - id: string, - name: string, - description: string, - orgSlug: string, - logoUrl: string, + 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 + id: string; + orgDid: string; + walletName: string; + agentSpinUpStatus: number; + agentsTypeId: string; + createDateTime: Date; + orgAgentTypeId: string; } export interface Payload { @@ -170,29 +170,36 @@ export interface Payload { 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 ISession { + sessionToken: string; + userId: string; + expires?: number; + refreshToken?: string; +} + +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 +209,7 @@ export interface IIssueCertificate { practicalGradeCredits: string; practicalObtainedEarned: string; } -export interface IPuppeteerOption{ +export interface IPuppeteerOption { width: number; height: number; } @@ -229,7 +236,7 @@ export interface UserRoleMapping { userRoleId: string; } -export interface UserRoleDetails{ +export interface UserRoleDetails { id: string; role: $Enums.UserRole; } @@ -243,4 +250,18 @@ export interface IEcosystemConfig { lastChangedDateTime: Date; lastChangedBy: string; deletedAt: Date | null; -} \ No newline at end of file +} + +export interface IAccountDetails { + userId: string; + type?: string; + provider?: string; + providerAccountId?: string; + refresh_token?: string; + access_token?: string; + expires_at?: string; + scope?: string; + token_type?: string; + id_token?: string; + session_state?: string; +} diff --git a/apps/user/repositories/user.repository.ts b/apps/user/repositories/user.repository.ts index 2e21c4ec8..7d9465b8a 100644 --- a/apps/user/repositories/user.repository.ts +++ b/apps/user/repositories/user.repository.ts @@ -1,8 +1,10 @@ /* eslint-disable prefer-destructuring */ import { + IAccountDetails, IOrgUsers, ISendVerificationEmail, + ISession, IShareUserCertificate, IUserDeletedActivity, IUserInformation, @@ -16,7 +18,7 @@ import { } from '../interfaces/user.interface'; import { Injectable, InternalServerErrorException, Logger, NotFoundException } from '@nestjs/common'; // eslint-disable-next-line camelcase -import { RecordType, client_aliases, schema, token, user, user_org_roles } from '@prisma/client'; +import { RecordType, account, client_aliases, schema, session, token, user, user_org_roles } from '@prisma/client'; import { PrismaService } from '@credebl/prisma-service'; import { UserRole } from '@credebl/enum/enum'; @@ -119,6 +121,24 @@ export class UserRepository { } } + /** + * + * @param sessionId + * @returns Session details + */ + async getSession(sessionId: string): Promise { + try { + return this.prisma.session.findUnique({ + where: { + id: sessionId + } + }); + } catch (error) { + this.logger.error(`Not Found: ${JSON.stringify(error)}`); + throw new NotFoundException(error); + } + } + /** * * @param id @@ -638,6 +658,56 @@ export class UserRepository { } } + async createSession(tokenDetails: ISession): Promise { + try { + const { sessionToken, userId, expires, refreshToken } = tokenDetails; + const sessionResponse = await this.prisma.session.upsert({ + where: { + userId + }, + create: { + sessionToken, + userId, + expires, + // eslint-disable-next-line camelcase + refresh_token: refreshToken + }, + update: { + sessionToken, + expires, + // eslint-disable-next-line camelcase + refresh_token: refreshToken + } + }); + return sessionResponse; + } catch (error) { + this.logger.error(`Error in createTokenForResetPassword: ${error.message} `); + throw error; + } + } + + // async updateAccountDetails(accountDetails: ISession): Promise { + // try { + // const userAccountDetails = await this.prisma.account.update({ + // where: { + // userId: accountDetails?.userId + // }, + // data: { + // // eslint-disable-next-line camelcase + // access_token: accountDetails?.sessionToken, + // // eslint-disable-next-line camelcase + // refresh_token: accountDetails?.refreshToken, + // // eslint-disable-next-line camelcase + // expires_at: accountDetails?.expires + // } + // }); + // return userAccountDetails; + // } catch (error) { + // this.logger.error(`Error in createTokenForResetPassword: ${error.message} `); + // throw error; + // } + // } + /** * * @param userId @@ -809,6 +879,24 @@ export class UserRepository { } } + async storeUserAccountDetails(accountDetails: IAccountDetails): Promise { + try { + const userAccountDetails = await this.prisma.account.create({ + data: { + userId: accountDetails?.userId, + provider: accountDetails?.provider, + providerAccountId: accountDetails?.providerAccountId, + // eslint-disable-next-line camelcase + token_type: accountDetails?.token_type + } + }); + return userAccountDetails; + } catch (error) { + this.logger.error(`Error in storing account details: ${error.message} `); + throw error; + } + } + async getUserRole(role: UserRole): Promise { try { const getUserRole = await this.prisma.user_role.findFirstOrThrow({ diff --git a/apps/user/src/user.controller.ts b/apps/user/src/user.controller.ts index 580de2c4f..8dd8ca2e4 100644 --- a/apps/user/src/user.controller.ts +++ b/apps/user/src/user.controller.ts @@ -77,6 +77,12 @@ export class UserController { return loginRes; } + @MessagePattern({ cmd: 'fetch-session-details' }) + // eslint-disable-next-line @typescript-eslint/no-explicit-any + async getSession(sessionId: string): Promise { + return this.userService.getSession(sessionId); + } + @MessagePattern({ cmd: 'refresh-token-details' }) async refreshTokenDetails(refreshToken: string): Promise { return this.userService.refreshTokenDetails(refreshToken); diff --git a/apps/user/src/user.service.ts b/apps/user/src/user.service.ts index e102079de..fd25a24ba 100644 --- a/apps/user/src/user.service.ts +++ b/apps/user/src/user.service.ts @@ -46,7 +46,7 @@ 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, ProviderType, TokenType, UserRole } from '@credebl/enum/enum'; import validator from 'validator'; import { DISALLOWED_EMAIL_DOMAIN } from '@credebl/common/common.constant'; import { AwsService } from '@credebl/aws'; @@ -378,6 +378,16 @@ export class UserService { const holderOrgRole = await this.orgRoleService.getRole(OrgRoles.HOLDER); await this.userOrgRoleService.createUserOrgRole(userDetails.id, holderOrgRole.id, null, holderRoleData.id); + const userAccountDetails = { + userId: userDetails?.id, + provider: ProviderType.KEYCLOAK, + providerAccountId: keycloakDetails.keycloakUserId.toString(), + // eslint-disable-next-line camelcase + token_type: TokenType.USER_TOKEN + }; + + await this.userRepository.storeUserAccountDetails(userAccountDetails); + return { userId: userDetails?.id }; } catch (error) { this.logger.error(`Error in createUserForToken: ${JSON.stringify(error)}`); @@ -455,7 +465,24 @@ export class UserService { return await this.generateToken(email.toLowerCase(), decryptedPassword, userData); } else { const decryptedPassword = await this.commonService.decryptPassword(password); - return await this.generateToken(email.toLowerCase(), decryptedPassword, userData); + const tokenDetails = await this.generateToken(email.toLowerCase(), decryptedPassword, userData); + + const sessionData = { + sessionToken: tokenDetails?.access_token, + userId: userData?.id, + expires: tokenDetails?.expires_in, + refreshToken: tokenDetails?.refresh_token + }; + const addSessionDetails = await this.userRepository.createSession(sessionData); + + // await this.userRepository.updateAccountDetails(sessionData); + + const finalResponse = { + ...tokenDetails, + seesionId: addSessionDetails.id + }; + + return finalResponse; } } catch (error) { this.logger.error(`In Login User : ${JSON.stringify(error)}`); @@ -463,6 +490,17 @@ export class UserService { } } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + async getSession(sessionId: string): Promise { + try { + const sessionDetails = await this.userRepository.getSession(sessionId); + return sessionDetails; + } catch (error) { + this.logger.error(`In fetching session details : ${JSON.stringify(error)}`); + throw new RpcException(error.response ? error.response : error); + } + } + async refreshTokenDetails(refreshToken: string): Promise { try { try { diff --git a/libs/common/src/interfaces/user.interface.ts b/libs/common/src/interfaces/user.interface.ts index 900a1a843..041458bff 100644 --- a/libs/common/src/interfaces/user.interface.ts +++ b/libs/common/src/interfaces/user.interface.ts @@ -5,6 +5,7 @@ export interface ISignInUser { expires_at?: number; refresh_token?: string; isRegisteredToSupabase?: boolean; + sessionId?: string; } export interface IVerifyUserEmail { email: string; diff --git a/libs/common/src/response-messages/index.ts b/libs/common/src/response-messages/index.ts index 3205a4a24..47cb5153a 100644 --- a/libs/common/src/response-messages/index.ts +++ b/libs/common/src/response-messages/index.ts @@ -6,6 +6,7 @@ export const ResponseMessages = { emaiVerified: 'Email verified successfully', fetchClientAliases: 'Client aliases fetched successfully', login: 'User login successfully', + fetchSession: 'Session details fetched successfully', fetchProfile: 'User fetched successfully', fetchInvitations: 'Org invitations fetched successfully', invitationReject: 'Organization invitation rejected', diff --git a/libs/enum/src/enum.ts b/libs/enum/src/enum.ts index fa0eba90b..09c7b967c 100644 --- a/libs/enum/src/enum.ts +++ b/libs/enum/src/enum.ts @@ -257,3 +257,13 @@ export enum ProofType { POLYGON_PROOFTYPE = 'EcdsaSecp256k1Signature2019', NO_LEDGER_PROOFTYPE = 'Ed25519Signature2018' } + +export enum TokenType { + USER_TOKEN = 'user-token', + ORG_TOKEN = 'organization-token' +} + +export enum ProviderType { + KEYCLOAK = 'keycloak', + SUPABASE = 'supabase' +} diff --git a/libs/prisma-service/prisma/migrations/20250718131738_added_session_account_user/migration.sql b/libs/prisma-service/prisma/migrations/20250718131738_added_session_account_user/migration.sql new file mode 100644 index 000000000..951877c55 --- /dev/null +++ b/libs/prisma-service/prisma/migrations/20250718131738_added_session_account_user/migration.sql @@ -0,0 +1,53 @@ +-- CreateTable +CREATE TABLE "account" ( + "id" UUID NOT NULL, + "userId" UUID NOT NULL, + "type" TEXT, + "provider" TEXT NOT NULL, + "providerAccountId" TEXT NOT NULL, + "refresh_token" TEXT, + "access_token" TEXT, + "expires_at" INTEGER, + "token_type" TEXT, + "scope" TEXT, + "id_token" TEXT, + "session_state" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "account_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "session" ( + "id" UUID NOT NULL, + "sessionToken" TEXT NOT NULL, + "userId" UUID NOT NULL, + "expires" INTEGER NOT NULL, + "refresh_token" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "session_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "account_refresh_token_key" ON "account"("refresh_token"); + +-- CreateIndex +CREATE UNIQUE INDEX "account_access_token_key" ON "account"("access_token"); + +-- CreateIndex +CREATE UNIQUE INDEX "session_sessionToken_key" ON "session"("sessionToken"); + +-- CreateIndex +CREATE UNIQUE INDEX "session_userId_key" ON "session"("userId"); + +-- CreateIndex +CREATE UNIQUE INDEX "session_refresh_token_key" ON "session"("refresh_token"); + +-- AddForeignKey +ALTER TABLE "account" ADD CONSTRAINT "account_userId_fkey" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "session" ADD CONSTRAINT "session_userId_fkey" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/libs/prisma-service/prisma/schema.prisma b/libs/prisma-service/prisma/schema.prisma index 02bcbb91d..d37175da2 100644 --- a/libs/prisma-service/prisma/schema.prisma +++ b/libs/prisma-service/prisma/schema.prisma @@ -34,8 +34,40 @@ model user { token token[] user_role_mapping user_role_mapping[] cloud_wallet_user_info cloud_wallet_user_info[] + accounts account[] + sessions session[] +} + +model account { + id String @id @default(uuid()) @db.Uuid + userId String @db.Uuid + type String? + provider String + providerAccountId String + refresh_token String? @unique + access_token String? @unique + expires_at Int? + token_type String? + scope String? + id_token String? + session_state String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + user user @relation(fields: [userId], references: [id]) + } + +model session { + id String @id @default(uuid()) @db.Uuid + sessionToken String @unique + userId String @unique @db.Uuid + expires Int + refresh_token String? @unique + user user @relation(fields: [userId], references: [id]) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt } + model token { id String @id @default(uuid()) @db.Uuid token String @unique diff --git a/package.json b/package.json index 3bae65e70..214141f89 100644 --- a/package.json +++ b/package.json @@ -71,6 +71,7 @@ "cache-manager-redis-store": "^2.0.0", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", + "cookie-parser": "^1.4.7", "crypto-js": "^4.1.1", "crypto-random-string": "^5.0.0", "dotenv": "^16.0.3", From 1a183c0e9546a20149cd1c48ef9361dfad5245ac Mon Sep 17 00:00:00 2001 From: bhavanakarwade Date: Wed, 23 Jul 2025 16:29:19 +0530 Subject: [PATCH 20/60] fix: added pnpm file Signed-off-by: bhavanakarwade --- pnpm-lock.yaml | 50 +++++++++++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 05fd8cd04..3c325bcf7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,10 +16,10 @@ importers: version: 3.1.3(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(axios@0.26.1)(rxjs@7.8.2) '@nestjs/bull': specifier: ^10.0.1 - version: 10.2.3(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2))(bull@4.16.5) + version: 10.2.3(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(bull@4.16.5) '@nestjs/cache-manager': specifier: ^2.1.0 - version: 2.3.0(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2))(cache-manager@5.7.6)(rxjs@7.8.2) + version: 2.3.0(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(cache-manager@5.7.6)(rxjs@7.8.2) '@nestjs/common': specifier: ^10.2.7 version: 10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) @@ -46,13 +46,13 @@ importers: version: 10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/websockets@10.4.19)(rxjs@7.8.2) '@nestjs/schedule': specifier: ^3.0.1 - version: 3.0.4(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14) + version: 3.0.4(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(reflect-metadata@0.1.14) '@nestjs/swagger': specifier: ^7.1.6 - version: 7.4.2(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2))(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14) + version: 7.4.2(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14) '@nestjs/typeorm': specifier: ^10.0.0 - version: 10.0.2(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(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.2)(redis@3.1.2)(reflect-metadata@0.1.14)(ts-node@10.9.2(@types/node@20.19.1)(typescript@5.8.3))) + version: 10.0.2(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2)(typeorm@0.3.25(ioredis@5.6.1)(pg@8.16.2)(redis@3.1.2)(reflect-metadata@0.1.14)(ts-node@10.9.2(@types/node@20.19.1)(typescript@5.8.3))) '@nestjs/websockets': specifier: ^10.1.3 version: 10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(@nestjs/platform-socket.io@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2) @@ -143,6 +143,9 @@ importers: class-validator: specifier: ^0.14.0 version: 0.14.2 + cookie-parser: + specifier: ^1.4.7 + version: 1.4.7 crypto-js: specifier: ^4.1.1 version: 4.2.0 @@ -199,7 +202,7 @@ importers: version: 2.29.3 nestjs-cls: specifier: ^4.3.0 - version: 4.5.0(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2) + version: 4.5.0(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2) nestjs-rate-limiter: specifier: ^3.1.0 version: 3.1.0 @@ -302,7 +305,7 @@ importers: version: 10.2.3(chokidar@3.6.0)(typescript@5.8.3) '@nestjs/testing': specifier: ^10.1.3 - version: 10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19(@grpc/grpc-js@1.13.4)(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(@nestjs/websockets@10.4.19)(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.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)) + version: 10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19) '@types/express': specifier: ^4.17.17 version: 4.17.23 @@ -395,7 +398,7 @@ importers: version: 10.4.19(@grpc/grpc-js@1.13.4)(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(@nestjs/websockets@10.4.19)(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.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19(@grpc/grpc-js@1.13.4)(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(@nestjs/websockets@10.4.19)(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.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)) + version: 10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19) aws-sdk: specifier: ^2.1510.0 version: 2.1692.0 @@ -426,10 +429,10 @@ importers: version: 10.4.19(@grpc/grpc-js@1.13.4)(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(@nestjs/websockets@10.4.19)(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.4.2(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2))(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14) + version: 7.4.2(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14) '@nestjs/testing': specifier: ^10.1.3 - version: 10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19(@grpc/grpc-js@1.13.4)(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(@nestjs/websockets@10.4.19)(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.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)) + version: 10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19) '@prisma/client': specifier: ^5.1.1 version: 5.22.0(prisma@5.22.0) @@ -2402,6 +2405,10 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie-parser@1.4.7: + resolution: {integrity: sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==} + engines: {node: '>= 0.8.0'} + cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} @@ -6617,21 +6624,21 @@ snapshots: axios: 0.26.1 rxjs: 7.8.2 - '@nestjs/bull-shared@10.2.3(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2))': + '@nestjs/bull-shared@10.2.3(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)': dependencies: '@nestjs/common': 10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) '@nestjs/core': 10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2) tslib: 2.8.1 - '@nestjs/bull@10.2.3(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2))(bull@4.16.5)': + '@nestjs/bull@10.2.3(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(bull@4.16.5)': dependencies: - '@nestjs/bull-shared': 10.2.3(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2)) + '@nestjs/bull-shared': 10.2.3(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19) '@nestjs/common': 10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) '@nestjs/core': 10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2) bull: 4.16.5 tslib: 2.8.1 - '@nestjs/cache-manager@2.3.0(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2))(cache-manager@5.7.6)(rxjs@7.8.2)': + '@nestjs/cache-manager@2.3.0(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(cache-manager@5.7.6)(rxjs@7.8.2)': dependencies: '@nestjs/common': 10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) '@nestjs/core': 10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2) @@ -6762,7 +6769,7 @@ snapshots: - supports-color - utf-8-validate - '@nestjs/schedule@3.0.4(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)': + '@nestjs/schedule@3.0.4(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(reflect-metadata@0.1.14)': dependencies: '@nestjs/common': 10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) '@nestjs/core': 10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2) @@ -6792,7 +6799,7 @@ snapshots: transitivePeerDependencies: - chokidar - '@nestjs/swagger@7.4.2(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2))(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)': + '@nestjs/swagger@7.4.2(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)': dependencies: '@microsoft/tsdoc': 0.15.1 '@nestjs/common': 10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) @@ -6807,7 +6814,7 @@ snapshots: class-transformer: 0.5.1 class-validator: 0.14.2 - '@nestjs/testing@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19(@grpc/grpc-js@1.13.4)(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(@nestjs/websockets@10.4.19)(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.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19))': + '@nestjs/testing@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)': dependencies: '@nestjs/common': 10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) '@nestjs/core': 10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2) @@ -6816,7 +6823,7 @@ snapshots: '@nestjs/microservices': 10.4.19(@grpc/grpc-js@1.13.4)(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(@nestjs/websockets@10.4.19)(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.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19) - '@nestjs/typeorm@10.0.2(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(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.2)(redis@3.1.2)(reflect-metadata@0.1.14)(ts-node@10.9.2(@types/node@20.19.1)(typescript@5.8.3)))': + '@nestjs/typeorm@10.0.2(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2)(typeorm@0.3.25(ioredis@5.6.1)(pg@8.16.2)(redis@3.1.2)(reflect-metadata@0.1.14)(ts-node@10.9.2(@types/node@20.19.1)(typescript@5.8.3)))': dependencies: '@nestjs/common': 10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) '@nestjs/core': 10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2) @@ -8439,6 +8446,11 @@ snapshots: convert-source-map@2.0.0: {} + cookie-parser@1.4.7: + dependencies: + cookie: 0.7.2 + cookie-signature: 1.0.6 + cookie-signature@1.0.6: {} cookie@0.5.0: @@ -10845,7 +10857,7 @@ snapshots: neo-async@2.6.2: {} - nestjs-cls@4.5.0(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2): + nestjs-cls@4.5.0(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2): dependencies: '@nestjs/common': 10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2) '@nestjs/core': 10.4.19(@nestjs/common@10.4.19(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/microservices@10.4.19)(@nestjs/platform-express@10.4.19)(@nestjs/websockets@10.4.19)(reflect-metadata@0.1.14)(rxjs@7.8.2) From 541f603ea28ddf5d26b76d84e63038912c2ae08b Mon Sep 17 00:00:00 2001 From: bhavanakarwade Date: Thu, 24 Jul 2025 11:33:45 +0530 Subject: [PATCH 21/60] wip: fetch session details Signed-off-by: bhavanakarwade --- .../api-gateway/src/authz/authz.controller.ts | 16 +++++++----- apps/api-gateway/src/authz/authz.module.ts | 24 +++++++++-------- .../src/authz/guards/session.guard.ts | 26 +++++++++++++++++++ apps/user/repositories/user.repository.ts | 10 +++++++ apps/user/src/user.controller.ts | 4 +-- apps/user/src/user.service.ts | 2 +- 6 files changed, 62 insertions(+), 20 deletions(-) create mode 100644 apps/api-gateway/src/authz/guards/session.guard.ts diff --git a/apps/api-gateway/src/authz/authz.controller.ts b/apps/api-gateway/src/authz/authz.controller.ts index fd708d773..197b78180 100644 --- a/apps/api-gateway/src/authz/authz.controller.ts +++ b/apps/api-gateway/src/authz/authz.controller.ts @@ -10,7 +10,8 @@ import { Req, Res, UnauthorizedException, - UseFilters + UseFilters, + UseGuards } from '@nestjs/common'; import { AuthzService } from './authz.service'; import { CommonService } from '../../../../libs/common/src/common.service'; @@ -19,7 +20,7 @@ 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 { Response } from 'express'; +import { Request, 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'; @@ -31,8 +32,7 @@ import { ResetTokenPasswordDto } from './dtos/reset-token-password'; import { RefreshTokenDto } from './dtos/refresh-token.dto'; import { getDefaultClient } from '../user/utils'; import { ClientAliasValidationPipe } from './decorators/user-auth-client'; -import { Request } from 'express'; - +import { SessionGuard } from './guards/session.guard'; @Controller('auth') @ApiTags('auth') @UseFilters(CustomExceptionFilter) @@ -170,7 +170,6 @@ export class AuthzController { secure: false, maxAge: 30 * 24 * 60 * 60 * 1000 }); - return res.status(HttpStatus.OK).json(finalResponse); } else { throw new UnauthorizedException(`Please provide valid credentials`); @@ -187,10 +186,15 @@ export class AuthzController { summary: 'Fetch session details', description: 'Fetch session details against logged in user' }) + @UseGuards(SessionGuard) + // @ApiQuery({ + // name: 'sessionId', + // type: String, + // required: true + // }) @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: AuthTokenResponse }) async sessionDetails(@Req() req: Request, @Res() res: Response): Promise { const sessionId = req.cookies['session_id']; - const sessionDetails = await this.authzService.getSession(sessionId); const finalResponse: IResponseType = { diff --git a/apps/api-gateway/src/authz/authz.module.ts b/apps/api-gateway/src/authz/authz.module.ts index 78b862ca0..de7c42222 100644 --- a/apps/api-gateway/src/authz/authz.module.ts +++ b/apps/api-gateway/src/authz/authz.module.ts @@ -1,25 +1,27 @@ import { ClientsModule, Transport } from '@nestjs/microservices'; +import { Logger, Module } from '@nestjs/common'; import { AgentService } from '../agent/agent.service'; import { AuthzController } from './authz.controller'; import { AuthzService } from './authz.service'; +import { CommonConstants } from '@credebl/common/common.constant'; 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 { NATSClient } from '@credebl/common/NATSClient'; +import { OrganizationService } from '../organization/organization.service'; import { PassportModule } from '@nestjs/passport'; +import { PrismaServiceModule } from '@credebl/prisma-service'; import { SocketGateway } from './socket.gateway'; import { SupabaseService } from '@credebl/supabase'; import { UserModule } from '../user/user.module'; +import { UserRepository } from 'apps/user/repositories/user.repository'; import { UserService } from '../user/user.service'; import { VerificationService } from '../verification/verification.service'; import { getNatsOptions } from '@credebl/common/nats.config'; -import { OrganizationService } from '../organization/organization.service'; -import { CommonConstants } from '@credebl/common/common.constant'; -import { NATSClient } from '@credebl/common/NATSClient'; @Module({ imports: [ @@ -36,7 +38,8 @@ import { NATSClient } from '@credebl/common/NATSClient'; }, CommonModule ]), - UserModule + UserModule, + PrismaServiceModule ], providers: [ JwtStrategy, @@ -50,12 +53,11 @@ import { NATSClient } from '@credebl/common/NATSClient'; CommonService, UserService, SupabaseService, - OrganizationService - ], - exports: [ - PassportModule, - AuthzService + OrganizationService, + UserRepository, + Logger ], + exports: [PassportModule, AuthzService], controllers: [AuthzController] }) -export class AuthzModule { } \ No newline at end of file +export class AuthzModule {} diff --git a/apps/api-gateway/src/authz/guards/session.guard.ts b/apps/api-gateway/src/authz/guards/session.guard.ts new file mode 100644 index 000000000..64812bbb1 --- /dev/null +++ b/apps/api-gateway/src/authz/guards/session.guard.ts @@ -0,0 +1,26 @@ +import { CanActivate, ExecutionContext, Injectable, UnauthorizedException } from '@nestjs/common'; + +import { Request } from 'express'; +import { UserRepository } from 'apps/user/repositories/user.repository'; + +@Injectable() +export class SessionGuard implements CanActivate { + constructor(private userRepository: UserRepository) {} + + async canActivate(context: ExecutionContext): Promise { + const request = context.switchToHttp().getRequest(); + const sessionId = request.cookies['session_id']; + if (!sessionId) { + throw new UnauthorizedException('Missing session cookie'); + } + + const user = await this.userRepository.validateSession(sessionId); + + if (!user) { + throw new UnauthorizedException('Invalid session'); + } + + request.user = user; + return true; + } +} diff --git a/apps/user/repositories/user.repository.ts b/apps/user/repositories/user.repository.ts index 7d9465b8a..5f523f3e5 100644 --- a/apps/user/repositories/user.repository.ts +++ b/apps/user/repositories/user.repository.ts @@ -139,6 +139,16 @@ export class UserRepository { } } + async validateSession(sessionId: string): Promise { + const session = await this.prisma.session.findUnique({ + where: { id: sessionId }, + include: { user: true } + }); + + // if (!session || new Date() > session.expires) return null; + return session.user; + } + /** * * @param id diff --git a/apps/user/src/user.controller.ts b/apps/user/src/user.controller.ts index 8dd8ca2e4..e6d20d754 100644 --- a/apps/user/src/user.controller.ts +++ b/apps/user/src/user.controller.ts @@ -79,8 +79,8 @@ export class UserController { @MessagePattern({ cmd: 'fetch-session-details' }) // eslint-disable-next-line @typescript-eslint/no-explicit-any - async getSession(sessionId: string): Promise { - return this.userService.getSession(sessionId); + async getSession(payload: { sessionId: string }): Promise { + return this.userService.getSession(payload?.sessionId); } @MessagePattern({ cmd: 'refresh-token-details' }) diff --git a/apps/user/src/user.service.ts b/apps/user/src/user.service.ts index fd25a24ba..eb9513641 100644 --- a/apps/user/src/user.service.ts +++ b/apps/user/src/user.service.ts @@ -479,7 +479,7 @@ export class UserService { const finalResponse = { ...tokenDetails, - seesionId: addSessionDetails.id + sessionId: addSessionDetails.id }; return finalResponse; From ecfac3ddfca4493efb37141bd022d491dae57a5e Mon Sep 17 00:00:00 2001 From: bhavanakarwade Date: Thu, 24 Jul 2025 18:55:50 +0530 Subject: [PATCH 22/60] wip: fetch session details Signed-off-by: bhavanakarwade --- .../api-gateway/src/authz/authz.controller.ts | 28 ++++++------------- apps/api-gateway/src/authz/authz.service.ts | 6 ++-- apps/user/interfaces/user.interface.ts | 6 ++++ apps/user/repositories/user.repository.ts | 14 ++++++++++ apps/user/src/user.controller.ts | 4 +-- apps/user/src/user.service.ts | 11 +++++--- .../migration.sql | 3 ++ libs/prisma-service/prisma/schema.prisma | 2 +- 8 files changed, 45 insertions(+), 29 deletions(-) rename libs/prisma-service/prisma/migrations/{20250718131738_added_session_account_user => 20250724130424_added_session_account}/migration.sql (95%) diff --git a/apps/api-gateway/src/authz/authz.controller.ts b/apps/api-gateway/src/authz/authz.controller.ts index 197b78180..e3b31ec3c 100644 --- a/apps/api-gateway/src/authz/authz.controller.ts +++ b/apps/api-gateway/src/authz/authz.controller.ts @@ -7,11 +7,9 @@ import { Param, Post, Query, - Req, Res, UnauthorizedException, - UseFilters, - UseGuards + UseFilters } from '@nestjs/common'; import { AuthzService } from './authz.service'; import { CommonService } from '../../../../libs/common/src/common.service'; @@ -20,7 +18,7 @@ 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 { Request, Response } from 'express'; +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'; @@ -32,7 +30,6 @@ import { ResetTokenPasswordDto } from './dtos/reset-token-password'; import { RefreshTokenDto } from './dtos/refresh-token.dto'; import { getDefaultClient } from '../user/utils'; import { ClientAliasValidationPipe } from './decorators/user-auth-client'; -import { SessionGuard } from './guards/session.guard'; @Controller('auth') @ApiTags('auth') @UseFilters(CustomExceptionFilter) @@ -141,6 +138,7 @@ export class AuthzController { }; return res.status(HttpStatus.CREATED).json(finalResponse); } + /** * Authenticates a user and returns an access token. * @@ -164,12 +162,6 @@ export class AuthzController { data: userData }; - res.cookie('session_id', userData.sessionId, { - httpOnly: true, - sameSite: 'lax', - secure: false, - maxAge: 30 * 24 * 60 * 60 * 1000 - }); return res.status(HttpStatus.OK).json(finalResponse); } else { throw new UnauthorizedException(`Please provide valid credentials`); @@ -186,15 +178,13 @@ export class AuthzController { summary: 'Fetch session details', description: 'Fetch session details against logged in user' }) - @UseGuards(SessionGuard) - // @ApiQuery({ - // name: 'sessionId', - // type: String, - // required: true - // }) + @ApiQuery({ + name: 'sessionId', + type: String, + required: true + }) @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: AuthTokenResponse }) - async sessionDetails(@Req() req: Request, @Res() res: Response): Promise { - const sessionId = req.cookies['session_id']; + async sessionDetails(@Query() sessionId: string, @Res() res: Response): Promise { const sessionDetails = await this.authzService.getSession(sessionId); const finalResponse: IResponseType = { diff --git a/apps/api-gateway/src/authz/authz.service.ts b/apps/api-gateway/src/authz/authz.service.ts index 03188eec3..d785cf230 100644 --- a/apps/api-gateway/src/authz/authz.service.ts +++ b/apps/api-gateway/src/authz/authz.service.ts @@ -17,6 +17,7 @@ import { ForgotPasswordDto } from './dtos/forgot-password.dto'; import { ResetTokenPasswordDto } from './dtos/reset-token-password'; import { NATSClient } from '@credebl/common/NATSClient'; import { user } from '@prisma/client'; +import { ISessionDetails } from 'apps/user/interfaces/user.interface'; @Injectable() @WebSocketGateway() export class AuthzService extends BaseService { @@ -53,9 +54,8 @@ export class AuthzService extends BaseService { return this.natsClient.sendNatsMessage(this.authServiceProxy, 'user-holder-login', payload); } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - async getSession(sessionId: string): Promise { - const payload = { sessionId }; + async getSession(sessionId): Promise { + const payload = { ...sessionId }; return this.natsClient.sendNatsMessage(this.authServiceProxy, 'fetch-session-details', payload); } diff --git a/apps/user/interfaces/user.interface.ts b/apps/user/interfaces/user.interface.ts index 8cdf48a49..cf62d8a90 100644 --- a/apps/user/interfaces/user.interface.ts +++ b/apps/user/interfaces/user.interface.ts @@ -188,6 +188,12 @@ export interface ISession { refreshToken?: string; } +export interface ISessionDetails extends ISession { + id: string; + createdAt: Date; + updatedAt: Date; +} + export interface IUserResetPassword { email: string; oldPassword?: string; diff --git a/apps/user/repositories/user.repository.ts b/apps/user/repositories/user.repository.ts index 5f523f3e5..e61760cf0 100644 --- a/apps/user/repositories/user.repository.ts +++ b/apps/user/repositories/user.repository.ts @@ -696,6 +696,20 @@ export class UserRepository { } } + async checkAccountDetails(userId: string): Promise { + try { + const accountDetails = await this.prisma.account.findUnique({ + where: { + userId + } + }); + return accountDetails; + } catch (error) { + this.logger.error(`Error in getting account details: ${error.message} `); + throw error; + } + } + // async updateAccountDetails(accountDetails: ISession): Promise { // try { // const userAccountDetails = await this.prisma.account.update({ diff --git a/apps/user/src/user.controller.ts b/apps/user/src/user.controller.ts index e6d20d754..4031c2e55 100644 --- a/apps/user/src/user.controller.ts +++ b/apps/user/src/user.controller.ts @@ -1,6 +1,7 @@ import { ICheckUserDetails, IOrgUsers, + ISessionDetails, IUserDeletedActivity, IUserForgotPassword, IUserInformation, @@ -78,8 +79,7 @@ export class UserController { } @MessagePattern({ cmd: 'fetch-session-details' }) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - async getSession(payload: { sessionId: string }): Promise { + async getSession(payload: { sessionId: string }): Promise { return this.userService.getSession(payload?.sessionId); } diff --git a/apps/user/src/user.service.ts b/apps/user/src/user.service.ts index eb9513641..1d09c4d45 100644 --- a/apps/user/src/user.service.ts +++ b/apps/user/src/user.service.ts @@ -39,7 +39,8 @@ import { IUserDeletedActivity, UserKeycloakId, IEcosystemConfig, - IUserForgotPassword + IUserForgotPassword, + ISessionDetails } from '../interfaces/user.interface'; import { AcceptRejectInvitationDto } from '../dtos/accept-reject-invitation.dto'; import { UserActivityService } from '@credebl/user-activity'; @@ -474,6 +475,8 @@ export class UserService { refreshToken: tokenDetails?.refresh_token }; const addSessionDetails = await this.userRepository.createSession(sessionData); + // const fetchAccountDetails = await this.userRepository.checkAccountDetails(userData?.id); + // console.log("🚀 ~ UserService ~ login ~ fetchAccountDetails:", fetchAccountDetails) // await this.userRepository.updateAccountDetails(sessionData); @@ -490,10 +493,10 @@ export class UserService { } } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - async getSession(sessionId: string): Promise { + async getSession(sessionId: string): Promise { try { - const sessionDetails = await this.userRepository.getSession(sessionId); + const decryptedSessionId = await this.commonService.decryptPassword(sessionId); + const sessionDetails = await this.userRepository.getSession(decryptedSessionId); return sessionDetails; } catch (error) { this.logger.error(`In fetching session details : ${JSON.stringify(error)}`); diff --git a/libs/prisma-service/prisma/migrations/20250718131738_added_session_account_user/migration.sql b/libs/prisma-service/prisma/migrations/20250724130424_added_session_account/migration.sql similarity index 95% rename from libs/prisma-service/prisma/migrations/20250718131738_added_session_account_user/migration.sql rename to libs/prisma-service/prisma/migrations/20250724130424_added_session_account/migration.sql index 951877c55..ddaf77772 100644 --- a/libs/prisma-service/prisma/migrations/20250718131738_added_session_account_user/migration.sql +++ b/libs/prisma-service/prisma/migrations/20250724130424_added_session_account/migration.sql @@ -31,6 +31,9 @@ CREATE TABLE "session" ( CONSTRAINT "session_pkey" PRIMARY KEY ("id") ); +-- CreateIndex +CREATE UNIQUE INDEX "account_userId_key" ON "account"("userId"); + -- CreateIndex CREATE UNIQUE INDEX "account_refresh_token_key" ON "account"("refresh_token"); diff --git a/libs/prisma-service/prisma/schema.prisma b/libs/prisma-service/prisma/schema.prisma index d37175da2..f848a9d46 100644 --- a/libs/prisma-service/prisma/schema.prisma +++ b/libs/prisma-service/prisma/schema.prisma @@ -40,7 +40,7 @@ model user { model account { id String @id @default(uuid()) @db.Uuid - userId String @db.Uuid + userId String @unique @db.Uuid type String? provider String providerAccountId String From ff8aef30fd5e5db329da6576dda8b1ce1d8c80e1 Mon Sep 17 00:00:00 2001 From: bhavanakarwade Date: Fri, 25 Jul 2025 13:38:42 +0530 Subject: [PATCH 23/60] fix: encryption issues Signed-off-by: bhavanakarwade --- apps/user/src/user.service.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/user/src/user.service.ts b/apps/user/src/user.service.ts index 1d09c4d45..56c95356f 100644 --- a/apps/user/src/user.service.ts +++ b/apps/user/src/user.service.ts @@ -495,7 +495,8 @@ export class UserService { async getSession(sessionId: string): Promise { try { - const decryptedSessionId = await this.commonService.decryptPassword(sessionId); + const decodedSessionId = decodeURIComponent(sessionId); + const decryptedSessionId = await this.commonService.decryptPassword(decodedSessionId); const sessionDetails = await this.userRepository.getSession(decryptedSessionId); return sessionDetails; } catch (error) { From b13693246c90d1c736f95488b3c37a0ea1616fdb Mon Sep 17 00:00:00 2001 From: shitrerohit Date: Tue, 29 Jul 2025 14:08:29 +0530 Subject: [PATCH 24/60] fix:Added realtion between session and account table Signed-off-by: shitrerohit --- .../migration.sql | 14 ++++++++++++++ libs/prisma-service/prisma/schema.prisma | 5 ++++- 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 libs/prisma-service/prisma/migrations/20250729083628_reltion_between_account_and_session/migration.sql diff --git a/libs/prisma-service/prisma/migrations/20250729083628_reltion_between_account_and_session/migration.sql b/libs/prisma-service/prisma/migrations/20250729083628_reltion_between_account_and_session/migration.sql new file mode 100644 index 000000000..0e6137796 --- /dev/null +++ b/libs/prisma-service/prisma/migrations/20250729083628_reltion_between_account_and_session/migration.sql @@ -0,0 +1,14 @@ +/* + Warnings: + + - A unique constraint covering the columns `[accountId]` on the table `session` will be added. If there are existing duplicate values, this will fail. + +*/ +-- AlterTable +ALTER TABLE "session" ADD COLUMN "accountId" UUID; + +-- CreateIndex +CREATE UNIQUE INDEX "session_accountId_key" ON "session"("accountId"); + +-- AddForeignKey +ALTER TABLE "session" ADD CONSTRAINT "session_accountId_fkey" FOREIGN KEY ("accountId") REFERENCES "account"("id") ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/libs/prisma-service/prisma/schema.prisma b/libs/prisma-service/prisma/schema.prisma index f848a9d46..0cba419ec 100644 --- a/libs/prisma-service/prisma/schema.prisma +++ b/libs/prisma-service/prisma/schema.prisma @@ -43,7 +43,7 @@ model account { userId String @unique @db.Uuid type String? provider String - providerAccountId String + providerAccountId String refresh_token String? @unique access_token String? @unique expires_at Int? @@ -54,6 +54,7 @@ model account { createdAt DateTime @default(now()) updatedAt DateTime @updatedAt user user @relation(fields: [userId], references: [id]) + sessions session[] } model session { @@ -65,6 +66,8 @@ model session { user user @relation(fields: [userId], references: [id]) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt + accountId String? @unique @db.Uuid + account account? @relation(fields: [accountId], references:[id]) } From c4d66f2bc5139da1cc83343fddcf88307094b532 Mon Sep 17 00:00:00 2001 From: bhavanakarwade Date: Tue, 29 Jul 2025 15:39:02 +0530 Subject: [PATCH 25/60] wip: update session Signed-off-by: bhavanakarwade --- apps/user/interfaces/user.interface.ts | 6 +- apps/user/repositories/user.repository.ts | 118 ++++++++++-------- apps/user/src/user.service.ts | 37 +++++- libs/common/src/response-messages/index.ts | 2 + .../migration.sql | 2 + libs/prisma-service/prisma/schema.prisma | 7 +- 6 files changed, 108 insertions(+), 64 deletions(-) create mode 100644 libs/prisma-service/prisma/migrations/20250729090416_removed_userid_unique_constraint/migration.sql diff --git a/apps/user/interfaces/user.interface.ts b/apps/user/interfaces/user.interface.ts index cf62d8a90..d647cfce5 100644 --- a/apps/user/interfaces/user.interface.ts +++ b/apps/user/interfaces/user.interface.ts @@ -182,10 +182,12 @@ export interface IUserSignIn { } export interface ISession { - sessionToken: string; - userId: string; + sessionToken?: string; + userId?: string; expires?: number; refreshToken?: string; + keycloakUserId?: string; + type?: string; } export interface ISessionDetails extends ISession { diff --git a/apps/user/repositories/user.repository.ts b/apps/user/repositories/user.repository.ts index e61760cf0..b5dfc165e 100644 --- a/apps/user/repositories/user.repository.ts +++ b/apps/user/repositories/user.repository.ts @@ -1,7 +1,6 @@ /* eslint-disable prefer-destructuring */ import { - IAccountDetails, IOrgUsers, ISendVerificationEmail, ISession, @@ -17,11 +16,11 @@ import { UserRoleMapping } from '../interfaces/user.interface'; import { Injectable, InternalServerErrorException, Logger, NotFoundException } from '@nestjs/common'; +import { ProviderType, UserRole } from '@credebl/enum/enum'; // eslint-disable-next-line camelcase import { RecordType, account, client_aliases, schema, session, token, user, user_org_roles } from '@prisma/client'; import { PrismaService } from '@credebl/prisma-service'; -import { UserRole } from '@credebl/enum/enum'; interface UserQueryOptions { id?: string; // Use the appropriate type based on your data model @@ -671,27 +670,32 @@ export class UserRepository { async createSession(tokenDetails: ISession): Promise { try { const { sessionToken, userId, expires, refreshToken } = tokenDetails; - const sessionResponse = await this.prisma.session.upsert({ - where: { - userId - }, - create: { - sessionToken, - userId, - expires, - // eslint-disable-next-line camelcase - refresh_token: refreshToken - }, - update: { + const sessionResponse = await this.prisma.session.create({ + data: { sessionToken, expires, + userId, // eslint-disable-next-line camelcase refresh_token: refreshToken } }); return sessionResponse; } catch (error) { - this.logger.error(`Error in createTokenForResetPassword: ${error.message} `); + this.logger.error(`Error in creating session: ${error.message} `); + throw error; + } + } + + async fetchUserSessions(userId: string): Promise { + try { + const userSessionCount = await this.prisma.session.findMany({ + where: { + userId + } + }); + return userSessionCount; + } catch (error) { + this.logger.error(`Error in getting user session details: ${error.message} `); throw error; } } @@ -710,27 +714,51 @@ export class UserRepository { } } - // async updateAccountDetails(accountDetails: ISession): Promise { - // try { - // const userAccountDetails = await this.prisma.account.update({ - // where: { - // userId: accountDetails?.userId - // }, - // data: { - // // eslint-disable-next-line camelcase - // access_token: accountDetails?.sessionToken, - // // eslint-disable-next-line camelcase - // refresh_token: accountDetails?.refreshToken, - // // eslint-disable-next-line camelcase - // expires_at: accountDetails?.expires - // } - // }); - // return userAccountDetails; - // } catch (error) { - // this.logger.error(`Error in createTokenForResetPassword: ${error.message} `); - // throw error; - // } - // } + async updateAccountDetails(accountDetails: ISession): Promise { + try { + const userAccountDetails = await this.prisma.account.update({ + where: { + userId: accountDetails.userId + }, + data: { + // eslint-disable-next-line camelcase + access_token: accountDetails.sessionToken, + // eslint-disable-next-line camelcase + refresh_token: accountDetails.refreshToken, + // eslint-disable-next-line camelcase + expires_at: accountDetails.expires + } + }); + return userAccountDetails; + } catch (error) { + this.logger.error(`Error in updateAccountDetails: ${error.message}`); + throw error; + } + } + + async addAccountDetails(accountDetails: ISession): Promise { + try { + const userAccountDetails = await this.prisma.account.create({ + data: { + userId: accountDetails.userId, + provider: ProviderType.KEYCLOAK, + providerAccountId: accountDetails.keycloakUserId, + // eslint-disable-next-line camelcase + access_token: accountDetails.sessionToken, + // eslint-disable-next-line camelcase + refresh_token: accountDetails.refreshToken, + // eslint-disable-next-line camelcase + expires_at: accountDetails.expires, + // eslint-disable-next-line camelcase + token_type: accountDetails.type + } + }); + return userAccountDetails; + } catch (error) { + this.logger.error(`Error in creating account: ${error.message}`); + throw error; + } + } /** * @@ -903,24 +931,6 @@ export class UserRepository { } } - async storeUserAccountDetails(accountDetails: IAccountDetails): Promise { - try { - const userAccountDetails = await this.prisma.account.create({ - data: { - userId: accountDetails?.userId, - provider: accountDetails?.provider, - providerAccountId: accountDetails?.providerAccountId, - // eslint-disable-next-line camelcase - token_type: accountDetails?.token_type - } - }); - return userAccountDetails; - } catch (error) { - this.logger.error(`Error in storing account details: ${error.message} `); - throw error; - } - } - async getUserRole(role: UserRole): Promise { try { const getUserRole = await this.prisma.user_role.findFirstOrThrow({ diff --git a/apps/user/src/user.service.ts b/apps/user/src/user.service.ts index 56c95356f..0a7f651d3 100644 --- a/apps/user/src/user.service.ts +++ b/apps/user/src/user.service.ts @@ -387,7 +387,7 @@ export class UserService { token_type: TokenType.USER_TOKEN }; - await this.userRepository.storeUserAccountDetails(userAccountDetails); + await this.userRepository.addAccountDetails(userAccountDetails); return { userId: userDetails?.id }; } catch (error) { @@ -448,6 +448,13 @@ export class UserService { try { this.validateEmail(email.toLowerCase()); const userData = await this.userRepository.checkUserExist(email.toLowerCase()); + + const userSessionDetails = await this.userRepository.fetchUserSessions(userData?.id); + + if (3 <= userSessionDetails?.length) { + throw new BadRequestException(ResponseMessages.user.error.sessionLimitReached); + } + if (!userData) { throw new NotFoundException(ResponseMessages.user.error.notFound); } @@ -474,11 +481,33 @@ export class UserService { expires: tokenDetails?.expires_in, refreshToken: tokenDetails?.refresh_token }; + const addSessionDetails = await this.userRepository.createSession(sessionData); - // const fetchAccountDetails = await this.userRepository.checkAccountDetails(userData?.id); - // console.log("🚀 ~ UserService ~ login ~ fetchAccountDetails:", fetchAccountDetails) - // await this.userRepository.updateAccountDetails(sessionData); + const fetchAccountDetails = await this.userRepository.checkAccountDetails(userData?.id); + + let accountData; + if (null === fetchAccountDetails) { + accountData = { + sessionToken: tokenDetails?.access_token, + userId: userData?.id, + expires: tokenDetails?.expires_in, + refreshToken: tokenDetails?.refresh_token, + keycloakUserId: userData?.keycloakUserId, + type: TokenType.USER_TOKEN + }; + + await this.userRepository.addAccountDetails(accountData); + } else { + accountData = { + sessionToken: tokenDetails?.access_token, + userId: userData?.id, + expires: tokenDetails?.expires_in, + refreshToken: tokenDetails?.refresh_token + }; + + await this.userRepository.updateAccountDetails(accountData); + } const finalResponse = { ...tokenDetails, diff --git a/libs/common/src/response-messages/index.ts b/libs/common/src/response-messages/index.ts index 47cb5153a..79567a798 100644 --- a/libs/common/src/response-messages/index.ts +++ b/libs/common/src/response-messages/index.ts @@ -38,6 +38,8 @@ export const ResponseMessages = { invalidEmailUrl: 'Invalid verification code or EmailId!', verifiedEmail: 'Email already verified', notFound: 'User not found', + sessionLimitReached: + 'You have reached the maximum number of allowed sessions. Please remove an existing session to add a new one', verifyMail: 'Please verify your email', invalidCredentials: 'Invalid Credentials', registerFido: 'Please complete your fido registration', diff --git a/libs/prisma-service/prisma/migrations/20250729090416_removed_userid_unique_constraint/migration.sql b/libs/prisma-service/prisma/migrations/20250729090416_removed_userid_unique_constraint/migration.sql new file mode 100644 index 000000000..5c5bf63c5 --- /dev/null +++ b/libs/prisma-service/prisma/migrations/20250729090416_removed_userid_unique_constraint/migration.sql @@ -0,0 +1,2 @@ +-- DropIndex +DROP INDEX "session_userId_key"; diff --git a/libs/prisma-service/prisma/schema.prisma b/libs/prisma-service/prisma/schema.prisma index 0cba419ec..6023294cb 100644 --- a/libs/prisma-service/prisma/schema.prisma +++ b/libs/prisma-service/prisma/schema.prisma @@ -60,17 +60,16 @@ model account { model session { id String @id @default(uuid()) @db.Uuid sessionToken String @unique - userId String @unique @db.Uuid + userId String @db.Uuid expires Int refresh_token String? @unique user user @relation(fields: [userId], references: [id]) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt - accountId String? @unique @db.Uuid - account account? @relation(fields: [accountId], references:[id]) + accountId String? @unique @db.Uuid + account account? @relation(fields: [accountId], references:[id]) } - model token { id String @id @default(uuid()) @db.Uuid token String @unique From 1b4b699ed636d9e85b1285da7b437646c2a23dc6 Mon Sep 17 00:00:00 2001 From: shitrerohit Date: Wed, 30 Jul 2025 14:40:30 +0530 Subject: [PATCH 26/60] fix: Flow modification in generate token using clientId and secrat API Signed-off-by: shitrerohit --- .../api-gateway/src/authz/authz.controller.ts | 30 +- .../src/authz/guards/session.guard.ts | 19 +- .../organization/organization.controller.ts | 7 + .../repositories/organization.repository.ts | 24 +- apps/organization/src/organization.service.ts | 733 ++++++++++-------- apps/user/repositories/user.repository.ts | 3 +- apps/user/src/user.service.ts | 12 +- libs/common/src/interfaces/interface.ts | 1 + 8 files changed, 463 insertions(+), 366 deletions(-) diff --git a/apps/api-gateway/src/authz/authz.controller.ts b/apps/api-gateway/src/authz/authz.controller.ts index e3b31ec3c..407358d2f 100644 --- a/apps/api-gateway/src/authz/authz.controller.ts +++ b/apps/api-gateway/src/authz/authz.controller.ts @@ -7,9 +7,11 @@ import { Param, Post, Query, + Req, Res, UnauthorizedException, - UseFilters + UseFilters, + UseGuards } from '@nestjs/common'; import { AuthzService } from './authz.service'; import { CommonService } from '../../../../libs/common/src/common.service'; @@ -18,7 +20,7 @@ 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 { Response } from 'express'; +import { Response, Request } 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'; @@ -30,6 +32,10 @@ import { ResetTokenPasswordDto } from './dtos/reset-token-password'; import { RefreshTokenDto } from './dtos/refresh-token.dto'; import { getDefaultClient } from '../user/utils'; import { ClientAliasValidationPipe } from './decorators/user-auth-client'; +import { SessionGuard } from './guards/session.guard'; +interface SessionDetails { + sessionId: string; +} @Controller('auth') @ApiTags('auth') @UseFilters(CustomExceptionFilter) @@ -174,18 +180,30 @@ export class AuthzController { * @returns User's access token details */ @Get('/sessionDetails') + @UseGuards(SessionGuard) @ApiOperation({ summary: 'Fetch session details', description: 'Fetch session details against logged in user' }) @ApiQuery({ name: 'sessionId', - type: String, - required: true + required: false }) @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: AuthTokenResponse }) - async sessionDetails(@Query() sessionId: string, @Res() res: Response): Promise { - const sessionDetails = await this.authzService.getSession(sessionId); + async sessionDetails( + @Res() res: Response, + @Req() req: Request, + @Query() sessionId: SessionDetails + ): Promise { + this.logger.debug(`in authz controller`); + + let sessionDetails; + if (0 < Object.keys(sessionId).length) { + sessionDetails = await this.authzService.getSession(sessionId); + } + if (req.user) { + sessionDetails = req.user; + } const finalResponse: IResponseType = { statusCode: HttpStatus.OK, diff --git a/apps/api-gateway/src/authz/guards/session.guard.ts b/apps/api-gateway/src/authz/guards/session.guard.ts index 64812bbb1..fafa1f76e 100644 --- a/apps/api-gateway/src/authz/guards/session.guard.ts +++ b/apps/api-gateway/src/authz/guards/session.guard.ts @@ -1,4 +1,4 @@ -import { CanActivate, ExecutionContext, Injectable, UnauthorizedException } from '@nestjs/common'; +import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common'; import { Request } from 'express'; import { UserRepository } from 'apps/user/repositories/user.repository'; @@ -10,17 +10,18 @@ export class SessionGuard implements CanActivate { async canActivate(context: ExecutionContext): Promise { const request = context.switchToHttp().getRequest(); const sessionId = request.cookies['session_id']; - if (!sessionId) { - throw new UnauthorizedException('Missing session cookie'); - } - - const user = await this.userRepository.validateSession(sessionId); - if (!user) { - throw new UnauthorizedException('Invalid session'); + // if (!sessionId) { + // throw new UnauthorizedException('Missing session cookie'); + // } + if (sessionId) { + const user = await this.userRepository.validateSession(sessionId); + request.user = user; } - request.user = user; + // if (!user) { + // throw new UnauthorizedException('Invalid session'); + // } return true; } } diff --git a/apps/api-gateway/src/organization/organization.controller.ts b/apps/api-gateway/src/organization/organization.controller.ts index 72f012fe4..8257119f9 100644 --- a/apps/api-gateway/src/organization/organization.controller.ts +++ b/apps/api-gateway/src/organization/organization.controller.ts @@ -550,11 +550,18 @@ export class OrganizationController { } const orgCredentials = await this.organizationService.clientLoginCredentials(clientCredentialsDto); + const finalResponse: IResponse = { statusCode: HttpStatus.OK, message: ResponseMessages.organisation.success.clientCredentials, data: orgCredentials }; + res.cookie('session_id', orgCredentials.sessionId, { + httpOnly: true, + sameSite: 'lax', + secure: false + }); + return res.status(HttpStatus.OK).json(finalResponse); } /** diff --git a/apps/organization/repositories/organization.repository.ts b/apps/organization/repositories/organization.repository.ts index d5dab6222..ad9d9b964 100644 --- a/apps/organization/repositories/organization.repository.ts +++ b/apps/organization/repositories/organization.repository.ts @@ -760,7 +760,29 @@ export class OrganizationRepository { throw error; } } - + async getOrgAndAdminUser(orgId: string): Promise { + try { + return this.prisma.user_org_roles.findFirst({ + where: { + orgId + // orgRole:{ + // name:'admin' + // } + }, + include: { + user: { + select: { + id: true, + keycloakUserId: true + } + } + } + }); + } catch (error) { + this.logger.error(`Error in fetch in organization with admin details`); + throw error; + } + } async getCredDefByOrg(orgId: string): Promise< { tag: string; diff --git a/apps/organization/src/organization.service.ts b/apps/organization/src/organization.service.ts index edf05c322..ef507b214 100644 --- a/apps/organization/src/organization.service.ts +++ b/apps/organization/src/organization.service.ts @@ -27,8 +27,19 @@ import { sendEmail } from '@credebl/common/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 { IGetOrgById, IGetOrganization, IUpdateOrganization, IClientCredentials, ICreateConnectionUrl, IOrgRole, IDidList, IPrimaryDidDetails, IEcosystemOrgStatus, IOrgDetails } from '../interfaces/organization.interface'; +import { DidMethod, Invitation, Ledgers, PrismaTables, TokenType, transition } from '@credebl/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'; import { map } from 'rxjs/operators'; @@ -52,6 +63,7 @@ import { UserActivityRepository } from 'libs/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 { UserRepository } from 'apps/user/repositories/user.repository'; @Injectable() export class OrganizationService { constructor( @@ -67,9 +79,10 @@ export class OrganizationService { @Inject(CACHE_MANAGER) private cacheService: Cache, private readonly clientRegistrationService: ClientRegistrationService, private readonly userActivityRepository: UserActivityRepository, - private readonly natsClient : NATSClient + private readonly natsClient: NATSClient, + private readonly userRepository: UserRepository ) {} - + async getPlatformConfigDetails(): Promise { try { const getPlatformDetails = await this.organizationRepository.getPlatformConfigDetails(); @@ -79,7 +92,7 @@ export class OrganizationService { throw new RpcException(error.response ? error.response : error); } } - + /** * * @param registerOrgDto @@ -93,10 +106,10 @@ export class OrganizationService { keycloakUserId: string ): Promise { try { - const userOrgCount = await this.organizationRepository.userOrganizationCount(userId); - + const userOrgCount = await this.organizationRepository.userOrganizationCount(userId); + if (userOrgCount >= toNumber(`${process.env.MAX_ORG_LIMIT}`)) { - throw new BadRequestException(ResponseMessages.organisation.error.MaximumOrgsLimit); + throw new BadRequestException(ResponseMessages.organisation.error.MaximumOrgsLimit); } const organizationExist = await this.organizationRepository.checkOrganizationNameExist(createOrgDto.name); @@ -111,7 +124,7 @@ export class OrganizationService { if (isOrgSlugExist) { throw new ConflictException(ResponseMessages.organisation.error.exists); - } + } createOrgDto.orgSlug = orgSlug; createOrgDto.createdBy = userId; @@ -124,7 +137,6 @@ export class OrganizationService { createOrgDto.logo = ''; } - const organizationDetails = await this.organizationRepository.createOrganization(createOrgDto); // To return selective object data @@ -148,12 +160,12 @@ export class OrganizationService { clientId, idpId }; - + const updatedOrg = await this.organizationRepository.updateOrganizationById( updateOrgData, organizationDetails.id ); - + if (!updatedOrg) { throw new InternalServerErrorException(ResponseMessages.organisation.error.credentialsNotUpdate); } @@ -180,18 +192,14 @@ export class OrganizationService { } } - /** + /** * * @param registerOrgDto * @returns */ // eslint-disable-next-line camelcase - async setPrimaryDid( - orgId:string, - did:string, - id:string - ): Promise { + async setPrimaryDid(orgId: string, did: string, id: string): Promise { try { const organizationExist = await this.organizationRepository.getOrgProfile(orgId); if (!organizationExist) { @@ -204,7 +212,7 @@ export class OrganizationService { //check user DID exist in the organization's did list const organizationDidList = await this.organizationRepository.getAllOrganizationDid(orgId); - const isDidMatch = organizationDidList.some(item => item.did === did); + const isDidMatch = organizationDidList.some((item) => item.did === did); if (!isDidMatch) { throw new NotFoundException(ResponseMessages.organisation.error.didNotFound); @@ -214,25 +222,25 @@ export class OrganizationService { if (!didDetails) { throw new NotFoundException(ResponseMessages.organisation.error.didNotFound); } - + const dids = await this.organizationRepository.getDids(orgId); - const noPrimaryDid = dids.every(orgDids => false === orgDids.isPrimaryDid); + const noPrimaryDid = dids.every((orgDids) => false === orgDids.isPrimaryDid); let existingPrimaryDid; let priviousDidFalse; if (!noPrimaryDid) { existingPrimaryDid = await this.organizationRepository.getPerviousPrimaryDid(orgId); - + if (!existingPrimaryDid) { throw new NotFoundException(ResponseMessages.organisation.error.didNotFound); } - + priviousDidFalse = await this.organizationRepository.setPreviousDidFlase(existingPrimaryDid.id); - } + } const didParts = did.split(':'); let nameSpace: string | null = null; - + // This condition will handle the multi-ledger support if (DidMethod.INDY === didParts[1]) { nameSpace = `${didParts[2]}:${didParts[3]}`; @@ -264,9 +272,7 @@ export class OrganizationService { await Promise.all([setPrimaryDid, existingPrimaryDid, priviousDidFalse]); - return ResponseMessages.organisation.success.primaryDid; - } catch (error) { this.logger.error(`In setPrimaryDid method: ${JSON.stringify(error)}`); throw new RpcException(error.response ? error.response : error); @@ -290,9 +296,11 @@ export class OrganizationService { let generatedClientSecret = ''; if (organizationDetails.idpId) { - const userDetails = await this.organizationRepository.getUser(userId); - const token = await this.clientRegistrationService.getManagementToken(userDetails.clientId, userDetails.clientSecret); + const token = await this.clientRegistrationService.getManagementToken( + userDetails.clientId, + userDetails.clientSecret + ); generatedClientSecret = await this.clientRegistrationService.generateClientSecret( organizationDetails.idpId, @@ -303,7 +311,6 @@ export class OrganizationService { clientSecret: this.maskString(generatedClientSecret) }; } else { - try { const orgCredentials = await this.registerToKeycloak( organizationDetails.name, @@ -312,11 +319,11 @@ export class OrganizationService { userId, true ); - + const { clientId, idpId, clientSecret } = orgCredentials; - + generatedClientSecret = clientSecret; - + updateOrgData = { clientId, clientSecret: this.maskString(clientSecret), @@ -359,14 +366,17 @@ export class OrganizationService { shouldUpdateRole: boolean ): Promise { const userDetails = await this.organizationRepository.getUser(userId); - const token = await this.clientRegistrationService.getManagementToken(userDetails.clientId, userDetails.clientSecret); + const token = await this.clientRegistrationService.getManagementToken( + userDetails.clientId, + userDetails.clientSecret + ); const orgDetails = await this.clientRegistrationService.createClient(orgName, orgId, token); const orgRolesList = [OrgRoles.OWNER, OrgRoles.ADMIN, OrgRoles.ISSUER, OrgRoles.VERIFIER, OrgRoles.MEMBER]; - for (const role of orgRolesList) { - await this.clientRegistrationService.createClientRole(orgDetails.idpId, token, role, role); - } + for (const role of orgRolesList) { + await this.clientRegistrationService.createClientRole(orgDetails.idpId, token, role, role); + } const ownerRoleClient = await this.clientRegistrationService.getClientSpecificRoles( orgDetails.idpId, @@ -384,20 +394,18 @@ export class OrganizationService { const ownerRoleData = await this.orgRoleService.getRole(OrgRoles.OWNER); if (!shouldUpdateRole) { - await Promise.all([ this.clientRegistrationService.createUserClientRole(orgDetails.idpId, token, keycloakUserId, payload), this.userOrgRoleService.createUserOrgRole(userId, ownerRoleData.id, orgId, ownerRoleClient.id) ]); - } else { const roleIdList = [ { roleId: ownerRoleData.id, idpRoleId: ownerRoleClient.id } - ]; - + ]; + await Promise.all([ this.clientRegistrationService.createUserClientRole(orgDetails.idpId, token, keycloakUserId, payload), this.userOrgRoleService.deleteOrgRoles(userId, orgId), @@ -509,7 +517,6 @@ export class OrganizationService { // eslint-disable-next-line camelcase async updateOrganization(updateOrgDto: IUpdateOrganization, userId: string, orgId: string): Promise { try { - const organizationExist = await this.organizationRepository.checkOrganizationNameExist(updateOrgDto.name); if (organizationExist && organizationExist.id !== orgId) { @@ -531,13 +538,24 @@ export class OrganizationService { const checkAgentIsExists = await this.organizationRepository.getAgentInvitationDetails(orgId); if (!checkAgentIsExists?.connectionInvitation && !checkAgentIsExists?.agentId) { - organizationDetails = await this.organizationRepository.updateOrganization(updateOrgDto); - } else if (organizationDetails?.logoUrl !== organizationExist?.logoUrl || organizationDetails?.name !== organizationExist?.name) { + organizationDetails = await this.organizationRepository.updateOrganization(updateOrgDto); + } else if ( + organizationDetails?.logoUrl !== organizationExist?.logoUrl || + organizationDetails?.name !== organizationExist?.name + ) { const invitationData = await this._createConnection(updateOrgDto?.logo, updateOrgDto?.name, orgId); - await this.organizationRepository.updateConnectionInvitationDetails(orgId, invitationData?.connectionInvitation); + await this.organizationRepository.updateConnectionInvitationDetails( + orgId, + invitationData?.connectionInvitation + ); } - await this.userActivityService.createActivity(userId, organizationDetails.id, `${organizationDetails.name} organization updated`, 'Organization details updated successfully'); + await this.userActivityService.createActivity( + userId, + organizationDetails.id, + `${organizationDetails.name} organization updated`, + 'Organization details updated successfully' + ); return organizationDetails; } catch (error) { this.logger.error(`In update organization : ${JSON.stringify(error)}`); @@ -545,11 +563,7 @@ export class OrganizationService { } } - async _createConnection( - orgName: string, - logoUrl: string, - orgId: string - ): Promise { + async _createConnection(orgName: string, logoUrl: string, orgId: string): Promise { const pattern = { cmd: 'create-connection-invitation' }; const payload = { @@ -561,7 +575,7 @@ export class OrganizationService { }; const connectionInvitationData = await this.natsClient .send(this.organizationServiceProxy, pattern, payload) - + .catch((error) => { this.logger.error(`catch: ${JSON.stringify(error)}`); throw new HttpException( @@ -576,12 +590,8 @@ export class OrganizationService { return connectionInvitationData; } - async countTotalOrgs( - userId: string - - ): Promise { + async countTotalOrgs(userId: string): Promise { try { - const getOrgs = await this.organizationRepository.userOrganizationCount(userId); return getOrgs; } catch (error) { @@ -589,11 +599,11 @@ export class OrganizationService { throw new RpcException(error.response ? error.response : error); } } - + /** * @returns Get created organizations details */ - + async getOrganizations( userId: string, pageNumber: number, @@ -611,11 +621,11 @@ export class OrganizationService { { description: { contains: search, mode: 'insensitive' } } ] }; - + const filterOptions = { userId }; - + const getOrgs = await this.organizationRepository.getOrganizations( query, filterOptions, @@ -626,7 +636,7 @@ export class OrganizationService { ); const { organizations } = getOrgs; - + if (0 === organizations?.length) { throw new NotFoundException(ResponseMessages.organisation.error.organizationNotFound); } @@ -635,25 +645,25 @@ export class OrganizationService { let updatedOrgs; if ('true' === process.env.IS_ECOSYSTEM_ENABLE) { - orgIds = organizations?.map(item => item.id); - + orgIds = organizations?.map((item) => item.id); + const orgEcosystemDetails = await this._getOrgEcosystems(orgIds); - - updatedOrgs = getOrgs.organizations.map(org => { + + updatedOrgs = getOrgs.organizations.map((org) => { const matchingEcosystems = orgEcosystemDetails - .filter(ecosystem => ecosystem.orgId === org.id) - .map(ecosystem => ({ ecosystemId: ecosystem.ecosystemId })); + .filter((ecosystem) => ecosystem.orgId === org.id) + .map((ecosystem) => ({ ecosystemId: ecosystem.ecosystemId })); return { ...org, ecosystemOrgs: 0 < matchingEcosystems.length ? matchingEcosystems : [] }; }); } else { - updatedOrgs = getOrgs?.organizations?.map(org => ({ + updatedOrgs = getOrgs?.organizations?.map((org) => ({ ...org })); } - + return { totalCount: getOrgs.totalCount, totalPages: getOrgs.totalPages, @@ -687,26 +697,71 @@ export class OrganizationService { } async clientLoginCredentails(clientCredentials: IClientCredentials): Promise { - const {clientId, clientSecret} = clientCredentials; - return this.authenticateClientKeycloak(clientId, clientSecret); -} + const { clientId, clientSecret } = clientCredentials; + const authenticationResult = await this.authenticateClientKeycloak(clientId, clientSecret); + let addSessionDetails; + // Fetch organization details for getting the user id + const orgRoleDetails = await this.organizationRepository.getOrgAndAdminUser(clientId); + this.logger.debug(`orgRoleDetails::::${JSON.stringify(orgRoleDetails)}`); + // check seesion details + const userSessionDetails = await this.userRepository.fetchUserSessions(orgRoleDetails['user'].id); + if (10 <= userSessionDetails?.length) { + throw new BadRequestException(ResponseMessages.user.error.sessionLimitReached); + } + // Creation sessison and account + const sessionData = { + sessionToken: authenticationResult?.access_token, + userId: orgRoleDetails['user'].id, + expires: authenticationResult?.expires_in + }; - async authenticateClientKeycloak(clientId: string, clientSecret: string): Promise { - - try { - const payload = new ClientCredentialTokenPayloadDto(); - // eslint-disable-next-line camelcase - payload.client_id = clientId; - // eslint-disable-next-line camelcase - payload.client_secret = clientSecret; + const fetchAccountDetails = await this.userRepository.checkAccountDetails(orgRoleDetails['user'].id); + if (fetchAccountDetails) { + const accountData = { + sessionToken: authenticationResult?.access_token, + userId: orgRoleDetails['user'].id, + expires: authenticationResult?.expires_in + }; - try { - const mgmtTokenResponse = await this.clientRegistrationService.getToken(payload); - return mgmtTokenResponse; - } catch (error) { - throw new UnauthorizedException(ResponseMessages.organisation.error.invalidClient); + await this.userRepository.updateAccountDetails(accountData).then(async () => { + addSessionDetails = await this.userRepository.createSession(sessionData); + }); + } else { + const accountData = { + sessionToken: authenticationResult?.access_token, + userId: orgRoleDetails['user'].id, + expires: authenticationResult?.expires_in, + keycloakUserId: orgRoleDetails['user'].keycloakUserId, + type: TokenType.ORG_TOKEN + }; + + await this.userRepository.addAccountDetails(accountData).then(async () => { + addSessionDetails = await this.userRepository.createSession(sessionData); + }); } + // Response: add session id as cookies + const finalResponse = { + ...authenticationResult, + sessionId: addSessionDetails.id + }; + // In fetch session API need to handle the conditon for session is comes from cookies or query parameter + return finalResponse; + } + async authenticateClientKeycloak(clientId: string, clientSecret: string): Promise { + try { + const payload = new ClientCredentialTokenPayloadDto(); + // eslint-disable-next-line camelcase + payload.client_id = clientId; + // eslint-disable-next-line camelcase + payload.client_secret = clientSecret; + + try { + const mgmtTokenResponse = await this.clientRegistrationService.getToken(payload); + return mgmtTokenResponse; + } catch (error) { + throw new UnauthorizedException(ResponseMessages.organisation.error.invalidClient); + } } catch (error) { this.logger.error(`Error in authenticateClientKeycloak : ${JSON.stringify(error)}`); throw new RpcException(error.response ? error.response : error); @@ -883,36 +938,35 @@ export class OrganizationService { userEmail: string, userId: string, orgName: string - ): Promise { + ): Promise { const { invitations, orgId } = bulkInvitationDto; - for (const invitation of invitations) { - const { orgRoleId, email } = invitation; + for (const invitation of invitations) { + const { orgRoleId, email } = invitation; - const isUserExist = await this.checkUserExistInPlatform(email); + const isUserExist = await this.checkUserExistInPlatform(email); - const userData = await this.getUserFirstName(userEmail); - - const {firstName} = userData; - const orgRolesDetails = await this.orgRoleService.getOrgRolesByIds(orgRoleId); - - if (0 === orgRolesDetails.length) { - throw new NotFoundException(ResponseMessages.organisation.error.orgRoleIdNotFound); - } + const userData = await this.getUserFirstName(userEmail); - const isInvitationExist = await this.checkInvitationExist(email, orgId); + const { firstName } = userData; + const orgRolesDetails = await this.orgRoleService.getOrgRolesByIds(orgRoleId); - if (!isInvitationExist && userEmail !== invitation.email) { + if (0 === orgRolesDetails.length) { + throw new NotFoundException(ResponseMessages.organisation.error.orgRoleIdNotFound); + } - await this.organizationRepository.createSendInvitation(email, String(orgId), String(userId), orgRoleId); + const isInvitationExist = await this.checkInvitationExist(email, orgId); - try { - await this.sendInviteEmailTemplate(email, orgName, orgRolesDetails, firstName, isUserExist); - } catch (error) { - throw new InternalServerErrorException(ResponseMessages.user.error.emailSend); - } + if (!isInvitationExist && userEmail !== invitation.email) { + await this.organizationRepository.createSendInvitation(email, String(orgId), String(userId), orgRoleId); + + try { + await this.sendInviteEmailTemplate(email, orgName, orgRolesDetails, firstName, isUserExist); + } catch (error) { + throw new InternalServerErrorException(ResponseMessages.user.error.emailSend); } } + } } async createInvitationByClientRoles( @@ -921,11 +975,14 @@ export class OrganizationService { userId: string, orgName: string, idpId: string - ): Promise { + ): Promise { const { invitations, orgId } = bulkInvitationDto; const userDetails = await this.organizationRepository.getUser(userId); - const token = await this.clientRegistrationService.getManagementToken(userDetails.clientId, userDetails.clientSecret); + const token = await this.clientRegistrationService.getManagementToken( + userDetails.clientId, + userDetails.clientSecret + ); const clientRolesList = await this.clientRegistrationService.getAllClientRoles(idpId, token); const orgRoles = await this.orgRoleService.getOrgRoles(); @@ -951,7 +1008,6 @@ export class OrganizationService { const isInvitationExist = await this.checkInvitationExist(email, orgId); if (!isInvitationExist && userEmail !== invitation.email) { - await this.organizationRepository.createSendInvitation( email, String(orgId), @@ -960,13 +1016,7 @@ export class OrganizationService { ); try { - await this.sendInviteEmailTemplate( - email, - orgName, - filteredOrgRoles, - firstName, - isUserExist - ); + await this.sendInviteEmailTemplate(email, orgName, filteredOrgRoles, firstName, isUserExist); } catch (error) { throw new InternalServerErrorException(ResponseMessages.user.error.emailSend); } @@ -991,12 +1041,7 @@ export class OrganizationService { } if (!organizationDetails.idpId) { - await this.createInvitationByOrgRoles( - bulkInvitationDto, - userEmail, - userId, - organizationDetails.name - ); + await this.createInvitationByOrgRoles(bulkInvitationDto, userEmail, userId, organizationDetails.name); } else { await this.createInvitationByClientRoles( bulkInvitationDto, @@ -1063,7 +1108,7 @@ export class OrganizationService { const userData: user = await this.natsClient .send(this.organizationServiceProxy, pattern, payload) - + .catch((error) => { this.logger.error(`catch: ${JSON.stringify(error)}`); throw new HttpException( @@ -1086,7 +1131,7 @@ export class OrganizationService { const userData = await this.natsClient .send(this.organizationServiceProxy, pattern, payload) - + .catch((error) => { this.logger.error(`catch: ${JSON.stringify(error)}`); throw new HttpException( @@ -1104,19 +1149,17 @@ export class OrganizationService { const pattern = { cmd: 'get-user-by-user-id' }; // const payload = { id: userId }; - const userData = await this.natsClient - .send(this.organizationServiceProxy, pattern, userId) - .catch((error) => { - this.logger.error(`catch: ${JSON.stringify(error)}`); - throw new HttpException( - { - status: error.status, - error: error.error, - message: error.message - }, - error.status - ); - }); + const userData = await this.natsClient.send(this.organizationServiceProxy, pattern, userId).catch((error) => { + this.logger.error(`catch: ${JSON.stringify(error)}`); + throw new HttpException( + { + status: error.status, + error: error.error, + message: error.message + }, + error.status + ); + }); return userData; } @@ -1145,38 +1188,45 @@ export class OrganizationService { status: string ): Promise { const userDetails = await this.organizationRepository.getUser(userId); - const token = await this.clientRegistrationService.getManagementToken(userDetails.clientId, userDetails.clientSecret); - const clientRolesList = await this.clientRegistrationService.getAllClientRoles(idpId, token); + const token = await this.clientRegistrationService.getManagementToken( + userDetails.clientId, + userDetails.clientSecret + ); + const clientRolesList = await this.clientRegistrationService.getAllClientRoles(idpId, token); - const orgRoles = await this.orgRoleService.getOrgRolesByIds(invitation.orgRoles); + const orgRoles = await this.orgRoleService.getOrgRolesByIds(invitation.orgRoles); - const rolesPayload: { roleId: string; name: string; idpRoleId: string }[] = orgRoles.map((orgRole: IOrgRole) => { - let roleObj: { roleId: string; name: string; idpRoleId: string} = null; + const rolesPayload: { roleId: string; name: string; idpRoleId: string }[] = orgRoles.map((orgRole: IOrgRole) => { + let roleObj: { roleId: string; name: string; idpRoleId: string } = null; - for (let index = 0; index < clientRolesList.length; index++) { - if (clientRolesList[index].name === orgRole.name) { - roleObj = { - roleId: orgRole.id, - name: orgRole.name, - idpRoleId: clientRolesList[index].id - }; - break; - } + for (let index = 0; index < clientRolesList.length; index++) { + if (clientRolesList[index].name === orgRole.name) { + roleObj = { + roleId: orgRole.id, + name: orgRole.name, + idpRoleId: clientRolesList[index].id + }; + break; } + } - return roleObj; - }); - - const data = { - status - }; + return roleObj; + }); - await Promise.all([ - this.organizationRepository.updateOrgInvitation(invitation.id, data), - this.clientRegistrationService.createUserClientRole(idpId, token, keycloakUserId, rolesPayload.map(role => ({id: role.idpRoleId, name: role.name}))), - this.userOrgRoleService.updateUserOrgRole(userId, orgId, rolesPayload) - ]); + const data = { + status + }; + await Promise.all([ + this.organizationRepository.updateOrgInvitation(invitation.id, data), + this.clientRegistrationService.createUserClientRole( + idpId, + token, + keycloakUserId, + rolesPayload.map((role) => ({ id: role.idpRoleId, name: role.name })) + ), + this.userOrgRoleService.updateUserOrgRole(userId, orgId, rolesPayload) + ]); } /** @@ -1251,11 +1301,11 @@ export class OrganizationService { orgId: string ): Promise { const userDetails = await this.organizationRepository.getUser(userId); - const token = await this.clientRegistrationService.getManagementToken(userDetails.clientId, userDetails.clientSecret); - const clientRolesList = await this.clientRegistrationService.getAllClientRoles( - idpId, - token + const token = await this.clientRegistrationService.getManagementToken( + userDetails.clientId, + userDetails.clientSecret ); + const clientRolesList = await this.clientRegistrationService.getAllClientRoles(idpId, token); const orgRoles = await this.orgRoleService.getOrgRoles(); const matchedClientRoles = clientRolesList.filter((role) => roleIds.includes(role.id.trim())); @@ -1286,11 +1336,7 @@ export class OrganizationService { const userData = await this.getUserUserId(userId); const [, deletedUserRoleRecords] = await Promise.all([ - this.clientRegistrationService.deleteUserClientRoles( - idpId, - token, - userData.keycloakUserId - ), + this.clientRegistrationService.deleteUserClientRoles(idpId, token, userData.keycloakUserId), this.userOrgRoleService.deleteOrgRoles(userId, orgId) ]); @@ -1351,15 +1397,8 @@ export class OrganizationService { return true; } else { - - return this.updateUserClientRoles( - roleIds, - organizationDetails.idpId, - userId, - organizationDetails.id - ); + return this.updateUserClientRoles(roleIds, organizationDetails.idpId, userId, organizationDetails.id); } - } catch (error) { this.logger.error(`Error in updateUserRoles: ${JSON.stringify(error)}`); throw new RpcException(error.response ? error.response : error); @@ -1375,26 +1414,26 @@ export class OrganizationService { } } - async getOrganizationActivityCount(orgId: string, userId: string): Promise { try { - const [ - verificationRecordsCount, - issuanceRecordsCount, - connectionRecordsCount, - orgInvitationsCount, - orgUsers - ] = await Promise.all([ - this._getVerificationRecordsCount(orgId, userId), - this._getIssuanceRecordsCount(orgId, userId), - this._getConnectionRecordsCount(orgId, userId), - this.organizationRepository.getOrgInvitationsCount(orgId), - this.organizationRepository.getOrgDashboard(orgId) - ]); + const [verificationRecordsCount, issuanceRecordsCount, connectionRecordsCount, orgInvitationsCount, orgUsers] = + await Promise.all([ + this._getVerificationRecordsCount(orgId, userId), + this._getIssuanceRecordsCount(orgId, userId), + this._getConnectionRecordsCount(orgId, userId), + this.organizationRepository.getOrgInvitationsCount(orgId), + this.organizationRepository.getOrgDashboard(orgId) + ]); const orgUsersCount = orgUsers?.['usersCount']; - return {verificationRecordsCount, issuanceRecordsCount, connectionRecordsCount, orgUsersCount, orgInvitationsCount}; + return { + verificationRecordsCount, + issuanceRecordsCount, + connectionRecordsCount, + orgUsersCount, + orgInvitationsCount + }; } catch (error) { this.logger.error(`In fetch organization references count : ${JSON.stringify(error)}`); throw new RpcException(error.response ? error.response : error); @@ -1408,24 +1447,22 @@ export class OrganizationService { orgId, userId }; - const ecosystemsCount = await (this.natsClient - .send(this.organizationServiceProxy, pattern, payload) as unknown as Promise) - - .catch((error) => { - this.logger.error(`catch: ${JSON.stringify(error)}`); - throw new HttpException( - { - status: error.status, - error: error.message - }, - error.status - ); - }); + const ecosystemsCount = await ( + this.natsClient.send(this.organizationServiceProxy, pattern, payload) as unknown as Promise + ).catch((error) => { + this.logger.error(`catch: ${JSON.stringify(error)}`); + throw new HttpException( + { + status: error.status, + error: error.message + }, + error.status + ); + }); return ecosystemsCount; } - async _getConnectionRecordsCount(orgId: string, userId: string): Promise { const pattern = { cmd: 'get-connection-records' }; @@ -1435,7 +1472,7 @@ export class OrganizationService { }; const connectionsCount = await this.natsClient .send(this.organizationServiceProxy, pattern, payload) - + .catch((error) => { this.logger.error(`catch: ${JSON.stringify(error)}`); throw new HttpException( @@ -1450,7 +1487,6 @@ export class OrganizationService { return connectionsCount; } - async _getIssuanceRecordsCount(orgId: string, userId: string): Promise { const pattern = { cmd: 'get-issuance-records' }; @@ -1460,7 +1496,7 @@ export class OrganizationService { }; const issuanceCount = await this.natsClient .send(this.organizationServiceProxy, pattern, payload) - + .catch((error) => { this.logger.error(`catch: ${JSON.stringify(error)}`); throw new HttpException( @@ -1484,7 +1520,7 @@ export class OrganizationService { }; const verificationCount = await this.natsClient .send(this.organizationServiceProxy, pattern, payload) - + .catch((error) => { this.logger.error(`catch: ${JSON.stringify(error)}`); throw new HttpException( @@ -1547,7 +1583,7 @@ export class OrganizationService { throw new RpcException(error.response ? error.response : error); } } - + async deleteOrganization(orgId: string, user: user): Promise { try { const getUser = await this.organizationRepository.getUser(user?.id); @@ -1556,113 +1592,128 @@ export class OrganizationService { this.clientRegistrationService.getManagementToken(getUser?.clientId, getUser?.clientSecret), this.organizationRepository.getOrganizationDetails(orgId) ]); - + if (!organizationDetails) { throw new NotFoundException(ResponseMessages.organisation.error.orgNotFound); } - + const organizationInvitationDetails = await this.organizationRepository.getOrgInvitationsByOrg(orgId); - - const arrayEmail = organizationInvitationDetails.map(userData => userData.email); + + const arrayEmail = organizationInvitationDetails.map((userData) => userData.email); this.logger.debug(`arrayEmail ::: ${JSON.stringify(arrayEmail)}`); - + // Fetch Keycloak IDs only if there are emails to process - const keycloakUserIds = 0 < arrayEmail.length - ? (await this.getUserKeycloakIdByEmail(arrayEmail)).response.map(user => user.keycloakUserId) - : []; - + const keycloakUserIds = + 0 < arrayEmail.length + ? (await this.getUserKeycloakIdByEmail(arrayEmail)).response.map((user) => user.keycloakUserId) + : []; + this.logger.log('Keycloak User Ids'); // Delete user client roles in parallel - const deleteUserRolesPromises = keycloakUserIds.map(keycloakUserId => this.clientRegistrationService.deleteUserClientRoles(organizationDetails?.idpId, token, keycloakUserId) + const deleteUserRolesPromises = keycloakUserIds.map((keycloakUserId) => + this.clientRegistrationService.deleteUserClientRoles(organizationDetails?.idpId, token, keycloakUserId) ); deleteUserRolesPromises.push( this.clientRegistrationService.deleteUserClientRoles(organizationDetails?.idpId, token, getUser?.keycloakUserId) ); - + this.logger.debug(`deleteUserRolesPromises ::: ${JSON.stringify(deleteUserRolesPromises)}`); const deleteUserRolesResults = await Promise.allSettled(deleteUserRolesPromises); - + // Check for failures in deleting user roles - const deletionFailures = deleteUserRolesResults.filter(result => 'rejected' === result?.status); - + const deletionFailures = deleteUserRolesResults.filter((result) => 'rejected' === result?.status); + if (0 < deletionFailures.length) { this.logger.error(`deletionFailures ::: ${JSON.stringify(deletionFailures)}`); throw new NotFoundException(ResponseMessages.organisation.error.orgDataNotFoundInkeycloak); } - - const deletedOrgInvitationInfo: { email?: string, orgName?: string, orgRoleNames?: string[] }[] = []; - const userIds = (await this.getUserKeycloakIdByEmail(arrayEmail)).response.map(user => user.id); - await Promise.all(userIds.map(async (userId) => { - const userOrgRoleIds = await this.organizationRepository.getUserOrgRole(userId, orgId); - this.logger.debug(`userOrgRoleIds ::::: ${JSON.stringify(userOrgRoleIds)}`); - const userDetails = await this.organizationRepository.getUser(userId); - this.logger.debug(`userDetails ::::: ${JSON.stringify(userDetails)}`); - - const orgRoles = await this.organizationRepository.getOrgRole(userOrgRoleIds); - this.logger.debug(`orgRoles ::::: ${JSON.stringify(orgRoles)}`); - - const orgRoleNames = orgRoles.map(orgRoleName => orgRoleName.name); - const sendEmail = await this.sendEmailForOrgInvitationsMember(userDetails?.email, organizationDetails?.name, orgRoleNames); - const newInvitation = { - email: userDetails.email, - orgName: organizationDetails?.name, - orgRoleNames - }; - - // Step 3: Push the data into the array - deletedOrgInvitationInfo.push(newInvitation); - - this.logger.log(`email: ${userDetails.email}, orgName: ${organizationDetails?.name}, orgRoles: ${JSON.stringify(orgRoleNames)}, sendEmail: ${sendEmail}`); - })); - + const deletedOrgInvitationInfo: { email?: string; orgName?: string; orgRoleNames?: string[] }[] = []; + const userIds = (await this.getUserKeycloakIdByEmail(arrayEmail)).response.map((user) => user.id); + await Promise.all( + userIds.map(async (userId) => { + const userOrgRoleIds = await this.organizationRepository.getUserOrgRole(userId, orgId); + this.logger.debug(`userOrgRoleIds ::::: ${JSON.stringify(userOrgRoleIds)}`); + + const userDetails = await this.organizationRepository.getUser(userId); + this.logger.debug(`userDetails ::::: ${JSON.stringify(userDetails)}`); + + const orgRoles = await this.organizationRepository.getOrgRole(userOrgRoleIds); + this.logger.debug(`orgRoles ::::: ${JSON.stringify(orgRoles)}`); + + const orgRoleNames = orgRoles.map((orgRoleName) => orgRoleName.name); + const sendEmail = await this.sendEmailForOrgInvitationsMember( + userDetails?.email, + organizationDetails?.name, + orgRoleNames + ); + const newInvitation = { + email: userDetails.email, + orgName: organizationDetails?.name, + orgRoleNames + }; + + // Step 3: Push the data into the array + deletedOrgInvitationInfo.push(newInvitation); + + this.logger.log( + `email: ${userDetails.email}, orgName: ${organizationDetails?.name}, orgRoles: ${JSON.stringify(orgRoleNames)}, sendEmail: ${sendEmail}` + ); + }) + ); + // Delete organization data - const { deletedUserActivity, deletedUserOrgRole, deleteOrg, deletedOrgInvitations, deletedNotification } = await this.organizationRepository.deleteOrg(orgId); - + const { deletedUserActivity, deletedUserOrgRole, deleteOrg, deletedOrgInvitations, deletedNotification } = + await this.organizationRepository.deleteOrg(orgId); + this.logger.debug(`deletedUserActivity ::: ${JSON.stringify(deletedUserActivity)}`); this.logger.debug(`deletedUserOrgRole ::: ${JSON.stringify(deletedUserOrgRole)}`); this.logger.debug(`deleteOrg ::: ${JSON.stringify(deleteOrg)}`); this.logger.debug(`deletedOrgInvitations ::: ${JSON.stringify(deletedOrgInvitations)}`); - + const deletions = [ { records: deletedUserActivity.count, tableName: `${PrismaTables.USER_ACTIVITY}` }, { records: deletedUserOrgRole.count, tableName: `${PrismaTables.USER_ORG_ROLES}` }, - { records: deletedOrgInvitations.count, deletedOrgInvitationInfo, tableName: `${PrismaTables.ORG_INVITATIONS}` }, + { + records: deletedOrgInvitations.count, + deletedOrgInvitationInfo, + tableName: `${PrismaTables.ORG_INVITATIONS}` + }, { records: deletedNotification.count, tableName: `${PrismaTables.NOTIFICATION}` }, { records: deleteOrg ? 1 : 0, tableName: `${PrismaTables.ORGANIZATION}` } ]; - + // Log deletion activities in parallel - await Promise.all(deletions.map(async ({ records, tableName, deletedOrgInvitationInfo }) => { - if (records) { - const txnMetadata: { - deletedRecordsCount: number; - deletedRecordInTable: string; - deletedOrgInvitationInfo?: object[] - } = { - deletedRecordsCount: records, - deletedRecordInTable: tableName - }; - - if (deletedOrgInvitationInfo) { - txnMetadata.deletedOrgInvitationInfo = deletedOrgInvitationInfo; + await Promise.all( + deletions.map(async ({ records, tableName, deletedOrgInvitationInfo }) => { + if (records) { + const txnMetadata: { + deletedRecordsCount: number; + deletedRecordInTable: string; + deletedOrgInvitationInfo?: object[]; + } = { + deletedRecordsCount: records, + deletedRecordInTable: tableName + }; + + if (deletedOrgInvitationInfo) { + txnMetadata.deletedOrgInvitationInfo = deletedOrgInvitationInfo; + } + + const recordType = RecordType.ORGANIZATION; + await this.userActivityRepository._orgDeletedActivity(orgId, user, txnMetadata, recordType); } - - const recordType = RecordType.ORGANIZATION; - await this.userActivityRepository._orgDeletedActivity(orgId, user, txnMetadata, recordType); - } - })); - + }) + ); + return deleteOrg; - } catch (error) { this.logger.error(`delete organization: ${JSON.stringify(error)}`); throw new RpcException(error.response ?? error); } } - async sendEmailForOrgInvitationsMember(email: string, orgName: string, orgRole: string[]): Promise { const platformConfigData = await this.prisma.platform_config.findMany(); @@ -1672,11 +1723,7 @@ export class OrganizationService { emailData.emailTo = email; emailData.emailSubject = `Removal of participation of “${orgName}”`; - emailData.emailHtml = await urlEmailTemplate.sendDeleteOrgMemberEmailTemplate( - email, - orgName, - orgRole - ); + emailData.emailHtml = await urlEmailTemplate.sendDeleteOrgMemberEmailTemplate(email, orgName, orgRole); //Email is sent to user for the verification through emailData const isEmailSent = await sendEmail(emailData); @@ -1737,20 +1784,19 @@ export class OrganizationService { } async registerOrgsMapUsers(): Promise { - try { - const unregisteredOrgsList = await this.organizationRepository.getUnregisteredClientOrgs(); - + if (!unregisteredOrgsList || 0 === unregisteredOrgsList.length) { throw new NotFoundException('Unregistered client organizations not found'); - } + } for (const org of unregisteredOrgsList) { const userOrgRoles = 0 < org['userOrgRoles'].length && org['userOrgRoles']; - const ownerUserList = 0 < org['userOrgRoles'].length - && userOrgRoles.filter(userOrgRole => userOrgRole.orgRole.name === OrgRoles.OWNER); + const ownerUserList = + 0 < org['userOrgRoles'].length && + userOrgRoles.filter((userOrgRole) => userOrgRole.orgRole.name === OrgRoles.OWNER); const ownerUser = 0 < ownerUserList.length && ownerUserList[0].user; @@ -1773,7 +1819,7 @@ export class OrganizationService { ); const { clientId, idpId, clientSecret } = orgCredentials; - + const updateOrgData = { clientId, clientSecret: this.maskString(clientSecret), @@ -1781,58 +1827,59 @@ export class OrganizationService { }; const updatedOrg = await this.organizationRepository.updateOrganizationById(updateOrgData, orgObj.id); - + this.logger.log(`updatedOrg::`, updatedOrg); - const usersToRegisterList = userOrgRoles.filter(userOrgRole => null !== userOrgRole.user.keycloakUserId); - - const userDetails = await this.organizationRepository.getUser(orgObj.ownerId); - const token = await this.clientRegistrationService.getManagementToken(userDetails.clientId, userDetails.clientSecret); - const clientRolesList = await this.clientRegistrationService.getAllClientRoles(idpId, token); - - const deletedUserDetails: string[] = []; - for (const userRole of usersToRegisterList) { - const user = userRole.user; - - const matchedClientRoles = clientRolesList.filter((role) => userRole.orgRole.name === role.name) - .map(clientRole => ({roleId: userRole.orgRole.id, idpRoleId: clientRole.id, name: clientRole.name})); - - if (!deletedUserDetails.includes(user.id)) { - const [, deletedUserRoleRecords] = await Promise.all([ - this.clientRegistrationService.deleteUserClientRoles(idpId, token, user.keycloakUserId), - this.userOrgRoleService.deleteOrgRoles(user.id, orgObj.id) - ]); - - this.logger.log(`deletedUserRoleRecords::`, deletedUserRoleRecords); - - deletedUserDetails.push(user.id); - } - - - await Promise.all([ - this.clientRegistrationService.createUserClientRole( - idpId, - token, - user.keycloakUserId, - matchedClientRoles.map((role) => ({ id: role.idpRoleId, name: role.name })) - ), - this.userOrgRoleService.updateUserOrgRole( - user.id, - orgObj.id, - matchedClientRoles.map((role) => ({ roleId: role.roleId, idpRoleId: role.idpRoleId })) - ) + const usersToRegisterList = userOrgRoles.filter((userOrgRole) => null !== userOrgRole.user.keycloakUserId); + + const userDetails = await this.organizationRepository.getUser(orgObj.ownerId); + const token = await this.clientRegistrationService.getManagementToken( + userDetails.clientId, + userDetails.clientSecret + ); + const clientRolesList = await this.clientRegistrationService.getAllClientRoles(idpId, token); + + const deletedUserDetails: string[] = []; + for (const userRole of usersToRegisterList) { + const user = userRole.user; + + const matchedClientRoles = clientRolesList + .filter((role) => userRole.orgRole.name === role.name) + .map((clientRole) => ({ roleId: userRole.orgRole.id, idpRoleId: clientRole.id, name: clientRole.name })); + + if (!deletedUserDetails.includes(user.id)) { + const [, deletedUserRoleRecords] = await Promise.all([ + this.clientRegistrationService.deleteUserClientRoles(idpId, token, user.keycloakUserId), + this.userOrgRoleService.deleteOrgRoles(user.id, orgObj.id) ]); - this.logger.log(`Organization client created and users mapped to roles`); - } - } + this.logger.log(`deletedUserRoleRecords::`, deletedUserRoleRecords); + + deletedUserDetails.push(user.id); + } + + await Promise.all([ + this.clientRegistrationService.createUserClientRole( + idpId, + token, + user.keycloakUserId, + matchedClientRoles.map((role) => ({ id: role.idpRoleId, name: role.name })) + ), + this.userOrgRoleService.updateUserOrgRole( + user.id, + orgObj.id, + matchedClientRoles.map((role) => ({ roleId: role.roleId, idpRoleId: role.idpRoleId })) + ) + ]); + this.logger.log(`Organization client created and users mapped to roles`); + } + } } - + return ''; } catch (error) { this.logger.error(`Error in registerOrgsMapUsers: ${JSON.stringify(error)}`); throw new RpcException(error.response ? error.response : error); - } } @@ -1948,18 +1995,18 @@ export class OrganizationService { } } - async getOrgAgentDetailsForEcosystem(data: {orgIds: string[], search: string}): Promise { + async getOrgAgentDetailsForEcosystem(data: { orgIds: string[]; search: string }): Promise { try { - const getAllOrganizationDetails = await this.organizationRepository.handleGetOrganisationData(data); + const getAllOrganizationDetails = await this.organizationRepository.handleGetOrganisationData(data); - if (!getAllOrganizationDetails) { - throw new NotFoundException(ResponseMessages.ledger.error.NotFound); - } + if (!getAllOrganizationDetails) { + throw new NotFoundException(ResponseMessages.ledger.error.NotFound); + } - return getAllOrganizationDetails; + return getAllOrganizationDetails; } catch (error) { - this.logger.error(`Error in getOrgAgentDetailsForEcosystem: ${error}`); - throw new RpcException(error.response ? error.response : error); + this.logger.error(`Error in getOrgAgentDetailsForEcosystem: ${error}`); + throw new RpcException(error.response ? error.response : error); } + } } -} \ No newline at end of file diff --git a/apps/user/repositories/user.repository.ts b/apps/user/repositories/user.repository.ts index b5dfc165e..7cca14c9a 100644 --- a/apps/user/repositories/user.repository.ts +++ b/apps/user/repositories/user.repository.ts @@ -143,9 +143,8 @@ export class UserRepository { where: { id: sessionId }, include: { user: true } }); - // if (!session || new Date() > session.expires) return null; - return session.user; + return session; } /** diff --git a/apps/user/src/user.service.ts b/apps/user/src/user.service.ts index 0a7f651d3..aab860fc1 100644 --- a/apps/user/src/user.service.ts +++ b/apps/user/src/user.service.ts @@ -482,10 +482,8 @@ export class UserService { refreshToken: tokenDetails?.refresh_token }; - const addSessionDetails = await this.userRepository.createSession(sessionData); - const fetchAccountDetails = await this.userRepository.checkAccountDetails(userData?.id); - + let addSessionDetails; let accountData; if (null === fetchAccountDetails) { accountData = { @@ -497,7 +495,9 @@ export class UserService { type: TokenType.USER_TOKEN }; - await this.userRepository.addAccountDetails(accountData); + await this.userRepository.addAccountDetails(accountData).then(async () => { + addSessionDetails = await this.userRepository.createSession(sessionData); + }); } else { accountData = { sessionToken: tokenDetails?.access_token, @@ -506,7 +506,9 @@ export class UserService { refreshToken: tokenDetails?.refresh_token }; - await this.userRepository.updateAccountDetails(accountData); + await this.userRepository.updateAccountDetails(accountData).then(async () => { + addSessionDetails = await this.userRepository.createSession(sessionData); + }); } const finalResponse = { diff --git a/libs/common/src/interfaces/interface.ts b/libs/common/src/interfaces/interface.ts index 4116d21f8..802654cbe 100644 --- a/libs/common/src/interfaces/interface.ts +++ b/libs/common/src/interfaces/interface.ts @@ -13,6 +13,7 @@ export interface IAccessTokenData { refresh_expires_in: number; token_type: string; scope: string; + sessionId?: string; } export interface IOptionalParams { From ddbfb579f209814a6565f12446c5eeddec7bc6e6 Mon Sep 17 00:00:00 2001 From: bhavanakarwade Date: Thu, 31 Jul 2025 19:39:30 +0530 Subject: [PATCH 27/60] feat: implemented destroy session functionality Signed-off-by: bhavanakarwade --- .env.demo | 2 +- .env.sample | 2 +- .../api-gateway/src/authz/authz.controller.ts | 40 ++++++++++++++----- apps/api-gateway/src/authz/authz.service.ts | 5 +++ .../src/authz/dtos/user-logout.dto.ts | 15 +++++++ apps/organization/src/organization.service.ts | 2 +- apps/user/interfaces/user.interface.ts | 6 +++ apps/user/repositories/user.repository.ts | 31 +++++++++++++- apps/user/src/user.controller.ts | 6 +++ apps/user/src/user.service.ts | 18 ++++++++- libs/common/src/response-messages/index.ts | 3 +- 11 files changed, 113 insertions(+), 17 deletions(-) create mode 100644 apps/api-gateway/src/authz/dtos/user-logout.dto.ts diff --git a/.env.demo b/.env.demo index f520dbc17..c73e721c6 100644 --- a/.env.demo +++ b/.env.demo @@ -156,7 +156,7 @@ OTEL_LOGS_OTLP_ENDPOINT='http://localhost:4318/v1/logs' OTEL_HEADERS_KEY=88ca6b1XXXXXXXXXXXXXXXXXXXXXXXXXXX OTEL_LOGGER_NAME='credebl-platform-logger' HOSTNAME='localhost' - +SESSIONS_LIMIT=10 # SSO # To add more clients, simply add comma separated values of client names SUPPORTED_SSO_CLIENTS=CREDEBL diff --git a/.env.sample b/.env.sample index 7b50c2c6a..7c78754c9 100644 --- a/.env.sample +++ b/.env.sample @@ -153,7 +153,7 @@ SCHEMA_FILE_SERVER_URL= // Please provide schema URL SCHEMA_FILE_SERVER_TOKEN=xxxxxxxx // Please provide schema file server token for polygon FILEUPLOAD_CACHE_TTL= //Provide file upload cache ttl - +SESSIONS_LIMIT= //Provide limits of sessions FIELD_UPLOAD_SIZE= //Provide field upload size IS_ECOSYSTEM_ENABLE= //Set this flag to `true` to enable the ecosystem, or `false` to disable it. diff --git a/apps/api-gateway/src/authz/authz.controller.ts b/apps/api-gateway/src/authz/authz.controller.ts index 407358d2f..c31c8a1f1 100644 --- a/apps/api-gateway/src/authz/authz.controller.ts +++ b/apps/api-gateway/src/authz/authz.controller.ts @@ -15,7 +15,7 @@ import { } from '@nestjs/common'; import { AuthzService } from './authz.service'; import { CommonService } from '../../../../libs/common/src/common.service'; -import { ApiBody, ApiOperation, ApiQuery, ApiResponse, ApiTags } from '@nestjs/swagger'; +import { ApiBearerAuth, ApiBody, ApiOperation, ApiQuery, 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'; @@ -33,9 +33,9 @@ import { RefreshTokenDto } from './dtos/refresh-token.dto'; import { getDefaultClient } from '../user/utils'; import { ClientAliasValidationPipe } from './decorators/user-auth-client'; import { SessionGuard } from './guards/session.guard'; -interface SessionDetails { - sessionId: string; -} +import { UserLogoutDto } from './dtos/user-logout.dto'; +import { AuthGuard } from '@nestjs/passport'; +import { ISessionData } from 'apps/user/interfaces/user.interface'; @Controller('auth') @ApiTags('auth') @UseFilters(CustomExceptionFilter) @@ -190,11 +190,7 @@ export class AuthzController { required: false }) @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: AuthTokenResponse }) - async sessionDetails( - @Res() res: Response, - @Req() req: Request, - @Query() sessionId: SessionDetails - ): Promise { + async sessionDetails(@Res() res: Response, @Req() req: Request, @Query() sessionId: ISessionData): Promise { this.logger.debug(`in authz controller`); let sessionDetails; @@ -309,4 +305,30 @@ export class AuthzController { return res.status(HttpStatus.OK).json(finalResponse); } + + /** + * Log out user. + * + * @body LogoutUserDto + * @returns Logged out user from current session + */ + @Post('/signout') + @ApiOperation({ + summary: 'Logout user', + description: 'Logout user from current session.' + }) + @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) + @UseGuards(AuthGuard('jwt')) + @ApiBearerAuth() + @ApiBody({ type: UserLogoutDto }) + async logout(@Body() logoutUserDto: UserLogoutDto, @Res() res: Response): Promise { + await this.authzService.logout(logoutUserDto); + + const finalResponse: IResponseType = { + statusCode: HttpStatus.OK, + message: ResponseMessages.user.success.logout + }; + + return res.status(HttpStatus.OK).json(finalResponse); + } } diff --git a/apps/api-gateway/src/authz/authz.service.ts b/apps/api-gateway/src/authz/authz.service.ts index d785cf230..f9dc909f6 100644 --- a/apps/api-gateway/src/authz/authz.service.ts +++ b/apps/api-gateway/src/authz/authz.service.ts @@ -18,6 +18,7 @@ import { ResetTokenPasswordDto } from './dtos/reset-token-password'; import { NATSClient } from '@credebl/common/NATSClient'; import { user } from '@prisma/client'; import { ISessionDetails } from 'apps/user/interfaces/user.interface'; +import { UserLogoutDto } from './dtos/user-logout.dto'; @Injectable() @WebSocketGateway() export class AuthzService extends BaseService { @@ -79,4 +80,8 @@ export class AuthzService extends BaseService { const payload = { userInfo }; return this.natsClient.sendNatsMessage(this.authServiceProxy, 'add-user', payload); } + + async logout(logoutUserDto: UserLogoutDto): Promise { + return this.natsClient.sendNatsMessage(this.authServiceProxy, 'user-logout', logoutUserDto); + } } diff --git a/apps/api-gateway/src/authz/dtos/user-logout.dto.ts b/apps/api-gateway/src/authz/dtos/user-logout.dto.ts new file mode 100644 index 000000000..ec836eebb --- /dev/null +++ b/apps/api-gateway/src/authz/dtos/user-logout.dto.ts @@ -0,0 +1,15 @@ +import { IsArray, IsNotEmpty, IsOptional, IsString } from 'class-validator'; + +import { ApiPropertyOptional } from '@nestjs/swagger'; + +export class UserLogoutDto { + @ApiPropertyOptional({ + description: 'List of session IDs to log out', + type: [String] + }) + @IsOptional() + @IsArray({ message: 'sessions must be an array' }) + @IsString({ each: true, message: 'each session Id must be a string' }) + @IsNotEmpty({ each: true, message: 'session Id must not be empty' }) + sessions?: string[]; +} diff --git a/apps/organization/src/organization.service.ts b/apps/organization/src/organization.service.ts index ef507b214..bb1cbaa3d 100644 --- a/apps/organization/src/organization.service.ts +++ b/apps/organization/src/organization.service.ts @@ -705,7 +705,7 @@ export class OrganizationService { this.logger.debug(`orgRoleDetails::::${JSON.stringify(orgRoleDetails)}`); // check seesion details const userSessionDetails = await this.userRepository.fetchUserSessions(orgRoleDetails['user'].id); - if (10 <= userSessionDetails?.length) { + if (Number(process.env.SESSIONS_LIMIT) <= userSessionDetails?.length) { throw new BadRequestException(ResponseMessages.user.error.sessionLimitReached); } // Creation sessison and account diff --git a/apps/user/interfaces/user.interface.ts b/apps/user/interfaces/user.interface.ts index d647cfce5..608f3b76a 100644 --- a/apps/user/interfaces/user.interface.ts +++ b/apps/user/interfaces/user.interface.ts @@ -244,6 +244,9 @@ export interface UserRoleMapping { userRoleId: string; } +export interface ISessions { + sessions: string[]; +} export interface UserRoleDetails { id: string; role: $Enums.UserRole; @@ -273,3 +276,6 @@ export interface IAccountDetails { id_token?: string; session_state?: string; } +export interface ISessionData { + sessionId: string; +} diff --git a/apps/user/repositories/user.repository.ts b/apps/user/repositories/user.repository.ts index 7cca14c9a..95950d5dd 100644 --- a/apps/user/repositories/user.repository.ts +++ b/apps/user/repositories/user.repository.ts @@ -16,9 +16,19 @@ import { UserRoleMapping } from '../interfaces/user.interface'; import { Injectable, InternalServerErrorException, Logger, NotFoundException } from '@nestjs/common'; -import { ProviderType, UserRole } from '@credebl/enum/enum'; // eslint-disable-next-line camelcase -import { RecordType, account, client_aliases, schema, session, token, user, user_org_roles } from '@prisma/client'; +import { + Prisma, + RecordType, + account, + client_aliases, + schema, + session, + token, + user, + user_org_roles +} from '@prisma/client'; +import { ProviderType, UserRole } from '@credebl/enum/enum'; import { PrismaService } from '@credebl/prisma-service'; @@ -959,4 +969,21 @@ export class UserRepository { throw error; } } + + async destroySession(sessions: string[]): Promise { + try { + const userSessions = await this.prisma.session.deleteMany({ + where: { + id: { + in: sessions + } + } + }); + + return userSessions; + } catch (error) { + this.logger.error(`Error in logging out user: ${error.message}`); + throw error; + } + } } diff --git a/apps/user/src/user.controller.ts b/apps/user/src/user.controller.ts index 4031c2e55..a539d8a99 100644 --- a/apps/user/src/user.controller.ts +++ b/apps/user/src/user.controller.ts @@ -2,6 +2,7 @@ import { ICheckUserDetails, IOrgUsers, ISessionDetails, + ISessions, IUserDeletedActivity, IUserForgotPassword, IUserInformation, @@ -263,4 +264,9 @@ export class UserController { async getuserOrganizationByUserId(payload: { userId: string }): Promise { return this.userService.getuserOrganizationByUserId(payload.userId); } + + @MessagePattern({ cmd: 'user-logout' }) + async logout(logoutUserDto: ISessions): Promise { + return this.userService.logout(logoutUserDto); + } } diff --git a/apps/user/src/user.service.ts b/apps/user/src/user.service.ts index aab860fc1..81132205d 100644 --- a/apps/user/src/user.service.ts +++ b/apps/user/src/user.service.ts @@ -40,7 +40,8 @@ import { UserKeycloakId, IEcosystemConfig, IUserForgotPassword, - ISessionDetails + ISessionDetails, + ISessions } from '../interfaces/user.interface'; import { AcceptRejectInvitationDto } from '../dtos/accept-reject-invitation.dto'; import { UserActivityService } from '@credebl/user-activity'; @@ -451,7 +452,7 @@ export class UserService { const userSessionDetails = await this.userRepository.fetchUserSessions(userData?.id); - if (3 <= userSessionDetails?.length) { + if (Number(process.env.SESSIONS_LIMIT) <= userSessionDetails?.length) { throw new BadRequestException(ResponseMessages.user.error.sessionLimitReached); } @@ -1300,4 +1301,17 @@ export class UserService { throw new RpcException(error.response ? error.response : error); } } + + async logout(logoutUserDto: ISessions): Promise { + try { + if (logoutUserDto?.sessions) { + await this.userRepository.destroySession(logoutUserDto?.sessions); + } + + return 'user logged out successfully'; + } catch (error) { + this.logger.error(`Error in logging out session: ${error}`); + throw new RpcException(error.response ? error.response : error); + } + } } diff --git a/libs/common/src/response-messages/index.ts b/libs/common/src/response-messages/index.ts index 79567a798..4928b9396 100644 --- a/libs/common/src/response-messages/index.ts +++ b/libs/common/src/response-messages/index.ts @@ -25,7 +25,8 @@ export const ResponseMessages = { refreshToken: 'Token details fetched successfully', countriesVerificationCode: 'All countries has been fetched successfully', stateVerificationCode: 'All states has been fetched successfully', - cityVerificationCode: 'All cities has been fetched successfully' + cityVerificationCode: 'All cities has been fetched successfully', + logout: 'User logout successfully' }, error: { exists: 'User already exists', From 97d8f7999081e89ac726fe690ccb325fb0fb9a5b Mon Sep 17 00:00:00 2001 From: shitrerohit Date: Thu, 31 Jul 2025 12:42:29 +0530 Subject: [PATCH 28/60] fix:worked on generate client token API related workflow Signed-off-by: shitrerohit --- apps/organization/src/organization.service.ts | 10 ++++++---- apps/user/interfaces/user.interface.ts | 1 + apps/user/repositories/user.repository.ts | 5 +++-- apps/user/src/user.service.ts | 10 ++++++---- .../migration.sql | 2 ++ libs/prisma-service/prisma/schema.prisma | 2 +- 6 files changed, 19 insertions(+), 11 deletions(-) create mode 100644 libs/prisma-service/prisma/migrations/20250730104449_remove_unique_constraint_for_acoountid/migration.sql diff --git a/apps/organization/src/organization.service.ts b/apps/organization/src/organization.service.ts index bb1cbaa3d..7be3c892f 100644 --- a/apps/organization/src/organization.service.ts +++ b/apps/organization/src/organization.service.ts @@ -723,8 +723,9 @@ export class OrganizationService { expires: authenticationResult?.expires_in }; - await this.userRepository.updateAccountDetails(accountData).then(async () => { - addSessionDetails = await this.userRepository.createSession(sessionData); + await this.userRepository.updateAccountDetails(accountData).then(async (response) => { + const finalSessionData = { ...sessionData, accountId: response.id }; + addSessionDetails = await this.userRepository.createSession(finalSessionData); }); } else { const accountData = { @@ -735,8 +736,9 @@ export class OrganizationService { type: TokenType.ORG_TOKEN }; - await this.userRepository.addAccountDetails(accountData).then(async () => { - addSessionDetails = await this.userRepository.createSession(sessionData); + await this.userRepository.addAccountDetails(accountData).then(async (response) => { + const finalSessionData = { ...sessionData, accountId: response.id }; + addSessionDetails = await this.userRepository.createSession(finalSessionData); }); } // Response: add session id as cookies diff --git a/apps/user/interfaces/user.interface.ts b/apps/user/interfaces/user.interface.ts index 608f3b76a..1001984e2 100644 --- a/apps/user/interfaces/user.interface.ts +++ b/apps/user/interfaces/user.interface.ts @@ -188,6 +188,7 @@ export interface ISession { refreshToken?: string; keycloakUserId?: string; type?: string; + accountId?: string; } export interface ISessionDetails extends ISession { diff --git a/apps/user/repositories/user.repository.ts b/apps/user/repositories/user.repository.ts index 95950d5dd..af39599b2 100644 --- a/apps/user/repositories/user.repository.ts +++ b/apps/user/repositories/user.repository.ts @@ -678,14 +678,15 @@ export class UserRepository { async createSession(tokenDetails: ISession): Promise { try { - const { sessionToken, userId, expires, refreshToken } = tokenDetails; + const { sessionToken, userId, expires, refreshToken, accountId } = tokenDetails; const sessionResponse = await this.prisma.session.create({ data: { sessionToken, expires, userId, // eslint-disable-next-line camelcase - refresh_token: refreshToken + refresh_token: refreshToken, + accountId } }); return sessionResponse; diff --git a/apps/user/src/user.service.ts b/apps/user/src/user.service.ts index 81132205d..da7accf11 100644 --- a/apps/user/src/user.service.ts +++ b/apps/user/src/user.service.ts @@ -496,8 +496,9 @@ export class UserService { type: TokenType.USER_TOKEN }; - await this.userRepository.addAccountDetails(accountData).then(async () => { - addSessionDetails = await this.userRepository.createSession(sessionData); + await this.userRepository.addAccountDetails(accountData).then(async (response) => { + const finalSessionData = { ...sessionData, accountId: response.id }; + addSessionDetails = await this.userRepository.createSession(finalSessionData); }); } else { accountData = { @@ -507,8 +508,9 @@ export class UserService { refreshToken: tokenDetails?.refresh_token }; - await this.userRepository.updateAccountDetails(accountData).then(async () => { - addSessionDetails = await this.userRepository.createSession(sessionData); + await this.userRepository.updateAccountDetails(accountData).then(async (response) => { + const finalSessionData = { ...sessionData, accountId: response.id }; + addSessionDetails = await this.userRepository.createSession(finalSessionData); }); } diff --git a/libs/prisma-service/prisma/migrations/20250730104449_remove_unique_constraint_for_acoountid/migration.sql b/libs/prisma-service/prisma/migrations/20250730104449_remove_unique_constraint_for_acoountid/migration.sql new file mode 100644 index 000000000..bb1c4da87 --- /dev/null +++ b/libs/prisma-service/prisma/migrations/20250730104449_remove_unique_constraint_for_acoountid/migration.sql @@ -0,0 +1,2 @@ +-- DropIndex +DROP INDEX "session_accountId_key"; diff --git a/libs/prisma-service/prisma/schema.prisma b/libs/prisma-service/prisma/schema.prisma index 6023294cb..59773552b 100644 --- a/libs/prisma-service/prisma/schema.prisma +++ b/libs/prisma-service/prisma/schema.prisma @@ -66,7 +66,7 @@ model session { user user @relation(fields: [userId], references: [id]) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt - accountId String? @unique @db.Uuid + accountId String? @db.Uuid account account? @relation(fields: [accountId], references:[id]) } From b19ec58dc86550c9310b5c4565ccbe153f7eb07d Mon Sep 17 00:00:00 2001 From: shitrerohit Date: Thu, 31 Jul 2025 15:01:25 +0530 Subject: [PATCH 29/60] account and session table related migration added Signed-off-by: shitrerohit --- .../migration.sql | 51 +++++++++++++++++++ libs/prisma-service/prisma/schema.prisma | 15 +++--- 2 files changed, 59 insertions(+), 7 deletions(-) create mode 100644 libs/prisma-service/prisma/migrations/20250731092810_account_session_table_column_name_changes/migration.sql diff --git a/libs/prisma-service/prisma/migrations/20250731092810_account_session_table_column_name_changes/migration.sql b/libs/prisma-service/prisma/migrations/20250731092810_account_session_table_column_name_changes/migration.sql new file mode 100644 index 000000000..8921a348a --- /dev/null +++ b/libs/prisma-service/prisma/migrations/20250731092810_account_session_table_column_name_changes/migration.sql @@ -0,0 +1,51 @@ +/* + Warnings: + + - You are about to drop the column `access_token` on the `account` table. All the data in the column will be lost. + - You are about to drop the column `expires_at` on the `account` table. All the data in the column will be lost. + - You are about to drop the column `id_token` on the `account` table. All the data in the column will be lost. + - You are about to drop the column `refresh_token` on the `account` table. All the data in the column will be lost. + - You are about to drop the column `session_state` on the `account` table. All the data in the column will be lost. + - You are about to drop the column `token_type` on the `account` table. All the data in the column will be lost. + - You are about to drop the column `refresh_token` on the `session` table. All the data in the column will be lost. + - A unique constraint covering the columns `[refreshToken]` on the table `account` will be added. If there are existing duplicate values, this will fail. + - A unique constraint covering the columns `[accessToken]` on the table `account` will be added. If there are existing duplicate values, this will fail. + - A unique constraint covering the columns `[refreshToken]` on the table `session` will be added. If there are existing duplicate values, this will fail. + +*/ +-- DropIndex +DROP INDEX "account_access_token_key"; + +-- DropIndex +DROP INDEX "account_refresh_token_key"; + +-- DropIndex +DROP INDEX "session_refresh_token_key"; + +-- AlterTable +ALTER TABLE "account" DROP COLUMN "access_token", +DROP COLUMN "expires_at", +DROP COLUMN "id_token", +DROP COLUMN "refresh_token", +DROP COLUMN "session_state", +DROP COLUMN "token_type", +ADD COLUMN "accessToken" TEXT, +ADD COLUMN "expiresAt" INTEGER, +ADD COLUMN "idToken" TEXT, +ADD COLUMN "refreshToken" TEXT, +ADD COLUMN "sessionState" TEXT, +ADD COLUMN "tokenType" TEXT; + +-- AlterTable +ALTER TABLE "session" DROP COLUMN "refresh_token", +ADD COLUMN "refreshToken" TEXT, +ADD COLUMN "sessionType" TEXT; + +-- CreateIndex +CREATE UNIQUE INDEX "account_refreshToken_key" ON "account"("refreshToken"); + +-- CreateIndex +CREATE UNIQUE INDEX "account_accessToken_key" ON "account"("accessToken"); + +-- CreateIndex +CREATE UNIQUE INDEX "session_refreshToken_key" ON "session"("refreshToken"); diff --git a/libs/prisma-service/prisma/schema.prisma b/libs/prisma-service/prisma/schema.prisma index 59773552b..a06926c6f 100644 --- a/libs/prisma-service/prisma/schema.prisma +++ b/libs/prisma-service/prisma/schema.prisma @@ -44,13 +44,13 @@ model account { type String? provider String providerAccountId String - refresh_token String? @unique - access_token String? @unique - expires_at Int? - token_type String? + refreshToken String? @unique + accessToken String? @unique + expiresAt Int? + tokenType String? scope String? - id_token String? - session_state String? + idToken String? + sessionState String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt user user @relation(fields: [userId], references: [id]) @@ -62,11 +62,12 @@ model session { sessionToken String @unique userId String @db.Uuid expires Int - refresh_token String? @unique + refreshToken String? @unique user user @relation(fields: [userId], references: [id]) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt accountId String? @db.Uuid + sessionType String? account account? @relation(fields: [accountId], references:[id]) } From 48ab9139ad20dae4c146608bc6599990eecb8fa4 Mon Sep 17 00:00:00 2001 From: shitrerohit Date: Thu, 31 Jul 2025 16:24:26 +0530 Subject: [PATCH 30/60] fix:modification in session creation and account creation Signed-off-by: shitrerohit --- apps/organization/src/organization.service.ts | 7 +++-- apps/user/interfaces/user.interface.ts | 1 + apps/user/repositories/user.repository.ts | 29 +++++++------------ apps/user/src/user.service.ts | 9 +++--- libs/enum/src/enum.ts | 8 +++-- 5 files changed, 27 insertions(+), 27 deletions(-) diff --git a/apps/organization/src/organization.service.ts b/apps/organization/src/organization.service.ts index 7be3c892f..680cf46ef 100644 --- a/apps/organization/src/organization.service.ts +++ b/apps/organization/src/organization.service.ts @@ -27,7 +27,7 @@ import { sendEmail } from '@credebl/common/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, TokenType, transition } from '@credebl/enum/enum'; +import { DidMethod, Invitation, Ledgers, PrismaTables, SessionType, TokenType, transition } from '@credebl/enum/enum'; import { IGetOrgById, IGetOrganization, @@ -712,7 +712,8 @@ export class OrganizationService { const sessionData = { sessionToken: authenticationResult?.access_token, userId: orgRoleDetails['user'].id, - expires: authenticationResult?.expires_in + expires: authenticationResult?.expires_in, + sessionType: SessionType.ORG_SESSION }; const fetchAccountDetails = await this.userRepository.checkAccountDetails(orgRoleDetails['user'].id); @@ -733,7 +734,7 @@ export class OrganizationService { userId: orgRoleDetails['user'].id, expires: authenticationResult?.expires_in, keycloakUserId: orgRoleDetails['user'].keycloakUserId, - type: TokenType.ORG_TOKEN + type: TokenType.BEARER_TOKEN }; await this.userRepository.addAccountDetails(accountData).then(async (response) => { diff --git a/apps/user/interfaces/user.interface.ts b/apps/user/interfaces/user.interface.ts index 1001984e2..05e537003 100644 --- a/apps/user/interfaces/user.interface.ts +++ b/apps/user/interfaces/user.interface.ts @@ -189,6 +189,7 @@ export interface ISession { keycloakUserId?: string; type?: string; accountId?: string; + sessionType?: string; } export interface ISessionDetails extends ISession { diff --git a/apps/user/repositories/user.repository.ts b/apps/user/repositories/user.repository.ts index af39599b2..498459b48 100644 --- a/apps/user/repositories/user.repository.ts +++ b/apps/user/repositories/user.repository.ts @@ -678,15 +678,15 @@ export class UserRepository { async createSession(tokenDetails: ISession): Promise { try { - const { sessionToken, userId, expires, refreshToken, accountId } = tokenDetails; + const { sessionToken, userId, expires, refreshToken, accountId, sessionType } = tokenDetails; const sessionResponse = await this.prisma.session.create({ data: { sessionToken, expires, userId, - // eslint-disable-next-line camelcase - refresh_token: refreshToken, - accountId + refreshToken, + accountId, + sessionType } }); return sessionResponse; @@ -731,12 +731,9 @@ export class UserRepository { userId: accountDetails.userId }, data: { - // eslint-disable-next-line camelcase - access_token: accountDetails.sessionToken, - // eslint-disable-next-line camelcase - refresh_token: accountDetails.refreshToken, - // eslint-disable-next-line camelcase - expires_at: accountDetails.expires + accessToken: accountDetails.sessionToken, + refreshToken: accountDetails.refreshToken, + expiresAt: accountDetails.expires } }); return userAccountDetails; @@ -753,14 +750,10 @@ export class UserRepository { userId: accountDetails.userId, provider: ProviderType.KEYCLOAK, providerAccountId: accountDetails.keycloakUserId, - // eslint-disable-next-line camelcase - access_token: accountDetails.sessionToken, - // eslint-disable-next-line camelcase - refresh_token: accountDetails.refreshToken, - // eslint-disable-next-line camelcase - expires_at: accountDetails.expires, - // eslint-disable-next-line camelcase - token_type: accountDetails.type + accessToken: accountDetails.sessionToken, + refreshToken: accountDetails.refreshToken, + expiresAt: accountDetails.expires, + tokenType: accountDetails.type } }); return userAccountDetails; diff --git a/apps/user/src/user.service.ts b/apps/user/src/user.service.ts index da7accf11..6005521ab 100644 --- a/apps/user/src/user.service.ts +++ b/apps/user/src/user.service.ts @@ -48,7 +48,7 @@ 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, ProviderType, TokenType, UserRole } from '@credebl/enum/enum'; +import { Invitation, ProviderType, SessionType, TokenType, UserRole } from '@credebl/enum/enum'; import validator from 'validator'; import { DISALLOWED_EMAIL_DOMAIN } from '@credebl/common/common.constant'; import { AwsService } from '@credebl/aws'; @@ -385,7 +385,7 @@ export class UserService { provider: ProviderType.KEYCLOAK, providerAccountId: keycloakDetails.keycloakUserId.toString(), // eslint-disable-next-line camelcase - token_type: TokenType.USER_TOKEN + token_type: TokenType.BEARER_TOKEN }; await this.userRepository.addAccountDetails(userAccountDetails); @@ -480,7 +480,8 @@ export class UserService { sessionToken: tokenDetails?.access_token, userId: userData?.id, expires: tokenDetails?.expires_in, - refreshToken: tokenDetails?.refresh_token + refreshToken: tokenDetails?.refresh_token, + sessionType: SessionType.USER_SESSION }; const fetchAccountDetails = await this.userRepository.checkAccountDetails(userData?.id); @@ -493,7 +494,7 @@ export class UserService { expires: tokenDetails?.expires_in, refreshToken: tokenDetails?.refresh_token, keycloakUserId: userData?.keycloakUserId, - type: TokenType.USER_TOKEN + type: TokenType.BEARER_TOKEN }; await this.userRepository.addAccountDetails(accountData).then(async (response) => { diff --git a/libs/enum/src/enum.ts b/libs/enum/src/enum.ts index 09c7b967c..9dc8b31ca 100644 --- a/libs/enum/src/enum.ts +++ b/libs/enum/src/enum.ts @@ -259,8 +259,12 @@ export enum ProofType { } export enum TokenType { - USER_TOKEN = 'user-token', - ORG_TOKEN = 'organization-token' + BEARER_TOKEN = 'Bearer' +} + +export enum SessionType { + USER_SESSION = 'user-session', + ORG_SESSION = 'organization-session' } export enum ProviderType { From 9751adc58e08db24be6217c7a995fc04781db46f Mon Sep 17 00:00:00 2001 From: shitrerohit Date: Thu, 31 Jul 2025 19:15:19 +0530 Subject: [PATCH 31/60] fix:modified the client login credential mathod response Signed-off-by: shitrerohit --- .env.sample | 1 + apps/api-gateway/src/organization/organization.controller.ts | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.env.sample b/.env.sample index 7c78754c9..a041eba5d 100644 --- a/.env.sample +++ b/.env.sample @@ -180,6 +180,7 @@ HOSTNAME='localhost' # Hostname or unique identifier # SSO # To add more clients, simply add comma separated values of client names SUPPORTED_SSO_CLIENTS=CREDEBL +NEXTAUTH_PROTOCOL= # Key for agent base wallet AGENT_API_KEY='supersecret-that-too-16chars' diff --git a/apps/api-gateway/src/organization/organization.controller.ts b/apps/api-gateway/src/organization/organization.controller.ts index 8257119f9..22fba3876 100644 --- a/apps/api-gateway/src/organization/organization.controller.ts +++ b/apps/api-gateway/src/organization/organization.controller.ts @@ -558,8 +558,8 @@ export class OrganizationController { }; res.cookie('session_id', orgCredentials.sessionId, { httpOnly: true, - sameSite: 'lax', - secure: false + sameSite: 'none', + secure: 'http' !== process.env.NEXTAUTH_PROTOCOL }); return res.status(HttpStatus.OK).json(finalResponse); From c6b330b86c13bd737bdb5f380926bd94e4056b02 Mon Sep 17 00:00:00 2001 From: shitrerohit Date: Thu, 31 Jul 2025 19:57:18 +0530 Subject: [PATCH 32/60] fix:update fetch owner org details query Signed-off-by: shitrerohit --- .../repositories/organization.repository.ts | 10 +++---- apps/organization/src/organization.service.ts | 26 +++++++++++++------ 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/apps/organization/repositories/organization.repository.ts b/apps/organization/repositories/organization.repository.ts index ad9d9b964..deed11a4f 100644 --- a/apps/organization/repositories/organization.repository.ts +++ b/apps/organization/repositories/organization.repository.ts @@ -760,14 +760,14 @@ export class OrganizationRepository { throw error; } } - async getOrgAndAdminUser(orgId: string): Promise { + async getOrgAndOwnerUser(orgId: string): Promise { try { return this.prisma.user_org_roles.findFirst({ where: { - orgId - // orgRole:{ - // name:'admin' - // } + orgId, + orgRole: { + name: 'owner' + } }, include: { user: { diff --git a/apps/organization/src/organization.service.ts b/apps/organization/src/organization.service.ts index 680cf46ef..b24257f49 100644 --- a/apps/organization/src/organization.service.ts +++ b/apps/organization/src/organization.service.ts @@ -696,26 +696,34 @@ export class OrganizationService { return response; } + /** + * Method used for generate access token based on client-id and client secret + * @param clientCredentials + * @returns session and access token both + */ async clientLoginCredentails(clientCredentials: IClientCredentials): Promise { const { clientId, clientSecret } = clientCredentials; + // This method used to authenticate the requested user on keycloak const authenticationResult = await this.authenticateClientKeycloak(clientId, clientSecret); let addSessionDetails; - // Fetch organization details for getting the user id - const orgRoleDetails = await this.organizationRepository.getOrgAndAdminUser(clientId); - this.logger.debug(`orgRoleDetails::::${JSON.stringify(orgRoleDetails)}`); - // check seesion details + // Fetch owner organization details for getting the user id + const orgRoleDetails = await this.organizationRepository.getOrgAndOwnerUser(clientId); + // Fetch the total number of sessions for the requested user to check and restrict the creation of multiple sessions. const userSessionDetails = await this.userRepository.fetchUserSessions(orgRoleDetails['user'].id); if (Number(process.env.SESSIONS_LIMIT) <= userSessionDetails?.length) { throw new BadRequestException(ResponseMessages.user.error.sessionLimitReached); } - // Creation sessison and account + // Session payload const sessionData = { sessionToken: authenticationResult?.access_token, userId: orgRoleDetails['user'].id, expires: authenticationResult?.expires_in, sessionType: SessionType.ORG_SESSION }; - + // Note: + // Fetch account details to check whether the requested user account exists + // If the account exists, update it with the latest details and create a new session + // Otherwise, create a new account and also create the new session const fetchAccountDetails = await this.userRepository.checkAccountDetails(orgRoleDetails['user'].id); if (fetchAccountDetails) { const accountData = { @@ -729,6 +737,9 @@ export class OrganizationService { addSessionDetails = await this.userRepository.createSession(finalSessionData); }); } else { + // Note: + // This else block is mostly used for already registered users on the platform to create their account & session in the database. + // Once all users are migrated or created their accounts and sessions in the DB, this code can be removed. const accountData = { sessionToken: authenticationResult?.access_token, userId: orgRoleDetails['user'].id, @@ -742,12 +753,11 @@ export class OrganizationService { addSessionDetails = await this.userRepository.createSession(finalSessionData); }); } - // Response: add session id as cookies + // Response: add session id const finalResponse = { ...authenticationResult, sessionId: addSessionDetails.id }; - // In fetch session API need to handle the conditon for session is comes from cookies or query parameter return finalResponse; } From 084a268214e509f59f74e783d85df5a58efa6668 Mon Sep 17 00:00:00 2001 From: shitrerohit Date: Mon, 4 Aug 2025 16:12:53 +0530 Subject: [PATCH 33/60] WIP:refresh token flow modification Signed-off-by: shitrerohit --- apps/user/interfaces/user.interface.ts | 7 ++++ apps/user/repositories/user.repository.ts | 47 ++++++++++++++++++++++ apps/user/src/user.service.ts | 42 ++++++++++++++++++- libs/common/src/response-messages/index.ts | 6 ++- 4 files changed, 100 insertions(+), 2 deletions(-) diff --git a/apps/user/interfaces/user.interface.ts b/apps/user/interfaces/user.interface.ts index 05e537003..9f17b54fb 100644 --- a/apps/user/interfaces/user.interface.ts +++ b/apps/user/interfaces/user.interface.ts @@ -192,6 +192,13 @@ export interface ISession { sessionType?: string; } +export interface IUpdateAccountDetails { + accessToken: string; + refreshToken?: string; + expiresAt: number; + accountId: string; +} + export interface ISessionDetails extends ISession { id: string; createdAt: Date; diff --git a/apps/user/repositories/user.repository.ts b/apps/user/repositories/user.repository.ts index 498459b48..c02ef0d99 100644 --- a/apps/user/repositories/user.repository.ts +++ b/apps/user/repositories/user.repository.ts @@ -5,6 +5,7 @@ import { ISendVerificationEmail, ISession, IShareUserCertificate, + IUpdateAccountDetails, IUserDeletedActivity, IUserInformation, IUsersProfile, @@ -724,6 +725,38 @@ export class UserRepository { } } + async fetchAccountByRefreshToken(userId: string, refreshToken: string): Promise { + try { + return await this.prisma.account.findUnique({ + where: { + userId, + refreshToken + } + }); + } catch (error) { + this.logger.error(`Error in getting account details: ${error.message} `); + throw error; + } + } + + async updateAccountDetailsById(accountDetails: IUpdateAccountDetails): Promise { + try { + return await this.prisma.account.update({ + where: { + id: accountDetails.accountId + }, + data: { + accessToken: accountDetails.accessToken, + refreshToken: accountDetails.refreshToken, + expiresAt: accountDetails.expiresAt + } + }); + } catch (error) { + this.logger.error(`Error in getting account details: ${error.message} `); + throw error; + } + } + async updateAccountDetails(accountDetails: ISession): Promise { try { const userAccountDetails = await this.prisma.account.update({ @@ -980,4 +1013,18 @@ export class UserRepository { throw error; } } + + async deleteSessionRecordByRefreshToken(refreshToken: string): Promise { + try { + const userSession = await this.prisma.session.delete({ + where: { + refreshToken + } + }); + return userSession; + } catch (error) { + this.logger.error(`Error in logging out user: ${error.message}`); + throw error; + } + } } diff --git a/apps/user/src/user.service.ts b/apps/user/src/user.service.ts index 6005521ab..ed7482d70 100644 --- a/apps/user/src/user.service.ts +++ b/apps/user/src/user.service.ts @@ -41,7 +41,8 @@ import { IEcosystemConfig, IUserForgotPassword, ISessionDetails, - ISessions + ISessions, + IUpdateAccountDetails } from '../interfaces/user.interface'; import { AcceptRejectInvitationDto } from '../dtos/accept-reject-invitation.dto'; import { UserActivityService } from '@credebl/user-activity'; @@ -545,11 +546,50 @@ export class UserService { try { const data = jwt.decode(refreshToken) as jwt.JwtPayload; const userByKeycloakId = await this.userRepository.getUserByKeycloakId(data?.sub); + this.logger.debug(`User details::;${JSON.stringify(userByKeycloakId)}`); const tokenResponse = await this.clientRegistrationService.getAccessToken( refreshToken, userByKeycloakId?.['clientId'], userByKeycloakId?.['clientSecret'] ); + this.logger.debug(`tokenResponse::::${JSON.stringify(tokenResponse)}`); + // Fetch the details from account table based on userid and refresh token + const userAccountDetails = await this.userRepository.fetchAccountByRefreshToken( + userByKeycloakId?.['id'], + refreshToken + ); + // Update the account details with latest access token, refresh token and exp date + if (!userAccountDetails) { + throw new NotFoundException(ResponseMessages.user.error.userAccountNotFound); + } + const updateAccountDetails: IUpdateAccountDetails = { + accessToken: tokenResponse.access_token, + // refreshToken: tokenResponse.refresh_token, + expiresAt: tokenResponse.expires_in, + accountId: userAccountDetails.id + }; + const updateAccountDetailsResponse = await this.userRepository.updateAccountDetailsById(updateAccountDetails); + // Delete the preveious session record and create new one + if (!updateAccountDetailsResponse) { + throw new InternalServerErrorException(ResponseMessages.user.error.errorInUpdateAccountDetails); + } + const deletePreviousSession = await this.userRepository.deleteSessionRecordByRefreshToken(refreshToken); + if (!deletePreviousSession) { + throw new InternalServerErrorException(ResponseMessages.user.error.errorInDeleteSession); + } + const sessionData = { + sessionToken: tokenResponse.access_token, + userId: userByKeycloakId?.['id'], + expires: tokenResponse.expires_in, + // refreshToken: tokenResponse.refresh_token, + sessionType: SessionType.USER_SESSION, + accountId: updateAccountDetailsResponse.id + }; + const addSessionDetails = await this.userRepository.createSession(sessionData); + if (!addSessionDetails) { + throw new InternalServerErrorException(ResponseMessages.user.error.errorInSessionCreation); + } + return tokenResponse; } catch (error) { throw new BadRequestException(ResponseMessages.user.error.invalidRefreshToken); diff --git a/libs/common/src/response-messages/index.ts b/libs/common/src/response-messages/index.ts index 4928b9396..e0bacaac2 100644 --- a/libs/common/src/response-messages/index.ts +++ b/libs/common/src/response-messages/index.ts @@ -66,7 +66,11 @@ export const ResponseMessages = { invalidResetLink: 'Invalid or expired reset password link', invalidAccessToken: 'Authentication failed', invalidRefreshToken: 'Invalid refreshToken provided', - userOrgsLimit: 'Limit reached: You can be associated with or create maximum 10 organizations.' + userOrgsLimit: 'Limit reached: You can be associated with or create maximum 10 organizations.', + errorInUpdateAccountDetails: 'Error in updating the account details', + errorInDeleteSession: 'Error in deleting the session', + errorInSessionCreation: 'Error in create session', + userAccountNotFound: 'User account not found' } }, organisation: { From d0a626725f933899f7aaf6162c35c6e2a3a91fd3 Mon Sep 17 00:00:00 2001 From: bhavanakarwade Date: Wed, 6 Aug 2025 12:53:53 +0530 Subject: [PATCH 34/60] fix: session id decoding issue Signed-off-by: bhavanakarwade --- apps/user/src/user.service.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/user/src/user.service.ts b/apps/user/src/user.service.ts index ed7482d70..f77f9c87d 100644 --- a/apps/user/src/user.service.ts +++ b/apps/user/src/user.service.ts @@ -531,7 +531,8 @@ export class UserService { async getSession(sessionId: string): Promise { try { - const decodedSessionId = decodeURIComponent(sessionId); + const onceDecoded = decodeURIComponent(sessionId); + const decodedSessionId = decodeURIComponent(onceDecoded); const decryptedSessionId = await this.commonService.decryptPassword(decodedSessionId); const sessionDetails = await this.userRepository.getSession(decryptedSessionId); return sessionDetails; From d616a850c9d5279f408ed3ac7ecf7aeb683ed77a Mon Sep 17 00:00:00 2001 From: shitrerohit Date: Mon, 11 Aug 2025 20:32:10 +0530 Subject: [PATCH 35/60] fix:store correct account details issue Signed-off-by: shitrerohit --- apps/user/src/user.service.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/apps/user/src/user.service.ts b/apps/user/src/user.service.ts index f77f9c87d..c3941e745 100644 --- a/apps/user/src/user.service.ts +++ b/apps/user/src/user.service.ts @@ -380,13 +380,12 @@ export class UserService { ); const holderOrgRole = await this.orgRoleService.getRole(OrgRoles.HOLDER); await this.userOrgRoleService.createUserOrgRole(userDetails.id, holderOrgRole.id, null, holderRoleData.id); - const userAccountDetails = { userId: userDetails?.id, provider: ProviderType.KEYCLOAK, - providerAccountId: keycloakDetails.keycloakUserId.toString(), + keycloakUserId: keycloakDetails.keycloakUserId, // eslint-disable-next-line camelcase - token_type: TokenType.BEARER_TOKEN + type: TokenType.BEARER_TOKEN }; await this.userRepository.addAccountDetails(userAccountDetails); @@ -565,7 +564,7 @@ export class UserService { } const updateAccountDetails: IUpdateAccountDetails = { accessToken: tokenResponse.access_token, - // refreshToken: tokenResponse.refresh_token, + refreshToken: tokenResponse.refresh_token, expiresAt: tokenResponse.expires_in, accountId: userAccountDetails.id }; @@ -582,7 +581,7 @@ export class UserService { sessionToken: tokenResponse.access_token, userId: userByKeycloakId?.['id'], expires: tokenResponse.expires_in, - // refreshToken: tokenResponse.refresh_token, + refreshToken: tokenResponse.refresh_token, sessionType: SessionType.USER_SESSION, accountId: updateAccountDetailsResponse.id }; From 79fa61fad89d6b1a4121cf819294cd55d9fefb15 Mon Sep 17 00:00:00 2001 From: Sujit Date: Tue, 19 Aug 2025 08:25:51 +0530 Subject: [PATCH 36/60] fix/schema name save for connection and email Signed-off-by: Sujit --- apps/issuance/src/issuance.repository.ts | 14 ++++++++++++ apps/issuance/src/issuance.service.ts | 27 +++++++++++++++++++++++- 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/apps/issuance/src/issuance.repository.ts b/apps/issuance/src/issuance.repository.ts index d85a9849b..1e97e9d77 100644 --- a/apps/issuance/src/issuance.repository.ts +++ b/apps/issuance/src/issuance.repository.ts @@ -741,4 +741,18 @@ export class IssuanceRepository { throw error; } } + + async saveSchemaIdIssuance(threadId: string, schemaId: string): Promise { + try { + await this.prisma.credentials.update({ + where: { threadId }, + data: { + schemaId + } + }); + } catch (error) { + this.logger.error(`[saveSchemaIdIssuance] - error: ${JSON.stringify(error)}`); + throw error; + } + } } diff --git a/apps/issuance/src/issuance.service.ts b/apps/issuance/src/issuance.service.ts index c315acab2..1c90cc1cd 100644 --- a/apps/issuance/src/issuance.service.ts +++ b/apps/issuance/src/issuance.service.ts @@ -281,6 +281,18 @@ export class IssuanceService { if (allSuccessful) { finalStatusCode = HttpStatus.CREATED; + const context = payload?.credentialData[0]?.credential?.['@context'] as string[]; + + if (Array.isArray(context) && context.includes('https://www.w3.org/2018/credentials/v1')) { + const filterData = context.filter((item) => 'https://www.w3.org/2018/credentials/v1' !== item); + const [schemaId] = filterData; + results.forEach((val) => { + if ('fulfilled' === val.status && val?.value?.threadId) { + this.issuanceRepository.saveSchemaIdIssuance(val?.value?.threadId, schemaId); + } + }); + } + finalMessage = ResponseMessages.issuance.success.create; } else if (allFailed) { finalStatusCode = HttpStatus.BAD_REQUEST; @@ -889,7 +901,6 @@ export class IssuanceService { await this.delay(500); // Wait for 0.5 seconds const sendOobOffer = await this.sendEmailForCredentialOffer(sendEmailCredentialOffer); - arraycredentialOfferResponse.push(sendOobOffer); } if (0 < errors.length) { @@ -1064,6 +1075,20 @@ export class IssuanceService { return false; } + if (isEmailSent) { + const w3cSchemaId = outOfBandIssuancePayload?.credentialFormats?.jsonld?.credential?.['@context'] as string[]; + if (w3cSchemaId && w3cSchemaId.includes('https://www.w3.org/2018/credentials/v1')) { + const filterData = w3cSchemaId.filter((item) => 'https://www.w3.org/2018/credentials/v1' !== item); + const [schemaId] = filterData; + if (credentialCreateOfferDetails.response.credentialRequestThId) { + this.issuanceRepository.saveSchemaIdIssuance( + credentialCreateOfferDetails.response.credentialRequestThId, + schemaId + ); + } + } + } + return isEmailSent; } catch (error) { const iterationNoMessage = ` at position ${iterationNo}`; From efd42766004df6fa61d4806eb52e259fba37dfb9 Mon Sep 17 00:00:00 2001 From: Sujit Date: Wed, 20 Aug 2025 20:57:45 +0530 Subject: [PATCH 37/60] fix/issues in the flow Signed-off-by: Sujit --- apps/issuance/src/issuance.repository.ts | 4 ++-- apps/issuance/src/issuance.service.ts | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/issuance/src/issuance.repository.ts b/apps/issuance/src/issuance.repository.ts index 1e97e9d77..93b16f632 100644 --- a/apps/issuance/src/issuance.repository.ts +++ b/apps/issuance/src/issuance.repository.ts @@ -230,8 +230,8 @@ export class IssuanceRepository { threadId: issueCredentialDto?.threadId, connectionId: issueCredentialDto?.connectionId, state: issueCredentialDto?.state, - schemaId, - credDefId + credDefId, + ...(schemaId ? { schemaId } : {}) }, create: { createDateTime: issueCredentialDto?.createDateTime, diff --git a/apps/issuance/src/issuance.service.ts b/apps/issuance/src/issuance.service.ts index 1c90cc1cd..dbf5e514f 100644 --- a/apps/issuance/src/issuance.service.ts +++ b/apps/issuance/src/issuance.service.ts @@ -283,11 +283,11 @@ export class IssuanceService { finalStatusCode = HttpStatus.CREATED; const context = payload?.credentialData[0]?.credential?.['@context'] as string[]; - if (Array.isArray(context) && context.includes('https://www.w3.org/2018/credentials/v1')) { - const filterData = context.filter((item) => 'https://www.w3.org/2018/credentials/v1' !== item); + if (Array.isArray(context) && context.includes(CommonConstants.W3C_SCHEMA_URL)) { + const filterData = context.filter((item) => CommonConstants.W3C_SCHEMA_URL !== item); const [schemaId] = filterData; results.forEach((val) => { - if ('fulfilled' === val.status && val?.value?.threadId) { + if (PromiseResult.FULFILLED === val.status && val?.value?.threadId) { this.issuanceRepository.saveSchemaIdIssuance(val?.value?.threadId, schemaId); } }); @@ -1077,8 +1077,8 @@ export class IssuanceService { if (isEmailSent) { const w3cSchemaId = outOfBandIssuancePayload?.credentialFormats?.jsonld?.credential?.['@context'] as string[]; - if (w3cSchemaId && w3cSchemaId.includes('https://www.w3.org/2018/credentials/v1')) { - const filterData = w3cSchemaId.filter((item) => 'https://www.w3.org/2018/credentials/v1' !== item); + if (w3cSchemaId && w3cSchemaId.includes(CommonConstants.W3C_SCHEMA_URL)) { + const filterData = w3cSchemaId.filter((item) => CommonConstants.W3C_SCHEMA_URL !== item); const [schemaId] = filterData; if (credentialCreateOfferDetails.response.credentialRequestThId) { this.issuanceRepository.saveSchemaIdIssuance( From 679cfcd45552012915140fe6fdcfdfd9983be06f Mon Sep 17 00:00:00 2001 From: Sujit Date: Thu, 21 Aug 2025 10:09:55 +0530 Subject: [PATCH 38/60] added missing constats file update Signed-off-by: Sujit --- libs/common/src/common.constant.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libs/common/src/common.constant.ts b/libs/common/src/common.constant.ts index dd282e009..734c88f77 100644 --- a/libs/common/src/common.constant.ts +++ b/libs/common/src/common.constant.ts @@ -45,6 +45,9 @@ export enum CommonConstants { URL_LEDG_GET_TAA = '/ledger/taa', URL_LEDG_POST_TAA_ACCEPT = '/ledger/taa/accept', + //W3cSCHEMA + W3C_SCHEMA_URL = 'https://www.w3.org/2018/credentials/v1', + // MESSAGING SERVICES URL_MSG_SEND_MESSAGE = '/connections/#/send-message', URL_MSG_TRUST_PING = '/connections/#/send-ping', From 3e00a4e88d5e233800455acb469e192c23870f57 Mon Sep 17 00:00:00 2001 From: Sujit Date: Fri, 22 Aug 2025 17:54:47 +0530 Subject: [PATCH 39/60] fix/resolved comments Signed-off-by: Sujit --- apps/issuance/src/issuance.repository.ts | 2 +- apps/issuance/src/issuance.service.ts | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/issuance/src/issuance.repository.ts b/apps/issuance/src/issuance.repository.ts index 93b16f632..a3d8eff39 100644 --- a/apps/issuance/src/issuance.repository.ts +++ b/apps/issuance/src/issuance.repository.ts @@ -742,7 +742,7 @@ export class IssuanceRepository { } } - async saveSchemaIdIssuance(threadId: string, schemaId: string): Promise { + async updateSchemaIdByThreadId(threadId: string, schemaId: string): Promise { try { await this.prisma.credentials.update({ where: { threadId }, diff --git a/apps/issuance/src/issuance.service.ts b/apps/issuance/src/issuance.service.ts index dbf5e514f..c8268baad 100644 --- a/apps/issuance/src/issuance.service.ts +++ b/apps/issuance/src/issuance.service.ts @@ -286,9 +286,9 @@ export class IssuanceService { if (Array.isArray(context) && context.includes(CommonConstants.W3C_SCHEMA_URL)) { const filterData = context.filter((item) => CommonConstants.W3C_SCHEMA_URL !== item); const [schemaId] = filterData; - results.forEach((val) => { - if (PromiseResult.FULFILLED === val.status && val?.value?.threadId) { - this.issuanceRepository.saveSchemaIdIssuance(val?.value?.threadId, schemaId); + results.forEach((record) => { + if (PromiseResult.FULFILLED === record.status && record?.value?.threadId) { + this.issuanceRepository.updateSchemaIdByThreadId(record?.value?.threadId, schemaId); } }); } @@ -1081,7 +1081,7 @@ export class IssuanceService { const filterData = w3cSchemaId.filter((item) => CommonConstants.W3C_SCHEMA_URL !== item); const [schemaId] = filterData; if (credentialCreateOfferDetails.response.credentialRequestThId) { - this.issuanceRepository.saveSchemaIdIssuance( + this.issuanceRepository.updateSchemaIdByThreadId( credentialCreateOfferDetails.response.credentialRequestThId, schemaId ); From 759dd3b65594bdb9d1bd7efc4eb24520eebd93a7 Mon Sep 17 00:00:00 2001 From: Sujit Date: Fri, 22 Aug 2025 17:58:04 +0530 Subject: [PATCH 40/60] fix/change name in error for updateSchemaId Signed-off-by: Sujit --- apps/issuance/src/issuance.repository.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/issuance/src/issuance.repository.ts b/apps/issuance/src/issuance.repository.ts index a3d8eff39..7b0ea6abf 100644 --- a/apps/issuance/src/issuance.repository.ts +++ b/apps/issuance/src/issuance.repository.ts @@ -751,7 +751,7 @@ export class IssuanceRepository { } }); } catch (error) { - this.logger.error(`[saveSchemaIdIssuance] - error: ${JSON.stringify(error)}`); + this.logger.error(`[updateSchemaIdByThreadId] - error: ${JSON.stringify(error)}`); throw error; } } From 89caf050ba37979838bb1d8e314ca1e9a7a22810 Mon Sep 17 00:00:00 2001 From: shitrerohit Date: Sun, 24 Aug 2025 10:58:37 +0530 Subject: [PATCH 41/60] fix:changes in accept invitation url Signed-off-by: shitrerohit --- .../organization-invitation.template.ts | 39 ++++++++----------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/apps/organization/templates/organization-invitation.template.ts b/apps/organization/templates/organization-invitation.template.ts index e3fb38f58..b40a05ab8 100644 --- a/apps/organization/templates/organization-invitation.template.ts +++ b/apps/organization/templates/organization-invitation.template.ts @@ -1,25 +1,23 @@ export class OrganizationInviteTemplate { + public sendInviteEmailTemplate( + email: string, + orgName: string, + orgRolesDetails: object[], + firstName: string, + isUserExist: boolean + ): string { + const validUrl = isUserExist ? `${process.env.FRONT_END_URL}/sign-in` : `${process.env.FRONT_END_URL}/sign-up`; - public sendInviteEmailTemplate( - email: string, - orgName: string, - orgRolesDetails: object[], - firstName: string, - isUserExist: boolean - ): string { + const message = isUserExist + ? `Please accept the invitation using the following link:` + : `To get started, kindly register on ${process.env.PLATFORM_NAME} platform using this link:`; - const validUrl = isUserExist ? `${process.env.FRONT_END_URL}/authentication/sign-in` : `${process.env.FRONT_END_URL}/authentication/sign-up`; + const secondMessage = isUserExist + ? `After successful login into ${process.env.PLATFORM_NAME} click on "Accept Organization Invitation" link on your dashboard.` + : `After successful registration, you can log in to the platform and click on “Accept Organization Invitation” on your dashboard.`; - const message = isUserExist - ? `Please accept the invitation using the following link:` - : `To get started, kindly register on ${process.env.PLATFORM_NAME} platform using this link:`; + const Button = isUserExist ? `Accept Organization Invitation` : `Register on ${process.env.PLATFORM_NAME}`; - const secondMessage = isUserExist - ? `After successful login into ${process.env.PLATFORM_NAME} click on "Accept Organization Invitation" link on your dashboard.` - : `After successful registration, you can log in to the platform and click on “Accept Organization Invitation” on your dashboard.`; - - const Button = isUserExist ? `Accept Organization Invitation` : `Register on ${process.env.PLATFORM_NAME}`; - return ` @@ -75,8 +73,5 @@ export class OrganizationInviteTemplate { `; - - } - - -} \ No newline at end of file + } +} From ab9fb632a0709197e9fc4d842e5b129eb0e4b579 Mon Sep 17 00:00:00 2001 From: shitrerohit Date: Sat, 23 Aug 2025 15:57:05 +0530 Subject: [PATCH 42/60] WIP:create account and session workflow modification Signed-off-by: shitrerohit --- .env.demo | 6 ++ .env.sample | 7 +- .../organization/organization.controller.ts | 2 +- apps/organization/src/organization.service.ts | 14 +--- apps/user/repositories/user.repository.ts | 75 +++++-------------- apps/user/src/user.service.ts | 40 +++------- libs/common/src/response-messages/index.ts | 3 +- .../migration.sql | 24 ++++++ libs/prisma-service/prisma/schema.prisma | 7 +- 9 files changed, 70 insertions(+), 108 deletions(-) create mode 100644 libs/prisma-service/prisma/migrations/20250822115351_account_session_table_modification/migration.sql diff --git a/.env.demo b/.env.demo index c73e721c6..51e70592b 100644 --- a/.env.demo +++ b/.env.demo @@ -158,6 +158,12 @@ OTEL_LOGGER_NAME='credebl-platform-logger' HOSTNAME='localhost' SESSIONS_LIMIT=10 # SSO +APP_PROTOCOL=http +#To add more clients, simply copy the variable below and change the word 'CREDEBL' to your client's name. +CREDEBL_CLIENT_ALIAS=CREDEBL +CREDEBL_DOMAIN=http://localhost:3000 +CREDEBL_KEYCLOAK_MANAGEMENT_CLIENT_ID= #Provide the value in its encrypted form using CRYPTO_PRIVATE_KEY. +CREDEBL_KEYCLOAK_MANAGEMENT_CLIENT_SECRET= #Provide the value in its encrypted form using CRYPTO_PRIVATE_KEY. # To add more clients, simply add comma separated values of client names SUPPORTED_SSO_CLIENTS=CREDEBL diff --git a/.env.sample b/.env.sample index a041eba5d..4da82816f 100644 --- a/.env.sample +++ b/.env.sample @@ -178,9 +178,14 @@ OTEL_LOGGER_NAME='credebl-platform-logger' # Name of the logger used for O HOSTNAME='localhost' # Hostname or unique identifier for the service instance # SSO +#To add more clients, simply copy the variable below and change the word 'CREDEBL' to your client's name. +CREDEBL_CLIENT_ALIAS=CREDEBL +CREDEBL_DOMAIN=http://localhost:3000 +CREDEBL_KEYCLOAK_MANAGEMENT_CLIENT_ID= #Provide the value in its encrypted form using CRYPTO_PRIVATE_KEY. +CREDEBL_KEYCLOAK_MANAGEMENT_CLIENT_SECRET= #Provide the value in its encrypted form using CRYPTO_PRIVATE_KEY. # To add more clients, simply add comma separated values of client names SUPPORTED_SSO_CLIENTS=CREDEBL -NEXTAUTH_PROTOCOL= +APP_PROTOCOL= # Key for agent base wallet AGENT_API_KEY='supersecret-that-too-16chars' diff --git a/apps/api-gateway/src/organization/organization.controller.ts b/apps/api-gateway/src/organization/organization.controller.ts index 22fba3876..dd034e418 100644 --- a/apps/api-gateway/src/organization/organization.controller.ts +++ b/apps/api-gateway/src/organization/organization.controller.ts @@ -559,7 +559,7 @@ export class OrganizationController { res.cookie('session_id', orgCredentials.sessionId, { httpOnly: true, sameSite: 'none', - secure: 'http' !== process.env.NEXTAUTH_PROTOCOL + secure: 'http' !== process.env.APP_PROTOCOL }); return res.status(HttpStatus.OK).json(finalResponse); diff --git a/apps/organization/src/organization.service.ts b/apps/organization/src/organization.service.ts index b24257f49..b1e31764d 100644 --- a/apps/organization/src/organization.service.ts +++ b/apps/organization/src/organization.service.ts @@ -726,24 +726,14 @@ export class OrganizationService { // Otherwise, create a new account and also create the new session const fetchAccountDetails = await this.userRepository.checkAccountDetails(orgRoleDetails['user'].id); if (fetchAccountDetails) { - const accountData = { - sessionToken: authenticationResult?.access_token, - userId: orgRoleDetails['user'].id, - expires: authenticationResult?.expires_in - }; - - await this.userRepository.updateAccountDetails(accountData).then(async (response) => { - const finalSessionData = { ...sessionData, accountId: response.id }; - addSessionDetails = await this.userRepository.createSession(finalSessionData); - }); + const finalSessionData = { ...sessionData, accountId: fetchAccountDetails.id }; + addSessionDetails = await this.userRepository.createSession(finalSessionData); } else { // Note: // This else block is mostly used for already registered users on the platform to create their account & session in the database. // Once all users are migrated or created their accounts and sessions in the DB, this code can be removed. const accountData = { - sessionToken: authenticationResult?.access_token, userId: orgRoleDetails['user'].id, - expires: authenticationResult?.expires_in, keycloakUserId: orgRoleDetails['user'].keycloakUserId, type: TokenType.BEARER_TOKEN }; diff --git a/apps/user/repositories/user.repository.ts b/apps/user/repositories/user.repository.ts index c02ef0d99..e8095e706 100644 --- a/apps/user/repositories/user.repository.ts +++ b/apps/user/repositories/user.repository.ts @@ -1,3 +1,4 @@ +/* eslint-disable camelcase */ /* eslint-disable prefer-destructuring */ import { @@ -5,7 +6,6 @@ import { ISendVerificationEmail, ISession, IShareUserCertificate, - IUpdateAccountDetails, IUserDeletedActivity, IUserInformation, IUsersProfile, @@ -17,7 +17,6 @@ import { UserRoleMapping } from '../interfaces/user.interface'; import { Injectable, InternalServerErrorException, Logger, NotFoundException } from '@nestjs/common'; -// eslint-disable-next-line camelcase import { Prisma, RecordType, @@ -725,57 +724,6 @@ export class UserRepository { } } - async fetchAccountByRefreshToken(userId: string, refreshToken: string): Promise { - try { - return await this.prisma.account.findUnique({ - where: { - userId, - refreshToken - } - }); - } catch (error) { - this.logger.error(`Error in getting account details: ${error.message} `); - throw error; - } - } - - async updateAccountDetailsById(accountDetails: IUpdateAccountDetails): Promise { - try { - return await this.prisma.account.update({ - where: { - id: accountDetails.accountId - }, - data: { - accessToken: accountDetails.accessToken, - refreshToken: accountDetails.refreshToken, - expiresAt: accountDetails.expiresAt - } - }); - } catch (error) { - this.logger.error(`Error in getting account details: ${error.message} `); - throw error; - } - } - - async updateAccountDetails(accountDetails: ISession): Promise { - try { - const userAccountDetails = await this.prisma.account.update({ - where: { - userId: accountDetails.userId - }, - data: { - accessToken: accountDetails.sessionToken, - refreshToken: accountDetails.refreshToken, - expiresAt: accountDetails.expires - } - }); - return userAccountDetails; - } catch (error) { - this.logger.error(`Error in updateAccountDetails: ${error.message}`); - throw error; - } - } - async addAccountDetails(accountDetails: ISession): Promise { try { const userAccountDetails = await this.prisma.account.create({ @@ -783,9 +731,6 @@ export class UserRepository { userId: accountDetails.userId, provider: ProviderType.KEYCLOAK, providerAccountId: accountDetails.keycloakUserId, - accessToken: accountDetails.sessionToken, - refreshToken: accountDetails.refreshToken, - expiresAt: accountDetails.expires, tokenType: accountDetails.type } }); @@ -1014,11 +959,11 @@ export class UserRepository { } } - async deleteSessionRecordByRefreshToken(refreshToken: string): Promise { + async deleteSessionRecordByRefreshToken(sessionId: string): Promise { try { const userSession = await this.prisma.session.delete({ where: { - refreshToken + id: sessionId } }); return userSession; @@ -1027,4 +972,18 @@ export class UserRepository { throw error; } } + + async fetchSessionByRefreshToken(refreshToken: string): Promise { + try { + const sessionDetails = await this.prisma.session.findFirst({ + where: { + refreshToken + } + }); + return sessionDetails; + } catch (error) { + this.logger.error(`Error in fetching session details::${error.message}`); + throw error; + } + } } diff --git a/apps/user/src/user.service.ts b/apps/user/src/user.service.ts index c3941e745..7fed65a70 100644 --- a/apps/user/src/user.service.ts +++ b/apps/user/src/user.service.ts @@ -489,10 +489,7 @@ export class UserService { let accountData; if (null === fetchAccountDetails) { accountData = { - sessionToken: tokenDetails?.access_token, userId: userData?.id, - expires: tokenDetails?.expires_in, - refreshToken: tokenDetails?.refresh_token, keycloakUserId: userData?.keycloakUserId, type: TokenType.BEARER_TOKEN }; @@ -502,17 +499,8 @@ export class UserService { addSessionDetails = await this.userRepository.createSession(finalSessionData); }); } else { - accountData = { - sessionToken: tokenDetails?.access_token, - userId: userData?.id, - expires: tokenDetails?.expires_in, - refreshToken: tokenDetails?.refresh_token - }; - - await this.userRepository.updateAccountDetails(accountData).then(async (response) => { - const finalSessionData = { ...sessionData, accountId: response.id }; - addSessionDetails = await this.userRepository.createSession(finalSessionData); - }); + const finalSessionData = { ...sessionData, accountId: fetchAccountDetails.id }; + addSessionDetails = await this.userRepository.createSession(finalSessionData); } const finalResponse = { @@ -554,26 +542,18 @@ export class UserService { ); this.logger.debug(`tokenResponse::::${JSON.stringify(tokenResponse)}`); // Fetch the details from account table based on userid and refresh token - const userAccountDetails = await this.userRepository.fetchAccountByRefreshToken( - userByKeycloakId?.['id'], - refreshToken - ); + const userAccountDetails = await this.userRepository.checkAccountDetails(userByKeycloakId?.['id']); // Update the account details with latest access token, refresh token and exp date if (!userAccountDetails) { throw new NotFoundException(ResponseMessages.user.error.userAccountNotFound); } - const updateAccountDetails: IUpdateAccountDetails = { - accessToken: tokenResponse.access_token, - refreshToken: tokenResponse.refresh_token, - expiresAt: tokenResponse.expires_in, - accountId: userAccountDetails.id - }; - const updateAccountDetailsResponse = await this.userRepository.updateAccountDetailsById(updateAccountDetails); - // Delete the preveious session record and create new one - if (!updateAccountDetailsResponse) { - throw new InternalServerErrorException(ResponseMessages.user.error.errorInUpdateAccountDetails); + // Fetch session details + const sessionDetails = await this.userRepository.fetchSessionByRefreshToken(refreshToken); + if (!sessionDetails) { + throw new NotFoundException(ResponseMessages.user.error.userSeesionNotFound); } - const deletePreviousSession = await this.userRepository.deleteSessionRecordByRefreshToken(refreshToken); + // Delete previous session + const deletePreviousSession = await this.userRepository.deleteSessionRecordByRefreshToken(sessionDetails.id); if (!deletePreviousSession) { throw new InternalServerErrorException(ResponseMessages.user.error.errorInDeleteSession); } @@ -583,7 +563,7 @@ export class UserService { expires: tokenResponse.expires_in, refreshToken: tokenResponse.refresh_token, sessionType: SessionType.USER_SESSION, - accountId: updateAccountDetailsResponse.id + accountId: userAccountDetails.id }; const addSessionDetails = await this.userRepository.createSession(sessionData); if (!addSessionDetails) { diff --git a/libs/common/src/response-messages/index.ts b/libs/common/src/response-messages/index.ts index e0bacaac2..6174734e8 100644 --- a/libs/common/src/response-messages/index.ts +++ b/libs/common/src/response-messages/index.ts @@ -70,7 +70,8 @@ export const ResponseMessages = { errorInUpdateAccountDetails: 'Error in updating the account details', errorInDeleteSession: 'Error in deleting the session', errorInSessionCreation: 'Error in create session', - userAccountNotFound: 'User account not found' + userAccountNotFound: 'User account not found', + userSeesionNotFound: 'User session not found' } }, organisation: { diff --git a/libs/prisma-service/prisma/migrations/20250822115351_account_session_table_modification/migration.sql b/libs/prisma-service/prisma/migrations/20250822115351_account_session_table_modification/migration.sql new file mode 100644 index 000000000..dc29d4425 --- /dev/null +++ b/libs/prisma-service/prisma/migrations/20250822115351_account_session_table_modification/migration.sql @@ -0,0 +1,24 @@ +/* + Warnings: + + - You are about to drop the column `accessToken` on the `account` table. All the data in the column will be lost. + - You are about to drop the column `expiresAt` on the `account` table. All the data in the column will be lost. + - You are about to drop the column `refreshToken` on the `account` table. All the data in the column will be lost. + +*/ +-- DropIndex +DROP INDEX "account_accessToken_key"; + +-- DropIndex +DROP INDEX "account_refreshToken_key"; + +-- DropIndex +DROP INDEX "session_refreshToken_key"; + +-- DropIndex +DROP INDEX "session_sessionToken_key"; + +-- AlterTable +ALTER TABLE "account" DROP COLUMN "accessToken", +DROP COLUMN "expiresAt", +DROP COLUMN "refreshToken"; diff --git a/libs/prisma-service/prisma/schema.prisma b/libs/prisma-service/prisma/schema.prisma index a06926c6f..01c803d54 100644 --- a/libs/prisma-service/prisma/schema.prisma +++ b/libs/prisma-service/prisma/schema.prisma @@ -44,9 +44,6 @@ model account { type String? provider String providerAccountId String - refreshToken String? @unique - accessToken String? @unique - expiresAt Int? tokenType String? scope String? idToken String? @@ -59,10 +56,10 @@ model account { model session { id String @id @default(uuid()) @db.Uuid - sessionToken String @unique + sessionToken String userId String @db.Uuid expires Int - refreshToken String? @unique + refreshToken String? user user @relation(fields: [userId], references: [id]) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt From 820863ab4fb4fa479e0bab201ee19222cd956e4d Mon Sep 17 00:00:00 2001 From: shitrerohit Date: Mon, 25 Aug 2025 17:20:53 +0530 Subject: [PATCH 43/60] fix:add exp logic in jwt strategy Signed-off-by: shitrerohit --- apps/api-gateway/src/authz/jwt.strategy.ts | 40 ++++++++++++---------- apps/user/interfaces/user.interface.ts | 1 + apps/user/repositories/user.repository.ts | 3 +- apps/user/src/user.service.ts | 8 ++--- 4 files changed, 29 insertions(+), 23 deletions(-) diff --git a/apps/api-gateway/src/authz/jwt.strategy.ts b/apps/api-gateway/src/authz/jwt.strategy.ts index a7bac5265..a5dc0a8b6 100644 --- a/apps/api-gateway/src/authz/jwt.strategy.ts +++ b/apps/api-gateway/src/authz/jwt.strategy.ts @@ -1,17 +1,18 @@ import * as dotenv from 'dotenv'; +import * as jwt from 'jsonwebtoken'; import { ExtractJwt, Strategy } from 'passport-jwt'; -import { Injectable, Logger, UnauthorizedException, NotFoundException } from '@nestjs/common'; +import { Injectable, Logger, NotFoundException, UnauthorizedException } from '@nestjs/common'; +import { AuthzService } from './authz.service'; +import { CommonConstants } from '@credebl/common/common.constant'; +import { IOrganization } from '@credebl/common/interfaces/organization.interface'; import { JwtPayload } from './jwt-payload.interface'; +import { OrganizationService } from '../organization/organization.service'; import { PassportStrategy } from '@nestjs/passport'; +import { ResponseMessages } from '@credebl/common/response-messages'; import { UserService } from '../user/user.service'; -import * as jwt from 'jsonwebtoken'; import { passportJwtSecret } from 'jwks-rsa'; -import { CommonConstants } from '@credebl/common/common.constant'; -import { OrganizationService } from '../organization/organization.service'; -import { IOrganization } from '@credebl/common/interfaces/organization.interface'; -import { ResponseMessages } from '@credebl/common/response-messages'; dotenv.config(); @@ -21,15 +22,20 @@ export class JwtStrategy extends PassportStrategy(Strategy) { constructor( private readonly usersService: UserService, - private readonly organizationService: OrganizationService - ) { - + private readonly organizationService: OrganizationService, + private readonly authzService: AuthzService + ) { super({ jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), - secretOrKeyProvider: (request, jwtToken, done) => { + secretOrKeyProvider: async (request, jwtToken, done) => { + // Todo: We need to add this logic in seprate jwt gurd to handle the token expiration functionality. // eslint-disable-next-line @typescript-eslint/no-explicit-any const decodedToken: any = jwt.decode(jwtToken); - + const currentTime = Math.floor(Date.now() / 1000); + if (decodedToken?.exp < currentTime) { + const sessionIds = { sessions: [decodedToken?.sid] }; + await this.authzService.logout(sessionIds); + } if (!decodedToken) { throw new UnauthorizedException(ResponseMessages.user.error.invalidAccessToken); } @@ -49,26 +55,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 +88,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/user/interfaces/user.interface.ts b/apps/user/interfaces/user.interface.ts index 9f17b54fb..cc1d4f97a 100644 --- a/apps/user/interfaces/user.interface.ts +++ b/apps/user/interfaces/user.interface.ts @@ -182,6 +182,7 @@ export interface IUserSignIn { } export interface ISession { + id?: string; sessionToken?: string; userId?: string; expires?: number; diff --git a/apps/user/repositories/user.repository.ts b/apps/user/repositories/user.repository.ts index e8095e706..b66899d99 100644 --- a/apps/user/repositories/user.repository.ts +++ b/apps/user/repositories/user.repository.ts @@ -681,6 +681,7 @@ export class UserRepository { const { sessionToken, userId, expires, refreshToken, accountId, sessionType } = tokenDetails; const sessionResponse = await this.prisma.session.create({ data: { + id: tokenDetails.id, sessionToken, expires, userId, @@ -959,7 +960,7 @@ export class UserRepository { } } - async deleteSessionRecordByRefreshToken(sessionId: string): Promise { + async deleteSession(sessionId: string): Promise { try { const userSession = await this.prisma.session.delete({ where: { diff --git a/apps/user/src/user.service.ts b/apps/user/src/user.service.ts index 7fed65a70..8ca72787a 100644 --- a/apps/user/src/user.service.ts +++ b/apps/user/src/user.service.ts @@ -449,9 +449,7 @@ export class UserService { try { this.validateEmail(email.toLowerCase()); const userData = await this.userRepository.checkUserExist(email.toLowerCase()); - const userSessionDetails = await this.userRepository.fetchUserSessions(userData?.id); - if (Number(process.env.SESSIONS_LIMIT) <= userSessionDetails?.length) { throw new BadRequestException(ResponseMessages.user.error.sessionLimitReached); } @@ -475,8 +473,10 @@ export class UserService { } else { const decryptedPassword = await this.commonService.decryptPassword(password); const tokenDetails = await this.generateToken(email.toLowerCase(), decryptedPassword, userData); - + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const decodedToken: any = jwt.decode(tokenDetails?.access_token); const sessionData = { + id: decodedToken.sid, sessionToken: tokenDetails?.access_token, userId: userData?.id, expires: tokenDetails?.expires_in, @@ -553,7 +553,7 @@ export class UserService { throw new NotFoundException(ResponseMessages.user.error.userSeesionNotFound); } // Delete previous session - const deletePreviousSession = await this.userRepository.deleteSessionRecordByRefreshToken(sessionDetails.id); + const deletePreviousSession = await this.userRepository.deleteSession(sessionDetails.id); if (!deletePreviousSession) { throw new InternalServerErrorException(ResponseMessages.user.error.errorInDeleteSession); } From d4c15236b49a14e4c65dca0e710b1382c9ab0165 Mon Sep 17 00:00:00 2001 From: pranalidhanavade Date: Tue, 26 Aug 2025 11:32:08 +0530 Subject: [PATCH 44/60] fix: session logic for passkey flow (#1404) Signed-off-by: pranalidhanavade --- apps/user/src/user.service.ts | 68 +++++++++++++++++------------------ 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/apps/user/src/user.service.ts b/apps/user/src/user.service.ts index 8ca72787a..fcfa39c82 100644 --- a/apps/user/src/user.service.ts +++ b/apps/user/src/user.service.ts @@ -465,51 +465,51 @@ export class UserService { if (true === isPasskey && false === userData?.isFidoVerified) { throw new UnauthorizedException(ResponseMessages.user.error.registerFido); } - + let tokenDetails; if (true === isPasskey && userData?.username && true === userData?.isFidoVerified) { const getUserDetails = await this.userRepository.getUserDetails(userData.email.toLowerCase()); const decryptedPassword = await this.commonService.decryptPassword(getUserDetails.password); - return await this.generateToken(email.toLowerCase(), decryptedPassword, userData); + tokenDetails = await this.generateToken(email.toLowerCase(), decryptedPassword, userData); } else { const decryptedPassword = await this.commonService.decryptPassword(password); - const tokenDetails = await this.generateToken(email.toLowerCase(), decryptedPassword, userData); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const decodedToken: any = jwt.decode(tokenDetails?.access_token); - const sessionData = { - id: decodedToken.sid, - sessionToken: tokenDetails?.access_token, + tokenDetails = await this.generateToken(email.toLowerCase(), decryptedPassword, userData); + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const decodedToken: any = jwt.decode(tokenDetails?.access_token); + const sessionData = { + id: decodedToken.sid, + sessionToken: tokenDetails?.access_token, + userId: userData?.id, + expires: tokenDetails?.expires_in, + refreshToken: tokenDetails?.refresh_token, + sessionType: SessionType.USER_SESSION + }; + + const fetchAccountDetails = await this.userRepository.checkAccountDetails(userData?.id); + let addSessionDetails; + let accountData; + if (null === fetchAccountDetails) { + accountData = { userId: userData?.id, - expires: tokenDetails?.expires_in, - refreshToken: tokenDetails?.refresh_token, - sessionType: SessionType.USER_SESSION + keycloakUserId: userData?.keycloakUserId, + type: TokenType.BEARER_TOKEN }; - const fetchAccountDetails = await this.userRepository.checkAccountDetails(userData?.id); - let addSessionDetails; - let accountData; - if (null === fetchAccountDetails) { - accountData = { - userId: userData?.id, - keycloakUserId: userData?.keycloakUserId, - type: TokenType.BEARER_TOKEN - }; - - await this.userRepository.addAccountDetails(accountData).then(async (response) => { - const finalSessionData = { ...sessionData, accountId: response.id }; - addSessionDetails = await this.userRepository.createSession(finalSessionData); - }); - } else { - const finalSessionData = { ...sessionData, accountId: fetchAccountDetails.id }; + await this.userRepository.addAccountDetails(accountData).then(async (response) => { + const finalSessionData = { ...sessionData, accountId: response.id }; addSessionDetails = await this.userRepository.createSession(finalSessionData); - } + }); + } else { + const finalSessionData = { ...sessionData, accountId: fetchAccountDetails.id }; + addSessionDetails = await this.userRepository.createSession(finalSessionData); + } - const finalResponse = { - ...tokenDetails, - sessionId: addSessionDetails.id - }; + const finalResponse = { + ...tokenDetails, + sessionId: addSessionDetails.id + }; - return finalResponse; - } + return finalResponse; } catch (error) { this.logger.error(`In Login User : ${JSON.stringify(error)}`); throw new RpcException(error.response ? error.response : error); From 79ada174206842e61abf4bc57d16d4ced4383acc Mon Sep 17 00:00:00 2001 From: sujitaw Date: Tue, 26 Aug 2025 19:59:50 +0530 Subject: [PATCH 45/60] feat: Updated search parameter for Credentials and Verification api (#1403) * wip Signed-off-by: Sujit * fix/credentials list filter update Signed-off-by: Sujit * fix/verification filters updated Signed-off-by: Sujit * fix/sonar qube comment Signed-off-by: Sujit * fix/sonar qube comment Signed-off-by: Sujit * fix/sonar comments Signed-off-by: Sujit * fix/pr comments Signed-off-by: Sujit * fix/pr comments Signed-off-by: Sujit * fix/pr comments Signed-off-by: Sujit --------- Signed-off-by: Sujit --- apps/issuance/enum/issuance.enum.ts | 33 ++++++-- apps/issuance/src/issuance.repository.ts | 84 ++++++++++++++----- .../src/interfaces/verification.interface.ts | 20 +++++ .../repositories/verification.repository.ts | 65 ++++++++++---- 4 files changed, 156 insertions(+), 46 deletions(-) diff --git a/apps/issuance/enum/issuance.enum.ts b/apps/issuance/enum/issuance.enum.ts index aa09cabc9..2d25b147f 100644 --- a/apps/issuance/enum/issuance.enum.ts +++ b/apps/issuance/enum/issuance.enum.ts @@ -1,6 +1,29 @@ export enum SortFields { - CREATED_DATE_TIME = 'createDateTime', - SCHEMA_ID = 'schemaId', - CONNECTION_ID = 'connectionId', - STATE = 'state' -} \ No newline at end of file + CREATED_DATE_TIME = 'createDateTime', + SCHEMA_ID = 'schemaId', + CONNECTION_ID = 'connectionId', + STATE = 'state' +} + +export enum IssueCredentials { + proposalSent = 'proposal-sent', + proposalReceived = 'proposal-received', + offerSent = 'offer-sent', + offerReceived = 'offer-received', + declined = 'decliend', + requestSent = 'request-sent', + requestReceived = 'request-received', + credentialIssued = 'credential-issued', + credentialReceived = 'credential-received', + done = 'done', + abandoned = 'abandoned' +} + +export enum IssuedCredentialStatus { + offerSent = 'Offered', + done = 'Accepted', + abandoned = 'Declined', + received = 'Pending', + proposalReceived = 'Proposal Received', + credIssued = 'Credential Issued' +} diff --git a/apps/issuance/src/issuance.repository.ts b/apps/issuance/src/issuance.repository.ts index 7b0ea6abf..a18635224 100644 --- a/apps/issuance/src/issuance.repository.ts +++ b/apps/issuance/src/issuance.repository.ts @@ -19,6 +19,7 @@ import { org_agents, organisation, platform_config, + Prisma, schema } from '@prisma/client'; @@ -28,6 +29,7 @@ import { IIssuedCredentialSearchParams } from 'apps/api-gateway/src/issuance/int import { IUserRequest } from '@credebl/user-request/user-request.interface'; import { PrismaService } from '@credebl/prisma-service'; import { ResponseMessages } from '@credebl/common/response-messages'; +import { IssueCredentials, IssuedCredentialStatus } from '../enum/issuance.enum'; @Injectable() export class IssuanceRepository { @@ -127,19 +129,66 @@ export class IssuanceRepository { }[]; }> { try { - const issuedCredentialsList = await this.prisma.credentials.findMany({ + const schemas = await this.prisma.schema.findMany({ where: { - orgId, - ...(schemaIds?.length ? { schemaId: { in: schemaIds } } : {}), - ...(!schemaIds?.length && issuedCredentialsSearchCriteria.search - ? { - OR: [ - { connectionId: { contains: issuedCredentialsSearchCriteria.search, mode: 'insensitive' } }, - { schemaId: { contains: issuedCredentialsSearchCriteria.search, mode: 'insensitive' } } - ] - } - : {}) + name: { contains: issuedCredentialsSearchCriteria.search, mode: 'insensitive' } }, + select: { schemaLedgerId: true } + }); + + const schemaIdsMatched = schemas.map((s) => s.schemaLedgerId); + let stateInfo = null; + switch (issuedCredentialsSearchCriteria.search.toLowerCase()) { + case IssuedCredentialStatus.offerSent.toLowerCase(): + stateInfo = IssueCredentials.offerSent; + break; + + case IssuedCredentialStatus.done.toLowerCase(): + stateInfo = IssueCredentials.done; + break; + + case IssuedCredentialStatus.abandoned.toLowerCase(): + stateInfo = IssueCredentials.abandoned; + break; + + case IssuedCredentialStatus.received.toLowerCase(): + stateInfo = IssueCredentials.requestReceived; + break; + + case IssuedCredentialStatus.proposalReceived.toLowerCase(): + stateInfo = IssueCredentials.proposalReceived; + break; + + case IssuedCredentialStatus.credIssued.toLowerCase(): + stateInfo = IssueCredentials.offerSent; + break; + + default: + stateInfo = null; + } + + const issuanceWhereClause: Prisma.credentialsWhereInput = { + orgId, + ...(schemaIds?.length ? { schemaId: { in: schemaIds } } : {}), + ...(!schemaIds?.length && issuedCredentialsSearchCriteria.search + ? { + OR: [ + { connectionId: { contains: issuedCredentialsSearchCriteria.search, mode: 'insensitive' } }, + { schemaId: { contains: issuedCredentialsSearchCriteria.search, mode: 'insensitive' } }, + { schemaId: { in: schemaIdsMatched } }, + { + connections: { + theirLabel: { contains: issuedCredentialsSearchCriteria.search, mode: 'insensitive' } + } + }, + { state: { contains: stateInfo ?? issuedCredentialsSearchCriteria.search, mode: 'insensitive' } } + ] + } + : {}) + }; + + const issuedCredentialsList = await this.prisma.credentials.findMany({ + where: issuanceWhereClause, select: { credentialExchangeId: true, createDateTime: true, @@ -162,18 +211,7 @@ export class IssuanceRepository { skip: (issuedCredentialsSearchCriteria.pageNumber - 1) * issuedCredentialsSearchCriteria.pageSize }); const issuedCredentialsCount = await this.prisma.credentials.count({ - where: { - orgId, - ...(schemaIds?.length ? { schemaId: { in: schemaIds } } : {}), - ...(!schemaIds?.length && issuedCredentialsSearchCriteria.search - ? { - OR: [ - { connectionId: { contains: issuedCredentialsSearchCriteria.search, mode: 'insensitive' } }, - { schemaId: { contains: issuedCredentialsSearchCriteria.search, mode: 'insensitive' } } - ] - } - : {}) - } + where: issuanceWhereClause }); return { issuedCredentialsCount, issuedCredentialsList }; diff --git a/apps/verification/src/interfaces/verification.interface.ts b/apps/verification/src/interfaces/verification.interface.ts index 0eb86b934..2e259a785 100644 --- a/apps/verification/src/interfaces/verification.interface.ts +++ b/apps/verification/src/interfaces/verification.interface.ts @@ -278,3 +278,23 @@ export interface IEmailResponse { outOfBandRecordId: string; proofRecordThId: string; } + +export enum ProofRequest { + presentationReceived = 'presentation-received', + offerReceived = 'offer-received', + declined = 'decliend', + requestSent = 'request-sent', + requestReceived = 'request-received', + credentialIssued = 'credential-issued', + credentialReceived = 'credential-received', + done = 'done', + abandoned = 'abandoned' +} + +export enum ProofRequestState { + requestSent = 'Requested', + requestReceived = 'Received', + done = 'Verified', + abandoned = 'Declined', + presentationReceived = 'Presentation Received' +} diff --git a/apps/verification/src/repositories/verification.repository.ts b/apps/verification/src/repositories/verification.repository.ts index 256fa951d..ded0a3b0e 100644 --- a/apps/verification/src/repositories/verification.repository.ts +++ b/apps/verification/src/repositories/verification.repository.ts @@ -1,8 +1,14 @@ -import { IEmailResponse, IProofPresentation, IProofRequestSearchCriteria } from '../interfaces/verification.interface'; +import { + IEmailResponse, + IProofPresentation, + IProofRequestSearchCriteria, + ProofRequest, + ProofRequestState +} from '../interfaces/verification.interface'; import { IProofPresentationsListCount, IVerificationRecords } from '@credebl/common/interfaces/verification.interface'; import { Injectable, Logger, NotFoundException } from '@nestjs/common'; // eslint-disable-next-line camelcase -import { agent_invitations, org_agents, organisation, platform_config, presentations } from '@prisma/client'; +import { agent_invitations, org_agents, organisation, platform_config, presentations, Prisma } from '@prisma/client'; import { CommonService } from '@credebl/common'; import { IUserRequest } from '@credebl/user-request/user-request.interface'; @@ -87,15 +93,45 @@ export class VerificationRepository { proofRequestsSearchCriteria: IProofRequestSearchCriteria ): Promise { try { + let verificationStateInfo = null; + + switch (proofRequestsSearchCriteria.search.toLowerCase()) { + case ProofRequestState.requestSent.toLowerCase(): + verificationStateInfo = ProofRequest.requestSent; + break; + case ProofRequestState.requestReceived.toLowerCase(): + verificationStateInfo = ProofRequest.requestReceived; + break; + case ProofRequestState.done.toLowerCase(): + verificationStateInfo = ProofRequest.done; + break; + case ProofRequestState.abandoned.toLowerCase(): + verificationStateInfo = ProofRequest.abandoned; + break; + case ProofRequestState.presentationReceived.toLowerCase(): + verificationStateInfo = ProofRequest.presentationReceived; + break; + default: + verificationStateInfo = null; + } + + const whereClause: Prisma.presentationsWhereInput = { + orgId, + OR: [ + { connectionId: { contains: proofRequestsSearchCriteria.search, mode: 'insensitive' } }, + { presentationId: { contains: proofRequestsSearchCriteria.search, mode: 'insensitive' } }, + { emailId: { contains: proofRequestsSearchCriteria.search, mode: 'insensitive' } }, + { + connections: { + theirLabel: { contains: proofRequestsSearchCriteria.search, mode: 'insensitive' } + } + }, + { state: { contains: verificationStateInfo ?? proofRequestsSearchCriteria.search, mode: 'insensitive' } } + ] + }; + const proofRequestsList = await this.prisma.presentations.findMany({ - where: { - orgId, - OR: [ - { connectionId: { contains: proofRequestsSearchCriteria.search, mode: 'insensitive' } }, - { state: { contains: proofRequestsSearchCriteria.search, mode: 'insensitive' } }, - { presentationId: { contains: proofRequestsSearchCriteria.search, mode: 'insensitive' } } - ] - }, + where: whereClause, select: { createDateTime: true, createdBy: true, @@ -122,14 +158,7 @@ export class VerificationRepository { }); const proofRequestsCount = await this.prisma.presentations.count({ - where: { - orgId, - OR: [ - { connectionId: { contains: proofRequestsSearchCriteria.search, mode: 'insensitive' } }, - { state: { contains: proofRequestsSearchCriteria.search, mode: 'insensitive' } }, - { presentationId: { contains: proofRequestsSearchCriteria.search, mode: 'insensitive' } } - ] - } + where: whereClause }); return { proofRequestsCount, proofRequestsList }; From bdb89f2002a3104baff1fa90b8af7c289cf44f38 Mon Sep 17 00:00:00 2001 From: sujitaw Date: Tue, 26 Aug 2025 20:06:16 +0530 Subject: [PATCH 46/60] fix: Issue for wallet creation with existing DID and Seed (#1394) * fix/creation of wallet using existing did Signed-off-by: Sujit * fix/change the for loop with retry function Signed-off-by: Sujit * fix/pr comments Signed-off-by: Sujit --------- Signed-off-by: Sujit --- .../src/agent-service.service.ts | 36 ++++++++++++++++--- .../src/interface/agent-service.interface.ts | 2 ++ 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/apps/agent-service/src/agent-service.service.ts b/apps/agent-service/src/agent-service.service.ts index b844083cd..fdb98e8cc 100644 --- a/apps/agent-service/src/agent-service.service.ts +++ b/apps/agent-service/src/agent-service.service.ts @@ -1156,6 +1156,21 @@ export class AgentServiceService { return tenantDetails; } + private async handleCreateDid( + agentEndpoint: string, + didPayload: Record, + apiKey: string + ): Promise { + try { + return await this.commonService.httpPost(`${agentEndpoint}${CommonConstants.URL_AGENT_WRITE_DID}`, didPayload, { + headers: { authorization: apiKey } + }); + } catch (error) { + this.logger.error('Error creating did:', error.message || error); + throw new RpcException(error.response ? error.response : error); + } + } + /** * Create tenant wallet on the agent * @param _createDID @@ -1164,13 +1179,24 @@ export class AgentServiceService { private async _createDID(didCreateOption): Promise { const { didPayload, agentEndpoint, apiKey } = didCreateOption; // Invoke an API request from the agent to create multi-tenant agent - const didDetails = await this.commonService.httpPost( - `${agentEndpoint}${CommonConstants.URL_AGENT_WRITE_DID}`, - didPayload, - { headers: { authorization: apiKey } } - ); + + //To Do : this is a temporary fix in normal case the api should return correct data in first attempt , to be removed in future on fixing did/write api response + const retryOptions = { + retries: 2 + }; + + const didDetails = await retry(async () => { + const data = await this.handleCreateDid(agentEndpoint, didPayload, apiKey); + if (data?.didDocument || data?.didDoc) { + return data; + } + + throw new Error('Invalid response, retrying...'); + }, retryOptions); + return didDetails; } + private async createSocketInstance(): Promise { return io(`${process.env.SOCKET_HOST}`, { reconnection: true, diff --git a/apps/agent-service/src/interface/agent-service.interface.ts b/apps/agent-service/src/interface/agent-service.interface.ts index 4121cf4c3..28b711b93 100644 --- a/apps/agent-service/src/interface/agent-service.interface.ts +++ b/apps/agent-service/src/interface/agent-service.interface.ts @@ -434,6 +434,8 @@ export interface ICreateTenant { tenantRecord: ITenantRecord; did: string; verkey: string; + didDocument?: Record; + didDoc?: Record; } export interface IOrgAgent { From b19590c75e325a198cc358143629b33945531235 Mon Sep 17 00:00:00 2001 From: sujitaw Date: Wed, 27 Aug 2025 18:41:47 +0530 Subject: [PATCH 47/60] Third-Party DCO Remediation Commit for sujitaw (#1407) On behalf of sujitaw , I, Sujit , hereby add my Signed-off-by to this commit: 79ada174206842e61abf4bc57d16d4ced4383acc On behalf of sujitaw , I, Sujit , hereby add my Signed-off-by to this commit: bdb89f2002a3104baff1fa90b8af7c289cf44f38 Signed-off-by: Sujit --- apps/issuance/src/issuance.repository.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/issuance/src/issuance.repository.ts b/apps/issuance/src/issuance.repository.ts index a18635224..5a6558ed9 100644 --- a/apps/issuance/src/issuance.repository.ts +++ b/apps/issuance/src/issuance.repository.ts @@ -789,7 +789,7 @@ export class IssuanceRepository { } }); } catch (error) { - this.logger.error(`[updateSchemaIdByThreadId] - error: ${JSON.stringify(error)}`); + this.logger.error(` [updateSchemaIdByThreadId] - error: ${JSON.stringify(error)}`); throw error; } } From 5e650c2e2b5f0b846862325a86ddfb077c021db2 Mon Sep 17 00:00:00 2001 From: Sujit Date: Wed, 27 Aug 2025 18:51:13 +0530 Subject: [PATCH 48/60] Third-Party DCO Remediation Commit for sujitaw On behalf of sujitaw , I, Sujit , hereby add my Signed-off-by to this commit: 79ada174206842e61abf4bc57d16d4ced4383acc On behalf of sujitaw , I, Sujit , hereby add my Signed-off-by to this commit: bdb89f2002a3104baff1fa90b8af7c289cf44f38 On behalf of sujitaw , I, Sujit , hereby add my Signed-off-by to this commit: b19590c75e325a198cc358143629b33945531235 Signed-off-by: Sujit --- apps/issuance/src/issuance.repository.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/issuance/src/issuance.repository.ts b/apps/issuance/src/issuance.repository.ts index 5a6558ed9..a18635224 100644 --- a/apps/issuance/src/issuance.repository.ts +++ b/apps/issuance/src/issuance.repository.ts @@ -789,7 +789,7 @@ export class IssuanceRepository { } }); } catch (error) { - this.logger.error(` [updateSchemaIdByThreadId] - error: ${JSON.stringify(error)}`); + this.logger.error(`[updateSchemaIdByThreadId] - error: ${JSON.stringify(error)}`); throw error; } } From f93c933fed48ad07565870408d66708c41e530e7 Mon Sep 17 00:00:00 2001 From: shitrerohit Date: Thu, 28 Aug 2025 17:57:47 +0530 Subject: [PATCH 49/60] fix:resolved user not found error on login Signed-off-by: shitrerohit --- apps/user/src/user.service.ts | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/apps/user/src/user.service.ts b/apps/user/src/user.service.ts index fcfa39c82..7101c8678 100644 --- a/apps/user/src/user.service.ts +++ b/apps/user/src/user.service.ts @@ -449,15 +449,9 @@ export class UserService { try { this.validateEmail(email.toLowerCase()); const userData = await this.userRepository.checkUserExist(email.toLowerCase()); - const userSessionDetails = await this.userRepository.fetchUserSessions(userData?.id); - if (Number(process.env.SESSIONS_LIMIT) <= userSessionDetails?.length) { - throw new BadRequestException(ResponseMessages.user.error.sessionLimitReached); - } - if (!userData) { throw new NotFoundException(ResponseMessages.user.error.notFound); } - if (userData && !userData.isEmailVerified) { throw new BadRequestException(ResponseMessages.user.error.verifyMail); } @@ -465,6 +459,10 @@ export class UserService { if (true === isPasskey && false === userData?.isFidoVerified) { throw new UnauthorizedException(ResponseMessages.user.error.registerFido); } + const userSessionDetails = await this.userRepository.fetchUserSessions(userData?.id); + if (Number(process.env.SESSIONS_LIMIT) <= userSessionDetails?.length) { + throw new BadRequestException(ResponseMessages.user.error.sessionLimitReached); + } let tokenDetails; if (true === isPasskey && userData?.username && true === userData?.isFidoVerified) { const getUserDetails = await this.userRepository.getUserDetails(userData.email.toLowerCase()); From 90cf16a07067321f0ed3007c50ccdb9945fa6e99 Mon Sep 17 00:00:00 2001 From: sujitaw Date: Fri, 29 Aug 2025 13:09:55 +0530 Subject: [PATCH 50/60] fix/badge issuance error for non wallet issuance (#1411) Signed-off-by: Sujit --- apps/agent-service/src/agent-service.service.ts | 4 ++-- libs/common/src/common.constant.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/agent-service/src/agent-service.service.ts b/apps/agent-service/src/agent-service.service.ts index fdb98e8cc..c9f8ba12e 100644 --- a/apps/agent-service/src/agent-service.service.ts +++ b/apps/agent-service/src/agent-service.service.ts @@ -1568,7 +1568,7 @@ export class AgentServiceService { description: ResponseMessages.errorMessages.notFound }); } - const url = getAgentUrl(orgAgentDetails.agentEndPoint, CommonConstants.SIGN_DATA_FROM_AGENT); + const url = await getAgentUrl(orgAgentDetails.agentEndPoint, CommonConstants.SIGN_DATA_FROM_AGENT); const { dataTypeToSign, credentialPayload, rawPayload, storeCredential } = data; @@ -1628,7 +1628,7 @@ export class AgentServiceService { description: ResponseMessages.errorMessages.notFound }); } - const url = getAgentUrl(orgAgentDetails.agentEndPoint, CommonConstants.VERIFY_SIGNED_DATA_FROM_AGENT); + const url = await getAgentUrl(orgAgentDetails.agentEndPoint, CommonConstants.VERIFY_SIGNED_DATA_FROM_AGENT); // Invoke an API request from the agent to assess its current status const signedDataFromAgent = await this.commonService diff --git a/libs/common/src/common.constant.ts b/libs/common/src/common.constant.ts index 734c88f77..02c6efd05 100644 --- a/libs/common/src/common.constant.ts +++ b/libs/common/src/common.constant.ts @@ -111,7 +111,7 @@ export enum CommonConstants { URL_AGENT_GET_ENDPOINT = '/agent', // sign data from agent - URL_AGENT_SIGN_DATA = '/agent/credential/sign/#', + URL_AGENT_SIGN_DATA = '/agent/credential/sign', URL_AGENT_VERIFY_SIGNED_DATA = '/agent/credential/verify', // CREATE KEYS From 2ca4baa30d3c365719472f5277e14ab3d6c10f04 Mon Sep 17 00:00:00 2001 From: Sujit Date: Fri, 29 Aug 2025 17:38:40 +0530 Subject: [PATCH 51/60] Third-Party DCO Remediation Commit for sujitaw On behalf of sujitaw , I, Sujit , hereby add my Signed-off-by to this commit: 90cf16a07067321f0ed3007c50ccdb9945fa6e99 Signed-off-by: Sujit --- apps/agent-service/src/agent-service.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/agent-service/src/agent-service.service.ts b/apps/agent-service/src/agent-service.service.ts index c9f8ba12e..5fb66e6e6 100644 --- a/apps/agent-service/src/agent-service.service.ts +++ b/apps/agent-service/src/agent-service.service.ts @@ -105,7 +105,7 @@ export class AgentServiceService { const agentDetails = await this.agentServiceRepository.getAgentDetailsByOrgId(orgId); return agentDetails; } catch (error) { - this.logger.error(`in getAgentDetails::: ${JSON.stringify(error)}`); + this.logger.error(`in getAgentDetails ::: ${JSON.stringify(error)}`); throw new RpcException(error.response ?? error); } } From 19975c942a48c0ace312f323985e51104e3f5794 Mon Sep 17 00:00:00 2001 From: shitrerohit Date: Thu, 28 Aug 2025 17:17:35 +0530 Subject: [PATCH 52/60] WIP:delete inactive sessions Signed-off-by: shitrerohit --- apps/api-gateway/src/user/user.controller.ts | 167 +++++++++++-------- apps/api-gateway/src/user/user.service.ts | 24 +-- apps/user/repositories/user.repository.ts | 26 +++ apps/user/src/user.controller.ts | 5 + apps/user/src/user.service.ts | 9 + 5 files changed, 149 insertions(+), 82 deletions(-) diff --git a/apps/api-gateway/src/user/user.controller.ts b/apps/api-gateway/src/user/user.controller.ts index c9f138a52..3ee603c28 100644 --- a/apps/api-gateway/src/user/user.controller.ts +++ b/apps/api-gateway/src/user/user.controller.ts @@ -62,7 +62,7 @@ export class UserController { private readonly userService: UserService, private readonly commonService: CommonService, private readonly awsService: AwsService - ) { } + ) {} /** * @@ -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,19 @@ export class UserController { return res.status(HttpStatus.OK).json(finalResponse); } -} \ No newline at end of file + + @Post('/delete-inactive-sessions') + @ApiOperation({ + summary: 'Update platform settings', + description: 'Modify platform settings. Only accessible by platform admins.' + }) + async deleteInactiveSessions(@Res() res: Response): Promise { + await this.userService.deleteInactiveSessions(); + const finalResponse = { + statusCode: HttpStatus.OK, + message: '' + }; + + return res.status(HttpStatus.OK).json(finalResponse); + } +} diff --git a/apps/api-gateway/src/user/user.service.ts b/apps/api-gateway/src/user/user.service.ts index c3988d810..f08ab3772 100644 --- a/apps/api-gateway/src/user/user.service.ts +++ b/apps/api-gateway/src/user/user.service.ts @@ -15,7 +15,10 @@ import { NATSClient } from '@credebl/common/NATSClient'; @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 +28,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 +46,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); @@ -94,4 +92,8 @@ export class UserService extends BaseService { const payload = { email }; return this.natsClient.sendNatsMessage(this.serviceProxy, 'get-user-info-by-user-email-keycloak', payload); } + + async deleteInactiveSessions(): Promise { + return this.natsClient.sendNatsMessage(this.serviceProxy, 'delete-inactive-sessions', ''); + } } diff --git a/apps/user/repositories/user.repository.ts b/apps/user/repositories/user.repository.ts index b66899d99..c3be9054c 100644 --- a/apps/user/repositories/user.repository.ts +++ b/apps/user/repositories/user.repository.ts @@ -987,4 +987,30 @@ export class UserRepository { throw error; } } + + async deleteInactiveSessions(): Promise { + try { + // await this.prisma.session.deleteMany({ + // where: { + // AND: [ + // { + // createdAt: { + // lt: new Date(Date.now() - expires), // Current time minus expire interval + // }, + // }, + // // You can add more conditions here + // ], + // }, + // }); + const response = await this.prisma.$executeRaw` + DELETE FROM "session" + WHERE ("createdAt" + make_interval(secs => "expires")) < NOW() + `; + this.logger.debug('Response::', response); + return response; + } catch (error) { + this.logger.error(`Error in deleting the in active sessions::${error.message}`); + throw error; + } + } } diff --git a/apps/user/src/user.controller.ts b/apps/user/src/user.controller.ts index a539d8a99..eff76fff1 100644 --- a/apps/user/src/user.controller.ts +++ b/apps/user/src/user.controller.ts @@ -269,4 +269,9 @@ export class UserController { async logout(logoutUserDto: ISessions): Promise { return this.userService.logout(logoutUserDto); } + + @MessagePattern({ cmd: 'delete-inactive-sessions' }) + async deleteInActiveSessions(): Promise { + return this.userService.deleteInActiveSessions(); + } } diff --git a/apps/user/src/user.service.ts b/apps/user/src/user.service.ts index 7101c8678..717b9a1e9 100644 --- a/apps/user/src/user.service.ts +++ b/apps/user/src/user.service.ts @@ -1335,4 +1335,13 @@ export class UserService { throw new RpcException(error.response ? error.response : error); } } + + async deleteInActiveSessions(): Promise { + try { + return await this.userRepository.deleteInactiveSessions(); + } catch (error) { + this.logger.error(`Error in deleting in-active sessions`); + throw new RpcException(error.response ? error.response : error); + } + } } From bd4cc44a381c5940eb6b44c06e40f3057867f8d3 Mon Sep 17 00:00:00 2001 From: shitrerohit Date: Fri, 29 Aug 2025 20:03:44 +0530 Subject: [PATCH 53/60] Added delete inactive session functionality during login Signed-off-by: shitrerohit --- apps/api-gateway/src/user/user.controller.ts | 15 --------- apps/api-gateway/src/user/user.service.ts | 4 --- apps/organization/src/organization.service.ts | 11 ++++++- apps/user/interfaces/user.interface.ts | 1 + apps/user/repositories/user.repository.ts | 33 ++++++++----------- apps/user/src/user.controller.ts | 5 --- apps/user/src/user.service.ts | 22 ++++++------- .../migration.sql | 2 ++ libs/prisma-service/prisma/schema.prisma | 1 + 9 files changed, 38 insertions(+), 56 deletions(-) create mode 100644 libs/prisma-service/prisma/migrations/20250829091021_add_expiresat_in_session_table/migration.sql diff --git a/apps/api-gateway/src/user/user.controller.ts b/apps/api-gateway/src/user/user.controller.ts index 3ee603c28..588f7e259 100644 --- a/apps/api-gateway/src/user/user.controller.ts +++ b/apps/api-gateway/src/user/user.controller.ts @@ -416,19 +416,4 @@ export class UserController { return res.status(HttpStatus.OK).json(finalResponse); } - - @Post('/delete-inactive-sessions') - @ApiOperation({ - summary: 'Update platform settings', - description: 'Modify platform settings. Only accessible by platform admins.' - }) - async deleteInactiveSessions(@Res() res: Response): Promise { - await this.userService.deleteInactiveSessions(); - const finalResponse = { - statusCode: HttpStatus.OK, - message: '' - }; - - return res.status(HttpStatus.OK).json(finalResponse); - } } diff --git a/apps/api-gateway/src/user/user.service.ts b/apps/api-gateway/src/user/user.service.ts index f08ab3772..1d0281af1 100644 --- a/apps/api-gateway/src/user/user.service.ts +++ b/apps/api-gateway/src/user/user.service.ts @@ -92,8 +92,4 @@ export class UserService extends BaseService { const payload = { email }; return this.natsClient.sendNatsMessage(this.serviceProxy, 'get-user-info-by-user-email-keycloak', payload); } - - async deleteInactiveSessions(): Promise { - return this.natsClient.sendNatsMessage(this.serviceProxy, 'delete-inactive-sessions', ''); - } } diff --git a/apps/organization/src/organization.service.ts b/apps/organization/src/organization.service.ts index b1e31764d..72b0e5926 100644 --- a/apps/organization/src/organization.service.ts +++ b/apps/organization/src/organization.service.ts @@ -64,6 +64,8 @@ import { DeleteOrgInvitationsEmail } from '../templates/delete-organization-invi import { IOrgRoles } from 'libs/org-roles/interfaces/org-roles.interface'; import { NATSClient } from '@credebl/common/NATSClient'; import { UserRepository } from 'apps/user/repositories/user.repository'; +import * as jwt from 'jsonwebtoken'; + @Injectable() export class OrganizationService { constructor( @@ -708,17 +710,24 @@ export class OrganizationService { let addSessionDetails; // Fetch owner organization details for getting the user id const orgRoleDetails = await this.organizationRepository.getOrgAndOwnerUser(clientId); + // called seprate method to delete exp session + this.userRepository.deleteInactiveSessions(orgRoleDetails['user'].id); + // Fetch the total number of sessions for the requested user to check and restrict the creation of multiple sessions. const userSessionDetails = await this.userRepository.fetchUserSessions(orgRoleDetails['user'].id); if (Number(process.env.SESSIONS_LIMIT) <= userSessionDetails?.length) { throw new BadRequestException(ResponseMessages.user.error.sessionLimitReached); } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const decodedToken: any = jwt.decode(authenticationResult?.access_token); + const expiresAt = new Date(decodedToken.exp * 1000); // Session payload const sessionData = { sessionToken: authenticationResult?.access_token, userId: orgRoleDetails['user'].id, expires: authenticationResult?.expires_in, - sessionType: SessionType.ORG_SESSION + sessionType: SessionType.ORG_SESSION, + expiresAt }; // Note: // Fetch account details to check whether the requested user account exists diff --git a/apps/user/interfaces/user.interface.ts b/apps/user/interfaces/user.interface.ts index cc1d4f97a..a0c3ba997 100644 --- a/apps/user/interfaces/user.interface.ts +++ b/apps/user/interfaces/user.interface.ts @@ -191,6 +191,7 @@ export interface ISession { type?: string; accountId?: string; sessionType?: string; + expiresAt?: Date; } export interface IUpdateAccountDetails { diff --git a/apps/user/repositories/user.repository.ts b/apps/user/repositories/user.repository.ts index c3be9054c..91e444097 100644 --- a/apps/user/repositories/user.repository.ts +++ b/apps/user/repositories/user.repository.ts @@ -678,7 +678,7 @@ export class UserRepository { async createSession(tokenDetails: ISession): Promise { try { - const { sessionToken, userId, expires, refreshToken, accountId, sessionType } = tokenDetails; + const { sessionToken, userId, expires, refreshToken, accountId, sessionType, expiresAt } = tokenDetails; const sessionResponse = await this.prisma.session.create({ data: { id: tokenDetails.id, @@ -687,7 +687,8 @@ export class UserRepository { userId, refreshToken, accountId, - sessionType + sessionType, + expiresAt } }); return sessionResponse; @@ -988,24 +989,16 @@ export class UserRepository { } } - async deleteInactiveSessions(): Promise { - try { - // await this.prisma.session.deleteMany({ - // where: { - // AND: [ - // { - // createdAt: { - // lt: new Date(Date.now() - expires), // Current time minus expire interval - // }, - // }, - // // You can add more conditions here - // ], - // }, - // }); - const response = await this.prisma.$executeRaw` - DELETE FROM "session" - WHERE ("createdAt" + make_interval(secs => "expires")) < NOW() - `; + async deleteInactiveSessions(userId: string): Promise { + try { + const response = await this.prisma.session.deleteMany({ + where: { + expiresAt: { + lt: new Date() + }, + userId + } + }); this.logger.debug('Response::', response); return response; } catch (error) { diff --git a/apps/user/src/user.controller.ts b/apps/user/src/user.controller.ts index eff76fff1..a539d8a99 100644 --- a/apps/user/src/user.controller.ts +++ b/apps/user/src/user.controller.ts @@ -269,9 +269,4 @@ export class UserController { async logout(logoutUserDto: ISessions): Promise { return this.userService.logout(logoutUserDto); } - - @MessagePattern({ cmd: 'delete-inactive-sessions' }) - async deleteInActiveSessions(): Promise { - return this.userService.deleteInActiveSessions(); - } } diff --git a/apps/user/src/user.service.ts b/apps/user/src/user.service.ts index 717b9a1e9..0237993e6 100644 --- a/apps/user/src/user.service.ts +++ b/apps/user/src/user.service.ts @@ -459,6 +459,8 @@ export class UserService { if (true === isPasskey && false === userData?.isFidoVerified) { throw new UnauthorizedException(ResponseMessages.user.error.registerFido); } + // called seprate method to delete exp session + this.userRepository.deleteInactiveSessions(userData?.id); const userSessionDetails = await this.userRepository.fetchUserSessions(userData?.id); if (Number(process.env.SESSIONS_LIMIT) <= userSessionDetails?.length) { throw new BadRequestException(ResponseMessages.user.error.sessionLimitReached); @@ -474,13 +476,16 @@ export class UserService { } // eslint-disable-next-line @typescript-eslint/no-explicit-any const decodedToken: any = jwt.decode(tokenDetails?.access_token); + const expiresAt = new Date(decodedToken.exp * 1000); + const sessionData = { id: decodedToken.sid, sessionToken: tokenDetails?.access_token, userId: userData?.id, expires: tokenDetails?.expires_in, refreshToken: tokenDetails?.refresh_token, - sessionType: SessionType.USER_SESSION + sessionType: SessionType.USER_SESSION, + expiresAt }; const fetchAccountDetails = await this.userRepository.checkAccountDetails(userData?.id); @@ -555,13 +560,17 @@ export class UserService { if (!deletePreviousSession) { throw new InternalServerErrorException(ResponseMessages.user.error.errorInDeleteSession); } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const decodedToken: any = jwt.decode(tokenResponse?.access_token); + const expiresAt = new Date(decodedToken.exp * 1000); const sessionData = { sessionToken: tokenResponse.access_token, userId: userByKeycloakId?.['id'], expires: tokenResponse.expires_in, refreshToken: tokenResponse.refresh_token, sessionType: SessionType.USER_SESSION, - accountId: userAccountDetails.id + accountId: userAccountDetails.id, + expiresAt }; const addSessionDetails = await this.userRepository.createSession(sessionData); if (!addSessionDetails) { @@ -1335,13 +1344,4 @@ export class UserService { throw new RpcException(error.response ? error.response : error); } } - - async deleteInActiveSessions(): Promise { - try { - return await this.userRepository.deleteInactiveSessions(); - } catch (error) { - this.logger.error(`Error in deleting in-active sessions`); - throw new RpcException(error.response ? error.response : error); - } - } } diff --git a/libs/prisma-service/prisma/migrations/20250829091021_add_expiresat_in_session_table/migration.sql b/libs/prisma-service/prisma/migrations/20250829091021_add_expiresat_in_session_table/migration.sql new file mode 100644 index 000000000..70b14e0a1 --- /dev/null +++ b/libs/prisma-service/prisma/migrations/20250829091021_add_expiresat_in_session_table/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "session" ADD COLUMN "expiresAt" TIMESTAMP(6); diff --git a/libs/prisma-service/prisma/schema.prisma b/libs/prisma-service/prisma/schema.prisma index 01c803d54..337c953a2 100644 --- a/libs/prisma-service/prisma/schema.prisma +++ b/libs/prisma-service/prisma/schema.prisma @@ -66,6 +66,7 @@ model session { accountId String? @db.Uuid sessionType String? account account? @relation(fields: [accountId], references:[id]) + expiresAt DateTime? @db.Timestamp(6) } model token { From 7f4071bc18d93c1089cef8192ea431f45c062e5e Mon Sep 17 00:00:00 2001 From: shitrerohit Date: Fri, 29 Aug 2025 20:24:09 +0530 Subject: [PATCH 54/60] Added logs for delete inactive session Signed-off-by: shitrerohit --- apps/user/repositories/user.repository.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/user/repositories/user.repository.ts b/apps/user/repositories/user.repository.ts index 91e444097..7fb743ec9 100644 --- a/apps/user/repositories/user.repository.ts +++ b/apps/user/repositories/user.repository.ts @@ -999,7 +999,7 @@ export class UserRepository { userId } }); - this.logger.debug('Response::', response); + this.logger.debug('Deleted inactive sessions::', response); return response; } catch (error) { this.logger.error(`Error in deleting the in active sessions::${error.message}`); From 055d9bbf8d2053a1e03aafa03f392006b4b5ac85 Mon Sep 17 00:00:00 2001 From: Sahil Kamble Date: Mon, 1 Sep 2025 11:48:19 +0530 Subject: [PATCH 55/60] feat/credo-spinup-script (#1417) * feat: script changes to spinup credo-controller -using docker Signed-off-by: Sahil Kamble * typo error - agent spin-up issue Signed-off-by: Sahil Kamble * removed unwanted values Signed-off-by: Sahil Kamble --------- Signed-off-by: Sahil Kamble --- .env.demo | 2 +- .../AFJ/scripts/docker_start_agent.sh | 18 ++++++++----- .../AFJ/scripts/start_agent.sh | 2 +- .../AFJ/scripts/start_agent_ecs.sh | 27 +++++++++---------- .../src/agent-provisioning.service.ts | 5 ++-- .../src/agent-service.service.ts | 2 +- 6 files changed, 28 insertions(+), 28 deletions(-) diff --git a/.env.demo b/.env.demo index 51e70592b..798d80260 100644 --- a/.env.demo +++ b/.env.demo @@ -110,7 +110,7 @@ KEYCLOAK_MANAGEMENT_CLIENT_ID=adminClient KEYCLOAK_MANAGEMENT_CLIENT_SECRET= KEYCLOAK_REALM=credebl-platform -SCHEMA_FILE_SERVER_URL='https://schema.credebl.id/schemas/' +SCHEMA_FILE_SERVER_URL= SCHEMA_FILE_SERVER_TOKEN= GEO_LOCATION_MASTER_DATA_IMPORT_SCRIPT=/prisma/scripts/geo_location_data_import.sh diff --git a/apps/agent-provisioning/AFJ/scripts/docker_start_agent.sh b/apps/agent-provisioning/AFJ/scripts/docker_start_agent.sh index 291fef3d3..1b1269ab2 100644 --- a/apps/agent-provisioning/AFJ/scripts/docker_start_agent.sh +++ b/apps/agent-provisioning/AFJ/scripts/docker_start_agent.sh @@ -17,6 +17,13 @@ PROTOCOL=${12} TENANT=${13} AFJ_VERSION=${14} INDY_LEDGER=${15} +INBOUND_ENDPOINT=${16} +SCHEMA_FILE_SERVER_URL=${17} +AGENT_API_KEY=${18} +ADMIN_PORT_FILE="$PWD/agent-provisioning/AFJ/port-file/last-admin-port.txt" +INBOUND_PORT_FILE="$PWD/agent-provisioning/AFJ/port-file/last-inbound-port.txt" +ADMIN_PORT=8001 +INBOUND_PORT=9001 echo "AGENCY: $AGENCY" echo "EXTERNAL_IP: $EXTERNAL_IP" @@ -34,11 +41,6 @@ echo "TENANT: $TENANT" echo "AFJ_VERSION: $AFJ_VERSION" echo "INDY_LEDGER: $INDY_LEDGER" -ADMIN_PORT_FILE="$PWD/agent-provisioning/AFJ/port-file/last-admin-port.txt" -INBOUND_PORT_FILE="$PWD/agent-provisioning/AFJ/port-file/last-inbound-port.txt" -ADMIN_PORT=8001 -INBOUND_PORT=9001 - increment_port() { local port="$1" local lower_limit="$2" @@ -144,7 +146,9 @@ cat <${CONFIG_FILE} ], "webhookUrl": "$WEBHOOK_HOST/wh/$AGENCY", "adminPort": $ADMIN_PORT, - "tenancy": $TENANT + "tenancy": $TENANT, + "schemaFileServerURL": "$SCHEMA_FILE_SERVER_URL", + "apiKey": "$AGENT_API_KEY" } EOF @@ -225,7 +229,7 @@ if [ $? -eq 0 ]; then container_logs=$(docker logs $(docker ps -q --filter "name=${AGENCY}_${CONTAINER_NAME}")) # Extract the token from the logs using sed - token=$(echo "$container_logs" | sed -nE 's/.*API Token: ([^ ]+).*/\1/p') + token=$(echo "$container_logs" | sed -nE 's/.*** API Key: ([^ ]+).*/\1/p') # Print the extracted token echo "Token: $token" diff --git a/apps/agent-provisioning/AFJ/scripts/start_agent.sh b/apps/agent-provisioning/AFJ/scripts/start_agent.sh index e46a87073..715a9baa6 100755 --- a/apps/agent-provisioning/AFJ/scripts/start_agent.sh +++ b/apps/agent-provisioning/AFJ/scripts/start_agent.sh @@ -19,7 +19,7 @@ AFJ_VERSION=${14} INDY_LEDGER=${15} INBOUND_ENDPOINT=${16} SCHEMA_FILE_SERVER_URL=${17} -AGENT_API_KEY="${18}" +AGENT_API_KEY=${18} ADMIN_PORT_FILE="$PWD/apps/agent-provisioning/AFJ/port-file/last-admin-port.txt" INBOUND_PORT_FILE="$PWD/apps/agent-provisioning/AFJ/port-file/last-inbound-port.txt" ADMIN_PORT=8001 diff --git a/apps/agent-provisioning/AFJ/scripts/start_agent_ecs.sh b/apps/agent-provisioning/AFJ/scripts/start_agent_ecs.sh index 372552e82..a26a68845 100644 --- a/apps/agent-provisioning/AFJ/scripts/start_agent_ecs.sh +++ b/apps/agent-provisioning/AFJ/scripts/start_agent_ecs.sh @@ -19,11 +19,12 @@ AFJ_VERSION=${14} INDY_LEDGER=${15} INBOUND_ENDPOINT=${16} SCHEMA_FILE_SERVER_URL=${17} -AGENT_HOST=${18} -AWS_ACCOUNT_ID=${19} -S3_BUCKET_ARN=${20} -CLUSTER_NAME=${21} -TESKDEFINITION_FAMILY=${22} +AGENT_API_KEY=${18} +AGENT_HOST=${19} +AWS_ACCOUNT_ID=${20} +S3_BUCKET_ARN=${21} +CLUSTER_NAME=${22} +TASKDEFINITION_FAMILY=${23} DESIRED_COUNT=1 @@ -37,7 +38,7 @@ random_string=$(generate_random_string) # Print the generated random string echo "Random String: $random_string" -SERVICE_NAME="${CONTAINER_NAME}-service-test" +SERVICE_NAME="${CONTAINER_NAME}-service" EXTERNAL_IP=$(echo "$2" | tr -d '[:space:]') ADMIN_PORT_FILE="$PWD/agent-provisioning/AFJ/port-file/last-admin-port.txt" INBOUND_PORT_FILE="$PWD/agent-provisioning/AFJ/port-file/last-inbound-port.txt" @@ -197,9 +198,9 @@ CONTAINER_DEFINITIONS=$( "logConfiguration": { "logDriver": "awslogs", "options": { - "awslogs-group": "/ecs/$TESKDEFINITION_FAMILY", + "awslogs-group": "/ecs/$TASKDEFINITION_FAMILY", "awslogs-create-group": "true", - "awslogs-region": "ap-south-1", + "awslogs-region": "$AWS_PUBLIC_REGION", "awslogs-stream-prefix": "ecs" }, "ulimits": [] @@ -212,7 +213,7 @@ EOF TASK_DEFINITION=$( cat < { await exec(walletProvision, async (err, stdout, stderr) => { this.logger.log(`shell script output: ${stdout}`); diff --git a/apps/agent-service/src/agent-service.service.ts b/apps/agent-service/src/agent-service.service.ts index 5fb66e6e6..c690870f0 100644 --- a/apps/agent-service/src/agent-service.service.ts +++ b/apps/agent-service/src/agent-service.service.ts @@ -527,7 +527,7 @@ export class AgentServiceService { socket.emit('invitation-url-creation-started', { clientId: agentSpinupDto.clientSocketId }); } const agentBaseWalletToken = await this.commonService.getBaseAgentToken( - agentDetails.gentEndPoint, + agentDetails.agentEndPoint, agentDetails?.agentToken ); if (!agentBaseWalletToken) { From 3119cc7450c116186e9d9e506169ee1be9d286ee Mon Sep 17 00:00:00 2001 From: sujitaw Date: Mon, 1 Sep 2025 22:09:27 +0530 Subject: [PATCH 56/60] fix/verify credentials api (#1420) Signed-off-by: sujitaw --- .../agent-service/agent-service.controller.ts | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) 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 6ef12047c..90fbbb68c 100644 --- a/apps/api-gateway/src/agent-service/agent-service.controller.ts +++ b/apps/api-gateway/src/agent-service/agent-service.controller.ts @@ -151,16 +151,16 @@ export class AgentController { summary: 'Validates signed data from agent, including credentials', description: 'Credentials or any other data signed by the organisation is validated' }) - @UseGuards(AuthGuard('jwt'), OrgRolesGuard) - @Roles( - OrgRoles.OWNER, - OrgRoles.ADMIN, - OrgRoles.HOLDER, - OrgRoles.ISSUER, - OrgRoles.SUPER_ADMIN, - OrgRoles.MEMBER, - OrgRoles.VERIFIER - ) + // @UseGuards(AuthGuard('jwt'), OrgRolesGuard) + // @Roles( + // OrgRoles.OWNER, + // OrgRoles.ADMIN, + // OrgRoles.HOLDER, + // OrgRoles.ISSUER, + // OrgRoles.SUPER_ADMIN, + // OrgRoles.MEMBER, + // OrgRoles.VERIFIER + // ) async verifysignature( @Param('orgId') orgId: string, @Body() data: IVerifySignature, From dc24f10c85a5ba09df1521b947a0351afe3c52b2 Mon Sep 17 00:00:00 2001 From: shitrerohit Date: Tue, 2 Sep 2025 16:06:06 +0530 Subject: [PATCH 57/60] fix:sonar cloud related issues Signed-off-by: shitrerohit --- .../src/agent-service.service.ts | 2 +- .../src/authz/guards/session.guard.ts | 10 +---- apps/api-gateway/src/tracer.ts | 26 ++++++------- apps/api-gateway/src/user/utils/index.ts | 2 +- apps/cloud-wallet/src/cloud-wallet.service.ts | 3 +- apps/issuance/src/issuance.service.ts | 2 +- apps/organization/src/organization.service.ts | 38 +++++++++++-------- apps/user/repositories/user.repository.ts | 1 - apps/user/src/user.service.ts | 33 ++++++---------- apps/user/templates/user-email-template.ts | 2 - libs/common/src/interfaces/user.interface.ts | 11 ++++++ libs/logger/src/logger.service.ts | 29 ++++++++------ 12 files changed, 81 insertions(+), 78 deletions(-) diff --git a/apps/agent-service/src/agent-service.service.ts b/apps/agent-service/src/agent-service.service.ts index c690870f0..ffa860199 100644 --- a/apps/agent-service/src/agent-service.service.ts +++ b/apps/agent-service/src/agent-service.service.ts @@ -607,7 +607,7 @@ export class AgentServiceService { /** * Organization storage data */ - const storeOrgAgentData = await this._buildStoreOrgAgentData(payload, `${orgAgentTypeId}`); + const storeOrgAgentData = this._buildStoreOrgAgentData(payload, `${orgAgentTypeId}`); /** * Store org agent details */ diff --git a/apps/api-gateway/src/authz/guards/session.guard.ts b/apps/api-gateway/src/authz/guards/session.guard.ts index fafa1f76e..2a8977bd3 100644 --- a/apps/api-gateway/src/authz/guards/session.guard.ts +++ b/apps/api-gateway/src/authz/guards/session.guard.ts @@ -5,23 +5,15 @@ import { UserRepository } from 'apps/user/repositories/user.repository'; @Injectable() export class SessionGuard implements CanActivate { - constructor(private userRepository: UserRepository) {} + constructor(private readonly userRepository: UserRepository) {} async canActivate(context: ExecutionContext): Promise { const request = context.switchToHttp().getRequest(); const sessionId = request.cookies['session_id']; - - // if (!sessionId) { - // throw new UnauthorizedException('Missing session cookie'); - // } if (sessionId) { const user = await this.userRepository.validateSession(sessionId); request.user = user; } - - // if (!user) { - // throw new UnauthorizedException('Invalid session'); - // } return true; } } diff --git a/apps/api-gateway/src/tracer.ts b/apps/api-gateway/src/tracer.ts index 898c8b228..df848021a 100644 --- a/apps/api-gateway/src/tracer.ts +++ b/apps/api-gateway/src/tracer.ts @@ -2,28 +2,26 @@ // @ts-nocheck TODO: Facing issues with types, need to fix later // tracer.ts import * as dotenv from 'dotenv'; -dotenv.config(); - -import { NodeSDK } from '@opentelemetry/sdk-node'; import * as process from 'process'; -import { HttpInstrumentation } from '@opentelemetry/instrumentation-http'; +import { BatchLogRecordProcessor, LoggerProvider } from '@opentelemetry/sdk-logs'; +import { DiagConsoleLogger, DiagLogLevel, diag } from '@opentelemetry/api'; + import { ExpressInstrumentation } from '@opentelemetry/instrumentation-express'; +import { HttpInstrumentation } from '@opentelemetry/instrumentation-http'; +import type { Logger } from '@opentelemetry/api-logs'; import { NestInstrumentation } from '@opentelemetry/instrumentation-nestjs-core'; - -import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'; +import { NodeSDK } from '@opentelemetry/sdk-node'; import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http'; - -import { resourceFromAttributes } from '@opentelemetry/resources'; +import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'; import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions'; +import { resourceFromAttributes } from '@opentelemetry/resources'; -import { LoggerProvider, BatchLogRecordProcessor } from '@opentelemetry/sdk-logs'; -import { DiagConsoleLogger, DiagLogLevel, diag } from '@opentelemetry/api'; -import type { Logger } from '@opentelemetry/api-logs'; +dotenv.config(); -let otelSDK: NodeSDK | null = null; -let otelLogger: Logger | null = null; -let otelLoggerProviderInstance: LoggerProvider | null = null; +const otelSDK: NodeSDK | null = null; +const otelLogger: Logger | null = null; +const otelLoggerProviderInstance: LoggerProvider | null = null; if ('true' === process.env.IS_ENABLE_OTEL) { diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.INFO); diff --git a/apps/api-gateway/src/user/utils/index.ts b/apps/api-gateway/src/user/utils/index.ts index 0dd9f1da7..68193f49d 100644 --- a/apps/api-gateway/src/user/utils/index.ts +++ b/apps/api-gateway/src/user/utils/index.ts @@ -36,7 +36,7 @@ export async function getCredentialsByAlias(alias: string): Promise CommonConstants.W3C_SCHEMA_URL !== item); const [schemaId] = filterData; if (credentialCreateOfferDetails.response.credentialRequestThId) { diff --git a/apps/organization/src/organization.service.ts b/apps/organization/src/organization.service.ts index 72b0e5926..084475f39 100644 --- a/apps/organization/src/organization.service.ts +++ b/apps/organization/src/organization.service.ts @@ -194,6 +194,25 @@ export class OrganizationService { } } + private async ensureOrganizationExists(orgId: string): Promise { + const organizationExist = await this.organizationRepository.getOrgProfile(orgId); + if (!organizationExist) { + throw new NotFoundException(ResponseMessages.organisation.error.notFound); + } + } + private async ensureNotExistingPrimaryDid(orgId: string, did: string): Promise { + const orgAgentDetails = await this.organizationRepository.getAgentEndPoint(orgId); + if (orgAgentDetails.orgDid === did) { + throw new ConflictException(ResponseMessages.organisation.error.primaryDid); + } + } + private async ensureDidBelongsToOrg(orgId: string, did: string): Promise { + const organizationDidList = await this.organizationRepository.getAllOrganizationDid(orgId); + const isDidMatch = organizationDidList.some((item) => item.did === did); + if (!isDidMatch) { + throw new NotFoundException(ResponseMessages.organisation.error.didNotFound); + } + } /** * * @param registerOrgDto @@ -203,22 +222,11 @@ export class OrganizationService { // eslint-disable-next-line camelcase async setPrimaryDid(orgId: string, did: string, id: string): Promise { try { - const organizationExist = await this.organizationRepository.getOrgProfile(orgId); - if (!organizationExist) { - throw new NotFoundException(ResponseMessages.organisation.error.notFound); - } - const orgAgentDetails = await this.organizationRepository.getAgentEndPoint(orgId); - if (orgAgentDetails.orgDid === did) { - throw new ConflictException(ResponseMessages.organisation.error.primaryDid); - } + await this.ensureOrganizationExists(orgId); + await this.ensureNotExistingPrimaryDid(orgId, did); //check user DID exist in the organization's did list - const organizationDidList = await this.organizationRepository.getAllOrganizationDid(orgId); - const isDidMatch = organizationDidList.some((item) => item.did === did); - - if (!isDidMatch) { - throw new NotFoundException(ResponseMessages.organisation.error.didNotFound); - } + await this.ensureDidBelongsToOrg(orgId, did); const didDetails = await this.organizationRepository.getDidDetailsByDid(did); if (!didDetails) { @@ -1735,7 +1743,7 @@ export class OrganizationService { emailData.emailTo = email; emailData.emailSubject = `Removal of participation of “${orgName}”`; - emailData.emailHtml = await urlEmailTemplate.sendDeleteOrgMemberEmailTemplate(email, orgName, orgRole); + emailData.emailHtml = urlEmailTemplate.sendDeleteOrgMemberEmailTemplate(email, orgName, orgRole); //Email is sent to user for the verification through emailData const isEmailSent = await sendEmail(emailData); diff --git a/apps/user/repositories/user.repository.ts b/apps/user/repositories/user.repository.ts index 7fb743ec9..c20942086 100644 --- a/apps/user/repositories/user.repository.ts +++ b/apps/user/repositories/user.repository.ts @@ -153,7 +153,6 @@ export class UserRepository { where: { id: sessionId }, include: { user: true } }); - // if (!session || new Date() > session.expires) return null; return session; } diff --git a/apps/user/src/user.service.ts b/apps/user/src/user.service.ts index 0237993e6..bbfb7de9c 100644 --- a/apps/user/src/user.service.ts +++ b/apps/user/src/user.service.ts @@ -60,7 +60,8 @@ import { IVerifyUserEmail, IUserInvitations, IResetPasswordResponse, - ISignUpUserResponse + ISignUpUserResponse, + IVerificationEmail } 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'; @@ -149,16 +150,16 @@ export class UserService { throw new NotFoundException(ResponseMessages.user.error.redirectUrlNotFound); } - sendVerificationMail = await this.sendEmailForVerification( + sendVerificationMail = await this.sendEmailForVerification({ email, - verifyCode, + verificationCode: verifyCode, redirectUrl, - clientDetails.clientId, + clientId: clientDetails.clientId, brandLogoUrl, platformName, - clientDetails.domain, + redirectTo: clientDetails.domain, clientAlias - ); + }); } catch (error) { throw new InternalServerErrorException(ResponseMessages.user.error.emailSend); } @@ -207,20 +208,12 @@ export class UserService { * @returns */ - async sendEmailForVerification( - email: string, - verificationCode: string, - redirectUrl: string, - clientId: string, - brandLogoUrl: string, - platformName: string, - redirectTo?: string, - clientAlias?: string - ): Promise { + async sendEmailForVerification(verificationEmailParameter: IVerificationEmail): Promise { try { + const { email, verificationCode, brandLogoUrl, platformName, redirectTo, clientAlias } = + verificationEmailParameter; const platformConfigData = await this.prisma.platform_config.findMany(); - const decryptedClientId = await this.commonService.decryptPassword(clientId); const urlEmailTemplate = new URLUserEmailTemplate(); const emailData = new EmailDto(); emailData.emailFrom = platformConfigData[0].emailFrom; @@ -228,11 +221,9 @@ export class UserService { const platform = platformName || process.env.PLATFORM_NAME; emailData.emailSubject = `[${platform}] Verify your email to activate your account`; - emailData.emailHtml = await urlEmailTemplate.getUserURLTemplate( + emailData.emailHtml = urlEmailTemplate.getUserURLTemplate( email, verificationCode, - redirectUrl, - decryptedClientId, brandLogoUrl, platformName, redirectTo, @@ -662,7 +653,7 @@ export class UserService { const platform = platformName || process.env.PLATFORM_NAME; emailData.emailSubject = `[${platform}] Important: Password Reset Request`; - emailData.emailHtml = await urlEmailTemplate.getUserResetPasswordTemplate( + emailData.emailHtml = urlEmailTemplate.getUserResetPasswordTemplate( email, platform, brandLogoUrl, diff --git a/apps/user/templates/user-email-template.ts b/apps/user/templates/user-email-template.ts index 21318eb85..bed2befb6 100644 --- a/apps/user/templates/user-email-template.ts +++ b/apps/user/templates/user-email-template.ts @@ -2,8 +2,6 @@ export class URLUserEmailTemplate { public getUserURLTemplate( email: string, verificationCode: string, - redirectUrl: string, - clientId: string, brandLogoUrl: string, platformName: string, redirectTo?: string, diff --git a/libs/common/src/interfaces/user.interface.ts b/libs/common/src/interfaces/user.interface.ts index 041458bff..54ab6f7fc 100644 --- a/libs/common/src/interfaces/user.interface.ts +++ b/libs/common/src/interfaces/user.interface.ts @@ -68,3 +68,14 @@ export interface IClientAliases { clientAlias: string; clientUrl: string; } + +export interface IVerificationEmail { + email: string; + verificationCode: string; + redirectUrl: string; + clientId: string; + brandLogoUrl: string; + platformName: string; + redirectTo?: string; + clientAlias?: string; +} diff --git a/libs/logger/src/logger.service.ts b/libs/logger/src/logger.service.ts index ca92fd1f6..c2cec419c 100644 --- a/libs/logger/src/logger.service.ts +++ b/libs/logger/src/logger.service.ts @@ -85,18 +85,23 @@ export default class LoggerService implements Logger { }; if (data?.error) { - attributes.error = - 'string' === typeof data.error - ? data.error - : data.error instanceof Error - ? { - name: data.error.name, - message: data.error.message, - stack: data.error.stack - } - : 'object' === typeof data.error - ? JSON.parse(JSON.stringify(data.error)) - : String(data.error); + let errorValue; + + if ('string' === typeof data.error) { + errorValue = data.error; + } else if (data.error instanceof Error) { + errorValue = { + name: data.error.name, + message: data.error.message, + stack: data.error.stack + }; + } else if ('object' === typeof data.error) { + errorValue = JSON.parse(JSON.stringify(data.error)); + } else { + errorValue = String(data.error); + } + + attributes.error = errorValue; } otelLogger.emit({ From a91f3e620e3feabae644c928f7234bccd1521784 Mon Sep 17 00:00:00 2001 From: shitrerohit Date: Tue, 2 Sep 2025 19:06:04 +0530 Subject: [PATCH 58/60] fix:removed sonar cloud issue related changes Signed-off-by: shitrerohit --- apps/api-gateway/src/tracer.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/api-gateway/src/tracer.ts b/apps/api-gateway/src/tracer.ts index df848021a..a6ba3a586 100644 --- a/apps/api-gateway/src/tracer.ts +++ b/apps/api-gateway/src/tracer.ts @@ -19,9 +19,9 @@ import { resourceFromAttributes } from '@opentelemetry/resources'; dotenv.config(); -const otelSDK: NodeSDK | null = null; -const otelLogger: Logger | null = null; -const otelLoggerProviderInstance: LoggerProvider | null = null; +let otelSDK: NodeSDK | null = null; +let otelLogger: Logger | null = null; +let otelLoggerProviderInstance: LoggerProvider | null = null; if ('true' === process.env.IS_ENABLE_OTEL) { diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.INFO); From 47034921e364b2e462daa012c9ff11004d5cc930 Mon Sep 17 00:00:00 2001 From: shitrerohit Date: Tue, 2 Sep 2025 22:26:27 +0530 Subject: [PATCH 59/60] fix:sonar cloud issues Signed-off-by: shitrerohit --- apps/issuance/src/issuance.repository.ts | 8 ++++---- apps/user/src/user.service.ts | 6 +----- .../src/repositories/verification.repository.ts | 4 ++-- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/apps/issuance/src/issuance.repository.ts b/apps/issuance/src/issuance.repository.ts index a18635224..8fa95635a 100644 --- a/apps/issuance/src/issuance.repository.ts +++ b/apps/issuance/src/issuance.repository.ts @@ -9,9 +9,10 @@ import { PreviewRequest, SchemaDetails } from '../interfaces/issuance.interfaces'; -import { PrismaTables, SortValue } from '@credebl/enum/enum'; +import { IssueCredentials, IssuedCredentialStatus } from '../enum/issuance.enum'; // eslint-disable-next-line camelcase import { + Prisma, agent_invitations, credentials, file_data, @@ -19,9 +20,9 @@ import { org_agents, organisation, platform_config, - Prisma, schema } from '@prisma/client'; +import { PrismaTables, SortValue } from '@credebl/enum/enum'; import { FileUploadStatus } from 'apps/api-gateway/src/enum'; import { IDeletedIssuanceRecords } from '@credebl/common/interfaces/issuance.interface'; @@ -29,7 +30,6 @@ import { IIssuedCredentialSearchParams } from 'apps/api-gateway/src/issuance/int import { IUserRequest } from '@credebl/user-request/user-request.interface'; import { PrismaService } from '@credebl/prisma-service'; import { ResponseMessages } from '@credebl/common/response-messages'; -import { IssueCredentials, IssuedCredentialStatus } from '../enum/issuance.enum'; @Injectable() export class IssuanceRepository { @@ -164,7 +164,7 @@ export class IssuanceRepository { break; default: - stateInfo = null; + break; } const issuanceWhereClause: Prisma.credentialsWhereInput = { diff --git a/apps/user/src/user.service.ts b/apps/user/src/user.service.ts index bbfb7de9c..c0ddbfc29 100644 --- a/apps/user/src/user.service.ts +++ b/apps/user/src/user.service.ts @@ -770,11 +770,7 @@ export class UserService { ); if (userData.keycloakUserId) { - keycloakDetails = await this.clientRegistrationService.resetPasswordOfUser( - userData, - process.env.KEYCLOAK_REALM, - token - ); + await this.clientRegistrationService.resetPasswordOfUser(userData, process.env.KEYCLOAK_REALM, token); await this.updateFidoVerifiedUser(email.toLowerCase(), userData.isFidoVerified, newPassword); } else { keycloakDetails = await this.clientRegistrationService.createUser( diff --git a/apps/verification/src/repositories/verification.repository.ts b/apps/verification/src/repositories/verification.repository.ts index ded0a3b0e..61ae918b3 100644 --- a/apps/verification/src/repositories/verification.repository.ts +++ b/apps/verification/src/repositories/verification.repository.ts @@ -8,7 +8,7 @@ import { import { IProofPresentationsListCount, IVerificationRecords } from '@credebl/common/interfaces/verification.interface'; import { Injectable, Logger, NotFoundException } from '@nestjs/common'; // eslint-disable-next-line camelcase -import { agent_invitations, org_agents, organisation, platform_config, presentations, Prisma } from '@prisma/client'; +import { Prisma, agent_invitations, org_agents, organisation, platform_config, presentations } from '@prisma/client'; import { CommonService } from '@credebl/common'; import { IUserRequest } from '@credebl/user-request/user-request.interface'; @@ -112,7 +112,7 @@ export class VerificationRepository { verificationStateInfo = ProofRequest.presentationReceived; break; default: - verificationStateInfo = null; + break; } const whereClause: Prisma.presentationsWhereInput = { From c43f3c2856dbaa73957b708085c4309f046869ed Mon Sep 17 00:00:00 2001 From: Sahil Kamble Date: Mon, 8 Sep 2025 15:28:44 +0530 Subject: [PATCH 60/60] feat/credo-spinup-script (#1427) * fix:credo-controller service spin up ECS ec2 Signed-off-by: Sahil Kamble * WIP: invalid json issue for ecs.sh Signed-off-by: Sahil Kamble * WIP: testing changes ecs.sh Signed-off-by: Sahil Kamble * WIP: add efs to ecs.sh credo-spin-up script Signed-off-by: Sahil Kamble * WIP: typo error Signed-off-by: Sahil Kamble * WIP: typo error Signed-off-by: Sahil Kamble * WIP: token extraction in ecs.sh Signed-off-by: Sahil Kamble * update fargate.sh-credo spin up script Signed-off-by: Sahil Kamble * fix: fargate.sh volume issue Signed-off-by: Sahil Kamble * WIP fargate.sh issue Signed-off-by: Sahil Kamble * WIP fargate.sh image issue Signed-off-by: Sahil Kamble * added ARM arch to fargate.sh Signed-off-by: Sahil Kamble * WIP inbound endpoint Signed-off-by: Sahil Kamble * WIP fixed agent endpoint saved at end Signed-off-by: Sahil Kamble * fix: fargate.sh inbound port to number from string Signed-off-by: Sahil Kamble --------- Signed-off-by: Sahil Kamble --- Dockerfiles/Dockerfile.agent-provisioning | 2 + .../agent-provisioning/AFJ/scripts/fargate.sh | 494 +++++------------- .../AFJ/scripts/start_agent_ecs.sh | 142 +++-- .../src/agent-provisioning.service.ts | 2 +- 4 files changed, 221 insertions(+), 419 deletions(-) diff --git a/Dockerfiles/Dockerfile.agent-provisioning b/Dockerfiles/Dockerfile.agent-provisioning index 4b827611b..3df1af321 100644 --- a/Dockerfiles/Dockerfile.agent-provisioning +++ b/Dockerfiles/Dockerfile.agent-provisioning @@ -9,6 +9,7 @@ RUN set -eux \ aws-cli \ docker \ docker-compose \ + jq \ && npm install -g pnpm --ignore-scripts \ && export PATH=$PATH:/usr/lib/node_modules/pnpm/bin \ && rm -rf /var/cache/apk/* @@ -46,6 +47,7 @@ RUN set -eux \ aws-cli \ docker \ docker-compose \ + jq \ && npm install -g pnpm --ignore-scripts \ && export PATH=$PATH:/usr/lib/node_modules/pnpm/bin \ && rm -rf /var/cache/apk/* diff --git a/apps/agent-provisioning/AFJ/scripts/fargate.sh b/apps/agent-provisioning/AFJ/scripts/fargate.sh index 6c43ca208..bb8ea9b66 100644 --- a/apps/agent-provisioning/AFJ/scripts/fargate.sh +++ b/apps/agent-provisioning/AFJ/scripts/fargate.sh @@ -1,4 +1,3 @@ - #!/bin/sh START_TIME=$(date +%s) @@ -19,62 +18,17 @@ TENANT=${13} AFJ_VERSION=${14} INDY_LEDGER=${15} INBOUND_ENDPOINT=${16} -AWS_ACCOUNT_ID=${17} -S3_BUCKET_ARN=${18} -CLUSTER_NAME=${19} -FILESYSTEMID=${20} -ACCESSPOINTID=${21} -VPC_ID=${22} -ECS_SUBNET_ID=${23} -ALB_SUBNET_ID_ONE=${24} -ALB_SUBNET_ID_TWO=${25} -EFS_SECURITY_GROUP_ID=${26} -AWS_PUBLIC_REGION=${27} -STAGE=${28} -AGENT_WEBSOCKET_PROTOCOL=${29} -DB_SECURITY_GROUP_ID=${30} -TESKDEFINITION_FAMILY="${STAGE}_${CONTAINER_NAME}_TASKDEFITION" - - -echo "START_TIME: $START_TIME" -echo "AGENCY: $AGENCY" -echo "EXTERNAL_IP: $EXTERNAL_IP" -echo "WALLET_NAME: $WALLET_NAME" -echo "WALLET_PASSWORD: $WALLET_PASSWORD" -echo "RANDOM_SEED: $RANDOM_SEED" -echo "WEBHOOK_HOST: $WEBHOOK_HOST" -echo "WALLET_STORAGE_HOST: $WALLET_STORAGE_HOST" -echo "WALLET_STORAGE_PORT: $WALLET_STORAGE_PORT" -echo "WALLET_STORAGE_USER: $WALLET_STORAGE_USER" -echo "WALLET_STORAGE_PASSWORD: $WALLET_STORAGE_PASSWORD" -echo "CONTAINER_NAME: $CONTAINER_NAME" -echo "PROTOCOL: $PROTOCOL" -echo "TENANT: $TENANT" -echo "AFJ_VERSION: $AFJ_VERSION" -echo "INDY_LEDGER: $INDY_LEDGER" -echo "INBOUND_ENDPOINT: $INBOUND_ENDPOINT" -echo "AWS_ACCOUNT_ID: $AWS_ACCOUNT_ID" -echo "S3_BUCKET_ARN: $S3_BUCKET_ARN" -echo "CLUSTER_NAME: $CLUSTER_NAME" -echo "TESKDEFINITION_FAMILY: $TESKDEFINITION_FAMILY" -echo "FILESYSTEMID: $FILESYSTEMID" -echo "ACCESSPOINTID: $ACCESSPOINTID" -echo "VPC_ID: $VPC_ID" -echo "ECS_SUBNET_ID: $ECS_SUBNET_ID" -echo "ALB_SUBNET_ID_ONE: $ALB_SUBNET_ID_ONE" -echo "ALB_SUBNET_ID_TWO: $ALB_SUBNET_ID_TWO" -echo "SSL_CRTS: $SSL_CRTS" -echo "EFS_SECURITY_GROUP_ID: $EFS_SECURITY_GROUP_ID" -echo "AGENT_URL: $AGENT_URL" -echo "AWS_PUBLIC_REGION: $AWS_PUBLIC_REGION" -echo "STAGE: $STAGE" -echo "AGENT_WEBSOCKET_PROTOCOL: $AGENT_WEBSOCKET_PROTOCOL" -echo "ALB_SECURITY_GROUP_ID: $ALB_SECURITY_GROUP_ID" -echo "ADMIN_TG_ARN: $ADMIN_TG_ARN" -echo "INBOUND_TG_ARN: $INBOUND_TG_ARN" -echo "AGENT_INBOUND_URL: $AGENT_INBOUND_URL" -echo "DB_SECURITY_GROUP_ID: $DB_SECURITY_GROUP_ID" - +SCHEMA_FILE_SERVER_URL=${17} +AGENT_API_KEY=${18} +AWS_ACCOUNT_ID=${19} +S3_BUCKET_ARN=${20} +CLUSTER_NAME=${21} +TASKDEFINITION_FAMILY=${22} +ADMIN_TG_ARN=${23} +INBOUND_TG_ARN=${24} +FILESYSTEMID=${25} +ECS_SUBNET_ID=${26} +ECS_SECURITY_GROUP_ID=${27} DESIRED_COUNT=1 @@ -88,12 +42,10 @@ random_string=$(generate_random_string) # Print the generated random string echo "Random String: $random_string" -SERVICE_NAME="${AGENCY}-${CONTAINER_NAME}-service-${random_string}" +SERVICE_NAME="${CONTAINER_NAME}-service" EXTERNAL_IP=$(echo "$2" | tr -d '[:space:]') ADMIN_PORT_FILE="$PWD/agent-provisioning/AFJ/port-file/last-admin-port.txt" INBOUND_PORT_FILE="$PWD/agent-provisioning/AFJ/port-file/last-inbound-port.txt" -echo "AGENCY: $SERVICE_NAME" -echo "EXTERNAL_IP: $EXTERNAL_IP" ADMIN_PORT=8001 INBOUND_PORT=9001 @@ -144,209 +96,24 @@ echo "Last used admin port: $ADMIN_PORT" echo "Last used inbound port: $INBOUND_PORT" echo "AGENT SPIN-UP STARTED" +# Define a regular expression pattern for IP address +IP_REGEX="^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$" -#CLUSTER_NAME=$(aws ecs create-cluster --cluster-name ${CONTAINER_NAME}) - -# Create security groups -ALB_SECURITY_GROUP_ID=$(aws ec2 create-security-group --group-name "${STAGE}-${AGENCY}-${random_string}-alb-sg" --description "Security group for ALB" --vpc-id $VPC_ID --output text) -ECS_SECURITY_GROUP_ID=$(aws ec2 create-security-group --group-name "${STAGE}-${AGENCY}-${random_string}-ecs-sg" --description "Security group for ECS Fargate service" --vpc-id $VPC_ID --output text) - -echo "ALB_SECURITY_GROUP_ID:$ALB_SECURITY_GROUP_ID" -echo "ECS_SECURITY_GROUP_ID:$ECS_SECURITY_GROUP_ID" -echo "EFS_SECURITY_GROUP_ID:$SECURITY_GROUP_ID" - -# Allow inbound traffic from the ECS Fargate security group to the EFS security group on NFS port -aws ec2 authorize-security-group-ingress \ - --group-id "$EFS_SECURITY_GROUP_ID" \ - --protocol tcp \ - --port 2049 \ - --source-group "$ECS_SECURITY_GROUP_ID" \ - --tag-specifications "ResourceType=security-group-rule,Tags=[{Key=Name,Value=${STAGE}-${AGENCY}-${CONTAINER_NAME}-allow},{Key=ENV,Value=test}]" \ - --region $AWS_PUBLIC_REGION - -# Authorize inbound traffic for ALB security group from ECS security group -aws ec2 authorize-security-group-ingress \ - --group-id "$ECS_SECURITY_GROUP_ID" \ - --protocol tcp \ - --port "$ADMIN_PORT" \ - --source-group "$ALB_SECURITY_GROUP_ID" \ - --tag-specifications "ResourceType=security-group-rule,Tags=[{Key=Name,Value=${STAGE}-${AGENCY}-${CONTAINER_NAME}-alb-sg},{Key=ENV,Value=test}]" \ - --region $AWS_PUBLIC_REGION - - -# Authorize outbound traffic for ALB security group from ECS security group -aws ec2 authorize-security-group-egress \ - --group-id "$ECS_SECURITY_GROUP_ID" \ - --protocol tcp \ - --port "$ADMIN_PORT" \ - --source-group "$ALB_SECURITY_GROUP_ID" \ - --tag-specifications "ResourceType=security-group-rule,Tags=[{Key=Name,Value=${STAGE}-${AGENCY}-${CONTAINER_NAME}-alb-sg},{Key=ENV,Value=test}]" \ - --region $AWS_PUBLIC_REGION - - -# Authorize inbound traffic for ALB security group from ECS security group -aws ec2 authorize-security-group-ingress \ - --group-id "$ECS_SECURITY_GROUP_ID" \ - --protocol tcp \ - --port "$INBOUND_PORT" \ - --source-group "$ALB_SECURITY_GROUP_ID" \ - --tag-specifications "ResourceType=security-group-rule,Tags=[{Key=Name,Value=${STAGE}-${AGENCY}-${CONTAINER_NAME}-alb-sg},{Key=ENV,Value=test}]" \ - --region $AWS_PUBLIC_REGION - -# Authorize outbound traffic for ALB security group from ECS security group -aws ec2 authorize-security-group-egress \ - --group-id "$ECS_SECURITY_GROUP_ID" \ - --protocol tcp \ - --port "$INBOUND_PORT" \ - --source-group "$ALB_SECURITY_GROUP_ID" \ - --tag-specifications "ResourceType=security-group-rule,Tags=[{Key=Name,Value=${STAGE}-${AGENCY}-${CONTAINER_NAME}-alb-sg},{Key=ENV,Value=test}]" \ - --region $AWS_PUBLIC_REGION - -# Authorize inbound traffic for ECS security group from DB security group -aws ec2 authorize-security-group-ingress \ - --group-id "$DB_SECURITY_GROUP_ID" \ - --protocol tcp \ - --port "$WALLET_STORAGE_PORT" \ - --source-group "$ECS_SECURITY_GROUP_ID" \ - --tag-specifications "ResourceType=security-group-rule,Tags=[{Key=Name,Value=${STAGE}-${AGENCY}-${CONTAINER_NAME}-ecs-sg},{Key=ENV,Value=test}]" \ - --region $AWS_PUBLIC_REGION - -# Authorize outbound traffic for ECS security group from DB security group -aws ec2 authorize-security-group-egress \ - --group-id "$DB_SECURITY_GROUP_ID" \ - --protocol tcp \ - --port "$WALLET_STORAGE_PORT" \ - --source-group "$ECS_SECURITY_GROUP_ID" \ - --tag-specifications "ResourceType=security-group-rule,Tags=[{Key=Name,Value=${STAGE}-${AGENCY}-${CONTAINER_NAME}-ecs-sg},{Key=ENV,Value=test}]" \ - --region $AWS_PUBLIC_REGION - -# Authorize inbound traffic for ALB security group from ECS security group -aws ec2 authorize-security-group-ingress \ - --group-id "$ALB_SECURITY_GROUP_ID" \ - --ip-permissions IpProtocol=tcp,FromPort=443,ToPort=443,IpRanges='[{CidrIp=0.0.0.0/0,Description="Allowing 0.0.0.0/0 to the LB port"}]' \ - --tag-specifications "ResourceType=security-group-rule,Tags=[{Key=Name,Value=allow-the-world}]" \ - --region $AWS_PUBLIC_REGION - -# Authorize outbound traffic for ALB security group from ECS security group -aws ec2 authorize-security-group-egress \ - --group-id "$ALB_SECURITY_GROUP_ID" \ - --protocol tcp \ - --port "$ADMIN_PORT" \ - --source-group "$ECS_SECURITY_GROUP_ID" \ - --tag-specifications "ResourceType=security-group-rule,Tags=[{Key=Name,Value=${STAGE}-${AGENCY}-${CONTAINER_NAME}-adminalb-sg},{Key=ENV,Value=test}]" \ - --region $AWS_PUBLIC_REGION - -# Authorize inbound traffic for ALB security group from ECS security group -aws ec2 authorize-security-group-ingress \ - --group-id "$ALB_SECURITY_GROUP_ID" \ - --ip-permissions IpProtocol=tcp,FromPort=80,ToPort=80,IpRanges='[{CidrIp=0.0.0.0/0,Description="Allowing 0.0.0.0/0 to the LB port"}]' \ - --tag-specifications "ResourceType=security-group-rule,Tags=[{Key=Name,Value=allow-the-world}]" \ - --region $AWS_PUBLIC_REGION - -# Authorize outbound traffic of ALB security group for ECS security group -aws ec2 authorize-security-group-egress \ - --group-id "$ALB_SECURITY_GROUP_ID" \ - --protocol tcp \ - --port "$INBOUND_PORT" \ - --source-group "$ECS_SECURITY_GROUP_ID" \ - --tag-specifications "ResourceType=security-group-rule,Tags=[{Key=Name,Value=${STAGE}-${AGENCY}-${CONTAINER_NAME}-inboundalb-sg},{Key=ENV,Value=test}]" \ - --region $AWS_PUBLIC_REGION - - -# Create Target Groups for admin port -ADMIN_TG_ARN=$(aws elbv2 create-target-group \ - --name "${STAGE}-${ADMIN_PORT}-tg" \ - --protocol HTTP \ - --port 80 \ - --target-type ip \ - --vpc-id $VPC_ID \ - --health-check-protocol HTTP \ - --health-check-port $ADMIN_PORT \ - --health-check-path /agent \ - --health-check-interval-seconds 120 \ - --query 'TargetGroups[0].TargetGroupArn' \ - --output text) - - -echo "admin-tg-arm: $ADMIN_TG_ARN" - -# Create Target Groups for inbound port -INBOUND_TG_ARN=$(aws elbv2 create-target-group --name "${STAGE}-${INBOUND_PORT}-tg" --protocol HTTP --port 80 --target-type ip --vpc-id $VPC_ID --query 'TargetGroups[0].TargetGroupArn' --output text) - -echo "admin-tg-arm: $INBOUND_TG_ARN" - - -# Create Application Load Balancer -ADMIN_ALB_ARN=$(aws elbv2 create-load-balancer \ ---name $STAGE-$CONTAINER_NAME-${ADMIN_PORT}-alb \ ---subnets $ALB_SUBNET_ID_ONE $ALB_SUBNET_ID_TWO \ ---tags "[{\"Key\":\"Name\", \"Value\":\"${CONTAINER_NAME}-alb\"}]" \ ---type application \ ---scheme internet-facing \ ---security-groups $ALB_SECURITY_GROUP_ID \ ---region $AWS_PUBLIC_REGION \ ---query "LoadBalancers[0].LoadBalancerArn" \ ---output text) - -# Describe the ALB to retrieve its DNS name -ADMIN_ALB_DNS=$(aws elbv2 describe-load-balancers \ ---load-balancer-arns $ADMIN_ALB_ARN \ ---query "LoadBalancers[0].DNSName" \ ---output text) - -echo "ALB DNS: $ADMIN_ALB_DNS" - -# Create HTTP listener -aws elbv2 create-listener \ - --load-balancer-arn "$ADMIN_ALB_ARN" \ - --protocol HTTP \ - --port 80 \ - --default-actions Type=forward,TargetGroupArn="$ADMIN_TG_ARN" \ - --region "$AWS_PUBLIC_REGION" - - - -# Create Application Load Balancer -INBOUND_ALB_ARN=$(aws elbv2 create-load-balancer \ ---name $STAGE-$CONTAINER_NAME-${INBOUND_PORT}-alb \ ---subnets $ALB_SUBNET_ID_ONE $ALB_SUBNET_ID_TWO \ ---tags "[{\"Key\":\"Name\", \"Value\":\"${CONTAINER_NAME}-alb\"}]" \ ---type application \ ---scheme internet-facing \ ---security-groups $ALB_SECURITY_GROUP_ID \ ---region $AWS_PUBLIC_REGION \ ---query "LoadBalancers[0].LoadBalancerArn" \ ---output text) - -# Describe the ALB to retrieve its DNS name -INBOUND_ALB_DNS=$(aws elbv2 describe-load-balancers \ ---load-balancer-arns $INBOUND_ALB_ARN \ ---query "LoadBalancers[0].DNSName" \ ---output text) - -echo "INBOUND_ALB DNS: $INBOUND_ALB_DNS" - -#add listner to inbound -aws elbv2 create-listener \ - --load-balancer-arn $INBOUND_ALB_ARN \ - --protocol HTTP \ - --port 80 \ - --default-actions Type=forward,TargetGroupArn=$INBOUND_TG_ARN \ - --region $AWS_PUBLIC_REGION - - -# modify health check of inboud tg -aws elbv2 modify-target-group \ - --target-group-arn $INBOUND_TG_ARN \ - --health-check-protocol HTTP \ - --health-check-port "traffic-port" \ - --health-check-path "/" \ - --health-check-interval-seconds 30 \ - --healthy-threshold-count 3 \ - --unhealthy-threshold-count 3 \ - --matcher "HttpCode=404" \ - --region $AWS_PUBLIC_REGION - +# Check if INBOUND_ENDPOINT is a domain or IP address +if [[ $INBOUND_ENDPOINT =~ ^https?://[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; then + echo "INBOUND_ENDPOINT is a domain: $INBOUND_ENDPOINT" + # Extracting the domain name without the protocol + AGENT_ENDPOINT=$(echo "$INBOUND_ENDPOINT" | sed 's/^https\?:\/\///') +else + # Check if the input is an IP address + if [[ $INBOUND_ENDPOINT =~ $IP_REGEX ]]; then + echo "INBOUND_ENDPOINT is an IP address: $INBOUND_ENDPOINT" + # Adding the protocol to the IP address + AGENT_ENDPOINT="${PROTOCOL}://${INBOUND_ENDPOINT}:${INBOUND_PORT}" + else + echo "Invalid input for INBOUND_ENDPOINT: $INBOUND_ENDPOINT" + fi +fi # Generate the agent config JSON cat <$PWD/agent-provisioning/AFJ/agent-config/${AGENCY}_${CONTAINER_NAME}.json @@ -363,7 +130,7 @@ cat <$PWD/agent-provisioning/AFJ/agent-config/${AGENCY}_${CONTAINER_NAME}. "walletScheme": "DatabasePerWallet", "indyLedger": $INDY_LEDGER, "endpoint": [ - "http://$INBOUND_ALB_DNS" + "$INBOUND_ENDPOINT" ], "autoAcceptConnections": true, "autoAcceptCredentials": "contentApproved", @@ -371,16 +138,18 @@ cat <$PWD/agent-provisioning/AFJ/agent-config/${AGENCY}_${CONTAINER_NAME}. "logLevel": 5, "inboundTransport": [ { - "transport": "$AGENT_WEBSOCKET_PROTOCOL", - "port": "$INBOUND_PORT" + "transport": "$PROTOCOL", + "port": $INBOUND_PORT } ], "outboundTransport": [ - "$AGENT_WEBSOCKET_PROTOCOL" + "$PROTOCOL" ], "webhookUrl": "$WEBHOOK_HOST/wh/$AGENCY", "adminPort": $ADMIN_PORT, - "tenancy": $TENANT + "tenancy": $TENANT, + "schemaFileServerURL": "$SCHEMA_FILE_SERVER_URL", + "apiKey": "$AGENT_API_KEY" } EOF @@ -390,9 +159,9 @@ CONTAINER_DEFINITIONS=$( [ { "name": "$CONTAINER_NAME", - "image": "${AFJ_IMAGE_URL}", - "cpu": 256, - "memory": 512, + "image": "${AFJ_VERSION}", + "cpu": 307, + "memory": 358, "portMappings": [ { "containerPort": $ADMIN_PORT, @@ -425,7 +194,7 @@ CONTAINER_DEFINITIONS=$( ], "mountPoints": [ { - "sourceVolume": "AGENT-CONFIG", + "sourceVolume": "config", "containerPath": "/config", "readOnly": true } @@ -434,16 +203,16 @@ CONTAINER_DEFINITIONS=$( "volumesFrom": [], "ulimits": [], "logConfiguration": { - "logDriver": "awslogs", - "options": { - "awslogs-create-group": "true", - "awslogs-group": "/ecs/$TESKDEFINITION_FAMILY", - "awslogs-region": "$AWS_PUBLIC_REGION", - "awslogs-stream-prefix": "ecs" - }, - "secretOptions": [] - } - } + "logDriver": "awslogs", + "options": { + "awslogs-create-group": "true", + "awslogs-group": "/ecs/$TASKDEFINITION_FAMILY", + "awslogs-region": "$AWS_PUBLIC_REGION", + "awslogs-stream-prefix": "ecs" +} + }, + "ulimits": [] +} ] EOF ) @@ -451,28 +220,27 @@ EOF # Define the task definition JSON TASK_DEFINITION=$(cat < task_definition.json TASK_DEFINITION_ARN=$(aws ecs register-task-definition --cli-input-json file://task_definition.json --query 'taskDefinition.taskDefinitionArn' --output text) -SERVICE=$(cat < service.json +echo "$SERVICE_JSON" > service.json # Check if the service file was created successfully -if [ -f "$SERVICE_FILE" ]; then - echo "Service file created successfully: $SERVICE_FILE" +if [ -f "service.json" ]; then + echo "Service file created successfully: service.json" else - echo "Failed to create service file: $SERVICE_FILE" + echo "Failed to create service file: service.json" fi # Create the service aws ecs create-service \ ---service-name $SERVICE_NAME \ ---cli-input-json file://service.json \ ---region $AWS_PUBLIC_REGION + --cli-input-json file://service.json \ + --region $AWS_PUBLIC_REGION # Describe the ECS service and filter by service name service_description=$(aws ecs describe-services --service $SERVICE_NAME --cluster $CLUSTER_NAME --region $AWS_PUBLIC_REGION) @@ -552,26 +312,28 @@ else exit 1 fi -# Wait for the agent to become ready -# You may need to adjust the number of attempts and sleep time according to your requirements -n=0 -max_attempts=15 -sleep_time=10 -AGENT_HEALTHCHECK_URL="http://$ADMIN_ALB_DNS/agent" -echo "--------AGENT_HEALTHCHECK_URL-----$AGENT_URL" -until [ "$n" -ge "$max_attempts" ]; do - agentResponse=$(curl -s -o /dev/null -w "%{http_code}" "$AGENT_HEALTHCHECK_URL") - if [ "$agentResponse" = "200" ]; then - echo "Agent is running" - break - else +if [ $? -eq 0 ]; then + + n=0 + until [ "$n" -ge 6 ]; do + if netstat -tln | grep ${ADMIN_PORT} >/dev/null; then + + AGENTURL="http://${EXTERNAL_IP}:${ADMIN_PORT}/agent" + agentResponse=$(curl -s -o /dev/null -w "%{http_code}" $AGENTURL) + + if [ "$agentResponse" = "200" ]; then + echo "Agent is running" && break + else echo "Agent is not running" n=$((n + 1)) - sleep "$sleep_time" + sleep 10 + fi + else + echo "No response from agent" + n=$((n + 1)) + sleep 10 fi -done - - + done # Describe the ECS service and filter by service name service_description=$(aws ecs describe-services --service $SERVICE_NAME --cluster $CLUSTER_NAME --region $AWS_PUBLIC_REGION) @@ -579,12 +341,16 @@ echo "service_description=$service_description" # Extract Task ID from the service description events -task_id=$(echo "$service_description" | jq -r '.services[0].events[] | select(.message | test("has started 1 tasks")) | .message | capture("\\(task (?[^)]+)\\)") | .id') -#echo "task_id=$task_id" +task_id=$(echo "$service_description" | jq -r ' + .services[0].events[] + | select(.message | test("has started 1 tasks")) + | .message + | capture("\\(task (?[^)]+)\\)") + | .id +') # to fetch log group of container -............................................................. -log_group=/ecs/$TESKDEFINITION_FAMILY +log_group=/ecs/$TASKDEFINITION_FAMILY echo "log_group=$log_group" # Get Log Stream Name @@ -592,10 +358,6 @@ log_stream=ecs/$CONTAINER_NAME/$task_id echo "logstrem=$log_stream" - -# Fetch logs -#echo "$(aws logs get-log-events --log-group-name "/ecs/$TESKDEFINITION_FAMILY/$CONTAINER_NAME" --log-stream-name "$log_stream" --region $AWS_PUBLIC_REGION)" - # Check if the token folder exists, and create it if it doesn't token_folder="$PWD/agent-provisioning/AFJ/token" if [ ! -d "$token_folder" ]; then @@ -605,7 +367,6 @@ fi # Set maximum retry attempts RETRIES=3 -# Loop to attempt retrieving token from logs # Loop to attempt retrieving token from logs for attempt in $(seq 1 $RETRIES); do echo "Attempt $attempt: Checking service logs for token..." @@ -614,9 +375,13 @@ for attempt in $(seq 1 $RETRIES); do token=$(aws logs get-log-events \ --log-group-name "$log_group" \ --log-stream-name "$log_stream" \ - --region ap-southeast-1 \ - | grep -o 'API Token: [^ ]*' \ - | cut -d ' ' -f 3 + --region $AWS_PUBLIC_REGION \ + --query 'events[*].message' \ + --output text \ + | tr -d '\033' \ + | grep 'API Key:' \ + | sed -E 's/.*API Key:[[:space:]]*([a-zA-Z0-9._:-]*).*/\1/' \ + | head -n 1 ) # echo "token=$token" if [ -n "$token" ]; then @@ -634,44 +399,23 @@ for attempt in $(seq 1 $RETRIES); do sleep 10 done + echo "Creating agent config" + cat <${PWD}/agent-provisioning/AFJ/endpoints/${AGENCY}_${CONTAINER_NAME}.json + { + "CONTROLLER_ENDPOINT":"$EXTERNAL_IP" + } +EOF -# Print variable values for debugging -echo "AGENCY: $AGENCY" -echo "CONTAINER_NAME: $CONTAINER_NAME" -echo "AGENT_URL: $AGENT_URL" -echo "AGENT_INBOUND_URL: $AGENT_INBOUND_URL" - -## Construct file path for agent config -config_file="${PWD}/agent-provisioning/AFJ/endpoints/${AGENCY}_${CONTAINER_NAME}.json" - -# Check if the directory exists and create it if it doesn't -config_dir=$(dirname "$config_file") -if [ ! -d "$config_dir" ]; then - mkdir -p "$config_dir" -fi - -# Create agent config -echo "Creating agent config" -cat <"$config_file" -{ - "CONTROLLER_ENDPOINT": "$ADMIN_ALB_DNS", - "AGENT_ENDPOINT": "$INBOUND_ALB_DNS" -} + cat <${PWD}/agent-provisioning/AFJ/token/${AGENCY}_${CONTAINER_NAME}.json + { + "token" : "$token" + } EOF -# Check if the file was created successfully -if [ -f "$config_file" ]; then - echo "Agent config created successfully: $config_file" + echo "Agent config created" else - echo "Failed to create agent config: $config_file" + echo "===============" + echo "ERROR : Failed to spin up the agent!" + echo "===============" && exit 125 fi - -# Print available folders in the AFJ directory -echo "Available folders in the AFJ directory:" -ls -d "${PWD}/agent-provisioning/AFJ/"*/ - -# Print the content of the JSON files -echo "Content of endpoint JSON file:" -cat "$config_file" -echo "Content of token JSON file:" - +echo "Total time elapsed: $(date -ud "@$(($(date +%s) - $START_TIME))" +%T) (HH:MM:SS)" \ No newline at end of file diff --git a/apps/agent-provisioning/AFJ/scripts/start_agent_ecs.sh b/apps/agent-provisioning/AFJ/scripts/start_agent_ecs.sh index a26a68845..3bedb6f36 100644 --- a/apps/agent-provisioning/AFJ/scripts/start_agent_ecs.sh +++ b/apps/agent-provisioning/AFJ/scripts/start_agent_ecs.sh @@ -20,11 +20,13 @@ INDY_LEDGER=${15} INBOUND_ENDPOINT=${16} SCHEMA_FILE_SERVER_URL=${17} AGENT_API_KEY=${18} -AGENT_HOST=${19} -AWS_ACCOUNT_ID=${20} -S3_BUCKET_ARN=${21} -CLUSTER_NAME=${22} -TASKDEFINITION_FAMILY=${23} +AWS_ACCOUNT_ID=${19} +S3_BUCKET_ARN=${20} +CLUSTER_NAME=${21} +TASKDEFINITION_FAMILY=${22} +ADMIN_TG_ARN=${23} +INBOUND_TG_ARN=${24} +FILESYSTEMID=${25} DESIRED_COUNT=1 @@ -125,7 +127,7 @@ cat </app/agent-provisioning/AFJ/agent-config/${AGENCY}_${CONTAINER_NAME}. "walletScheme": "DatabasePerWallet", "indyLedger": $INDY_LEDGER, "endpoint": [ - "$AGENT_ENDPOINT" + "$INBOUND_ENDPOINT" ], "autoAcceptConnections": true, "autoAcceptCredentials": "contentApproved", @@ -143,10 +145,10 @@ cat </app/agent-provisioning/AFJ/agent-config/${AGENCY}_${CONTAINER_NAME}. "webhookUrl": "$WEBHOOK_HOST/wh/$AGENCY", "adminPort": $ADMIN_PORT, "tenancy": $TENANT, - "schemaFileServerURL": "$SCHEMA_FILE_SERVER_URL" + "schemaFileServerURL": "$SCHEMA_FILE_SERVER_URL", + "apiKey": "$AGENT_API_KEY" } EOF -# scp ${PWD}/agent-provisioning/AFJ/agent-config/${AGENCY}_${CONTAINER_NAME}.json ${AGENT_HOST}:/home/ec2-user/config/ # Construct the container definitions dynamically CONTAINER_DEFINITIONS=$( @@ -155,8 +157,8 @@ CONTAINER_DEFINITIONS=$( { "name": "$CONTAINER_NAME", "image": "${AFJ_VERSION}", - "cpu": 154, - "memory": 307, + "cpu": 307, + "memory": 358, "portMappings": [ { "containerPort": $ADMIN_PORT, @@ -173,7 +175,7 @@ CONTAINER_DEFINITIONS=$( "command": [ "--auto-accept-connections", "--config", - "/config.json" + "/config/${AGENCY}_${CONTAINER_NAME}.json" ], "environment": [ { @@ -190,21 +192,22 @@ CONTAINER_DEFINITIONS=$( "mountPoints": [ { "sourceVolume": "config", - "containerPath": "/config.json", + "containerPath": "/config", "readOnly": true } ], "volumesFrom": [], "logConfiguration": { - "logDriver": "awslogs", - "options": { - "awslogs-group": "/ecs/$TASKDEFINITION_FAMILY", - "awslogs-create-group": "true", - "awslogs-region": "$AWS_PUBLIC_REGION", - "awslogs-stream-prefix": "ecs" - }, - "ulimits": [] - } + "logDriver": "awslogs", + "options": { + "awslogs-group": "/ecs/$TASKDEFINITION_FAMILY", + "awslogs-create-group": "true", + "awslogs-region": "$AWS_PUBLIC_REGION", + "awslogs-stream-prefix": "ecs" + } + }, + "ulimits": [] +} ] EOF ) @@ -218,18 +221,22 @@ TASK_DEFINITION=$( "executionRoleArn": "arn:aws:iam::${AWS_ACCOUNT_ID}:role/ecsTaskExecutionRole", "volumes": [ { - "name": "config", - "host": { - "sourcePath": "/home/ec2-user/config/${AGENCY}_${CONTAINER_NAME}.json" - } - } + "efsVolumeConfiguration": { + "fileSystemId": "$FILESYSTEMID", + "rootDirectory": "/" + }, + "name": "config" + } ], - "networkMode": "host", "requiresCompatibilities": [ "EC2" ], - "cpu": "154", - "memory": "307" + "runtimePlatform": { + "cpuArchitecture": "ARM64", + "operatingSystemFamily": "LINUX" + }, + "cpu": "307", + "memory": "358" } EOF ) @@ -240,14 +247,56 @@ echo "$TASK_DEFINITION" >task_definition.json # Register the task definition and retrieve the ARN TASK_DEFINITION_ARN=$(aws ecs register-task-definition --cli-input-json file://task_definition.json --query 'taskDefinition.taskDefinitionArn' --output text) +SERVICE_JSON=$( + cat < service.json + +# Check if the service file was created successfully +if [ -f "service.json" ]; then + echo "Service file created successfully: service.json" +else + echo "Failed to create service file: service.json" +fi + # Create the service aws ecs create-service \ - --cluster $CLUSTER_NAME \ - --service-name $SERVICE_NAME \ - --task-definition $TASK_DEFINITION_ARN \ - --desired-count $DESIRED_COUNT \ - --launch-type EC2 \ - --deployment-configuration "maximumPercent=200,minimumHealthyPercent=100" + --cli-input-json file://service.json \ + --region $AWS_PUBLIC_REGION + +# Describe the ECS service and filter by service name +service_description=$(aws ecs describe-services --service $SERVICE_NAME --cluster $CLUSTER_NAME --region $AWS_PUBLIC_REGION) + +# Check if the service creation was successful +if [ $? -eq 0 ]; then + echo "Service creation successful" +else + echo "Failed to create service" + exit 1 +fi if [ $? -eq 0 ]; then @@ -271,17 +320,22 @@ if [ $? -eq 0 ]; then sleep 10 fi done + # Describe the ECS service and filter by service name service_description=$(aws ecs describe-services --service $SERVICE_NAME --cluster $CLUSTER_NAME --region $AWS_PUBLIC_REGION) echo "service_description=$service_description" # Extract Task ID from the service description events -task_id=$(echo "$service_description" | jq -r '.services[0].events[] | select(.message | test("has started 1 tasks")) | .message | capture("\\(task (?[^)]+)\\)") | .id') -#echo "task_id=$task_id" +task_id=$(echo "$service_description" | jq -r ' + .services[0].events[] + | select(.message | test("has started 1 tasks")) + | .message + | capture("\\(task (?[^)]+)\\)") + | .id +') # to fetch log group of container -............................................................. log_group=/ecs/$TASKDEFINITION_FAMILY echo "log_group=$log_group" @@ -299,7 +353,6 @@ fi # Set maximum retry attempts RETRIES=3 -# Loop to attempt retrieving token from logs # Loop to attempt retrieving token from logs for attempt in $(seq 1 $RETRIES); do echo "Attempt $attempt: Checking service logs for token..." @@ -309,8 +362,12 @@ for attempt in $(seq 1 $RETRIES); do --log-group-name "$log_group" \ --log-stream-name "$log_stream" \ --region $AWS_PUBLIC_REGION \ - | grep -o '*** API Key: [^ ]*' \ - | cut -d ' ' -f 3 + --query 'events[*].message' \ + --output text \ + | tr -d '\033' \ + | grep 'API Key:' \ + | sed -E 's/.*API Key:[[:space:]]*([a-zA-Z0-9._:-]*).*/\1/' \ + | head -n 1 ) # echo "token=$token" if [ -n "$token" ]; then @@ -332,8 +389,7 @@ done echo "Creating agent config" cat <${PWD}/agent-provisioning/AFJ/endpoints/${AGENCY}_${CONTAINER_NAME}.json { - "CONTROLLER_ENDPOINT":"${EXTERNAL_IP}:${ADMIN_PORT}", - "AGENT_ENDPOINT" : "${INTERNAL_IP}:${ADMIN_PORT}" + "CONTROLLER_ENDPOINT":"$EXTERNAL_IP" } EOF diff --git a/apps/agent-provisioning/src/agent-provisioning.service.ts b/apps/agent-provisioning/src/agent-provisioning.service.ts index 5cbda9e51..2f2cc5b2e 100644 --- a/apps/agent-provisioning/src/agent-provisioning.service.ts +++ b/apps/agent-provisioning/src/agent-provisioning.service.ts @@ -39,7 +39,7 @@ export class AgentProvisioningService { } = payload; if (agentType === AgentType.AFJ) { // The wallet provision command is used to invoke a shell script - const walletProvision = `${process.cwd() + process.env.AFJ_AGENT_SPIN_UP} ${orgId} "${externalIp}" "${walletName}" "${walletPassword}" ${seed} ${webhookEndpoint} ${walletStorageHost} ${walletStoragePort} ${walletStorageUser} ${walletStoragePassword} ${containerName} ${protocol} ${tenant} ${credoImage} "${indyLedger}" ${inboundEndpoint} ${process.env.SCHEMA_FILE_SERVER_URL} ${process.env.AGENT_API_KEY} ${process.env.AGENT_HOST} ${process.env.AWS_ACCOUNT_ID} ${process.env.S3_BUCKET_ARN} ${process.env.CLUSTER_NAME} ${process.env.TASKDEFINITION_FAMILY}`; + const walletProvision = `${process.cwd() + process.env.AFJ_AGENT_SPIN_UP} ${orgId} "${externalIp}" "${walletName}" "${walletPassword}" ${seed} ${webhookEndpoint} ${walletStorageHost} ${walletStoragePort} ${walletStorageUser} ${walletStoragePassword} ${containerName} ${protocol} ${tenant} ${credoImage} "${indyLedger}" ${inboundEndpoint} ${process.env.SCHEMA_FILE_SERVER_URL} ${process.env.AGENT_API_KEY} ${process.env.AWS_ACCOUNT_ID} ${process.env.S3_BUCKET_ARN} ${process.env.CLUSTER_NAME} ${process.env.TASKDEFINITION_FAMILY} ${process.env.ADMIN_TG_ARN} ${process.env.INBOUND_TG_ARN} ${process.env.FILESYSTEMID} ${process.env.ECS_SUBNET_ID} ${process.env.ECS_SECURITY_GROUP_ID}`; const spinUpResponse: object = new Promise(async (resolve) => { await exec(walletProvision, async (err, stdout, stderr) => { this.logger.log(`shell script output: ${stdout}`);