diff --git a/.env.demo b/.env.demo index dcb223caf..f9130b987 100644 --- a/.env.demo +++ b/.env.demo @@ -86,22 +86,22 @@ DEEPLINK_DOMAIN='https://link.credebl.id?url=' ENABLE_CORS_IP_LIST=http://localhost:3000, http://localhost:3001, http://localhost:5000,http://localhost:8085,https://verify.credebl.id,https://verifyed.credebl.id,https://verify-api.credebl.id,https://qa.credebl.id,https://dev.credebl.id,https://credebl.id -USER_NKEY_SEED=SUAILBO6CYQF4RPIZYCVCFRIOMJ7BW33PFZDFEZKOHV65MN3W37FFJA3JY -API_GATEWAY_NKEY_SEED=SUAI7SDZAHS24I7JWOB77BK6EFE3ZS3NCF5FW22PMWCXGE56OBPYHK5734 -ORGANIZATION_NKEY_SEED=SUABORS4UFEV2OAWNEXB7JA76XNOF7A6YJAFOGRZTWOEGCXER36P2NP7JQ -AGENT_PROVISIONING_NKEY_SEED=SUAIUEPEC5D4KMTLK45UOPZ45JQ5QUMMIIJY2UT37RMQE6GENBTJTT2MSQ -AGENT_SERVICE_NKEY_SEED=SUABOFFEQNQY7YR4BIZDJENJ5T24CCDYOYTVHBKQLEWTZUTPTL3EQ3IZ3U -VERIFICATION_NKEY_SEED=SUAOTKYQMN6RGVWLZII22A4EFURAT65H4PGU3G5QXKM427HZ3JKIQZ7KU4 -LEDGER_NKEY_SEED=SUABKZWIZCMUROUKCSHL774UOLKFQZR2UPQXII5FCGXHF25GFQX2XLIPLI -ISSUANCE_NKEY_SEED=SUAG7GEESSHO2ZF4J2IUKB6QPF4ENTLO7MLXZSSF67MEETTFZWFGJNDYVU -CONNECTION_NKEY_SEED=SUALLWKCDN2KBB4YTZUNUUFP7ZNSI4PBXVK7X5FPNX6LQ3DCHFGYX4JPLQ -ECOSYSTEM_NKEY_SEED=SUAGUAGZZLT2LYEA3SRWFXCJL32MXR5GCBAZNYJLLIUH4O76GDEGQAYM74 -CREDENTAILDEFINITION_NKEY_SEED=SUAAYNLVKEP2E4JPCJ7OYSQ6OFCDBQ3GCTOPARBXBNP64JFESDWH7N3FQA -SCHEMA_NKEY_SEED=SUAESXIRPE4PBJR26T44XPPIAONQ3YJTN45VSTRNZUW77GAF5RBP3SEBFA -UTILITIES_NKEY_SEED=SUAHLF3PYEGNN3J2LZHHT6LOQ4GQ2CPGATEO66XRXLCEE6QYSM26TKCNUM -CLOUD_WALLET_NKEY_SEED=SUAJ3VT7IFZXVE7SSTX3JFE6F2U6DYDROW6VTCCGFVVB6D7O6C7OWJWTPM -GEOLOCATION_NKEY_SEED=SUAA3YQLMQPKEK224OVFGENQ3VRYD57LNPJFMGDULOO57CUYOQLAA7KBJU -NOTIFICATION_NKEY_SEED=SUAF5V6RN6HHOLBJX6UV7443PBNT7NSAJ6YCUOW7LTZQ77PXXAMH25AHPI +USER_NKEY_SEED= +API_GATEWAY_NKEY_SEED= +ORGANIZATION_NKEY_SEED= +AGENT_PROVISIONING_NKEY_SEED= +AGENT_SERVICE_NKEY_SEED= +VERIFICATION_NKEY_SEED= +LEDGER_NKEY_SEED= +ISSUANCE_NKEY_SEED= +CONNECTION_NKEY_SEED= +ECOSYSTEM_NKEY_SEED= +CREDENTAILDEFINITION_NKEY_SEED= +SCHEMA_NKEY_SEED= +UTILITIES_NKEY_SEED= +CLOUD_WALLET_NKEY_SEED= +GEOLOCATION_NKEY_SEED= +NOTIFICATION_NKEY_SEED= KEYCLOAK_DOMAIN=http://localhost:8080/ KEYCLOAK_ADMIN_URL=http://localhost:8080 @@ -144,5 +144,5 @@ APP=api #Schema-file-server APP_PORT=4000 -JWT_TOKEN_SECRET=c2e48ca31ac2a0b9af47f3a9f5a0809a858c296948c1326eb746bb7bc945a9d5 +JWT_TOKEN_SECRET= ISSUER=Credebl \ No newline at end of file diff --git a/libs/config/src/config.service.ts b/libs/config/src/config.service.ts index f94305b82..0a835d821 100644 --- a/libs/config/src/config.service.ts +++ b/libs/config/src/config.service.ts @@ -1,10 +1,10 @@ -import { DevelopmentEnvironment } from '@credebl/enum/enum'; +import { DevelopmentEnvironment } from '../../enum/src/enum'; import { Injectable } from '@nestjs/common'; import { ConfigService as NestConfigService } from '@nestjs/config'; @Injectable() export class ConfigService { - constructor(private readonly configService: NestConfigService) {} + constructor(private readonly configService: NestConfigService) { } get isProduction(): boolean { return DevelopmentEnvironment.PRODUCTION === this.environment; diff --git a/libs/logger/package.json b/libs/logger/package.json new file mode 100644 index 000000000..a233408b1 --- /dev/null +++ b/libs/logger/package.json @@ -0,0 +1,34 @@ +{ + "name": "@credebl/logger", + "main": "src/index", + "types": "src/index", + "version": "0.0.1", + "files": [ + "dist" + ], + "scripts": { + "build": "pnpm run clean && pnpm run compile", + "clean": "rimraf ../../dist/libs/logger", + "compile": "tsc -p tsconfig.build.json", + "test": "jest" + }, + "dependencies": { + "@credebl/common": "workspace:*", + "@elastic/ecs-winston-format": "^1.5.3", + "@nestjs/common": "^10.2.7", + "@nestjs/config": "^3.0.0", + "@nestjs/core": "^10.1.3", + "morgan": "^1.10.0", + "nestjs-cls": "^4.3.0", + "winston": "3.4", + "winston-daily-rotate-file": "^5.0.0", + "winston-elasticsearch": "0.16.0", + "rxjs": "^7.8.1", + "uuid": "^9.0.0" + }, + "devDependencies": { + "reflect-metadata": "^0.1.13", + "rimraf": "^4.4.0", + "typescript": "^5.1.6" + } +} diff --git a/libs/logger/src/logger.interface.ts b/libs/logger/src/logger.interface.ts index 012a874dd..643eeda6d 100644 --- a/libs/logger/src/logger.interface.ts +++ b/libs/logger/src/logger.interface.ts @@ -1,4 +1,4 @@ -import { LogData, LogLevel } from '@credebl/logger/log'; +import { LogData, LogLevel } from './log'; export const LoggerBaseKey = Symbol(); export const LoggerKey = Symbol(); @@ -18,3 +18,4 @@ export default interface Logger { emergency(message: string | Error, data?: LogData, profile?: string): void; startProfile(id: string): void; }; + diff --git a/libs/logger/src/logger.module.ts b/libs/logger/src/logger.module.ts index c7529d380..141e9e5b7 100644 --- a/libs/logger/src/logger.module.ts +++ b/libs/logger/src/logger.module.ts @@ -8,17 +8,17 @@ import { import WinstonLogger, { WinstonLoggerTransportsKey -} from '@credebl/logger/winstonLogger'; +} from './winstonLogger'; import Logger, { LoggerBaseKey, LoggerKey -} from '@credebl/logger/logger.interface'; -import NestjsLoggerServiceAdapter from '@credebl/logger/nestjsLoggerServiceAdapter'; -import ConsoleTransport from '@credebl/logger/transports/consoleTransport'; +} from './logger.interface'; +import NestjsLoggerServiceAdapter from './nestjsLoggerServiceAdapter'; +import ConsoleTransport from './transports/consoleTransport'; import * as morgan from 'morgan'; import { ConfigService } from '../../config/src/config.service'; -import LoggerService from '@credebl/logger/logger.service'; -import { MICRO_SERVICE_NAME } from '@credebl/common/common.constant'; +import LoggerService from './logger.service'; +import { MICRO_SERVICE_NAME } from '@credebl/common/src/common.constant'; @Global() @Module({ @@ -57,7 +57,7 @@ export class LoggerModule implements NestModule { public constructor( @Inject(LoggerKey) private readonly logger: Logger, private readonly configService: ConfigService - ) {} + ) { } public configure(consumer: MiddlewareConsumer): void { consumer diff --git a/libs/logger/src/logger.service.ts b/libs/logger/src/logger.service.ts index 69e3e69d5..08f91c1d7 100644 --- a/libs/logger/src/logger.service.ts +++ b/libs/logger/src/logger.service.ts @@ -2,13 +2,13 @@ import { Inject, Injectable, Scope } from '@nestjs/common'; import { INQUIRER } from '@nestjs/core'; import Logger, { LoggerBaseKey -} from '@credebl/logger/logger.interface'; -import { LogData, LogLevel } from '@credebl/logger/log'; +} from './logger.interface'; +import { LogData, LogLevel } from './log'; import { ConfigService } from '@nestjs/config'; import ContextStorageService, { ContextStorageServiceKey -} from '@credebl/context/contextStorageService.interface'; -import { MICRO_SERVICE_NAME } from '@credebl/common/common.constant'; +} from '../../context/src/contextStorageService.interface'; +import { MICRO_SERVICE_NAME } from '@credebl/common/src/common.constant'; @Injectable({ scope: Scope.TRANSIENT }) export default class LoggerService implements Logger { @@ -42,27 +42,27 @@ export default class LoggerService implements Logger { return this.logger.log(level, message, this.getLogData(data), profile); } - public debug(message: string, data?: LogData, profile?: string) : void { + public debug(message: string, data?: LogData, profile?: string): void { return this.logger.debug(message, this.getLogData(data), profile); } - public info(message: string, data?: LogData, profile?: string) : void { + public info(message: string, data?: LogData, profile?: string): void { return this.logger.info(message, this.getLogData(data), profile); } - public warn(message: string | Error, data?: LogData, profile?: string) : void { + public warn(message: string | Error, data?: LogData, profile?: string): void { return this.logger.warn(message, this.getLogData(data), profile); } - public error(message: string | Error, data?: LogData, profile?: string) : void { + public error(message: string | Error, data?: LogData, profile?: string): void { return this.logger.error(message, this.getLogData(data), profile); } - public fatal(message: string | Error, data?: LogData, profile?: string) : void { + public fatal(message: string | Error, data?: LogData, profile?: string): void { return this.logger.fatal(message, this.getLogData(data), profile); } - public emergency(message: string | Error, data?: LogData, profile?: string) : void { + public emergency(message: string | Error, data?: LogData, profile?: string): void { return this.logger.emergency(message, this.getLogData(data), profile); } @@ -78,7 +78,7 @@ export default class LoggerService implements Logger { }; } - public startProfile(id: string) : void { + 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..4cda20caa 100644 --- a/libs/logger/src/logging.interceptor.ts +++ b/libs/logger/src/logging.interceptor.ts @@ -2,7 +2,7 @@ import { Injectable, NestInterceptor, ExecutionContext, CallHandler, Inject } fr import { Observable, throwError } from 'rxjs'; import { catchError } from 'rxjs/operators'; -import ContextStorageService, { ContextStorageServiceKey } from '@credebl/context/contextStorageService.interface'; +import ContextStorageService, { ContextStorageServiceKey } from '../../context/src/contextStorageService.interface'; import Logger, { LoggerKey } from './logger.interface'; import { ClsService } from 'nestjs-cls'; import { v4 } from 'uuid'; @@ -13,34 +13,34 @@ 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)) { + 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..b37c4b9c7 100644 --- a/libs/logger/src/nestjsLoggerServiceAdapter.ts +++ b/libs/logger/src/nestjsLoggerServiceAdapter.ts @@ -1,41 +1,41 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ import { ConsoleLogger } from '@nestjs/common'; -import Logger from '@credebl/logger/logger.interface'; +import Logger from './logger.interface'; import { LoggerService } from '@nestjs/common/services/logger.service'; -import { LogData } from '@credebl/logger/log'; +import { LogData } from './log'; export default class NestjsLoggerServiceAdapter extends ConsoleLogger - implements LoggerService -{ + implements LoggerService { public constructor(private readonly logger: Logger) { super(); } - public info(message: any, ...optionalParams: any[]) : void { + public info(message: any, ...optionalParams: any[]): void { return this.logger.info(message, this.getLogData(optionalParams)); } - public log(message: any, ...optionalParams: any[]) : void { + public log(message: any, ...optionalParams: any[]): void { return this.logger.info(message, this.getLogData(optionalParams)); } - public error(message: any, ...optionalParams: any[]) : void { + public error(message: any, ...optionalParams: any[]): void { return this.logger.error(message, this.getLogData(optionalParams)); } - public warn(message: any, ...optionalParams: any[]) : void { + public warn(message: any, ...optionalParams: any[]): void { return this.logger.warn(message, this.getLogData(optionalParams)); } - public debug(message: any, ...optionalParams: any[]) : void { + public debug(message: any, ...optionalParams: any[]): void { return this.logger.debug(message, this.getLogData(optionalParams)); } - public verbose(message: any, ...optionalParams: any[]) : void { + public verbose(message: any, ...optionalParams: any[]): void { return this.logger.info(message, this.getLogData(optionalParams)); } - private getLogData(...optionalParams: any[]) : LogData { + private getLogData(...optionalParams: any[]): LogData { return { sourceClass: optionalParams[0] ? optionalParams[0] : undefined, }; diff --git a/libs/logger/src/transports/consoleTransport.ts b/libs/logger/src/transports/consoleTransport.ts index e12b6c029..d301c5ba0 100644 --- a/libs/logger/src/transports/consoleTransport.ts +++ b/libs/logger/src/transports/consoleTransport.ts @@ -1,6 +1,6 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import * as winston from 'winston'; -import { LogLevel } from '@credebl/logger/log'; +import { LogLevel } from '../log'; enum LogColors { red = '\x1b[31m', diff --git a/libs/logger/src/winstonLogger.ts b/libs/logger/src/winstonLogger.ts index d2a8b0ef8..e1bbebe15 100644 --- a/libs/logger/src/winstonLogger.ts +++ b/libs/logger/src/winstonLogger.ts @@ -1,7 +1,7 @@ import * as winston from 'winston'; import { Inject, Injectable } from '@nestjs/common'; -import { LogData, LogLevel } from '@credebl/logger/log'; -import Logger from '@credebl/logger/logger.interface'; +import { LogData, LogLevel } from './log'; +import Logger from './logger.interface'; import * as Elasticsearch from 'winston-elasticsearch'; import * as ecsFormat from '@elastic/ecs-winston-format'; @@ -9,19 +9,20 @@ export const WinstonLoggerTransportsKey = Symbol(); let esTransport; if ('true' === process.env.ELK_LOG?.toLowerCase()) { const esTransportOpts = { - level: `${process.env.LOG_LEVEL}`, - clientOpts: { node: `${process.env.ELK_LOG_PATH}`, - auth: { - username: `${process.env.ELK_USERNAME}`, - password: `${process.env.ELK_PASSWORD}` - } - } -}; -esTransport = new Elasticsearch.ElasticsearchTransport(esTransportOpts); + level: `${process.env.LOG_LEVEL}`, + clientOpts: { + node: `${process.env.ELK_LOG_PATH}`, + auth: { + username: `${process.env.ELK_USERNAME}`, + password: `${process.env.ELK_PASSWORD}` + } + } + }; + esTransport = new Elasticsearch.ElasticsearchTransport(esTransportOpts); -esTransport.on('error', (error) => { - console.error('Error caught in logger', error); -}); + esTransport.on('error', (error) => { + console.error('Error caught in logger', error); + }); } @@ -33,17 +34,17 @@ export default class WinstonLogger implements Logger { public constructor( @Inject(WinstonLoggerTransportsKey) transports: winston.transport[] ) { - if(esTransport){ + if (esTransport) { transports.push(esTransport); } - - + + // Create winston logger this.logger = winston.createLogger(this.getLoggerFormatOptions(transports)); - + } - private getLoggerFormatOptions(transports: winston.transport[]) : winston.LoggerOptions { + private getLoggerFormatOptions(transports: winston.transport[]): winston.LoggerOptions { // Setting log levels for winston const levels: any = {}; let cont = 0; @@ -55,8 +56,8 @@ export default class WinstonLogger implements Logger { return { level: LogLevel.Debug, levels, - // format: ecsFormat.ecsFormat({ convertReqRes: true }), - format: winston.format.combine( + // format: ecsFormat.ecsFormat({ convertReqRes: true }), + format: winston.format.combine( ecsFormat.ecsFormat({ convertReqRes: true }), // Add timestamp and format the date // winston.format.timestamp({ @@ -94,7 +95,7 @@ export default class WinstonLogger implements Logger { message: string | Error, data?: LogData, profile?: string - ) : void { + ): void { const logData = { level: level, message: message instanceof Error ? message.message : message, @@ -110,31 +111,31 @@ export default class WinstonLogger implements Logger { } - public debug(message: string, data?: LogData, profile?: string) : void { + public debug(message: string, data?: LogData, profile?: string): void { this.log(LogLevel.Debug, message, data, profile); } - public info(message: string, data?: LogData, profile?: string) : void { + public info(message: string, data?: LogData, profile?: string): void { this.log(LogLevel.Info, message, data, profile); } - public warn(message: string | Error, data?: LogData, profile?: string) : void { + public warn(message: string | Error, data?: LogData, profile?: string): void { this.log(LogLevel.Warn, message, data, profile); } - public error(message: string | Error, data?: LogData, profile?: string) : void { + public error(message: string | Error, data?: LogData, profile?: string): void { this.log(LogLevel.Error, message, data, profile); } - public fatal(message: string | Error, data?: LogData, profile?: string) : void { + public fatal(message: string | Error, data?: LogData, profile?: string): void { this.log(LogLevel.Fatal, message, data, profile); } - public emergency(message: string | Error, data?: LogData, profile?: string) : void { + public emergency(message: string | Error, data?: LogData, profile?: string): void { this.log(LogLevel.Emergency, message, data, profile); } - public startProfile(id: string) : void { + public startProfile(id: string): void { this.logger.profile(id); } } diff --git a/libs/logger/tsconfig.build.json b/libs/logger/tsconfig.build.json new file mode 100644 index 000000000..5f4f80759 --- /dev/null +++ b/libs/logger/tsconfig.build.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.build.json", + "compilerOptions": { + "outDir": "../../dist/libs/logger" + }, + "include": ["src/**/*"] +} diff --git a/libs/logger/tsconfig.json b/libs/logger/tsconfig.json new file mode 100644 index 000000000..6a8e212c8 --- /dev/null +++ b/libs/logger/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "declaration": true, + } +} diff --git a/libs/logger/tsconfig.lib.json b/libs/logger/tsconfig.lib.json deleted file mode 100644 index cd7c5b5ba..000000000 --- a/libs/logger/tsconfig.lib.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "declaration": true, - "outDir": "../../dist/libs/logger" - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 83708c63d..060ef28ef 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -441,6 +441,55 @@ importers: specifier: ^5.1.6 version: 5.1.6 + libs/logger: + dependencies: + '@credebl/common': + specifier: workspace:* + version: link:../common + '@elastic/ecs-winston-format': + specifier: ^1.5.3 + version: 1.5.3 + '@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) + '@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) + '@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) + morgan: + specifier: ^1.10.0 + version: 1.10.0 + 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) + rxjs: + specifier: ^7.8.1 + version: 7.8.1 + uuid: + specifier: ^9.0.0 + version: 9.0.0 + winston: + specifier: '3.4' + version: 3.4.0 + winston-daily-rotate-file: + specifier: ^5.0.0 + version: 5.0.0(winston@3.4.0) + winston-elasticsearch: + specifier: 0.16.0 + version: 0.16.0 + devDependencies: + reflect-metadata: + specifier: ^0.1.13 + version: 0.1.13 + rimraf: + specifier: ^4.4.0 + version: 4.4.1 + typescript: + specifier: ^5.1.6 + version: 5.1.6 + packages: '@aashutoshrathi/word-wrap@1.2.6': @@ -3740,6 +3789,7 @@ packages: lodash.omit@4.5.0: resolution: {integrity: sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==} + deprecated: This package is deprecated. Use destructuring assignment syntax instead. lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} @@ -7941,7 +7991,7 @@ snapshots: 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