From 880992e5cc50ae05fef32cd1b5318821abcab379 Mon Sep 17 00:00:00 2001 From: Dmitry Nechay Date: Mon, 7 Jul 2025 13:22:48 +0300 Subject: [PATCH 1/7] feat: init logger lib --- packages/libs/logger/README.md | 1 + packages/libs/logger/package.json | 32 ++++++++++++++++++++++++++++++ packages/libs/logger/src/index.ts | 1 + packages/libs/logger/tsconfig.json | 21 ++++++++++++++++++++ yarn.lock | 8 ++++++++ 5 files changed, 63 insertions(+) create mode 100644 packages/libs/logger/README.md create mode 100644 packages/libs/logger/package.json create mode 100644 packages/libs/logger/src/index.ts create mode 100644 packages/libs/logger/tsconfig.json diff --git a/packages/libs/logger/README.md b/packages/libs/logger/README.md new file mode 100644 index 0000000000..736f344d74 --- /dev/null +++ b/packages/libs/logger/README.md @@ -0,0 +1 @@ +# logger diff --git a/packages/libs/logger/package.json b/packages/libs/logger/package.json new file mode 100644 index 0000000000..767cb51b6b --- /dev/null +++ b/packages/libs/logger/package.json @@ -0,0 +1,32 @@ +{ + "name": "@human-protocol/logger", + "version": "1.0.0", + "description": "Unified logging package for Human Protocol", + "type": "commonjs", + "main": "dist/index.ts", + "types": "dist/index.d.ts", + "files": [ + "dist/**/*" + ], + "scripts": { + "clean": "tsc --build --clean && rm -rf ./dist", + "build": "tsc --build" + }, + "devDependencies": { + "typescript": "^5.8.3" + }, + "engines": { + "node": ">=22" + }, + "repository": { + "type": "git", + "url": "https://github.com/humanprotocol/human-protocol.git", + "directory": "packages/libs/logger" + }, + "keywords": [ + "human-protocol", + "logger" + ], + "license": "MIT", + "packageManager": "yarn@4.9.1" +} diff --git a/packages/libs/logger/src/index.ts b/packages/libs/logger/src/index.ts new file mode 100644 index 0000000000..da5a8d775d --- /dev/null +++ b/packages/libs/logger/src/index.ts @@ -0,0 +1 @@ +console.log('Hello logging'); diff --git a/packages/libs/logger/tsconfig.json b/packages/libs/logger/tsconfig.json new file mode 100644 index 0000000000..c8d725694f --- /dev/null +++ b/packages/libs/logger/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "incremental": true, + "target": "es2022", + "lib": ["ES2022"], + "module": "node18", + "moduleResolution": "node16", + "rootDir": "./src", + "outDir": "./dist", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "types": ["node"], + }, + "include": ["src"], + "exclude": ["node_modules", "dist"] +} diff --git a/yarn.lock b/yarn.lock index c858ad4df4..579d95fe8c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4451,6 +4451,14 @@ __metadata: languageName: unknown linkType: soft +"@human-protocol/logger@workspace:packages/libs/logger": + version: 0.0.0-use.local + resolution: "@human-protocol/logger@workspace:packages/libs/logger" + dependencies: + typescript: "npm:^5.8.3" + languageName: unknown + linkType: soft + "@human-protocol/reputation-oracle@workspace:packages/apps/reputation-oracle/server": version: 0.0.0-use.local resolution: "@human-protocol/reputation-oracle@workspace:packages/apps/reputation-oracle/server" From bbf95b6ac81134b49cef9d6121eb0834509a2095 Mon Sep 17 00:00:00 2001 From: Dmitry Nechay Date: Mon, 7 Jul 2025 16:08:06 +0300 Subject: [PATCH 2/7] feat: logger package --- packages/libs/logger/.prettierrc | 4 + packages/libs/logger/README.md | 153 +++- packages/libs/logger/eslint.config.mjs | 58 ++ packages/libs/logger/package.json | 31 +- packages/libs/logger/src/abstract-logger.ts | 113 +++ packages/libs/logger/src/index.ts | 10 +- packages/libs/logger/src/nest-logger.ts | 98 +++ packages/libs/logger/src/pino-logger.ts | 64 ++ packages/libs/logger/src/types.ts | 43 ++ yarn.lock | 795 +++++++++++++++++++- 10 files changed, 1355 insertions(+), 14 deletions(-) create mode 100644 packages/libs/logger/.prettierrc create mode 100644 packages/libs/logger/eslint.config.mjs create mode 100644 packages/libs/logger/src/abstract-logger.ts create mode 100644 packages/libs/logger/src/nest-logger.ts create mode 100644 packages/libs/logger/src/pino-logger.ts create mode 100644 packages/libs/logger/src/types.ts diff --git a/packages/libs/logger/.prettierrc b/packages/libs/logger/.prettierrc new file mode 100644 index 0000000000..dcb72794f5 --- /dev/null +++ b/packages/libs/logger/.prettierrc @@ -0,0 +1,4 @@ +{ + "singleQuote": true, + "trailingComma": "all" +} \ No newline at end of file diff --git a/packages/libs/logger/README.md b/packages/libs/logger/README.md index 736f344d74..1091a928f5 100644 --- a/packages/libs/logger/README.md +++ b/packages/libs/logger/README.md @@ -1 +1,152 @@ -# logger +## HUMAN Protocol Node.js logger + +Custom logger implementation for use in Node.js HUMAN Protocol apps. + +Provides standartized API and writes logs in pre-defined JSON format: +```json +{ + "level": "debug", + "message": "Some info about error", + "timestamp": 1738937400037, + "error": { + "kind": "CustomError", + "message": "Message from custom error", + "stack": "CustomError: Message from custom error\n at process.processTicksAndRejections (node:internal/process/task_queues:95:5)", + "customErrorProp": "error-detail-prop" + } + // ...merging meta +} +``` + +## Logger initialization and usage + +### Pre-created logger instance +By defaul this library exports pre-created logger instance that you can start using immediately. This logger is pre-configured with: + - zero-bindings (only `name` is set up as `human-protocol-logger`) + - pretty-printing and structured log format + - has `debug` as its minimum level to log + +To use it: +```ts +import logger from '@human-protocol/logger'; + +logger.info('Some message', { some: 'extras' }); +``` +It's expected to be used only in dev environments, such as a developer toolbox, some local scripts and etc. + +### Create application logger with factory function + +Lib exports `createLogger` factory function that should be used to create a logger intance with proper bindings for application. Recommended bindings are at least `service` and `environment`, so that you can distinguish logs coming from different sources in your log-management system easilly. + +```ts +import { createLogger, LogLevel } from '@human-protocol/logger'; + +const ENV_NAME = process.NODE_ENV || 'development'; +const isDevelopment = ENV_NAME === 'development'; +const isTest = process.NODE_ENV === 'test' + +const defaultAppLogger = createLogger( + { + name: 'DefaultLogger', + level: isDevelopment ? LogLevel.DEBUG : LogLevel.INFO, + pretty: isDevelopment, + disabled: isTest, + }, + { + environment: ENV_NAME, + service: 'you-application-name', + }, +); + +export default defaultAppLogger; + +// import it somewehre in your app and use +import logger from '/logger'; + +logger.info('Some application log', { with: 'useful-context' }); +``` + +### Replacing default Nest.js logger +Once you have your application logger instance created, you can replace default Nest.js logger with it, so anything that comes from your appication follows the same format. This library provides a helper for that: + +```ts +import { NestLogger } from '@human-protocol/logger'; + +// initialize an overridden instance +export const nestLoggerOverride = new NestLogger( + defaultAppLogger.child({ name: 'NestLogger' }), +); + + +// init you Nest.js app with overriden instance +const app = await NestFactory.create(AppModule, { + logger: nestLoggerOverride, +}); + +// Logger is `nestLoggerOverride` now +import { Logger } from '@nestjs/common'; +``` + +## Usage examples +Logger has next API contract: log message first and any useful detail in log meta as a second argument. + +:information_source: If meta is not a plain object and not an error - it is being logged as "meta" property + +:information_source: Error formatting is done only for error argument and "error" context property. + +```ts +// to log simple message +logger.info('Info without any context'); + +// to log message with some context info +loger.info('New user registered', { + userAgent, + country, + ip, + email, +}); + +// to log an error +logger.error('Something went wrong', error); + +// or error with some extra context +logger.error('Error updating some entity', { + error, + entityId: 42, + ...extra +}); + +// to log anything +logger.debug('Show me value', someValue); +``` + +If needed, you can create a named logger +```ts +const utilsLogger = logger.child({ name: 'UtilsLogger' }) +// .... +utilsLogger.debug('input params', args); +/* +{ + "level": "debug", + "logger": "UtilsLogger", + "message": "input params", + "timestamp": 1738937400037 + ... +} +*/ +``` +or bind a "context" (or any other) prop to it +```ts +const contextLogger = logger.child({ context: 'SomeClassOrMethod' }) +// .... +contextLogger.info('Helpful info', context); +/* +{ + "level": "debug", + "context": "SomeClassOrMethod", + "message": "Helpful info", + "timestamp": 1738937400037, + ... +} +*/ +``` \ No newline at end of file diff --git a/packages/libs/logger/eslint.config.mjs b/packages/libs/logger/eslint.config.mjs new file mode 100644 index 0000000000..034ebf9082 --- /dev/null +++ b/packages/libs/logger/eslint.config.mjs @@ -0,0 +1,58 @@ +// @ts-check +import eslint from '@eslint/js'; +import globals from 'globals'; +import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended'; +import importPlugin from 'eslint-plugin-import'; +import tseslint from 'typescript-eslint'; + +export default tseslint.config( + { + ignores: ['eslint.config.mjs', 'dist'], + }, + eslint.configs.recommended, + tseslint.configs.recommended, + eslintPluginPrettierRecommended, + { + languageOptions: { + globals: { + ...globals.node, + }, + ecmaVersion: 2022, + sourceType: 'module', + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, + }, + }, + plugins: { + import: importPlugin, + }, + settings: { + 'import/resolver': { + typescript: {}, + }, + }, + rules: { + '@typescript-eslint/no-explicit-any': 'warn', + '@typescript-eslint/no-floating-promises': 'warn', + '@typescript-eslint/no-unsafe-argument': 'warn', + '@typescript-eslint/no-unused-vars': ['error', { + "args": "all", + "argsIgnorePattern": "^_", + "caughtErrors": "all", + "caughtErrorsIgnorePattern": "^noop", + "destructuredArrayIgnorePattern": "^_", + "varsIgnorePattern": "^_", + "ignoreRestSiblings": true + }], + 'import/order': [ + 'warn', + { + alphabetize: { order: 'asc', caseInsensitive: true }, + 'newlines-between': 'always', + groups: ['builtin', 'external', 'internal', ['parent', 'sibling', 'index']], + }, + ], + }, + }, +); diff --git a/packages/libs/logger/package.json b/packages/libs/logger/package.json index 767cb51b6b..19ad4f0b7f 100644 --- a/packages/libs/logger/package.json +++ b/packages/libs/logger/package.json @@ -1,7 +1,7 @@ { "name": "@human-protocol/logger", "version": "1.0.0", - "description": "Unified logging package for Human Protocol", + "description": "Unified logging package for HUMAN Protocol", "type": "commonjs", "main": "dist/index.ts", "types": "dist/index.d.ts", @@ -10,10 +10,29 @@ ], "scripts": { "clean": "tsc --build --clean && rm -rf ./dist", - "build": "tsc --build" + "build": "tsc --build", + "lint": "eslint \"src/**/*.ts\" --fix", + "format": "prettier --write \"src/**/*.ts\"" + }, + "dependencies": { + "pino": "^9.7.0", + "pino-pretty": "^13.0.0" }, "devDependencies": { - "typescript": "^5.8.3" + "@eslint/js": "^9.30.1", + "@types/node": "^22.10.5", + "eslint": "^9.30.1", + "eslint-config-prettier": "^10.1.5", + "eslint-import-resolver-typescript": "^4.4.4", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-prettier": "^5.5.1", + "globals": "^16.3.0", + "prettier": "^3.4.2", + "typescript": "^5.8.3", + "typescript-eslint": "^8.35.1" + }, + "peerDependencies": { + "@nestjs/common": "^10.2.7" }, "engines": { "node": ">=22" @@ -28,5 +47,11 @@ "logger" ], "license": "MIT", + "lint-staged": { + "*.ts": [ + "prettier --write", + "eslint --fix" + ] + }, "packageManager": "yarn@4.9.1" } diff --git a/packages/libs/logger/src/abstract-logger.ts b/packages/libs/logger/src/abstract-logger.ts new file mode 100644 index 0000000000..2bf1f7f493 --- /dev/null +++ b/packages/libs/logger/src/abstract-logger.ts @@ -0,0 +1,113 @@ +import { ChildBindings, Logger, LogLevel, LogMeta, LogRecord } from './types'; + +function isPlainObject(maybeObj: unknown): maybeObj is LogMeta { + return Object.prototype.toString.call(maybeObj) === '[object Object]'; +} + +function isValidLoggerName(maybeName: unknown): maybeName is string { + return typeof maybeName === 'string' && maybeName.length > 0; +} + +function serializeError(error: Error) { + const { name, message, stack, ...errorProps } = error; + + return { + kind: name, + message, + stack, + ...errorProps, + }; +} + +abstract class LoggerWrapper implements Logger { + protected readonly bindings: LogMeta; + private readonly name?: string; + + constructor(bindings: LogMeta = {}) { + if (!isPlainObject(bindings)) { + throw new Error('Logger bindings must be a plain object'); + } + + const { name, ..._bindings } = bindings; + + this.bindings = _bindings; + + if (name && isValidLoggerName(name)) { + this.name = name; + } + } + + debug(message: string, errorOrMeta?: unknown): void { + this.log(LogLevel.DEBUG, message, errorOrMeta); + } + + info(message: string, errorOrMeta?: unknown): void { + this.log(LogLevel.INFO, message, errorOrMeta); + } + + warn(message: string, errorOrMeta?: unknown): void { + this.log(LogLevel.WARN, message, errorOrMeta); + } + + error(message: string, errorOrMeta?: unknown): void { + this.log(LogLevel.ERROR, message, errorOrMeta); + } + + child(bindings: ChildBindings): Logger { + if (!isPlainObject(bindings)) { + throw new Error('Log bindings required for child logger'); + } + + return this.createChild(bindings); + } + + protected abstract createChild(bindings: LogMeta): Logger; + + private log(level: LogLevel, message: string, errorOrMeta?: unknown): void { + const logMessage = typeof message === 'string' ? message : `${message}`; + + let metaArgument: LogMeta; + if (errorOrMeta === undefined) { + metaArgument = {}; + } else if (errorOrMeta instanceof Error) { + metaArgument = { + error: serializeError(errorOrMeta), + }; + } else if (isPlainObject(errorOrMeta)) { + const { error, ...meta } = errorOrMeta; + metaArgument = meta; + if (error instanceof Error) { + Object.assign(metaArgument, { + error: serializeError(error), + }); + } else if (error !== undefined) { + metaArgument.error = error; + } + } else { + /** + * Fallback in case somebody uses log in a wrong way + */ + metaArgument = { + meta: errorOrMeta, + }; + } + + const enrichedMeta: LogRecord = { + ...this.bindings, + ...metaArgument, + level, + message: logMessage, + timestamp: Date.now(), + }; + + if (this.name) { + enrichedMeta.logger = this.name; + } + + this.callLogger(level, enrichedMeta); + } + + protected abstract callLogger(level: LogLevel, log: LogRecord): void; +} + +export default LoggerWrapper; diff --git a/packages/libs/logger/src/index.ts b/packages/libs/logger/src/index.ts index da5a8d775d..ab3a81d8ae 100644 --- a/packages/libs/logger/src/index.ts +++ b/packages/libs/logger/src/index.ts @@ -1 +1,9 @@ -console.log('Hello logging'); +import { createPinoLogger as createLogger } from './pino-logger'; + +export { default as NestLogger } from './nest-logger'; + +export { LogLevel } from './types'; +export type { Logger, LoggerFactory, LoggerFactoryOptions } from './types'; + +export { createLogger }; +export default createLogger({ name: 'human-protocol-logger', pretty: true }); diff --git a/packages/libs/logger/src/nest-logger.ts b/packages/libs/logger/src/nest-logger.ts new file mode 100644 index 0000000000..ca29a041a3 --- /dev/null +++ b/packages/libs/logger/src/nest-logger.ts @@ -0,0 +1,98 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import type { LoggerService } from '@nestjs/common'; + +import { Logger, LogLevel, LogMeta } from './types'; + +class NestLogger implements LoggerService { + constructor(private readonly loggerInstance: Logger) {} + + log(message: any, ...optionalParams: any[]) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + this.callLogger(LogLevel.INFO, message, ...optionalParams); + } + + warn(message: any, ...optionalParams: any[]) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + this.callLogger(LogLevel.WARN, message, ...optionalParams); + } + + error(message: any, ...optionalParams: any[]) { + let _message: any; + let _optionalParams: any[]; + + const firstParam = optionalParams[0] || ''; + if ( + typeof message === 'string' && + typeof firstParam === 'string' && + /\n\s+at\s.+:\d+:\d+/.test(firstParam) + ) { + /** + * It's a case when logger called as + * logger.error(error.message, error.stack) + */ + const error = new Error(message); + error.stack = firstParam; + + _message = error; + _optionalParams = optionalParams.slice(1); + } else { + _message = message; + if (optionalParams.length === 2 && optionalParams[0] === undefined) { + /** + * It's a case when logger called as + * logger.error(message) + * + * In this case Nest adds `undefined` "stack" + * as second param + */ + _optionalParams = [optionalParams[1]]; + } else { + _optionalParams = optionalParams; + } + } + + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + this.callLogger(LogLevel.ERROR, _message, ..._optionalParams); + } + + private callLogger( + level: LogLevel, + message: unknown, + ...optionalParams: unknown[] + ): void { + const logMeta: LogMeta = {}; + + let params: unknown[] = []; + // Nest always add "context" as last param + if (optionalParams.length) { + const lastParam = optionalParams.at(-1); + if (typeof lastParam === 'string') { + logMeta.context = lastParam; + params = optionalParams.slice(0, -1); + } else { + params = optionalParams; + } + } + + // Case when Nest logs something other than context + if (params.length) { + logMeta.messages = params; + } + + let _message = `unspecified nest ${level}`.toUpperCase(); + // Case when Nest logs just one argument: object + if (typeof message === 'object') { + if (message instanceof Error) { + logMeta.error = message; + } else { + Object.assign(logMeta, message); + } + } else if (message !== undefined) { + _message = message.toString(); + } + + this.loggerInstance[level](_message, logMeta); + } +} + +export default NestLogger; diff --git a/packages/libs/logger/src/pino-logger.ts b/packages/libs/logger/src/pino-logger.ts new file mode 100644 index 0000000000..c7da8d5def --- /dev/null +++ b/packages/libs/logger/src/pino-logger.ts @@ -0,0 +1,64 @@ +import pino from 'pino'; + +import LoggerWrapper from './abstract-logger'; +import { + ChildBindings, + LogMeta, + Logger, + LogLevel, + LoggerFactory, + LogRecord, +} from './types'; + +export class WrappedPino extends LoggerWrapper { + constructor( + private readonly pinoLogger: pino.Logger, + bindings?: LogMeta, + ) { + super(bindings); + } + + protected createChild(bindings: ChildBindings): Logger { + return new WrappedPino(this.pinoLogger, { + ...this.bindings, + ...bindings, + }); + } + + protected callLogger(level: LogLevel, log: LogRecord): void { + const _log: Partial = { ...log }; + + delete _log.level; + + this.pinoLogger[level](_log); + } +} + +const pinoLogLevelFormatter = (label: string) => ({ level: label }); + +export const createPinoLogger: LoggerFactory = ( + { name, level, pretty, disabled }, + bindings: LogMeta = {}, +) => { + const pinoLogger = pino({ + base: null, + level: level || LogLevel.DEBUG, + enabled: disabled !== true, + timestamp: false, + formatters: { + level: pinoLogLevelFormatter, + }, + transport: pretty + ? { + target: 'pino-pretty', + options: { + messageKey: 'message', + translateTime: "SYS:yyyy-mm-dd, HH:MM:ss'Z'", + colorize: true, + }, + } + : undefined, + }); + + return new WrappedPino(pinoLogger, { ...bindings, name }); +}; diff --git a/packages/libs/logger/src/types.ts b/packages/libs/logger/src/types.ts new file mode 100644 index 0000000000..127d96eef4 --- /dev/null +++ b/packages/libs/logger/src/types.ts @@ -0,0 +1,43 @@ +export enum LogLevel { + DEBUG = 'debug', + INFO = 'info', + WARN = 'warn', + ERROR = 'error', +} + +export type LogMeta = Record; + +export type LogRecord = { + logger?: string; + level: `${LogLevel}`; + message: string; + timestamp: number; +} & LogMeta; + +type LogFn = { + (message: string, meta?: LogMeta): void; + (message: string, error: Error): void; + (message: string, errorOrMeta?: unknown): void; +}; + +export type ChildBindings = { name?: string } & LogMeta; + +export interface Logger { + debug: LogFn; + info: LogFn; + warn: LogFn; + error: LogFn; + child: (bindings: ChildBindings) => Logger; +} + +export type LoggerFactoryOptions = { + name?: string; + pretty?: boolean; + level?: `${LogLevel}`; + disabled?: boolean; +}; + +export type LoggerFactory = ( + optins: LoggerFactoryOptions, + bindings?: LogMeta, +) => Logger; diff --git a/yarn.lock b/yarn.lock index 579d95fe8c..95f39e517a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2334,7 +2334,7 @@ __metadata: languageName: node linkType: hard -"@emnapi/core@npm:^1.4.0": +"@emnapi/core@npm:^1.4.0, @emnapi/core@npm:^1.4.3": version: 1.4.3 resolution: "@emnapi/core@npm:1.4.3" dependencies: @@ -2344,7 +2344,7 @@ __metadata: languageName: node linkType: hard -"@emnapi/runtime@npm:^1.4.0": +"@emnapi/runtime@npm:^1.4.0, @emnapi/runtime@npm:^1.4.3": version: 1.4.3 resolution: "@emnapi/runtime@npm:1.4.3" dependencies: @@ -2735,6 +2735,17 @@ __metadata: languageName: node linkType: hard +"@eslint/config-array@npm:^0.21.0": + version: 0.21.0 + resolution: "@eslint/config-array@npm:0.21.0" + dependencies: + "@eslint/object-schema": "npm:^2.1.6" + debug: "npm:^4.3.1" + minimatch: "npm:^3.1.2" + checksum: 10c0/0ea801139166c4aa56465b309af512ef9b2d3c68f9198751bbc3e21894fe70f25fbf26e1b0e9fffff41857bc21bfddeee58649ae6d79aadcd747db0c5dca771f + languageName: node + linkType: hard + "@eslint/config-helpers@npm:^0.2.1": version: 0.2.2 resolution: "@eslint/config-helpers@npm:0.2.2" @@ -2742,6 +2753,13 @@ __metadata: languageName: node linkType: hard +"@eslint/config-helpers@npm:^0.3.0": + version: 0.3.0 + resolution: "@eslint/config-helpers@npm:0.3.0" + checksum: 10c0/013ae7b189eeae8b30cc2ee87bc5c9c091a9cd615579003290eb28bebad5d78806a478e74ba10b3fe08ed66975b52af7d2cd4b4b43990376412b14e5664878c8 + languageName: node + linkType: hard + "@eslint/core@npm:^0.14.0": version: 0.14.0 resolution: "@eslint/core@npm:0.14.0" @@ -2799,6 +2817,13 @@ __metadata: languageName: node linkType: hard +"@eslint/js@npm:9.30.1, @eslint/js@npm:^9.30.1": + version: 9.30.1 + resolution: "@eslint/js@npm:9.30.1" + checksum: 10c0/17fc382a0deafdb1cadac1269d9c2f2464f025bde6e4d12fc4f4775eb9886b41340d4650b72e85a53423644fdc89bf59c987a852f27379ad25feecf2c5bbc1c9 + languageName: node + linkType: hard + "@eslint/object-schema@npm:^2.1.6": version: 2.1.6 resolution: "@eslint/object-schema@npm:2.1.6" @@ -4455,7 +4480,21 @@ __metadata: version: 0.0.0-use.local resolution: "@human-protocol/logger@workspace:packages/libs/logger" dependencies: + "@eslint/js": "npm:^9.30.1" + "@types/node": "npm:^22.10.5" + eslint: "npm:^9.30.1" + eslint-config-prettier: "npm:^10.1.5" + eslint-import-resolver-typescript: "npm:^4.4.4" + eslint-plugin-import: "npm:^2.32.0" + eslint-plugin-prettier: "npm:^5.5.1" + globals: "npm:^16.3.0" + pino: "npm:^9.7.0" + pino-pretty: "npm:^13.0.0" + prettier: "npm:^3.4.2" typescript: "npm:^5.8.3" + typescript-eslint: "npm:^8.35.1" + peerDependencies: + "@nestjs/common": ^10.2.7 languageName: unknown linkType: soft @@ -6065,6 +6104,17 @@ __metadata: languageName: node linkType: hard +"@napi-rs/wasm-runtime@npm:^0.2.11": + version: 0.2.11 + resolution: "@napi-rs/wasm-runtime@npm:0.2.11" + dependencies: + "@emnapi/core": "npm:^1.4.3" + "@emnapi/runtime": "npm:^1.4.3" + "@tybys/wasm-util": "npm:^0.9.0" + checksum: 10c0/049bd14c58b99fbe0967b95e9921c5503df196b59be22948d2155f17652eb305cff6728efd8685338b855da7e476dd2551fbe3a313fc2d810938f0717478441e + languageName: node + linkType: hard + "@napi-rs/wasm-runtime@npm:^0.2.9": version: 0.2.9 resolution: "@napi-rs/wasm-runtime@npm:0.2.9" @@ -10621,6 +10671,27 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/eslint-plugin@npm:8.35.1": + version: 8.35.1 + resolution: "@typescript-eslint/eslint-plugin@npm:8.35.1" + dependencies: + "@eslint-community/regexpp": "npm:^4.10.0" + "@typescript-eslint/scope-manager": "npm:8.35.1" + "@typescript-eslint/type-utils": "npm:8.35.1" + "@typescript-eslint/utils": "npm:8.35.1" + "@typescript-eslint/visitor-keys": "npm:8.35.1" + graphemer: "npm:^1.4.0" + ignore: "npm:^7.0.0" + natural-compare: "npm:^1.4.0" + ts-api-utils: "npm:^2.1.0" + peerDependencies: + "@typescript-eslint/parser": ^8.35.1 + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.9.0" + checksum: 10c0/0f369be24644ebea30642512ddae0e602e4ca6bc55ae09d9860f16a3baae6aee1a376c182c61b43d12bc137156e3931f6bac3c73919c9c81b32c962bb5bc544e + languageName: node + linkType: hard + "@typescript-eslint/eslint-plugin@npm:^5.0.0, @typescript-eslint/eslint-plugin@npm:^5.5.0": version: 5.62.0 resolution: "@typescript-eslint/eslint-plugin@npm:5.62.0" @@ -10720,6 +10791,22 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/parser@npm:8.35.1": + version: 8.35.1 + resolution: "@typescript-eslint/parser@npm:8.35.1" + dependencies: + "@typescript-eslint/scope-manager": "npm:8.35.1" + "@typescript-eslint/types": "npm:8.35.1" + "@typescript-eslint/typescript-estree": "npm:8.35.1" + "@typescript-eslint/visitor-keys": "npm:8.35.1" + debug: "npm:^4.3.4" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.9.0" + checksum: 10c0/949383d74f6db1b91f90923d50f0ecbacaa972fd56e70553c803a8f64131345afdaf096cf1c1fc4a833ddc06ee44b241811edb5d516d769e244560f5b7f0e0af + languageName: node + linkType: hard + "@typescript-eslint/parser@npm:^5.0.0, @typescript-eslint/parser@npm:^5.5.0": version: 5.62.0 resolution: "@typescript-eslint/parser@npm:5.62.0" @@ -10784,6 +10871,19 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/project-service@npm:8.35.1": + version: 8.35.1 + resolution: "@typescript-eslint/project-service@npm:8.35.1" + dependencies: + "@typescript-eslint/tsconfig-utils": "npm:^8.35.1" + "@typescript-eslint/types": "npm:^8.35.1" + debug: "npm:^4.3.4" + peerDependencies: + typescript: ">=4.8.4 <5.9.0" + checksum: 10c0/f8e88d773d7e9f193a05b4daeca1e7571fa0059b36ffad291fc6d83c9df94fbe38c935e076ae29e755bcb6008c4ee5c1073ebb2077258c5c0b53c76a23eb3c16 + languageName: node + linkType: hard + "@typescript-eslint/scope-manager@npm:5.62.0": version: 5.62.0 resolution: "@typescript-eslint/scope-manager@npm:5.62.0" @@ -10834,6 +10934,16 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/scope-manager@npm:8.35.1": + version: 8.35.1 + resolution: "@typescript-eslint/scope-manager@npm:8.35.1" + dependencies: + "@typescript-eslint/types": "npm:8.35.1" + "@typescript-eslint/visitor-keys": "npm:8.35.1" + checksum: 10c0/ddfa0b81f47402874efcdd8e0857142600d90fc4e827243ed0fd058731e77e4beb8f5a60425117d1d4146d84437f538cf303f7bfebbd0f02733b202aa30a8393 + languageName: node + linkType: hard + "@typescript-eslint/tsconfig-utils@npm:8.33.0, @typescript-eslint/tsconfig-utils@npm:^8.33.0": version: 8.33.0 resolution: "@typescript-eslint/tsconfig-utils@npm:8.33.0" @@ -10843,6 +10953,15 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/tsconfig-utils@npm:8.35.1, @typescript-eslint/tsconfig-utils@npm:^8.35.1": + version: 8.35.1 + resolution: "@typescript-eslint/tsconfig-utils@npm:8.35.1" + peerDependencies: + typescript: ">=4.8.4 <5.9.0" + checksum: 10c0/a11b53e05fbc59eff3f95619847fb7222d8b2aa613e602524c9b700be3ce0d48bcf5e5932869df4658f514bd2cdc87c857d484472af3f3f3adf88b6e7e1c26f3 + languageName: node + linkType: hard + "@typescript-eslint/type-utils@npm:5.62.0": version: 5.62.0 resolution: "@typescript-eslint/type-utils@npm:5.62.0" @@ -10909,6 +11028,21 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/type-utils@npm:8.35.1": + version: 8.35.1 + resolution: "@typescript-eslint/type-utils@npm:8.35.1" + dependencies: + "@typescript-eslint/typescript-estree": "npm:8.35.1" + "@typescript-eslint/utils": "npm:8.35.1" + debug: "npm:^4.3.4" + ts-api-utils: "npm:^2.1.0" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.9.0" + checksum: 10c0/09041dd64684823da169c0668e6187d237c728bf54771003dc6ddaa895cbd11ad401ff14f096451c689e37815a791ef77beaf80d1f8bbf6b92ee3edbf346bc7c + languageName: node + linkType: hard + "@typescript-eslint/types@npm:5.62.0": version: 5.62.0 resolution: "@typescript-eslint/types@npm:5.62.0" @@ -10944,6 +11078,13 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/types@npm:8.35.1, @typescript-eslint/types@npm:^8.35.1": + version: 8.35.1 + resolution: "@typescript-eslint/types@npm:8.35.1" + checksum: 10c0/136dd1c7a39685baa398406423a97a4b6a66e6aed7cbd6ae698a89b0fde92c76f1415294bec612791d67d7917fda280caa65b9d761e2744e8143506d1f417fb2 + languageName: node + linkType: hard + "@typescript-eslint/typescript-estree@npm:5.62.0": version: 5.62.0 resolution: "@typescript-eslint/typescript-estree@npm:5.62.0" @@ -11038,6 +11179,26 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/typescript-estree@npm:8.35.1": + version: 8.35.1 + resolution: "@typescript-eslint/typescript-estree@npm:8.35.1" + dependencies: + "@typescript-eslint/project-service": "npm:8.35.1" + "@typescript-eslint/tsconfig-utils": "npm:8.35.1" + "@typescript-eslint/types": "npm:8.35.1" + "@typescript-eslint/visitor-keys": "npm:8.35.1" + debug: "npm:^4.3.4" + fast-glob: "npm:^3.3.2" + is-glob: "npm:^4.0.3" + minimatch: "npm:^9.0.4" + semver: "npm:^7.6.0" + ts-api-utils: "npm:^2.1.0" + peerDependencies: + typescript: ">=4.8.4 <5.9.0" + checksum: 10c0/6ef093cf9d7a54a323b3d112c78309b2c24c0f94e2c5b61401db9390eb7ffa3ab1da066c497907d58f0bba6986984ac73a478febd91f0bf11598108cc49f6e02 + languageName: node + linkType: hard + "@typescript-eslint/utils@npm:5.62.0, @typescript-eslint/utils@npm:^5.10.0, @typescript-eslint/utils@npm:^5.58.0, @typescript-eslint/utils@npm:^5.62.0": version: 5.62.0 resolution: "@typescript-eslint/utils@npm:5.62.0" @@ -11102,6 +11263,21 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/utils@npm:8.35.1": + version: 8.35.1 + resolution: "@typescript-eslint/utils@npm:8.35.1" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.7.0" + "@typescript-eslint/scope-manager": "npm:8.35.1" + "@typescript-eslint/types": "npm:8.35.1" + "@typescript-eslint/typescript-estree": "npm:8.35.1" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.9.0" + checksum: 10c0/1fa4877caae48961d160b88fc974bb7bfe355ca2f8f6915987427354ca23621698041678adab5964caf9ad62c17b349110136890688f13b10ab1aaad74ae63d9 + languageName: node + linkType: hard + "@typescript-eslint/utils@npm:^8.18.1": version: 8.32.0 resolution: "@typescript-eslint/utils@npm:8.32.0" @@ -11167,6 +11343,16 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/visitor-keys@npm:8.35.1": + version: 8.35.1 + resolution: "@typescript-eslint/visitor-keys@npm:8.35.1" + dependencies: + "@typescript-eslint/types": "npm:8.35.1" + eslint-visitor-keys: "npm:^4.2.1" + checksum: 10c0/55b9eb15842a5d5dca11375e436340c731e01b07190c741d2656330f3e4d88b59e1bf3d677681dd091460be2b6e5f2c42e92faea36f947d25382ead5e8118108 + languageName: node + linkType: hard + "@ungap/structured-clone@npm:^1.2.0": version: 1.3.0 resolution: "@ungap/structured-clone@npm:1.3.0" @@ -11174,6 +11360,27 @@ __metadata: languageName: node linkType: hard +"@unrs/resolver-binding-android-arm-eabi@npm:1.11.0": + version: 1.11.0 + resolution: "@unrs/resolver-binding-android-arm-eabi@npm:1.11.0" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@unrs/resolver-binding-android-arm64@npm:1.11.0": + version: 1.11.0 + resolution: "@unrs/resolver-binding-android-arm64@npm:1.11.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@unrs/resolver-binding-darwin-arm64@npm:1.11.0": + version: 1.11.0 + resolution: "@unrs/resolver-binding-darwin-arm64@npm:1.11.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "@unrs/resolver-binding-darwin-arm64@npm:1.7.2": version: 1.7.2 resolution: "@unrs/resolver-binding-darwin-arm64@npm:1.7.2" @@ -11181,6 +11388,13 @@ __metadata: languageName: node linkType: hard +"@unrs/resolver-binding-darwin-x64@npm:1.11.0": + version: 1.11.0 + resolution: "@unrs/resolver-binding-darwin-x64@npm:1.11.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "@unrs/resolver-binding-darwin-x64@npm:1.7.2": version: 1.7.2 resolution: "@unrs/resolver-binding-darwin-x64@npm:1.7.2" @@ -11188,6 +11402,13 @@ __metadata: languageName: node linkType: hard +"@unrs/resolver-binding-freebsd-x64@npm:1.11.0": + version: 1.11.0 + resolution: "@unrs/resolver-binding-freebsd-x64@npm:1.11.0" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + "@unrs/resolver-binding-freebsd-x64@npm:1.7.2": version: 1.7.2 resolution: "@unrs/resolver-binding-freebsd-x64@npm:1.7.2" @@ -11195,6 +11416,13 @@ __metadata: languageName: node linkType: hard +"@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.11.0": + version: 1.11.0 + resolution: "@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.11.0" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + "@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.7.2": version: 1.7.2 resolution: "@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.7.2" @@ -11202,6 +11430,13 @@ __metadata: languageName: node linkType: hard +"@unrs/resolver-binding-linux-arm-musleabihf@npm:1.11.0": + version: 1.11.0 + resolution: "@unrs/resolver-binding-linux-arm-musleabihf@npm:1.11.0" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + "@unrs/resolver-binding-linux-arm-musleabihf@npm:1.7.2": version: 1.7.2 resolution: "@unrs/resolver-binding-linux-arm-musleabihf@npm:1.7.2" @@ -11209,6 +11444,13 @@ __metadata: languageName: node linkType: hard +"@unrs/resolver-binding-linux-arm64-gnu@npm:1.11.0": + version: 1.11.0 + resolution: "@unrs/resolver-binding-linux-arm64-gnu@npm:1.11.0" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + "@unrs/resolver-binding-linux-arm64-gnu@npm:1.7.2": version: 1.7.2 resolution: "@unrs/resolver-binding-linux-arm64-gnu@npm:1.7.2" @@ -11216,6 +11458,13 @@ __metadata: languageName: node linkType: hard +"@unrs/resolver-binding-linux-arm64-musl@npm:1.11.0": + version: 1.11.0 + resolution: "@unrs/resolver-binding-linux-arm64-musl@npm:1.11.0" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + "@unrs/resolver-binding-linux-arm64-musl@npm:1.7.2": version: 1.7.2 resolution: "@unrs/resolver-binding-linux-arm64-musl@npm:1.7.2" @@ -11223,6 +11472,13 @@ __metadata: languageName: node linkType: hard +"@unrs/resolver-binding-linux-ppc64-gnu@npm:1.11.0": + version: 1.11.0 + resolution: "@unrs/resolver-binding-linux-ppc64-gnu@npm:1.11.0" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + "@unrs/resolver-binding-linux-ppc64-gnu@npm:1.7.2": version: 1.7.2 resolution: "@unrs/resolver-binding-linux-ppc64-gnu@npm:1.7.2" @@ -11230,6 +11486,13 @@ __metadata: languageName: node linkType: hard +"@unrs/resolver-binding-linux-riscv64-gnu@npm:1.11.0": + version: 1.11.0 + resolution: "@unrs/resolver-binding-linux-riscv64-gnu@npm:1.11.0" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + "@unrs/resolver-binding-linux-riscv64-gnu@npm:1.7.2": version: 1.7.2 resolution: "@unrs/resolver-binding-linux-riscv64-gnu@npm:1.7.2" @@ -11237,6 +11500,13 @@ __metadata: languageName: node linkType: hard +"@unrs/resolver-binding-linux-riscv64-musl@npm:1.11.0": + version: 1.11.0 + resolution: "@unrs/resolver-binding-linux-riscv64-musl@npm:1.11.0" + conditions: os=linux & cpu=riscv64 & libc=musl + languageName: node + linkType: hard + "@unrs/resolver-binding-linux-riscv64-musl@npm:1.7.2": version: 1.7.2 resolution: "@unrs/resolver-binding-linux-riscv64-musl@npm:1.7.2" @@ -11244,6 +11514,13 @@ __metadata: languageName: node linkType: hard +"@unrs/resolver-binding-linux-s390x-gnu@npm:1.11.0": + version: 1.11.0 + resolution: "@unrs/resolver-binding-linux-s390x-gnu@npm:1.11.0" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + "@unrs/resolver-binding-linux-s390x-gnu@npm:1.7.2": version: 1.7.2 resolution: "@unrs/resolver-binding-linux-s390x-gnu@npm:1.7.2" @@ -11251,6 +11528,13 @@ __metadata: languageName: node linkType: hard +"@unrs/resolver-binding-linux-x64-gnu@npm:1.11.0": + version: 1.11.0 + resolution: "@unrs/resolver-binding-linux-x64-gnu@npm:1.11.0" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + "@unrs/resolver-binding-linux-x64-gnu@npm:1.7.2": version: 1.7.2 resolution: "@unrs/resolver-binding-linux-x64-gnu@npm:1.7.2" @@ -11258,6 +11542,13 @@ __metadata: languageName: node linkType: hard +"@unrs/resolver-binding-linux-x64-musl@npm:1.11.0": + version: 1.11.0 + resolution: "@unrs/resolver-binding-linux-x64-musl@npm:1.11.0" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + "@unrs/resolver-binding-linux-x64-musl@npm:1.7.2": version: 1.7.2 resolution: "@unrs/resolver-binding-linux-x64-musl@npm:1.7.2" @@ -11265,6 +11556,15 @@ __metadata: languageName: node linkType: hard +"@unrs/resolver-binding-wasm32-wasi@npm:1.11.0": + version: 1.11.0 + resolution: "@unrs/resolver-binding-wasm32-wasi@npm:1.11.0" + dependencies: + "@napi-rs/wasm-runtime": "npm:^0.2.11" + conditions: cpu=wasm32 + languageName: node + linkType: hard + "@unrs/resolver-binding-wasm32-wasi@npm:1.7.2": version: 1.7.2 resolution: "@unrs/resolver-binding-wasm32-wasi@npm:1.7.2" @@ -11274,6 +11574,13 @@ __metadata: languageName: node linkType: hard +"@unrs/resolver-binding-win32-arm64-msvc@npm:1.11.0": + version: 1.11.0 + resolution: "@unrs/resolver-binding-win32-arm64-msvc@npm:1.11.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "@unrs/resolver-binding-win32-arm64-msvc@npm:1.7.2": version: 1.7.2 resolution: "@unrs/resolver-binding-win32-arm64-msvc@npm:1.7.2" @@ -11281,6 +11588,13 @@ __metadata: languageName: node linkType: hard +"@unrs/resolver-binding-win32-ia32-msvc@npm:1.11.0": + version: 1.11.0 + resolution: "@unrs/resolver-binding-win32-ia32-msvc@npm:1.11.0" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + "@unrs/resolver-binding-win32-ia32-msvc@npm:1.7.2": version: 1.7.2 resolution: "@unrs/resolver-binding-win32-ia32-msvc@npm:1.7.2" @@ -11288,6 +11602,13 @@ __metadata: languageName: node linkType: hard +"@unrs/resolver-binding-win32-x64-msvc@npm:1.11.0": + version: 1.11.0 + resolution: "@unrs/resolver-binding-win32-x64-msvc@npm:1.11.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@unrs/resolver-binding-win32-x64-msvc@npm:1.7.2": version: 1.7.2 resolution: "@unrs/resolver-binding-win32-x64-msvc@npm:1.7.2" @@ -12618,6 +12939,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:^8.15.0": + version: 8.15.0 + resolution: "acorn@npm:8.15.0" + bin: + acorn: bin/acorn + checksum: 10c0/dec73ff59b7d6628a01eebaece7f2bdb8bb62b9b5926dcad0f8931f2b8b79c2be21f6c68ac095592adb5adb15831a3635d9343e6a91d028bbe85d564875ec3ec + languageName: node + linkType: hard + "adm-zip@npm:^0.4.16": version: 0.4.16 resolution: "adm-zip@npm:0.4.16" @@ -13016,6 +13346,22 @@ __metadata: languageName: node linkType: hard +"array-includes@npm:^3.1.9": + version: 3.1.9 + resolution: "array-includes@npm:3.1.9" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.4" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.24.0" + es-object-atoms: "npm:^1.1.1" + get-intrinsic: "npm:^1.3.0" + is-string: "npm:^1.1.1" + math-intrinsics: "npm:^1.1.0" + checksum: 10c0/0235fa69078abeac05ac4250699c44996bc6f774a9cbe45db48674ce6bd142f09b327d31482ff75cf03344db4ea03eae23edb862d59378b484b47ed842574856 + languageName: node + linkType: hard + "array-timsort@npm:^1.0.3": version: 1.0.3 resolution: "array-timsort@npm:1.0.3" @@ -13044,7 +13390,7 @@ __metadata: languageName: node linkType: hard -"array.prototype.findlastindex@npm:^1.2.5": +"array.prototype.findlastindex@npm:^1.2.5, array.prototype.findlastindex@npm:^1.2.6": version: 1.2.6 resolution: "array.prototype.findlastindex@npm:1.2.6" dependencies: @@ -13059,7 +13405,7 @@ __metadata: languageName: node linkType: hard -"array.prototype.flat@npm:^1.3.1, array.prototype.flat@npm:^1.3.2": +"array.prototype.flat@npm:^1.3.1, array.prototype.flat@npm:^1.3.2, array.prototype.flat@npm:^1.3.3": version: 1.3.3 resolution: "array.prototype.flat@npm:1.3.3" dependencies: @@ -15604,6 +15950,18 @@ __metadata: languageName: node linkType: hard +"debug@npm:^4.4.1": + version: 4.4.1 + resolution: "debug@npm:4.4.1" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10c0/d2b44bc1afd912b49bb7ebb0d50a860dc93a4dd7d946e8de94abc957bb63726b7dd5aa48c18c2386c379ec024c46692e15ed3ed97d481729f929201e671fcd55 + languageName: node + linkType: hard + "decamelize@npm:^1.2.0": version: 1.2.0 resolution: "decamelize@npm:1.2.0" @@ -16388,6 +16746,68 @@ __metadata: languageName: node linkType: hard +"es-abstract@npm:^1.24.0": + version: 1.24.0 + resolution: "es-abstract@npm:1.24.0" + dependencies: + array-buffer-byte-length: "npm:^1.0.2" + arraybuffer.prototype.slice: "npm:^1.0.4" + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.4" + data-view-buffer: "npm:^1.0.2" + data-view-byte-length: "npm:^1.0.2" + data-view-byte-offset: "npm:^1.0.1" + es-define-property: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.1.1" + es-set-tostringtag: "npm:^2.1.0" + es-to-primitive: "npm:^1.3.0" + function.prototype.name: "npm:^1.1.8" + get-intrinsic: "npm:^1.3.0" + get-proto: "npm:^1.0.1" + get-symbol-description: "npm:^1.1.0" + globalthis: "npm:^1.0.4" + gopd: "npm:^1.2.0" + has-property-descriptors: "npm:^1.0.2" + has-proto: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + hasown: "npm:^2.0.2" + internal-slot: "npm:^1.1.0" + is-array-buffer: "npm:^3.0.5" + is-callable: "npm:^1.2.7" + is-data-view: "npm:^1.0.2" + is-negative-zero: "npm:^2.0.3" + is-regex: "npm:^1.2.1" + is-set: "npm:^2.0.3" + is-shared-array-buffer: "npm:^1.0.4" + is-string: "npm:^1.1.1" + is-typed-array: "npm:^1.1.15" + is-weakref: "npm:^1.1.1" + math-intrinsics: "npm:^1.1.0" + object-inspect: "npm:^1.13.4" + object-keys: "npm:^1.1.1" + object.assign: "npm:^4.1.7" + own-keys: "npm:^1.0.1" + regexp.prototype.flags: "npm:^1.5.4" + safe-array-concat: "npm:^1.1.3" + safe-push-apply: "npm:^1.0.0" + safe-regex-test: "npm:^1.1.0" + set-proto: "npm:^1.0.0" + stop-iteration-iterator: "npm:^1.1.0" + string.prototype.trim: "npm:^1.2.10" + string.prototype.trimend: "npm:^1.0.9" + string.prototype.trimstart: "npm:^1.0.8" + typed-array-buffer: "npm:^1.0.3" + typed-array-byte-length: "npm:^1.0.3" + typed-array-byte-offset: "npm:^1.0.4" + typed-array-length: "npm:^1.0.7" + unbox-primitive: "npm:^1.1.0" + which-typed-array: "npm:^1.1.19" + checksum: 10c0/b256e897be32df5d382786ce8cce29a1dd8c97efbab77a26609bd70f2ed29fbcfc7a31758cb07488d532e7ccccdfca76c1118f2afe5a424cdc05ca007867c318 + languageName: node + linkType: hard + "es-define-property@npm:^1.0.0, es-define-property@npm:^1.0.1": version: 1.0.1 resolution: "es-define-property@npm:1.0.1" @@ -16654,6 +17074,17 @@ __metadata: languageName: node linkType: hard +"eslint-config-prettier@npm:^10.1.5": + version: 10.1.5 + resolution: "eslint-config-prettier@npm:10.1.5" + peerDependencies: + eslint: ">=7.0.0" + bin: + eslint-config-prettier: bin/cli.js + checksum: 10c0/5486255428e4577e8064b40f27db299faf7312b8e43d7b4bc913a6426e6c0f5950cd519cad81ae24e9aecb4002c502bc665c02e3b52efde57af2debcf27dd6e0 + languageName: node + linkType: hard + "eslint-config-prettier@npm:^9.1.0": version: 9.1.0 resolution: "eslint-config-prettier@npm:9.1.0" @@ -16689,6 +17120,21 @@ __metadata: languageName: node linkType: hard +"eslint-import-context@npm:^0.1.8": + version: 0.1.9 + resolution: "eslint-import-context@npm:0.1.9" + dependencies: + get-tsconfig: "npm:^4.10.1" + stable-hash-x: "npm:^0.2.0" + peerDependencies: + unrs-resolver: ^1.0.0 + peerDependenciesMeta: + unrs-resolver: + optional: true + checksum: 10c0/07851103443b70af681c5988e2702e681ff9b956e055e11d4bd9b2322847fa0d9e8da50c18fc7cb1165106b043f34fbd0384d7011c239465c4645c52132e56f3 + languageName: node + linkType: hard + "eslint-import-resolver-alias@npm:^1.1.2": version: 1.1.2 resolution: "eslint-import-resolver-alias@npm:1.1.2" @@ -16733,6 +17179,30 @@ __metadata: languageName: node linkType: hard +"eslint-import-resolver-typescript@npm:^4.4.4": + version: 4.4.4 + resolution: "eslint-import-resolver-typescript@npm:4.4.4" + dependencies: + debug: "npm:^4.4.1" + eslint-import-context: "npm:^0.1.8" + get-tsconfig: "npm:^4.10.1" + is-bun-module: "npm:^2.0.0" + stable-hash-x: "npm:^0.2.0" + tinyglobby: "npm:^0.2.14" + unrs-resolver: "npm:^1.7.11" + peerDependencies: + eslint: "*" + eslint-plugin-import: "*" + eslint-plugin-import-x: "*" + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + checksum: 10c0/3bf8ad77c21660f77a0e455555ab179420f68ae7a132906c85a217ccce51cb6680cf70027cab32a358d193e5b9e476f6ba2e595585242aa97d4f6435ca22104e + languageName: node + linkType: hard + "eslint-module-utils@npm:^2.12.0": version: 2.12.0 resolution: "eslint-module-utils@npm:2.12.0" @@ -16745,6 +17215,18 @@ __metadata: languageName: node linkType: hard +"eslint-module-utils@npm:^2.12.1": + version: 2.12.1 + resolution: "eslint-module-utils@npm:2.12.1" + dependencies: + debug: "npm:^3.2.7" + peerDependenciesMeta: + eslint: + optional: true + checksum: 10c0/6f4efbe7a91ae49bf67b4ab3644cb60bc5bd7db4cb5521de1b65be0847ffd3fb6bce0dd68f0995e1b312d137f768e2a1f842ee26fe73621afa05f850628fdc40 + languageName: node + linkType: hard + "eslint-plugin-eslint-comments@npm:^3.2.0": version: 3.2.0 resolution: "eslint-plugin-eslint-comments@npm:3.2.0" @@ -16800,6 +17282,35 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-import@npm:^2.32.0": + version: 2.32.0 + resolution: "eslint-plugin-import@npm:2.32.0" + dependencies: + "@rtsao/scc": "npm:^1.1.0" + array-includes: "npm:^3.1.9" + array.prototype.findlastindex: "npm:^1.2.6" + array.prototype.flat: "npm:^1.3.3" + array.prototype.flatmap: "npm:^1.3.3" + debug: "npm:^3.2.7" + doctrine: "npm:^2.1.0" + eslint-import-resolver-node: "npm:^0.3.9" + eslint-module-utils: "npm:^2.12.1" + hasown: "npm:^2.0.2" + is-core-module: "npm:^2.16.1" + is-glob: "npm:^4.0.3" + minimatch: "npm:^3.1.2" + object.fromentries: "npm:^2.0.8" + object.groupby: "npm:^1.0.3" + object.values: "npm:^1.2.1" + semver: "npm:^6.3.1" + string.prototype.trimend: "npm:^1.0.9" + tsconfig-paths: "npm:^3.15.0" + peerDependencies: + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + checksum: 10c0/bfb1b8fc8800398e62ddfefbf3638d185286edfed26dfe00875cc2846d954491b4f5112457831588b757fa789384e1ae585f812614c4797f0499fa234fd4a48b + languageName: node + linkType: hard + "eslint-plugin-jest@npm:^25.3.0": version: 25.7.0 resolution: "eslint-plugin-jest@npm:25.7.0" @@ -16915,6 +17426,26 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-prettier@npm:^5.5.1": + version: 5.5.1 + resolution: "eslint-plugin-prettier@npm:5.5.1" + dependencies: + prettier-linter-helpers: "npm:^1.0.0" + synckit: "npm:^0.11.7" + peerDependencies: + "@types/eslint": ">=8.0.0" + eslint: ">=8.0.0" + eslint-config-prettier: ">= 7.0.0 <10.0.0 || >=10.1.0" + prettier: ">=3.0.0" + peerDependenciesMeta: + "@types/eslint": + optional: true + eslint-config-prettier: + optional: true + checksum: 10c0/6ed93faa7d885af2a987d732f7e716e7aaba55e2da2b091e1b16bacf68425bffe91d784803597bd3f3e6201499fabb89ae28a51ac3986659a46e55e729ed2d55 + languageName: node + linkType: hard + "eslint-plugin-react-hooks@npm:^4.3.0, eslint-plugin-react-hooks@npm:^4.6.0": version: 4.6.2 resolution: "eslint-plugin-react-hooks@npm:4.6.2" @@ -17075,6 +17606,16 @@ __metadata: languageName: node linkType: hard +"eslint-scope@npm:^8.4.0": + version: 8.4.0 + resolution: "eslint-scope@npm:8.4.0" + dependencies: + esrecurse: "npm:^4.3.0" + estraverse: "npm:^5.2.0" + checksum: 10c0/407f6c600204d0f3705bd557f81bd0189e69cd7996f408f8971ab5779c0af733d1af2f1412066b40ee1588b085874fc37a2333986c6521669cdbdd36ca5058e0 + languageName: node + linkType: hard + "eslint-visitor-keys@npm:^2.1.0": version: 2.1.0 resolution: "eslint-visitor-keys@npm:2.1.0" @@ -17096,6 +17637,13 @@ __metadata: languageName: node linkType: hard +"eslint-visitor-keys@npm:^4.2.1": + version: 4.2.1 + resolution: "eslint-visitor-keys@npm:4.2.1" + checksum: 10c0/fcd43999199d6740db26c58dbe0c2594623e31ca307e616ac05153c9272f12f1364f5a0b1917a8e962268fdecc6f3622c1c2908b4fcc2e047a106fe6de69dc43 + languageName: node + linkType: hard + "eslint@npm:^8.0.1, eslint@npm:^8.55.0, eslint@npm:^8.57.0": version: 8.57.1 resolution: "eslint@npm:8.57.1" @@ -17194,6 +17742,56 @@ __metadata: languageName: node linkType: hard +"eslint@npm:^9.30.1": + version: 9.30.1 + resolution: "eslint@npm:9.30.1" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.2.0" + "@eslint-community/regexpp": "npm:^4.12.1" + "@eslint/config-array": "npm:^0.21.0" + "@eslint/config-helpers": "npm:^0.3.0" + "@eslint/core": "npm:^0.14.0" + "@eslint/eslintrc": "npm:^3.3.1" + "@eslint/js": "npm:9.30.1" + "@eslint/plugin-kit": "npm:^0.3.1" + "@humanfs/node": "npm:^0.16.6" + "@humanwhocodes/module-importer": "npm:^1.0.1" + "@humanwhocodes/retry": "npm:^0.4.2" + "@types/estree": "npm:^1.0.6" + "@types/json-schema": "npm:^7.0.15" + ajv: "npm:^6.12.4" + chalk: "npm:^4.0.0" + cross-spawn: "npm:^7.0.6" + debug: "npm:^4.3.2" + escape-string-regexp: "npm:^4.0.0" + eslint-scope: "npm:^8.4.0" + eslint-visitor-keys: "npm:^4.2.1" + espree: "npm:^10.4.0" + esquery: "npm:^1.5.0" + esutils: "npm:^2.0.2" + fast-deep-equal: "npm:^3.1.3" + file-entry-cache: "npm:^8.0.0" + find-up: "npm:^5.0.0" + glob-parent: "npm:^6.0.2" + ignore: "npm:^5.2.0" + imurmurhash: "npm:^0.1.4" + is-glob: "npm:^4.0.0" + json-stable-stringify-without-jsonify: "npm:^1.0.1" + lodash.merge: "npm:^4.6.2" + minimatch: "npm:^3.1.2" + natural-compare: "npm:^1.4.0" + optionator: "npm:^0.9.3" + peerDependencies: + jiti: "*" + peerDependenciesMeta: + jiti: + optional: true + bin: + eslint: bin/eslint.js + checksum: 10c0/5a5867078e03ea56a1b6d1ee1548659abc38a6d5136c7ef94e21c5dbeb28e3ed50b15d2e0da25fce85600f6cf7ea7715eae650c41e8ae826c34490e9ec73d5d6 + languageName: node + linkType: hard + "espree@npm:^10.0.1, espree@npm:^10.3.0": version: 10.3.0 resolution: "espree@npm:10.3.0" @@ -17205,6 +17803,17 @@ __metadata: languageName: node linkType: hard +"espree@npm:^10.4.0": + version: 10.4.0 + resolution: "espree@npm:10.4.0" + dependencies: + acorn: "npm:^8.15.0" + acorn-jsx: "npm:^5.3.2" + eslint-visitor-keys: "npm:^4.2.1" + checksum: 10c0/c63fe06131c26c8157b4083313cb02a9a54720a08e21543300e55288c40e06c3fc284bdecf108d3a1372c5934a0a88644c98714f38b6ae8ed272b40d9ea08d6b + languageName: node + linkType: hard + "espree@npm:^9.6.0, espree@npm:^9.6.1": version: 9.6.1 resolution: "espree@npm:9.6.1" @@ -18569,6 +19178,15 @@ __metadata: languageName: node linkType: hard +"get-tsconfig@npm:^4.10.1": + version: 4.10.1 + resolution: "get-tsconfig@npm:4.10.1" + dependencies: + resolve-pkg-maps: "npm:^1.0.0" + checksum: 10c0/7f8e3dabc6a49b747920a800fb88e1952fef871cdf51b79e98db48275a5de6cdaf499c55ee67df5fa6fe7ce65f0063e26de0f2e53049b408c585aa74d39ffa21 + languageName: node + linkType: hard + "ghost-testrpc@npm:^0.0.2": version: 0.0.2 resolution: "ghost-testrpc@npm:0.0.2" @@ -18749,6 +19367,13 @@ __metadata: languageName: node linkType: hard +"globals@npm:^16.3.0": + version: 16.3.0 + resolution: "globals@npm:16.3.0" + checksum: 10c0/c62dc20357d1c0bf2be4545d6c4141265d1a229bf1c3294955efb5b5ef611145391895e3f2729f8603809e81b30b516c33e6c2597573844449978606aad6eb38 + languageName: node + linkType: hard + "globalthis@npm:^1.0.4": version: 1.0.4 resolution: "globalthis@npm:1.0.4" @@ -19933,7 +20558,7 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.1.0, is-core-module@npm:^2.13.0, is-core-module@npm:^2.15.1, is-core-module@npm:^2.16.0": +"is-core-module@npm:^2.1.0, is-core-module@npm:^2.13.0, is-core-module@npm:^2.15.1, is-core-module@npm:^2.16.0, is-core-module@npm:^2.16.1": version: 2.16.1 resolution: "is-core-module@npm:2.16.1" dependencies: @@ -20104,6 +20729,13 @@ __metadata: languageName: node linkType: hard +"is-negative-zero@npm:^2.0.3": + version: 2.0.3 + resolution: "is-negative-zero@npm:2.0.3" + checksum: 10c0/bcdcf6b8b9714063ffcfa9929c575ac69bfdabb8f4574ff557dfc086df2836cf07e3906f5bbc4f2a5c12f8f3ba56af640c843cdfc74da8caed86c7c7d66fd08e + languageName: node + linkType: hard + "is-node-process@npm:^1.2.0": version: 1.2.0 resolution: "is-node-process@npm:1.2.0" @@ -20263,7 +20895,7 @@ __metadata: languageName: node linkType: hard -"is-weakref@npm:^1.0.2, is-weakref@npm:^1.1.0": +"is-weakref@npm:^1.0.2, is-weakref@npm:^1.1.0, is-weakref@npm:^1.1.1": version: 1.1.1 resolution: "is-weakref@npm:1.1.1" dependencies: @@ -22925,6 +23557,15 @@ __metadata: languageName: node linkType: hard +"napi-postinstall@npm:^0.3.0": + version: 0.3.0 + resolution: "napi-postinstall@npm:0.3.0" + bin: + napi-postinstall: lib/cli.js + checksum: 10c0/dd5b295a0c7e669dda81a553b5defcdbe56805beb4279cd0df973454f072c083f574d399c4c825eece128113159658b031b4ac4b9dcb5735c5e34ddaefd3a3ca + languageName: node + linkType: hard + "native-fetch@npm:^4.0.2": version: 4.0.2 resolution: "native-fetch@npm:4.0.2" @@ -23378,7 +24019,7 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.13.3": +"object-inspect@npm:^1.13.3, object-inspect@npm:^1.13.4": version: 1.13.4 resolution: "object-inspect@npm:1.13.4" checksum: 10c0/d7f8711e803b96ea3191c745d6f8056ce1f2496e530e6a19a0e92d89b0fa3c76d910c31f0aa270432db6bd3b2f85500a376a83aaba849a8d518c8845b3211692 @@ -24431,6 +25072,27 @@ __metadata: languageName: node linkType: hard +"pino@npm:^9.7.0": + version: 9.7.0 + resolution: "pino@npm:9.7.0" + dependencies: + atomic-sleep: "npm:^1.0.0" + fast-redact: "npm:^3.1.1" + on-exit-leak-free: "npm:^2.1.0" + pino-abstract-transport: "npm:^2.0.0" + pino-std-serializers: "npm:^7.0.0" + process-warning: "npm:^5.0.0" + quick-format-unescaped: "npm:^4.0.3" + real-require: "npm:^0.2.0" + safe-stable-stringify: "npm:^2.3.1" + sonic-boom: "npm:^4.0.1" + thread-stream: "npm:^3.0.0" + bin: + pino: bin.js + checksum: 10c0/c7f8a83a9a9d728b4eff6d0f4b9367f031c91bcaa5806fbf0eedcc8e77faba593d59baf11a8fba0dd1c778bb17ca7ed01418ac1df4ec129faeedd4f3ecaff66f + languageName: node + linkType: hard + "pirates@npm:^4.0.4": version: 4.0.7 resolution: "pirates@npm:4.0.7" @@ -24710,6 +25372,13 @@ __metadata: languageName: node linkType: hard +"process-warning@npm:^5.0.0": + version: 5.0.0 + resolution: "process-warning@npm:5.0.0" + checksum: 10c0/941f48863d368ec161e0b5890ba0c6af94170078f3d6b5e915c19b36fb59edb0dc2f8e834d25e0d375a8bf368a49d490f080508842168832b93489d17843ec29 + languageName: node + linkType: hard + "process@npm:^0.11.10": version: 0.11.10 resolution: "process@npm:0.11.10" @@ -25508,7 +26177,7 @@ __metadata: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.5.3": +"regexp.prototype.flags@npm:^1.5.3, regexp.prototype.flags@npm:^1.5.4": version: 1.5.4 resolution: "regexp.prototype.flags@npm:1.5.4" dependencies: @@ -26959,6 +27628,13 @@ __metadata: languageName: node linkType: hard +"stable-hash-x@npm:^0.2.0": + version: 0.2.0 + resolution: "stable-hash-x@npm:0.2.0" + checksum: 10c0/c757df58366ee4bb266a9486b8932eab7c1ba730469eaf4b68d2dee404814e9f84089c44c9b5205f8c7d99a0ab036cce2af69139ce5ed44b635923c011a8aea8 + languageName: node + linkType: hard + "stable-hash@npm:^0.0.5": version: 0.0.5 resolution: "stable-hash@npm:0.0.5" @@ -27005,6 +27681,16 @@ __metadata: languageName: node linkType: hard +"stop-iteration-iterator@npm:^1.1.0": + version: 1.1.0 + resolution: "stop-iteration-iterator@npm:1.1.0" + dependencies: + es-errors: "npm:^1.3.0" + internal-slot: "npm:^1.1.0" + checksum: 10c0/de4e45706bb4c0354a4b1122a2b8cc45a639e86206807ce0baf390ee9218d3ef181923fa4d2b67443367c491aa255c5fbaa64bb74648e3c5b48299928af86c09 + languageName: node + linkType: hard + "stream-browserify@npm:^3.0.0": version: 3.0.0 resolution: "stream-browserify@npm:3.0.0" @@ -27785,6 +28471,16 @@ __metadata: languageName: node linkType: hard +"tinyglobby@npm:^0.2.14": + version: 0.2.14 + resolution: "tinyglobby@npm:0.2.14" + dependencies: + fdir: "npm:^6.4.4" + picomatch: "npm:^4.0.2" + checksum: 10c0/f789ed6c924287a9b7d3612056ed0cda67306cd2c80c249fd280cf1504742b12583a2089b61f4abbd24605f390809017240e250241f09938054c9b363e51c0a6 + languageName: node + linkType: hard + "tinypool@npm:^1.0.2": version: 1.0.2 resolution: "tinypool@npm:1.0.2" @@ -28469,6 +29165,20 @@ __metadata: languageName: node linkType: hard +"typescript-eslint@npm:^8.35.1": + version: 8.35.1 + resolution: "typescript-eslint@npm:8.35.1" + dependencies: + "@typescript-eslint/eslint-plugin": "npm:8.35.1" + "@typescript-eslint/parser": "npm:8.35.1" + "@typescript-eslint/utils": "npm:8.35.1" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.9.0" + checksum: 10c0/17781138f59c241658db96f793b745883e427bc48530cec2e81ad0a7941b557ddd2eede290d2c3d254f23d59a36ab1bf2cd1e705797e0db36d0ccd61c1a4299e + languageName: node + linkType: hard + "typescript@npm:5.7.2": version: 5.7.2 resolution: "typescript@npm:5.7.2" @@ -28836,6 +29546,73 @@ __metadata: languageName: node linkType: hard +"unrs-resolver@npm:^1.7.11": + version: 1.11.0 + resolution: "unrs-resolver@npm:1.11.0" + dependencies: + "@unrs/resolver-binding-android-arm-eabi": "npm:1.11.0" + "@unrs/resolver-binding-android-arm64": "npm:1.11.0" + "@unrs/resolver-binding-darwin-arm64": "npm:1.11.0" + "@unrs/resolver-binding-darwin-x64": "npm:1.11.0" + "@unrs/resolver-binding-freebsd-x64": "npm:1.11.0" + "@unrs/resolver-binding-linux-arm-gnueabihf": "npm:1.11.0" + "@unrs/resolver-binding-linux-arm-musleabihf": "npm:1.11.0" + "@unrs/resolver-binding-linux-arm64-gnu": "npm:1.11.0" + "@unrs/resolver-binding-linux-arm64-musl": "npm:1.11.0" + "@unrs/resolver-binding-linux-ppc64-gnu": "npm:1.11.0" + "@unrs/resolver-binding-linux-riscv64-gnu": "npm:1.11.0" + "@unrs/resolver-binding-linux-riscv64-musl": "npm:1.11.0" + "@unrs/resolver-binding-linux-s390x-gnu": "npm:1.11.0" + "@unrs/resolver-binding-linux-x64-gnu": "npm:1.11.0" + "@unrs/resolver-binding-linux-x64-musl": "npm:1.11.0" + "@unrs/resolver-binding-wasm32-wasi": "npm:1.11.0" + "@unrs/resolver-binding-win32-arm64-msvc": "npm:1.11.0" + "@unrs/resolver-binding-win32-ia32-msvc": "npm:1.11.0" + "@unrs/resolver-binding-win32-x64-msvc": "npm:1.11.0" + napi-postinstall: "npm:^0.3.0" + dependenciesMeta: + "@unrs/resolver-binding-android-arm-eabi": + optional: true + "@unrs/resolver-binding-android-arm64": + optional: true + "@unrs/resolver-binding-darwin-arm64": + optional: true + "@unrs/resolver-binding-darwin-x64": + optional: true + "@unrs/resolver-binding-freebsd-x64": + optional: true + "@unrs/resolver-binding-linux-arm-gnueabihf": + optional: true + "@unrs/resolver-binding-linux-arm-musleabihf": + optional: true + "@unrs/resolver-binding-linux-arm64-gnu": + optional: true + "@unrs/resolver-binding-linux-arm64-musl": + optional: true + "@unrs/resolver-binding-linux-ppc64-gnu": + optional: true + "@unrs/resolver-binding-linux-riscv64-gnu": + optional: true + "@unrs/resolver-binding-linux-riscv64-musl": + optional: true + "@unrs/resolver-binding-linux-s390x-gnu": + optional: true + "@unrs/resolver-binding-linux-x64-gnu": + optional: true + "@unrs/resolver-binding-linux-x64-musl": + optional: true + "@unrs/resolver-binding-wasm32-wasi": + optional: true + "@unrs/resolver-binding-win32-arm64-msvc": + optional: true + "@unrs/resolver-binding-win32-ia32-msvc": + optional: true + "@unrs/resolver-binding-win32-x64-msvc": + optional: true + checksum: 10c0/5883c0621e3a57f21426092a99783ecd88e795493a0ab013a10013ddd8fe355d67a88ac37a7e8ae0f3617d52e7f688b95d9b2807ac605b22c174a8bd6d85fc04 + languageName: node + linkType: hard + "unstorage@npm:^1.9.0": version: 1.16.0 resolution: "unstorage@npm:1.16.0" @@ -30026,7 +30803,7 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.18, which-typed-array@npm:^1.1.2": +"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.18, which-typed-array@npm:^1.1.19, which-typed-array@npm:^1.1.2": version: 1.1.19 resolution: "which-typed-array@npm:1.1.19" dependencies: From ac966583624dcda4ae243f9b311699e632d5f260 Mon Sep 17 00:00:00 2001 From: Dmitry Nechay Date: Mon, 7 Jul 2025 19:13:42 +0300 Subject: [PATCH 3/7] fix: logger main entry --- packages/libs/logger/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/libs/logger/package.json b/packages/libs/logger/package.json index 19ad4f0b7f..a78ada3f4d 100644 --- a/packages/libs/logger/package.json +++ b/packages/libs/logger/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "description": "Unified logging package for HUMAN Protocol", "type": "commonjs", - "main": "dist/index.ts", + "main": "dist/index.js", "types": "dist/index.d.ts", "files": [ "dist/**/*" From a3014a20622634bc3ec9bf79227666bd979ffe8c Mon Sep 17 00:00:00 2001 From: Dmitry Nechay Date: Mon, 7 Jul 2025 20:24:23 +0300 Subject: [PATCH 4/7] feat: use logger lib in RepO --- .dockerignore | 1 + package.json | 3 +- .../apps/reputation-oracle/server/Dockerfile | 1 + .../reputation-oracle/server/package.json | 3 +- .../server/src/common/constants/index.ts | 1 + .../server/src/logger/README.md | 86 ------------- .../server/src/logger/__mocks__/index.ts | 2 +- .../server/src/logger/abstract-logger.ts | 113 ------------------ .../server/src/logger/index.ts | 8 +- .../server/src/logger/nest-logger.ts | 93 -------------- .../server/src/logger/pino-logger.ts | 63 ---------- .../server/src/logger/types.ts | 38 ------ yarn.lock | 33 +---- 13 files changed, 13 insertions(+), 432 deletions(-) delete mode 100644 packages/apps/reputation-oracle/server/src/logger/README.md delete mode 100644 packages/apps/reputation-oracle/server/src/logger/abstract-logger.ts delete mode 100644 packages/apps/reputation-oracle/server/src/logger/nest-logger.ts delete mode 100644 packages/apps/reputation-oracle/server/src/logger/pino-logger.ts delete mode 100644 packages/apps/reputation-oracle/server/src/logger/types.ts diff --git a/.dockerignore b/.dockerignore index 1087f90813..b9aa3ae03a 100644 --- a/.dockerignore +++ b/.dockerignore @@ -9,6 +9,7 @@ scripts **/node_modules **/build **/dist +**/tsconfig.tsbuildinfo # Core package artifacts # Hardhat files diff --git a/package.json b/package.json index e101aba252..e767ca9cea 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,8 @@ "lint": "yarn workspaces foreach --all -p run lint", "build:core": "yarn workspace @human-protocol/core build", "build:sdk": "yarn workspace @human-protocol/sdk build", - "build:libs": "yarn build:core && yarn build:sdk", + "build:logger": "yarn workspace @human-protocol/logger build", + "build:libs": "yarn build:core && yarn build:sdk && yarn build:logger", "docker:infra-up": "make -C ./docker-setup -f Makefile.dev infra-up", "docker:infra-stop": "make -C ./docker-setup -f Makefile.dev infra-stop", "docker:infra-down": "make -C ./docker-setup -f Makefile.dev infra-down", diff --git a/packages/apps/reputation-oracle/server/Dockerfile b/packages/apps/reputation-oracle/server/Dockerfile index dff82f8a3e..ef91c55cd5 100644 --- a/packages/apps/reputation-oracle/server/Dockerfile +++ b/packages/apps/reputation-oracle/server/Dockerfile @@ -16,6 +16,7 @@ COPY ${APP_PATH}/package.json ./${APP_PATH}/ # so we need to copy and build them COPY packages/core ./packages/core COPY packages/sdk ./packages/sdk +COPY packages/libs ./packages/libs RUN yarn install diff --git a/packages/apps/reputation-oracle/server/package.json b/packages/apps/reputation-oracle/server/package.json index bbdecfb4fd..a1fb2f451c 100644 --- a/packages/apps/reputation-oracle/server/package.json +++ b/packages/apps/reputation-oracle/server/package.json @@ -29,6 +29,7 @@ }, "dependencies": { "@human-protocol/core": "workspace:*", + "@human-protocol/logger": "workspace:*", "@human-protocol/sdk": "workspace:*", "@nestjs/axios": "^3.1.3", "@nestjs/common": "^10.2.7", @@ -62,7 +63,6 @@ "passport": "^0.7.0", "passport-jwt": "^4.0.1", "pg": "8.13.1", - "pino": "^9.6.0", "reflect-metadata": "^0.2.2", "rxjs": "^7.2.0", "typeorm": "^0.3.16", @@ -91,7 +91,6 @@ "eslint-plugin-prettier": "^5.2.1", "jest": "29.7.0", "nock": "^14.0.3", - "pino-pretty": "^13.0.0", "prettier": "^3.4.2", "source-map-support": "^0.5.20", "supertest": "^7.0.0", diff --git a/packages/apps/reputation-oracle/server/src/common/constants/index.ts b/packages/apps/reputation-oracle/server/src/common/constants/index.ts index a2e57e2cc9..637d783de0 100644 --- a/packages/apps/reputation-oracle/server/src/common/constants/index.ts +++ b/packages/apps/reputation-oracle/server/src/common/constants/index.ts @@ -1,3 +1,4 @@ +export const SERVICE_NAME = 'reputation-oracle'; export const DATABASE_SCHEMA_NAME = 'hmt'; export const JWT_STRATEGY_NAME = 'jwt-http'; diff --git a/packages/apps/reputation-oracle/server/src/logger/README.md b/packages/apps/reputation-oracle/server/src/logger/README.md deleted file mode 100644 index 5a8c41198d..0000000000 --- a/packages/apps/reputation-oracle/server/src/logger/README.md +++ /dev/null @@ -1,86 +0,0 @@ -Custom logger implementation for use in Node.js HUMAN apps. - -Provides standartized API and writes logs in pre-defined JSON format: -```json -{ - "level": "debug", - "message": "Some info about error", - "timestamp": 1738937400037, - "error": { - "kind": "CustomError", - "message": "Message from custom error", - "stack": "CustomError: Message from custom error\n at process.processTicksAndRejections (node:internal/process/task_queues:95:5)", - "customErrorProp": "error-detail-prop" - } - // ...merging meta -} -``` -:information_source: Error formatting is done only for error argument and "error" context property. - -Pretty-printing is enabled for local/development environment by default. - -### Usage examples -At the moment preferred underlying logger is `pino`. Corresponding file exports `createLogger` factory function that is used to create pre-configured default logger intance, that has service/app name and environment bound to all log messages. - -Import the pre-defined logger -```ts -import logger from '/logger'; -``` -then use it as per API contract: with log message first and any useful detail in log meta -:information_source: If meta is not a plain object and not an error - it is being logged as "meta" property -```ts -// to log simple message -logger.info('Info without any context'); - -// to log message with some context info -loger.info('New user registered', { - userAgent, - country, - ip, - email, -}); - -// to log error -logger.error('Something went wrong', error); - -// or error with some extra context -logger.error('Error updating some entity', { - error, - entityId: 42, - ...extra -}); - -// to log anything -logger.debug('Show me value', someValue); -``` - -If needed, you can create named logger -```ts -const utilsLogger = logger.child({ name: 'UtilsLogger' }) -// .... -utilsLogger.debug('input params', args); -/* -{ - "level": "debug", - "logger": "UtilsLogger", - "message": "input params", - "timestamp": 1738937400037 - ... -} -*/ -``` -or bind a "context" (or any other) prop to it -```ts -const contextLogger = logger.child({ context: 'SomeService' }) -// .... -contextLogger.info('Helpful info', context); -/* -{ - "level": "debug", - "context": "SomeService", - "message": "Helpful info", - "timestamp": 1738937400037, - ... -} -*/ -``` \ No newline at end of file diff --git a/packages/apps/reputation-oracle/server/src/logger/__mocks__/index.ts b/packages/apps/reputation-oracle/server/src/logger/__mocks__/index.ts index f4017058d8..bc3cb79069 100644 --- a/packages/apps/reputation-oracle/server/src/logger/__mocks__/index.ts +++ b/packages/apps/reputation-oracle/server/src/logger/__mocks__/index.ts @@ -1,4 +1,4 @@ -import { Logger } from '../types'; +import type { Logger } from '@human-protocol/logger'; const logger: Logger = { child: () => logger, diff --git a/packages/apps/reputation-oracle/server/src/logger/abstract-logger.ts b/packages/apps/reputation-oracle/server/src/logger/abstract-logger.ts deleted file mode 100644 index 2bf1f7f493..0000000000 --- a/packages/apps/reputation-oracle/server/src/logger/abstract-logger.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { ChildBindings, Logger, LogLevel, LogMeta, LogRecord } from './types'; - -function isPlainObject(maybeObj: unknown): maybeObj is LogMeta { - return Object.prototype.toString.call(maybeObj) === '[object Object]'; -} - -function isValidLoggerName(maybeName: unknown): maybeName is string { - return typeof maybeName === 'string' && maybeName.length > 0; -} - -function serializeError(error: Error) { - const { name, message, stack, ...errorProps } = error; - - return { - kind: name, - message, - stack, - ...errorProps, - }; -} - -abstract class LoggerWrapper implements Logger { - protected readonly bindings: LogMeta; - private readonly name?: string; - - constructor(bindings: LogMeta = {}) { - if (!isPlainObject(bindings)) { - throw new Error('Logger bindings must be a plain object'); - } - - const { name, ..._bindings } = bindings; - - this.bindings = _bindings; - - if (name && isValidLoggerName(name)) { - this.name = name; - } - } - - debug(message: string, errorOrMeta?: unknown): void { - this.log(LogLevel.DEBUG, message, errorOrMeta); - } - - info(message: string, errorOrMeta?: unknown): void { - this.log(LogLevel.INFO, message, errorOrMeta); - } - - warn(message: string, errorOrMeta?: unknown): void { - this.log(LogLevel.WARN, message, errorOrMeta); - } - - error(message: string, errorOrMeta?: unknown): void { - this.log(LogLevel.ERROR, message, errorOrMeta); - } - - child(bindings: ChildBindings): Logger { - if (!isPlainObject(bindings)) { - throw new Error('Log bindings required for child logger'); - } - - return this.createChild(bindings); - } - - protected abstract createChild(bindings: LogMeta): Logger; - - private log(level: LogLevel, message: string, errorOrMeta?: unknown): void { - const logMessage = typeof message === 'string' ? message : `${message}`; - - let metaArgument: LogMeta; - if (errorOrMeta === undefined) { - metaArgument = {}; - } else if (errorOrMeta instanceof Error) { - metaArgument = { - error: serializeError(errorOrMeta), - }; - } else if (isPlainObject(errorOrMeta)) { - const { error, ...meta } = errorOrMeta; - metaArgument = meta; - if (error instanceof Error) { - Object.assign(metaArgument, { - error: serializeError(error), - }); - } else if (error !== undefined) { - metaArgument.error = error; - } - } else { - /** - * Fallback in case somebody uses log in a wrong way - */ - metaArgument = { - meta: errorOrMeta, - }; - } - - const enrichedMeta: LogRecord = { - ...this.bindings, - ...metaArgument, - level, - message: logMessage, - timestamp: Date.now(), - }; - - if (this.name) { - enrichedMeta.logger = this.name; - } - - this.callLogger(level, enrichedMeta); - } - - protected abstract callLogger(level: LogLevel, log: LogRecord): void; -} - -export default LoggerWrapper; diff --git a/packages/apps/reputation-oracle/server/src/logger/index.ts b/packages/apps/reputation-oracle/server/src/logger/index.ts index 4509f80573..fe8e9df382 100644 --- a/packages/apps/reputation-oracle/server/src/logger/index.ts +++ b/packages/apps/reputation-oracle/server/src/logger/index.ts @@ -1,6 +1,6 @@ -import { createLogger } from './pino-logger'; -import NestLogger from './nest-logger'; -import { LogLevel } from './types'; +import { createLogger, NestLogger, LogLevel } from '@human-protocol/logger'; + +import { SERVICE_NAME } from '../common/constants'; import Environment from '../utils/environment'; const isDevelopment = Environment.isDevelopment(); @@ -14,7 +14,7 @@ const defaultLogger = createLogger( }, { environment: Environment.name, - service: 'reputation-oracle', + service: SERVICE_NAME, }, ); diff --git a/packages/apps/reputation-oracle/server/src/logger/nest-logger.ts b/packages/apps/reputation-oracle/server/src/logger/nest-logger.ts deleted file mode 100644 index a8347d52b7..0000000000 --- a/packages/apps/reputation-oracle/server/src/logger/nest-logger.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { LoggerService } from '@nestjs/common'; -import { Logger, LogLevel, LogMeta } from './types'; - -class NestLogger implements LoggerService { - constructor(private readonly loggerInstance: Logger) {} - - log(message: any, ...optionalParams: any[]) { - this.callLogger(LogLevel.INFO, message, ...optionalParams); - } - - warn(message: any, ...optionalParams: any[]) { - this.callLogger(LogLevel.WARN, message, ...optionalParams); - } - - error(message: any, ...optionalParams: any[]) { - let _message: any; - let _optionalParams: any[]; - - const firstParam = optionalParams[0] || ''; - if ( - typeof message === 'string' && - typeof firstParam === 'string' && - /\n\s+at\s.+:\d+:\d+/.test(firstParam) - ) { - /** - * It's a case when logger called as - * logger.error(error.message, error.stack) - */ - const error = new Error(message); - error.stack = firstParam; - - _message = error; - _optionalParams = optionalParams.slice(1); - } else { - _message = message; - if (optionalParams.length === 2 && optionalParams[0] === undefined) { - /** - * It's a case when logger called as - * logger.error(message) - * - * In this case Nest adds `undefined` "stack" - * as second param - */ - _optionalParams = [optionalParams[1]]; - } else { - _optionalParams = optionalParams; - } - } - - this.callLogger(LogLevel.ERROR, _message, ..._optionalParams); - } - - private callLogger( - level: LogLevel, - message: unknown, - ...optionalParams: unknown[] - ): void { - const logMeta: LogMeta = {}; - - let params: unknown[] = []; - // Nest always add "context" as last param - if (optionalParams.length) { - const lastParam = optionalParams.at(-1); - if (typeof lastParam === 'string') { - logMeta.context = lastParam; - params = optionalParams.slice(0, -1); - } else { - params = optionalParams; - } - } - - // Case when Nest logs something other than context - if (params.length) { - logMeta.messages = params; - } - - let _message = `unspecified nest ${level}`.toUpperCase(); - // Case when Nest logs just one argument: object - if (typeof message === 'object') { - if (message instanceof Error) { - logMeta.error = message; - } else { - Object.assign(logMeta, message); - } - } else if (message !== undefined) { - _message = message.toString(); - } - - this.loggerInstance[level](_message, logMeta); - } -} - -export default NestLogger; diff --git a/packages/apps/reputation-oracle/server/src/logger/pino-logger.ts b/packages/apps/reputation-oracle/server/src/logger/pino-logger.ts deleted file mode 100644 index 09d0a055df..0000000000 --- a/packages/apps/reputation-oracle/server/src/logger/pino-logger.ts +++ /dev/null @@ -1,63 +0,0 @@ -import pino from 'pino'; -import LoggerWrapper from './abstract-logger'; -import { - ChildBindings, - LogMeta, - Logger, - LogLevel, - LoggerOptions, - LogRecord, -} from './types'; - -export class WrappedPino extends LoggerWrapper { - constructor( - private readonly pinoLogger: pino.Logger, - bindings?: LogMeta, - ) { - super(bindings); - } - - protected createChild(bindings: ChildBindings): Logger { - return new WrappedPino(this.pinoLogger, { - ...this.bindings, - ...bindings, - }); - } - - protected callLogger(level: LogLevel, log: LogRecord): void { - const _log: Partial = { ...log }; - - delete _log.level; - - this.pinoLogger[level](_log); - } -} - -const pinoLogLevelFormatter = (label: string) => ({ level: label }); - -export function createLogger( - { name, level, pretty, disabled }: LoggerOptions, - bindings: LogMeta = {}, -): WrappedPino { - const pinoLogger = pino({ - base: null, - level: level || LogLevel.INFO, - enabled: disabled !== true, - timestamp: false, - formatters: { - level: pinoLogLevelFormatter, - }, - transport: pretty - ? { - target: 'pino-pretty', - options: { - messageKey: 'message', - translateTime: "SYS:yyyy-mm-dd, HH:MM:ss'Z'", - colorize: true, - }, - } - : undefined, - }); - - return new WrappedPino(pinoLogger, { ...bindings, name }); -} diff --git a/packages/apps/reputation-oracle/server/src/logger/types.ts b/packages/apps/reputation-oracle/server/src/logger/types.ts deleted file mode 100644 index 4c5eb3fe1f..0000000000 --- a/packages/apps/reputation-oracle/server/src/logger/types.ts +++ /dev/null @@ -1,38 +0,0 @@ -export enum LogLevel { - DEBUG = 'debug', - INFO = 'info', - WARN = 'warn', - ERROR = 'error', -} - -export type LogMeta = Record; - -export type LogRecord = { - logger?: string; - level: `${LogLevel}`; - message: string; - timestamp: number; -} & LogMeta; - -type LogFn = { - (message: string, meta?: LogMeta): void; - (message: string, error: Error): void; - (message: string, errorOrMeta?: unknown): void; -}; - -export type ChildBindings = { name?: string } & LogMeta; - -export interface Logger { - debug: LogFn; - info: LogFn; - warn: LogFn; - error: LogFn; - child: (bindings: ChildBindings) => Logger; -} - -export type LoggerOptions = { - name?: string; - pretty?: boolean; - level?: `${LogLevel}`; - disabled?: boolean; -}; diff --git a/yarn.lock b/yarn.lock index 95f39e517a..6c338b2bf7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4476,7 +4476,7 @@ __metadata: languageName: unknown linkType: soft -"@human-protocol/logger@workspace:packages/libs/logger": +"@human-protocol/logger@workspace:*, @human-protocol/logger@workspace:packages/libs/logger": version: 0.0.0-use.local resolution: "@human-protocol/logger@workspace:packages/libs/logger" dependencies: @@ -4505,6 +4505,7 @@ __metadata: "@faker-js/faker": "npm:^9.4.0" "@golevelup/ts-jest": "npm:^0.6.1" "@human-protocol/core": "workspace:*" + "@human-protocol/logger": "workspace:*" "@human-protocol/sdk": "workspace:*" "@nestjs/axios": "npm:^3.1.3" "@nestjs/cli": "npm:^10.3.2" @@ -4556,8 +4557,6 @@ __metadata: passport: "npm:^0.7.0" passport-jwt: "npm:^4.0.1" pg: "npm:8.13.1" - pino: "npm:^9.6.0" - pino-pretty: "npm:^13.0.0" prettier: "npm:^3.4.2" reflect-metadata: "npm:^0.2.2" rxjs: "npm:^7.2.0" @@ -25051,27 +25050,6 @@ __metadata: languageName: node linkType: hard -"pino@npm:^9.6.0": - version: 9.6.0 - resolution: "pino@npm:9.6.0" - dependencies: - atomic-sleep: "npm:^1.0.0" - fast-redact: "npm:^3.1.1" - on-exit-leak-free: "npm:^2.1.0" - pino-abstract-transport: "npm:^2.0.0" - pino-std-serializers: "npm:^7.0.0" - process-warning: "npm:^4.0.0" - quick-format-unescaped: "npm:^4.0.3" - real-require: "npm:^0.2.0" - safe-stable-stringify: "npm:^2.3.1" - sonic-boom: "npm:^4.0.1" - thread-stream: "npm:^3.0.0" - bin: - pino: bin.js - checksum: 10c0/bcd1e9d9b301bea13b95689ca9ad7105ae9451928fb6c0b67b3e58c5fe37cea1d40665f3d6641e3da00be0bbc17b89031e67abbc8ea6aac6164f399309fd78e7 - languageName: node - linkType: hard - "pino@npm:^9.7.0": version: 9.7.0 resolution: "pino@npm:9.7.0" @@ -25365,13 +25343,6 @@ __metadata: languageName: node linkType: hard -"process-warning@npm:^4.0.0": - version: 4.0.1 - resolution: "process-warning@npm:4.0.1" - checksum: 10c0/577a268b9fd5c3d9f6dbb4348220099391d830905642845d591e7ee8b1e45043d98b7b9826a3c1379bdd1686cdfe0f6cf349cb812affc5853b662e6a9896579e - languageName: node - linkType: hard - "process-warning@npm:^5.0.0": version: 5.0.0 resolution: "process-warning@npm:5.0.0" From 3f60f42ca30592ce446caa994a0f7bdbeecf1c9e Mon Sep 17 00:00:00 2001 From: Dmitry Nechay Date: Mon, 7 Jul 2025 20:24:43 +0300 Subject: [PATCH 5/7] chore: do not use incremental build in logger TS --- packages/libs/logger/tsconfig.json | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/libs/logger/tsconfig.json b/packages/libs/logger/tsconfig.json index c8d725694f..701e95b085 100644 --- a/packages/libs/logger/tsconfig.json +++ b/packages/libs/logger/tsconfig.json @@ -1,6 +1,5 @@ { "compilerOptions": { - "incremental": true, "target": "es2022", "lib": ["ES2022"], "module": "node18", From 03139be42aa180725041356d538f194fe05f585a Mon Sep 17 00:00:00 2001 From: Dmitry Nechay Date: Mon, 7 Jul 2025 20:31:23 +0300 Subject: [PATCH 6/7] feat: add logger cd --- .github/workflows/cd-logger.yaml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 .github/workflows/cd-logger.yaml diff --git a/.github/workflows/cd-logger.yaml b/.github/workflows/cd-logger.yaml new file mode 100644 index 0000000000..f5f77a09c4 --- /dev/null +++ b/.github/workflows/cd-logger.yaml @@ -0,0 +1,23 @@ +name: Logger NPM publish + +on: + workflow_dispatch: + +jobs: + logger-publish: + name: Logger NPM Publish + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version-file: .nvmrc + cache: yarn + - name: Install dependencies + run: yarn install --immutable + - name: Build logger package + run: yarn build:logger + - name: Publish package + run: yarn workspace @human-protocol/logger npm publish --access public + env: + YARN_NPM_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} From 1007b30bb8bc0475c0b15abe536df22b046cd333 Mon Sep 17 00:00:00 2001 From: Dmitry Nechay Date: Tue, 8 Jul 2025 13:42:04 +0300 Subject: [PATCH 7/7] chore: add permissions to logger cd action --- .github/workflows/cd-logger.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/cd-logger.yaml b/.github/workflows/cd-logger.yaml index f5f77a09c4..02366d03ce 100644 --- a/.github/workflows/cd-logger.yaml +++ b/.github/workflows/cd-logger.yaml @@ -1,5 +1,8 @@ name: Logger NPM publish +permissions: + contents: read + on: workflow_dispatch: