@lokalise/node-core 14.6.0 → 14.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -93,8 +93,60 @@ module.exports = __toCommonJS(index_exports);
93
93
 
94
94
  // src/errors/PublicNonRecoverableError.ts
95
95
  var import_types = require("util/types");
96
- var PUBLIC_NON_RECOVERABLE_ERROR_SYMBOL = Symbol.for("PUBLIC_NON_RECOVERABLE_ERROR_KEY");
97
- var PublicNonRecoverableError = class extends Error {
96
+
97
+ // src/errors/EnhancedError.ts
98
+ var PROTOTYPE_PATH_DELIMITER = ".";
99
+ var getPrototypeNamesPostError = (input) => {
100
+ const names = [];
101
+ const isFunction = typeof input === "function";
102
+ let current = isFunction ? input : Object.getPrototypeOf(input);
103
+ while (current !== null) {
104
+ const name = isFunction ? current.name : current.constructor.name;
105
+ if (!name) {
106
+ break;
107
+ }
108
+ names.push(name);
109
+ current = Object.getPrototypeOf(current);
110
+ }
111
+ const reversedNames = names.reverse();
112
+ const errorIndex = reversedNames.indexOf(Error.name);
113
+ return reversedNames.slice(errorIndex + 1);
114
+ };
115
+ var generatePrototypePaths = (arr) => {
116
+ return arr.reduce((acc, element) => {
117
+ const prev = acc.at(-1);
118
+ if (!prev) {
119
+ acc.push(element);
120
+ } else {
121
+ acc.push(`${prev}${PROTOTYPE_PATH_DELIMITER}${element}`);
122
+ }
123
+ return acc;
124
+ }, []);
125
+ };
126
+ var EnhancedError = class extends Error {
127
+ constructor(message, options) {
128
+ super(message, options);
129
+ this.name = new.target.name;
130
+ const prototypeNames = getPrototypeNamesPostError(this);
131
+ const prototypePaths = generatePrototypePaths(prototypeNames);
132
+ for (const prototypePath of prototypePaths) {
133
+ const symbol = Symbol.for(prototypePath);
134
+ Object.defineProperty(this, symbol, { value: true });
135
+ }
136
+ }
137
+ static [Symbol.hasInstance](val) {
138
+ if (val === null || typeof val !== "object") {
139
+ return false;
140
+ }
141
+ const prototypeNames = getPrototypeNamesPostError(this);
142
+ const symbol = Symbol.for(prototypeNames.join(PROTOTYPE_PATH_DELIMITER));
143
+ return symbol in val && val[symbol] === true;
144
+ }
145
+ };
146
+
147
+ // src/errors/PublicNonRecoverableError.ts
148
+ var PUBLIC_NON_RECOVERABLE_ERROR_SYMBOL = /* @__PURE__ */ Symbol.for("PUBLIC_NON_RECOVERABLE_ERROR_KEY");
149
+ var PublicNonRecoverableError = class extends EnhancedError {
98
150
  details;
99
151
  errorCode;
100
152
  httpStatusCode;
@@ -117,8 +169,8 @@ function isPublicNonRecoverableError(error) {
117
169
 
118
170
  // src/errors/InternalError.ts
119
171
  var import_types2 = require("util/types");
120
- var INTERNAL_ERROR_SYMBOL = Symbol.for("INTERNAL_ERROR_KEY");
121
- var InternalError = class extends Error {
172
+ var INTERNAL_ERROR_SYMBOL = /* @__PURE__ */ Symbol.for("INTERNAL_ERROR_KEY");
173
+ var InternalError = class extends EnhancedError {
122
174
  errorCode;
123
175
  details;
124
176
  constructor(params) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/errors/PublicNonRecoverableError.ts","../src/errors/InternalError.ts","../src/errors/errorTypeGuards.ts","../src/config/ConfigScope.ts","../src/config/configTransformers.ts","../src/config/configValidators.ts","../src/errors/either.ts","../src/utils/encryptionUtility.ts","../src/utils/arrayUtils.ts","../src/utils/objectUtils.ts","../src/utils/typeUtils.ts","../src/utils/hashUtils.ts","../src/logging/loggerConfigResolver.ts","../src/logging/stringValueSerializer.ts","../src/errors/globalErrorHandler.ts","../src/errors/publicErrors.ts","../src/utils/waitUtils.ts","../src/observability/MultiTransactionObservabilityManager.ts","../src/utils/checksumUtils.ts","../src/utils/streamUtils.ts"],"sourcesContent":["export type { ErrorDetails } from './errors/types'\n\nexport {\n PublicNonRecoverableError,\n isPublicNonRecoverableError,\n type PublicNonRecoverableErrorParams,\n} from './errors/PublicNonRecoverableError'\n\nexport {\n InternalError,\n isInternalError,\n type InternalErrorParams,\n} from './errors/InternalError'\nexport { isEntityGoneError } from './errors/errorTypeGuards'\n\nexport { ConfigScope } from './config/ConfigScope'\nexport { ensureClosingSlashTransformer } from './config/configTransformers'\nexport { createRangeValidator } from './config/configValidators'\nexport type {\n EnvValueValidator,\n EnvValueTransformer,\n AppConfig,\n RedisConfig,\n} from './config/configTypes'\n\nexport {\n type Either,\n type DefiniteEither,\n success,\n failure,\n isSuccess,\n isFailure,\n} from './errors/either'\n\nexport { EncryptionUtility } from './utils/encryptionUtility'\n\nexport {\n chunk,\n callChunked,\n removeFalsy,\n removeNullish,\n removeDuplicates,\n} from './utils/arrayUtils'\nexport {\n groupBy,\n groupByPath,\n groupByUnique,\n pick,\n pickWithoutUndefined,\n copyWithoutUndefined,\n copyWithoutEmpty,\n isEmptyObject,\n convertDateFieldsToIsoString,\n deepClone,\n transformToKebabCase,\n} from './utils/objectUtils'\n\nexport {\n isError,\n isStandardizedError,\n isObject,\n hasMessage,\n} from './utils/typeUtils'\nexport type { StandardizedError } from './utils/typeUtils'\n\nexport { generateHash, HashAlgorithm, HashEncoding } from './utils/hashUtils'\n\nexport {\n resolveLoggerConfiguration,\n resolveMonorepoLoggerConfiguration,\n resolveLogger,\n resolveMonorepoLogger,\n} from './logging/loggerConfigResolver'\nexport type { AppLoggerConfig, MonorepoAppLoggerConfig } from './logging/loggerConfigResolver'\nexport type { CommonLogger } from './logging/commonLogger'\n\nexport { stringValueSerializer } from './logging/stringValueSerializer'\n\nexport type {\n ErrorReport,\n ErrorReporter,\n ErrorResolver,\n} from './errors/errorReporterTypes'\nexport {\n executeAsyncAndHandleGlobalErrors,\n executeAndHandleGlobalErrors,\n executeSettleAllAndHandleGlobalErrors,\n globalLogger,\n resolveGlobalErrorLogObject,\n} from './errors/globalErrorHandler'\n\nexport type { MayOmit } from './common/may-omit'\nexport type { FreeformRecord } from './common/commonTypes'\nexport type { AtLeastOne } from './common/atLeastOne'\nexport {\n type ValidationError,\n type CommonErrorParams,\n type OptionalMessageErrorParams,\n RequestValidationError,\n AccessDeniedError,\n EntityNotFoundError,\n EntityGoneError,\n AuthFailedError,\n} from './errors/publicErrors'\n\nexport { waitAndRetry } from './utils/waitUtils'\n\nexport type { TransactionObservabilityManager } from './observability/observabilityTypes'\nexport { MultiTransactionObservabilityManager } from './observability/MultiTransactionObservabilityManager'\n\nexport {\n generateChecksumForReadable,\n generateChecksumForObject,\n generateChecksumForBufferOrString,\n} from './utils/checksumUtils'\nexport { FsReadableProvider } from './utils/streamUtils'\nexport type {\n PersistToFsOptions,\n ReadableProvider,\n FsReadableProviderOptions,\n} from './utils/streamUtils'\nexport { streamToBuffer } from './utils/streamUtils'\n","import { isNativeError } from 'node:util/types'\nimport type { BaseErrorParams, ErrorDetails } from './types'\n\ntype BasePublicErrorParams = BaseErrorParams & {\n httpStatusCode?: number\n}\n\nexport type PublicNonRecoverableErrorParams<\n T extends ErrorDetails | undefined = ErrorDetails | undefined,\n> = T extends undefined\n ? BasePublicErrorParams\n : BasePublicErrorParams & {\n details: T\n }\n\nconst PUBLIC_NON_RECOVERABLE_ERROR_SYMBOL = Symbol.for('PUBLIC_NON_RECOVERABLE_ERROR_KEY')\n\n/**\n * This error is returned to the consumer of API\n */\nexport class PublicNonRecoverableError<\n T extends ErrorDetails | undefined = ErrorDetails | undefined,\n> extends Error {\n public readonly details: T\n public readonly errorCode: string\n public readonly httpStatusCode: number\n\n constructor(params: PublicNonRecoverableErrorParams<T>) {\n super(params.message, {\n cause: params.cause,\n })\n // set the name as the class name for every class that extends PublicNonRecoverableError\n this.name = this.constructor.name\n // @ts-ignore\n this.details = params.details\n this.errorCode = params.errorCode\n this.httpStatusCode = params.httpStatusCode ?? 500\n }\n}\n\nObject.defineProperty(PublicNonRecoverableError.prototype, PUBLIC_NON_RECOVERABLE_ERROR_SYMBOL, {\n value: true,\n})\n\nexport function isPublicNonRecoverableError(error: unknown): error is PublicNonRecoverableError {\n return (\n isNativeError(error) &&\n ((PUBLIC_NON_RECOVERABLE_ERROR_SYMBOL in error &&\n error[PUBLIC_NON_RECOVERABLE_ERROR_SYMBOL] === true) ||\n error.name === 'PublicNonRecoverableError')\n )\n}\n","import { isNativeError } from 'node:util/types'\nimport type { BaseErrorParams, ErrorDetails } from './types'\n\nexport type InternalErrorParams<T extends ErrorDetails | undefined = ErrorDetails | undefined> =\n T extends undefined\n ? BaseErrorParams\n : BaseErrorParams & {\n details: T\n }\n\nconst INTERNAL_ERROR_SYMBOL = Symbol.for('INTERNAL_ERROR_KEY')\n\nexport class InternalError<\n T extends ErrorDetails | undefined = ErrorDetails | undefined,\n> extends Error {\n public readonly errorCode: string\n public readonly details: T\n\n constructor(params: InternalErrorParams<T>) {\n super(params.message, {\n cause: params.cause,\n })\n // set the name as the class name for every class that extends InternalError\n this.name = this.constructor.name\n // @ts-ignore\n this.details = params.details\n this.errorCode = params.errorCode\n }\n}\n\nObject.defineProperty(InternalError.prototype, INTERNAL_ERROR_SYMBOL, {\n value: true,\n})\n\nexport function isInternalError(error: unknown): error is InternalError {\n return (\n isNativeError(error) &&\n ((INTERNAL_ERROR_SYMBOL in error && error[INTERNAL_ERROR_SYMBOL] === true) ||\n error.name === 'InternalError')\n )\n}\n","import { isPublicNonRecoverableError } from '../errors/PublicNonRecoverableError'\n\nimport type { EntityGoneError } from './publicErrors'\n\nexport function isEntityGoneError(entity: unknown): entity is EntityGoneError {\n return isPublicNonRecoverableError(entity) && entity.httpStatusCode === 410\n}\n","import type { ZodSchema } from 'zod/v4'\nimport { InternalError } from '../errors/InternalError'\nimport type { EnvValueValidator } from './configTypes'\n\nexport type EnvType = {\n [key: string]: string | undefined\n}\n\nexport class ConfigScope {\n private env: EnvType\n\n constructor(envOverride?: EnvType) {\n this.env = envOverride ?? { ...process.env }\n }\n\n updateEnv() {\n // Accessing process.env values is slow, so we cache them\n this.env = { ...process.env }\n }\n\n getBySchema<T>(param: string, schema: ZodSchema<T>): T {\n const rawValue = this.env[param]\n\n const result = schema.safeParse(rawValue)\n\n if (!result.success) {\n throw new InternalError({\n message: `Validation of configuration parameter \"${param}\" has failed: ${result.error.issues.at(0)?.message}`,\n errorCode: 'CONFIGURATION_ERROR',\n cause: result.error,\n })\n }\n\n return result.data\n }\n\n getMandatoryInteger(param: string): number {\n const rawValue = this.env[param]\n if (!rawValue) {\n throw new InternalError({\n message: `Missing mandatory configuration parameter: ${param}`,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n return validateNumber(\n Number.parseInt(rawValue),\n `Configuration parameter ${param}\\` must be an integer number, but was ${rawValue}`,\n )\n }\n\n getMandatoryNumber(param: string): number {\n const rawValue = this.env[param]\n if (!rawValue) {\n throw new InternalError({\n message: `Missing mandatory configuration parameter: ${param}`,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n return validateNumber(\n Number.parseFloat(rawValue),\n `Configuration parameter ${param}\\` must be a number, but was ${rawValue}`,\n )\n }\n\n getMandatory(param: string): string {\n const result = this.env[param]\n if (!result) {\n throw new InternalError({\n message: `Missing mandatory configuration parameter: ${param}`,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n return result\n }\n\n getMandatoryOneOf<const T>(param: string, supportedValues: T[]): T {\n const result = this.getMandatory(param)\n return validateOneOf(\n result,\n supportedValues,\n `Unsupported ${param}: ${result}. Supported values: ${supportedValues.toString()}`,\n )\n }\n\n getMandatoryValidatedInteger(param: string, validator: EnvValueValidator<number>): number {\n const value = this.getMandatoryInteger(param)\n if (!validator(value)) {\n throw new InternalError({\n message: `Value ${value} is invalid for parameter ${param}`,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n return value\n }\n\n getMandatoryValidatedNumber(param: string, validator: EnvValueValidator<number>): number {\n const value = this.getMandatoryNumber(param)\n if (!validator(value)) {\n throw new InternalError({\n message: `Value ${value} is invalid for parameter ${param}`,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n return value\n }\n\n getOptionalNullable<T extends string | null | undefined>(\n param: string,\n defaultValue: T,\n ): T | string {\n return this.env[param] || defaultValue\n }\n\n getOptional(param: string, defaultValue: string): string {\n // Using the `||` operator instead of `??`, since '' is not a valid value, and 0 (number) is not expected here\n return this.env[param] || defaultValue\n }\n\n getOptionalInteger(param: string, defaultValue: number): number {\n const rawValue = this.env[param]\n if (!rawValue) {\n return defaultValue\n }\n return validateNumber(\n Number.parseInt(rawValue),\n `Configuration parameter ${param}\\` must be a number, but was ${rawValue}`,\n )\n }\n\n getOptionalNumber(param: string, defaultValue: number): number {\n const rawValue = this.env[param]\n if (!rawValue) {\n return defaultValue\n }\n return validateNumber(\n Number.parseFloat(rawValue),\n `Configuration parameter ${param}\\` must be a number, but was ${rawValue}`,\n )\n }\n\n getOptionalNullableInteger<T extends number | null | undefined>(\n param: string,\n defaultValue: T,\n ): T | number {\n const rawValue = this.env[param]\n if (!rawValue) {\n return defaultValue\n }\n return validateNumber(\n Number.parseInt(rawValue),\n `Configuration parameter ${param}\\` must be an integer number, but was ${rawValue}`,\n )\n }\n\n getOptionalNullableNumber<T extends number | null | undefined>(\n param: string,\n defaultValue: T,\n ): T | number {\n const rawValue = this.env[param]\n if (!rawValue) {\n return defaultValue\n }\n return validateNumber(\n Number.parseFloat(rawValue),\n `Configuration parameter ${param}\\` must be a number, but was ${rawValue}`,\n )\n }\n\n getOptionalOneOf<const T extends string>(\n param: string,\n defaultValue: T,\n supportedValues: T[],\n ): T {\n const result = this.getOptional(param, defaultValue)\n return validateOneOf(\n result,\n supportedValues,\n `Unsupported ${param}: ${result}. Supported values: ${supportedValues.toString()}`,\n )\n }\n\n getOptionalValidated(\n param: string,\n defaultValue: string,\n validator: EnvValueValidator<string>,\n ): string {\n const value = this.env[param] || defaultValue\n if (!validator(value)) {\n throw new InternalError({\n message: `Value ${value} is invalid for parameter ${param}`,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n return value\n }\n\n getOptionalValidatedInteger(\n param: string,\n defaultValue: number,\n validator: EnvValueValidator<number>,\n ): number {\n const value = this.getOptionalInteger(param, defaultValue)\n\n if (!validator(value)) {\n throw new InternalError({\n message: `Value ${value} is invalid for parameter ${param}`,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n\n return value\n }\n\n getOptionalValidatedNumber(\n param: string,\n defaultValue: number,\n validator: EnvValueValidator<number>,\n ): number {\n const value = this.getOptionalNumber(param, defaultValue)\n\n if (!validator(value)) {\n throw new InternalError({\n message: `Value ${value} is invalid for parameter ${param}`,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n\n return value\n }\n\n getOptionalTransformed(\n param: string,\n defaultValue: string,\n transformer: (value: string) => string,\n ): string {\n const value = this.env[param] || defaultValue\n return transformer(value)\n }\n\n getOptionalNullableTransformed<T extends string | undefined>(\n param: string,\n defaultValue: T,\n transformer: (value: T | string) => T | string,\n ): T | string {\n const value = this.env[param] || defaultValue\n return transformer(value as T)\n }\n\n getMandatoryTransformed(param: string, transformer: (value: string) => string) {\n const value = this.getMandatory(param)\n\n return transformer(value)\n }\n\n getOptionalBoolean(param: string, defaultValue: boolean): boolean {\n const rawValue = this.env[param]?.toLowerCase()\n if (rawValue === undefined || rawValue === '') {\n return defaultValue\n }\n\n validateOneOf(rawValue, ['true', 'false'])\n\n return rawValue === 'true'\n }\n\n getMandatoryJsonObject<T extends object>(param: string, schema: ZodSchema<T>): T {\n const rawValue = this.getMandatory(param)\n return this.validateSchema(\n JSON.parse(rawValue),\n schema,\n `Configuration parameter ${param} must be a valid JSON meeting the given schema, but was ${rawValue}`,\n )\n }\n\n getOptionalNullableJsonObject<T extends object, Z extends T | null | undefined>(\n param: string,\n schema: ZodSchema<T>,\n defaultValue: Z,\n ): Z {\n const rawValue = this.getOptionalNullable(param, undefined)\n if (!rawValue) {\n return defaultValue\n }\n\n return this.validateSchema(\n JSON.parse(rawValue),\n schema,\n `Configuration parameter ${param} must be a valid JSON meeting the given schema, but was ${rawValue}`,\n ) as Z\n }\n\n getOptionalJsonObject<T extends object>(param: string, schema: ZodSchema<T>, defaultValue: T): T {\n return this.getOptionalNullableJsonObject(param, schema, defaultValue)\n }\n\n isProduction(): boolean {\n return this.env.NODE_ENV === 'production'\n }\n\n isDevelopment(): boolean {\n return this.env.NODE_ENV !== 'production'\n }\n\n isTest(): boolean {\n return this.env.NODE_ENV === 'test'\n }\n\n private validateSchema<T extends object>(\n value: unknown,\n schema: ZodSchema<T>,\n errorMessage: string,\n ): T {\n const parsedValue = schema.safeParse(value)\n if (!parsedValue.success) {\n throw new InternalError({\n message: errorMessage,\n errorCode: 'CONFIGURATION_ERROR',\n details: parsedValue.error as unknown as Record<string, unknown>,\n })\n }\n\n return parsedValue.data\n }\n}\n\nexport function validateOneOf<const T>(\n validatedEntity: unknown,\n expectedOneOfEntities: T[],\n errorText?: string,\n): T {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n if (!expectedOneOfEntities.includes(validatedEntity as T)) {\n throw new InternalError({\n message:\n errorText ||\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n `Validated entity ${validatedEntity} is not one of: ${expectedOneOfEntities.toString()}`,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return validatedEntity as T\n}\n\nexport function validateNumber(validatedObject: unknown, errorText: string): number {\n if (!Number.isFinite(validatedObject)) {\n throw new InternalError({\n message: errorText,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n return validatedObject as number\n}\n","import type { EnvValueTransformer } from './configTypes'\n\nexport const ensureClosingSlashTransformer: EnvValueTransformer<\n string | undefined | null,\n string\n> = (value) => {\n if (!value) {\n return ''\n }\n\n const lastChar = value.at(-1)\n if (lastChar !== '/') {\n return `${value}/`\n }\n return value\n}\n","import type { EnvValueValidator } from './configTypes'\n\nexport const createRangeValidator = (\n greaterOrEqualThan: number,\n lessOrEqualThan: number,\n): EnvValueValidator<number> => {\n return (value) => {\n return value >= greaterOrEqualThan && value <= lessOrEqualThan\n }\n}\n","type Left<T> = {\n error: T\n result?: never\n}\n\ntype Right<U> = {\n error?: never\n result: U\n}\n\n/**\n * Either is a functional programming type which is used to communicate errors happening in potentially recoverable scenarios.\n * It can return either an error (Left side) or a resolved result (Right side), but not both.\n * It is up to caller of the function to handle received error or throw (Public)NonRecoverableError if it cannot.\n *\n * @see {@link https://antman-does-software.com/stop-catching-errors-in-typescript-use-the-either-type-to-make-your-code-predictable Further reading on motivation for Either type}\n */\nexport type Either<T, U> = NonNullable<Left<T> | Right<U>>\n\n/***\n * Variation of Either, which may or may not have Error set, but always has Result\n */\nexport type DefiniteEither<T, U> = {\n error?: T\n result: U\n}\n\nexport const isFailure = <T, U>(e: Either<T, U>): e is Left<T> => {\n return e.error !== undefined\n}\n\nexport const isSuccess = <T, U>(e: Either<T, U>): e is Right<U> => {\n return e.result !== undefined\n}\n\nexport const failure = <T>(error: T): Left<T> => ({ error })\n\nexport const success = <U>(result: U): Right<U> => ({ result })\n","import * as crypto from 'node:crypto'\n\nconst algorithm = 'aes-256-gcm'\nconst ivLength = 16\nconst tagLength = 16\nconst defaultEncoding = 'hex'\nconst defaultSaltLength = 64\nconst defaultPbkdf2Iterations = 100000\n\nexport type Options = {\n saltLength?: number\n pbkdf2Iterations?: number\n encoding?: NodeJS.BufferEncoding\n}\n\n/**\n * Type-scripted version of https://github.com/MauriceButler/cryptr\n */\nexport class EncryptionUtility {\n private readonly secret: string\n private readonly saltLength: number\n private readonly encryptedPosition: number\n private readonly tagPosition: number\n private readonly pbkdf2Iterations: number\n private readonly encoding: NodeJS.BufferEncoding\n\n constructor(secret: string, options?: Options) {\n this.secret = secret\n\n this.encoding = options?.encoding ?? defaultEncoding\n this.pbkdf2Iterations = options?.pbkdf2Iterations ?? defaultPbkdf2Iterations\n this.saltLength = options?.saltLength ?? defaultSaltLength\n\n this.tagPosition = this.saltLength + ivLength\n this.encryptedPosition = this.tagPosition + tagLength\n }\n\n private getKey(salt: Buffer) {\n return crypto.pbkdf2Sync(this.secret, salt, this.pbkdf2Iterations, 32, 'sha512')\n }\n\n public encrypt(value: string) {\n const iv = crypto.randomBytes(ivLength)\n const salt = crypto.randomBytes(this.saltLength)\n\n const key = this.getKey(salt)\n\n const cipher = crypto.createCipheriv(algorithm, key, iv)\n const encrypted = Buffer.concat([cipher.update(String(value), 'utf8'), cipher.final()])\n\n const tag = cipher.getAuthTag()\n\n return Buffer.concat([salt, iv, tag, encrypted]).toString(this.encoding)\n }\n\n public decrypt(value: string) {\n const stringValue = Buffer.from(String(value), this.encoding)\n\n const salt = stringValue.subarray(0, this.saltLength)\n const iv = stringValue.subarray(this.saltLength, this.tagPosition)\n const tag = stringValue.subarray(this.tagPosition, this.encryptedPosition)\n const encrypted = stringValue.subarray(this.encryptedPosition)\n\n const key = this.getKey(salt)\n\n const decipher = crypto.createDecipheriv(algorithm, key, iv)\n\n decipher.setAuthTag(tag)\n\n return Buffer.concat([\n decipher.update(encrypted),\n Buffer.from(decipher.final('utf8')),\n ]).toString('utf8')\n }\n}\n","export function chunk<T>(array: T[], chunkSize: number): T[][] {\n const length = array.length\n if (!length || chunkSize < 1) {\n return []\n }\n let index = 0\n let resIndex = 0\n const result = new Array(Math.ceil(length / chunkSize))\n\n while (index < length) {\n // biome-ignore lint/suspicious/noAssignInExpressions: <explanation>\n result[resIndex++] = array.slice(index, (index += chunkSize))\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return result\n}\n\nexport async function callChunked<Item>(\n chunkSize: number,\n array: readonly Item[],\n processFn: (arrayChunk: Item[]) => Promise<unknown>,\n): Promise<void> {\n for (let i = 0; i < array.length; i += chunkSize) {\n const arrayChunk = array.slice(i, i + chunkSize)\n await processFn(arrayChunk)\n }\n}\n\n/**\n * Return a copy of the given array without null or undefined values\n */\nexport function removeNullish<const T>(array: readonly (T | null | undefined)[]): T[] {\n return array.filter((e) => e !== undefined && e !== null) as T[]\n}\n\n/**\n * Return a copy of the given array without falsy values (eg: false, 0, '', null, undefined)\n */\nexport function removeFalsy<const T>(\n array: readonly (T | null | undefined | 0 | '' | false)[],\n): T[] {\n return array.filter((e) => e) as T[]\n}\n\n/**\n * Return a copy of the given array without duplicates.\n */\nexport function removeDuplicates<const T>(array: readonly T[]): T[] {\n return [...new Set(array)]\n}\n","import dotProp from 'dot-prop'\n\nimport { InternalError } from '../errors/InternalError'\n\ntype RecordKeyType = string | number | symbol\n\nexport function copyWithoutUndefined<\n T extends Record<RecordKeyType, unknown>,\n TargetRecordType = Pick<\n T,\n {\n [Prop in keyof T]: T[Prop] extends null | undefined ? never : Prop\n }[keyof T]\n >,\n>(originalValue: T): TargetRecordType {\n return Object.keys(originalValue).reduce(\n (acc, key) => {\n // @ts-ignore\n if (originalValue[key] !== undefined) {\n // @ts-ignore\n acc[key] = originalValue[key]\n }\n return acc\n },\n {} as Record<string, unknown>,\n ) as TargetRecordType\n}\n\nexport function copyWithoutEmpty<\n T extends Record<RecordKeyType, unknown>,\n TargetRecordType = Pick<\n T,\n {\n [Prop in keyof T]: T[Prop] extends null | undefined | '' ? never : Prop\n }[keyof T]\n >,\n>(originalValue: T): TargetRecordType {\n return Object.keys(originalValue).reduce(\n (acc, key) => {\n if (\n originalValue[key] !== undefined &&\n originalValue[key] !== null &&\n // @ts-ignore\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n (typeof originalValue[key] !== 'string' || originalValue[key].trim().length > 0)\n ) {\n // @ts-ignore\n acc[key] = originalValue[key]\n }\n return acc\n },\n {} as Record<string, unknown>,\n ) as TargetRecordType\n}\n\nexport function pick<T, K extends string | number | symbol>(\n source: T,\n propNames: readonly K[],\n): Pick<T, Exclude<keyof T, Exclude<keyof T, K>>> {\n const result = {} as T\n let idx = 0\n while (idx < propNames.length) {\n // @ts-ignore\n if (propNames[idx] in source) {\n // @ts-ignore\n result[propNames[idx]] = source[propNames[idx]]\n }\n idx += 1\n }\n return result\n}\n\nexport function pickWithoutUndefined<T, K extends string | number | symbol>(\n source: T,\n propNames: readonly K[],\n): Pick<T, Exclude<keyof T, Exclude<keyof T, K>>> {\n const result = {} as T\n let idx = 0\n while (idx < propNames.length) {\n // @ts-ignore\n if (propNames[idx] in source && source[propNames[idx]] !== undefined) {\n // @ts-ignore\n result[propNames[idx]] = source[propNames[idx]]\n }\n idx += 1\n }\n return result\n}\n\nexport function isEmptyObject(params: Record<string, unknown>): boolean {\n for (const key in params) {\n if (Object.hasOwn(params, key) && params[key] !== undefined) {\n return false\n }\n }\n return true\n}\n\ntype KeysMatching<T, V> = { [K in keyof T]: T[K] extends V ? K : never }[keyof T]\n\n/**\n * @param array The array of objects to be grouped.\n * @param selector The key used for grouping the objects.\n * @returns An object where the keys are unique values from the given selector and the values are the corresponding objects from the array.\n */\nexport function groupBy<\n T extends object,\n K extends KeysMatching<T, RecordKeyType | null | undefined>,\n>(array: T[], selector: K): Record<RecordKeyType, T[]> {\n return array.reduce(\n (acc, item) => {\n const key = item[selector] as RecordKeyType | null | undefined\n if (key === undefined || key === null) {\n return acc\n }\n if (!acc[key]) {\n acc[key] = []\n }\n acc[key].push(item)\n return acc\n },\n {} as Record<RecordKeyType, T[]>,\n )\n}\n\n/**\n * @param array The array of objects to be grouped.\n * @param selector The key used for grouping the objects. Support nested keys.\n * @returns An object where the keys are unique values from the given selector and the values are the corresponding objects from the array.\n */\nexport function groupByPath<T extends object>(array: T[], selector: string): Record<string, T[]> {\n return array.reduce(\n (acc, item) => {\n const key = dotProp.get(item, selector)\n if (key === undefined || key === null) {\n return acc\n }\n const strKeyPath = key as string\n\n if (!acc[strKeyPath]) {\n acc[strKeyPath] = []\n }\n acc[strKeyPath].push(item)\n return acc\n },\n {} as Record<RecordKeyType, T[]>,\n )\n}\n\n/**\n * @param array The array of objects to be grouped.\n * @param selector The key used for grouping the objects.\n * @returns An object where the keys are unique values from the given selector and the value is the\n * corresponding object from the array.\n * @throws InternalError If a duplicated value is found for the given selector.\n */\nexport function groupByUnique<\n T extends object,\n K extends KeysMatching<T, RecordKeyType | null | undefined>,\n>(array: T[], selector: K): Record<RecordKeyType, T> {\n return array.reduce(\n (acc, item) => {\n const key = item[selector] as RecordKeyType | null | undefined\n if (key === undefined || key === null) {\n return acc\n }\n if (acc[key] !== undefined) {\n throw new InternalError({\n message: `Duplicated item for selector ${selector.toString()} with value ${key.toString()}`,\n errorCode: 'DUPLICATED_ITEM',\n details: { selector, value: key },\n })\n }\n acc[key] = item\n return acc\n },\n {} as Record<RecordKeyType, T>,\n )\n}\n\ntype DatesAsString<T> = T extends Date ? string : ExactlyLikeWithDateAsString<T>\n\ntype ExactlyLikeWithDateAsString<T> = T extends object ? { [K in keyof T]: DatesAsString<T[K]> } : T\n\nexport function convertDateFieldsToIsoString<Input extends object>(\n object: Input,\n): ExactlyLikeWithDateAsString<Input>\nexport function convertDateFieldsToIsoString<Input extends object>(\n object: Input[],\n): ExactlyLikeWithDateAsString<Input>[]\nexport function convertDateFieldsToIsoString<Input extends object>(\n object: Input | Input[],\n): ExactlyLikeWithDateAsString<Input> | ExactlyLikeWithDateAsString<Input>[] {\n if (Array.isArray(object)) {\n // @ts-ignore\n return object.map(convertDateFieldsToIsoStringAux)\n }\n\n return Object.entries(object).reduce(\n (result, [key, value]) => {\n // @ts-ignore\n result[key] = convertDateFieldsToIsoStringAux(value)\n return result\n },\n {} as ExactlyLikeWithDateAsString<Input>,\n )\n}\n\nfunction convertDateFieldsToIsoStringAux<T>(item: T): DatesAsString<T> {\n if (item instanceof Date) {\n // @ts-ignore\n return item.toISOString()\n }\n\n if (item && typeof item === 'object') {\n // @ts-ignore\n return convertDateFieldsToIsoString(item)\n }\n\n // @ts-ignore\n return item\n}\n\n/**\n * Return a deep clone copy of an object.\n *\n * Please Note: This uses structuredClone, which has the limitations of these restricted Types: functions,\n * Error objects, WeakMap, WeakSet, DOM nodes, and certain other browser-specific objects like Window.\n */\nexport function deepClone<T extends object | undefined | null>(object: T): T {\n if (object === undefined || object === null) {\n return object\n }\n return structuredClone(object)\n}\n\nfunction transformKey(key: string): string {\n return key\n .replace(/([a-z])([A-Z])/g, '$1-$2') // transforms basic camelCase\n .replace(/([A-Z])([A-Z][a-z])/g, '$1-$2') // transforms abbreviations\n .replace(/_/g, '-') // transforms snake_case\n .toLowerCase() // finally lowercase all\n}\n\ntype TransformToKebabCaseInputType = Record<string, unknown> | null | undefined\ntype TransformToKebabCaseReturnType<Input, Output> = Input extends Record<string, unknown>\n ? Output\n : Input\n/**\n * Transforms an object's keys from camelCase or snake_case to kebab-case.\n * @param object\n */\nexport function transformToKebabCase<\n Output extends Record<string, unknown>,\n Input extends TransformToKebabCaseInputType,\n>(object: Input): TransformToKebabCaseReturnType<Input, Output>\n\nexport function transformToKebabCase<\n Output extends Record<string, unknown>,\n Input extends TransformToKebabCaseInputType,\n>(object: Input[]): TransformToKebabCaseReturnType<Input, Output>[]\n\nexport function transformToKebabCase<Output, Input>(\n object: Input | Input[],\n): TransformToKebabCaseReturnType<Input, Output> | TransformToKebabCaseReturnType<Input, Output>[] {\n if (Array.isArray(object)) {\n // @ts-ignore\n return object.map(transformToKebabCase)\n }\n if (typeof object !== 'object' || object === null || object === undefined) {\n return object as TransformToKebabCaseReturnType<Input, Output>\n }\n\n return Object.entries(object as Record<string, unknown>).reduce(\n (result, [key, value]) => {\n const transformedKey = transformKey(key)\n const transformedValue =\n value && typeof value === 'object'\n ? transformToKebabCase(value as TransformToKebabCaseInputType)\n : value\n\n // Avoiding destructuring by directly assigning the new key-value pair\n result[transformedKey] = transformedValue\n return result\n },\n {} as Record<string, unknown>,\n ) as TransformToKebabCaseReturnType<Input, Output>\n}\n","// Error structure commonly used in libraries, e. g. fastify\nexport type StandardizedError = {\n code: string\n message: string\n}\n\nexport function hasMessage(maybe: unknown): maybe is { message: string } {\n return isObject(maybe) && typeof maybe.message === 'string'\n}\n\nexport function isObject(maybeObject: unknown): maybeObject is Record<PropertyKey, unknown> {\n return typeof maybeObject === 'object' && maybeObject !== null\n}\n\nexport function isStandardizedError(error: unknown): error is StandardizedError {\n return isObject(error) && typeof error.code === 'string' && typeof error.message === 'string'\n}\n\nexport function isError(maybeError: unknown): maybeError is Error {\n return (\n maybeError instanceof Error || Object.prototype.toString.call(maybeError) === '[object Error]'\n )\n}\n","import { createHash } from 'node:crypto'\n\nexport enum HashEncoding {\n HEX = 'hex',\n BASE64 = 'base64',\n}\n\nexport enum HashAlgorithm {\n SHA256 = 'sha256',\n SHA512 = 'sha512',\n}\n\nexport function generateHash(\n algorithm: HashAlgorithm,\n data: string,\n encoding: HashEncoding = HashEncoding.HEX,\n) {\n return createHash(algorithm).update(data).digest(encoding)\n}\n","import type { Level, Logger, LoggerOptions } from 'pino'\nimport pino, { levels } from 'pino'\nimport pretty from 'pino-pretty'\n\nexport type AppLoggerConfig = {\n logLevel: 'fatal' | 'error' | 'warn' | 'info' | 'debug' | 'trace' | 'silent'\n nodeEnv: 'production' | 'development' | 'test'\n base?: Record<string, unknown>\n redact?: LoggerOptions['redact']\n}\n\nexport type MonorepoAppLoggerConfig = AppLoggerConfig & {\n targetFile?: string\n append?: boolean\n}\n\n/* c8 ignore next 8 */\nexport function resolveMonorepoLogger(appConfig: MonorepoAppLoggerConfig): Logger {\n if (appConfig.nodeEnv !== 'development') {\n return resolveLogger(appConfig)\n }\n\n const configuration = resolveMonorepoLoggerConfiguration(appConfig) as LoggerOptions\n return pino(configuration)\n}\n\n// Note that transports do not work in vitest, likely because pino attempts to run them in a separate worker\n/* c8 ignore next 25 */\nexport function resolveMonorepoLoggerConfiguration(\n appConfig: MonorepoAppLoggerConfig,\n): LoggerOptions | Logger {\n if (appConfig.nodeEnv !== 'development') {\n return resolveLoggerConfiguration(appConfig)\n }\n\n return {\n level: appConfig.logLevel,\n formatters: {\n level: (label) => {\n return { level: label }\n },\n },\n redact: appConfig.redact,\n transport: {\n target: 'pino/file',\n options: {\n destination: appConfig.targetFile ?? './service.log',\n mkdir: true,\n append: appConfig.append ?? false,\n },\n },\n }\n}\n\nexport function resolveLogger(appConfig: AppLoggerConfig): Logger {\n if (appConfig.nodeEnv !== 'production') {\n return resolveLoggerConfiguration(appConfig) as Logger\n }\n\n const configuration = resolveLoggerConfiguration(appConfig) as LoggerOptions\n return pino(configuration)\n}\n\nexport function resolveLoggerConfiguration(appConfig: AppLoggerConfig): LoggerOptions | Logger {\n if (appConfig.nodeEnv !== 'production') {\n return pino(\n pretty({\n sync: true,\n minimumLevel: appConfig.logLevel as Level,\n colorize: true,\n translateTime: 'SYS:standard',\n ignore: 'hostname,pid',\n }),\n )\n }\n\n return {\n level: appConfig.logLevel,\n formatters: {\n level: (_label, numericLevel): { level: string } => {\n const level = levels.labels[numericLevel] || 'unknown'\n return { level }\n },\n },\n redact: appConfig.redact,\n } satisfies LoggerOptions\n}\n","/**\n * Serializes the given value into a JSON string and explicitly wraps it in double quotes.\n * This ensures that log collectors (like Graylog) treat it as a string and not as a JSON object,\n * preventing the automatic extraction of properties that could lead to property explosion.\n * Max length is set to 8100 (+4 for quotes) characters to prevent issues with log collectors\n * (Graylog) that have a limit of 32766 bytes per field. In the worst case scenario, each character\n * is 4 bytes (UTF-32), so we limit the string to 8100 characters to stay within the limit.\n */\nexport const stringValueSerializer = (value: unknown, maxLength = 8100): string => {\n const baseValue = valueToString(value)\n\n const truncated = baseValue.length > maxLength ? baseValue.slice(0, maxLength) : baseValue\n\n return typeof value === 'string' ? `\"\"${truncated}\"\"` : `\"${truncated}\"`\n}\n\nconst valueToString = (value: unknown): string => {\n if (typeof value === 'string') {\n return value\n }\n\n if (typeof value === 'bigint') {\n return value.toString()\n }\n\n if (typeof value === 'symbol') {\n return value.toString()\n }\n\n if (value === undefined) {\n return 'undefined'\n }\n\n if (typeof value === 'function') {\n return value.toString()\n }\n\n try {\n return JSON.stringify(value)\n } catch {\n return String(value) // fallback for circular references etc.\n }\n}\n","import type { SerializedError } from 'pino'\nimport pino, { levels, stdSerializers } from 'pino'\n\nimport type { CommonLogger } from '../logging/commonLogger'\nimport { hasMessage, isError } from '../utils/typeUtils'\n\ntype LogObject = {\n msg: string // this is the default pino message key\n 'x-request-id'?: string\n error?: SerializedError\n}\n\nexport const globalLogger: CommonLogger = pino({\n formatters: {\n level: (_label, numericLevel): { level: string } => {\n const level = levels.labels[numericLevel] || 'unknown'\n return { level }\n },\n },\n})\n\nexport function resolveGlobalErrorLogObject(err: unknown, correlationId?: string): LogObject {\n if (isError(err)) {\n return {\n msg: err.message,\n error: stdSerializers.err(err),\n 'x-request-id': correlationId,\n }\n }\n\n if (hasMessage(err)) {\n return {\n msg: err.message,\n 'x-request-id': correlationId,\n }\n }\n\n return {\n msg: 'Unknown error',\n 'x-request-id': correlationId,\n }\n}\n\nexport function executeAndHandleGlobalErrors<T>(operation: () => T) {\n try {\n const result = operation()\n return result\n } catch (err) {\n const logObject = resolveGlobalErrorLogObject(err)\n globalLogger.error(logObject)\n process.exit(1)\n }\n}\n\nexport async function executeAsyncAndHandleGlobalErrors<T>(\n operation: () => Promise<T>,\n stopOnError?: true,\n): Promise<T>\nexport async function executeAsyncAndHandleGlobalErrors<T>(\n operation: () => Promise<T>,\n stopOnError: false,\n): Promise<T | undefined>\nexport async function executeAsyncAndHandleGlobalErrors<T>(\n operation: () => Promise<T>,\n stopOnError = true,\n): Promise<T | undefined> {\n try {\n const result = await operation()\n return result\n } catch (err) {\n const logObject = resolveGlobalErrorLogObject(err)\n globalLogger.error(logObject)\n if (stopOnError) {\n process.exit(1)\n }\n }\n}\n\nexport async function executeSettleAllAndHandleGlobalErrors<T>(\n promises: Promise<T>[],\n stopOnError?: true,\n): Promise<PromiseSettledResult<T>[]>\nexport async function executeSettleAllAndHandleGlobalErrors<T>(\n promises: Promise<T>[],\n stopOnError: false,\n): Promise<PromiseSettledResult<T>[] | undefined>\nexport async function executeSettleAllAndHandleGlobalErrors<T>(\n promises: Promise<T>[],\n stopOnError = true,\n): Promise<PromiseSettledResult<T>[] | undefined> {\n const result = await Promise.allSettled(promises)\n\n let errorsHappened: boolean | undefined\n for (const entry of result) {\n if (entry.status === 'rejected') {\n const logObject = resolveGlobalErrorLogObject(entry.reason)\n globalLogger.error(logObject)\n errorsHappened = true\n }\n }\n\n if (stopOnError && errorsHappened) {\n process.exit(1)\n }\n\n if (!stopOnError && errorsHappened) {\n return undefined\n }\n\n return result\n}\n","import { constants as httpConstants } from 'node:http2'\n\nimport type { FreeformRecord } from '../common/commonTypes'\n\nimport { PublicNonRecoverableError } from './PublicNonRecoverableError'\n\nexport type CommonErrorParams = {\n message: string\n details?: FreeformRecord\n cause?: Error\n}\n\nexport type OptionalMessageErrorParams = Partial<CommonErrorParams>\n\nexport type ValidationError = {\n message: string\n path: string[]\n}\n\nexport class RequestValidationError extends PublicNonRecoverableError<{\n error: ValidationError[]\n}> {\n constructor(errors: ValidationError[]) {\n super({\n message: 'Invalid params',\n errorCode: 'VALIDATION_ERROR',\n httpStatusCode: httpConstants.HTTP_STATUS_BAD_REQUEST,\n details: {\n error: errors,\n },\n })\n }\n}\n\nexport class AccessDeniedError extends PublicNonRecoverableError {\n constructor(params: CommonErrorParams) {\n super({\n message: params.message,\n errorCode: 'ACCESS_DENIED',\n httpStatusCode: httpConstants.HTTP_STATUS_FORBIDDEN,\n details: params.details,\n cause: params.cause,\n })\n }\n}\n\nexport class EntityNotFoundError extends PublicNonRecoverableError {\n constructor(params: CommonErrorParams) {\n super({\n message: params.message,\n errorCode: 'ENTITY_NOT_FOUND',\n httpStatusCode: httpConstants.HTTP_STATUS_NOT_FOUND,\n details: params.details,\n cause: params.cause,\n })\n }\n}\n\nexport class EntityGoneError extends PublicNonRecoverableError {\n constructor(params: CommonErrorParams) {\n super({\n message: params.message,\n errorCode: 'ENTITY_GONE',\n httpStatusCode: httpConstants.HTTP_STATUS_GONE,\n details: params.details,\n })\n }\n}\n\nexport class AuthFailedError extends PublicNonRecoverableError {\n constructor(params: OptionalMessageErrorParams = {}) {\n super({\n message: params.message ?? 'Authentication failed',\n errorCode: 'AUTH_FAILED',\n httpStatusCode: httpConstants.HTTP_STATUS_UNAUTHORIZED,\n details: params.details,\n cause: params.cause,\n })\n }\n}\n","export const waitAndRetry = async <T>(\n predicateFn: () => T,\n sleepTime = 20,\n maxRetryCount = 15,\n): Promise<T> => {\n return new Promise((resolve, reject) => {\n let retryCount = 0\n function performCheck() {\n // amount of retries exceeded\n if (maxRetryCount !== 0 && retryCount > maxRetryCount) {\n resolve(predicateFn())\n }\n\n // Try executing predicateFn\n Promise.resolve()\n .then(() => {\n return predicateFn()\n })\n .then((result) => {\n if (result) {\n resolve(result)\n } else {\n retryCount++\n setTimeout(performCheck, sleepTime)\n }\n })\n .catch((err) => {\n reject(err)\n })\n }\n\n performCheck()\n })\n}\n","import type { TransactionObservabilityManager } from './observabilityTypes'\n\n/**\n * Groups different TransactionObservabilityManager instances into one\n * to facilitate tracking transactions across multiple observability tools.\n */\nexport class MultiTransactionObservabilityManager implements TransactionObservabilityManager {\n private readonly managers: TransactionObservabilityManager[]\n\n constructor(managers: TransactionObservabilityManager[]) {\n this.managers = managers\n }\n\n start(transactionName: string, uniqueTransactionKey: string): void {\n for (const manager of this.managers) {\n manager.start(transactionName, uniqueTransactionKey)\n }\n }\n\n startWithGroup(\n transactionName: string,\n uniqueTransactionKey: string,\n transactionGroup: string,\n ): void {\n for (const manager of this.managers) {\n manager.startWithGroup(transactionName, uniqueTransactionKey, transactionGroup)\n }\n }\n\n stop(uniqueTransactionKey: string, wasSuccessful?: boolean): void {\n for (const manager of this.managers) {\n manager.stop(uniqueTransactionKey, wasSuccessful)\n }\n }\n\n addCustomAttributes(\n uniqueTransactionKey: string,\n atts: { [p: string]: string | number | boolean },\n ): void {\n for (const manager of this.managers) {\n manager.addCustomAttributes(uniqueTransactionKey, atts)\n }\n }\n}\n","import type { BinaryLike } from 'node:crypto'\nimport { createHash } from 'node:crypto'\nimport type { Readable } from 'node:stream'\n\nconst HASH_ALGORITHM = 'md5'\n\nexport function generateChecksumForBufferOrString(data: BinaryLike): string {\n return createHash(HASH_ALGORITHM).update(data).digest('hex')\n}\n\nexport function generateChecksumForObject(object: object): string {\n const objectAsString = JSON.stringify(object)\n return generateChecksumForBufferOrString(objectAsString)\n}\n\nexport function generateChecksumForReadable(readable: Readable): Promise<string> {\n return new Promise((resolve, reject) => {\n const hashCreator = createHash(HASH_ALGORITHM)\n readable.on('data', (data) => {\n if (Buffer.isBuffer(data)) {\n hashCreator.update(data)\n } else {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n hashCreator.update(Buffer.from(data))\n }\n })\n\n readable.on('end', () => {\n const hash = hashCreator.digest('hex')\n resolve(hash)\n })\n readable.on('error', (err) => {\n /* c8 ignore next 1 */\n reject(err)\n })\n })\n}\n","import { F_OK } from 'node:constants'\nimport { access, createReadStream, createWriteStream } from 'node:fs'\nimport { stat, unlink } from 'node:fs/promises'\nimport type { Readable } from 'node:stream'\nimport { pipeline } from 'node:stream'\n\nexport type ReadableProvider = {\n /**\n * Guarantees to provide a new stream every time this is called, before `destroy` is invoked.\n */\n createStream(): Promise<Readable>\n\n /**\n * Returns size of the persisted content\n */\n getContentLength(): Promise<number>\n\n /**\n * Remove the persisted value. No new streams can be created after this is called\n */\n destroy(): Promise<void>\n}\n\nexport type PersistToFsOptions = {\n targetFile: string\n sourceReadable: Readable\n}\n\nexport type FsReadableProviderOptions = {\n storageFile: string\n}\n\nexport class FsReadableProvider implements ReadableProvider {\n public readonly storageFile: string\n constructor(options: FsReadableProviderOptions) {\n this.storageFile = options.storageFile\n }\n\n fileExists(): Promise<boolean> {\n return new Promise((resolve) => {\n access(this.storageFile, F_OK, (err) => {\n return resolve(!err)\n })\n })\n }\n\n async getContentLength(): Promise<number> {\n if (!(await this.fileExists())) {\n throw new Error(`File ${this.storageFile} was already deleted.`)\n }\n const stats = await stat(this.storageFile)\n return stats.size\n }\n\n async createStream(): Promise<Readable> {\n if (!(await this.fileExists())) {\n throw new Error(`File ${this.storageFile} was already deleted.`)\n }\n\n return createReadStream(this.storageFile)\n }\n\n async destroy(): Promise<void> {\n if (!(await this.fileExists())) {\n // nothing to do here\n return\n }\n\n return unlink(this.storageFile)\n }\n\n protected async persist(sourceReadable: Readable): Promise<void> {\n const writable = createWriteStream(this.storageFile)\n return new Promise((resolve, reject) => {\n pipeline(sourceReadable, writable, (err) => {\n if (err) {\n /* c8 ignore next 1 */\n reject(err)\n } else {\n resolve()\n }\n })\n })\n }\n\n public static async persistReadableToFs(\n options: PersistToFsOptions,\n ): Promise<FsReadableProvider> {\n const provider = new FsReadableProvider({\n storageFile: options.targetFile,\n })\n await provider.persist(options.sourceReadable)\n return provider\n }\n}\n\n/**\n * Consumes the readable in order to calculate its length in bytes\n * @param readable\n */\nexport function getReadableContentLength(readable: Readable): Promise<number> {\n return new Promise((resolve, reject) => {\n let size = 0\n readable.on('data', (chunk) => {\n if (typeof chunk === 'string' || Buffer.isBuffer(chunk)) {\n size += Buffer.byteLength(chunk)\n }\n })\n readable.on('end', () => {\n resolve(size)\n })\n readable.on('error', (error) => {\n /* c8 ignore next 1 */\n reject(error)\n })\n })\n}\n\n/**\n * Consumes the readable stream and returns its content as a Buffer.\n * @param stream - The readable stream to consume.\n * @returns A promise that resolves to a Buffer containing the stream's content.\n */\nexport async function streamToBuffer(stream: Readable): Promise<Buffer> {\n const chunks: Buffer[] = []\n for await (const chunk of stream) {\n chunks.push(chunk as Buffer)\n }\n return Buffer.concat(chunks)\n}\n"],"mappings":"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","names":["import_types","dotProp","HashEncoding","HashAlgorithm","algorithm","pino","pretty","import_pino","pino","httpConstants","import_node_crypto","chunk"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/errors/PublicNonRecoverableError.ts","../src/errors/EnhancedError.ts","../src/errors/InternalError.ts","../src/errors/errorTypeGuards.ts","../src/config/ConfigScope.ts","../src/config/configTransformers.ts","../src/config/configValidators.ts","../src/errors/either.ts","../src/utils/encryptionUtility.ts","../src/utils/arrayUtils.ts","../src/utils/objectUtils.ts","../src/utils/typeUtils.ts","../src/utils/hashUtils.ts","../src/logging/loggerConfigResolver.ts","../src/logging/stringValueSerializer.ts","../src/errors/globalErrorHandler.ts","../src/errors/publicErrors.ts","../src/utils/waitUtils.ts","../src/observability/MultiTransactionObservabilityManager.ts","../src/utils/checksumUtils.ts","../src/utils/streamUtils.ts"],"sourcesContent":["export type { ErrorDetails } from './errors/types'\n\nexport {\n PublicNonRecoverableError,\n isPublicNonRecoverableError,\n type PublicNonRecoverableErrorParams,\n} from './errors/PublicNonRecoverableError'\n\nexport {\n InternalError,\n isInternalError,\n type InternalErrorParams,\n} from './errors/InternalError'\nexport { isEntityGoneError } from './errors/errorTypeGuards'\n\nexport { ConfigScope } from './config/ConfigScope'\nexport { ensureClosingSlashTransformer } from './config/configTransformers'\nexport { createRangeValidator } from './config/configValidators'\nexport type {\n EnvValueValidator,\n EnvValueTransformer,\n AppConfig,\n RedisConfig,\n} from './config/configTypes'\n\nexport {\n type Either,\n type DefiniteEither,\n success,\n failure,\n isSuccess,\n isFailure,\n} from './errors/either'\n\nexport { EncryptionUtility } from './utils/encryptionUtility'\n\nexport {\n chunk,\n callChunked,\n removeFalsy,\n removeNullish,\n removeDuplicates,\n} from './utils/arrayUtils'\nexport {\n groupBy,\n groupByPath,\n groupByUnique,\n pick,\n pickWithoutUndefined,\n copyWithoutUndefined,\n copyWithoutEmpty,\n isEmptyObject,\n convertDateFieldsToIsoString,\n deepClone,\n transformToKebabCase,\n} from './utils/objectUtils'\n\nexport {\n isError,\n isStandardizedError,\n isObject,\n hasMessage,\n} from './utils/typeUtils'\nexport type { StandardizedError } from './utils/typeUtils'\n\nexport { generateHash, HashAlgorithm, HashEncoding } from './utils/hashUtils'\n\nexport {\n resolveLoggerConfiguration,\n resolveMonorepoLoggerConfiguration,\n resolveLogger,\n resolveMonorepoLogger,\n} from './logging/loggerConfigResolver'\nexport type { AppLoggerConfig, MonorepoAppLoggerConfig } from './logging/loggerConfigResolver'\nexport type { CommonLogger } from './logging/commonLogger'\n\nexport { stringValueSerializer } from './logging/stringValueSerializer'\n\nexport type {\n ErrorReport,\n ErrorReporter,\n ErrorResolver,\n} from './errors/errorReporterTypes'\nexport {\n executeAsyncAndHandleGlobalErrors,\n executeAndHandleGlobalErrors,\n executeSettleAllAndHandleGlobalErrors,\n globalLogger,\n resolveGlobalErrorLogObject,\n} from './errors/globalErrorHandler'\n\nexport type { MayOmit } from './common/may-omit'\nexport type { FreeformRecord } from './common/commonTypes'\nexport type { AtLeastOne } from './common/atLeastOne'\nexport {\n type ValidationError,\n type CommonErrorParams,\n type OptionalMessageErrorParams,\n RequestValidationError,\n AccessDeniedError,\n EntityNotFoundError,\n EntityGoneError,\n AuthFailedError,\n} from './errors/publicErrors'\n\nexport { waitAndRetry } from './utils/waitUtils'\n\nexport type { TransactionObservabilityManager } from './observability/observabilityTypes'\nexport { MultiTransactionObservabilityManager } from './observability/MultiTransactionObservabilityManager'\n\nexport {\n generateChecksumForReadable,\n generateChecksumForObject,\n generateChecksumForBufferOrString,\n} from './utils/checksumUtils'\nexport { FsReadableProvider } from './utils/streamUtils'\nexport type {\n PersistToFsOptions,\n ReadableProvider,\n FsReadableProviderOptions,\n} from './utils/streamUtils'\nexport { streamToBuffer } from './utils/streamUtils'\n","import { isNativeError } from 'node:util/types'\nimport { EnhancedError } from './EnhancedError'\nimport type { BaseErrorParams, ErrorDetails } from './types'\n\ntype BasePublicErrorParams = BaseErrorParams & {\n httpStatusCode?: number\n}\n\nexport type PublicNonRecoverableErrorParams<\n T extends ErrorDetails | undefined = ErrorDetails | undefined,\n> = T extends undefined\n ? BasePublicErrorParams\n : BasePublicErrorParams & {\n details: T\n }\n\nconst PUBLIC_NON_RECOVERABLE_ERROR_SYMBOL = Symbol.for('PUBLIC_NON_RECOVERABLE_ERROR_KEY')\n\n/**\n * This error is returned to the consumer of API\n */\nexport class PublicNonRecoverableError<\n T extends ErrorDetails | undefined = ErrorDetails | undefined,\n> extends EnhancedError {\n public readonly details: T\n public readonly errorCode: string\n public readonly httpStatusCode: number\n\n constructor(params: PublicNonRecoverableErrorParams<T>) {\n super(params.message, {\n cause: params.cause,\n })\n // set the name as the class name for every class that extends PublicNonRecoverableError\n this.name = this.constructor.name\n // @ts-ignore\n this.details = params.details\n this.errorCode = params.errorCode\n this.httpStatusCode = params.httpStatusCode ?? 500\n }\n}\n\nObject.defineProperty(PublicNonRecoverableError.prototype, PUBLIC_NON_RECOVERABLE_ERROR_SYMBOL, {\n value: true,\n})\n\n/**\n * @deprecated Use `error instanceof PublicNonRecoverableError` instead.\n */\nexport function isPublicNonRecoverableError(error: unknown): error is PublicNonRecoverableError {\n return (\n isNativeError(error) &&\n ((PUBLIC_NON_RECOVERABLE_ERROR_SYMBOL in error &&\n error[PUBLIC_NON_RECOVERABLE_ERROR_SYMBOL] === true) ||\n error.name === 'PublicNonRecoverableError')\n )\n}\n","const PROTOTYPE_PATH_DELIMITER = '.'\n\nconst getPrototypeNamesPostError = (input: unknown): string[] => {\n const names: string[] = []\n\n const isFunction = typeof input === 'function'\n\n // biome-ignore lint/complexity/noBannedTypes: describes prototype\n let current: Function = isFunction ? input : Object.getPrototypeOf(input)\n\n while (current !== null) {\n const name = isFunction ? current.name : current.constructor.name\n\n if (!name) {\n break\n }\n\n names.push(name)\n current = Object.getPrototypeOf(current)\n }\n\n const reversedNames = names.reverse()\n\n const errorIndex = reversedNames.indexOf(Error.name)\n\n return reversedNames.slice(errorIndex + 1)\n}\n\nconst generatePrototypePaths = (arr: string[]): string[] => {\n return arr.reduce<string[]>((acc, element) => {\n const prev = acc.at(-1)\n\n if (!prev) {\n acc.push(element)\n } else {\n acc.push(`${prev}${PROTOTYPE_PATH_DELIMITER}${element}`)\n }\n\n return acc\n }, [])\n}\n\n/**\n * Custom error class that enables reliable instanceof checks across realms\n * (e.g., iframes, workers, or Node.js VM).\n * Also ensures subclasses like `NotFoundError` have a consistent error name\n * (i.e., `error.name` is set to the subclass name instead of `EnhancedError`).\n *\n * It works by creating unique symbols for each inheritance path, such as:\n * - 'EnhancedError'\n * - 'EnhancedError.Subclass1'\n * - 'EnhancedError.Subclass1.Subclass2',\n * assigning them to the instance using `Symbol.for` on instantiation.\n * The custom `instanceof` logic (overriding `Symbol.hasInstance`) checks if the corresponding\n * symbol for the constructor’s prototype path exists on the tested object.\n *\n * This technique allows `instanceof` to succeed across realms where normal prototype chain checks fail,\n * because symbols created via `Symbol.for` are shared globally and can be reliably compared.\n */\nexport class EnhancedError extends Error {\n constructor(message?: string, options?: ErrorOptions) {\n super(message, options)\n\n // Set the error's name to the name of the class that was instantiated\n this.name = new.target.name\n\n const prototypeNames = getPrototypeNamesPostError(this)\n const prototypePaths = generatePrototypePaths(prototypeNames)\n\n for (const prototypePath of prototypePaths) {\n const symbol = Symbol.for(prototypePath)\n\n Object.defineProperty(this, symbol, { value: true })\n }\n }\n\n static override [Symbol.hasInstance](val: unknown): boolean {\n if (val === null || typeof val !== 'object') {\n return false\n }\n\n // biome-ignore lint/complexity/noThisInStatic: intentional to support subclasses\n const prototypeNames = getPrototypeNamesPostError(this)\n const symbol = Symbol.for(prototypeNames.join(PROTOTYPE_PATH_DELIMITER))\n\n return symbol in val && val[symbol] === true\n }\n}\n","import { isNativeError } from 'node:util/types'\nimport { EnhancedError } from './EnhancedError'\nimport type { BaseErrorParams, ErrorDetails } from './types'\n\nexport type InternalErrorParams<T extends ErrorDetails | undefined = ErrorDetails | undefined> =\n T extends undefined\n ? BaseErrorParams\n : BaseErrorParams & {\n details: T\n }\n\nconst INTERNAL_ERROR_SYMBOL = Symbol.for('INTERNAL_ERROR_KEY')\n\nexport class InternalError<\n T extends ErrorDetails | undefined = ErrorDetails | undefined,\n> extends EnhancedError {\n public readonly errorCode: string\n public readonly details: T\n\n constructor(params: InternalErrorParams<T>) {\n super(params.message, {\n cause: params.cause,\n })\n // set the name as the class name for every class that extends InternalError\n this.name = this.constructor.name\n // @ts-ignore\n this.details = params.details\n this.errorCode = params.errorCode\n }\n}\n\nObject.defineProperty(InternalError.prototype, INTERNAL_ERROR_SYMBOL, {\n value: true,\n})\n\n/**\n * @deprecated Use `error instanceof InternalError` instead.\n */\nexport function isInternalError(error: unknown): error is InternalError {\n return (\n isNativeError(error) &&\n ((INTERNAL_ERROR_SYMBOL in error && error[INTERNAL_ERROR_SYMBOL] === true) ||\n error.name === 'InternalError')\n )\n}\n","import { isPublicNonRecoverableError } from '../errors/PublicNonRecoverableError'\n\nimport type { EntityGoneError } from './publicErrors'\n\nexport function isEntityGoneError(entity: unknown): entity is EntityGoneError {\n return isPublicNonRecoverableError(entity) && entity.httpStatusCode === 410\n}\n","import type { ZodSchema } from 'zod/v4'\nimport { InternalError } from '../errors/InternalError'\nimport type { EnvValueValidator } from './configTypes'\n\nexport type EnvType = {\n [key: string]: string | undefined\n}\n\nexport class ConfigScope {\n private env: EnvType\n\n constructor(envOverride?: EnvType) {\n this.env = envOverride ?? { ...process.env }\n }\n\n updateEnv() {\n // Accessing process.env values is slow, so we cache them\n this.env = { ...process.env }\n }\n\n getBySchema<T>(param: string, schema: ZodSchema<T>): T {\n const rawValue = this.env[param]\n\n const result = schema.safeParse(rawValue)\n\n if (!result.success) {\n throw new InternalError({\n message: `Validation of configuration parameter \"${param}\" has failed: ${result.error.issues.at(0)?.message}`,\n errorCode: 'CONFIGURATION_ERROR',\n cause: result.error,\n })\n }\n\n return result.data\n }\n\n getMandatoryInteger(param: string): number {\n const rawValue = this.env[param]\n if (!rawValue) {\n throw new InternalError({\n message: `Missing mandatory configuration parameter: ${param}`,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n return validateNumber(\n Number.parseInt(rawValue),\n `Configuration parameter ${param}\\` must be an integer number, but was ${rawValue}`,\n )\n }\n\n getMandatoryNumber(param: string): number {\n const rawValue = this.env[param]\n if (!rawValue) {\n throw new InternalError({\n message: `Missing mandatory configuration parameter: ${param}`,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n return validateNumber(\n Number.parseFloat(rawValue),\n `Configuration parameter ${param}\\` must be a number, but was ${rawValue}`,\n )\n }\n\n getMandatory(param: string): string {\n const result = this.env[param]\n if (!result) {\n throw new InternalError({\n message: `Missing mandatory configuration parameter: ${param}`,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n return result\n }\n\n getMandatoryOneOf<const T>(param: string, supportedValues: T[]): T {\n const result = this.getMandatory(param)\n return validateOneOf(\n result,\n supportedValues,\n `Unsupported ${param}: ${result}. Supported values: ${supportedValues.toString()}`,\n )\n }\n\n getMandatoryValidatedInteger(param: string, validator: EnvValueValidator<number>): number {\n const value = this.getMandatoryInteger(param)\n if (!validator(value)) {\n throw new InternalError({\n message: `Value ${value} is invalid for parameter ${param}`,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n return value\n }\n\n getMandatoryValidatedNumber(param: string, validator: EnvValueValidator<number>): number {\n const value = this.getMandatoryNumber(param)\n if (!validator(value)) {\n throw new InternalError({\n message: `Value ${value} is invalid for parameter ${param}`,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n return value\n }\n\n getOptionalNullable<T extends string | null | undefined>(\n param: string,\n defaultValue: T,\n ): T | string {\n return this.env[param] || defaultValue\n }\n\n getOptional(param: string, defaultValue: string): string {\n // Using the `||` operator instead of `??`, since '' is not a valid value, and 0 (number) is not expected here\n return this.env[param] || defaultValue\n }\n\n getOptionalInteger(param: string, defaultValue: number): number {\n const rawValue = this.env[param]\n if (!rawValue) {\n return defaultValue\n }\n return validateNumber(\n Number.parseInt(rawValue),\n `Configuration parameter ${param}\\` must be a number, but was ${rawValue}`,\n )\n }\n\n getOptionalNumber(param: string, defaultValue: number): number {\n const rawValue = this.env[param]\n if (!rawValue) {\n return defaultValue\n }\n return validateNumber(\n Number.parseFloat(rawValue),\n `Configuration parameter ${param}\\` must be a number, but was ${rawValue}`,\n )\n }\n\n getOptionalNullableInteger<T extends number | null | undefined>(\n param: string,\n defaultValue: T,\n ): T | number {\n const rawValue = this.env[param]\n if (!rawValue) {\n return defaultValue\n }\n return validateNumber(\n Number.parseInt(rawValue),\n `Configuration parameter ${param}\\` must be an integer number, but was ${rawValue}`,\n )\n }\n\n getOptionalNullableNumber<T extends number | null | undefined>(\n param: string,\n defaultValue: T,\n ): T | number {\n const rawValue = this.env[param]\n if (!rawValue) {\n return defaultValue\n }\n return validateNumber(\n Number.parseFloat(rawValue),\n `Configuration parameter ${param}\\` must be a number, but was ${rawValue}`,\n )\n }\n\n getOptionalOneOf<const T extends string>(\n param: string,\n defaultValue: T,\n supportedValues: T[],\n ): T {\n const result = this.getOptional(param, defaultValue)\n return validateOneOf(\n result,\n supportedValues,\n `Unsupported ${param}: ${result}. Supported values: ${supportedValues.toString()}`,\n )\n }\n\n getOptionalValidated(\n param: string,\n defaultValue: string,\n validator: EnvValueValidator<string>,\n ): string {\n const value = this.env[param] || defaultValue\n if (!validator(value)) {\n throw new InternalError({\n message: `Value ${value} is invalid for parameter ${param}`,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n return value\n }\n\n getOptionalValidatedInteger(\n param: string,\n defaultValue: number,\n validator: EnvValueValidator<number>,\n ): number {\n const value = this.getOptionalInteger(param, defaultValue)\n\n if (!validator(value)) {\n throw new InternalError({\n message: `Value ${value} is invalid for parameter ${param}`,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n\n return value\n }\n\n getOptionalValidatedNumber(\n param: string,\n defaultValue: number,\n validator: EnvValueValidator<number>,\n ): number {\n const value = this.getOptionalNumber(param, defaultValue)\n\n if (!validator(value)) {\n throw new InternalError({\n message: `Value ${value} is invalid for parameter ${param}`,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n\n return value\n }\n\n getOptionalTransformed(\n param: string,\n defaultValue: string,\n transformer: (value: string) => string,\n ): string {\n const value = this.env[param] || defaultValue\n return transformer(value)\n }\n\n getOptionalNullableTransformed<T extends string | undefined>(\n param: string,\n defaultValue: T,\n transformer: (value: T | string) => T | string,\n ): T | string {\n const value = this.env[param] || defaultValue\n return transformer(value as T)\n }\n\n getMandatoryTransformed(param: string, transformer: (value: string) => string) {\n const value = this.getMandatory(param)\n\n return transformer(value)\n }\n\n getOptionalBoolean(param: string, defaultValue: boolean): boolean {\n const rawValue = this.env[param]?.toLowerCase()\n if (rawValue === undefined || rawValue === '') {\n return defaultValue\n }\n\n validateOneOf(rawValue, ['true', 'false'])\n\n return rawValue === 'true'\n }\n\n getMandatoryJsonObject<T extends object>(param: string, schema: ZodSchema<T>): T {\n const rawValue = this.getMandatory(param)\n return this.validateSchema(\n JSON.parse(rawValue),\n schema,\n `Configuration parameter ${param} must be a valid JSON meeting the given schema, but was ${rawValue}`,\n )\n }\n\n getOptionalNullableJsonObject<T extends object, Z extends T | null | undefined>(\n param: string,\n schema: ZodSchema<T>,\n defaultValue: Z,\n ): Z {\n const rawValue = this.getOptionalNullable(param, undefined)\n if (!rawValue) {\n return defaultValue\n }\n\n return this.validateSchema(\n JSON.parse(rawValue),\n schema,\n `Configuration parameter ${param} must be a valid JSON meeting the given schema, but was ${rawValue}`,\n ) as Z\n }\n\n getOptionalJsonObject<T extends object>(param: string, schema: ZodSchema<T>, defaultValue: T): T {\n return this.getOptionalNullableJsonObject(param, schema, defaultValue)\n }\n\n isProduction(): boolean {\n return this.env.NODE_ENV === 'production'\n }\n\n isDevelopment(): boolean {\n return this.env.NODE_ENV !== 'production'\n }\n\n isTest(): boolean {\n return this.env.NODE_ENV === 'test'\n }\n\n private validateSchema<T extends object>(\n value: unknown,\n schema: ZodSchema<T>,\n errorMessage: string,\n ): T {\n const parsedValue = schema.safeParse(value)\n if (!parsedValue.success) {\n throw new InternalError({\n message: errorMessage,\n errorCode: 'CONFIGURATION_ERROR',\n details: parsedValue.error as unknown as Record<string, unknown>,\n })\n }\n\n return parsedValue.data\n }\n}\n\nexport function validateOneOf<const T>(\n validatedEntity: unknown,\n expectedOneOfEntities: T[],\n errorText?: string,\n): T {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n if (!expectedOneOfEntities.includes(validatedEntity as T)) {\n throw new InternalError({\n message:\n errorText ||\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n `Validated entity ${validatedEntity} is not one of: ${expectedOneOfEntities.toString()}`,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return validatedEntity as T\n}\n\nexport function validateNumber(validatedObject: unknown, errorText: string): number {\n if (!Number.isFinite(validatedObject)) {\n throw new InternalError({\n message: errorText,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n return validatedObject as number\n}\n","import type { EnvValueTransformer } from './configTypes'\n\nexport const ensureClosingSlashTransformer: EnvValueTransformer<\n string | undefined | null,\n string\n> = (value) => {\n if (!value) {\n return ''\n }\n\n const lastChar = value.at(-1)\n if (lastChar !== '/') {\n return `${value}/`\n }\n return value\n}\n","import type { EnvValueValidator } from './configTypes'\n\nexport const createRangeValidator = (\n greaterOrEqualThan: number,\n lessOrEqualThan: number,\n): EnvValueValidator<number> => {\n return (value) => {\n return value >= greaterOrEqualThan && value <= lessOrEqualThan\n }\n}\n","type Left<T> = {\n error: T\n result?: never\n}\n\ntype Right<U> = {\n error?: never\n result: U\n}\n\n/**\n * Either is a functional programming type which is used to communicate errors happening in potentially recoverable scenarios.\n * It can return either an error (Left side) or a resolved result (Right side), but not both.\n * It is up to caller of the function to handle received error or throw (Public)NonRecoverableError if it cannot.\n *\n * @see {@link https://antman-does-software.com/stop-catching-errors-in-typescript-use-the-either-type-to-make-your-code-predictable Further reading on motivation for Either type}\n */\nexport type Either<T, U> = NonNullable<Left<T> | Right<U>>\n\n/***\n * Variation of Either, which may or may not have Error set, but always has Result\n */\nexport type DefiniteEither<T, U> = {\n error?: T\n result: U\n}\n\nexport const isFailure = <T, U>(e: Either<T, U>): e is Left<T> => {\n return e.error !== undefined\n}\n\nexport const isSuccess = <T, U>(e: Either<T, U>): e is Right<U> => {\n return e.result !== undefined\n}\n\nexport const failure = <T>(error: T): Left<T> => ({ error })\n\nexport const success = <U>(result: U): Right<U> => ({ result })\n","import * as crypto from 'node:crypto'\n\nconst algorithm = 'aes-256-gcm'\nconst ivLength = 16\nconst tagLength = 16\nconst defaultEncoding = 'hex'\nconst defaultSaltLength = 64\nconst defaultPbkdf2Iterations = 100000\n\nexport type Options = {\n saltLength?: number\n pbkdf2Iterations?: number\n encoding?: NodeJS.BufferEncoding\n}\n\n/**\n * Type-scripted version of https://github.com/MauriceButler/cryptr\n */\nexport class EncryptionUtility {\n private readonly secret: string\n private readonly saltLength: number\n private readonly encryptedPosition: number\n private readonly tagPosition: number\n private readonly pbkdf2Iterations: number\n private readonly encoding: NodeJS.BufferEncoding\n\n constructor(secret: string, options?: Options) {\n this.secret = secret\n\n this.encoding = options?.encoding ?? defaultEncoding\n this.pbkdf2Iterations = options?.pbkdf2Iterations ?? defaultPbkdf2Iterations\n this.saltLength = options?.saltLength ?? defaultSaltLength\n\n this.tagPosition = this.saltLength + ivLength\n this.encryptedPosition = this.tagPosition + tagLength\n }\n\n private getKey(salt: Buffer) {\n return crypto.pbkdf2Sync(this.secret, salt, this.pbkdf2Iterations, 32, 'sha512')\n }\n\n public encrypt(value: string) {\n const iv = crypto.randomBytes(ivLength)\n const salt = crypto.randomBytes(this.saltLength)\n\n const key = this.getKey(salt)\n\n const cipher = crypto.createCipheriv(algorithm, key, iv)\n const encrypted = Buffer.concat([cipher.update(String(value), 'utf8'), cipher.final()])\n\n const tag = cipher.getAuthTag()\n\n return Buffer.concat([salt, iv, tag, encrypted]).toString(this.encoding)\n }\n\n public decrypt(value: string) {\n const stringValue = Buffer.from(String(value), this.encoding)\n\n const salt = stringValue.subarray(0, this.saltLength)\n const iv = stringValue.subarray(this.saltLength, this.tagPosition)\n const tag = stringValue.subarray(this.tagPosition, this.encryptedPosition)\n const encrypted = stringValue.subarray(this.encryptedPosition)\n\n const key = this.getKey(salt)\n\n const decipher = crypto.createDecipheriv(algorithm, key, iv)\n\n decipher.setAuthTag(tag)\n\n return Buffer.concat([\n decipher.update(encrypted),\n Buffer.from(decipher.final('utf8')),\n ]).toString('utf8')\n }\n}\n","export function chunk<T>(array: T[], chunkSize: number): T[][] {\n const length = array.length\n if (!length || chunkSize < 1) {\n return []\n }\n let index = 0\n let resIndex = 0\n const result = new Array(Math.ceil(length / chunkSize))\n\n while (index < length) {\n // biome-ignore lint/suspicious/noAssignInExpressions: <explanation>\n result[resIndex++] = array.slice(index, (index += chunkSize))\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return result\n}\n\nexport async function callChunked<Item>(\n chunkSize: number,\n array: readonly Item[],\n processFn: (arrayChunk: Item[]) => Promise<unknown>,\n): Promise<void> {\n for (let i = 0; i < array.length; i += chunkSize) {\n const arrayChunk = array.slice(i, i + chunkSize)\n await processFn(arrayChunk)\n }\n}\n\n/**\n * Return a copy of the given array without null or undefined values\n */\nexport function removeNullish<const T>(array: readonly (T | null | undefined)[]): T[] {\n return array.filter((e) => e !== undefined && e !== null) as T[]\n}\n\n/**\n * Return a copy of the given array without falsy values (eg: false, 0, '', null, undefined)\n */\nexport function removeFalsy<const T>(\n array: readonly (T | null | undefined | 0 | '' | false)[],\n): T[] {\n return array.filter((e) => e) as T[]\n}\n\n/**\n * Return a copy of the given array without duplicates.\n */\nexport function removeDuplicates<const T>(array: readonly T[]): T[] {\n return [...new Set(array)]\n}\n","import dotProp from 'dot-prop'\n\nimport { InternalError } from '../errors/InternalError'\n\ntype RecordKeyType = string | number | symbol\n\nexport function copyWithoutUndefined<\n T extends Record<RecordKeyType, unknown>,\n TargetRecordType = Pick<\n T,\n {\n [Prop in keyof T]: T[Prop] extends null | undefined ? never : Prop\n }[keyof T]\n >,\n>(originalValue: T): TargetRecordType {\n return Object.keys(originalValue).reduce(\n (acc, key) => {\n // @ts-ignore\n if (originalValue[key] !== undefined) {\n // @ts-ignore\n acc[key] = originalValue[key]\n }\n return acc\n },\n {} as Record<string, unknown>,\n ) as TargetRecordType\n}\n\nexport function copyWithoutEmpty<\n T extends Record<RecordKeyType, unknown>,\n TargetRecordType = Pick<\n T,\n {\n [Prop in keyof T]: T[Prop] extends null | undefined | '' ? never : Prop\n }[keyof T]\n >,\n>(originalValue: T): TargetRecordType {\n return Object.keys(originalValue).reduce(\n (acc, key) => {\n if (\n originalValue[key] !== undefined &&\n originalValue[key] !== null &&\n // @ts-ignore\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n (typeof originalValue[key] !== 'string' || originalValue[key].trim().length > 0)\n ) {\n // @ts-ignore\n acc[key] = originalValue[key]\n }\n return acc\n },\n {} as Record<string, unknown>,\n ) as TargetRecordType\n}\n\nexport function pick<T, K extends string | number | symbol>(\n source: T,\n propNames: readonly K[],\n): Pick<T, Exclude<keyof T, Exclude<keyof T, K>>> {\n const result = {} as T\n let idx = 0\n while (idx < propNames.length) {\n // @ts-ignore\n if (propNames[idx] in source) {\n // @ts-ignore\n result[propNames[idx]] = source[propNames[idx]]\n }\n idx += 1\n }\n return result\n}\n\nexport function pickWithoutUndefined<T, K extends string | number | symbol>(\n source: T,\n propNames: readonly K[],\n): Pick<T, Exclude<keyof T, Exclude<keyof T, K>>> {\n const result = {} as T\n let idx = 0\n while (idx < propNames.length) {\n // @ts-ignore\n if (propNames[idx] in source && source[propNames[idx]] !== undefined) {\n // @ts-ignore\n result[propNames[idx]] = source[propNames[idx]]\n }\n idx += 1\n }\n return result\n}\n\nexport function isEmptyObject(params: Record<string, unknown>): boolean {\n for (const key in params) {\n if (Object.hasOwn(params, key) && params[key] !== undefined) {\n return false\n }\n }\n return true\n}\n\ntype KeysMatching<T, V> = { [K in keyof T]: T[K] extends V ? K : never }[keyof T]\n\n/**\n * @param array The array of objects to be grouped.\n * @param selector The key used for grouping the objects.\n * @returns An object where the keys are unique values from the given selector and the values are the corresponding objects from the array.\n */\nexport function groupBy<\n T extends object,\n K extends KeysMatching<T, RecordKeyType | null | undefined>,\n>(array: T[], selector: K): Record<RecordKeyType, T[]> {\n return array.reduce(\n (acc, item) => {\n const key = item[selector] as RecordKeyType | null | undefined\n if (key === undefined || key === null) {\n return acc\n }\n if (!acc[key]) {\n acc[key] = []\n }\n acc[key].push(item)\n return acc\n },\n {} as Record<RecordKeyType, T[]>,\n )\n}\n\n/**\n * @param array The array of objects to be grouped.\n * @param selector The key used for grouping the objects. Support nested keys.\n * @returns An object where the keys are unique values from the given selector and the values are the corresponding objects from the array.\n */\nexport function groupByPath<T extends object>(array: T[], selector: string): Record<string, T[]> {\n return array.reduce(\n (acc, item) => {\n const key = dotProp.get(item, selector)\n if (key === undefined || key === null) {\n return acc\n }\n const strKeyPath = key as string\n\n if (!acc[strKeyPath]) {\n acc[strKeyPath] = []\n }\n acc[strKeyPath].push(item)\n return acc\n },\n {} as Record<RecordKeyType, T[]>,\n )\n}\n\n/**\n * @param array The array of objects to be grouped.\n * @param selector The key used for grouping the objects.\n * @returns An object where the keys are unique values from the given selector and the value is the\n * corresponding object from the array.\n * @throws InternalError If a duplicated value is found for the given selector.\n */\nexport function groupByUnique<\n T extends object,\n K extends KeysMatching<T, RecordKeyType | null | undefined>,\n>(array: T[], selector: K): Record<RecordKeyType, T> {\n return array.reduce(\n (acc, item) => {\n const key = item[selector] as RecordKeyType | null | undefined\n if (key === undefined || key === null) {\n return acc\n }\n if (acc[key] !== undefined) {\n throw new InternalError({\n message: `Duplicated item for selector ${selector.toString()} with value ${key.toString()}`,\n errorCode: 'DUPLICATED_ITEM',\n details: { selector, value: key },\n })\n }\n acc[key] = item\n return acc\n },\n {} as Record<RecordKeyType, T>,\n )\n}\n\ntype DatesAsString<T> = T extends Date ? string : ExactlyLikeWithDateAsString<T>\n\ntype ExactlyLikeWithDateAsString<T> = T extends object ? { [K in keyof T]: DatesAsString<T[K]> } : T\n\nexport function convertDateFieldsToIsoString<Input extends object>(\n object: Input,\n): ExactlyLikeWithDateAsString<Input>\nexport function convertDateFieldsToIsoString<Input extends object>(\n object: Input[],\n): ExactlyLikeWithDateAsString<Input>[]\nexport function convertDateFieldsToIsoString<Input extends object>(\n object: Input | Input[],\n): ExactlyLikeWithDateAsString<Input> | ExactlyLikeWithDateAsString<Input>[] {\n if (Array.isArray(object)) {\n // @ts-ignore\n return object.map(convertDateFieldsToIsoStringAux)\n }\n\n return Object.entries(object).reduce(\n (result, [key, value]) => {\n // @ts-ignore\n result[key] = convertDateFieldsToIsoStringAux(value)\n return result\n },\n {} as ExactlyLikeWithDateAsString<Input>,\n )\n}\n\nfunction convertDateFieldsToIsoStringAux<T>(item: T): DatesAsString<T> {\n if (item instanceof Date) {\n // @ts-ignore\n return item.toISOString()\n }\n\n if (item && typeof item === 'object') {\n // @ts-ignore\n return convertDateFieldsToIsoString(item)\n }\n\n // @ts-ignore\n return item\n}\n\n/**\n * Return a deep clone copy of an object.\n *\n * Please Note: This uses structuredClone, which has the limitations of these restricted Types: functions,\n * Error objects, WeakMap, WeakSet, DOM nodes, and certain other browser-specific objects like Window.\n */\nexport function deepClone<T extends object | undefined | null>(object: T): T {\n if (object === undefined || object === null) {\n return object\n }\n return structuredClone(object)\n}\n\nfunction transformKey(key: string): string {\n return key\n .replace(/([a-z])([A-Z])/g, '$1-$2') // transforms basic camelCase\n .replace(/([A-Z])([A-Z][a-z])/g, '$1-$2') // transforms abbreviations\n .replace(/_/g, '-') // transforms snake_case\n .toLowerCase() // finally lowercase all\n}\n\ntype TransformToKebabCaseInputType = Record<string, unknown> | null | undefined\ntype TransformToKebabCaseReturnType<Input, Output> = Input extends Record<string, unknown>\n ? Output\n : Input\n/**\n * Transforms an object's keys from camelCase or snake_case to kebab-case.\n * @param object\n */\nexport function transformToKebabCase<\n Output extends Record<string, unknown>,\n Input extends TransformToKebabCaseInputType,\n>(object: Input): TransformToKebabCaseReturnType<Input, Output>\n\nexport function transformToKebabCase<\n Output extends Record<string, unknown>,\n Input extends TransformToKebabCaseInputType,\n>(object: Input[]): TransformToKebabCaseReturnType<Input, Output>[]\n\nexport function transformToKebabCase<Output, Input>(\n object: Input | Input[],\n): TransformToKebabCaseReturnType<Input, Output> | TransformToKebabCaseReturnType<Input, Output>[] {\n if (Array.isArray(object)) {\n // @ts-ignore\n return object.map(transformToKebabCase)\n }\n if (typeof object !== 'object' || object === null || object === undefined) {\n return object as TransformToKebabCaseReturnType<Input, Output>\n }\n\n return Object.entries(object as Record<string, unknown>).reduce(\n (result, [key, value]) => {\n const transformedKey = transformKey(key)\n const transformedValue =\n value && typeof value === 'object'\n ? transformToKebabCase(value as TransformToKebabCaseInputType)\n : value\n\n // Avoiding destructuring by directly assigning the new key-value pair\n result[transformedKey] = transformedValue\n return result\n },\n {} as Record<string, unknown>,\n ) as TransformToKebabCaseReturnType<Input, Output>\n}\n","// Error structure commonly used in libraries, e. g. fastify\nexport type StandardizedError = {\n code: string\n message: string\n}\n\nexport function hasMessage(maybe: unknown): maybe is { message: string } {\n return isObject(maybe) && typeof maybe.message === 'string'\n}\n\nexport function isObject(maybeObject: unknown): maybeObject is Record<PropertyKey, unknown> {\n return typeof maybeObject === 'object' && maybeObject !== null\n}\n\nexport function isStandardizedError(error: unknown): error is StandardizedError {\n return isObject(error) && typeof error.code === 'string' && typeof error.message === 'string'\n}\n\nexport function isError(maybeError: unknown): maybeError is Error {\n return (\n maybeError instanceof Error || Object.prototype.toString.call(maybeError) === '[object Error]'\n )\n}\n","import { createHash } from 'node:crypto'\n\nexport enum HashEncoding {\n HEX = 'hex',\n BASE64 = 'base64',\n}\n\nexport enum HashAlgorithm {\n SHA256 = 'sha256',\n SHA512 = 'sha512',\n}\n\nexport function generateHash(\n algorithm: HashAlgorithm,\n data: string,\n encoding: HashEncoding = HashEncoding.HEX,\n) {\n return createHash(algorithm).update(data).digest(encoding)\n}\n","import type { Level, Logger, LoggerOptions } from 'pino'\nimport pino, { levels } from 'pino'\nimport pretty from 'pino-pretty'\n\nexport type AppLoggerConfig = {\n logLevel: 'fatal' | 'error' | 'warn' | 'info' | 'debug' | 'trace' | 'silent'\n nodeEnv: 'production' | 'development' | 'test'\n base?: Record<string, unknown>\n redact?: LoggerOptions['redact']\n}\n\nexport type MonorepoAppLoggerConfig = AppLoggerConfig & {\n targetFile?: string\n append?: boolean\n}\n\n/* c8 ignore next 8 */\nexport function resolveMonorepoLogger(appConfig: MonorepoAppLoggerConfig): Logger {\n if (appConfig.nodeEnv !== 'development') {\n return resolveLogger(appConfig)\n }\n\n const configuration = resolveMonorepoLoggerConfiguration(appConfig) as LoggerOptions\n return pino(configuration)\n}\n\n// Note that transports do not work in vitest, likely because pino attempts to run them in a separate worker\n/* c8 ignore next 25 */\nexport function resolveMonorepoLoggerConfiguration(\n appConfig: MonorepoAppLoggerConfig,\n): LoggerOptions | Logger {\n if (appConfig.nodeEnv !== 'development') {\n return resolveLoggerConfiguration(appConfig)\n }\n\n return {\n level: appConfig.logLevel,\n formatters: {\n level: (label) => {\n return { level: label }\n },\n },\n redact: appConfig.redact,\n transport: {\n target: 'pino/file',\n options: {\n destination: appConfig.targetFile ?? './service.log',\n mkdir: true,\n append: appConfig.append ?? false,\n },\n },\n }\n}\n\nexport function resolveLogger(appConfig: AppLoggerConfig): Logger {\n if (appConfig.nodeEnv !== 'production') {\n return resolveLoggerConfiguration(appConfig) as Logger\n }\n\n const configuration = resolveLoggerConfiguration(appConfig) as LoggerOptions\n return pino(configuration)\n}\n\nexport function resolveLoggerConfiguration(appConfig: AppLoggerConfig): LoggerOptions | Logger {\n if (appConfig.nodeEnv !== 'production') {\n return pino(\n pretty({\n sync: true,\n minimumLevel: appConfig.logLevel as Level,\n colorize: true,\n translateTime: 'SYS:standard',\n ignore: 'hostname,pid',\n }),\n )\n }\n\n return {\n level: appConfig.logLevel,\n formatters: {\n level: (_label, numericLevel): { level: string } => {\n const level = levels.labels[numericLevel] || 'unknown'\n return { level }\n },\n },\n redact: appConfig.redact,\n } satisfies LoggerOptions\n}\n","/**\n * Serializes the given value into a JSON string and explicitly wraps it in double quotes.\n * This ensures that log collectors (like Graylog) treat it as a string and not as a JSON object,\n * preventing the automatic extraction of properties that could lead to property explosion.\n * Max length is set to 8100 (+4 for quotes) characters to prevent issues with log collectors\n * (Graylog) that have a limit of 32766 bytes per field. In the worst case scenario, each character\n * is 4 bytes (UTF-32), so we limit the string to 8100 characters to stay within the limit.\n */\nexport const stringValueSerializer = (value: unknown, maxLength = 8100): string => {\n const baseValue = valueToString(value)\n\n const truncated = baseValue.length > maxLength ? baseValue.slice(0, maxLength) : baseValue\n\n return typeof value === 'string' ? `\"\"${truncated}\"\"` : `\"${truncated}\"`\n}\n\nconst valueToString = (value: unknown): string => {\n if (typeof value === 'string') {\n return value\n }\n\n if (typeof value === 'bigint') {\n return value.toString()\n }\n\n if (typeof value === 'symbol') {\n return value.toString()\n }\n\n if (value === undefined) {\n return 'undefined'\n }\n\n if (typeof value === 'function') {\n return value.toString()\n }\n\n try {\n return JSON.stringify(value)\n } catch {\n return String(value) // fallback for circular references etc.\n }\n}\n","import type { SerializedError } from 'pino'\nimport pino, { levels, stdSerializers } from 'pino'\n\nimport type { CommonLogger } from '../logging/commonLogger'\nimport { hasMessage, isError } from '../utils/typeUtils'\n\ntype LogObject = {\n msg: string // this is the default pino message key\n 'x-request-id'?: string\n error?: SerializedError\n}\n\nexport const globalLogger: CommonLogger = pino({\n formatters: {\n level: (_label, numericLevel): { level: string } => {\n const level = levels.labels[numericLevel] || 'unknown'\n return { level }\n },\n },\n})\n\nexport function resolveGlobalErrorLogObject(err: unknown, correlationId?: string): LogObject {\n if (isError(err)) {\n return {\n msg: err.message,\n error: stdSerializers.err(err),\n 'x-request-id': correlationId,\n }\n }\n\n if (hasMessage(err)) {\n return {\n msg: err.message,\n 'x-request-id': correlationId,\n }\n }\n\n return {\n msg: 'Unknown error',\n 'x-request-id': correlationId,\n }\n}\n\nexport function executeAndHandleGlobalErrors<T>(operation: () => T) {\n try {\n const result = operation()\n return result\n } catch (err) {\n const logObject = resolveGlobalErrorLogObject(err)\n globalLogger.error(logObject)\n process.exit(1)\n }\n}\n\nexport async function executeAsyncAndHandleGlobalErrors<T>(\n operation: () => Promise<T>,\n stopOnError?: true,\n): Promise<T>\nexport async function executeAsyncAndHandleGlobalErrors<T>(\n operation: () => Promise<T>,\n stopOnError: false,\n): Promise<T | undefined>\nexport async function executeAsyncAndHandleGlobalErrors<T>(\n operation: () => Promise<T>,\n stopOnError = true,\n): Promise<T | undefined> {\n try {\n const result = await operation()\n return result\n } catch (err) {\n const logObject = resolveGlobalErrorLogObject(err)\n globalLogger.error(logObject)\n if (stopOnError) {\n process.exit(1)\n }\n }\n}\n\nexport async function executeSettleAllAndHandleGlobalErrors<T>(\n promises: Promise<T>[],\n stopOnError?: true,\n): Promise<PromiseSettledResult<T>[]>\nexport async function executeSettleAllAndHandleGlobalErrors<T>(\n promises: Promise<T>[],\n stopOnError: false,\n): Promise<PromiseSettledResult<T>[] | undefined>\nexport async function executeSettleAllAndHandleGlobalErrors<T>(\n promises: Promise<T>[],\n stopOnError = true,\n): Promise<PromiseSettledResult<T>[] | undefined> {\n const result = await Promise.allSettled(promises)\n\n let errorsHappened: boolean | undefined\n for (const entry of result) {\n if (entry.status === 'rejected') {\n const logObject = resolveGlobalErrorLogObject(entry.reason)\n globalLogger.error(logObject)\n errorsHappened = true\n }\n }\n\n if (stopOnError && errorsHappened) {\n process.exit(1)\n }\n\n if (!stopOnError && errorsHappened) {\n return undefined\n }\n\n return result\n}\n","import { constants as httpConstants } from 'node:http2'\n\nimport type { FreeformRecord } from '../common/commonTypes'\n\nimport { PublicNonRecoverableError } from './PublicNonRecoverableError'\n\nexport type CommonErrorParams = {\n message: string\n details?: FreeformRecord\n cause?: Error\n}\n\nexport type OptionalMessageErrorParams = Partial<CommonErrorParams>\n\nexport type ValidationError = {\n message: string\n path: string[]\n}\n\nexport class RequestValidationError extends PublicNonRecoverableError<{\n error: ValidationError[]\n}> {\n constructor(errors: ValidationError[]) {\n super({\n message: 'Invalid params',\n errorCode: 'VALIDATION_ERROR',\n httpStatusCode: httpConstants.HTTP_STATUS_BAD_REQUEST,\n details: {\n error: errors,\n },\n })\n }\n}\n\nexport class AccessDeniedError extends PublicNonRecoverableError {\n constructor(params: CommonErrorParams) {\n super({\n message: params.message,\n errorCode: 'ACCESS_DENIED',\n httpStatusCode: httpConstants.HTTP_STATUS_FORBIDDEN,\n details: params.details,\n cause: params.cause,\n })\n }\n}\n\nexport class EntityNotFoundError extends PublicNonRecoverableError {\n constructor(params: CommonErrorParams) {\n super({\n message: params.message,\n errorCode: 'ENTITY_NOT_FOUND',\n httpStatusCode: httpConstants.HTTP_STATUS_NOT_FOUND,\n details: params.details,\n cause: params.cause,\n })\n }\n}\n\nexport class EntityGoneError extends PublicNonRecoverableError {\n constructor(params: CommonErrorParams) {\n super({\n message: params.message,\n errorCode: 'ENTITY_GONE',\n httpStatusCode: httpConstants.HTTP_STATUS_GONE,\n details: params.details,\n })\n }\n}\n\nexport class AuthFailedError extends PublicNonRecoverableError {\n constructor(params: OptionalMessageErrorParams = {}) {\n super({\n message: params.message ?? 'Authentication failed',\n errorCode: 'AUTH_FAILED',\n httpStatusCode: httpConstants.HTTP_STATUS_UNAUTHORIZED,\n details: params.details,\n cause: params.cause,\n })\n }\n}\n","export const waitAndRetry = async <T>(\n predicateFn: () => T,\n sleepTime = 20,\n maxRetryCount = 15,\n): Promise<T> => {\n return new Promise((resolve, reject) => {\n let retryCount = 0\n function performCheck() {\n // amount of retries exceeded\n if (maxRetryCount !== 0 && retryCount > maxRetryCount) {\n resolve(predicateFn())\n }\n\n // Try executing predicateFn\n Promise.resolve()\n .then(() => {\n return predicateFn()\n })\n .then((result) => {\n if (result) {\n resolve(result)\n } else {\n retryCount++\n setTimeout(performCheck, sleepTime)\n }\n })\n .catch((err) => {\n reject(err)\n })\n }\n\n performCheck()\n })\n}\n","import type { TransactionObservabilityManager } from './observabilityTypes'\n\n/**\n * Groups different TransactionObservabilityManager instances into one\n * to facilitate tracking transactions across multiple observability tools.\n */\nexport class MultiTransactionObservabilityManager implements TransactionObservabilityManager {\n private readonly managers: TransactionObservabilityManager[]\n\n constructor(managers: TransactionObservabilityManager[]) {\n this.managers = managers\n }\n\n start(transactionName: string, uniqueTransactionKey: string): void {\n for (const manager of this.managers) {\n manager.start(transactionName, uniqueTransactionKey)\n }\n }\n\n startWithGroup(\n transactionName: string,\n uniqueTransactionKey: string,\n transactionGroup: string,\n ): void {\n for (const manager of this.managers) {\n manager.startWithGroup(transactionName, uniqueTransactionKey, transactionGroup)\n }\n }\n\n stop(uniqueTransactionKey: string, wasSuccessful?: boolean): void {\n for (const manager of this.managers) {\n manager.stop(uniqueTransactionKey, wasSuccessful)\n }\n }\n\n addCustomAttributes(\n uniqueTransactionKey: string,\n atts: { [p: string]: string | number | boolean },\n ): void {\n for (const manager of this.managers) {\n manager.addCustomAttributes(uniqueTransactionKey, atts)\n }\n }\n}\n","import type { BinaryLike } from 'node:crypto'\nimport { createHash } from 'node:crypto'\nimport type { Readable } from 'node:stream'\n\nconst HASH_ALGORITHM = 'md5'\n\nexport function generateChecksumForBufferOrString(data: BinaryLike): string {\n return createHash(HASH_ALGORITHM).update(data).digest('hex')\n}\n\nexport function generateChecksumForObject(object: object): string {\n const objectAsString = JSON.stringify(object)\n return generateChecksumForBufferOrString(objectAsString)\n}\n\nexport function generateChecksumForReadable(readable: Readable): Promise<string> {\n return new Promise((resolve, reject) => {\n const hashCreator = createHash(HASH_ALGORITHM)\n readable.on('data', (data) => {\n if (Buffer.isBuffer(data)) {\n hashCreator.update(data)\n } else {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n hashCreator.update(Buffer.from(data))\n }\n })\n\n readable.on('end', () => {\n const hash = hashCreator.digest('hex')\n resolve(hash)\n })\n readable.on('error', (err) => {\n /* c8 ignore next 1 */\n reject(err)\n })\n })\n}\n","import { F_OK } from 'node:constants'\nimport { access, createReadStream, createWriteStream } from 'node:fs'\nimport { stat, unlink } from 'node:fs/promises'\nimport type { Readable } from 'node:stream'\nimport { pipeline } from 'node:stream'\n\nexport type ReadableProvider = {\n /**\n * Guarantees to provide a new stream every time this is called, before `destroy` is invoked.\n */\n createStream(): Promise<Readable>\n\n /**\n * Returns size of the persisted content\n */\n getContentLength(): Promise<number>\n\n /**\n * Remove the persisted value. No new streams can be created after this is called\n */\n destroy(): Promise<void>\n}\n\nexport type PersistToFsOptions = {\n targetFile: string\n sourceReadable: Readable\n}\n\nexport type FsReadableProviderOptions = {\n storageFile: string\n}\n\nexport class FsReadableProvider implements ReadableProvider {\n public readonly storageFile: string\n constructor(options: FsReadableProviderOptions) {\n this.storageFile = options.storageFile\n }\n\n fileExists(): Promise<boolean> {\n return new Promise((resolve) => {\n access(this.storageFile, F_OK, (err) => {\n return resolve(!err)\n })\n })\n }\n\n async getContentLength(): Promise<number> {\n if (!(await this.fileExists())) {\n throw new Error(`File ${this.storageFile} was already deleted.`)\n }\n const stats = await stat(this.storageFile)\n return stats.size\n }\n\n async createStream(): Promise<Readable> {\n if (!(await this.fileExists())) {\n throw new Error(`File ${this.storageFile} was already deleted.`)\n }\n\n return createReadStream(this.storageFile)\n }\n\n async destroy(): Promise<void> {\n if (!(await this.fileExists())) {\n // nothing to do here\n return\n }\n\n return unlink(this.storageFile)\n }\n\n protected async persist(sourceReadable: Readable): Promise<void> {\n const writable = createWriteStream(this.storageFile)\n return new Promise((resolve, reject) => {\n pipeline(sourceReadable, writable, (err) => {\n if (err) {\n /* c8 ignore next 1 */\n reject(err)\n } else {\n resolve()\n }\n })\n })\n }\n\n public static async persistReadableToFs(\n options: PersistToFsOptions,\n ): Promise<FsReadableProvider> {\n const provider = new FsReadableProvider({\n storageFile: options.targetFile,\n })\n await provider.persist(options.sourceReadable)\n return provider\n }\n}\n\n/**\n * Consumes the readable in order to calculate its length in bytes\n * @param readable\n */\nexport function getReadableContentLength(readable: Readable): Promise<number> {\n return new Promise((resolve, reject) => {\n let size = 0\n readable.on('data', (chunk) => {\n if (typeof chunk === 'string' || Buffer.isBuffer(chunk)) {\n size += Buffer.byteLength(chunk)\n }\n })\n readable.on('end', () => {\n resolve(size)\n })\n readable.on('error', (error) => {\n /* c8 ignore next 1 */\n reject(error)\n })\n })\n}\n\n/**\n * Consumes the readable stream and returns its content as a Buffer.\n * @param stream - The readable stream to consume.\n * @returns A promise that resolves to a Buffer containing the stream's content.\n */\nexport async function streamToBuffer(stream: Readable): Promise<Buffer> {\n const chunks: Buffer[] = []\n for await (const chunk of stream) {\n chunks.push(chunk as Buffer)\n }\n return Buffer.concat(chunks)\n}\n"],"mappings":"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","names":["import_types","dotProp","HashEncoding","HashAlgorithm","algorithm","pino","pretty","import_pino","pino","httpConstants","import_node_crypto","chunk"]}
package/dist/index.d.cts CHANGED
@@ -10,6 +10,28 @@ type BaseErrorParams = {
10
10
  cause?: unknown;
11
11
  };
12
12
 
13
+ /**
14
+ * Custom error class that enables reliable instanceof checks across realms
15
+ * (e.g., iframes, workers, or Node.js VM).
16
+ * Also ensures subclasses like `NotFoundError` have a consistent error name
17
+ * (i.e., `error.name` is set to the subclass name instead of `EnhancedError`).
18
+ *
19
+ * It works by creating unique symbols for each inheritance path, such as:
20
+ * - 'EnhancedError'
21
+ * - 'EnhancedError.Subclass1'
22
+ * - 'EnhancedError.Subclass1.Subclass2',
23
+ * assigning them to the instance using `Symbol.for` on instantiation.
24
+ * The custom `instanceof` logic (overriding `Symbol.hasInstance`) checks if the corresponding
25
+ * symbol for the constructor’s prototype path exists on the tested object.
26
+ *
27
+ * This technique allows `instanceof` to succeed across realms where normal prototype chain checks fail,
28
+ * because symbols created via `Symbol.for` are shared globally and can be reliably compared.
29
+ */
30
+ declare class EnhancedError extends Error {
31
+ constructor(message?: string, options?: ErrorOptions);
32
+ static [Symbol.hasInstance](val: unknown): boolean;
33
+ }
34
+
13
35
  type BasePublicErrorParams = BaseErrorParams & {
14
36
  httpStatusCode?: number;
15
37
  };
@@ -19,22 +41,28 @@ type PublicNonRecoverableErrorParams<T extends ErrorDetails | undefined = ErrorD
19
41
  /**
20
42
  * This error is returned to the consumer of API
21
43
  */
22
- declare class PublicNonRecoverableError<T extends ErrorDetails | undefined = ErrorDetails | undefined> extends Error {
44
+ declare class PublicNonRecoverableError<T extends ErrorDetails | undefined = ErrorDetails | undefined> extends EnhancedError {
23
45
  readonly details: T;
24
46
  readonly errorCode: string;
25
47
  readonly httpStatusCode: number;
26
48
  constructor(params: PublicNonRecoverableErrorParams<T>);
27
49
  }
50
+ /**
51
+ * @deprecated Use `error instanceof PublicNonRecoverableError` instead.
52
+ */
28
53
  declare function isPublicNonRecoverableError(error: unknown): error is PublicNonRecoverableError;
29
54
 
30
55
  type InternalErrorParams<T extends ErrorDetails | undefined = ErrorDetails | undefined> = T extends undefined ? BaseErrorParams : BaseErrorParams & {
31
56
  details: T;
32
57
  };
33
- declare class InternalError<T extends ErrorDetails | undefined = ErrorDetails | undefined> extends Error {
58
+ declare class InternalError<T extends ErrorDetails | undefined = ErrorDetails | undefined> extends EnhancedError {
34
59
  readonly errorCode: string;
35
60
  readonly details: T;
36
61
  constructor(params: InternalErrorParams<T>);
37
62
  }
63
+ /**
64
+ * @deprecated Use `error instanceof InternalError` instead.
65
+ */
38
66
  declare function isInternalError(error: unknown): error is InternalError;
39
67
 
40
68
  type FreeformRecord = Record<string, any>;
package/dist/index.d.ts CHANGED
@@ -10,6 +10,28 @@ type BaseErrorParams = {
10
10
  cause?: unknown;
11
11
  };
12
12
 
13
+ /**
14
+ * Custom error class that enables reliable instanceof checks across realms
15
+ * (e.g., iframes, workers, or Node.js VM).
16
+ * Also ensures subclasses like `NotFoundError` have a consistent error name
17
+ * (i.e., `error.name` is set to the subclass name instead of `EnhancedError`).
18
+ *
19
+ * It works by creating unique symbols for each inheritance path, such as:
20
+ * - 'EnhancedError'
21
+ * - 'EnhancedError.Subclass1'
22
+ * - 'EnhancedError.Subclass1.Subclass2',
23
+ * assigning them to the instance using `Symbol.for` on instantiation.
24
+ * The custom `instanceof` logic (overriding `Symbol.hasInstance`) checks if the corresponding
25
+ * symbol for the constructor’s prototype path exists on the tested object.
26
+ *
27
+ * This technique allows `instanceof` to succeed across realms where normal prototype chain checks fail,
28
+ * because symbols created via `Symbol.for` are shared globally and can be reliably compared.
29
+ */
30
+ declare class EnhancedError extends Error {
31
+ constructor(message?: string, options?: ErrorOptions);
32
+ static [Symbol.hasInstance](val: unknown): boolean;
33
+ }
34
+
13
35
  type BasePublicErrorParams = BaseErrorParams & {
14
36
  httpStatusCode?: number;
15
37
  };
@@ -19,22 +41,28 @@ type PublicNonRecoverableErrorParams<T extends ErrorDetails | undefined = ErrorD
19
41
  /**
20
42
  * This error is returned to the consumer of API
21
43
  */
22
- declare class PublicNonRecoverableError<T extends ErrorDetails | undefined = ErrorDetails | undefined> extends Error {
44
+ declare class PublicNonRecoverableError<T extends ErrorDetails | undefined = ErrorDetails | undefined> extends EnhancedError {
23
45
  readonly details: T;
24
46
  readonly errorCode: string;
25
47
  readonly httpStatusCode: number;
26
48
  constructor(params: PublicNonRecoverableErrorParams<T>);
27
49
  }
50
+ /**
51
+ * @deprecated Use `error instanceof PublicNonRecoverableError` instead.
52
+ */
28
53
  declare function isPublicNonRecoverableError(error: unknown): error is PublicNonRecoverableError;
29
54
 
30
55
  type InternalErrorParams<T extends ErrorDetails | undefined = ErrorDetails | undefined> = T extends undefined ? BaseErrorParams : BaseErrorParams & {
31
56
  details: T;
32
57
  };
33
- declare class InternalError<T extends ErrorDetails | undefined = ErrorDetails | undefined> extends Error {
58
+ declare class InternalError<T extends ErrorDetails | undefined = ErrorDetails | undefined> extends EnhancedError {
34
59
  readonly errorCode: string;
35
60
  readonly details: T;
36
61
  constructor(params: InternalErrorParams<T>);
37
62
  }
63
+ /**
64
+ * @deprecated Use `error instanceof InternalError` instead.
65
+ */
38
66
  declare function isInternalError(error: unknown): error is InternalError;
39
67
 
40
68
  type FreeformRecord = Record<string, any>;
package/dist/index.js CHANGED
@@ -1,7 +1,59 @@
1
1
  // src/errors/PublicNonRecoverableError.ts
2
2
  import { isNativeError } from "util/types";
3
- var PUBLIC_NON_RECOVERABLE_ERROR_SYMBOL = Symbol.for("PUBLIC_NON_RECOVERABLE_ERROR_KEY");
4
- var PublicNonRecoverableError = class extends Error {
3
+
4
+ // src/errors/EnhancedError.ts
5
+ var PROTOTYPE_PATH_DELIMITER = ".";
6
+ var getPrototypeNamesPostError = (input) => {
7
+ const names = [];
8
+ const isFunction = typeof input === "function";
9
+ let current = isFunction ? input : Object.getPrototypeOf(input);
10
+ while (current !== null) {
11
+ const name = isFunction ? current.name : current.constructor.name;
12
+ if (!name) {
13
+ break;
14
+ }
15
+ names.push(name);
16
+ current = Object.getPrototypeOf(current);
17
+ }
18
+ const reversedNames = names.reverse();
19
+ const errorIndex = reversedNames.indexOf(Error.name);
20
+ return reversedNames.slice(errorIndex + 1);
21
+ };
22
+ var generatePrototypePaths = (arr) => {
23
+ return arr.reduce((acc, element) => {
24
+ const prev = acc.at(-1);
25
+ if (!prev) {
26
+ acc.push(element);
27
+ } else {
28
+ acc.push(`${prev}${PROTOTYPE_PATH_DELIMITER}${element}`);
29
+ }
30
+ return acc;
31
+ }, []);
32
+ };
33
+ var EnhancedError = class extends Error {
34
+ constructor(message, options) {
35
+ super(message, options);
36
+ this.name = new.target.name;
37
+ const prototypeNames = getPrototypeNamesPostError(this);
38
+ const prototypePaths = generatePrototypePaths(prototypeNames);
39
+ for (const prototypePath of prototypePaths) {
40
+ const symbol = Symbol.for(prototypePath);
41
+ Object.defineProperty(this, symbol, { value: true });
42
+ }
43
+ }
44
+ static [Symbol.hasInstance](val) {
45
+ if (val === null || typeof val !== "object") {
46
+ return false;
47
+ }
48
+ const prototypeNames = getPrototypeNamesPostError(this);
49
+ const symbol = Symbol.for(prototypeNames.join(PROTOTYPE_PATH_DELIMITER));
50
+ return symbol in val && val[symbol] === true;
51
+ }
52
+ };
53
+
54
+ // src/errors/PublicNonRecoverableError.ts
55
+ var PUBLIC_NON_RECOVERABLE_ERROR_SYMBOL = /* @__PURE__ */ Symbol.for("PUBLIC_NON_RECOVERABLE_ERROR_KEY");
56
+ var PublicNonRecoverableError = class extends EnhancedError {
5
57
  details;
6
58
  errorCode;
7
59
  httpStatusCode;
@@ -24,8 +76,8 @@ function isPublicNonRecoverableError(error) {
24
76
 
25
77
  // src/errors/InternalError.ts
26
78
  import { isNativeError as isNativeError2 } from "util/types";
27
- var INTERNAL_ERROR_SYMBOL = Symbol.for("INTERNAL_ERROR_KEY");
28
- var InternalError = class extends Error {
79
+ var INTERNAL_ERROR_SYMBOL = /* @__PURE__ */ Symbol.for("INTERNAL_ERROR_KEY");
80
+ var InternalError = class extends EnhancedError {
29
81
  errorCode;
30
82
  details;
31
83
  constructor(params) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors/PublicNonRecoverableError.ts","../src/errors/InternalError.ts","../src/errors/errorTypeGuards.ts","../src/config/ConfigScope.ts","../src/config/configTransformers.ts","../src/config/configValidators.ts","../src/errors/either.ts","../src/utils/encryptionUtility.ts","../src/utils/arrayUtils.ts","../src/utils/objectUtils.ts","../src/utils/typeUtils.ts","../src/utils/hashUtils.ts","../src/logging/loggerConfigResolver.ts","../src/logging/stringValueSerializer.ts","../src/errors/globalErrorHandler.ts","../src/errors/publicErrors.ts","../src/utils/waitUtils.ts","../src/observability/MultiTransactionObservabilityManager.ts","../src/utils/checksumUtils.ts","../src/utils/streamUtils.ts"],"sourcesContent":["import { isNativeError } from 'node:util/types'\nimport type { BaseErrorParams, ErrorDetails } from './types'\n\ntype BasePublicErrorParams = BaseErrorParams & {\n httpStatusCode?: number\n}\n\nexport type PublicNonRecoverableErrorParams<\n T extends ErrorDetails | undefined = ErrorDetails | undefined,\n> = T extends undefined\n ? BasePublicErrorParams\n : BasePublicErrorParams & {\n details: T\n }\n\nconst PUBLIC_NON_RECOVERABLE_ERROR_SYMBOL = Symbol.for('PUBLIC_NON_RECOVERABLE_ERROR_KEY')\n\n/**\n * This error is returned to the consumer of API\n */\nexport class PublicNonRecoverableError<\n T extends ErrorDetails | undefined = ErrorDetails | undefined,\n> extends Error {\n public readonly details: T\n public readonly errorCode: string\n public readonly httpStatusCode: number\n\n constructor(params: PublicNonRecoverableErrorParams<T>) {\n super(params.message, {\n cause: params.cause,\n })\n // set the name as the class name for every class that extends PublicNonRecoverableError\n this.name = this.constructor.name\n // @ts-ignore\n this.details = params.details\n this.errorCode = params.errorCode\n this.httpStatusCode = params.httpStatusCode ?? 500\n }\n}\n\nObject.defineProperty(PublicNonRecoverableError.prototype, PUBLIC_NON_RECOVERABLE_ERROR_SYMBOL, {\n value: true,\n})\n\nexport function isPublicNonRecoverableError(error: unknown): error is PublicNonRecoverableError {\n return (\n isNativeError(error) &&\n ((PUBLIC_NON_RECOVERABLE_ERROR_SYMBOL in error &&\n error[PUBLIC_NON_RECOVERABLE_ERROR_SYMBOL] === true) ||\n error.name === 'PublicNonRecoverableError')\n )\n}\n","import { isNativeError } from 'node:util/types'\nimport type { BaseErrorParams, ErrorDetails } from './types'\n\nexport type InternalErrorParams<T extends ErrorDetails | undefined = ErrorDetails | undefined> =\n T extends undefined\n ? BaseErrorParams\n : BaseErrorParams & {\n details: T\n }\n\nconst INTERNAL_ERROR_SYMBOL = Symbol.for('INTERNAL_ERROR_KEY')\n\nexport class InternalError<\n T extends ErrorDetails | undefined = ErrorDetails | undefined,\n> extends Error {\n public readonly errorCode: string\n public readonly details: T\n\n constructor(params: InternalErrorParams<T>) {\n super(params.message, {\n cause: params.cause,\n })\n // set the name as the class name for every class that extends InternalError\n this.name = this.constructor.name\n // @ts-ignore\n this.details = params.details\n this.errorCode = params.errorCode\n }\n}\n\nObject.defineProperty(InternalError.prototype, INTERNAL_ERROR_SYMBOL, {\n value: true,\n})\n\nexport function isInternalError(error: unknown): error is InternalError {\n return (\n isNativeError(error) &&\n ((INTERNAL_ERROR_SYMBOL in error && error[INTERNAL_ERROR_SYMBOL] === true) ||\n error.name === 'InternalError')\n )\n}\n","import { isPublicNonRecoverableError } from '../errors/PublicNonRecoverableError'\n\nimport type { EntityGoneError } from './publicErrors'\n\nexport function isEntityGoneError(entity: unknown): entity is EntityGoneError {\n return isPublicNonRecoverableError(entity) && entity.httpStatusCode === 410\n}\n","import type { ZodSchema } from 'zod/v4'\nimport { InternalError } from '../errors/InternalError'\nimport type { EnvValueValidator } from './configTypes'\n\nexport type EnvType = {\n [key: string]: string | undefined\n}\n\nexport class ConfigScope {\n private env: EnvType\n\n constructor(envOverride?: EnvType) {\n this.env = envOverride ?? { ...process.env }\n }\n\n updateEnv() {\n // Accessing process.env values is slow, so we cache them\n this.env = { ...process.env }\n }\n\n getBySchema<T>(param: string, schema: ZodSchema<T>): T {\n const rawValue = this.env[param]\n\n const result = schema.safeParse(rawValue)\n\n if (!result.success) {\n throw new InternalError({\n message: `Validation of configuration parameter \"${param}\" has failed: ${result.error.issues.at(0)?.message}`,\n errorCode: 'CONFIGURATION_ERROR',\n cause: result.error,\n })\n }\n\n return result.data\n }\n\n getMandatoryInteger(param: string): number {\n const rawValue = this.env[param]\n if (!rawValue) {\n throw new InternalError({\n message: `Missing mandatory configuration parameter: ${param}`,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n return validateNumber(\n Number.parseInt(rawValue),\n `Configuration parameter ${param}\\` must be an integer number, but was ${rawValue}`,\n )\n }\n\n getMandatoryNumber(param: string): number {\n const rawValue = this.env[param]\n if (!rawValue) {\n throw new InternalError({\n message: `Missing mandatory configuration parameter: ${param}`,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n return validateNumber(\n Number.parseFloat(rawValue),\n `Configuration parameter ${param}\\` must be a number, but was ${rawValue}`,\n )\n }\n\n getMandatory(param: string): string {\n const result = this.env[param]\n if (!result) {\n throw new InternalError({\n message: `Missing mandatory configuration parameter: ${param}`,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n return result\n }\n\n getMandatoryOneOf<const T>(param: string, supportedValues: T[]): T {\n const result = this.getMandatory(param)\n return validateOneOf(\n result,\n supportedValues,\n `Unsupported ${param}: ${result}. Supported values: ${supportedValues.toString()}`,\n )\n }\n\n getMandatoryValidatedInteger(param: string, validator: EnvValueValidator<number>): number {\n const value = this.getMandatoryInteger(param)\n if (!validator(value)) {\n throw new InternalError({\n message: `Value ${value} is invalid for parameter ${param}`,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n return value\n }\n\n getMandatoryValidatedNumber(param: string, validator: EnvValueValidator<number>): number {\n const value = this.getMandatoryNumber(param)\n if (!validator(value)) {\n throw new InternalError({\n message: `Value ${value} is invalid for parameter ${param}`,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n return value\n }\n\n getOptionalNullable<T extends string | null | undefined>(\n param: string,\n defaultValue: T,\n ): T | string {\n return this.env[param] || defaultValue\n }\n\n getOptional(param: string, defaultValue: string): string {\n // Using the `||` operator instead of `??`, since '' is not a valid value, and 0 (number) is not expected here\n return this.env[param] || defaultValue\n }\n\n getOptionalInteger(param: string, defaultValue: number): number {\n const rawValue = this.env[param]\n if (!rawValue) {\n return defaultValue\n }\n return validateNumber(\n Number.parseInt(rawValue),\n `Configuration parameter ${param}\\` must be a number, but was ${rawValue}`,\n )\n }\n\n getOptionalNumber(param: string, defaultValue: number): number {\n const rawValue = this.env[param]\n if (!rawValue) {\n return defaultValue\n }\n return validateNumber(\n Number.parseFloat(rawValue),\n `Configuration parameter ${param}\\` must be a number, but was ${rawValue}`,\n )\n }\n\n getOptionalNullableInteger<T extends number | null | undefined>(\n param: string,\n defaultValue: T,\n ): T | number {\n const rawValue = this.env[param]\n if (!rawValue) {\n return defaultValue\n }\n return validateNumber(\n Number.parseInt(rawValue),\n `Configuration parameter ${param}\\` must be an integer number, but was ${rawValue}`,\n )\n }\n\n getOptionalNullableNumber<T extends number | null | undefined>(\n param: string,\n defaultValue: T,\n ): T | number {\n const rawValue = this.env[param]\n if (!rawValue) {\n return defaultValue\n }\n return validateNumber(\n Number.parseFloat(rawValue),\n `Configuration parameter ${param}\\` must be a number, but was ${rawValue}`,\n )\n }\n\n getOptionalOneOf<const T extends string>(\n param: string,\n defaultValue: T,\n supportedValues: T[],\n ): T {\n const result = this.getOptional(param, defaultValue)\n return validateOneOf(\n result,\n supportedValues,\n `Unsupported ${param}: ${result}. Supported values: ${supportedValues.toString()}`,\n )\n }\n\n getOptionalValidated(\n param: string,\n defaultValue: string,\n validator: EnvValueValidator<string>,\n ): string {\n const value = this.env[param] || defaultValue\n if (!validator(value)) {\n throw new InternalError({\n message: `Value ${value} is invalid for parameter ${param}`,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n return value\n }\n\n getOptionalValidatedInteger(\n param: string,\n defaultValue: number,\n validator: EnvValueValidator<number>,\n ): number {\n const value = this.getOptionalInteger(param, defaultValue)\n\n if (!validator(value)) {\n throw new InternalError({\n message: `Value ${value} is invalid for parameter ${param}`,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n\n return value\n }\n\n getOptionalValidatedNumber(\n param: string,\n defaultValue: number,\n validator: EnvValueValidator<number>,\n ): number {\n const value = this.getOptionalNumber(param, defaultValue)\n\n if (!validator(value)) {\n throw new InternalError({\n message: `Value ${value} is invalid for parameter ${param}`,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n\n return value\n }\n\n getOptionalTransformed(\n param: string,\n defaultValue: string,\n transformer: (value: string) => string,\n ): string {\n const value = this.env[param] || defaultValue\n return transformer(value)\n }\n\n getOptionalNullableTransformed<T extends string | undefined>(\n param: string,\n defaultValue: T,\n transformer: (value: T | string) => T | string,\n ): T | string {\n const value = this.env[param] || defaultValue\n return transformer(value as T)\n }\n\n getMandatoryTransformed(param: string, transformer: (value: string) => string) {\n const value = this.getMandatory(param)\n\n return transformer(value)\n }\n\n getOptionalBoolean(param: string, defaultValue: boolean): boolean {\n const rawValue = this.env[param]?.toLowerCase()\n if (rawValue === undefined || rawValue === '') {\n return defaultValue\n }\n\n validateOneOf(rawValue, ['true', 'false'])\n\n return rawValue === 'true'\n }\n\n getMandatoryJsonObject<T extends object>(param: string, schema: ZodSchema<T>): T {\n const rawValue = this.getMandatory(param)\n return this.validateSchema(\n JSON.parse(rawValue),\n schema,\n `Configuration parameter ${param} must be a valid JSON meeting the given schema, but was ${rawValue}`,\n )\n }\n\n getOptionalNullableJsonObject<T extends object, Z extends T | null | undefined>(\n param: string,\n schema: ZodSchema<T>,\n defaultValue: Z,\n ): Z {\n const rawValue = this.getOptionalNullable(param, undefined)\n if (!rawValue) {\n return defaultValue\n }\n\n return this.validateSchema(\n JSON.parse(rawValue),\n schema,\n `Configuration parameter ${param} must be a valid JSON meeting the given schema, but was ${rawValue}`,\n ) as Z\n }\n\n getOptionalJsonObject<T extends object>(param: string, schema: ZodSchema<T>, defaultValue: T): T {\n return this.getOptionalNullableJsonObject(param, schema, defaultValue)\n }\n\n isProduction(): boolean {\n return this.env.NODE_ENV === 'production'\n }\n\n isDevelopment(): boolean {\n return this.env.NODE_ENV !== 'production'\n }\n\n isTest(): boolean {\n return this.env.NODE_ENV === 'test'\n }\n\n private validateSchema<T extends object>(\n value: unknown,\n schema: ZodSchema<T>,\n errorMessage: string,\n ): T {\n const parsedValue = schema.safeParse(value)\n if (!parsedValue.success) {\n throw new InternalError({\n message: errorMessage,\n errorCode: 'CONFIGURATION_ERROR',\n details: parsedValue.error as unknown as Record<string, unknown>,\n })\n }\n\n return parsedValue.data\n }\n}\n\nexport function validateOneOf<const T>(\n validatedEntity: unknown,\n expectedOneOfEntities: T[],\n errorText?: string,\n): T {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n if (!expectedOneOfEntities.includes(validatedEntity as T)) {\n throw new InternalError({\n message:\n errorText ||\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n `Validated entity ${validatedEntity} is not one of: ${expectedOneOfEntities.toString()}`,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return validatedEntity as T\n}\n\nexport function validateNumber(validatedObject: unknown, errorText: string): number {\n if (!Number.isFinite(validatedObject)) {\n throw new InternalError({\n message: errorText,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n return validatedObject as number\n}\n","import type { EnvValueTransformer } from './configTypes'\n\nexport const ensureClosingSlashTransformer: EnvValueTransformer<\n string | undefined | null,\n string\n> = (value) => {\n if (!value) {\n return ''\n }\n\n const lastChar = value.at(-1)\n if (lastChar !== '/') {\n return `${value}/`\n }\n return value\n}\n","import type { EnvValueValidator } from './configTypes'\n\nexport const createRangeValidator = (\n greaterOrEqualThan: number,\n lessOrEqualThan: number,\n): EnvValueValidator<number> => {\n return (value) => {\n return value >= greaterOrEqualThan && value <= lessOrEqualThan\n }\n}\n","type Left<T> = {\n error: T\n result?: never\n}\n\ntype Right<U> = {\n error?: never\n result: U\n}\n\n/**\n * Either is a functional programming type which is used to communicate errors happening in potentially recoverable scenarios.\n * It can return either an error (Left side) or a resolved result (Right side), but not both.\n * It is up to caller of the function to handle received error or throw (Public)NonRecoverableError if it cannot.\n *\n * @see {@link https://antman-does-software.com/stop-catching-errors-in-typescript-use-the-either-type-to-make-your-code-predictable Further reading on motivation for Either type}\n */\nexport type Either<T, U> = NonNullable<Left<T> | Right<U>>\n\n/***\n * Variation of Either, which may or may not have Error set, but always has Result\n */\nexport type DefiniteEither<T, U> = {\n error?: T\n result: U\n}\n\nexport const isFailure = <T, U>(e: Either<T, U>): e is Left<T> => {\n return e.error !== undefined\n}\n\nexport const isSuccess = <T, U>(e: Either<T, U>): e is Right<U> => {\n return e.result !== undefined\n}\n\nexport const failure = <T>(error: T): Left<T> => ({ error })\n\nexport const success = <U>(result: U): Right<U> => ({ result })\n","import * as crypto from 'node:crypto'\n\nconst algorithm = 'aes-256-gcm'\nconst ivLength = 16\nconst tagLength = 16\nconst defaultEncoding = 'hex'\nconst defaultSaltLength = 64\nconst defaultPbkdf2Iterations = 100000\n\nexport type Options = {\n saltLength?: number\n pbkdf2Iterations?: number\n encoding?: NodeJS.BufferEncoding\n}\n\n/**\n * Type-scripted version of https://github.com/MauriceButler/cryptr\n */\nexport class EncryptionUtility {\n private readonly secret: string\n private readonly saltLength: number\n private readonly encryptedPosition: number\n private readonly tagPosition: number\n private readonly pbkdf2Iterations: number\n private readonly encoding: NodeJS.BufferEncoding\n\n constructor(secret: string, options?: Options) {\n this.secret = secret\n\n this.encoding = options?.encoding ?? defaultEncoding\n this.pbkdf2Iterations = options?.pbkdf2Iterations ?? defaultPbkdf2Iterations\n this.saltLength = options?.saltLength ?? defaultSaltLength\n\n this.tagPosition = this.saltLength + ivLength\n this.encryptedPosition = this.tagPosition + tagLength\n }\n\n private getKey(salt: Buffer) {\n return crypto.pbkdf2Sync(this.secret, salt, this.pbkdf2Iterations, 32, 'sha512')\n }\n\n public encrypt(value: string) {\n const iv = crypto.randomBytes(ivLength)\n const salt = crypto.randomBytes(this.saltLength)\n\n const key = this.getKey(salt)\n\n const cipher = crypto.createCipheriv(algorithm, key, iv)\n const encrypted = Buffer.concat([cipher.update(String(value), 'utf8'), cipher.final()])\n\n const tag = cipher.getAuthTag()\n\n return Buffer.concat([salt, iv, tag, encrypted]).toString(this.encoding)\n }\n\n public decrypt(value: string) {\n const stringValue = Buffer.from(String(value), this.encoding)\n\n const salt = stringValue.subarray(0, this.saltLength)\n const iv = stringValue.subarray(this.saltLength, this.tagPosition)\n const tag = stringValue.subarray(this.tagPosition, this.encryptedPosition)\n const encrypted = stringValue.subarray(this.encryptedPosition)\n\n const key = this.getKey(salt)\n\n const decipher = crypto.createDecipheriv(algorithm, key, iv)\n\n decipher.setAuthTag(tag)\n\n return Buffer.concat([\n decipher.update(encrypted),\n Buffer.from(decipher.final('utf8')),\n ]).toString('utf8')\n }\n}\n","export function chunk<T>(array: T[], chunkSize: number): T[][] {\n const length = array.length\n if (!length || chunkSize < 1) {\n return []\n }\n let index = 0\n let resIndex = 0\n const result = new Array(Math.ceil(length / chunkSize))\n\n while (index < length) {\n // biome-ignore lint/suspicious/noAssignInExpressions: <explanation>\n result[resIndex++] = array.slice(index, (index += chunkSize))\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return result\n}\n\nexport async function callChunked<Item>(\n chunkSize: number,\n array: readonly Item[],\n processFn: (arrayChunk: Item[]) => Promise<unknown>,\n): Promise<void> {\n for (let i = 0; i < array.length; i += chunkSize) {\n const arrayChunk = array.slice(i, i + chunkSize)\n await processFn(arrayChunk)\n }\n}\n\n/**\n * Return a copy of the given array without null or undefined values\n */\nexport function removeNullish<const T>(array: readonly (T | null | undefined)[]): T[] {\n return array.filter((e) => e !== undefined && e !== null) as T[]\n}\n\n/**\n * Return a copy of the given array without falsy values (eg: false, 0, '', null, undefined)\n */\nexport function removeFalsy<const T>(\n array: readonly (T | null | undefined | 0 | '' | false)[],\n): T[] {\n return array.filter((e) => e) as T[]\n}\n\n/**\n * Return a copy of the given array without duplicates.\n */\nexport function removeDuplicates<const T>(array: readonly T[]): T[] {\n return [...new Set(array)]\n}\n","import dotProp from 'dot-prop'\n\nimport { InternalError } from '../errors/InternalError'\n\ntype RecordKeyType = string | number | symbol\n\nexport function copyWithoutUndefined<\n T extends Record<RecordKeyType, unknown>,\n TargetRecordType = Pick<\n T,\n {\n [Prop in keyof T]: T[Prop] extends null | undefined ? never : Prop\n }[keyof T]\n >,\n>(originalValue: T): TargetRecordType {\n return Object.keys(originalValue).reduce(\n (acc, key) => {\n // @ts-ignore\n if (originalValue[key] !== undefined) {\n // @ts-ignore\n acc[key] = originalValue[key]\n }\n return acc\n },\n {} as Record<string, unknown>,\n ) as TargetRecordType\n}\n\nexport function copyWithoutEmpty<\n T extends Record<RecordKeyType, unknown>,\n TargetRecordType = Pick<\n T,\n {\n [Prop in keyof T]: T[Prop] extends null | undefined | '' ? never : Prop\n }[keyof T]\n >,\n>(originalValue: T): TargetRecordType {\n return Object.keys(originalValue).reduce(\n (acc, key) => {\n if (\n originalValue[key] !== undefined &&\n originalValue[key] !== null &&\n // @ts-ignore\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n (typeof originalValue[key] !== 'string' || originalValue[key].trim().length > 0)\n ) {\n // @ts-ignore\n acc[key] = originalValue[key]\n }\n return acc\n },\n {} as Record<string, unknown>,\n ) as TargetRecordType\n}\n\nexport function pick<T, K extends string | number | symbol>(\n source: T,\n propNames: readonly K[],\n): Pick<T, Exclude<keyof T, Exclude<keyof T, K>>> {\n const result = {} as T\n let idx = 0\n while (idx < propNames.length) {\n // @ts-ignore\n if (propNames[idx] in source) {\n // @ts-ignore\n result[propNames[idx]] = source[propNames[idx]]\n }\n idx += 1\n }\n return result\n}\n\nexport function pickWithoutUndefined<T, K extends string | number | symbol>(\n source: T,\n propNames: readonly K[],\n): Pick<T, Exclude<keyof T, Exclude<keyof T, K>>> {\n const result = {} as T\n let idx = 0\n while (idx < propNames.length) {\n // @ts-ignore\n if (propNames[idx] in source && source[propNames[idx]] !== undefined) {\n // @ts-ignore\n result[propNames[idx]] = source[propNames[idx]]\n }\n idx += 1\n }\n return result\n}\n\nexport function isEmptyObject(params: Record<string, unknown>): boolean {\n for (const key in params) {\n if (Object.hasOwn(params, key) && params[key] !== undefined) {\n return false\n }\n }\n return true\n}\n\ntype KeysMatching<T, V> = { [K in keyof T]: T[K] extends V ? K : never }[keyof T]\n\n/**\n * @param array The array of objects to be grouped.\n * @param selector The key used for grouping the objects.\n * @returns An object where the keys are unique values from the given selector and the values are the corresponding objects from the array.\n */\nexport function groupBy<\n T extends object,\n K extends KeysMatching<T, RecordKeyType | null | undefined>,\n>(array: T[], selector: K): Record<RecordKeyType, T[]> {\n return array.reduce(\n (acc, item) => {\n const key = item[selector] as RecordKeyType | null | undefined\n if (key === undefined || key === null) {\n return acc\n }\n if (!acc[key]) {\n acc[key] = []\n }\n acc[key].push(item)\n return acc\n },\n {} as Record<RecordKeyType, T[]>,\n )\n}\n\n/**\n * @param array The array of objects to be grouped.\n * @param selector The key used for grouping the objects. Support nested keys.\n * @returns An object where the keys are unique values from the given selector and the values are the corresponding objects from the array.\n */\nexport function groupByPath<T extends object>(array: T[], selector: string): Record<string, T[]> {\n return array.reduce(\n (acc, item) => {\n const key = dotProp.get(item, selector)\n if (key === undefined || key === null) {\n return acc\n }\n const strKeyPath = key as string\n\n if (!acc[strKeyPath]) {\n acc[strKeyPath] = []\n }\n acc[strKeyPath].push(item)\n return acc\n },\n {} as Record<RecordKeyType, T[]>,\n )\n}\n\n/**\n * @param array The array of objects to be grouped.\n * @param selector The key used for grouping the objects.\n * @returns An object where the keys are unique values from the given selector and the value is the\n * corresponding object from the array.\n * @throws InternalError If a duplicated value is found for the given selector.\n */\nexport function groupByUnique<\n T extends object,\n K extends KeysMatching<T, RecordKeyType | null | undefined>,\n>(array: T[], selector: K): Record<RecordKeyType, T> {\n return array.reduce(\n (acc, item) => {\n const key = item[selector] as RecordKeyType | null | undefined\n if (key === undefined || key === null) {\n return acc\n }\n if (acc[key] !== undefined) {\n throw new InternalError({\n message: `Duplicated item for selector ${selector.toString()} with value ${key.toString()}`,\n errorCode: 'DUPLICATED_ITEM',\n details: { selector, value: key },\n })\n }\n acc[key] = item\n return acc\n },\n {} as Record<RecordKeyType, T>,\n )\n}\n\ntype DatesAsString<T> = T extends Date ? string : ExactlyLikeWithDateAsString<T>\n\ntype ExactlyLikeWithDateAsString<T> = T extends object ? { [K in keyof T]: DatesAsString<T[K]> } : T\n\nexport function convertDateFieldsToIsoString<Input extends object>(\n object: Input,\n): ExactlyLikeWithDateAsString<Input>\nexport function convertDateFieldsToIsoString<Input extends object>(\n object: Input[],\n): ExactlyLikeWithDateAsString<Input>[]\nexport function convertDateFieldsToIsoString<Input extends object>(\n object: Input | Input[],\n): ExactlyLikeWithDateAsString<Input> | ExactlyLikeWithDateAsString<Input>[] {\n if (Array.isArray(object)) {\n // @ts-ignore\n return object.map(convertDateFieldsToIsoStringAux)\n }\n\n return Object.entries(object).reduce(\n (result, [key, value]) => {\n // @ts-ignore\n result[key] = convertDateFieldsToIsoStringAux(value)\n return result\n },\n {} as ExactlyLikeWithDateAsString<Input>,\n )\n}\n\nfunction convertDateFieldsToIsoStringAux<T>(item: T): DatesAsString<T> {\n if (item instanceof Date) {\n // @ts-ignore\n return item.toISOString()\n }\n\n if (item && typeof item === 'object') {\n // @ts-ignore\n return convertDateFieldsToIsoString(item)\n }\n\n // @ts-ignore\n return item\n}\n\n/**\n * Return a deep clone copy of an object.\n *\n * Please Note: This uses structuredClone, which has the limitations of these restricted Types: functions,\n * Error objects, WeakMap, WeakSet, DOM nodes, and certain other browser-specific objects like Window.\n */\nexport function deepClone<T extends object | undefined | null>(object: T): T {\n if (object === undefined || object === null) {\n return object\n }\n return structuredClone(object)\n}\n\nfunction transformKey(key: string): string {\n return key\n .replace(/([a-z])([A-Z])/g, '$1-$2') // transforms basic camelCase\n .replace(/([A-Z])([A-Z][a-z])/g, '$1-$2') // transforms abbreviations\n .replace(/_/g, '-') // transforms snake_case\n .toLowerCase() // finally lowercase all\n}\n\ntype TransformToKebabCaseInputType = Record<string, unknown> | null | undefined\ntype TransformToKebabCaseReturnType<Input, Output> = Input extends Record<string, unknown>\n ? Output\n : Input\n/**\n * Transforms an object's keys from camelCase or snake_case to kebab-case.\n * @param object\n */\nexport function transformToKebabCase<\n Output extends Record<string, unknown>,\n Input extends TransformToKebabCaseInputType,\n>(object: Input): TransformToKebabCaseReturnType<Input, Output>\n\nexport function transformToKebabCase<\n Output extends Record<string, unknown>,\n Input extends TransformToKebabCaseInputType,\n>(object: Input[]): TransformToKebabCaseReturnType<Input, Output>[]\n\nexport function transformToKebabCase<Output, Input>(\n object: Input | Input[],\n): TransformToKebabCaseReturnType<Input, Output> | TransformToKebabCaseReturnType<Input, Output>[] {\n if (Array.isArray(object)) {\n // @ts-ignore\n return object.map(transformToKebabCase)\n }\n if (typeof object !== 'object' || object === null || object === undefined) {\n return object as TransformToKebabCaseReturnType<Input, Output>\n }\n\n return Object.entries(object as Record<string, unknown>).reduce(\n (result, [key, value]) => {\n const transformedKey = transformKey(key)\n const transformedValue =\n value && typeof value === 'object'\n ? transformToKebabCase(value as TransformToKebabCaseInputType)\n : value\n\n // Avoiding destructuring by directly assigning the new key-value pair\n result[transformedKey] = transformedValue\n return result\n },\n {} as Record<string, unknown>,\n ) as TransformToKebabCaseReturnType<Input, Output>\n}\n","// Error structure commonly used in libraries, e. g. fastify\nexport type StandardizedError = {\n code: string\n message: string\n}\n\nexport function hasMessage(maybe: unknown): maybe is { message: string } {\n return isObject(maybe) && typeof maybe.message === 'string'\n}\n\nexport function isObject(maybeObject: unknown): maybeObject is Record<PropertyKey, unknown> {\n return typeof maybeObject === 'object' && maybeObject !== null\n}\n\nexport function isStandardizedError(error: unknown): error is StandardizedError {\n return isObject(error) && typeof error.code === 'string' && typeof error.message === 'string'\n}\n\nexport function isError(maybeError: unknown): maybeError is Error {\n return (\n maybeError instanceof Error || Object.prototype.toString.call(maybeError) === '[object Error]'\n )\n}\n","import { createHash } from 'node:crypto'\n\nexport enum HashEncoding {\n HEX = 'hex',\n BASE64 = 'base64',\n}\n\nexport enum HashAlgorithm {\n SHA256 = 'sha256',\n SHA512 = 'sha512',\n}\n\nexport function generateHash(\n algorithm: HashAlgorithm,\n data: string,\n encoding: HashEncoding = HashEncoding.HEX,\n) {\n return createHash(algorithm).update(data).digest(encoding)\n}\n","import type { Level, Logger, LoggerOptions } from 'pino'\nimport pino, { levels } from 'pino'\nimport pretty from 'pino-pretty'\n\nexport type AppLoggerConfig = {\n logLevel: 'fatal' | 'error' | 'warn' | 'info' | 'debug' | 'trace' | 'silent'\n nodeEnv: 'production' | 'development' | 'test'\n base?: Record<string, unknown>\n redact?: LoggerOptions['redact']\n}\n\nexport type MonorepoAppLoggerConfig = AppLoggerConfig & {\n targetFile?: string\n append?: boolean\n}\n\n/* c8 ignore next 8 */\nexport function resolveMonorepoLogger(appConfig: MonorepoAppLoggerConfig): Logger {\n if (appConfig.nodeEnv !== 'development') {\n return resolveLogger(appConfig)\n }\n\n const configuration = resolveMonorepoLoggerConfiguration(appConfig) as LoggerOptions\n return pino(configuration)\n}\n\n// Note that transports do not work in vitest, likely because pino attempts to run them in a separate worker\n/* c8 ignore next 25 */\nexport function resolveMonorepoLoggerConfiguration(\n appConfig: MonorepoAppLoggerConfig,\n): LoggerOptions | Logger {\n if (appConfig.nodeEnv !== 'development') {\n return resolveLoggerConfiguration(appConfig)\n }\n\n return {\n level: appConfig.logLevel,\n formatters: {\n level: (label) => {\n return { level: label }\n },\n },\n redact: appConfig.redact,\n transport: {\n target: 'pino/file',\n options: {\n destination: appConfig.targetFile ?? './service.log',\n mkdir: true,\n append: appConfig.append ?? false,\n },\n },\n }\n}\n\nexport function resolveLogger(appConfig: AppLoggerConfig): Logger {\n if (appConfig.nodeEnv !== 'production') {\n return resolveLoggerConfiguration(appConfig) as Logger\n }\n\n const configuration = resolveLoggerConfiguration(appConfig) as LoggerOptions\n return pino(configuration)\n}\n\nexport function resolveLoggerConfiguration(appConfig: AppLoggerConfig): LoggerOptions | Logger {\n if (appConfig.nodeEnv !== 'production') {\n return pino(\n pretty({\n sync: true,\n minimumLevel: appConfig.logLevel as Level,\n colorize: true,\n translateTime: 'SYS:standard',\n ignore: 'hostname,pid',\n }),\n )\n }\n\n return {\n level: appConfig.logLevel,\n formatters: {\n level: (_label, numericLevel): { level: string } => {\n const level = levels.labels[numericLevel] || 'unknown'\n return { level }\n },\n },\n redact: appConfig.redact,\n } satisfies LoggerOptions\n}\n","/**\n * Serializes the given value into a JSON string and explicitly wraps it in double quotes.\n * This ensures that log collectors (like Graylog) treat it as a string and not as a JSON object,\n * preventing the automatic extraction of properties that could lead to property explosion.\n * Max length is set to 8100 (+4 for quotes) characters to prevent issues with log collectors\n * (Graylog) that have a limit of 32766 bytes per field. In the worst case scenario, each character\n * is 4 bytes (UTF-32), so we limit the string to 8100 characters to stay within the limit.\n */\nexport const stringValueSerializer = (value: unknown, maxLength = 8100): string => {\n const baseValue = valueToString(value)\n\n const truncated = baseValue.length > maxLength ? baseValue.slice(0, maxLength) : baseValue\n\n return typeof value === 'string' ? `\"\"${truncated}\"\"` : `\"${truncated}\"`\n}\n\nconst valueToString = (value: unknown): string => {\n if (typeof value === 'string') {\n return value\n }\n\n if (typeof value === 'bigint') {\n return value.toString()\n }\n\n if (typeof value === 'symbol') {\n return value.toString()\n }\n\n if (value === undefined) {\n return 'undefined'\n }\n\n if (typeof value === 'function') {\n return value.toString()\n }\n\n try {\n return JSON.stringify(value)\n } catch {\n return String(value) // fallback for circular references etc.\n }\n}\n","import type { SerializedError } from 'pino'\nimport pino, { levels, stdSerializers } from 'pino'\n\nimport type { CommonLogger } from '../logging/commonLogger'\nimport { hasMessage, isError } from '../utils/typeUtils'\n\ntype LogObject = {\n msg: string // this is the default pino message key\n 'x-request-id'?: string\n error?: SerializedError\n}\n\nexport const globalLogger: CommonLogger = pino({\n formatters: {\n level: (_label, numericLevel): { level: string } => {\n const level = levels.labels[numericLevel] || 'unknown'\n return { level }\n },\n },\n})\n\nexport function resolveGlobalErrorLogObject(err: unknown, correlationId?: string): LogObject {\n if (isError(err)) {\n return {\n msg: err.message,\n error: stdSerializers.err(err),\n 'x-request-id': correlationId,\n }\n }\n\n if (hasMessage(err)) {\n return {\n msg: err.message,\n 'x-request-id': correlationId,\n }\n }\n\n return {\n msg: 'Unknown error',\n 'x-request-id': correlationId,\n }\n}\n\nexport function executeAndHandleGlobalErrors<T>(operation: () => T) {\n try {\n const result = operation()\n return result\n } catch (err) {\n const logObject = resolveGlobalErrorLogObject(err)\n globalLogger.error(logObject)\n process.exit(1)\n }\n}\n\nexport async function executeAsyncAndHandleGlobalErrors<T>(\n operation: () => Promise<T>,\n stopOnError?: true,\n): Promise<T>\nexport async function executeAsyncAndHandleGlobalErrors<T>(\n operation: () => Promise<T>,\n stopOnError: false,\n): Promise<T | undefined>\nexport async function executeAsyncAndHandleGlobalErrors<T>(\n operation: () => Promise<T>,\n stopOnError = true,\n): Promise<T | undefined> {\n try {\n const result = await operation()\n return result\n } catch (err) {\n const logObject = resolveGlobalErrorLogObject(err)\n globalLogger.error(logObject)\n if (stopOnError) {\n process.exit(1)\n }\n }\n}\n\nexport async function executeSettleAllAndHandleGlobalErrors<T>(\n promises: Promise<T>[],\n stopOnError?: true,\n): Promise<PromiseSettledResult<T>[]>\nexport async function executeSettleAllAndHandleGlobalErrors<T>(\n promises: Promise<T>[],\n stopOnError: false,\n): Promise<PromiseSettledResult<T>[] | undefined>\nexport async function executeSettleAllAndHandleGlobalErrors<T>(\n promises: Promise<T>[],\n stopOnError = true,\n): Promise<PromiseSettledResult<T>[] | undefined> {\n const result = await Promise.allSettled(promises)\n\n let errorsHappened: boolean | undefined\n for (const entry of result) {\n if (entry.status === 'rejected') {\n const logObject = resolveGlobalErrorLogObject(entry.reason)\n globalLogger.error(logObject)\n errorsHappened = true\n }\n }\n\n if (stopOnError && errorsHappened) {\n process.exit(1)\n }\n\n if (!stopOnError && errorsHappened) {\n return undefined\n }\n\n return result\n}\n","import { constants as httpConstants } from 'node:http2'\n\nimport type { FreeformRecord } from '../common/commonTypes'\n\nimport { PublicNonRecoverableError } from './PublicNonRecoverableError'\n\nexport type CommonErrorParams = {\n message: string\n details?: FreeformRecord\n cause?: Error\n}\n\nexport type OptionalMessageErrorParams = Partial<CommonErrorParams>\n\nexport type ValidationError = {\n message: string\n path: string[]\n}\n\nexport class RequestValidationError extends PublicNonRecoverableError<{\n error: ValidationError[]\n}> {\n constructor(errors: ValidationError[]) {\n super({\n message: 'Invalid params',\n errorCode: 'VALIDATION_ERROR',\n httpStatusCode: httpConstants.HTTP_STATUS_BAD_REQUEST,\n details: {\n error: errors,\n },\n })\n }\n}\n\nexport class AccessDeniedError extends PublicNonRecoverableError {\n constructor(params: CommonErrorParams) {\n super({\n message: params.message,\n errorCode: 'ACCESS_DENIED',\n httpStatusCode: httpConstants.HTTP_STATUS_FORBIDDEN,\n details: params.details,\n cause: params.cause,\n })\n }\n}\n\nexport class EntityNotFoundError extends PublicNonRecoverableError {\n constructor(params: CommonErrorParams) {\n super({\n message: params.message,\n errorCode: 'ENTITY_NOT_FOUND',\n httpStatusCode: httpConstants.HTTP_STATUS_NOT_FOUND,\n details: params.details,\n cause: params.cause,\n })\n }\n}\n\nexport class EntityGoneError extends PublicNonRecoverableError {\n constructor(params: CommonErrorParams) {\n super({\n message: params.message,\n errorCode: 'ENTITY_GONE',\n httpStatusCode: httpConstants.HTTP_STATUS_GONE,\n details: params.details,\n })\n }\n}\n\nexport class AuthFailedError extends PublicNonRecoverableError {\n constructor(params: OptionalMessageErrorParams = {}) {\n super({\n message: params.message ?? 'Authentication failed',\n errorCode: 'AUTH_FAILED',\n httpStatusCode: httpConstants.HTTP_STATUS_UNAUTHORIZED,\n details: params.details,\n cause: params.cause,\n })\n }\n}\n","export const waitAndRetry = async <T>(\n predicateFn: () => T,\n sleepTime = 20,\n maxRetryCount = 15,\n): Promise<T> => {\n return new Promise((resolve, reject) => {\n let retryCount = 0\n function performCheck() {\n // amount of retries exceeded\n if (maxRetryCount !== 0 && retryCount > maxRetryCount) {\n resolve(predicateFn())\n }\n\n // Try executing predicateFn\n Promise.resolve()\n .then(() => {\n return predicateFn()\n })\n .then((result) => {\n if (result) {\n resolve(result)\n } else {\n retryCount++\n setTimeout(performCheck, sleepTime)\n }\n })\n .catch((err) => {\n reject(err)\n })\n }\n\n performCheck()\n })\n}\n","import type { TransactionObservabilityManager } from './observabilityTypes'\n\n/**\n * Groups different TransactionObservabilityManager instances into one\n * to facilitate tracking transactions across multiple observability tools.\n */\nexport class MultiTransactionObservabilityManager implements TransactionObservabilityManager {\n private readonly managers: TransactionObservabilityManager[]\n\n constructor(managers: TransactionObservabilityManager[]) {\n this.managers = managers\n }\n\n start(transactionName: string, uniqueTransactionKey: string): void {\n for (const manager of this.managers) {\n manager.start(transactionName, uniqueTransactionKey)\n }\n }\n\n startWithGroup(\n transactionName: string,\n uniqueTransactionKey: string,\n transactionGroup: string,\n ): void {\n for (const manager of this.managers) {\n manager.startWithGroup(transactionName, uniqueTransactionKey, transactionGroup)\n }\n }\n\n stop(uniqueTransactionKey: string, wasSuccessful?: boolean): void {\n for (const manager of this.managers) {\n manager.stop(uniqueTransactionKey, wasSuccessful)\n }\n }\n\n addCustomAttributes(\n uniqueTransactionKey: string,\n atts: { [p: string]: string | number | boolean },\n ): void {\n for (const manager of this.managers) {\n manager.addCustomAttributes(uniqueTransactionKey, atts)\n }\n }\n}\n","import type { BinaryLike } from 'node:crypto'\nimport { createHash } from 'node:crypto'\nimport type { Readable } from 'node:stream'\n\nconst HASH_ALGORITHM = 'md5'\n\nexport function generateChecksumForBufferOrString(data: BinaryLike): string {\n return createHash(HASH_ALGORITHM).update(data).digest('hex')\n}\n\nexport function generateChecksumForObject(object: object): string {\n const objectAsString = JSON.stringify(object)\n return generateChecksumForBufferOrString(objectAsString)\n}\n\nexport function generateChecksumForReadable(readable: Readable): Promise<string> {\n return new Promise((resolve, reject) => {\n const hashCreator = createHash(HASH_ALGORITHM)\n readable.on('data', (data) => {\n if (Buffer.isBuffer(data)) {\n hashCreator.update(data)\n } else {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n hashCreator.update(Buffer.from(data))\n }\n })\n\n readable.on('end', () => {\n const hash = hashCreator.digest('hex')\n resolve(hash)\n })\n readable.on('error', (err) => {\n /* c8 ignore next 1 */\n reject(err)\n })\n })\n}\n","import { F_OK } from 'node:constants'\nimport { access, createReadStream, createWriteStream } from 'node:fs'\nimport { stat, unlink } from 'node:fs/promises'\nimport type { Readable } from 'node:stream'\nimport { pipeline } from 'node:stream'\n\nexport type ReadableProvider = {\n /**\n * Guarantees to provide a new stream every time this is called, before `destroy` is invoked.\n */\n createStream(): Promise<Readable>\n\n /**\n * Returns size of the persisted content\n */\n getContentLength(): Promise<number>\n\n /**\n * Remove the persisted value. No new streams can be created after this is called\n */\n destroy(): Promise<void>\n}\n\nexport type PersistToFsOptions = {\n targetFile: string\n sourceReadable: Readable\n}\n\nexport type FsReadableProviderOptions = {\n storageFile: string\n}\n\nexport class FsReadableProvider implements ReadableProvider {\n public readonly storageFile: string\n constructor(options: FsReadableProviderOptions) {\n this.storageFile = options.storageFile\n }\n\n fileExists(): Promise<boolean> {\n return new Promise((resolve) => {\n access(this.storageFile, F_OK, (err) => {\n return resolve(!err)\n })\n })\n }\n\n async getContentLength(): Promise<number> {\n if (!(await this.fileExists())) {\n throw new Error(`File ${this.storageFile} was already deleted.`)\n }\n const stats = await stat(this.storageFile)\n return stats.size\n }\n\n async createStream(): Promise<Readable> {\n if (!(await this.fileExists())) {\n throw new Error(`File ${this.storageFile} was already deleted.`)\n }\n\n return createReadStream(this.storageFile)\n }\n\n async destroy(): Promise<void> {\n if (!(await this.fileExists())) {\n // nothing to do here\n return\n }\n\n return unlink(this.storageFile)\n }\n\n protected async persist(sourceReadable: Readable): Promise<void> {\n const writable = createWriteStream(this.storageFile)\n return new Promise((resolve, reject) => {\n pipeline(sourceReadable, writable, (err) => {\n if (err) {\n /* c8 ignore next 1 */\n reject(err)\n } else {\n resolve()\n }\n })\n })\n }\n\n public static async persistReadableToFs(\n options: PersistToFsOptions,\n ): Promise<FsReadableProvider> {\n const provider = new FsReadableProvider({\n storageFile: options.targetFile,\n })\n await provider.persist(options.sourceReadable)\n return provider\n }\n}\n\n/**\n * Consumes the readable in order to calculate its length in bytes\n * @param readable\n */\nexport function getReadableContentLength(readable: Readable): Promise<number> {\n return new Promise((resolve, reject) => {\n let size = 0\n readable.on('data', (chunk) => {\n if (typeof chunk === 'string' || Buffer.isBuffer(chunk)) {\n size += Buffer.byteLength(chunk)\n }\n })\n readable.on('end', () => {\n resolve(size)\n })\n readable.on('error', (error) => {\n /* c8 ignore next 1 */\n reject(error)\n })\n })\n}\n\n/**\n * Consumes the readable stream and returns its content as a Buffer.\n * @param stream - The readable stream to consume.\n * @returns A promise that resolves to a Buffer containing the stream's content.\n */\nexport async function streamToBuffer(stream: Readable): Promise<Buffer> {\n const chunks: Buffer[] = []\n for await (const chunk of stream) {\n chunks.push(chunk as Buffer)\n }\n return Buffer.concat(chunks)\n}\n"],"mappings":"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","names":["isNativeError","HashEncoding","HashAlgorithm","algorithm","pino","levels","pino","levels","createHash","chunk"]}
1
+ {"version":3,"sources":["../src/errors/PublicNonRecoverableError.ts","../src/errors/EnhancedError.ts","../src/errors/InternalError.ts","../src/errors/errorTypeGuards.ts","../src/config/ConfigScope.ts","../src/config/configTransformers.ts","../src/config/configValidators.ts","../src/errors/either.ts","../src/utils/encryptionUtility.ts","../src/utils/arrayUtils.ts","../src/utils/objectUtils.ts","../src/utils/typeUtils.ts","../src/utils/hashUtils.ts","../src/logging/loggerConfigResolver.ts","../src/logging/stringValueSerializer.ts","../src/errors/globalErrorHandler.ts","../src/errors/publicErrors.ts","../src/utils/waitUtils.ts","../src/observability/MultiTransactionObservabilityManager.ts","../src/utils/checksumUtils.ts","../src/utils/streamUtils.ts"],"sourcesContent":["import { isNativeError } from 'node:util/types'\nimport { EnhancedError } from './EnhancedError'\nimport type { BaseErrorParams, ErrorDetails } from './types'\n\ntype BasePublicErrorParams = BaseErrorParams & {\n httpStatusCode?: number\n}\n\nexport type PublicNonRecoverableErrorParams<\n T extends ErrorDetails | undefined = ErrorDetails | undefined,\n> = T extends undefined\n ? BasePublicErrorParams\n : BasePublicErrorParams & {\n details: T\n }\n\nconst PUBLIC_NON_RECOVERABLE_ERROR_SYMBOL = Symbol.for('PUBLIC_NON_RECOVERABLE_ERROR_KEY')\n\n/**\n * This error is returned to the consumer of API\n */\nexport class PublicNonRecoverableError<\n T extends ErrorDetails | undefined = ErrorDetails | undefined,\n> extends EnhancedError {\n public readonly details: T\n public readonly errorCode: string\n public readonly httpStatusCode: number\n\n constructor(params: PublicNonRecoverableErrorParams<T>) {\n super(params.message, {\n cause: params.cause,\n })\n // set the name as the class name for every class that extends PublicNonRecoverableError\n this.name = this.constructor.name\n // @ts-ignore\n this.details = params.details\n this.errorCode = params.errorCode\n this.httpStatusCode = params.httpStatusCode ?? 500\n }\n}\n\nObject.defineProperty(PublicNonRecoverableError.prototype, PUBLIC_NON_RECOVERABLE_ERROR_SYMBOL, {\n value: true,\n})\n\n/**\n * @deprecated Use `error instanceof PublicNonRecoverableError` instead.\n */\nexport function isPublicNonRecoverableError(error: unknown): error is PublicNonRecoverableError {\n return (\n isNativeError(error) &&\n ((PUBLIC_NON_RECOVERABLE_ERROR_SYMBOL in error &&\n error[PUBLIC_NON_RECOVERABLE_ERROR_SYMBOL] === true) ||\n error.name === 'PublicNonRecoverableError')\n )\n}\n","const PROTOTYPE_PATH_DELIMITER = '.'\n\nconst getPrototypeNamesPostError = (input: unknown): string[] => {\n const names: string[] = []\n\n const isFunction = typeof input === 'function'\n\n // biome-ignore lint/complexity/noBannedTypes: describes prototype\n let current: Function = isFunction ? input : Object.getPrototypeOf(input)\n\n while (current !== null) {\n const name = isFunction ? current.name : current.constructor.name\n\n if (!name) {\n break\n }\n\n names.push(name)\n current = Object.getPrototypeOf(current)\n }\n\n const reversedNames = names.reverse()\n\n const errorIndex = reversedNames.indexOf(Error.name)\n\n return reversedNames.slice(errorIndex + 1)\n}\n\nconst generatePrototypePaths = (arr: string[]): string[] => {\n return arr.reduce<string[]>((acc, element) => {\n const prev = acc.at(-1)\n\n if (!prev) {\n acc.push(element)\n } else {\n acc.push(`${prev}${PROTOTYPE_PATH_DELIMITER}${element}`)\n }\n\n return acc\n }, [])\n}\n\n/**\n * Custom error class that enables reliable instanceof checks across realms\n * (e.g., iframes, workers, or Node.js VM).\n * Also ensures subclasses like `NotFoundError` have a consistent error name\n * (i.e., `error.name` is set to the subclass name instead of `EnhancedError`).\n *\n * It works by creating unique symbols for each inheritance path, such as:\n * - 'EnhancedError'\n * - 'EnhancedError.Subclass1'\n * - 'EnhancedError.Subclass1.Subclass2',\n * assigning them to the instance using `Symbol.for` on instantiation.\n * The custom `instanceof` logic (overriding `Symbol.hasInstance`) checks if the corresponding\n * symbol for the constructor’s prototype path exists on the tested object.\n *\n * This technique allows `instanceof` to succeed across realms where normal prototype chain checks fail,\n * because symbols created via `Symbol.for` are shared globally and can be reliably compared.\n */\nexport class EnhancedError extends Error {\n constructor(message?: string, options?: ErrorOptions) {\n super(message, options)\n\n // Set the error's name to the name of the class that was instantiated\n this.name = new.target.name\n\n const prototypeNames = getPrototypeNamesPostError(this)\n const prototypePaths = generatePrototypePaths(prototypeNames)\n\n for (const prototypePath of prototypePaths) {\n const symbol = Symbol.for(prototypePath)\n\n Object.defineProperty(this, symbol, { value: true })\n }\n }\n\n static override [Symbol.hasInstance](val: unknown): boolean {\n if (val === null || typeof val !== 'object') {\n return false\n }\n\n // biome-ignore lint/complexity/noThisInStatic: intentional to support subclasses\n const prototypeNames = getPrototypeNamesPostError(this)\n const symbol = Symbol.for(prototypeNames.join(PROTOTYPE_PATH_DELIMITER))\n\n return symbol in val && val[symbol] === true\n }\n}\n","import { isNativeError } from 'node:util/types'\nimport { EnhancedError } from './EnhancedError'\nimport type { BaseErrorParams, ErrorDetails } from './types'\n\nexport type InternalErrorParams<T extends ErrorDetails | undefined = ErrorDetails | undefined> =\n T extends undefined\n ? BaseErrorParams\n : BaseErrorParams & {\n details: T\n }\n\nconst INTERNAL_ERROR_SYMBOL = Symbol.for('INTERNAL_ERROR_KEY')\n\nexport class InternalError<\n T extends ErrorDetails | undefined = ErrorDetails | undefined,\n> extends EnhancedError {\n public readonly errorCode: string\n public readonly details: T\n\n constructor(params: InternalErrorParams<T>) {\n super(params.message, {\n cause: params.cause,\n })\n // set the name as the class name for every class that extends InternalError\n this.name = this.constructor.name\n // @ts-ignore\n this.details = params.details\n this.errorCode = params.errorCode\n }\n}\n\nObject.defineProperty(InternalError.prototype, INTERNAL_ERROR_SYMBOL, {\n value: true,\n})\n\n/**\n * @deprecated Use `error instanceof InternalError` instead.\n */\nexport function isInternalError(error: unknown): error is InternalError {\n return (\n isNativeError(error) &&\n ((INTERNAL_ERROR_SYMBOL in error && error[INTERNAL_ERROR_SYMBOL] === true) ||\n error.name === 'InternalError')\n )\n}\n","import { isPublicNonRecoverableError } from '../errors/PublicNonRecoverableError'\n\nimport type { EntityGoneError } from './publicErrors'\n\nexport function isEntityGoneError(entity: unknown): entity is EntityGoneError {\n return isPublicNonRecoverableError(entity) && entity.httpStatusCode === 410\n}\n","import type { ZodSchema } from 'zod/v4'\nimport { InternalError } from '../errors/InternalError'\nimport type { EnvValueValidator } from './configTypes'\n\nexport type EnvType = {\n [key: string]: string | undefined\n}\n\nexport class ConfigScope {\n private env: EnvType\n\n constructor(envOverride?: EnvType) {\n this.env = envOverride ?? { ...process.env }\n }\n\n updateEnv() {\n // Accessing process.env values is slow, so we cache them\n this.env = { ...process.env }\n }\n\n getBySchema<T>(param: string, schema: ZodSchema<T>): T {\n const rawValue = this.env[param]\n\n const result = schema.safeParse(rawValue)\n\n if (!result.success) {\n throw new InternalError({\n message: `Validation of configuration parameter \"${param}\" has failed: ${result.error.issues.at(0)?.message}`,\n errorCode: 'CONFIGURATION_ERROR',\n cause: result.error,\n })\n }\n\n return result.data\n }\n\n getMandatoryInteger(param: string): number {\n const rawValue = this.env[param]\n if (!rawValue) {\n throw new InternalError({\n message: `Missing mandatory configuration parameter: ${param}`,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n return validateNumber(\n Number.parseInt(rawValue),\n `Configuration parameter ${param}\\` must be an integer number, but was ${rawValue}`,\n )\n }\n\n getMandatoryNumber(param: string): number {\n const rawValue = this.env[param]\n if (!rawValue) {\n throw new InternalError({\n message: `Missing mandatory configuration parameter: ${param}`,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n return validateNumber(\n Number.parseFloat(rawValue),\n `Configuration parameter ${param}\\` must be a number, but was ${rawValue}`,\n )\n }\n\n getMandatory(param: string): string {\n const result = this.env[param]\n if (!result) {\n throw new InternalError({\n message: `Missing mandatory configuration parameter: ${param}`,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n return result\n }\n\n getMandatoryOneOf<const T>(param: string, supportedValues: T[]): T {\n const result = this.getMandatory(param)\n return validateOneOf(\n result,\n supportedValues,\n `Unsupported ${param}: ${result}. Supported values: ${supportedValues.toString()}`,\n )\n }\n\n getMandatoryValidatedInteger(param: string, validator: EnvValueValidator<number>): number {\n const value = this.getMandatoryInteger(param)\n if (!validator(value)) {\n throw new InternalError({\n message: `Value ${value} is invalid for parameter ${param}`,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n return value\n }\n\n getMandatoryValidatedNumber(param: string, validator: EnvValueValidator<number>): number {\n const value = this.getMandatoryNumber(param)\n if (!validator(value)) {\n throw new InternalError({\n message: `Value ${value} is invalid for parameter ${param}`,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n return value\n }\n\n getOptionalNullable<T extends string | null | undefined>(\n param: string,\n defaultValue: T,\n ): T | string {\n return this.env[param] || defaultValue\n }\n\n getOptional(param: string, defaultValue: string): string {\n // Using the `||` operator instead of `??`, since '' is not a valid value, and 0 (number) is not expected here\n return this.env[param] || defaultValue\n }\n\n getOptionalInteger(param: string, defaultValue: number): number {\n const rawValue = this.env[param]\n if (!rawValue) {\n return defaultValue\n }\n return validateNumber(\n Number.parseInt(rawValue),\n `Configuration parameter ${param}\\` must be a number, but was ${rawValue}`,\n )\n }\n\n getOptionalNumber(param: string, defaultValue: number): number {\n const rawValue = this.env[param]\n if (!rawValue) {\n return defaultValue\n }\n return validateNumber(\n Number.parseFloat(rawValue),\n `Configuration parameter ${param}\\` must be a number, but was ${rawValue}`,\n )\n }\n\n getOptionalNullableInteger<T extends number | null | undefined>(\n param: string,\n defaultValue: T,\n ): T | number {\n const rawValue = this.env[param]\n if (!rawValue) {\n return defaultValue\n }\n return validateNumber(\n Number.parseInt(rawValue),\n `Configuration parameter ${param}\\` must be an integer number, but was ${rawValue}`,\n )\n }\n\n getOptionalNullableNumber<T extends number | null | undefined>(\n param: string,\n defaultValue: T,\n ): T | number {\n const rawValue = this.env[param]\n if (!rawValue) {\n return defaultValue\n }\n return validateNumber(\n Number.parseFloat(rawValue),\n `Configuration parameter ${param}\\` must be a number, but was ${rawValue}`,\n )\n }\n\n getOptionalOneOf<const T extends string>(\n param: string,\n defaultValue: T,\n supportedValues: T[],\n ): T {\n const result = this.getOptional(param, defaultValue)\n return validateOneOf(\n result,\n supportedValues,\n `Unsupported ${param}: ${result}. Supported values: ${supportedValues.toString()}`,\n )\n }\n\n getOptionalValidated(\n param: string,\n defaultValue: string,\n validator: EnvValueValidator<string>,\n ): string {\n const value = this.env[param] || defaultValue\n if (!validator(value)) {\n throw new InternalError({\n message: `Value ${value} is invalid for parameter ${param}`,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n return value\n }\n\n getOptionalValidatedInteger(\n param: string,\n defaultValue: number,\n validator: EnvValueValidator<number>,\n ): number {\n const value = this.getOptionalInteger(param, defaultValue)\n\n if (!validator(value)) {\n throw new InternalError({\n message: `Value ${value} is invalid for parameter ${param}`,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n\n return value\n }\n\n getOptionalValidatedNumber(\n param: string,\n defaultValue: number,\n validator: EnvValueValidator<number>,\n ): number {\n const value = this.getOptionalNumber(param, defaultValue)\n\n if (!validator(value)) {\n throw new InternalError({\n message: `Value ${value} is invalid for parameter ${param}`,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n\n return value\n }\n\n getOptionalTransformed(\n param: string,\n defaultValue: string,\n transformer: (value: string) => string,\n ): string {\n const value = this.env[param] || defaultValue\n return transformer(value)\n }\n\n getOptionalNullableTransformed<T extends string | undefined>(\n param: string,\n defaultValue: T,\n transformer: (value: T | string) => T | string,\n ): T | string {\n const value = this.env[param] || defaultValue\n return transformer(value as T)\n }\n\n getMandatoryTransformed(param: string, transformer: (value: string) => string) {\n const value = this.getMandatory(param)\n\n return transformer(value)\n }\n\n getOptionalBoolean(param: string, defaultValue: boolean): boolean {\n const rawValue = this.env[param]?.toLowerCase()\n if (rawValue === undefined || rawValue === '') {\n return defaultValue\n }\n\n validateOneOf(rawValue, ['true', 'false'])\n\n return rawValue === 'true'\n }\n\n getMandatoryJsonObject<T extends object>(param: string, schema: ZodSchema<T>): T {\n const rawValue = this.getMandatory(param)\n return this.validateSchema(\n JSON.parse(rawValue),\n schema,\n `Configuration parameter ${param} must be a valid JSON meeting the given schema, but was ${rawValue}`,\n )\n }\n\n getOptionalNullableJsonObject<T extends object, Z extends T | null | undefined>(\n param: string,\n schema: ZodSchema<T>,\n defaultValue: Z,\n ): Z {\n const rawValue = this.getOptionalNullable(param, undefined)\n if (!rawValue) {\n return defaultValue\n }\n\n return this.validateSchema(\n JSON.parse(rawValue),\n schema,\n `Configuration parameter ${param} must be a valid JSON meeting the given schema, but was ${rawValue}`,\n ) as Z\n }\n\n getOptionalJsonObject<T extends object>(param: string, schema: ZodSchema<T>, defaultValue: T): T {\n return this.getOptionalNullableJsonObject(param, schema, defaultValue)\n }\n\n isProduction(): boolean {\n return this.env.NODE_ENV === 'production'\n }\n\n isDevelopment(): boolean {\n return this.env.NODE_ENV !== 'production'\n }\n\n isTest(): boolean {\n return this.env.NODE_ENV === 'test'\n }\n\n private validateSchema<T extends object>(\n value: unknown,\n schema: ZodSchema<T>,\n errorMessage: string,\n ): T {\n const parsedValue = schema.safeParse(value)\n if (!parsedValue.success) {\n throw new InternalError({\n message: errorMessage,\n errorCode: 'CONFIGURATION_ERROR',\n details: parsedValue.error as unknown as Record<string, unknown>,\n })\n }\n\n return parsedValue.data\n }\n}\n\nexport function validateOneOf<const T>(\n validatedEntity: unknown,\n expectedOneOfEntities: T[],\n errorText?: string,\n): T {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n if (!expectedOneOfEntities.includes(validatedEntity as T)) {\n throw new InternalError({\n message:\n errorText ||\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n `Validated entity ${validatedEntity} is not one of: ${expectedOneOfEntities.toString()}`,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return validatedEntity as T\n}\n\nexport function validateNumber(validatedObject: unknown, errorText: string): number {\n if (!Number.isFinite(validatedObject)) {\n throw new InternalError({\n message: errorText,\n errorCode: 'CONFIGURATION_ERROR',\n })\n }\n return validatedObject as number\n}\n","import type { EnvValueTransformer } from './configTypes'\n\nexport const ensureClosingSlashTransformer: EnvValueTransformer<\n string | undefined | null,\n string\n> = (value) => {\n if (!value) {\n return ''\n }\n\n const lastChar = value.at(-1)\n if (lastChar !== '/') {\n return `${value}/`\n }\n return value\n}\n","import type { EnvValueValidator } from './configTypes'\n\nexport const createRangeValidator = (\n greaterOrEqualThan: number,\n lessOrEqualThan: number,\n): EnvValueValidator<number> => {\n return (value) => {\n return value >= greaterOrEqualThan && value <= lessOrEqualThan\n }\n}\n","type Left<T> = {\n error: T\n result?: never\n}\n\ntype Right<U> = {\n error?: never\n result: U\n}\n\n/**\n * Either is a functional programming type which is used to communicate errors happening in potentially recoverable scenarios.\n * It can return either an error (Left side) or a resolved result (Right side), but not both.\n * It is up to caller of the function to handle received error or throw (Public)NonRecoverableError if it cannot.\n *\n * @see {@link https://antman-does-software.com/stop-catching-errors-in-typescript-use-the-either-type-to-make-your-code-predictable Further reading on motivation for Either type}\n */\nexport type Either<T, U> = NonNullable<Left<T> | Right<U>>\n\n/***\n * Variation of Either, which may or may not have Error set, but always has Result\n */\nexport type DefiniteEither<T, U> = {\n error?: T\n result: U\n}\n\nexport const isFailure = <T, U>(e: Either<T, U>): e is Left<T> => {\n return e.error !== undefined\n}\n\nexport const isSuccess = <T, U>(e: Either<T, U>): e is Right<U> => {\n return e.result !== undefined\n}\n\nexport const failure = <T>(error: T): Left<T> => ({ error })\n\nexport const success = <U>(result: U): Right<U> => ({ result })\n","import * as crypto from 'node:crypto'\n\nconst algorithm = 'aes-256-gcm'\nconst ivLength = 16\nconst tagLength = 16\nconst defaultEncoding = 'hex'\nconst defaultSaltLength = 64\nconst defaultPbkdf2Iterations = 100000\n\nexport type Options = {\n saltLength?: number\n pbkdf2Iterations?: number\n encoding?: NodeJS.BufferEncoding\n}\n\n/**\n * Type-scripted version of https://github.com/MauriceButler/cryptr\n */\nexport class EncryptionUtility {\n private readonly secret: string\n private readonly saltLength: number\n private readonly encryptedPosition: number\n private readonly tagPosition: number\n private readonly pbkdf2Iterations: number\n private readonly encoding: NodeJS.BufferEncoding\n\n constructor(secret: string, options?: Options) {\n this.secret = secret\n\n this.encoding = options?.encoding ?? defaultEncoding\n this.pbkdf2Iterations = options?.pbkdf2Iterations ?? defaultPbkdf2Iterations\n this.saltLength = options?.saltLength ?? defaultSaltLength\n\n this.tagPosition = this.saltLength + ivLength\n this.encryptedPosition = this.tagPosition + tagLength\n }\n\n private getKey(salt: Buffer) {\n return crypto.pbkdf2Sync(this.secret, salt, this.pbkdf2Iterations, 32, 'sha512')\n }\n\n public encrypt(value: string) {\n const iv = crypto.randomBytes(ivLength)\n const salt = crypto.randomBytes(this.saltLength)\n\n const key = this.getKey(salt)\n\n const cipher = crypto.createCipheriv(algorithm, key, iv)\n const encrypted = Buffer.concat([cipher.update(String(value), 'utf8'), cipher.final()])\n\n const tag = cipher.getAuthTag()\n\n return Buffer.concat([salt, iv, tag, encrypted]).toString(this.encoding)\n }\n\n public decrypt(value: string) {\n const stringValue = Buffer.from(String(value), this.encoding)\n\n const salt = stringValue.subarray(0, this.saltLength)\n const iv = stringValue.subarray(this.saltLength, this.tagPosition)\n const tag = stringValue.subarray(this.tagPosition, this.encryptedPosition)\n const encrypted = stringValue.subarray(this.encryptedPosition)\n\n const key = this.getKey(salt)\n\n const decipher = crypto.createDecipheriv(algorithm, key, iv)\n\n decipher.setAuthTag(tag)\n\n return Buffer.concat([\n decipher.update(encrypted),\n Buffer.from(decipher.final('utf8')),\n ]).toString('utf8')\n }\n}\n","export function chunk<T>(array: T[], chunkSize: number): T[][] {\n const length = array.length\n if (!length || chunkSize < 1) {\n return []\n }\n let index = 0\n let resIndex = 0\n const result = new Array(Math.ceil(length / chunkSize))\n\n while (index < length) {\n // biome-ignore lint/suspicious/noAssignInExpressions: <explanation>\n result[resIndex++] = array.slice(index, (index += chunkSize))\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return result\n}\n\nexport async function callChunked<Item>(\n chunkSize: number,\n array: readonly Item[],\n processFn: (arrayChunk: Item[]) => Promise<unknown>,\n): Promise<void> {\n for (let i = 0; i < array.length; i += chunkSize) {\n const arrayChunk = array.slice(i, i + chunkSize)\n await processFn(arrayChunk)\n }\n}\n\n/**\n * Return a copy of the given array without null or undefined values\n */\nexport function removeNullish<const T>(array: readonly (T | null | undefined)[]): T[] {\n return array.filter((e) => e !== undefined && e !== null) as T[]\n}\n\n/**\n * Return a copy of the given array without falsy values (eg: false, 0, '', null, undefined)\n */\nexport function removeFalsy<const T>(\n array: readonly (T | null | undefined | 0 | '' | false)[],\n): T[] {\n return array.filter((e) => e) as T[]\n}\n\n/**\n * Return a copy of the given array without duplicates.\n */\nexport function removeDuplicates<const T>(array: readonly T[]): T[] {\n return [...new Set(array)]\n}\n","import dotProp from 'dot-prop'\n\nimport { InternalError } from '../errors/InternalError'\n\ntype RecordKeyType = string | number | symbol\n\nexport function copyWithoutUndefined<\n T extends Record<RecordKeyType, unknown>,\n TargetRecordType = Pick<\n T,\n {\n [Prop in keyof T]: T[Prop] extends null | undefined ? never : Prop\n }[keyof T]\n >,\n>(originalValue: T): TargetRecordType {\n return Object.keys(originalValue).reduce(\n (acc, key) => {\n // @ts-ignore\n if (originalValue[key] !== undefined) {\n // @ts-ignore\n acc[key] = originalValue[key]\n }\n return acc\n },\n {} as Record<string, unknown>,\n ) as TargetRecordType\n}\n\nexport function copyWithoutEmpty<\n T extends Record<RecordKeyType, unknown>,\n TargetRecordType = Pick<\n T,\n {\n [Prop in keyof T]: T[Prop] extends null | undefined | '' ? never : Prop\n }[keyof T]\n >,\n>(originalValue: T): TargetRecordType {\n return Object.keys(originalValue).reduce(\n (acc, key) => {\n if (\n originalValue[key] !== undefined &&\n originalValue[key] !== null &&\n // @ts-ignore\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n (typeof originalValue[key] !== 'string' || originalValue[key].trim().length > 0)\n ) {\n // @ts-ignore\n acc[key] = originalValue[key]\n }\n return acc\n },\n {} as Record<string, unknown>,\n ) as TargetRecordType\n}\n\nexport function pick<T, K extends string | number | symbol>(\n source: T,\n propNames: readonly K[],\n): Pick<T, Exclude<keyof T, Exclude<keyof T, K>>> {\n const result = {} as T\n let idx = 0\n while (idx < propNames.length) {\n // @ts-ignore\n if (propNames[idx] in source) {\n // @ts-ignore\n result[propNames[idx]] = source[propNames[idx]]\n }\n idx += 1\n }\n return result\n}\n\nexport function pickWithoutUndefined<T, K extends string | number | symbol>(\n source: T,\n propNames: readonly K[],\n): Pick<T, Exclude<keyof T, Exclude<keyof T, K>>> {\n const result = {} as T\n let idx = 0\n while (idx < propNames.length) {\n // @ts-ignore\n if (propNames[idx] in source && source[propNames[idx]] !== undefined) {\n // @ts-ignore\n result[propNames[idx]] = source[propNames[idx]]\n }\n idx += 1\n }\n return result\n}\n\nexport function isEmptyObject(params: Record<string, unknown>): boolean {\n for (const key in params) {\n if (Object.hasOwn(params, key) && params[key] !== undefined) {\n return false\n }\n }\n return true\n}\n\ntype KeysMatching<T, V> = { [K in keyof T]: T[K] extends V ? K : never }[keyof T]\n\n/**\n * @param array The array of objects to be grouped.\n * @param selector The key used for grouping the objects.\n * @returns An object where the keys are unique values from the given selector and the values are the corresponding objects from the array.\n */\nexport function groupBy<\n T extends object,\n K extends KeysMatching<T, RecordKeyType | null | undefined>,\n>(array: T[], selector: K): Record<RecordKeyType, T[]> {\n return array.reduce(\n (acc, item) => {\n const key = item[selector] as RecordKeyType | null | undefined\n if (key === undefined || key === null) {\n return acc\n }\n if (!acc[key]) {\n acc[key] = []\n }\n acc[key].push(item)\n return acc\n },\n {} as Record<RecordKeyType, T[]>,\n )\n}\n\n/**\n * @param array The array of objects to be grouped.\n * @param selector The key used for grouping the objects. Support nested keys.\n * @returns An object where the keys are unique values from the given selector and the values are the corresponding objects from the array.\n */\nexport function groupByPath<T extends object>(array: T[], selector: string): Record<string, T[]> {\n return array.reduce(\n (acc, item) => {\n const key = dotProp.get(item, selector)\n if (key === undefined || key === null) {\n return acc\n }\n const strKeyPath = key as string\n\n if (!acc[strKeyPath]) {\n acc[strKeyPath] = []\n }\n acc[strKeyPath].push(item)\n return acc\n },\n {} as Record<RecordKeyType, T[]>,\n )\n}\n\n/**\n * @param array The array of objects to be grouped.\n * @param selector The key used for grouping the objects.\n * @returns An object where the keys are unique values from the given selector and the value is the\n * corresponding object from the array.\n * @throws InternalError If a duplicated value is found for the given selector.\n */\nexport function groupByUnique<\n T extends object,\n K extends KeysMatching<T, RecordKeyType | null | undefined>,\n>(array: T[], selector: K): Record<RecordKeyType, T> {\n return array.reduce(\n (acc, item) => {\n const key = item[selector] as RecordKeyType | null | undefined\n if (key === undefined || key === null) {\n return acc\n }\n if (acc[key] !== undefined) {\n throw new InternalError({\n message: `Duplicated item for selector ${selector.toString()} with value ${key.toString()}`,\n errorCode: 'DUPLICATED_ITEM',\n details: { selector, value: key },\n })\n }\n acc[key] = item\n return acc\n },\n {} as Record<RecordKeyType, T>,\n )\n}\n\ntype DatesAsString<T> = T extends Date ? string : ExactlyLikeWithDateAsString<T>\n\ntype ExactlyLikeWithDateAsString<T> = T extends object ? { [K in keyof T]: DatesAsString<T[K]> } : T\n\nexport function convertDateFieldsToIsoString<Input extends object>(\n object: Input,\n): ExactlyLikeWithDateAsString<Input>\nexport function convertDateFieldsToIsoString<Input extends object>(\n object: Input[],\n): ExactlyLikeWithDateAsString<Input>[]\nexport function convertDateFieldsToIsoString<Input extends object>(\n object: Input | Input[],\n): ExactlyLikeWithDateAsString<Input> | ExactlyLikeWithDateAsString<Input>[] {\n if (Array.isArray(object)) {\n // @ts-ignore\n return object.map(convertDateFieldsToIsoStringAux)\n }\n\n return Object.entries(object).reduce(\n (result, [key, value]) => {\n // @ts-ignore\n result[key] = convertDateFieldsToIsoStringAux(value)\n return result\n },\n {} as ExactlyLikeWithDateAsString<Input>,\n )\n}\n\nfunction convertDateFieldsToIsoStringAux<T>(item: T): DatesAsString<T> {\n if (item instanceof Date) {\n // @ts-ignore\n return item.toISOString()\n }\n\n if (item && typeof item === 'object') {\n // @ts-ignore\n return convertDateFieldsToIsoString(item)\n }\n\n // @ts-ignore\n return item\n}\n\n/**\n * Return a deep clone copy of an object.\n *\n * Please Note: This uses structuredClone, which has the limitations of these restricted Types: functions,\n * Error objects, WeakMap, WeakSet, DOM nodes, and certain other browser-specific objects like Window.\n */\nexport function deepClone<T extends object | undefined | null>(object: T): T {\n if (object === undefined || object === null) {\n return object\n }\n return structuredClone(object)\n}\n\nfunction transformKey(key: string): string {\n return key\n .replace(/([a-z])([A-Z])/g, '$1-$2') // transforms basic camelCase\n .replace(/([A-Z])([A-Z][a-z])/g, '$1-$2') // transforms abbreviations\n .replace(/_/g, '-') // transforms snake_case\n .toLowerCase() // finally lowercase all\n}\n\ntype TransformToKebabCaseInputType = Record<string, unknown> | null | undefined\ntype TransformToKebabCaseReturnType<Input, Output> = Input extends Record<string, unknown>\n ? Output\n : Input\n/**\n * Transforms an object's keys from camelCase or snake_case to kebab-case.\n * @param object\n */\nexport function transformToKebabCase<\n Output extends Record<string, unknown>,\n Input extends TransformToKebabCaseInputType,\n>(object: Input): TransformToKebabCaseReturnType<Input, Output>\n\nexport function transformToKebabCase<\n Output extends Record<string, unknown>,\n Input extends TransformToKebabCaseInputType,\n>(object: Input[]): TransformToKebabCaseReturnType<Input, Output>[]\n\nexport function transformToKebabCase<Output, Input>(\n object: Input | Input[],\n): TransformToKebabCaseReturnType<Input, Output> | TransformToKebabCaseReturnType<Input, Output>[] {\n if (Array.isArray(object)) {\n // @ts-ignore\n return object.map(transformToKebabCase)\n }\n if (typeof object !== 'object' || object === null || object === undefined) {\n return object as TransformToKebabCaseReturnType<Input, Output>\n }\n\n return Object.entries(object as Record<string, unknown>).reduce(\n (result, [key, value]) => {\n const transformedKey = transformKey(key)\n const transformedValue =\n value && typeof value === 'object'\n ? transformToKebabCase(value as TransformToKebabCaseInputType)\n : value\n\n // Avoiding destructuring by directly assigning the new key-value pair\n result[transformedKey] = transformedValue\n return result\n },\n {} as Record<string, unknown>,\n ) as TransformToKebabCaseReturnType<Input, Output>\n}\n","// Error structure commonly used in libraries, e. g. fastify\nexport type StandardizedError = {\n code: string\n message: string\n}\n\nexport function hasMessage(maybe: unknown): maybe is { message: string } {\n return isObject(maybe) && typeof maybe.message === 'string'\n}\n\nexport function isObject(maybeObject: unknown): maybeObject is Record<PropertyKey, unknown> {\n return typeof maybeObject === 'object' && maybeObject !== null\n}\n\nexport function isStandardizedError(error: unknown): error is StandardizedError {\n return isObject(error) && typeof error.code === 'string' && typeof error.message === 'string'\n}\n\nexport function isError(maybeError: unknown): maybeError is Error {\n return (\n maybeError instanceof Error || Object.prototype.toString.call(maybeError) === '[object Error]'\n )\n}\n","import { createHash } from 'node:crypto'\n\nexport enum HashEncoding {\n HEX = 'hex',\n BASE64 = 'base64',\n}\n\nexport enum HashAlgorithm {\n SHA256 = 'sha256',\n SHA512 = 'sha512',\n}\n\nexport function generateHash(\n algorithm: HashAlgorithm,\n data: string,\n encoding: HashEncoding = HashEncoding.HEX,\n) {\n return createHash(algorithm).update(data).digest(encoding)\n}\n","import type { Level, Logger, LoggerOptions } from 'pino'\nimport pino, { levels } from 'pino'\nimport pretty from 'pino-pretty'\n\nexport type AppLoggerConfig = {\n logLevel: 'fatal' | 'error' | 'warn' | 'info' | 'debug' | 'trace' | 'silent'\n nodeEnv: 'production' | 'development' | 'test'\n base?: Record<string, unknown>\n redact?: LoggerOptions['redact']\n}\n\nexport type MonorepoAppLoggerConfig = AppLoggerConfig & {\n targetFile?: string\n append?: boolean\n}\n\n/* c8 ignore next 8 */\nexport function resolveMonorepoLogger(appConfig: MonorepoAppLoggerConfig): Logger {\n if (appConfig.nodeEnv !== 'development') {\n return resolveLogger(appConfig)\n }\n\n const configuration = resolveMonorepoLoggerConfiguration(appConfig) as LoggerOptions\n return pino(configuration)\n}\n\n// Note that transports do not work in vitest, likely because pino attempts to run them in a separate worker\n/* c8 ignore next 25 */\nexport function resolveMonorepoLoggerConfiguration(\n appConfig: MonorepoAppLoggerConfig,\n): LoggerOptions | Logger {\n if (appConfig.nodeEnv !== 'development') {\n return resolveLoggerConfiguration(appConfig)\n }\n\n return {\n level: appConfig.logLevel,\n formatters: {\n level: (label) => {\n return { level: label }\n },\n },\n redact: appConfig.redact,\n transport: {\n target: 'pino/file',\n options: {\n destination: appConfig.targetFile ?? './service.log',\n mkdir: true,\n append: appConfig.append ?? false,\n },\n },\n }\n}\n\nexport function resolveLogger(appConfig: AppLoggerConfig): Logger {\n if (appConfig.nodeEnv !== 'production') {\n return resolveLoggerConfiguration(appConfig) as Logger\n }\n\n const configuration = resolveLoggerConfiguration(appConfig) as LoggerOptions\n return pino(configuration)\n}\n\nexport function resolveLoggerConfiguration(appConfig: AppLoggerConfig): LoggerOptions | Logger {\n if (appConfig.nodeEnv !== 'production') {\n return pino(\n pretty({\n sync: true,\n minimumLevel: appConfig.logLevel as Level,\n colorize: true,\n translateTime: 'SYS:standard',\n ignore: 'hostname,pid',\n }),\n )\n }\n\n return {\n level: appConfig.logLevel,\n formatters: {\n level: (_label, numericLevel): { level: string } => {\n const level = levels.labels[numericLevel] || 'unknown'\n return { level }\n },\n },\n redact: appConfig.redact,\n } satisfies LoggerOptions\n}\n","/**\n * Serializes the given value into a JSON string and explicitly wraps it in double quotes.\n * This ensures that log collectors (like Graylog) treat it as a string and not as a JSON object,\n * preventing the automatic extraction of properties that could lead to property explosion.\n * Max length is set to 8100 (+4 for quotes) characters to prevent issues with log collectors\n * (Graylog) that have a limit of 32766 bytes per field. In the worst case scenario, each character\n * is 4 bytes (UTF-32), so we limit the string to 8100 characters to stay within the limit.\n */\nexport const stringValueSerializer = (value: unknown, maxLength = 8100): string => {\n const baseValue = valueToString(value)\n\n const truncated = baseValue.length > maxLength ? baseValue.slice(0, maxLength) : baseValue\n\n return typeof value === 'string' ? `\"\"${truncated}\"\"` : `\"${truncated}\"`\n}\n\nconst valueToString = (value: unknown): string => {\n if (typeof value === 'string') {\n return value\n }\n\n if (typeof value === 'bigint') {\n return value.toString()\n }\n\n if (typeof value === 'symbol') {\n return value.toString()\n }\n\n if (value === undefined) {\n return 'undefined'\n }\n\n if (typeof value === 'function') {\n return value.toString()\n }\n\n try {\n return JSON.stringify(value)\n } catch {\n return String(value) // fallback for circular references etc.\n }\n}\n","import type { SerializedError } from 'pino'\nimport pino, { levels, stdSerializers } from 'pino'\n\nimport type { CommonLogger } from '../logging/commonLogger'\nimport { hasMessage, isError } from '../utils/typeUtils'\n\ntype LogObject = {\n msg: string // this is the default pino message key\n 'x-request-id'?: string\n error?: SerializedError\n}\n\nexport const globalLogger: CommonLogger = pino({\n formatters: {\n level: (_label, numericLevel): { level: string } => {\n const level = levels.labels[numericLevel] || 'unknown'\n return { level }\n },\n },\n})\n\nexport function resolveGlobalErrorLogObject(err: unknown, correlationId?: string): LogObject {\n if (isError(err)) {\n return {\n msg: err.message,\n error: stdSerializers.err(err),\n 'x-request-id': correlationId,\n }\n }\n\n if (hasMessage(err)) {\n return {\n msg: err.message,\n 'x-request-id': correlationId,\n }\n }\n\n return {\n msg: 'Unknown error',\n 'x-request-id': correlationId,\n }\n}\n\nexport function executeAndHandleGlobalErrors<T>(operation: () => T) {\n try {\n const result = operation()\n return result\n } catch (err) {\n const logObject = resolveGlobalErrorLogObject(err)\n globalLogger.error(logObject)\n process.exit(1)\n }\n}\n\nexport async function executeAsyncAndHandleGlobalErrors<T>(\n operation: () => Promise<T>,\n stopOnError?: true,\n): Promise<T>\nexport async function executeAsyncAndHandleGlobalErrors<T>(\n operation: () => Promise<T>,\n stopOnError: false,\n): Promise<T | undefined>\nexport async function executeAsyncAndHandleGlobalErrors<T>(\n operation: () => Promise<T>,\n stopOnError = true,\n): Promise<T | undefined> {\n try {\n const result = await operation()\n return result\n } catch (err) {\n const logObject = resolveGlobalErrorLogObject(err)\n globalLogger.error(logObject)\n if (stopOnError) {\n process.exit(1)\n }\n }\n}\n\nexport async function executeSettleAllAndHandleGlobalErrors<T>(\n promises: Promise<T>[],\n stopOnError?: true,\n): Promise<PromiseSettledResult<T>[]>\nexport async function executeSettleAllAndHandleGlobalErrors<T>(\n promises: Promise<T>[],\n stopOnError: false,\n): Promise<PromiseSettledResult<T>[] | undefined>\nexport async function executeSettleAllAndHandleGlobalErrors<T>(\n promises: Promise<T>[],\n stopOnError = true,\n): Promise<PromiseSettledResult<T>[] | undefined> {\n const result = await Promise.allSettled(promises)\n\n let errorsHappened: boolean | undefined\n for (const entry of result) {\n if (entry.status === 'rejected') {\n const logObject = resolveGlobalErrorLogObject(entry.reason)\n globalLogger.error(logObject)\n errorsHappened = true\n }\n }\n\n if (stopOnError && errorsHappened) {\n process.exit(1)\n }\n\n if (!stopOnError && errorsHappened) {\n return undefined\n }\n\n return result\n}\n","import { constants as httpConstants } from 'node:http2'\n\nimport type { FreeformRecord } from '../common/commonTypes'\n\nimport { PublicNonRecoverableError } from './PublicNonRecoverableError'\n\nexport type CommonErrorParams = {\n message: string\n details?: FreeformRecord\n cause?: Error\n}\n\nexport type OptionalMessageErrorParams = Partial<CommonErrorParams>\n\nexport type ValidationError = {\n message: string\n path: string[]\n}\n\nexport class RequestValidationError extends PublicNonRecoverableError<{\n error: ValidationError[]\n}> {\n constructor(errors: ValidationError[]) {\n super({\n message: 'Invalid params',\n errorCode: 'VALIDATION_ERROR',\n httpStatusCode: httpConstants.HTTP_STATUS_BAD_REQUEST,\n details: {\n error: errors,\n },\n })\n }\n}\n\nexport class AccessDeniedError extends PublicNonRecoverableError {\n constructor(params: CommonErrorParams) {\n super({\n message: params.message,\n errorCode: 'ACCESS_DENIED',\n httpStatusCode: httpConstants.HTTP_STATUS_FORBIDDEN,\n details: params.details,\n cause: params.cause,\n })\n }\n}\n\nexport class EntityNotFoundError extends PublicNonRecoverableError {\n constructor(params: CommonErrorParams) {\n super({\n message: params.message,\n errorCode: 'ENTITY_NOT_FOUND',\n httpStatusCode: httpConstants.HTTP_STATUS_NOT_FOUND,\n details: params.details,\n cause: params.cause,\n })\n }\n}\n\nexport class EntityGoneError extends PublicNonRecoverableError {\n constructor(params: CommonErrorParams) {\n super({\n message: params.message,\n errorCode: 'ENTITY_GONE',\n httpStatusCode: httpConstants.HTTP_STATUS_GONE,\n details: params.details,\n })\n }\n}\n\nexport class AuthFailedError extends PublicNonRecoverableError {\n constructor(params: OptionalMessageErrorParams = {}) {\n super({\n message: params.message ?? 'Authentication failed',\n errorCode: 'AUTH_FAILED',\n httpStatusCode: httpConstants.HTTP_STATUS_UNAUTHORIZED,\n details: params.details,\n cause: params.cause,\n })\n }\n}\n","export const waitAndRetry = async <T>(\n predicateFn: () => T,\n sleepTime = 20,\n maxRetryCount = 15,\n): Promise<T> => {\n return new Promise((resolve, reject) => {\n let retryCount = 0\n function performCheck() {\n // amount of retries exceeded\n if (maxRetryCount !== 0 && retryCount > maxRetryCount) {\n resolve(predicateFn())\n }\n\n // Try executing predicateFn\n Promise.resolve()\n .then(() => {\n return predicateFn()\n })\n .then((result) => {\n if (result) {\n resolve(result)\n } else {\n retryCount++\n setTimeout(performCheck, sleepTime)\n }\n })\n .catch((err) => {\n reject(err)\n })\n }\n\n performCheck()\n })\n}\n","import type { TransactionObservabilityManager } from './observabilityTypes'\n\n/**\n * Groups different TransactionObservabilityManager instances into one\n * to facilitate tracking transactions across multiple observability tools.\n */\nexport class MultiTransactionObservabilityManager implements TransactionObservabilityManager {\n private readonly managers: TransactionObservabilityManager[]\n\n constructor(managers: TransactionObservabilityManager[]) {\n this.managers = managers\n }\n\n start(transactionName: string, uniqueTransactionKey: string): void {\n for (const manager of this.managers) {\n manager.start(transactionName, uniqueTransactionKey)\n }\n }\n\n startWithGroup(\n transactionName: string,\n uniqueTransactionKey: string,\n transactionGroup: string,\n ): void {\n for (const manager of this.managers) {\n manager.startWithGroup(transactionName, uniqueTransactionKey, transactionGroup)\n }\n }\n\n stop(uniqueTransactionKey: string, wasSuccessful?: boolean): void {\n for (const manager of this.managers) {\n manager.stop(uniqueTransactionKey, wasSuccessful)\n }\n }\n\n addCustomAttributes(\n uniqueTransactionKey: string,\n atts: { [p: string]: string | number | boolean },\n ): void {\n for (const manager of this.managers) {\n manager.addCustomAttributes(uniqueTransactionKey, atts)\n }\n }\n}\n","import type { BinaryLike } from 'node:crypto'\nimport { createHash } from 'node:crypto'\nimport type { Readable } from 'node:stream'\n\nconst HASH_ALGORITHM = 'md5'\n\nexport function generateChecksumForBufferOrString(data: BinaryLike): string {\n return createHash(HASH_ALGORITHM).update(data).digest('hex')\n}\n\nexport function generateChecksumForObject(object: object): string {\n const objectAsString = JSON.stringify(object)\n return generateChecksumForBufferOrString(objectAsString)\n}\n\nexport function generateChecksumForReadable(readable: Readable): Promise<string> {\n return new Promise((resolve, reject) => {\n const hashCreator = createHash(HASH_ALGORITHM)\n readable.on('data', (data) => {\n if (Buffer.isBuffer(data)) {\n hashCreator.update(data)\n } else {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n hashCreator.update(Buffer.from(data))\n }\n })\n\n readable.on('end', () => {\n const hash = hashCreator.digest('hex')\n resolve(hash)\n })\n readable.on('error', (err) => {\n /* c8 ignore next 1 */\n reject(err)\n })\n })\n}\n","import { F_OK } from 'node:constants'\nimport { access, createReadStream, createWriteStream } from 'node:fs'\nimport { stat, unlink } from 'node:fs/promises'\nimport type { Readable } from 'node:stream'\nimport { pipeline } from 'node:stream'\n\nexport type ReadableProvider = {\n /**\n * Guarantees to provide a new stream every time this is called, before `destroy` is invoked.\n */\n createStream(): Promise<Readable>\n\n /**\n * Returns size of the persisted content\n */\n getContentLength(): Promise<number>\n\n /**\n * Remove the persisted value. No new streams can be created after this is called\n */\n destroy(): Promise<void>\n}\n\nexport type PersistToFsOptions = {\n targetFile: string\n sourceReadable: Readable\n}\n\nexport type FsReadableProviderOptions = {\n storageFile: string\n}\n\nexport class FsReadableProvider implements ReadableProvider {\n public readonly storageFile: string\n constructor(options: FsReadableProviderOptions) {\n this.storageFile = options.storageFile\n }\n\n fileExists(): Promise<boolean> {\n return new Promise((resolve) => {\n access(this.storageFile, F_OK, (err) => {\n return resolve(!err)\n })\n })\n }\n\n async getContentLength(): Promise<number> {\n if (!(await this.fileExists())) {\n throw new Error(`File ${this.storageFile} was already deleted.`)\n }\n const stats = await stat(this.storageFile)\n return stats.size\n }\n\n async createStream(): Promise<Readable> {\n if (!(await this.fileExists())) {\n throw new Error(`File ${this.storageFile} was already deleted.`)\n }\n\n return createReadStream(this.storageFile)\n }\n\n async destroy(): Promise<void> {\n if (!(await this.fileExists())) {\n // nothing to do here\n return\n }\n\n return unlink(this.storageFile)\n }\n\n protected async persist(sourceReadable: Readable): Promise<void> {\n const writable = createWriteStream(this.storageFile)\n return new Promise((resolve, reject) => {\n pipeline(sourceReadable, writable, (err) => {\n if (err) {\n /* c8 ignore next 1 */\n reject(err)\n } else {\n resolve()\n }\n })\n })\n }\n\n public static async persistReadableToFs(\n options: PersistToFsOptions,\n ): Promise<FsReadableProvider> {\n const provider = new FsReadableProvider({\n storageFile: options.targetFile,\n })\n await provider.persist(options.sourceReadable)\n return provider\n }\n}\n\n/**\n * Consumes the readable in order to calculate its length in bytes\n * @param readable\n */\nexport function getReadableContentLength(readable: Readable): Promise<number> {\n return new Promise((resolve, reject) => {\n let size = 0\n readable.on('data', (chunk) => {\n if (typeof chunk === 'string' || Buffer.isBuffer(chunk)) {\n size += Buffer.byteLength(chunk)\n }\n })\n readable.on('end', () => {\n resolve(size)\n })\n readable.on('error', (error) => {\n /* c8 ignore next 1 */\n reject(error)\n })\n })\n}\n\n/**\n * Consumes the readable stream and returns its content as a Buffer.\n * @param stream - The readable stream to consume.\n * @returns A promise that resolves to a Buffer containing the stream's content.\n */\nexport async function streamToBuffer(stream: Readable): Promise<Buffer> {\n const chunks: Buffer[] = []\n for await (const chunk of stream) {\n chunks.push(chunk as Buffer)\n }\n return Buffer.concat(chunks)\n}\n"],"mappings":"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","names":["isNativeError","isNativeError","HashEncoding","HashAlgorithm","algorithm","pino","levels","pino","levels","createHash","chunk"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lokalise/node-core",
3
- "version": "14.6.0",
3
+ "version": "14.6.1",
4
4
  "author": {
5
5
  "name": "Lokalise",
6
6
  "url": "https://lokalise.com/"