diff --git a/packages/common-aws/package.json b/packages/common-aws/package.json index 8e71f75..b5b25e8 100644 --- a/packages/common-aws/package.json +++ b/packages/common-aws/package.json @@ -1,6 +1,6 @@ { "name": "@paradoxical-io/common-aws", - "version": "2.8.0", + "version": "2.9.0", "description": "Common aws for paradox services", "main": "./dist/index.js", "types": "./dist/index.d.ts", diff --git a/packages/common-aws/src/cloudwatch/cloudwatch.ts b/packages/common-aws/src/cloudwatch/cloudwatch.ts index 777df67..b8e4d44 100644 --- a/packages/common-aws/src/cloudwatch/cloudwatch.ts +++ b/packages/common-aws/src/cloudwatch/cloudwatch.ts @@ -7,13 +7,27 @@ import { FilterLogEventsCommand, LogGroup, } from '@aws-sdk/client-cloudwatch-logs'; -import { log } from '@paradoxical-io/common-server'; import { Brand, EpochMS } from '@paradoxical-io/types'; +import { Logger, Monitoring, noOpMonitoring } from '../monitoring'; + export type CloudwatchExportTaskId = Brand<'TaskId', string>; export class CloudwatchManager { - constructor(private cloudwatch: CloudWatchLogsClient = new CloudWatchLogsClient()) {} + private readonly logger: Logger; + + constructor({ + cloudwatch = new CloudWatchLogsClient(), + monitoring = noOpMonitoring(), + }: { + cloudwatch?: CloudWatchLogsClient; + monitoring?: Monitoring; + } = {}) { + this.cloudwatch = cloudwatch; + this.logger = monitoring.logger; + } + + private readonly cloudwatch: CloudWatchLogsClient; /** * Create a new task to export a log group to an S3 bucket. @@ -36,7 +50,7 @@ export class CloudwatchManager { from: EpochMS; to: EpochMS; }): Promise { - log.info(`Creating export task for ${logGroupName} from ${from} to ${to}`); + this.logger.info(`Creating export task for ${logGroupName} from ${from} to ${to}`); /** * validate that we have at least 1 log event to export within the time range. @@ -66,7 +80,7 @@ export class CloudwatchManager { return taskId as CloudwatchExportTaskId; } - log.info(`No log events found for ${logGroupName} from ${from} to ${to}`); + this.logger.info(`No log events found for ${logGroupName} from ${from} to ${to}`); return undefined; } diff --git a/packages/common-aws/src/credentials.ts b/packages/common-aws/src/credentials.ts index d5b39ea..b067c52 100644 --- a/packages/common-aws/src/credentials.ts +++ b/packages/common-aws/src/credentials.ts @@ -1,7 +1,9 @@ -import { gitRootSync, log } from '@paradoxical-io/common-server'; +import { gitRootSync } from '@paradoxical-io/common-server'; import { Env } from '@paradoxical-io/types'; import * as path from 'path'; +import { Logger, noOpMonitoring } from './monitoring'; + export interface Profile { profile: string; } @@ -9,11 +11,12 @@ export interface Profile { /** * Sets the current environment to use the AWS credentials from the shared credentials file * @param requestedEnv + * @param logger */ -export function useAWS(requestedEnv: Env | Profile): void { +export function useAWS(requestedEnv: Env | Profile, logger: Logger = noOpMonitoring().logger): void { let env = requestedEnv; if (env === 'local') { - log.debug("Running 'local' environment. Using dev env for all aws resources"); + logger.debug("Running 'local' environment. Using dev env for all aws resources"); env = 'dev'; } @@ -24,7 +27,7 @@ export function useAWS(requestedEnv: Env | Profile): void { process.env.AWS_CONFIG_FILE = configPath; process.env.AWS_SDK_LOAD_CONFIG = 'true'; - log.debug(`Configured AWS to use profile ${profile}`); + logger.debug(`Configured AWS to use profile ${profile}`); } function resolveConfig(env: Env | Profile) { diff --git a/packages/common-aws/src/dynamo/do-once/doOnce.ts b/packages/common-aws/src/dynamo/do-once/doOnce.ts index 1634a56..ffff9a2 100644 --- a/packages/common-aws/src/dynamo/do-once/doOnce.ts +++ b/packages/common-aws/src/dynamo/do-once/doOnce.ts @@ -1,11 +1,20 @@ -import { defaultTimeProvider } from '@paradoxical-io/common'; -import { logMethod } from '@paradoxical-io/common-server'; +import { defaultTimeProvider, logMethod } from '@paradoxical-io/common'; import { CompoundKey, DoOnceActionKey, DoOnceResponse, EpochMS, SortKey } from '@paradoxical-io/types'; +import { Logger, Monitoring, noOpMonitoring } from '../../monitoring'; import { PartitionedKeyValueTable } from '../keys'; export class DoOnceManager { - constructor(private readonly kv: PartitionedKeyValueTable, private readonly time = defaultTimeProvider()) {} + // Accessed by @logMethod() decorator via reflection + readonly logger: Logger; + + constructor( + private readonly kv: PartitionedKeyValueTable, + private readonly time = defaultTimeProvider(), + monitoring: Monitoring = noOpMonitoring() + ) { + this.logger = monitoring.logger; + } /** * The key format where each action is stored separately in the KV. diff --git a/packages/common-aws/src/dynamo/dynamoLock.ts b/packages/common-aws/src/dynamo/dynamoLock.ts index 72fe984..1a9c1f2 100644 --- a/packages/common-aws/src/dynamo/dynamoLock.ts +++ b/packages/common-aws/src/dynamo/dynamoLock.ts @@ -6,9 +6,10 @@ import { UpdateItemCommand, } from '@aws-sdk/client-dynamodb'; import { defaultTimeProvider, propertiesOf, TimeProvider, toEpochSeconds } from '@paradoxical-io/common'; -import { Lock, LockApi, log } from '@paradoxical-io/common-server'; +import { Lock, LockApi } from '@paradoxical-io/common-server'; import { EpochSeconds } from '@paradoxical-io/types'; +import { Logger, Monitoring, noOpMonitoring } from '../monitoring'; import { DynamoDao } from './mapper'; import { DynamoTableName, dynamoTableName } from './util'; @@ -19,20 +20,26 @@ export class DynamoLock implements LockApi { private readonly timeProvider: TimeProvider; + private readonly logger: Logger; + constructor({ dynamo = new DynamoDBClient(), tableName = dynamoTableName('locks'), timeProvider = defaultTimeProvider(), + monitoring = noOpMonitoring(), }: { dynamo?: DynamoDBClient; tableName?: DynamoTableName; timeProvider?: TimeProvider; + monitoring?: Monitoring; } = {}) { this.dynamo = dynamo; this.tableName = tableName; this.timeProvider = timeProvider; + + this.logger = monitoring.logger; } async tryAcquire(key: string, timeoutSeconds: number): Promise { @@ -79,7 +86,7 @@ export class DynamoLock implements LockApi { expired = `because previous lock expired at ${old.Attributes['expiresAt']!.N}`; } - log.info( + this.logger.info( `Acquired lock id: ${key}, expires at ${payload.expiresAt}, evaluated with now as ${now.toString()} ${expired}` ); @@ -97,12 +104,12 @@ export class DynamoLock implements LockApi { await this.dynamo.send(deleteItemCommand); - log.info(`Released lock id: ${key}`); + this.logger.info(`Released lock id: ${key}`); }, }; } catch (e) { if (e instanceof ConditionalCheckFailedException) { - log.info(`Cannot acquire lock id: ${key}, it is still held`); + this.logger.info(`Cannot acquire lock id: ${key}, it is still held`); return undefined; } diff --git a/packages/common-aws/src/dynamo/keys/keyTable.ts b/packages/common-aws/src/dynamo/keys/keyTable.ts index a666d76..ae62a96 100644 --- a/packages/common-aws/src/dynamo/keys/keyTable.ts +++ b/packages/common-aws/src/dynamo/keys/keyTable.ts @@ -10,9 +10,9 @@ import { ScanCommandInput, } from '@aws-sdk/client-dynamodb'; import { Arrays, asBrandSafe, propertyOf, sleep } from '@paradoxical-io/common'; -import { log } from '@paradoxical-io/common-server'; import { Brand, Milliseconds, notNullOrUndefined } from '@paradoxical-io/types'; +import { Logger, Monitoring, noOpMonitoring } from '../../monitoring'; import { DynamoDao } from '../mapper'; import { assertTableNameValid, DynamoTableName, dynamoTableName } from '../util'; @@ -54,14 +54,18 @@ export class KeyValueTable { private readonly tableName: string; + private readonly logger: Logger; + constructor({ namespace = 'global', dynamo = new DynamoDBClient(), tableName = dynamoTableName('keys'), + monitoring = noOpMonitoring(), }: { namespace?: string; dynamo?: DynamoDBClient; tableName?: DynamoTableName; + monitoring?: Monitoring; } = {}) { assertTableNameValid(tableName); @@ -70,6 +74,8 @@ export class KeyValueTable { this.tableName = tableName; this.dynamo = dynamo; + + this.logger = monitoring.logger; } async get(id: string): Promise { @@ -168,7 +174,7 @@ export class KeyValueTable { } } } catch (e) { - log.error(`Failed to scan ${pageItem}`, e); + this.logger.error(`Failed to scan ${pageItem}`, e); throw e; } @@ -229,7 +235,7 @@ export class KeyValueTable { } } } catch (e) { - log.error(`Failed to get batch ${id.join(',')}`, e); + this.logger.error(`Failed to get batch ${id.join(',')}`, e); throw e; } @@ -254,7 +260,7 @@ export class KeyValueTable { try { await this.dynamo.send(command); } catch (e) { - log.error(`Failed to set item ${data.key}`, e); + this.logger.error(`Failed to set item ${data.key}`, e); throw e; } @@ -273,7 +279,7 @@ export class KeyValueTable { try { await this.dynamo.send(command); } catch (e) { - log.error(`Failed to delete item ${id}`, e); + this.logger.error(`Failed to delete item ${id}`, e); throw e; } diff --git a/packages/common-aws/src/dynamo/keys/keyValueCounter.ts b/packages/common-aws/src/dynamo/keys/keyValueCounter.ts index a0b7f83..66dbefe 100644 --- a/packages/common-aws/src/dynamo/keys/keyValueCounter.ts +++ b/packages/common-aws/src/dynamo/keys/keyValueCounter.ts @@ -7,9 +7,9 @@ import { UpdateItemCommand, } from '@aws-sdk/client-dynamodb'; import { Arrays, propertyOf } from '@paradoxical-io/common'; -import { log } from '@paradoxical-io/common-server'; import { Brand, notNullOrUndefined } from '@paradoxical-io/types'; +import { Logger, Monitoring, noOpMonitoring } from '../../monitoring'; import { DynamoDao } from '../mapper'; import { assertTableNameValid, DynamoTableName, dynamoTableName } from '../util'; @@ -81,14 +81,18 @@ export class KeyValueCounter { private readonly tableName: string; + private readonly logger: Logger; + constructor({ namespace, dynamo = new DynamoDBClient(), tableName = dynamoTableName('keys'), + monitoring = noOpMonitoring(), }: { namespace: string; dynamo?: DynamoDBClient; tableName?: DynamoTableName; + monitoring?: Monitoring; }) { assertTableNameValid(tableName); @@ -97,6 +101,8 @@ export class KeyValueCounter { this.tableName = tableName; this.dynamo = dynamo; + + this.logger = monitoring.logger; } async get(ids: K[]): Promise>> { @@ -217,7 +223,7 @@ export class KeyValueCounter { return Number(result.Attributes![propertyOf('count')]!.N); } catch (e) { - log.error(`Failed to increment ${data.key}`, e); + this.logger.error(`Failed to increment ${data.key}`, e); throw e; } @@ -236,7 +242,7 @@ export class KeyValueCounter { try { await this.dynamo.send(command); } catch (e) { - log.error(`Failed to delete ${id}`, e); + this.logger.error(`Failed to delete ${id}`, e); throw e; } diff --git a/packages/common-aws/src/dynamo/keys/partitionedKeyTable.ts b/packages/common-aws/src/dynamo/keys/partitionedKeyTable.ts index ac009d4..cc1e269 100644 --- a/packages/common-aws/src/dynamo/keys/partitionedKeyTable.ts +++ b/packages/common-aws/src/dynamo/keys/partitionedKeyTable.ts @@ -9,11 +9,12 @@ import { QueryCommand, ResourceNotFoundException, } from '@aws-sdk/client-dynamodb'; -import { Arrays, isEqual, jitter, propertyOf, sleep } from '@paradoxical-io/common'; -import { consistentMd5, log, timed } from '@paradoxical-io/common-server'; +import { Arrays, isEqual, jitter, propertyOf, sleep, timed } from '@paradoxical-io/common'; +import { consistentMd5 } from '@paradoxical-io/common-server'; import { CompoundKey, Milliseconds, notNullOrUndefined, nullOrUndefined, SortKey } from '@paradoxical-io/types'; import _ from 'lodash'; +import { Logger, Metrics, Monitoring, noOpMonitoring } from '../../monitoring'; import { DynamoDao } from '../mapper'; import { assertTableNameValid, DynamoTableName, dynamoTableName } from '../util'; import { DynamoKey } from './keyTable'; @@ -52,18 +53,28 @@ export class PartitionedKeyValueTable { readonly tableName: string; + private readonly logger: Logger; + + readonly metrics: Metrics; + constructor({ dynamo = new DynamoDBClient(), tableName = dynamoTableName('partitioned_keys'), + monitoring = noOpMonitoring(), }: { dynamo?: DynamoDBClient; tableName?: DynamoTableName; + monitoring?: Monitoring; } = {}) { assertTableNameValid(tableName); this.tableName = tableName; this.dynamo = dynamo; + + this.logger = monitoring.logger; + + this.metrics = monitoring.metrics; } /** @@ -93,7 +104,7 @@ export class PartitionedKeyValueTable { const next = [...(previous?.data ?? []), ...normalized.filter(i => !itemExists(i))]; if (!(await this.setIfMd5Matches(key, next, previous?.md5))) { - log.info(`Unable to add key ${JSON.stringify(key)} to set because md5 does not match. Trying again`); + this.logger.info(`Unable to add key ${JSON.stringify(key)} to set because md5 does not match. Trying again`); await sleep((250 + jitter(100 as Milliseconds)) as Milliseconds); @@ -212,7 +223,7 @@ export class PartitionedKeyValueTable { return []; } - log.error(`Failed to list all from partition: ${partition}`, e); + this.logger.error(`Failed to list all from partition: ${partition}`, e); throw e; } @@ -306,7 +317,7 @@ export class PartitionedKeyValueTable { return false; } - log.error(`Failed to set Partition: ${key.partition}, Sort: ${this.sortKey(key)}`, e); + this.logger.error(`Failed to set Partition: ${key.partition}, Sort: ${this.sortKey(key)}`, e); throw e; } @@ -407,7 +418,7 @@ export class PartitionedKeyValueTable { return undefined; } - log.error(`Unable to get Partition: ${key.partition}, Sort: ${sortKey}`, e); + this.logger.error(`Unable to get Partition: ${key.partition}, Sort: ${sortKey}`, e); throw e; } @@ -461,7 +472,7 @@ export class PartitionedKeyValueTable { return false; } - log.error(`Failed to set Partition: ${key.partition}, Sort: ${sortKey}, Previous MD5: ${previousMd5}`, e); + this.logger.error(`Failed to set Partition: ${key.partition}, Sort: ${sortKey}, Previous MD5: ${previousMd5}`, e); throw e; } @@ -500,7 +511,7 @@ export class PartitionedKeyValueTable { return false; } - log.error(`Failed to get Partition: ${key.partition}, Sort: ${sortKey}`, e); + this.logger.error(`Failed to get Partition: ${key.partition}, Sort: ${sortKey}`, e); throw e; } @@ -610,7 +621,7 @@ export class PartitionedKeyValueTable { try { await this.dynamo.send(command); } catch (e) { - log.error(`Failed to delete item Partition: ${key.partition}, Sort: ${sortKey}`, e); + this.logger.error(`Failed to delete item Partition: ${key.partition}, Sort: ${sortKey}`, e); throw e; } diff --git a/packages/common-aws/src/dynamo/keys/partitionedKeyValueCounter.ts b/packages/common-aws/src/dynamo/keys/partitionedKeyValueCounter.ts index 59ee997..197f4d9 100644 --- a/packages/common-aws/src/dynamo/keys/partitionedKeyValueCounter.ts +++ b/packages/common-aws/src/dynamo/keys/partitionedKeyValueCounter.ts @@ -7,9 +7,9 @@ import { UpdateItemCommand, } from '@aws-sdk/client-dynamodb'; import { Arrays, propertyOf } from '@paradoxical-io/common'; -import { log } from '@paradoxical-io/common-server'; import { CompoundKey, SortKey } from '@paradoxical-io/types'; +import { Logger, Monitoring, noOpMonitoring } from '../../monitoring'; import { DynamoDao } from '../mapper'; import { assertTableNameValid, DynamoTableName, dynamoTableName } from '../util'; @@ -38,18 +38,24 @@ export class PartitionedKeyValueCounter { private readonly tableName: string; + private readonly logger: Logger; + constructor({ dynamo = new DynamoDBClient(), tableName = dynamoTableName('partitioned_keys'), + monitoring = noOpMonitoring(), }: { dynamo?: DynamoDBClient; tableName?: DynamoTableName; + monitoring?: Monitoring; }) { assertTableNameValid(tableName); this.tableName = tableName; this.dynamo = dynamo; + + this.logger = monitoring.logger; } async get

(id: CompoundKey): Promise { @@ -171,7 +177,10 @@ export class PartitionedKeyValueCounter { return Number(result.Attributes![propertyOf('count')]!.N); } catch (e) { - log.error(`failed to increment ${JSON.stringify({ sortKey: data.sortKey, partitionKey: data.partitionKey })}`, e); + this.logger.error( + `failed to increment ${JSON.stringify({ sortKey: data.sortKey, partitionKey: data.partitionKey })}`, + e + ); throw e; } @@ -193,7 +202,10 @@ export class PartitionedKeyValueCounter { try { await this.dynamo.send(command); } catch (e) { - log.error(`failed to delete ${JSON.stringify({ sortKey: data.sortKey, partitionKey: data.partitionKey })}`, e); + this.logger.error( + `failed to delete ${JSON.stringify({ sortKey: data.sortKey, partitionKey: data.partitionKey })}`, + e + ); throw e; } diff --git a/packages/common-aws/src/gateway/apiGatewayWebsocket.ts b/packages/common-aws/src/gateway/apiGatewayWebsocket.ts index 89649c5..7a56f6b 100644 --- a/packages/common-aws/src/gateway/apiGatewayWebsocket.ts +++ b/packages/common-aws/src/gateway/apiGatewayWebsocket.ts @@ -3,17 +3,31 @@ import { GoneException, PostToConnectionCommand, } from '@aws-sdk/client-apigatewaymanagementapi'; -import { log } from '@paradoxical-io/common-server'; + +import { Logger, Monitoring, noOpMonitoring } from '../monitoring'; export class ApiGatewayWebsocket { - constructor(private api: ApiGatewayManagementApiClient = new ApiGatewayManagementApiClient()) {} + private readonly api: ApiGatewayManagementApiClient; + + private readonly logger: Logger; + + constructor({ + api = new ApiGatewayManagementApiClient(), + monitoring = noOpMonitoring(), + }: { + api?: ApiGatewayManagementApiClient; + monitoring?: Monitoring; + } = {}) { + this.api = api; + this.logger = monitoring.logger; + } static createEndpoint(endpoint: string): ApiGatewayWebsocket { - return new ApiGatewayWebsocket( - new ApiGatewayManagementApiClient({ + return new ApiGatewayWebsocket({ + api: new ApiGatewayManagementApiClient({ endpoint: endpoint.replace('wss', 'https'), - }) - ); + }), + }); } /** @@ -36,7 +50,7 @@ export class ApiGatewayWebsocket { return false; } - log.error(`Error publishing to connection id: ${connectionId}`, e); + this.logger.error(`Error publishing to connection id: ${connectionId}`, e); return false; } diff --git a/packages/common-aws/src/index.ts b/packages/common-aws/src/index.ts index 8a44da2..b66c21e 100644 --- a/packages/common-aws/src/index.ts +++ b/packages/common-aws/src/index.ts @@ -3,6 +3,7 @@ export * from './cloudwatch'; export * from './dynamo'; export * from './gateway/apiGatewayWebsocket'; export * from './lambda/metrics'; +export * from './monitoring'; export * from './parameter-store'; export * from './s3'; export * from './sns/sns'; diff --git a/packages/common-aws/src/lambda/metrics.test.ts b/packages/common-aws/src/lambda/metrics.test.ts index 37d6d8c..ae062b4 100644 --- a/packages/common-aws/src/lambda/metrics.test.ts +++ b/packages/common-aws/src/lambda/metrics.test.ts @@ -1,9 +1,10 @@ import { asMilli, sleep } from '@paradoxical-io/common'; -import { DDogApi, HttpDDogMetrics, Metrics } from '@paradoxical-io/common-server'; +import { DDogApi, HttpDDogMetrics } from '@paradoxical-io/common-server'; import { mock, safeExpect } from '@paradoxical-io/common-test'; import { Milliseconds } from '@paradoxical-io/types'; import { Context } from 'aws-lambda'; +import { Monitoring } from '../monitoring'; import { setupLambda } from './metrics'; test('flushes metrics', async () => { @@ -15,9 +16,28 @@ test('flushes metrics', async () => { const closeSpy = jest.spyOn(metrics, 'close'); - const lamda = setupLambda<{}, void>(async () => { - Metrics.instance.increment('test'); - }, metrics); + const monitoring: Monitoring = { + logger: { + info() {}, + error() {}, + warn() {}, + debug() {}, + with() { + return this; + }, + }, + metrics, + }; + + const lamda = setupLambda<{}, void>( + async () => { + metrics.increment('test'); + }, + { + monitoring, + onClose: () => new Promise(r => metrics.close(() => r())), + } + ); // invoke the lambda await lamda({}, {} as Context, () => {}); diff --git a/packages/common-aws/src/lambda/metrics.ts b/packages/common-aws/src/lambda/metrics.ts index e7ddee0..9e92203 100644 --- a/packages/common-aws/src/lambda/metrics.ts +++ b/packages/common-aws/src/lambda/metrics.ts @@ -1,36 +1,44 @@ -import { HttpDDogMetrics, log, withMetrics, withNewTrace } from '@paradoxical-io/common-server'; +import { withNewTrace } from '@paradoxical-io/common-server'; import { Callback, Context } from 'aws-lambda'; +import { Logger, Monitoring, noOpMonitoring } from '../monitoring'; + type PromiseHandler = ( event: TEvent, context: Context, callback: Callback ) => Promise; +export interface SetupLambdaOptions { + monitoring?: Monitoring; + /** + * Optional close hook for flushing metrics before Lambda returns. + * Consumers using HttpDDogMetrics pass: () => new Promise(r => metrics.close(r)) + */ + onClose?: () => Promise; +} + /** * Register metrics and trace wrapping the handler, this gives our local CLS a new trace ID */ export function setupLambda( handler: PromiseHandler, - metrics = new HttpDDogMetrics() + options?: SetupLambdaOptions ): PromiseHandler { - return async (...args) => { - withMetrics(metrics); + const logger: Logger = options?.monitoring?.logger ?? noOpMonitoring().logger; - return withNewTrace(async () => { + return async (...args) => + withNewTrace(async () => { const result = await handler(...args); - await new Promise(r => - metrics.close(e => { - if (e) { - log.warn('Error waiting on metrics, some metrics may not have flushed properly', e); - } - - r(); - }) - ); + if (options?.onClose) { + try { + await options.onClose(); + } catch (e) { + logger.warn('Error waiting on metrics close, some metrics may not have flushed properly', e); + } + } return result; }); - }; } diff --git a/packages/common-aws/src/monitoring/index.ts b/packages/common-aws/src/monitoring/index.ts new file mode 100644 index 0000000..64c3de2 --- /dev/null +++ b/packages/common-aws/src/monitoring/index.ts @@ -0,0 +1,4 @@ +export { Logger } from './logger'; +export { Metrics } from './metrics'; +export { Monitoring, noOpMonitoring } from './monitoring'; +export { NoOpLogger, NoOpMetrics } from './noop'; diff --git a/packages/common-aws/src/monitoring/logger.ts b/packages/common-aws/src/monitoring/logger.ts new file mode 100644 index 0000000..07cf4fb --- /dev/null +++ b/packages/common-aws/src/monitoring/logger.ts @@ -0,0 +1,13 @@ +/** + * Slim logger interface for common-aws consumers. + * + * Satisfies common's Logger interface (used by @logMethod decorator) as a superset, + * adding the full set of log levels and contextual .with() builder. + */ +export interface Logger { + info(msg: string, context?: Record): void; + error(msg: string, error?: unknown): void; + warn(msg: string, error?: unknown): void; + debug(msg: string, context?: Record): void; + with(context: Record): Logger; +} diff --git a/packages/common-aws/src/monitoring/metrics.ts b/packages/common-aws/src/monitoring/metrics.ts new file mode 100644 index 0000000..b5f7ad4 --- /dev/null +++ b/packages/common-aws/src/monitoring/metrics.ts @@ -0,0 +1,11 @@ +/** + * Slim metrics interface for common-aws consumers. + * + * Satisfies common's Metrics interface (used by @timed decorator) as a superset, + * adding increment support. + */ +export interface Metrics { + increment(stat: string, tags?: Record): void; + increment(stat: string, value: number, tags?: Record): void; + timing(stat: string, value: number, tags?: Record): void; +} diff --git a/packages/common-aws/src/monitoring/monitoring.ts b/packages/common-aws/src/monitoring/monitoring.ts new file mode 100644 index 0000000..55f1d40 --- /dev/null +++ b/packages/common-aws/src/monitoring/monitoring.ts @@ -0,0 +1,12 @@ +import { Logger } from './logger'; +import { Metrics } from './metrics'; +import { NoOpLogger, NoOpMetrics } from './noop'; + +export interface Monitoring { + readonly logger: Logger; + readonly metrics: Metrics; +} + +export function noOpMonitoring(): Monitoring { + return { logger: new NoOpLogger(), metrics: new NoOpMetrics() }; +} diff --git a/packages/common-aws/src/monitoring/noop.ts b/packages/common-aws/src/monitoring/noop.ts new file mode 100644 index 0000000..756f5e9 --- /dev/null +++ b/packages/common-aws/src/monitoring/noop.ts @@ -0,0 +1,34 @@ +import { Logger } from './logger'; +import { Metrics } from './metrics'; + +/** + * No-op logger that delegates error/warn to console for safety. + * + * CLAUDE.md: "Prefer failing fast and loudly over silent misbehavior." + * A developer who forgets to wire monitoring still sees errors via console. + */ +export class NoOpLogger implements Logger { + info(): void {} + + error(msg: string, error?: unknown): void { + // eslint-disable-next-line no-console + console.error(`[common-aws] ${msg}`, error ?? ''); + } + + warn(msg: string, error?: unknown): void { + // eslint-disable-next-line no-console + console.warn(`[common-aws] ${msg}`, error ?? ''); + } + + debug(): void {} + + with(): Logger { + return this; + } +} + +export class NoOpMetrics implements Metrics { + increment(): void {} + + timing(): void {} +} diff --git a/packages/common-aws/src/parameter-store/api/parameterStoreApi.ts b/packages/common-aws/src/parameter-store/api/parameterStoreApi.ts index b6049bd..72eddae 100644 --- a/packages/common-aws/src/parameter-store/api/parameterStoreApi.ts +++ b/packages/common-aws/src/parameter-store/api/parameterStoreApi.ts @@ -7,12 +7,17 @@ import { SSMClient, } from '@aws-sdk/client-ssm'; import { Arrays, Limiter, retry as autoRetry } from '@paradoxical-io/common'; -import { log } from '@paradoxical-io/common-server'; import { ErrorCode, ErrorWithCode, isErrorWithCode } from '@paradoxical-io/types'; import retry = require('async-retry'); +import { Logger, Monitoring, noOpMonitoring } from '../../monitoring'; + export class ParameterStoreApi { - constructor(private ssm: SSMClient) {} + private readonly logger: Logger; + + constructor(private ssm: SSMClient, monitoring: Monitoring = noOpMonitoring()) { + this.logger = monitoring.logger; + } async listParameters(): Promise { const params: string[] = []; @@ -112,7 +117,7 @@ export class ParameterStoreApi { }, { onRetry: (error, num) => { - log.warn(`Unable to load parameter store value ${name}. Retry attempt ${num}. Trying again`, error); + this.logger.warn(`Unable to load parameter store value ${name}. Retry attempt ${num}. Trying again`, error); }, } ); diff --git a/packages/common-aws/src/s3/secure.ts b/packages/common-aws/src/s3/secure.ts index cd044d3..cb4c155 100644 --- a/packages/common-aws/src/s3/secure.ts +++ b/packages/common-aws/src/s3/secure.ts @@ -14,7 +14,6 @@ import { EncryptDecrypt, EncryptedData, EncryptionParams, - log, Secret, SecureStore, SecureVersion, @@ -22,6 +21,8 @@ import { import { Brand, ErrorCode, ErrorWithCode } from '@paradoxical-io/types'; import Joi from 'joi'; +import { Logger, Monitoring, noOpMonitoring } from '../monitoring'; + export type DEK = Brand; /** @@ -61,24 +62,29 @@ export class S3SecureStore implements SecureStore { private readonly kms: KMSClient; + private readonly logger: Logger; + constructor({ kms = new KMSClient(), kmsKeyID, s3 = new S3Client(), s3Bucket, crypto = new EncryptDecrypt(), + monitoring = noOpMonitoring(), }: { kms?: KMSClient; kmsKeyID: string; s3?: S3Client; s3Bucket: string; crypto?: EncryptDecrypt; + monitoring?: Monitoring; }) { this.kms = kms; this.kmsKeyID = kmsKeyID; this.s3 = s3; this.s3Bucket = s3Bucket; this.crypto = crypto; + this.logger = monitoring.logger; } async set(key: string, data: Buffer): Promise { @@ -121,7 +127,7 @@ export class S3SecureStore implements SecureStore { try { await this.s3.send(putObjectCommand); } catch (e) { - log.error(`Failed to write ${this.s3Bucket}/${key}`, e); + this.logger.error(`Failed to write ${this.s3Bucket}/${key}`, e); throw e; } @@ -143,7 +149,7 @@ export class S3SecureStore implements SecureStore { return false; } - log.error(`Failed to get Head object on ${this.s3Bucket}/${key}`, e); + this.logger.error(`Failed to get Head object on ${this.s3Bucket}/${key}`, e); throw e; } @@ -160,7 +166,7 @@ export class S3SecureStore implements SecureStore { } catch (e) { // DeleteObjectCommand will still be successful if it attempts to delete // a key that doesn't exist - log.error(`Failed to remove object on ${this.s3Bucket}/${key}`, e); + this.logger.error(`Failed to remove object on ${this.s3Bucket}/${key}`, e); throw e; } @@ -182,7 +188,7 @@ export class S3SecureStore implements SecureStore { return undefined; } - log.error(`Failed to get object ${this.s3Bucket}/${key}`, e); + this.logger.error(`Failed to get object ${this.s3Bucket}/${key}`, e); throw e; } diff --git a/packages/common-aws/src/sns/sns.ts b/packages/common-aws/src/sns/sns.ts index 10f3f37..2a3c939 100644 --- a/packages/common-aws/src/sns/sns.ts +++ b/packages/common-aws/src/sns/sns.ts @@ -1,12 +1,30 @@ import { PublishCommand, PublishCommandOutput, SNSClient } from '@aws-sdk/client-sns'; -import { log, timed } from '@paradoxical-io/common-server'; +import { timed } from '@paradoxical-io/common'; + +import { Logger, Metrics, Monitoring, noOpMonitoring } from '../monitoring'; export class SNSManager { static newSNSClient() { return new SNSClient(); } - constructor(private sns: SNSClient = new SNSClient()) {} + private readonly logger: Logger; + + readonly metrics: Metrics; + + constructor({ + sns = new SNSClient(), + monitoring = noOpMonitoring(), + }: { + sns?: SNSClient; + monitoring?: Monitoring; + } = {}) { + this.sns = sns; + this.logger = monitoring.logger; + this.metrics = monitoring.metrics; + } + + private readonly sns: SNSClient; /** * Sends an SMS message @@ -21,7 +39,7 @@ export class SNSManager { message: string, opts: { mode: 'Transactional' | 'Promotional' } = { mode: 'Promotional' } ): Promise { - log.with({ phoneNumber }).info(`Sending SNS message to number: '${message}'`); + this.logger.with({ phoneNumber }).info(`Sending SNS message to number: '${message}'`); const command = new PublishCommand({ Message: message, diff --git a/packages/common-aws/src/sqs/consumer.ts b/packages/common-aws/src/sqs/consumer.ts index cbf7216..5afa6fb 100644 --- a/packages/common-aws/src/sqs/consumer.ts +++ b/packages/common-aws/src/sqs/consumer.ts @@ -8,10 +8,11 @@ import { SQSClient, } from '@aws-sdk/client-sqs'; import { defaultTimeProvider, sleep, TimeProvider } from '@paradoxical-io/common'; -import { currentEnvironment, isLocal, log, Metrics, signals, withNewTrace } from '@paradoxical-io/common-server'; +import { currentEnvironment, isLocal, signals, withNewTrace } from '@paradoxical-io/common-server'; import { bottom, Brand, EpochMS, Milliseconds, notNullOrUndefined, Seconds } from '@paradoxical-io/types'; import { PartitionedKeyValueTable } from '../dynamo'; +import { Logger, Metrics, Monitoring, noOpMonitoring } from '../monitoring'; import { SQSConfig } from './config'; import { DevProxyProvider, ProxyQueueProvider } from './proxy/proxyProvider'; import { getInvisibilityDelay, SQSEvent } from './publisher'; @@ -52,6 +53,8 @@ export interface Options { maxVisibilityTimeoutSeconds?: Seconds; proxyProvider?: ProxyQueueProvider; + + monitoring?: Monitoring; } interface StopParams { @@ -102,13 +105,18 @@ export interface RepublishMessage { * * The returning promise will not resolve until the consumers are all gracefully stopped * @param consumers + * @param options */ -export async function runSQS(consumers: Array>): Promise { +export async function runSQS( + consumers: Array>, + options?: { monitoring?: Monitoring } +): Promise { + const logger = options?.monitoring?.logger ?? noOpMonitoring().logger; const consumerPromises = consumers.map(c => c.start()); // tell the consumer to stop on shutdown signals.onShutdown(async () => { - log.info('Stopping consumers'); + logger.info('Stopping consumers'); consumers.forEach(consumer => consumer.stop()); @@ -116,12 +124,12 @@ export async function runSQS(consumers: Array>): Promise { } export abstract class SQSConsumer implements MessageProcessor { - static defaultOptions: Options = { + static defaultOptions: Omit = { longPollWaitTimeSeconds: 20 as Seconds, maxNumberOfMessages: 10, sqs: new SQSClient(), @@ -153,11 +161,19 @@ export abstract class SQSConsumer implements MessageProcessor { private readonly timeProvider: TimeProvider; + private readonly logger: Logger; + + private readonly metrics: Metrics; + constructor(private queueUrl: QueueUrl, opts?: Partial) { this.opts = { ...SQSConsumer.defaultOptions, ...opts }; this.sqs = this.opts.sqs; this.queueName = queueUrl.split('/').reverse()[0] as QueueName; this.timeProvider = this.opts.timeProvider; + + const monitoring = this.opts.monitoring ?? noOpMonitoring(); + this.logger = monitoring.logger; + this.metrics = monitoring.metrics; } /** @@ -185,7 +201,7 @@ export abstract class SQSConsumer implements MessageProcessor { * Tells the consumer to stop processing. Will first finish processing */ stop({ timeoutMilli, flush }: { timeoutMilli?: number; flush?: boolean } = {}): void { - log.info(`Stopping consumer on queue ${this.queueUrl}`); + this.logger.info(`Stopping consumer on queue ${this.queueUrl}`); this.stopped = { flush, @@ -218,15 +234,15 @@ export abstract class SQSConsumer implements MessageProcessor { traceId = event.trace; if (!(event && event.data && event.timestamp)) { - log.error( + this.logger.error( `Received invalid event payload. Missing required SQSEvent fields. Dumping message: ${message.Body.toString()}` ); - Metrics.instance.increment('sqs.invalid_payload', tags); + this.metrics.increment('sqs.invalid_payload', tags); return; } // log how long the message was in the queue - Metrics.instance.timing('sqs.time_in_queue_ms', this.opts.timeProvider.epochMS() - event.timestamp, tags); + this.metrics.timing('sqs.time_in_queue_ms', this.opts.timeProvider.epochMS() - event.timestamp, tags); const processingStart = new Date(); @@ -240,11 +256,11 @@ export abstract class SQSConsumer implements MessageProcessor { shouldAck = await this.handMessageToConsumer(event, message); } catch (e) { // log the error to get access to the trace, but re-throw - log.error('Error processing message in consumer', e); + this.logger.error('Error processing message in consumer', e); throw e; } finally { - log.info('Done processing sqs message'); + this.logger.info('Done processing sqs message'); } }, traceId, @@ -252,11 +268,7 @@ export abstract class SQSConsumer implements MessageProcessor { ); // mark how long it took to process a message - Metrics.instance.timing( - 'sqs.processing_time_ms', - this.opts.timeProvider.epochMS() - processingStart.getTime(), - tags - ); + this.metrics.timing('sqs.processing_time_ms', this.opts.timeProvider.epochMS() - processingStart.getTime(), tags); if (shouldAck) { // ack the message from sqs @@ -265,12 +277,12 @@ export abstract class SQSConsumer implements MessageProcessor { } catch (err) { // resume logging with a trace if we have one, otherwise generate a new one so these log message are all paired together await withNewTrace(async () => { - log.error('Unhandled error processing message', err); + this.logger.error('Unhandled error processing message', err); - Metrics.instance.increment('sqs.processing_error'); + this.metrics.increment('sqs.processing_error'); if (this.opts.makeAvailableOnError && message.ReceiptHandle) { - log.debug('Making message immediately available'); + this.logger.debug('Making message immediately available'); const command = new ChangeMessageVisibilityCommand({ ReceiptHandle: message.ReceiptHandle, @@ -289,19 +301,19 @@ export abstract class SQSConsumer implements MessageProcessor { } private async receive(): Promise { - log.info(`Starting to receive messages on ${this.queueUrl}`); + this.logger.info(`Starting to receive messages on ${this.queueUrl}`); // eslint-disable-next-line no-constant-condition while (true) { if (this.stopped) { // hard stop if (!this.stopped.flush) { - log.info(`Hard stop consumer on queue ${this.queueUrl}`); + this.logger.info(`Hard stop consumer on queue ${this.queueUrl}`); return; } // timed out if (this.stopped.timeout && this.stopped.timeout.endTime >= new Date().getTime()) { - log.info(`Stop timeout of consumer on queue ${this.queueUrl}`); + this.logger.info(`Stop timeout of consumer on queue ${this.queueUrl}`); return; } @@ -332,12 +344,12 @@ export abstract class SQSConsumer implements MessageProcessor { // process all messages await Promise.all(result.Messages.map(x => this.handleMessage(x))); } catch (e) { - log.error( + this.logger.error( 'Error processing batch of messages. Should not happen since message handling should fail but just not ack!', e ); - Metrics.instance.increment('sqs.batch_failure', { queue: this.queueUrl }); + this.metrics.increment('sqs.batch_failure', { queue: this.queueUrl }); // retry in 1 second to prevent spamming on unknown failures await sleep(1000 as Milliseconds); @@ -362,7 +374,7 @@ export abstract class SQSConsumer implements MessageProcessor { // now is past the expiration event.republishContext?.maxPublishExpiration <= now ) { - log.error( + this.logger.error( `Republished message reached expiration, not acking anymore. Expiration ${event.republishContext?.maxPublishExpiration}` ); return false; @@ -379,7 +391,7 @@ export abstract class SQSConsumer implements MessageProcessor { if (notNullOrUndefined(result.expireFromFirstPublishMS)) { nextEvent.republishContext.maxPublishExpiration = (result.expireFromFirstPublishMS + now) as EpochMS; - log.info( + this.logger.info( `Republishing message and setting expiration to time out at ${nextEvent.republishContext.maxPublishExpiration}` ); } @@ -389,7 +401,7 @@ export abstract class SQSConsumer implements MessageProcessor { const messageBody = JSON.stringify(nextEvent); - log.info( + this.logger.info( `Requested to retry event later via republish. Making message visible in ~${JSON.stringify( result.retryInSeconds )} seconds. Reason: ${result.reason}` @@ -415,7 +427,7 @@ export abstract class SQSConsumer implements MessageProcessor { */ private async handMessageToConsumer(event: SQSEvent, message: Message): Promise { if (event.republishContext?.processAfter && this.timeProvider.epochMS() < event.republishContext.processAfter) { - log.info(`Message should be processed after ${event.republishContext?.processAfter}, not handling yet`); + this.logger.info(`Message should be processed after ${event.republishContext?.processAfter}, not handling yet`); return this.republishLater(event, { type: 'republish-later', @@ -437,14 +449,14 @@ export abstract class SQSConsumer implements MessageProcessor { ? `Current re-publish count: ${event.republishContext?.publishCount}` : ''; - log.info(`Starting processing sqs message. ${republishCountLog}`); + this.logger.info(`Starting processing sqs message. ${republishCountLog}`); const result = await this.processRaw(event); if (result && message.ReceiptHandle) { switch (result.type) { case 'retry-later': { - log.info( + this.logger.info( `Requested to retry event later. Making message visible in ${result.retryInSeconds} seconds. Reason: ${result.reason}` ); @@ -462,7 +474,7 @@ export abstract class SQSConsumer implements MessageProcessor { return this.republishLater(event, result); default: return bottom(result, never => { - log.warn(never); + this.logger.warn(never); // we don't know the type of the result, so give it to the consumer to handle return true; @@ -497,7 +509,7 @@ export abstract class SQSConsumer implements MessageProcessor { await this.sqs.send(command); - log.info(`Proxied ${messages.length} messages to ${queue}`); + this.logger.info(`Proxied ${messages.length} messages to ${queue}`); }) ); } @@ -552,16 +564,26 @@ export class FunctionalConsumerRaw extends SQSConsumer { } } -export function newConsumer(method: (event: T) => Promise, config: SQSConfig) { +export function newConsumer( + method: (event: T) => Promise, + config: SQSConfig, + monitoring?: Monitoring +) { return new FunctionalConsumer(method, config.queueUrl, { maxNumberOfMessages: config.maxNumberOfMessages, proxyProvider: currentEnvironment() === 'prod' ? undefined : new DevProxyProvider(new PartitionedKeyValueTable()), + monitoring, }); } -export function newRawConsumer(method: (event: SQSEvent) => Promise, config: SQSConfig) { +export function newRawConsumer( + method: (event: SQSEvent) => Promise, + config: SQSConfig, + monitoring?: Monitoring +) { return new FunctionalConsumerRaw(method, config.queueUrl, { maxNumberOfMessages: config.maxNumberOfMessages, proxyProvider: currentEnvironment() === 'prod' ? undefined : new DevProxyProvider(new PartitionedKeyValueTable()), + monitoring, }); } diff --git a/packages/common-hapi/package.json b/packages/common-hapi/package.json index c976bad..499b8dd 100644 --- a/packages/common-hapi/package.json +++ b/packages/common-hapi/package.json @@ -1,6 +1,6 @@ { "name": "@paradoxical-io/common-hapi", - "version": "2.8.0", + "version": "2.9.0", "description": "Common hapi code for paradoxical services", "files": [ "dist/**/*.js", diff --git a/packages/common-server/package.json b/packages/common-server/package.json index 668ef12..7776d50 100644 --- a/packages/common-server/package.json +++ b/packages/common-server/package.json @@ -1,6 +1,6 @@ { "name": "@paradoxical-io/common-server", - "version": "2.8.0", + "version": "2.9.0", "description": "Common code for paradox services", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -19,18 +19,17 @@ "author": "Anton Kropp", "license": "MIT", "devDependencies": { - "@types/archiver": "^5.3.1", + "@types/archiver": "^7.0.0", "@types/async-retry": "^1.4.2", "@types/cls-hooked": "^4.3.0", - "@types/convict": "4.2.1", + "@types/convict": "^6.1.6", "@types/dockerode": "^2.5.20", "@types/jest-when": "^2.7.0", - "@types/lru-cache": "^5.1.0", "@types/reflect-metadata": "^0.1.0", "@types/request-promise": "^4.1.44", "@types/seedrandom": "^2.4.28", "@types/temp": "^0.9.1", - "@types/unzipper": "^0.10.3", + "@types/unzipper": "^0.10.11", "@types/winston": "^2.4.4", "@types/wtfnode": "^0.7.0", "dockerode": "^3.0.2", @@ -41,26 +40,26 @@ "@paradoxical-io/common": "workspace:packages/common", "@paradoxical-io/types": "workspace:packages/types", "@types/ssh2-sftp-client": "^7.0.1", - "archiver": "^5.3.1", - "axios": "^0.19.2", + "archiver": "^7.0.1", + "axios": "^1.13.6", "chalk": "^4.1.2", "cls-hooked": "^4.2.2", - "convict": "5.1.0", - "csv": "^6.1.0", - "csv-parser": "^2.3.5", + "convict": "^6.2.4", + "csv": "^6.4.1", + "csv-parser": "^3.2.0", "csv-writer": "^1.6.0", - "date-fns-tz": "^2.0.0", - "hot-shots": "^6.4.1", - "lru-cache": "^6.0.0", - "mixpanel": "^0.11.0", - "request-promise": "^4.2.4", + "date-fns-tz": "^3.2.0", + "hot-shots": "^14.2.0", + "lru-cache": "^11.2.7", + "mixpanel": "^0.20.0", + "request-promise": "^4.2.6", "serialize-error": "^6.0.0", "spark-md5": "^3.0.2", - "ssh2-sftp-client": "^8.1.0", + "ssh2-sftp-client": "^12.1.0", "temp": "^0.9.4", - "tree-kill": "^1.2.1", - "unzipper": "^0.10.11", - "winston": "^3.2.1" + "tree-kill": "^1.2.2", + "unzipper": "^0.12.3", + "winston": "^3.19.0" }, "lint-staged": { "*.ts": [ diff --git a/packages/common-server/src/logger/log.ts b/packages/common-server/src/logger/log.ts index a071009..5511ad7 100644 --- a/packages/common-server/src/logger/log.ts +++ b/packages/common-server/src/logger/log.ts @@ -1,12 +1,11 @@ /* eslint-disable no-console */ -import { asMilli, pruneUndefined, SafeJson } from '@paradoxical-io/common'; +import { asMilli, PathRedaction, pruneUndefined, redact, redactKey, SafeJson } from '@paradoxical-io/common'; import { Brand, notNullOrUndefined } from '@paradoxical-io/types'; -import LRUCache from 'lru-cache'; +import { LRUCache } from 'lru-cache'; import { serializeError } from 'serialize-error'; import * as winston from 'winston'; import { LoggerOptions } from 'winston'; -import { PathRedaction, redact, redactKey } from '../../../common/src/utils/redaction'; import { isLocal } from '../env'; import { md5 } from '../hash'; import { isAxiosError } from '../http'; @@ -101,7 +100,7 @@ export class Logger { private readonly customMetricsTags: Tags; - private onceKeys = new LRUCache({ max: 15000, maxAge: asMilli(1, 'hours') }); + private onceKeys = new LRUCache({ max: 15000, ttl: asMilli(1, 'hours') }); constructor( ctx: Context = {}, @@ -258,7 +257,7 @@ export class Logger { } else { this.with({ once: true, onceKey: uniqueKey }).info(msg); - this.onceKeys.set(uniqueKey, undefined); + this.onceKeys.set(uniqueKey, true); } } diff --git a/packages/common-sql/package.json b/packages/common-sql/package.json index 816b51d..c5cfb1d 100644 --- a/packages/common-sql/package.json +++ b/packages/common-sql/package.json @@ -1,6 +1,6 @@ { "name": "@paradoxical-io/common-sql", - "version": "2.8.0", + "version": "2.9.0", "files": [ "dist/**/*.js", "dist/**/*.d.ts", diff --git a/packages/common-test/package.json b/packages/common-test/package.json index c2ef34f..7a06ddc 100644 --- a/packages/common-test/package.json +++ b/packages/common-test/package.json @@ -1,6 +1,6 @@ { "name": "@paradoxical-io/common-test", - "version": "2.8.0", + "version": "2.9.0", "description": "Common test-code for jest", "files": [ "dist/**/*.js", diff --git a/packages/common/package.json b/packages/common/package.json index 031c3a3..46c88ea 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -1,6 +1,6 @@ { "name": "@paradoxical-io/common", - "version": "2.8.0", + "version": "2.9.0", "description": "Common code for all paradox projects", "files": [ "dist/**/*.js", diff --git a/packages/types/package.json b/packages/types/package.json index eb85b02..93d7076 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@paradoxical-io/types", - "version": "2.8.0", + "version": "2.9.0", "description": "Paradox shared types", "files": [ "dist/**/*.js", diff --git a/yarn.lock b/yarn.lock index c15155a..86dfedb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1921,6 +1921,13 @@ __metadata: languageName: node linkType: hard +"@colors/colors@npm:1.6.0, @colors/colors@npm:^1.6.0": + version: 1.6.0 + resolution: "@colors/colors@npm:1.6.0" + checksum: aa209963e0c3218e80a4a20553ba8c0fbb6fa13140540b4e5f97923790be06801fc90172c1114fc8b7e888b3d012b67298cde6b9e81521361becfaee400c662f + languageName: node + linkType: hard + "@dabh/diagnostics@npm:^2.0.2": version: 2.0.3 resolution: "@dabh/diagnostics@npm:2.0.3" @@ -1932,6 +1939,17 @@ __metadata: languageName: node linkType: hard +"@dabh/diagnostics@npm:^2.0.8": + version: 2.0.8 + resolution: "@dabh/diagnostics@npm:2.0.8" + dependencies: + "@so-ric/colorspace": ^1.1.6 + enabled: 2.0.x + kuler: ^2.0.0 + checksum: 5f8a0394bb65b0df7316fe6272ecb351d5ad087f7febd2368c83917de03e7827d17132d8eddc4c602733f812a9cf6b9e204442816992d4241c9f1ec0337cea4a + languageName: node + linkType: hard + "@eslint-community/eslint-utils@npm:^4.2.0": version: 4.4.0 resolution: "@eslint-community/eslint-utils@npm:4.4.0" @@ -3215,44 +3233,43 @@ __metadata: dependencies: "@paradoxical-io/common": "workspace:packages/common" "@paradoxical-io/types": "workspace:packages/types" - "@types/archiver": ^5.3.1 + "@types/archiver": ^7.0.0 "@types/async-retry": ^1.4.2 "@types/cls-hooked": ^4.3.0 - "@types/convict": 4.2.1 + "@types/convict": ^6.1.6 "@types/dockerode": ^2.5.20 "@types/jest-when": ^2.7.0 - "@types/lru-cache": ^5.1.0 "@types/reflect-metadata": ^0.1.0 "@types/request-promise": ^4.1.44 "@types/seedrandom": ^2.4.28 "@types/ssh2-sftp-client": ^7.0.1 "@types/temp": ^0.9.1 - "@types/unzipper": ^0.10.3 + "@types/unzipper": ^0.10.11 "@types/winston": ^2.4.4 "@types/wtfnode": ^0.7.0 - archiver: ^5.3.1 - axios: ^0.19.2 + archiver: ^7.0.1 + axios: ^1.13.6 chalk: ^4.1.2 cls-hooked: ^4.2.2 - convict: 5.1.0 - csv: ^6.1.0 - csv-parser: ^2.3.5 + convict: ^6.2.4 + csv: ^6.4.1 + csv-parser: ^3.2.0 csv-writer: ^1.6.0 - date-fns-tz: ^2.0.0 + date-fns-tz: ^3.2.0 dockerode: ^3.0.2 - hot-shots: ^6.4.1 + hot-shots: ^14.2.0 jest-when: ^2.7.0 - lru-cache: ^6.0.0 - mixpanel: ^0.11.0 + lru-cache: ^11.2.7 + mixpanel: ^0.20.0 portfinder: ^1.0.25 - request-promise: ^4.2.4 + request-promise: ^4.2.6 serialize-error: ^6.0.0 spark-md5: ^3.0.2 - ssh2-sftp-client: ^8.1.0 + ssh2-sftp-client: ^12.1.0 temp: ^0.9.4 - tree-kill: ^1.2.1 - unzipper: ^0.10.11 - winston: ^3.2.1 + tree-kill: ^1.2.2 + unzipper: ^0.12.3 + winston: ^3.19.0 languageName: unknown linkType: soft @@ -4026,6 +4043,16 @@ __metadata: languageName: node linkType: hard +"@so-ric/colorspace@npm:^1.1.6": + version: 1.1.6 + resolution: "@so-ric/colorspace@npm:1.1.6" + dependencies: + color: ^5.0.2 + text-hex: 1.0.x + checksum: 893abfe47f2c23c71716c53bec6b3f700b11563d6993afb2eca1445b694cc0daf839353c0663a6139a1223289b73c629e5e9ccfcf54294b5eec1a6bc77f997de + languageName: node + linkType: hard + "@sqltools/formatter@npm:^1.2.5": version: 1.2.5 resolution: "@sqltools/formatter@npm:1.2.5" @@ -4047,12 +4074,12 @@ __metadata: languageName: node linkType: hard -"@types/archiver@npm:^5.3.1": - version: 5.3.2 - resolution: "@types/archiver@npm:5.3.2" +"@types/archiver@npm:^7.0.0": + version: 7.0.0 + resolution: "@types/archiver@npm:7.0.0" dependencies: "@types/readdir-glob": "*" - checksum: 9db5b4fdc1740fa07d08340ed827598cc6eda97406ac18a06a158670c7124d4120650a3b9cd660e9e39b42f033cf8f052566da32681e8ad91163473df88a3c4c + checksum: b97c6da6e9eee15a5f50419522863fd60fbb248d71cc0ef61ac84611c82b891d95376083a5dc06217a2cd7de143638267fffb3ce5883446df88fb78a0e36b7cc languageName: node linkType: hard @@ -4145,10 +4172,12 @@ __metadata: languageName: node linkType: hard -"@types/convict@npm:4.2.1": - version: 4.2.1 - resolution: "@types/convict@npm:4.2.1" - checksum: 92ce5ea03da157efa6ca5a80ed770b5f166f629d79ae4dbae47c8998a5ffc0add224c49f49d172fb085d12463c668f6e2f741915cc412bf91f3fa32b307a5729 +"@types/convict@npm:^6.1.6": + version: 6.1.6 + resolution: "@types/convict@npm:6.1.6" + dependencies: + "@types/node": "*" + checksum: 95abd7e68b0cdf399ebf6da3febc4860f87c4605562a7ff0efe423efc7a6ca36c5d24289c6f7f11569a81100eb4dffc52b900197beea6b4f1d6076b6710cc960 languageName: node linkType: hard @@ -4313,13 +4342,6 @@ __metadata: languageName: node linkType: hard -"@types/lru-cache@npm:^5.1.0": - version: 5.1.1 - resolution: "@types/lru-cache@npm:5.1.1" - checksum: e1d6c0085f61b16ec5b3073ec76ad1be4844ea036561c3f145fc19f71f084b58a6eb600b14128aa95809d057d28f1d147c910186ae51219f58366ffd2ff2e118 - languageName: node - linkType: hard - "@types/mime-db@npm:*": version: 1.43.1 resolution: "@types/mime-db@npm:1.43.1" @@ -4480,12 +4502,12 @@ __metadata: languageName: node linkType: hard -"@types/unzipper@npm:^0.10.3": - version: 0.10.6 - resolution: "@types/unzipper@npm:0.10.6" +"@types/unzipper@npm:^0.10.11": + version: 0.10.11 + resolution: "@types/unzipper@npm:0.10.11" dependencies: "@types/node": "*" - checksum: 192ec7127f6cfdff4b0ede8129b44220f95cef488faf48759c8a49a34d451301f300ff34164891c6ec43cfdb2df1637e418744549880db7c43fb4f0d4670a721 + checksum: c11c0e072556038730b218ccf8af849911ed8a1338e6db863bdf4c44d53d83dd23e3de4752322b1e19cf0205ed6eaf8746e25aa3c2b38e419da457f9d6be7b4e languageName: node linkType: hard @@ -4683,6 +4705,15 @@ __metadata: languageName: node linkType: hard +"abort-controller@npm:^3.0.0": + version: 3.0.0 + resolution: "abort-controller@npm:3.0.0" + dependencies: + event-target-shim: ^5.0.0 + checksum: 170bdba9b47b7e65906a28c8ce4f38a7a369d78e2271706f020849c1bfe0ee2067d4261df8bbb66eb84f79208fd5b710df759d64191db58cfba7ce8ef9c54b75 + languageName: node + linkType: hard + "acorn-jsx@npm:^5.3.1": version: 5.3.2 resolution: "acorn-jsx@npm:5.3.2" @@ -4710,12 +4741,10 @@ __metadata: languageName: node linkType: hard -"agent-base@npm:^4.3.0": - version: 4.3.0 - resolution: "agent-base@npm:4.3.0" - dependencies: - es6-promisify: ^5.0.0 - checksum: 0c10891060e579c67efafd6b62223666c4b4129b521eac3e9ad272a137545bcedb54ce352273b7ad21a0024060e4f1360ae9a465ac87e2af18883c937d39979f +"agent-base@npm:^7.1.2": + version: 7.1.4 + resolution: "agent-base@npm:7.1.4" + checksum: 86a7f542af277cfbd77dd61e7df8422f90bac512953709003a1c530171a9d019d072e2400eab2b59f84b49ab9dd237be44315ca663ac73e82b3922d10ea5eafa languageName: node linkType: hard @@ -4878,36 +4907,33 @@ __metadata: languageName: node linkType: hard -"archiver-utils@npm:^2.1.0": - version: 2.1.0 - resolution: "archiver-utils@npm:2.1.0" +"archiver-utils@npm:^5.0.0, archiver-utils@npm:^5.0.2": + version: 5.0.2 + resolution: "archiver-utils@npm:5.0.2" dependencies: - glob: ^7.1.4 + glob: ^10.0.0 graceful-fs: ^4.2.0 + is-stream: ^2.0.1 lazystream: ^1.0.0 - lodash.defaults: ^4.2.0 - lodash.difference: ^4.5.0 - lodash.flatten: ^4.4.0 - lodash.isplainobject: ^4.0.6 - lodash.union: ^4.6.0 + lodash: ^4.17.15 normalize-path: ^3.0.0 - readable-stream: ^2.0.0 - checksum: 5665f40bde87ee82cb638177bdccca8cc6e55edea1b94338f7e6b56a1d9367b0d9a39e42b47866eaf84b8c67669a7d250900a226207ecc30fa163b52aae859a5 + readable-stream: ^4.0.0 + checksum: 7dc4f3001dc373bd0fa7671ebf08edf6f815cbc539c78b5478a2eaa67e52e3fc0e92f562cdef2ba016c4dcb5468d3d069eb89535c6844da4a5bb0baf08ad5720 languageName: node linkType: hard -"archiver@npm:^5.3.1": - version: 5.3.1 - resolution: "archiver@npm:5.3.1" +"archiver@npm:^7.0.1": + version: 7.0.1 + resolution: "archiver@npm:7.0.1" dependencies: - archiver-utils: ^2.1.0 - async: ^3.2.3 - buffer-crc32: ^0.2.1 - readable-stream: ^3.6.0 - readdir-glob: ^1.0.0 - tar-stream: ^2.2.0 - zip-stream: ^4.1.0 - checksum: 905b198ed04d26c951b80545d45c7f2e0432ef89977a93af8a762501d659886e39dda0fbffb0d517ff3fa450a3d09a29146e4273c2170624e1988f889fb5302c + archiver-utils: ^5.0.2 + async: ^3.2.4 + buffer-crc32: ^1.0.0 + readable-stream: ^4.0.0 + readdir-glob: ^1.1.2 + tar-stream: ^3.0.0 + zip-stream: ^6.0.1 + checksum: f93bcc00f919e0bbb6bf38fddf111d6e4d1ed34721b73cc073edd37278303a7a9f67aa4abd6fd2beb80f6c88af77f2eb4f60276343f67605e3aea404e5ad93ea languageName: node linkType: hard @@ -5114,6 +5140,13 @@ __metadata: languageName: node linkType: hard +"async@npm:^3.2.4": + version: 3.2.6 + resolution: "async@npm:3.2.6" + checksum: ee6eb8cd8a0ab1b58bd2a3ed6c415e93e773573a91d31df9d5ef559baafa9dab37d3b096fa7993e84585cac3697b2af6ddb9086f45d3ac8cae821bb2aab65682 + languageName: node + linkType: hard + "asynckit@npm:^0.4.0": version: 0.4.0 resolution: "asynckit@npm:0.4.0" @@ -5206,12 +5239,26 @@ __metadata: languageName: node linkType: hard -"axios@npm:^0.19.2": - version: 0.19.2 - resolution: "axios@npm:0.19.2" +"axios@npm:^1.13.6": + version: 1.13.6 + resolution: "axios@npm:1.13.6" dependencies: - follow-redirects: 1.5.10 - checksum: dcace11a0a25fdf9b3b97fc9d011d23dd9c67cc13d91778080482ddddbbfe731f7410a090b11aa0bbbdf83686c5911ccb4289fd3683b7488c1b0c4d3c882380c + follow-redirects: ^1.15.11 + form-data: ^4.0.5 + proxy-from-env: ^1.1.0 + checksum: 72e94640e34aa9b591a47a9cc1798a1e18f179e15e39276514dd73f6d910981bdb2117c649da858bd72fc34d91db4f84318f88c8d306e395cd4ef5d6f142ab70 + languageName: node + linkType: hard + +"b4a@npm:^1.6.4": + version: 1.8.0 + resolution: "b4a@npm:1.8.0" + peerDependencies: + react-native-b4a: "*" + peerDependenciesMeta: + react-native-b4a: + optional: true + checksum: 92a3addf120a69c26c8dfcda1537eb63e10e682fb44a7f2d78f3347fe12c61b4022152b5a7f16bd71872f34eda84c4b8ce441cbe02a07e9a7cd7c1a3cb0ecf07 languageName: node linkType: hard @@ -5305,6 +5352,79 @@ __metadata: languageName: node linkType: hard +"bare-events@npm:^2.5.4, bare-events@npm:^2.7.0": + version: 2.8.2 + resolution: "bare-events@npm:2.8.2" + peerDependencies: + bare-abort-controller: "*" + peerDependenciesMeta: + bare-abort-controller: + optional: true + checksum: 97e6fc825bc984363a1f695c9a962b1b9f0ea467baa95d7059565a0aa31f4b5fc0f5eb71c087456ae3a436f39fce14a6147a12dd63aac0ff1d20cc5ad64cd780 + languageName: node + linkType: hard + +"bare-fs@npm:^4.5.5": + version: 4.5.5 + resolution: "bare-fs@npm:4.5.5" + dependencies: + bare-events: ^2.5.4 + bare-path: ^3.0.0 + bare-stream: ^2.6.4 + bare-url: ^2.2.2 + fast-fifo: ^1.3.2 + peerDependencies: + bare-buffer: "*" + peerDependenciesMeta: + bare-buffer: + optional: true + checksum: f4c9cc7cd6b21d7c69c59d0f325e6cdd37ed2c505ef68db77c2ebced10b71a0a37cd89c2301d36b43692ea7b3fcaa025224f04ac7579e07c133e92ec545c2bd4 + languageName: node + linkType: hard + +"bare-os@npm:^3.0.1": + version: 3.8.0 + resolution: "bare-os@npm:3.8.0" + checksum: 2ef48ea27d6af5f2c463f307721a38904d07d443449589b426d31b793e9b7680b75788df1318b9130abc9de035557e09640a47861876ea1f9786e455e5937e35 + languageName: node + linkType: hard + +"bare-path@npm:^3.0.0": + version: 3.0.0 + resolution: "bare-path@npm:3.0.0" + dependencies: + bare-os: ^3.0.1 + checksum: 51d559515f332f62cf9c37c38f2640c1b84b5e8c9de454b70baf029f806058cf94c51d6a0dfec0025cc7760f2069dc3e16c82f0d24f4a9ddb18c829bf9c0206d + languageName: node + linkType: hard + +"bare-stream@npm:^2.6.4": + version: 2.8.1 + resolution: "bare-stream@npm:2.8.1" + dependencies: + streamx: ^2.21.0 + teex: ^1.0.1 + peerDependencies: + bare-buffer: "*" + bare-events: "*" + peerDependenciesMeta: + bare-buffer: + optional: true + bare-events: + optional: true + checksum: bdf4c6905a04313de3a0aa986326ecca3e77c134f917122c43ecd6c4aaaccc64cb30f9b9efd8e59413d5f0d7f0857bd3b8f6a421f9f029f8069f8c73c54e3232 + languageName: node + linkType: hard + +"bare-url@npm:^2.2.2": + version: 2.3.2 + resolution: "bare-url@npm:2.3.2" + dependencies: + bare-path: ^3.0.0 + checksum: 7b2a6335a55a010ffcc863f62cc5bfaa216b383bc05a8e7fb30caccb5600e09d403ad482fc671582eba531bbca4a891dba8eefa866f2e2d222b0a72f2460c340 + languageName: node + linkType: hard + "base64-js@npm:^1.0.2, base64-js@npm:^1.3.1": version: 1.5.1 resolution: "base64-js@npm:1.5.1" @@ -5336,13 +5456,6 @@ __metadata: languageName: node linkType: hard -"big-integer@npm:^1.6.17": - version: 1.6.51 - resolution: "big-integer@npm:1.6.51" - checksum: 3d444173d1b2e20747e2c175568bedeebd8315b0637ea95d75fd27830d3b8e8ba36c6af40374f36bdaea7b5de376dcada1b07587cb2a79a928fccdb6e6e3c518 - languageName: node - linkType: hard - "bignumber.js@npm:^9.0.1": version: 9.1.1 resolution: "bignumber.js@npm:9.1.1" @@ -5350,16 +5463,6 @@ __metadata: languageName: node linkType: hard -"binary@npm:~0.3.0": - version: 0.3.0 - resolution: "binary@npm:0.3.0" - dependencies: - buffers: ~0.1.1 - chainsaw: ~0.1.0 - checksum: b4699fda9e2c2981e74a46b0115cf0d472eda9b68c0e9d229ef494e92f29ce81acf0a834415094cffcc340dfee7c4ef8ce5d048c65c18067a7ed850323f777af - languageName: node - linkType: hard - "bindings@npm:^1.5.0": version: 1.5.0 resolution: "bindings@npm:1.5.0" @@ -5380,20 +5483,13 @@ __metadata: languageName: node linkType: hard -"bluebird@npm:^3.5.0": +"bluebird@npm:^3.5.0, bluebird@npm:~3.7.2": version: 3.7.2 resolution: "bluebird@npm:3.7.2" checksum: 869417503c722e7dc54ca46715f70e15f4d9c602a423a02c825570862d12935be59ed9c7ba34a9b31f186c017c23cac6b54e35446f8353059c101da73eac22ef languageName: node linkType: hard -"bluebird@npm:~3.4.1": - version: 3.4.7 - resolution: "bluebird@npm:3.4.7" - checksum: bffa9dee7d3a41ab15c4f3f24687b49959b4e64e55c058a062176feb8ccefc2163414fb4e1a0f3053bf187600936509660c3ebd168fd9f0e48c7eba23b019466 - languageName: node - linkType: hard - "bottleneck@npm:^2.19.5": version: 2.19.5 resolution: "bottleneck@npm:2.19.5" @@ -5509,10 +5605,10 @@ __metadata: languageName: node linkType: hard -"buffer-crc32@npm:^0.2.1, buffer-crc32@npm:^0.2.13": - version: 0.2.13 - resolution: "buffer-crc32@npm:0.2.13" - checksum: 06252347ae6daca3453b94e4b2f1d3754a3b146a111d81c68924c22d91889a40623264e95e67955b1cb4a68cbedf317abeabb5140a9766ed248973096db5ce1c +"buffer-crc32@npm:^1.0.0": + version: 1.0.0 + resolution: "buffer-crc32@npm:1.0.0" + checksum: bc114c0e02fe621249e0b5093c70e6f12d4c2b1d8ddaf3b1b7bbe3333466700100e6b1ebdc12c050d0db845bc582c4fce8c293da487cc483f97eea027c480b23 languageName: node linkType: hard @@ -5523,13 +5619,6 @@ __metadata: languageName: node linkType: hard -"buffer-indexof-polyfill@npm:~1.0.0": - version: 1.0.2 - resolution: "buffer-indexof-polyfill@npm:1.0.2" - checksum: fbfb2d69c6bb2df235683126f9dc140150c08ac3630da149913a9971947b667df816a913b6993bc48f4d611999cb99a1589914d34c02dccd2234afda5cb75bbc - languageName: node - linkType: hard - "buffer@npm:4.9.2": version: 4.9.2 resolution: "buffer@npm:4.9.2" @@ -5561,13 +5650,6 @@ __metadata: languageName: node linkType: hard -"buffers@npm:~0.1.1": - version: 0.1.1 - resolution: "buffers@npm:0.1.1" - checksum: ad6f8e483efab39cefd92bdc04edbff6805e4211b002f4d1cfb70c6c472a61cc89fb18c37bcdfdd4ee416ca096e9ff606286698a7d41a18b539bac12fd76d4d5 - languageName: node - linkType: hard - "buildcheck@npm:~0.0.6": version: 0.0.6 resolution: "buildcheck@npm:0.0.6" @@ -5727,7 +5809,7 @@ __metadata: languageName: node linkType: hard -"camelcase@npm:^5.0.0, camelcase@npm:^5.3.1": +"camelcase@npm:^5.3.1": version: 5.3.1 resolution: "camelcase@npm:5.3.1" checksum: e6effce26b9404e3c0f301498184f243811c30dfe6d0b9051863bd8e4034d09c8c2923794f280d6827e5aa055f6c434115ff97864a16a963366fb35fd673024b @@ -5755,15 +5837,6 @@ __metadata: languageName: node linkType: hard -"chainsaw@npm:~0.1.0": - version: 0.1.0 - resolution: "chainsaw@npm:0.1.0" - dependencies: - traverse: ">=0.3.0 <0.4" - checksum: 22a96b9fb0cd9fb20813607c0869e61817d1acc81b5d455cc6456b5e460ea1dd52630e0f76b291cf8294bfb6c1fc42e299afb52104af9096242699d6d3aa6d3e - languageName: node - linkType: hard - "chalk@npm:5.2.0": version: 5.2.0 resolution: "chalk@npm:5.2.0" @@ -5969,6 +6042,15 @@ __metadata: languageName: node linkType: hard +"color-convert@npm:^3.1.3": + version: 3.1.3 + resolution: "color-convert@npm:3.1.3" + dependencies: + color-name: ^2.0.0 + checksum: 5133952b53c76dfb0f1d9d19b21efa1394cc9a9e0ae8556c6ac366bfe8dd806ddd88448eb23a2dc6f671c85b29290ab547052c6e1c9cb165e14c38a933d327f3 + languageName: node + linkType: hard + "color-name@npm:1.1.3": version: 1.1.3 resolution: "color-name@npm:1.1.3" @@ -5983,6 +6065,13 @@ __metadata: languageName: node linkType: hard +"color-name@npm:^2.0.0": + version: 2.1.0 + resolution: "color-name@npm:2.1.0" + checksum: eb014f71d87408e318e95d3f554f188370d354ba8e0ffa4341d0fd19de391bfe2bc96e563d4f6614644d676bc24f475560dffee3fe310c2d6865d007410a9a2b + languageName: node + linkType: hard + "color-string@npm:^1.6.0": version: 1.9.1 resolution: "color-string@npm:1.9.1" @@ -5993,6 +6082,15 @@ __metadata: languageName: node linkType: hard +"color-string@npm:^2.1.3": + version: 2.1.4 + resolution: "color-string@npm:2.1.4" + dependencies: + color-name: ^2.0.0 + checksum: f9caa29d529c549febeec813fcc0ecb184ff3dee92cec78f1fd3dfe2c4168fc1b74442efc40e34d2d677470967f570234d11086c3b137d6f9958a8fe12587fde + languageName: node + linkType: hard + "color-support@npm:^1.1.2, color-support@npm:^1.1.3": version: 1.1.3 resolution: "color-support@npm:1.1.3" @@ -6012,6 +6110,16 @@ __metadata: languageName: node linkType: hard +"color@npm:^5.0.2": + version: 5.0.3 + resolution: "color@npm:5.0.3" + dependencies: + color-convert: ^3.1.3 + color-string: ^2.1.3 + checksum: 2ad337a520f8d702febc45912d7a27417268ea4c56bdbf8121cdb8dad7309e418a7c78f164d7cb59b68bd9e703b5a3bc046cff80051c30e7561f7e726ca207ac + languageName: node + linkType: hard + "colorette@npm:^2.0.19": version: 2.0.20 resolution: "colorette@npm:2.0.20" @@ -6029,7 +6137,7 @@ __metadata: languageName: node linkType: hard -"combined-stream@npm:^1.0.6": +"combined-stream@npm:^1.0.6, combined-stream@npm:^1.0.8": version: 1.0.8 resolution: "combined-stream@npm:1.0.8" dependencies: @@ -6059,15 +6167,16 @@ __metadata: languageName: node linkType: hard -"compress-commons@npm:^4.1.0": - version: 4.1.1 - resolution: "compress-commons@npm:4.1.1" +"compress-commons@npm:^6.0.2": + version: 6.0.2 + resolution: "compress-commons@npm:6.0.2" dependencies: - buffer-crc32: ^0.2.13 - crc32-stream: ^4.0.2 + crc-32: ^1.2.0 + crc32-stream: ^6.0.0 + is-stream: ^2.0.1 normalize-path: ^3.0.0 - readable-stream: ^3.6.0 - checksum: 0176483211a7304a4a8aa52dbcc149a4c9181ac8a04bfbcc3d1a379174bf5fa56c3b15cec19e5ae3d31f1b1ce35ebb275b792b867000c77bac7162ce4e0ca268 + readable-stream: ^4.0.0 + checksum: 37d79a54f91344ecde352588e0a128f28ce619b085acd4f887defd76978a0640e3454a42c7dcadb0191bb3f971724ae4b1f9d6ef9620034aa0427382099ac946 languageName: node linkType: hard @@ -6118,16 +6227,13 @@ __metadata: languageName: node linkType: hard -"convict@npm:5.1.0": - version: 5.1.0 - resolution: "convict@npm:5.1.0" +"convict@npm:^6.2.4": + version: 6.2.4 + resolution: "convict@npm:6.2.4" dependencies: - json5: 2.1.0 - lodash.clonedeep: 4.5.0 - moment: 2.24.0 - validator: 10.11.0 - yargs-parser: 13.0.0 - checksum: 948af50a28841a3ede35f98da7405ca2ed15d795848626431964423ce8e9a4d3990fdef5980be0926db4d13d8f0d89decffa05e7093f6aef1d5f4cd3de53934b + lodash.clonedeep: ^4.5.0 + yargs-parser: ^20.2.7 + checksum: e14da5c359e3b0452d39c005429e5e4ab1192fa94e51824e135ca8e6b921e95dfd803c15993ea6d23837b6cecb5a402e981a5dd37bee52a62a7a0924798eefe0 languageName: node linkType: hard @@ -6145,6 +6251,17 @@ __metadata: languageName: node linkType: hard +"cpu-features@npm:~0.0.10": + version: 0.0.10 + resolution: "cpu-features@npm:0.0.10" + dependencies: + buildcheck: ~0.0.6 + nan: ^2.19.0 + node-gyp: latest + checksum: ab17e25cea0b642bdcfd163d3d872be4cc7d821e854d41048557799e990d672ee1cc7bd1d4e7c4de0309b1683d4c001d36ba8569b5035d1e7e2ff2d681f681d7 + languageName: node + linkType: hard + "cpu-features@npm:~0.0.7": version: 0.0.8 resolution: "cpu-features@npm:0.0.8" @@ -6165,13 +6282,13 @@ __metadata: languageName: node linkType: hard -"crc32-stream@npm:^4.0.2": - version: 4.0.2 - resolution: "crc32-stream@npm:4.0.2" +"crc32-stream@npm:^6.0.0": + version: 6.0.0 + resolution: "crc32-stream@npm:6.0.0" dependencies: crc-32: ^1.2.0 - readable-stream: ^3.4.0 - checksum: 1099559283b86e8a55390228b57ff4d57a74cac6aa8086aa4730f84317c9f93e914aeece115352f2d706a9df7ed75327ffacd86cfe23f040aef821231b528e76 + readable-stream: ^4.0.0 + checksum: e6edc2f81bc387daef6d18b2ac18c2ffcb01b554d3b5c7d8d29b177505aafffba574658fdd23922767e8dab1183d1962026c98c17e17fb272794c33293ef607c languageName: node linkType: hard @@ -6203,36 +6320,33 @@ __metadata: languageName: node linkType: hard -"csv-generate@npm:^4.2.6": - version: 4.2.6 - resolution: "csv-generate@npm:4.2.6" - checksum: dcf9319c03f2d4f0994f8b767ed2afda698b4ad82024fa8cc52e7f62261d6ef068b8cb9244cc67f54dc286e905639ca7b784add34ff1a0ea85f75cae8453ee5f +"csv-generate@npm:^4.5.0": + version: 4.5.0 + resolution: "csv-generate@npm:4.5.0" + checksum: 66c03e61cb112509293b69af101a24a45b87937fa0392b2c4119208e86d293158ad56a420c086f2ccbdf86902ac3e0aba8f7a8cc00569b31e07e27c06f597f99 languageName: node linkType: hard -"csv-parse@npm:^5.4.0": - version: 5.4.0 - resolution: "csv-parse@npm:5.4.0" - checksum: e9c2f23953f628849c476adeb9f500e9c03fcfe98fea7b732366e3c2ed0b07a5e67f32ca12a0132db6eb71601c080b4935b5921296db3625a597e24caa16f633 +"csv-parse@npm:^6.1.0": + version: 6.1.0 + resolution: "csv-parse@npm:6.1.0" + checksum: af1c24f8632ef8fa75259c6d452fe26b660555cd37ac255a26ad82f8b7ffc1a137258458d499e13a45d0d3cde3f9fce69e68e5deb1c73cbb7cf954d3e05111d3 languageName: node linkType: hard -"csv-parser@npm:^2.3.5": - version: 2.3.5 - resolution: "csv-parser@npm:2.3.5" - dependencies: - minimist: ^1.2.0 - through2: ^3.0.1 +"csv-parser@npm:^3.2.0": + version: 3.2.0 + resolution: "csv-parser@npm:3.2.0" bin: csv-parser: bin/csv-parser - checksum: cfef2d2af17c2482225320bb9ee4c016faf26a72a45392ef7de03715a639dc15636fd9ccea15555d319836076a5a2a87de871d7d9c97ebbc6cd6c70f7486f424 + checksum: 96b35d368ad495893ba047aa02e3116c879aa0f12309f18a5b4d597ab2887e900f08eaa112beb9fb735583b0fa356bc9f1eb74a3d5aced29c2a66c2c63c226a1 languageName: node linkType: hard -"csv-stringify@npm:^6.4.0": - version: 6.4.0 - resolution: "csv-stringify@npm:6.4.0" - checksum: 4d68c34a8f9ec52ec7b2da8a67c2c4b658431f4ba8f816a5e9b4664dc09ec37e5cf65a41dae13500488d38bd8b416b1dc179aad8275ba54e7b1735e21bbf2830 +"csv-stringify@npm:^6.6.0": + version: 6.6.0 + resolution: "csv-stringify@npm:6.6.0" + checksum: 2566a4213d7bfad92ad8d14ae2bb78f85130329f08ba5116f3f0caa225c4a142a7c7473d26f784206dc58b541e32fd3ea6dd12386b0866c5173d271e7906017a languageName: node linkType: hard @@ -6243,15 +6357,15 @@ __metadata: languageName: node linkType: hard -"csv@npm:^6.1.0": - version: 6.3.1 - resolution: "csv@npm:6.3.1" +"csv@npm:^6.4.1": + version: 6.4.1 + resolution: "csv@npm:6.4.1" dependencies: - csv-generate: ^4.2.6 - csv-parse: ^5.4.0 - csv-stringify: ^6.4.0 - stream-transform: ^3.2.6 - checksum: da1f7b10a7f387d3f49db06dde286b49c7136ac24684c1e528bcc8ef4080f29e353fdd19f624020f653805f91acbc30ed775642262424e7267455fe460cb2ba9 + csv-generate: ^4.5.0 + csv-parse: ^6.1.0 + csv-stringify: ^6.6.0 + stream-transform: ^3.4.0 + checksum: 5e37984a7ec4145a4e3f1d791571490cebb6eef93544401954a39f72ff83972202c2d3b2765e95ae8ade53b80230747aeb5d7602af21ded21d9fa732c437b2e6 languageName: node linkType: hard @@ -6278,15 +6392,6 @@ __metadata: languageName: node linkType: hard -"date-fns-tz@npm:^2.0.0": - version: 2.0.0 - resolution: "date-fns-tz@npm:2.0.0" - peerDependencies: - date-fns: ">=2.0.0" - checksum: a6553603a9d26dd9669326c99a58a2335ac550bc060c74b86a5ad9e1de73c9d4e3e5236f0f552f990e616e4e8dcc2b6a637913a04d2e04396e6a9f8ae83c73da - languageName: node - linkType: hard - "date-fns-tz@npm:^3.2.0": version: 3.2.0 resolution: "date-fns-tz@npm:3.2.0" @@ -6329,15 +6434,6 @@ __metadata: languageName: node linkType: hard -"debug@npm:=3.1.0": - version: 3.1.0 - resolution: "debug@npm:3.1.0" - dependencies: - ms: 2.0.0 - checksum: 0b52718ab957254a5b3ca07fc34543bc778f358620c206a08452251eb7fc193c3ea3505072acbf4350219c14e2d71ceb7bdaa0d3370aa630b50da790458d08b3 - languageName: node - linkType: hard - "debug@npm:^2.2.0, debug@npm:^2.3.3": version: 2.6.9 resolution: "debug@npm:2.6.9" @@ -6347,7 +6443,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:^3.1.0, debug@npm:^3.2.7": +"debug@npm:^3.2.7": version: 3.2.7 resolution: "debug@npm:3.2.7" dependencies: @@ -6368,7 +6464,7 @@ __metadata: languageName: node linkType: hard -"decamelize@npm:^1.1.2, decamelize@npm:^1.2.0": +"decamelize@npm:^1.1.2": version: 1.2.0 resolution: "decamelize@npm:1.2.0" checksum: ad8c51a7e7e0720c70ec2eeb1163b66da03e7616d7b98c9ef43cce2416395e84c1e9548dd94f5f6ffecfee9f8b94251fc57121a8b021f2ff2469b2bae247b8aa @@ -6831,6 +6927,18 @@ __metadata: languageName: node linkType: hard +"es-set-tostringtag@npm:^2.1.0": + version: 2.1.0 + resolution: "es-set-tostringtag@npm:2.1.0" + dependencies: + es-errors: ^1.3.0 + get-intrinsic: ^1.2.6 + has-tostringtag: ^1.0.2 + hasown: ^2.0.2 + checksum: 789f35de4be3dc8d11fdcb91bc26af4ae3e6d602caa93299a8c45cf05d36cc5081454ae2a6d3afa09cceca214b76c046e4f8151e092e6fc7feeb5efb9e794fc6 + languageName: node + linkType: hard + "es-shim-unscopables@npm:^1.0.0": version: 1.0.0 resolution: "es-shim-unscopables@npm:1.0.0" @@ -6851,22 +6959,6 @@ __metadata: languageName: node linkType: hard -"es6-promise@npm:^4.0.3": - version: 4.2.8 - resolution: "es6-promise@npm:4.2.8" - checksum: 95614a88873611cb9165a85d36afa7268af5c03a378b35ca7bda9508e1d4f1f6f19a788d4bc755b3fd37c8ebba40782018e02034564ff24c9d6fa37e959ad57d - languageName: node - linkType: hard - -"es6-promisify@npm:^5.0.0": - version: 5.0.0 - resolution: "es6-promisify@npm:5.0.0" - dependencies: - es6-promise: ^4.0.3 - checksum: fbed9d791598831413be84a5374eca8c24800ec71a16c1c528c43a98e2dadfb99331483d83ae6094ddb9b87e6f799a15d1553cebf756047e0865c753bc346b92 - languageName: node - linkType: hard - "escalade@npm:^3.1.1": version: 3.1.1 resolution: "escalade@npm:3.1.1" @@ -7204,6 +7296,22 @@ __metadata: languageName: node linkType: hard +"event-target-shim@npm:^5.0.0": + version: 5.0.1 + resolution: "event-target-shim@npm:5.0.1" + checksum: 1ffe3bb22a6d51bdeb6bf6f7cf97d2ff4a74b017ad12284cc9e6a279e727dc30a5de6bb613e5596ff4dc3e517841339ad09a7eec44266eccb1aa201a30448166 + languageName: node + linkType: hard + +"events-universal@npm:^1.0.0": + version: 1.0.1 + resolution: "events-universal@npm:1.0.1" + dependencies: + bare-events: ^2.7.0 + checksum: fb8451c98535bde30585004303a368d55c38e5bc3ed6aa9b5d29fecaabaf8ec276a33ff77dcc1d1c05eecf83b8161f184cabc9a03b76a06c10e9a4ce827a6abc + languageName: node + linkType: hard + "events@npm:1.1.1": version: 1.1.1 resolution: "events@npm:1.1.1" @@ -7211,6 +7319,13 @@ __metadata: languageName: node linkType: hard +"events@npm:^3.3.0": + version: 3.3.0 + resolution: "events@npm:3.3.0" + checksum: f6f487ad2198aa41d878fa31452f1a3c00958f46e9019286ff4787c84aac329332ab45c9cdc8c445928fc6d7ded294b9e005a7fce9426488518017831b272780 + languageName: node + linkType: hard + "execa@npm:^4.0.0": version: 4.1.0 resolution: "execa@npm:4.1.0" @@ -7389,6 +7504,13 @@ __metadata: languageName: node linkType: hard +"fast-fifo@npm:^1.2.0, fast-fifo@npm:^1.3.2": + version: 1.3.2 + resolution: "fast-fifo@npm:1.3.2" + checksum: 6bfcba3e4df5af7be3332703b69a7898a8ed7020837ec4395bb341bd96cc3a6d86c3f6071dd98da289618cf2234c70d84b2a6f09a33dd6f988b1ff60d8e54275 + languageName: node + linkType: hard + "fast-glob@npm:^3.2.9": version: 3.2.12 resolution: "fast-glob@npm:3.2.12" @@ -7542,12 +7664,13 @@ __metadata: languageName: node linkType: hard -"follow-redirects@npm:1.5.10": - version: 1.5.10 - resolution: "follow-redirects@npm:1.5.10" - dependencies: - debug: =3.1.0 - checksum: 0edc4b74e37e7b88ee716188a8f2a790238877c1d954f00c7b78d560f3bef40061c130536d13bee8e47b4e8e71edf1175a2de2729e51ab8206e4646b2370e484 +"follow-redirects@npm:^1.15.11": + version: 1.15.11 + resolution: "follow-redirects@npm:1.15.11" + peerDependenciesMeta: + debug: + optional: true + checksum: 20bf55e9504f59e6cc3743ba27edb2ebf41edea1baab34799408f2c050f73f0c612728db21c691276296d2795ea8a812dc532a98e8793619fcab91abe06d017f languageName: node linkType: hard @@ -7597,6 +7720,19 @@ __metadata: languageName: node linkType: hard +"form-data@npm:^4.0.5": + version: 4.0.5 + resolution: "form-data@npm:4.0.5" + dependencies: + asynckit: ^0.4.0 + combined-stream: ^1.0.8 + es-set-tostringtag: ^2.1.0 + hasown: ^2.0.2 + mime-types: ^2.1.12 + checksum: af8328413c16d0cded5fccc975a44d227c5120fd46a9e81de8acf619d43ed838414cc6d7792195b30b248f76a65246949a129a4dadd148721948f90cd6d4fb69 + languageName: node + linkType: hard + "fragment-cache@npm:^0.2.1": version: 0.2.1 resolution: "fragment-cache@npm:0.2.1" @@ -7613,6 +7749,17 @@ __metadata: languageName: node linkType: hard +"fs-extra@npm:^11.2.0": + version: 11.3.4 + resolution: "fs-extra@npm:11.3.4" + dependencies: + graceful-fs: ^4.2.0 + jsonfile: ^6.0.1 + universalify: ^2.0.0 + checksum: 3d1453db564b20ad58adf7c9583d0821546bd05e158865407fa2767af774ad8353418118655005f48c5bd0dbda19ea4bd053f8a5dcef2ce2e97580f7a039a221 + languageName: node + linkType: hard + "fs-minipass@npm:^2.0.0": version: 2.1.0 resolution: "fs-minipass@npm:2.1.0" @@ -7657,18 +7804,6 @@ __metadata: languageName: node linkType: hard -"fstream@npm:^1.0.12": - version: 1.0.12 - resolution: "fstream@npm:1.0.12" - dependencies: - graceful-fs: ^4.1.2 - inherits: ~2.0.0 - mkdirp: ">=0.5 0" - rimraf: 2 - checksum: e6998651aeb85fd0f0a8a68cec4d05a3ada685ecc4e3f56e0d063d0564a4fc39ad11a856f9020f926daf869fc67f7a90e891def5d48e4cadab875dc313094536 - languageName: node - linkType: hard - "function-bind@npm:^1.1.1": version: 1.1.1 resolution: "function-bind@npm:1.1.1" @@ -7784,7 +7919,7 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.3.0": +"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.3.0": version: 1.3.1 resolution: "get-intrinsic@npm:1.3.1" dependencies: @@ -7878,22 +8013,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^10.2.2": - version: 10.2.7 - resolution: "glob@npm:10.2.7" - dependencies: - foreground-child: ^3.1.0 - jackspeak: ^2.0.3 - minimatch: ^9.0.1 - minipass: ^5.0.0 || ^6.0.2 - path-scurry: ^1.7.0 - bin: - glob: dist/cjs/src/bin.js - checksum: 555205a74607d6f8d9874ba888924b305b5ea1abfaa2e9ccb11ac713d040aac7edbf7d8702a2f4a1cd81b2d7666412170ce7ef061d33cddde189dae8c1a1a054 - languageName: node - linkType: hard - -"glob@npm:^10.5.0": +"glob@npm:^10.0.0, glob@npm:^10.5.0": version: 10.5.0 resolution: "glob@npm:10.5.0" dependencies: @@ -7909,6 +8029,21 @@ __metadata: languageName: node linkType: hard +"glob@npm:^10.2.2": + version: 10.2.7 + resolution: "glob@npm:10.2.7" + dependencies: + foreground-child: ^3.1.0 + jackspeak: ^2.0.3 + minimatch: ^9.0.1 + minipass: ^5.0.0 || ^6.0.2 + path-scurry: ^1.7.0 + bin: + glob: dist/cjs/src/bin.js + checksum: 555205a74607d6f8d9874ba888924b305b5ea1abfaa2e9ccb11ac713d040aac7edbf7d8702a2f4a1cd81b2d7666412170ce7ef061d33cddde189dae8c1a1a054 + languageName: node + linkType: hard + "glob@npm:^6.0.1": version: 6.0.4 resolution: "glob@npm:6.0.4" @@ -8008,7 +8143,7 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.1.15, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.2, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": +"graceful-fs@npm:^4.1.15, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.2, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 @@ -8192,15 +8327,15 @@ __metadata: languageName: node linkType: hard -"hot-shots@npm:^6.4.1": - version: 6.8.7 - resolution: "hot-shots@npm:6.8.7" +"hot-shots@npm:^14.2.0": + version: 14.2.0 + resolution: "hot-shots@npm:14.2.0" dependencies: - unix-dgram: 2.0.x + unix-dgram: 2.x dependenciesMeta: unix-dgram: optional: true - checksum: 67d5b73362ac5fab6c9da133b7a9b8001379c4c501b3b579da895dc32b5aa0fee24e063cb037be53ea77c0020f8563123f7478abbfa24d9c03f3aa9c8aa722fe + checksum: 44dfc7a0f9f5f4b1e8fb6086da26b7d69f9d89d1d75d0098a72b7f877df0729c02725ffd27706d64f9d949bcb7b6a0680790035be87ef4221e53b83aff9bf9bc languageName: node linkType: hard @@ -8240,13 +8375,13 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:3.0.0": - version: 3.0.0 - resolution: "https-proxy-agent@npm:3.0.0" +"https-proxy-agent@npm:7.0.6": + version: 7.0.6 + resolution: "https-proxy-agent@npm:7.0.6" dependencies: - agent-base: ^4.3.0 - debug: ^3.1.0 - checksum: c5dd66017112f4baf0656dda7b018524b25d66c8d0f72a5e831815a1cb9f55a85458ee2e74269b5f20d9e08a98c18122bf3fdd263cc78290380314d6f7f169dd + agent-base: ^7.1.2 + debug: 4 + checksum: b882377a120aa0544846172e5db021fa8afbf83fea2a897d397bd2ddd8095ab268c24bc462f40a15f2a8c600bf4aa05ce52927f70038d4014e68aefecfa94e8d languageName: node linkType: hard @@ -8414,7 +8549,7 @@ __metadata: languageName: node linkType: hard -"inherits@npm:2, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.0, inherits@npm:~2.0.3": +"inherits@npm:2, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 @@ -8735,7 +8870,7 @@ __metadata: languageName: node linkType: hard -"is-stream@npm:^2.0.0": +"is-stream@npm:^2.0.0, is-stream@npm:^2.0.1": version: 2.0.1 resolution: "is-stream@npm:2.0.1" checksum: b8e05ccdf96ac330ea83c12450304d4a591f9958c11fd17bed240af8d5ffe08aedafa4c0f4cfccd4d28dc9d4d129daca1023633d5c11601a6cbc77521f6fae66 @@ -9589,6 +9724,13 @@ __metadata: languageName: node linkType: hard +"json-logic-js@npm:2.0.5": + version: 2.0.5 + resolution: "json-logic-js@npm:2.0.5" + checksum: 135740c9c706e34cbe54a4ab983d4b4cf26646a0e5332126437eb09fcb7169585ca28e80e09211d7d933b3aaf7c2d4447d5f0f2db39a58a655617ff15c119b93 + languageName: node + linkType: hard + "json-parse-even-better-errors@npm:^2.3.0": version: 2.3.1 resolution: "json-parse-even-better-errors@npm:2.3.1" @@ -9617,17 +9759,6 @@ __metadata: languageName: node linkType: hard -"json5@npm:2.1.0": - version: 2.1.0 - resolution: "json5@npm:2.1.0" - dependencies: - minimist: ^1.2.0 - bin: - json5: lib/cli.js - checksum: ecd42a1d79ac40ae5b236a3a4a14959b4372f9c5915810029c56865904c8cf6e8ae671ff0083a3c381057e35de79635ba719fc1683e0fb350f42baa88a3c64ba - languageName: node - linkType: hard - "json5@npm:^1.0.2": version: 1.0.2 resolution: "json5@npm:1.0.2" @@ -9648,6 +9779,19 @@ __metadata: languageName: node linkType: hard +"jsonfile@npm:^6.0.1": + version: 6.2.0 + resolution: "jsonfile@npm:6.2.0" + dependencies: + graceful-fs: ^4.1.6 + universalify: ^2.0.0 + dependenciesMeta: + graceful-fs: + optional: true + checksum: c3028ec5c770bb41290c9bb9ca04bdd0a1b698ddbdf6517c9453d3f90fc9e000c9675959fb46891d317690a93c62de03ff1735d8dbe02be83e51168ce85815d3 + languageName: node + linkType: hard + "kind-of@npm:^3.0.2, kind-of@npm:^3.0.3, kind-of@npm:^3.2.0": version: 3.2.2 resolution: "kind-of@npm:3.2.2" @@ -9757,13 +9901,6 @@ __metadata: languageName: node linkType: hard -"listenercount@npm:~1.0.1": - version: 1.0.1 - resolution: "listenercount@npm:1.0.1" - checksum: 0f1c9077cdaf2ebc16473c7d72eb7de6d983898ca42500f03da63c3914b6b312dd5f7a90d2657691ea25adf3fe0ac5a43226e8b2c673fd73415ed038041f4757 - languageName: node - linkType: hard - "listr2@npm:^5.0.7": version: 5.0.8 resolution: "listr2@npm:5.0.8" @@ -9807,41 +9944,13 @@ __metadata: languageName: node linkType: hard -"lodash.clonedeep@npm:4.5.0": +"lodash.clonedeep@npm:^4.5.0": version: 4.5.0 resolution: "lodash.clonedeep@npm:4.5.0" checksum: 92c46f094b064e876a23c97f57f81fbffd5d760bf2d8a1c61d85db6d1e488c66b0384c943abee4f6af7debf5ad4e4282e74ff83177c9e63d8ff081a4837c3489 languageName: node linkType: hard -"lodash.defaults@npm:^4.2.0": - version: 4.2.0 - resolution: "lodash.defaults@npm:4.2.0" - checksum: 84923258235592c8886e29de5491946ff8c2ae5c82a7ac5cddd2e3cb697e6fbdfbbb6efcca015795c86eec2bb953a5a2ee4016e3735a3f02720428a40efbb8f1 - languageName: node - linkType: hard - -"lodash.difference@npm:^4.5.0": - version: 4.5.0 - resolution: "lodash.difference@npm:4.5.0" - checksum: ecee276aa578f300e79350805a14a51be8d1f12b3c1389a19996d8ab516f814211a5f65c68331571ecdad96522b863ccc484b55504ce8c9947212a29f8857d5a - languageName: node - linkType: hard - -"lodash.flatten@npm:^4.4.0": - version: 4.4.0 - resolution: "lodash.flatten@npm:4.4.0" - checksum: 0ac34a393d4b795d4b7421153d27c13ae67e08786c9cbb60ff5b732210d46f833598eee3fb3844bb10070e8488efe390ea53bb567377e0cb47e9e630bf0811cb - languageName: node - linkType: hard - -"lodash.isplainobject@npm:^4.0.6": - version: 4.0.6 - resolution: "lodash.isplainobject@npm:4.0.6" - checksum: 29c6351f281e0d9a1d58f1a4c8f4400924b4c79f18dfc4613624d7d54784df07efaff97c1ff2659f3e085ecf4fff493300adc4837553104cef2634110b0d5337 - languageName: node - linkType: hard - "lodash.memoize@npm:^4.1.2": version: 4.1.2 resolution: "lodash.memoize@npm:4.1.2" @@ -9863,13 +9972,6 @@ __metadata: languageName: node linkType: hard -"lodash.union@npm:^4.6.0": - version: 4.6.0 - resolution: "lodash.union@npm:4.6.0" - checksum: 1514dc6508b2614ec071a6470f36eb7a70f69bf1abb6d55bdfdc21069635a4517783654b28504c0f025059a7598d37529766888e6d5902b8ab28b712228f7b2a - languageName: node - linkType: hard - "lodash@npm:^4.17.14, lodash@npm:^4.17.19, lodash@npm:^4.17.21": version: 4.17.21 resolution: "lodash@npm:4.17.21" @@ -9877,6 +9979,13 @@ __metadata: languageName: node linkType: hard +"lodash@npm:^4.17.15": + version: 4.17.23 + resolution: "lodash@npm:4.17.23" + checksum: 7daad39758a72872e94651630fbb54ba76868f904211089721a64516ce865506a759d9ad3d8ff22a2a49a50a09db5d27c36f22762d21766e47e3ba918d6d7bab + languageName: node + linkType: hard + "log-update@npm:^4.0.0": version: 4.0.0 resolution: "log-update@npm:4.0.0" @@ -9903,6 +10012,20 @@ __metadata: languageName: node linkType: hard +"logform@npm:^2.7.0": + version: 2.7.0 + resolution: "logform@npm:2.7.0" + dependencies: + "@colors/colors": 1.6.0 + "@types/triple-beam": ^1.3.2 + fecha: ^4.2.0 + ms: ^2.1.1 + safe-stable-stringify: ^2.3.1 + triple-beam: ^1.3.0 + checksum: a202d10897254735ead75a640f889998f9b91a0c36be9cac3f5471fa740d36bc2fbbcf9d113dcdadec4ddf09e257393ff800e6aab80019bdc7456363d6ea21f6 + languageName: node + linkType: hard + "long@npm:^5.3.2": version: 5.3.2 resolution: "long@npm:5.3.2" @@ -9927,6 +10050,13 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^11.2.7": + version: 11.2.7 + resolution: "lru-cache@npm:11.2.7" + checksum: c4aba67de4a8566622eb1e99cc5f43c1f91129c941af7624d4bbd48f312525d4bf4ce808a414d658a6bc336f0163daa1098d3a3e736989ad65d3231f587fbc30 + languageName: node + linkType: hard + "lru-cache@npm:^5.1.1": version: 5.1.1 resolution: "lru-cache@npm:5.1.1" @@ -10320,12 +10450,13 @@ __metadata: languageName: node linkType: hard -"mixpanel@npm:^0.11.0": - version: 0.11.0 - resolution: "mixpanel@npm:0.11.0" +"mixpanel@npm:^0.20.0": + version: 0.20.0 + resolution: "mixpanel@npm:0.20.0" dependencies: - https-proxy-agent: 3.0.0 - checksum: a88db7cadcc5bcd93df63faf6958870c150ac70e8e6525e5a7383f24d630fbe6f0bc22027602e9fda8fbe5400f5e38e6cee1c6e2879e0987a04ed48b4f9cbeab + https-proxy-agent: 7.0.6 + json-logic-js: 2.0.5 + checksum: eee1b7c6025d3567a9d0c3f6d40904b11e1ef0a7286683c51a74ca7618e6a896e37ddca243ff59acaa2f81745d5dcb34fd87df2a25f2f32cb2df4eb5d12bb547 languageName: node linkType: hard @@ -10336,7 +10467,7 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:>=0.5 0, mkdirp@npm:^0.5.1, mkdirp@npm:^0.5.6, mkdirp@npm:~0.5.1": +"mkdirp@npm:^0.5.1, mkdirp@npm:^0.5.6, mkdirp@npm:~0.5.1": version: 0.5.6 resolution: "mkdirp@npm:0.5.6" dependencies: @@ -10365,13 +10496,6 @@ __metadata: languageName: node linkType: hard -"moment@npm:2.24.0": - version: 2.24.0 - resolution: "moment@npm:2.24.0" - checksum: 9cd93a251a2b33cb1b532eade0e496a2a7547faa6cfe37a283ee7bf69e202cd7c8ab0673d66883b5b29aed051353176dc0e6684f04073a75b0a155c500be1580 - languageName: node - linkType: hard - "moment@npm:^2.19.3": version: 2.29.4 resolution: "moment@npm:2.29.4" @@ -10467,6 +10591,15 @@ __metadata: languageName: node linkType: hard +"nan@npm:^2.19.0, nan@npm:^2.20.0, nan@npm:^2.23.0": + version: 2.26.0 + resolution: "nan@npm:2.26.0" + dependencies: + node-gyp: latest + checksum: c36b45d5b32100e4daaab316aeada9f5de7ae9b85054ecb60bbe5384a96406145156d302db9b4985f308b5f4f01d9dfbd7fde990743380af074aee99f4ac9e26 + languageName: node + linkType: hard + "nanomatch@npm:^1.2.9": version: 1.2.13 resolution: "nanomatch@npm:1.2.13" @@ -11181,6 +11314,13 @@ __metadata: languageName: node linkType: hard +"process@npm:^0.11.10": + version: 0.11.10 + resolution: "process@npm:0.11.10" + checksum: bfcce49814f7d172a6e6a14d5fa3ac92cc3d0c3b9feb1279774708a719e19acd673995226351a082a9ae99978254e320ccda4240ddc474ba31a76c79491ca7c3 + languageName: node + linkType: hard + "progress@npm:^2.0.0": version: 2.0.3 resolution: "progress@npm:2.0.3" @@ -11215,6 +11355,13 @@ __metadata: languageName: node linkType: hard +"proxy-from-env@npm:^1.1.0": + version: 1.1.0 + resolution: "proxy-from-env@npm:1.1.0" + checksum: ed7fcc2ba0a33404958e34d95d18638249a68c430e30fcb6c478497d72739ba64ce9810a24f53a7d921d0c065e5b78e3822759800698167256b04659366ca4d4 + languageName: node + linkType: hard + "psl@npm:^1.1.28": version: 1.9.0 resolution: "psl@npm:1.9.0" @@ -11309,18 +11456,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:2 || 3, readable-stream@npm:^3.0.2, readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.5.0, readable-stream@npm:^3.6.0": - version: 3.6.2 - resolution: "readable-stream@npm:3.6.2" - dependencies: - inherits: ^2.0.3 - string_decoder: ^1.1.1 - util-deprecate: ^1.0.1 - checksum: bdcbe6c22e846b6af075e32cf8f4751c2576238c5043169a1c221c92ee2878458a816a4ea33f4c67623c0b6827c8a400409bfb3cf0bf3381392d0b1dfb52ac8d - languageName: node - linkType: hard - -"readable-stream@npm:^2.0.0, readable-stream@npm:^2.0.2, readable-stream@npm:^2.0.5, readable-stream@npm:~2.3.6": +"readable-stream@npm:^2.0.2, readable-stream@npm:^2.0.5": version: 2.3.8 resolution: "readable-stream@npm:2.3.8" dependencies: @@ -11335,7 +11471,31 @@ __metadata: languageName: node linkType: hard -"readdir-glob@npm:^1.0.0": +"readable-stream@npm:^3.0.2, readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.5.0, readable-stream@npm:^3.6.0, readable-stream@npm:^3.6.2": + version: 3.6.2 + resolution: "readable-stream@npm:3.6.2" + dependencies: + inherits: ^2.0.3 + string_decoder: ^1.1.1 + util-deprecate: ^1.0.1 + checksum: bdcbe6c22e846b6af075e32cf8f4751c2576238c5043169a1c221c92ee2878458a816a4ea33f4c67623c0b6827c8a400409bfb3cf0bf3381392d0b1dfb52ac8d + languageName: node + linkType: hard + +"readable-stream@npm:^4.0.0": + version: 4.7.0 + resolution: "readable-stream@npm:4.7.0" + dependencies: + abort-controller: ^3.0.0 + buffer: ^6.0.3 + events: ^3.3.0 + process: ^0.11.10 + string_decoder: ^1.3.0 + checksum: 03ec762faed8e149dc6452798b60394a8650861a1bb4bf936fa07b94044826bc25abe73696f5f45372abc404eec01876c560f64b479eba108b56397312dbe2ae + languageName: node + linkType: hard + +"readdir-glob@npm:^1.1.2": version: 1.1.3 resolution: "readdir-glob@npm:1.1.3" dependencies: @@ -11430,7 +11590,7 @@ __metadata: languageName: node linkType: hard -"request-promise@npm:^4.2.4": +"request-promise@npm:^4.2.6": version: 4.2.6 resolution: "request-promise@npm:4.2.6" dependencies: @@ -11599,17 +11759,6 @@ __metadata: languageName: node linkType: hard -"rimraf@npm:2": - version: 2.7.1 - resolution: "rimraf@npm:2.7.1" - dependencies: - glob: ^7.1.3 - bin: - rimraf: ./bin.js - checksum: cdc7f6eacb17927f2a075117a823e1c5951792c6498ebcce81ca8203454a811d4cf8900314154d3259bb8f0b42ab17f67396a8694a54cae3283326e57ad250cd - languageName: node - linkType: hard - "rimraf@npm:^3.0.2": version: 3.0.2 resolution: "rimraf@npm:3.0.2" @@ -11842,13 +11991,6 @@ __metadata: languageName: node linkType: hard -"setimmediate@npm:~1.0.4": - version: 1.0.5 - resolution: "setimmediate@npm:1.0.5" - checksum: c9a6f2c5b51a2dabdc0247db9c46460152ffc62ee139f3157440bd48e7c59425093f42719ac1d7931f054f153e2d26cf37dfeb8da17a794a58198a2705e527fd - languageName: node - linkType: hard - "sha.js@npm:^2.4.12": version: 2.4.12 resolution: "sha.js@npm:2.4.12" @@ -12198,18 +12340,17 @@ __metadata: languageName: node linkType: hard -"ssh2-sftp-client@npm:^8.1.0": - version: 8.1.0 - resolution: "ssh2-sftp-client@npm:8.1.0" +"ssh2-sftp-client@npm:^12.1.0": + version: 12.1.0 + resolution: "ssh2-sftp-client@npm:12.1.0" dependencies: concat-stream: ^2.0.0 - promise-retry: ^2.0.1 - ssh2: ^1.10.0 - checksum: 8ba1bdea4d92e40c13cbadc155dbc05b8fbb53092730272ecd637a4261656a7de7f53855ff2dfe189d798ff01bce571cf33e31498425a4c6db40bc36385af0dd + ssh2: ^1.16.0 + checksum: 7a414225dad3ccadcc97f64f2ff6da67ffb30516b92bdbfc88e3f02d9f0bd02a96b98d4f825ef481fbf7158e54f8e82d266e1b57d708ed9173ea14706b6f61bc languageName: node linkType: hard -"ssh2@npm:^1.10.0, ssh2@npm:^1.11.0": +"ssh2@npm:^1.11.0": version: 1.13.0 resolution: "ssh2@npm:1.13.0" dependencies: @@ -12226,6 +12367,23 @@ __metadata: languageName: node linkType: hard +"ssh2@npm:^1.16.0": + version: 1.17.0 + resolution: "ssh2@npm:1.17.0" + dependencies: + asn1: ^0.2.6 + bcrypt-pbkdf: ^1.0.2 + cpu-features: ~0.0.10 + nan: ^2.23.0 + dependenciesMeta: + cpu-features: + optional: true + nan: + optional: true + checksum: 1661b020e367e358603187a1efbb7628cb9b2f75543f60e354ede67be1216d331f2b99a73c57fb01a04be050a1e06fc97d04760d1396ea658ca816ddf80df9a9 + languageName: node + linkType: hard + "ssri@npm:^10.0.0": version: 10.0.4 resolution: "ssri@npm:10.0.4" @@ -12293,10 +12451,21 @@ __metadata: languageName: node linkType: hard -"stream-transform@npm:^3.2.6": - version: 3.2.6 - resolution: "stream-transform@npm:3.2.6" - checksum: 40c6c7d405a34cae2170506d02959316baf1769d3b1f13ac397a1af4c3819043bd599b8183bd7d3d46c4749d6ce6bb7ac0b687e2f23303cd7275993b232e00d6 +"stream-transform@npm:^3.4.0": + version: 3.4.0 + resolution: "stream-transform@npm:3.4.0" + checksum: 776078490b3b807134654f9200e79b41d3ee110644287d234edda8d024f51c74d5d9674a3f205f5b273c7e381e7b884309c0d5ad21477e8108cb6f9ba8f1b539 + languageName: node + linkType: hard + +"streamx@npm:^2.12.5, streamx@npm:^2.15.0, streamx@npm:^2.21.0": + version: 2.23.0 + resolution: "streamx@npm:2.23.0" + dependencies: + events-universal: ^1.0.0 + fast-fifo: ^1.3.2 + text-decoder: ^1.1.0 + checksum: d57de47db76ffd926842afab562fc8b139d7333269c6db11da5a233e8524cd326161b48bdddd28cefc010cec0b143af04dbb6f5e92d5034839ce7428928dfcae languageName: node linkType: hard @@ -12372,7 +12541,7 @@ __metadata: languageName: node linkType: hard -"string_decoder@npm:^1.1.1": +"string_decoder@npm:^1.1.1, string_decoder@npm:^1.3.0": version: 1.3.0 resolution: "string_decoder@npm:1.3.0" dependencies: @@ -12552,7 +12721,7 @@ __metadata: languageName: node linkType: hard -"tar-stream@npm:^2.0.0, tar-stream@npm:^2.2.0": +"tar-stream@npm:^2.0.0": version: 2.2.0 resolution: "tar-stream@npm:2.2.0" dependencies: @@ -12565,6 +12734,18 @@ __metadata: languageName: node linkType: hard +"tar-stream@npm:^3.0.0": + version: 3.1.8 + resolution: "tar-stream@npm:3.1.8" + dependencies: + b4a: ^1.6.4 + bare-fs: ^4.5.5 + fast-fifo: ^1.2.0 + streamx: ^2.15.0 + checksum: 2064263433bd2ab93cecc6048101f9a104fdc402d5e15571354fcbf93b8a91c72d94b11113d2292c8dc93e0f0a34c5b57ea39418fda61cb3aaa75a21f9faecfb + languageName: node + linkType: hard + "tar@npm:^6.0.2, tar@npm:^6.1.11, tar@npm:^6.1.2": version: 6.1.15 resolution: "tar@npm:6.1.15" @@ -12579,6 +12760,15 @@ __metadata: languageName: node linkType: hard +"teex@npm:^1.0.1": + version: 1.0.1 + resolution: "teex@npm:1.0.1" + dependencies: + streamx: ^2.12.5 + checksum: 36bf7ce8bb5eb428ad7b14b695ee7fb0a02f09c1a9d8181cc42531208543a920b299d711bf78dad4ff9bcf36ac437ae8e138053734746076e3e0e7d6d76eef64 + languageName: node + linkType: hard + "temp@npm:^0.9.4": version: 0.9.4 resolution: "temp@npm:0.9.4" @@ -12600,6 +12790,15 @@ __metadata: languageName: node linkType: hard +"text-decoder@npm:^1.1.0": + version: 1.2.7 + resolution: "text-decoder@npm:1.2.7" + dependencies: + b4a: ^1.6.4 + checksum: a544f8490806675986e9703cda2d0809d7bd010adf0cc19ac9975791912ea9e6998cd4696d7d7e9392c5648e660111a865c983e8adfeb29699fab471548f82a3 + languageName: node + linkType: hard + "text-hex@npm:1.0.x": version: 1.0.0 resolution: "text-hex@npm:1.0.0" @@ -12614,16 +12813,6 @@ __metadata: languageName: node linkType: hard -"through2@npm:^3.0.1": - version: 3.0.2 - resolution: "through2@npm:3.0.2" - dependencies: - inherits: ^2.0.4 - readable-stream: 2 || 3 - checksum: 47c9586c735e7d9cbbc1029f3ff422108212f7cc42e06d5cc9fff7901e659c948143c790e0d0d41b1b5f89f1d1200bdd200c7b72ad34f42f9edbeb32ea49e8b7 - languageName: node - linkType: hard - "through@npm:2, through@npm:^2.3.8": version: 2.3.8 resolution: "through@npm:2.3.8" @@ -12713,14 +12902,7 @@ __metadata: languageName: node linkType: hard -"traverse@npm:>=0.3.0 <0.4": - version: 0.3.9 - resolution: "traverse@npm:0.3.9" - checksum: 982982e4e249e9bbf063732a41fe5595939892758524bbef5d547c67cdf371b13af72b5434c6a61d88d4bb4351d6dabc6e22d832e0d16bc1bc684ef97a1cc59e - languageName: node - linkType: hard - -"tree-kill@npm:^1.2.1": +"tree-kill@npm:^1.2.2": version: 1.2.2 resolution: "tree-kill@npm:1.2.2" bin: @@ -13088,6 +13270,13 @@ __metadata: languageName: node linkType: hard +"universalify@npm:^2.0.0": + version: 2.0.1 + resolution: "universalify@npm:2.0.1" + checksum: ecd8469fe0db28e7de9e5289d32bd1b6ba8f7183db34f3bfc4ca53c49891c2d6aa05f3fb3936a81285a905cc509fb641a0c3fc131ec786167eff41236ae32e60 + languageName: node + linkType: hard + "unix-dgram@npm:2.0.x": version: 2.0.6 resolution: "unix-dgram@npm:2.0.6" @@ -13099,6 +13288,17 @@ __metadata: languageName: node linkType: hard +"unix-dgram@npm:2.x": + version: 2.0.7 + resolution: "unix-dgram@npm:2.0.7" + dependencies: + bindings: ^1.5.0 + nan: ^2.20.0 + node-gyp: latest + checksum: 2f6f8300191213aee8917b69b049717de76df34313c1c7a315baf7d75a6f58bbdf798622782ae2796368e120d4e4fffefc2c8e0381fef1448f05076abe2f6d9b + languageName: node + linkType: hard + "unset-value@npm:^1.0.0": version: 1.0.0 resolution: "unset-value@npm:1.0.0" @@ -13109,21 +13309,16 @@ __metadata: languageName: node linkType: hard -"unzipper@npm:^0.10.11": - version: 0.10.14 - resolution: "unzipper@npm:0.10.14" +"unzipper@npm:^0.12.3": + version: 0.12.3 + resolution: "unzipper@npm:0.12.3" dependencies: - big-integer: ^1.6.17 - binary: ~0.3.0 - bluebird: ~3.4.1 - buffer-indexof-polyfill: ~1.0.0 + bluebird: ~3.7.2 duplexer2: ~0.1.4 - fstream: ^1.0.12 + fs-extra: ^11.2.0 graceful-fs: ^4.2.2 - listenercount: ~1.0.1 - readable-stream: ~2.3.6 - setimmediate: ~1.0.4 - checksum: b46ae9a72e4b4c224be6a8f46447dd7cb3761a59450827e869747c4564a8f555f877fc19c7e3b5d146127a7dd3e2ffea186116682f6646e64479f99dd23565bc + node-int64: ^0.4.0 + checksum: 2e3296d1fad307b02b3d0f3e9c4ac1bdd56047e66fe5108a9e580b417f4ac9b07c31e9ded3e006e01edaaba3e20b13c638bd3c893600f75c589b6e0f778d9ffd languageName: node linkType: hard @@ -13288,13 +13483,6 @@ __metadata: languageName: node linkType: hard -"validator@npm:10.11.0": - version: 10.11.0 - resolution: "validator@npm:10.11.0" - checksum: b945e5712af888fc5c984312cf9a7736d16a03f989556291d7984e5747efaaee6cdff671f6b0ef2630a6e2866a2728ab0f341877b878a9ffb8ad770dfcad7170 - languageName: node - linkType: hard - "walker@npm:^1.0.8": version: 1.0.8 resolution: "walker@npm:1.0.8" @@ -13413,7 +13601,18 @@ __metadata: languageName: node linkType: hard -"winston@npm:*, winston@npm:^3.2.1": +"winston-transport@npm:^4.9.0": + version: 4.9.0 + resolution: "winston-transport@npm:4.9.0" + dependencies: + logform: ^2.7.0 + readable-stream: ^3.6.2 + triple-beam: ^1.3.0 + checksum: f5fd06a27def7597229925ba2b8b9ffa61b5b8748f994c8325064744e4e36dfea19868a16c16b3806f9b98bb7da67c25f08ae6fba3bdc6db4a9555673474a972 + languageName: node + linkType: hard + +"winston@npm:*": version: 3.9.0 resolution: "winston@npm:3.9.0" dependencies: @@ -13432,6 +13631,25 @@ __metadata: languageName: node linkType: hard +"winston@npm:^3.19.0": + version: 3.19.0 + resolution: "winston@npm:3.19.0" + dependencies: + "@colors/colors": ^1.6.0 + "@dabh/diagnostics": ^2.0.8 + async: ^3.2.3 + is-stream: ^2.0.0 + logform: ^2.7.0 + one-time: ^1.0.0 + readable-stream: ^3.4.0 + safe-stable-stringify: ^2.3.1 + stack-trace: 0.0.x + triple-beam: ^1.3.0 + winston-transport: ^4.9.0 + checksum: 7a02885dccd8041951cbd36b2b212b40fe709dc5c2a7747e2a6bb780d5d95915868a2c628166510774d0d34c421ba54da0ea665965a05261053c3fab805c33e6 + languageName: node + linkType: hard + "word-wrap@npm:^1.2.3": version: 1.2.3 resolution: "word-wrap@npm:1.2.3" @@ -13534,13 +13752,10 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:13.0.0": - version: 13.0.0 - resolution: "yargs-parser@npm:13.0.0" - dependencies: - camelcase: ^5.0.0 - decamelize: ^1.2.0 - checksum: 3de17cf1edab251b657583f587ef045111c08452181ab345bfd76f9be93813dbba6aeca461bd9fc16ae22d0e153104e6dec31715535d2a7b1b84c9c94b6ae3d8 +"yargs-parser@npm:^20.2.7": + version: 20.2.9 + resolution: "yargs-parser@npm:20.2.9" + checksum: 8bb69015f2b0ff9e17b2c8e6bfe224ab463dd00ca211eece72a4cd8a906224d2703fb8a326d36fdd0e68701e201b2a60ed7cf81ce0fd9b3799f9fe7745977ae3 languageName: node linkType: hard @@ -13573,13 +13788,13 @@ __metadata: languageName: node linkType: hard -"zip-stream@npm:^4.1.0": - version: 4.1.0 - resolution: "zip-stream@npm:4.1.0" +"zip-stream@npm:^6.0.1": + version: 6.0.1 + resolution: "zip-stream@npm:6.0.1" dependencies: - archiver-utils: ^2.1.0 - compress-commons: ^4.1.0 - readable-stream: ^3.6.0 - checksum: 4a73da856738b0634700b52f4ab3fe0bf0a532bea6820ad962d0bda0163d2d5525df4859f89a7238e204a378384e12551985049790c1894c3ac191866e85887f + archiver-utils: ^5.0.0 + compress-commons: ^6.0.2 + readable-stream: ^4.0.0 + checksum: aa5abd6a89590eadeba040afbc375f53337f12637e5e98330012a12d9886cde7a3ccc28bd91aafab50576035bbb1de39a9a316eecf2411c8b9009c9f94f0db27 languageName: node linkType: hard