diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 11a54f3a1..967b6c7c4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -25,6 +25,8 @@ jobs: test-content: runs-on: ubuntu-latest + env: + NODE_OPTIONS: "--max-old-space-size=8192" services: postgres: image: postgres @@ -55,6 +57,8 @@ jobs: test-lambdas: runs-on: ubuntu-latest + env: + NODE_OPTIONS: "--max-old-space-size=8192" steps: - uses: actions/checkout@v4 - name: Use Node.js 24.x diff --git a/content/package.json b/content/package.json index 981f56b59..3a03a7a95 100644 --- a/content/package.json +++ b/content/package.json @@ -27,7 +27,7 @@ "@dcl/content-validator": "^7.0.3", "@dcl/crypto": "^3.4.5", "@dcl/hashing": "^3.0.4", - "@dcl/job-component": "^0.2.7", + "@dcl/job-component": "^0.2.8", "@dcl/schemas": "^20.1.1", "@dcl/snapshots-fetcher": "^9.1.0", "@dcl/urn-resolver": "^3.6.0", @@ -64,7 +64,7 @@ "@types/faker": "5.5.9", "@types/jest": "27.4.1", "@types/lru-cache": "7.6.1", - "@types/node": "17.0.45", + "@types/node": "^24", "@types/pg": "^8", "@types/uuid": "^8", "@typescript-eslint/eslint-plugin": "5.33.0", @@ -76,19 +76,15 @@ "eslint-config-prettier": "8.5.0", "eslint-plugin-prettier": "4.2.1", "faker": "5.5.3", - "jest": "27.4.7", + "jest": "^30.2.0", "jest-extra-utils": "^0.1.0", - "jest-junit": "^13.0.0", "jest-leak-detector": "^29.3.1", "lint-staged": "13.0.3", - "nyc": "^15.1.0", "prettier": "2.7.1", "testcontainers": "8.9.0", - "ts-jest": "27.1.5", - "ts-mockito": "2.6.1", - "ts-node": "10.7.0", - "tsc": "2.0.4", - "typescript": "^4.7.4" + "ts-jest": "^29.4.6", + "ts-node": "^10.9.2", + "typescript": "^5.9.3" }, "resolutions": { "@well-known-components/http-server/path-to-regexp": "^6.2.1", diff --git a/content/src/Environment.ts b/content/src/Environment.ts index f2b4b455f..7be879536 100644 --- a/content/src/Environment.ts +++ b/content/src/Environment.ts @@ -18,22 +18,22 @@ export const DEFAULT_ETH_NETWORK = 'sepolia' export const DEFAULT_ENS_OWNER_PROVIDER_URL_TESTNET = 'https://api.studio.thegraph.com/query/49472/marketplace-sepolia/version/latest' const DEFAULT_ENS_OWNER_PROVIDER_URL_MAINNET = 'https://subgraph.decentraland.org/marketplace' -export const DEFAULT_LAND_MANAGER_SUBGRAPH_TESTNET = +const DEFAULT_LAND_MANAGER_SUBGRAPH_TESTNET = 'https://api.studio.thegraph.com/query/49472/land-manager-sepolia/version/latest' -export const DEFAULT_LAND_MANAGER_SUBGRAPH_MAINNET = 'https://subgraph.decentraland.org/land-manager' -export const DEFAULT_COLLECTIONS_SUBGRAPH_TESTNET = +const DEFAULT_LAND_MANAGER_SUBGRAPH_MAINNET = 'https://subgraph.decentraland.org/land-manager' +const DEFAULT_COLLECTIONS_SUBGRAPH_TESTNET = 'https://api.studio.thegraph.com/query/49472/collections-ethereum-sepolia/version/latest' -export const DEFAULT_COLLECTIONS_SUBGRAPH_MAINNET = 'https://subgraph.decentraland.org/collections-ethereum-mainnet' -export const DEFAULT_COLLECTIONS_SUBGRAPH_MATIC_MAINNET = 'https://subgraph.decentraland.org/collections-matic-mainnet' -export const DEFAULT_COLLECTIONS_SUBGRAPH_MATIC_AMOY = 'https://subgraph.decentraland.org/collections-matic-amoy' -export const DEFAULT_THIRD_PARTY_REGISTRY_SUBGRAPH_MATIC_AMOY = 'https://subgraph.decentraland.org/tpr-matic-amoy' -export const DEFAULT_THIRD_PARTY_REGISTRY_SUBGRAPH_MATIC_MAINNET = 'https://subgraph.decentraland.org/tpr-matic-mainnet' -export const DEFAULT_BLOCKS_SUBGRAPH_TESTNET = +const DEFAULT_COLLECTIONS_SUBGRAPH_MAINNET = 'https://subgraph.decentraland.org/collections-ethereum-mainnet' +const DEFAULT_COLLECTIONS_SUBGRAPH_MATIC_MAINNET = 'https://subgraph.decentraland.org/collections-matic-mainnet' +const DEFAULT_COLLECTIONS_SUBGRAPH_MATIC_AMOY = 'https://subgraph.decentraland.org/collections-matic-amoy' +const DEFAULT_THIRD_PARTY_REGISTRY_SUBGRAPH_MATIC_AMOY = 'https://subgraph.decentraland.org/tpr-matic-amoy' +const DEFAULT_THIRD_PARTY_REGISTRY_SUBGRAPH_MATIC_MAINNET = 'https://subgraph.decentraland.org/tpr-matic-mainnet' +const DEFAULT_BLOCKS_SUBGRAPH_TESTNET = 'https://api.studio.thegraph.com/query/49472/blocks-ethereum-sepolia/version/latest' -export const DEFAULT_BLOCKS_SUBGRAPH_MAINNET = 'https://subgraph.decentraland.org/blocks-ethereum-mainnet' -export const DEFAULT_BLOCKS_SUBGRAPH_MATIC_AMOY = +const DEFAULT_BLOCKS_SUBGRAPH_MAINNET = 'https://subgraph.decentraland.org/blocks-ethereum-mainnet' +const DEFAULT_BLOCKS_SUBGRAPH_MATIC_AMOY = 'https://api.studio.thegraph.com/query/49472/blocks-matic-amoy/version/latest' -export const DEFAULT_BLOCKS_SUBGRAPH_MATIC_MAINNET = 'https://subgraph.decentraland.org/blocks-matic-mainnet' +const DEFAULT_BLOCKS_SUBGRAPH_MATIC_MAINNET = 'https://subgraph.decentraland.org/blocks-matic-mainnet' export const CURRENT_COMMIT_HASH = process.env.COMMIT_HASH ?? 'Unknown' export const CURRENT_VERSION = process.env.CURRENT_VERSION ?? 'Unknown' diff --git a/content/src/logic/formatters.ts b/content/src/logic/formatters.ts index 0c1a99fd9..c9169f9fa 100644 --- a/content/src/logic/formatters.ts +++ b/content/src/logic/formatters.ts @@ -22,7 +22,7 @@ import * as utils from 'eth-connect' * * @param blockNumber - The given blocknumber */ -export function isPredefinedBlockNumber(blockNumber: utils.Quantity | utils.Tag): blockNumber is utils.Tag { +function isPredefinedBlockNumber(blockNumber: utils.Quantity | utils.Tag): blockNumber is utils.Tag { return blockNumber === 'latest' || blockNumber === 'pending' || blockNumber === 'earliest' } @@ -62,7 +62,7 @@ export function inputCallFormatter(options: utils.TransactionOptions) { return options } -export function inputAddressFormatter(address: string) { +function inputAddressFormatter(address: string) { if (utils.isStrictAddress(address)) { return address } else if (utils.isAddress(address)) { diff --git a/content/src/logic/time-range.ts b/content/src/logic/time-range.ts index ed07b3bd2..d7558dc5f 100644 --- a/content/src/logic/time-range.ts +++ b/content/src/logic/time-range.ts @@ -1,6 +1,6 @@ import { TimeRange } from '@dcl/snapshots-fetcher/dist/types' -export type TimeRangeDivision = { +type TimeRangeDivision = { intervals: TimeRange[] remainder: TimeRange } diff --git a/content/src/ports/activeEntities.ts b/content/src/ports/activeEntities.ts index c606366cf..8d4ae6930 100644 --- a/content/src/ports/activeEntities.ts +++ b/content/src/ports/activeEntities.ts @@ -14,13 +14,12 @@ import { IBaseComponent } from '@well-known-components/interfaces' import { parseUrn } from '@dcl/urn-resolver' export const BASE_AVATARS_COLLECTION_ID = 'urn:decentraland:off-chain:base-avatars' -export const BASE_EMOTES_COLLECTION_ID = 'urn:decentraland:off-chain:base-emotes' -export type NotActiveEntity = 'NOT_ACTIVE_ENTITY' +type NotActiveEntity = 'NOT_ACTIVE_ENTITY' -export const isEntityPresent = (result: Entity | NotActiveEntity | undefined): result is Entity => +const isEntityPresent = (result: Entity | NotActiveEntity | undefined): result is Entity => result !== undefined && result !== 'NOT_ACTIVE_ENTITY' -export const isPointingToEntity = (result: string | NotActiveEntity | undefined): result is string => +const isPointingToEntity = (result: string | NotActiveEntity | undefined): result is string => result !== undefined && result !== 'NOT_ACTIVE_ENTITY' export type ActiveEntities = IBaseComponent & { diff --git a/content/src/ports/denylist.ts b/content/src/ports/denylist.ts index 6a09821f3..075fa92ce 100644 --- a/content/src/ports/denylist.ts +++ b/content/src/ports/denylist.ts @@ -76,7 +76,7 @@ export async function createDenylist( logger.error(err) } } - let reloadTimer: NodeJS.Timer | undefined = undefined + let reloadTimer: ReturnType | undefined = undefined return { isDenylisted: (id: string): boolean => { const denied = deniedContentIdentifiers.has(id) diff --git a/content/src/ports/deployer.ts b/content/src/ports/deployer.ts index 6e2bb83e2..0f6e9c806 100644 --- a/content/src/ports/deployer.ts +++ b/content/src/ports/deployer.ts @@ -20,7 +20,7 @@ import { happenedBefore } from '../service/time/TimeSorting' import { AppComponents, EntityVersion } from '../types' import { DatabaseClient } from './postgres' -export function isIPFSHash(hash: string): boolean { +function isIPFSHash(hash: string): boolean { return IPFSv2.validate(hash) } diff --git a/content/src/ports/postgres.ts b/content/src/ports/postgres.ts index d5163e028..fe9fd8fe0 100644 --- a/content/src/ports/postgres.ts +++ b/content/src/ports/postgres.ts @@ -13,7 +13,10 @@ export type DatabaseTransactionalClient = DatabaseClient & { } export interface IDatabaseComponent extends IDatabase, IBaseComponent { - queryWithValues(sql: SQLStatement, durationQueryNameLabel?: string): Promise> + queryWithValues>( + sql: SQLStatement, + durationQueryNameLabel?: string + ): Promise> streamQuery( sql: SQLStatement, config?: { batchSize?: number }, @@ -92,14 +95,17 @@ export async function createDatabase( const queryClient = initializedClient ? initializedClient : pool return { - async query(sql: string): Promise> { + async query>(sql: string): Promise> { const rows = await queryClient.query(sql) return { rows: rows.rows as any[], rowCount: rows.rowCount } }, - async queryWithValues(sql: SQLStatement, durationQueryNameLabel?: string): Promise> { + async queryWithValues>( + sql: SQLStatement, + durationQueryNameLabel?: string + ): Promise> { const endTimer = startTimer(durationQueryNameLabel) try { const rows = await queryClient.query(sql) diff --git a/content/src/service/garbage-collection/GarbageCollectionManager.ts b/content/src/service/garbage-collection/GarbageCollectionManager.ts index 0508b26d9..3fd94ae9a 100644 --- a/content/src/service/garbage-collection/GarbageCollectionManager.ts +++ b/content/src/service/garbage-collection/GarbageCollectionManager.ts @@ -6,7 +6,7 @@ import SQL from 'sql-template-strings' const PROFILE_CLEANUP_LIMIT = 10000 -export type GCStaleProfilesResult = { +type GCStaleProfilesResult = { deletedHashes: Set deletedDeployments: Set } diff --git a/content/src/types.ts b/content/src/types.ts index 8c51fcf88..4def18536 100644 --- a/content/src/types.ts +++ b/content/src/types.ts @@ -135,7 +135,7 @@ export enum EntityVersion { export type CannonicalEntityDeployment = { entity: SyncDeployment; servers: string[] } -export type StatusProbeResult = { +type StatusProbeResult = { /** name is used as unique key for the status map */ name: string data: Record diff --git a/content/test/helpers/service/synchronization/MockedContentCluster.ts b/content/test/helpers/service/synchronization/MockedContentCluster.ts index 4df375fe4..9e7723ac4 100644 --- a/content/test/helpers/service/synchronization/MockedContentCluster.ts +++ b/content/test/helpers/service/synchronization/MockedContentCluster.ts @@ -1,10 +1,9 @@ -import { instance, mock, when } from 'ts-mockito' import { ContentCluster } from '../../../../src/service/synchronization/ContentCluster' export class MockedContentCluster { - static withAddress(ethAddress: string): ContentCluster { - const mockedCluster: ContentCluster = mock(ContentCluster) - when(mockedCluster.getIdentity()).thenResolve({ owner: ethAddress, address: '', id: '0' }) - return instance(mockedCluster) + static withAddress(ethAddress: string): jest.Mocked { + return { + getIdentity: jest.fn().mockResolvedValue({ owner: ethAddress, address: '', id: '0' }) + } as unknown as jest.Mocked } } diff --git a/content/test/integration/E2EAssertions.ts b/content/test/integration/E2EAssertions.ts index 04bffe98b..0048d7bc6 100644 --- a/content/test/integration/E2EAssertions.ts +++ b/content/test/integration/E2EAssertions.ts @@ -19,7 +19,8 @@ export async function assertEntitiesAreDeployedButNotActive(server: TestProgram, assert.equal( unexpectedEntities.length, 0, - `Expected not to find entity with id ${entity.id} when checking for pointer ${entity.pointers + `Expected not to find entity with id ${entity.id} when checking for pointer ${ + entity.pointers } on server '${server.getUrl()}.'` ) await assertEntityIsOnServer(server, entity) @@ -83,7 +84,8 @@ export async function assertDeploymentsAreReported(server: TestProgram, ...expec assert.equal( deployments.length, expectedDeployments.length, - `Expected to find ${expectedDeployments.length} deployments on server ${server.getUrl()}. Instead, found ${deployments.length + `Expected to find ${expectedDeployments.length} deployments on server ${server.getUrl()}. Instead, found ${ + deployments.length }.` ) diff --git a/content/test/integration/logic/snapshots.spec.ts b/content/test/integration/logic/snapshots.spec.ts index 5a4d8f768..d1679aac7 100644 --- a/content/test/integration/logic/snapshots.spec.ts +++ b/content/test/integration/logic/snapshots.spec.ts @@ -28,13 +28,13 @@ describe('snapshot generator - ', () => { const timeRange = timeRangeOfDaysFromInitialTimestamp(1) const snapshots = await generateSnapshotsInMultipleTimeRanges(components, timeRange) - expect(divideTimeSpy).toBeCalledWith(timeRange) + expect(divideTimeSpy).toHaveBeenCalledWith(timeRange) expect(snapshots).toEqual(expect.arrayContaining([expect.objectContaining(emptySnapshot)])) if (snapshots) { const exist = await components.storage.existMultiple(snapshots.map((s) => s.hash)) expect(Array.from(exist.values()).every((e) => e)).toBeTruthy() } - expect(clockSpy).toBeCalledTimes(1) + expect(clockSpy).toHaveBeenCalledTimes(1) }) testCaseWithComponents( @@ -49,7 +49,7 @@ describe('snapshot generator - ', () => { expect(snapshots).toEqual( expect.arrayContaining([expect.objectContaining(emptySnapshot), expect.objectContaining(emptySnapshot)]) ) - expect(clockSpy).toBeCalledTimes(2) + expect(clockSpy).toHaveBeenCalledTimes(2) } ) @@ -79,7 +79,7 @@ describe('snapshot generator - ', () => { ]) ) // It's called one time every time a snapshot is created - expect(clockSpy).toBeCalledTimes(7) + expect(clockSpy).toHaveBeenCalledTimes(7) } ) @@ -100,7 +100,7 @@ describe('snapshot generator - ', () => { // It's called one time every time a snapshot is created // 7 daily + (1 weekly + 1 daily) - expect(clockSpy).toBeCalledTimes(9) + expect(clockSpy).toHaveBeenCalledTimes(9) const weeklySnapshot = snapshots[0] expect(weeklySnapshot).toEqual({ @@ -131,7 +131,7 @@ describe('snapshot generator - ', () => { }) // It's called one time every time a snapshot is created // 7 daily + (1 weekly + 1 daily) - expect(clockSpy).toBeCalledTimes(9) + expect(clockSpy).toHaveBeenCalledTimes(9) } ) @@ -151,7 +151,7 @@ describe('snapshot generator - ', () => { // It's called one time every time a snapshot is created // 5 daily + (1 weekly + 1 daily) - expect(clockSpy).toBeCalledTimes(7) + expect(clockSpy).toHaveBeenCalledTimes(7) const weeklySnapshot = snapshots[0] expect(weeklySnapshot).toEqual({ @@ -267,7 +267,7 @@ describe('snapshot generator - ', () => { const snapshots = await generateSnapshotsInMultipleTimeRanges(components, timeRangeOfDaysFromInitialTimestamp(1)) expect(snapshots).toEqual(expect.arrayContaining([expect.objectContaining({ numberOfEntities: 1 })])) - expect(storeSpy).toBeCalledWith(snapshots[0].hash, expect.anything()) + expect(storeSpy).toHaveBeenCalledWith(snapshots[0].hash, expect.anything()) expect(await components.storage.exist(snapshots[0].hash)).toBeTruthy() // now the snapshot is deleted from storage so it needs to be re-generated @@ -278,7 +278,7 @@ describe('snapshot generator - ', () => { // now the snapshot is re-generated and stored again const snapshots2 = await generateSnapshotsInMultipleTimeRanges(components, timeRangeOfDaysFromInitialTimestamp(1)) expect(snapshots2).toEqual(expect.arrayContaining([expect.objectContaining({ numberOfEntities: 1 })])) - expect(storeSpy).toBeCalledWith(snapshots2[0].hash, expect.anything()) + expect(storeSpy).toHaveBeenCalledWith(snapshots2[0].hash, expect.anything()) expect(await components.storage.exist(snapshots2[0].hash)).toBeTruthy() }) @@ -313,7 +313,7 @@ describe('snapshot generator - ', () => { expect(snapshots).toEqual(expect.arrayContaining([expect.objectContaining({ numberOfEntities: 1 })])) expect(await components.storage.exist(snapshots[0].hash)).toBeTruthy() - expect(snapshotsNotInTimeRangeSpy).toBeCalledWith( + expect(snapshotsNotInTimeRangeSpy).toHaveBeenCalledWith( expect.anything(), expect.arrayContaining(['h1']), expect.anything() diff --git a/content/test/integration/ports/processedSnapshotStorage.spec.ts b/content/test/integration/ports/processedSnapshotStorage.spec.ts index 94b4ea5f2..72b09308e 100644 --- a/content/test/integration/ports/processedSnapshotStorage.spec.ts +++ b/content/test/integration/ports/processedSnapshotStorage.spec.ts @@ -44,11 +44,11 @@ describe('precessed snapshot storage', () => { await saveProcessedSnapshot(components.database, processedSnapshot, Date.now()) await components.processedSnapshotStorage.filterProcessedSnapshotsFrom([processedSnapshot]) - expect(dbQuerySpy).toBeCalledTimes(1) + expect(dbQuerySpy).toHaveBeenCalledTimes(1) // now the result should be cached dbQuerySpy.mockClear() await components.processedSnapshotStorage.filterProcessedSnapshotsFrom([processedSnapshot]) - expect(dbQuerySpy).toBeCalledTimes(0) + expect(dbQuerySpy).toHaveBeenCalledTimes(0) }) it('should query the db if not ALL the snapshots are in the cache', async () => { @@ -60,7 +60,7 @@ describe('precessed snapshot storage', () => { // now the snapshot 'processedSnapshot' is cached const anotherHashNotInCache = 'anotherHashNotInCache' await components.processedSnapshotStorage.filterProcessedSnapshotsFrom([processedSnapshot, anotherHashNotInCache]) - expect(dbQuerySpy).toBeCalledWith( + expect(dbQuerySpy).toHaveBeenCalledWith( expect.anything(), expect.arrayContaining([processedSnapshot, anotherHashNotInCache]) ) @@ -89,7 +89,7 @@ describe('precessed snapshot storage', () => { otherProcessedSnapshot, anotherProcessedSnapshot ]) - expect(dbQuerySpy).toBeCalledTimes(0) + expect(dbQuerySpy).toHaveBeenCalledTimes(0) }) }) @@ -103,7 +103,7 @@ describe('precessed snapshot storage', () => { await components.processedSnapshotStorage.markSnapshotAsProcessed(processedSnapshot) - expect(saveProcessedSnapshotSpy).toBeCalledWith(expect.anything(), processedSnapshot, expectedProcessTime) + expect(saveProcessedSnapshotSpy).toHaveBeenCalledWith(expect.anything(), processedSnapshot, expectedProcessTime) }) it('should cache the processed snapshot when saving a snapshot', async () => { @@ -114,7 +114,7 @@ describe('precessed snapshot storage', () => { const processedSnapshots = await components.processedSnapshotStorage.filterProcessedSnapshotsFrom([ processedSnapshot ]) - expect(dbQuerySpy).toBeCalledTimes(0) + expect(dbQuerySpy).toHaveBeenCalledTimes(0) expect(processedSnapshots).toEqual(new Set([processedSnapshot])) }) }) diff --git a/content/test/integration/syncronization/batch-deployer.spec.ts b/content/test/integration/syncronization/batch-deployer.spec.ts index f36b02482..762b40d7c 100644 --- a/content/test/integration/syncronization/batch-deployer.spec.ts +++ b/content/test/integration/syncronization/batch-deployer.spec.ts @@ -57,7 +57,7 @@ describe('batch deployer - ', () => { for (let i = 0; i < numberOfDeployments; i++) { expect(markedAsDeployed.has(i)).toBeTruthy() } - expect(deployEntityFromRemoteServerSpy).toBeCalledTimes(1) + expect(deployEntityFromRemoteServerSpy).toHaveBeenCalledTimes(1) }) it('multiple concurrent deployments with same entityId is done one time but markAsDeployed is called for both', async () => { @@ -101,7 +101,7 @@ describe('batch deployer - ', () => { expect(markedAsDeployed.has(i)).toBeTruthy() } - expect(deployEntityFromRemoteServerSpy).toBeCalledTimes(1) + expect(deployEntityFromRemoteServerSpy).toHaveBeenCalledTimes(1) }) it('five concurrent deployments with different entityId are done for each one and markAsDeployed is called for each one', async () => { @@ -145,7 +145,7 @@ describe('batch deployer - ', () => { expect(markedAsDeployed.has(i)).toBeTruthy() } - expect(deployEntityFromRemoteServerSpy).toBeCalledTimes(numberOfDeployments) + expect(deployEntityFromRemoteServerSpy).toHaveBeenCalledTimes(numberOfDeployments) }) it('markAsDeployed is called but not deployed for deployments that are already deployed', async () => { @@ -171,7 +171,7 @@ describe('batch deployer - ', () => { await components.batchDeployer.onIdle() expect(markedAsDeployed.has(1)).toBeTruthy() - expect(deployEntityFromRemoteServerSpy).toBeCalledTimes(0) + expect(deployEntityFromRemoteServerSpy).toHaveBeenCalledTimes(0) }) it('when a deployment fails, it is reported as failed deployment and markAsDeployed is called', async () => { @@ -202,8 +202,8 @@ describe('batch deployer - ', () => { await components.batchDeployer.onIdle() expect(markedAsDeployed.has(1)).toBeTruthy() - expect(deployEntityFromRemoteServerSpy).toBeCalledTimes(1) - expect(reportFailureSpy).toBeCalledTimes(1) + expect(deployEntityFromRemoteServerSpy).toHaveBeenCalledTimes(1) + expect(reportFailureSpy).toHaveBeenCalledTimes(1) }) it('when a deployment is successfull, consecutive ones with same entityId are ignored but markAsDeployed is called', async () => { @@ -257,8 +257,8 @@ describe('batch deployer - ', () => { expect(markedAsDeployed.has(1)).toBeTruthy() expect(markedAsDeployed.has(2)).toBeTruthy() // Only the first one is truly deployed - expect(deployEntityFromRemoteServerSpy).toBeCalledTimes(1) + expect(deployEntityFromRemoteServerSpy).toHaveBeenCalledTimes(1) // It is consulted two times but by the first deployment (early noop and in-queue check) - expect(isEntityDeployedSpy).toBeCalledTimes(2) + expect(isEntityDeployedSpy).toHaveBeenCalledTimes(2) }) }) diff --git a/content/test/integration/syncronization/bootstrapping.spec.ts b/content/test/integration/syncronization/bootstrapping.spec.ts index 90c2bb792..8daa43a2c 100644 --- a/content/test/integration/syncronization/bootstrapping.spec.ts +++ b/content/test/integration/syncronization/bootstrapping.spec.ts @@ -145,9 +145,9 @@ describe('Bootstrapping synchronization tests', function () { endTimestamp: fakeNow() }) expect(sevenDaysSnapshots).toHaveLength(7) - expect(markSnapshotAsProcessedSpy).toBeCalledTimes(3) + expect(markSnapshotAsProcessedSpy).toHaveBeenCalledTimes(3) for (const snapshotHash of sevenDaysSnapshots.map((s) => s.hash)) { - expect(markSnapshotAsProcessedSpy).toBeCalledWith(snapshotHash) + expect(markSnapshotAsProcessedSpy).toHaveBeenCalledWith(snapshotHash) } // now we deploy a new entity for the 8th day @@ -187,9 +187,9 @@ describe('Bootstrapping synchronization tests', function () { for (const newSnapshotHash of eightDaysSnapshots) { expect(oldSnapshots.has(newSnapshotHash)).toBeFalsy() } - expect(markSnapshotAsProcessedSpy).toBeCalledTimes(2) + expect(markSnapshotAsProcessedSpy).toHaveBeenCalledTimes(2) for (const snapshotHash of eightDaysSnapshots.map((s) => s.hash)) { - expect(markSnapshotAsProcessedSpy).toBeCalledWith(snapshotHash) + expect(markSnapshotAsProcessedSpy).toHaveBeenCalledWith(snapshotHash) } }) diff --git a/content/test/postgres-test-container.ts b/content/test/postgres-test-container.ts index 97d66cc01..ca162b3f2 100644 --- a/content/test/postgres-test-container.ts +++ b/content/test/postgres-test-container.ts @@ -1,6 +1,6 @@ import { exec } from 'child_process' import Dockerode from 'dockerode' -import { PassThrough } from 'stream' +import { PassThrough, Readable } from 'stream' import { GenericContainer } from 'testcontainers' import { LogWaitStrategy } from 'testcontainers/dist/wait-strategy' import { promisify } from 'util' @@ -18,23 +18,22 @@ const deletePreviousPsql = async (postgresContainerName: string): Promise } export async function initializePostgresContainer(postgresContainerName: string) { - await deletePreviousPsql(postgresContainerName) + await deletePreviousPsql(postgresContainerName) - // start postgres container and wait for it to be ready - const container = await new GenericContainer('postgres:12') - .withName(postgresContainerName) - .withEnv('POSTGRES_PASSWORD', DEFAULT_DATABASE_CONFIG.password) - .withEnv('POSTGRES_USER', DEFAULT_DATABASE_CONFIG.user) - .withExposedPorts(E2ETestEnvironment.POSTGRES_PORT) - .withWaitStrategy(new PostgresWaitStrategy()) - .start() + // start postgres container and wait for it to be ready + const container = await new GenericContainer('postgres:12') + .withName(postgresContainerName) + .withEnv('POSTGRES_PASSWORD', DEFAULT_DATABASE_CONFIG.password) + .withEnv('POSTGRES_USER', DEFAULT_DATABASE_CONFIG.user) + .withExposedPorts(E2ETestEnvironment.POSTGRES_PORT) + .withWaitStrategy(new PostgresWaitStrategy()) + .start() - globalThis.__POSTGRES_CONTAINER__ = container - // get mapped port to be used for testing purposes - process.env.MAPPED_POSTGRES_PORT = container.getMappedPort(E2ETestEnvironment.POSTGRES_PORT).toString() + globalThis.__POSTGRES_CONTAINER__ = container + // get mapped port to be used for testing purposes + process.env.MAPPED_POSTGRES_PORT = container.getMappedPort(E2ETestEnvironment.POSTGRES_PORT).toString() } - /** During startup, the db is restarted, so we need to wait for the log message twice */ class PostgresWaitStrategy extends LogWaitStrategy { private static LOG = 'database system is ready to accept connections' @@ -47,9 +46,9 @@ class PostgresWaitStrategy extends LogWaitStrategy { let counter = 0 return new Promise(async (resolve, reject) => { const stream = await container.logs({ stdout: true, stderr: true, follow: true }) - const demuxedStream = new PassThrough({ autoDestroy: true, encoding: "utf-8" }); - this.DOCKERODE.modem.demuxStream(stream, demuxedStream, demuxedStream); - stream.on("end", () => demuxedStream.end()); + const demuxedStream = new PassThrough({ autoDestroy: true, encoding: 'utf-8' }) + this.DOCKERODE.modem.demuxStream(Readable.from(stream), demuxedStream, demuxedStream) + stream.on('end', () => demuxedStream.end()) demuxedStream .on('data', (line) => { if (line.toString().includes(PostgresWaitStrategy.LOG)) { diff --git a/content/test/unit/logic/deployments.spec.ts b/content/test/unit/logic/deployments.spec.ts index 8304b828e..fd790fb97 100644 --- a/content/test/unit/logic/deployments.spec.ts +++ b/content/test/unit/logic/deployments.spec.ts @@ -18,8 +18,8 @@ describe('isEntityDeployed', () => { deployedEntitiesBloomFilter } await isEntityDeployed(components.database, components, 'id', 1) - expect(components.database.queryWithValues).toBeCalled() - expect(metricsSpy).toBeCalledWith('dcl_deployed_entities_bloom_filter_checks_total', { hit: 'true' }) + expect(components.database.queryWithValues).toHaveBeenCalled() + expect(metricsSpy).toHaveBeenCalledWith('dcl_deployed_entities_bloom_filter_checks_total', { hit: 'true' }) }) it('when deployedEntitiesBloomFilter returns false, then it should not call the database', async () => { @@ -32,7 +32,7 @@ describe('isEntityDeployed', () => { deployedEntitiesBloomFilter } await isEntityDeployed(components.database, components, 'id', 1) - expect(components.database.queryWithValues).not.toBeCalled() + expect(components.database.queryWithValues).not.toHaveBeenCalled() }) it('when deployedEntitiesBloomFilter returns true and the entity exists in db, it should return true', async () => { @@ -72,7 +72,7 @@ describe('isEntityDeployed', () => { deployedEntitiesBloomFilter: deployedEntitiesBloomFilter } await isEntityDeployed(components.database, components, 'id', 1) - expect(metricsSpy).toBeCalledWith('dcl_deployed_entities_bloom_filter_checks_total', { hit: 'true' }) + expect(metricsSpy).toHaveBeenCalledWith('dcl_deployed_entities_bloom_filter_checks_total', { hit: 'true' }) }) it('when deployedEntitiesBloomFilter returns false, then it should register as non false positive', async () => { @@ -86,7 +86,7 @@ describe('isEntityDeployed', () => { deployedEntitiesBloomFilter } await isEntityDeployed(components.database, components, 'another-id', 1) - expect(metricsSpy).toBeCalledWith('dcl_deployed_entities_bloom_filter_checks_total', { hit: 'true' }) + expect(metricsSpy).toHaveBeenCalledWith('dcl_deployed_entities_bloom_filter_checks_total', { hit: 'true' }) }) it('when deployedEntitiesBloomFilter returns true and db false, then it should register as false positive', async () => { @@ -100,7 +100,7 @@ describe('isEntityDeployed', () => { deployedEntitiesBloomFilter } await isEntityDeployed(components.database, components, 'id', 1) - expect(metricsSpy).toBeCalledWith('dcl_deployed_entities_bloom_filter_checks_total', { hit: 'false' }) + expect(metricsSpy).toHaveBeenCalledWith('dcl_deployed_entities_bloom_filter_checks_total', { hit: 'false' }) }) }) diff --git a/content/test/unit/logic/entity-parser.spec.ts b/content/test/unit/logic/entity-parser.spec.ts index ee8687dcb..920aa0a7b 100644 --- a/content/test/unit/logic/entity-parser.spec.ts +++ b/content/test/unit/logic/entity-parser.spec.ts @@ -103,6 +103,6 @@ describe('Service', () => { function assertInvalidFile(file: Buffer, entityId: string, errorMessage: string) { expect(() => { getEntityFromBuffer(file, entityId) - }).toThrowError(errorMessage) + }).toThrow(errorMessage) } }) diff --git a/content/test/unit/logic/snapshots.spec.ts b/content/test/unit/logic/snapshots.spec.ts index ba79a3ea0..1b09f0e1f 100644 --- a/content/test/unit/logic/snapshots.spec.ts +++ b/content/test/unit/logic/snapshots.spec.ts @@ -61,22 +61,22 @@ describe('generate snapshot', () => { const expectedTimeRange = { initTimestamp: 1, endTimestamp: 2 } await generateAndStoreSnapshot({ fs, metrics, logs, staticConfigs, storage, denylist }, database, expectedTimeRange) - expect(streamSpy).toBeCalledWith(expect.anything(), expectedTimeRange) + expect(streamSpy).toHaveBeenCalledWith(expect.anything(), expectedTimeRange) }) it('should append snapshot header to tmp file', async () => { mockStreamedActiveEntitiesWith([]) const fileWriterMock = mockCreateFileWriterMockWith('filePath', 'hash') await generateAndStoreSnapshot({ fs, metrics, logs, staticConfigs, storage, denylist }, database, aTimeRange) - expect(fileWriterMock.appendDebounced).toBeCalledWith('### Decentraland json snapshot\n') - expect(fileWriterMock.appendDebounced).toBeCalledTimes(1) + expect(fileWriterMock.appendDebounced).toHaveBeenCalledWith('### Decentraland json snapshot\n') + expect(fileWriterMock.appendDebounced).toHaveBeenCalledTimes(1) }) it('should close tmp file after streaming all active entities', async () => { mockStreamedActiveEntitiesWith([]) const fileWriterMock = mockCreateFileWriterMockWith('filePath', 'hash') await generateAndStoreSnapshot({ fs, metrics, logs, staticConfigs, storage, denylist }, database, aTimeRange) - expect(fileWriterMock.close).toBeCalledTimes(1) + expect(fileWriterMock.close).toHaveBeenCalledTimes(1) }) it('should return snapshot hash and total number of entities', async () => { @@ -205,9 +205,9 @@ describe('generate snapshot in multiple', () => { ) expect(snapshots).toHaveLength(1) expect(snapshots[0]).toEqual(expectedSnapshot) - expect(storage.delete).toBeCalledWith(expect.arrayContaining(expectedReplacedHashes)) - expect(deleteSpy).toBeCalledWith(expect.anything(), expect.arrayContaining(expectedReplacedHashes), oneYearRange) - expect(saveSpy).toBeCalledWith(expect.anything(), expectedSnapshot) + expect(storage.delete).toHaveBeenCalledWith(expect.arrayContaining(expectedReplacedHashes)) + expect(deleteSpy).toHaveBeenCalledWith(expect.anything(), expect.arrayContaining(expectedReplacedHashes), oneYearRange) + expect(saveSpy).toHaveBeenCalledWith(expect.anything(), expectedSnapshot) }) it('should re-generate snapshot when there the current snapshot is not in storage', async () => { @@ -249,9 +249,9 @@ describe('generate snapshot in multiple', () => { ) expect(snapshots).toHaveLength(1) expect(snapshots[0]).toEqual(expectedSnapshot) - expect(storage.delete).toBeCalledWith(expect.arrayContaining(expectedReplacedHashes)) - expect(deleteSpy).toBeCalledWith(expect.anything(), expect.arrayContaining(expectedReplacedHashes), oneYearRange) - expect(saveSpy).toBeCalledWith(expect.anything(), expectedSnapshot) + expect(storage.delete).toHaveBeenCalledWith(expect.arrayContaining(expectedReplacedHashes)) + expect(deleteSpy).toHaveBeenCalledWith(expect.anything(), expect.arrayContaining(expectedReplacedHashes), oneYearRange) + expect(saveSpy).toHaveBeenCalledWith(expect.anything(), expectedSnapshot) }) it('should delete old snapshots within the interval of the new snapshot generated', async () => { @@ -278,8 +278,8 @@ describe('generate snapshot in multiple', () => { { database, fs, metrics, logs, staticConfigs, storage, denylist, clock }, oneYearRange ) - expect(storage.delete).toBeCalledWith(expect.arrayContaining(['h1'])) - expect(deleteSpy).toBeCalledWith(expect.anything(), expect.arrayContaining(['h1']), oneYearRange) + expect(storage.delete).toHaveBeenCalledWith(expect.arrayContaining(['h1'])) + expect(deleteSpy).toHaveBeenCalledWith(expect.anything(), expect.arrayContaining(['h1']), oneYearRange) }) it('should delete snapshots when they are replaced', async () => { @@ -302,8 +302,8 @@ describe('generate snapshot in multiple', () => { { database, fs, metrics, logs, staticConfigs, storage, denylist, clock }, oneYearRange ) - expect(storage.delete).toBeCalledWith(expect.arrayContaining(['h1', 'h2'])) - expect(deleteSpy).toBeCalledWith(expect.anything(), expect.arrayContaining(['h1', 'h2']), oneYearRange) + expect(storage.delete).toHaveBeenCalledWith(expect.arrayContaining(['h1', 'h2'])) + expect(deleteSpy).toHaveBeenCalledWith(expect.anything(), expect.arrayContaining(['h1', 'h2']), oneYearRange) }) it('should replace snapshots when they cover the time range', async () => { @@ -481,7 +481,7 @@ describe('generate snapshot in multiple', () => { { database, fs, metrics, logs, staticConfigs, storage, denylist, clock }, oneYearTimeRange ) - expect(storage.delete).toBeCalledWith([]) + expect(storage.delete).toHaveBeenCalledWith([]) }) }) diff --git a/content/test/unit/logic/third-party-item-checker.spec.ts b/content/test/unit/logic/third-party-item-checker.spec.ts index 7ab005cd4..4de4ebcf3 100644 --- a/content/test/unit/logic/third-party-item-checker.spec.ts +++ b/content/test/unit/logic/third-party-item-checker.spec.ts @@ -68,8 +68,8 @@ describe('third party item checker', () => { ) expect(result).toEqual([]) - expect(registry.isErc1155).not.toBeCalled() - expect(registry.isErc721).not.toBeCalled() - expect(registry.isUnknown).not.toBeCalled() + expect(registry.isErc1155).not.toHaveBeenCalled() + expect(registry.isErc721).not.toHaveBeenCalled() + expect(registry.isUnknown).not.toHaveBeenCalled() }) }) diff --git a/content/test/unit/ports/denylist.spec.ts b/content/test/unit/ports/denylist.spec.ts index 296d028a8..c5312985d 100644 --- a/content/test/unit/ports/denylist.spec.ts +++ b/content/test/unit/ports/denylist.spec.ts @@ -39,8 +39,8 @@ describe('when creating a denylist', () => { denylist = await createDenylist({ env, logs, fetcher, fs }) await denylist.start!() expect(denylist.isDenylisted('denied1')).toBe(false) - expect(fs.createReadStream).not.toBeCalled() - expect(fetcher.fetch).not.toBeCalled() + expect(fs.createReadStream).not.toHaveBeenCalled() + expect(fetcher.fetch).not.toHaveBeenCalled() }) }) describe('with a denylist file and no urls to fetch denylists', () => { @@ -59,8 +59,8 @@ describe('when creating a denylist', () => { const denylist = await createDenylist({ env, logs, fs, fetcher }) await denylist.start!() expect(['denied1', 'denied2', 'denied3'].every((line) => denylist.isDenylisted(line))).toBe(true) - expect(fs.createReadStream).toBeCalledWith(denylistFilePath, { encoding: 'utf-8' }) - expect(fetcher.fetch).not.toBeCalled() + expect(fs.createReadStream).toHaveBeenCalledWith(denylistFilePath, { encoding: 'utf-8' }) + expect(fetcher.fetch).not.toHaveBeenCalled() }) }) describe('with urls to fetch denylists and no denylist file', () => { @@ -78,7 +78,7 @@ describe('when creating a denylist', () => { await denylist.start!() expect(['denied3', 'denied4'].every((line) => denylist.isDenylisted(line))).toBe(true) expect(['denied1', 'denied2'].every((line) => denylist.isDenylisted(line))).toBe(false) - expect(fetcher.fetch).toBeCalledWith('https://config.decentraland.org/denylist') + expect(fetcher.fetch).toHaveBeenCalledWith('https://config.decentraland.org/denylist') }) it('should create it without using the invalid url', async () => { @@ -93,8 +93,8 @@ describe('when creating a denylist', () => { } denylist = await createDenylist({ env, logs, fs, fetcher }) await denylist.start!() - expect(fetcher.fetch).toBeCalledWith('https://config.decentraland.org/denylist') - expect(fetcher.fetch).not.toBeCalledWith('invalidUrl') + expect(fetcher.fetch).toHaveBeenCalledWith('https://config.decentraland.org/denylist') + expect(fetcher.fetch).not.toHaveBeenCalledWith('invalidUrl') }) }) describe('with both a denylist file and urls to fetch denylists', () => { @@ -112,7 +112,7 @@ describe('when creating a denylist', () => { await denylist.start!() expect(['denied1', 'denied2', 'denied3', 'denied4'].every((line) => denylist!.isDenylisted(line))).toBe(true) - expect(fetcher.fetch).toBeCalledWith('https://config.decentraland.org/denylist') + expect(fetcher.fetch).toHaveBeenCalledWith('https://config.decentraland.org/denylist') }) it('should create it with no denied content other than the specified in the denylists', async () => { @@ -128,7 +128,7 @@ describe('when creating a denylist', () => { denylist = await createDenylist({ env, logs, fs, fetcher }) await denylist.start!() expect(['otherDenied1', 'otherDenied2'].every((line) => denylist!.isDenylisted(line))).toBe(false) - expect(fetcher.fetch).toBeCalledWith('https://config.decentraland.org/denylist') + expect(fetcher.fetch).toHaveBeenCalledWith('https://config.decentraland.org/denylist') }) }) diff --git a/content/test/unit/ports/postgres.spec.ts b/content/test/unit/ports/postgres.spec.ts index f7346df24..845c9907c 100644 --- a/content/test/unit/ports/postgres.spec.ts +++ b/content/test/unit/ports/postgres.spec.ts @@ -17,7 +17,7 @@ describe('start', () => { beforeAll(async () => { logs = await createLogComponent({ config: createConfigComponent({ LOG_LEVEL: 'DEBUG' }) }) }) - it('should release client when connection is succesful', async () => { + it('should release client when connection is successful', async () => { const p = new Pool() const clientMock = { release: jest.fn() @@ -26,7 +26,7 @@ describe('start', () => { const database = await createDatabase({ logs, env, metrics }, p, {}) expect(database.start).toBeDefined() if (database.start) await database.start() - expect(clientMock.release).toBeCalledTimes(1) + expect(clientMock.release).toHaveBeenCalledTimes(1) }) }) @@ -45,7 +45,7 @@ describe('stop', () => { const database = await createDatabase({ logs, env, metrics }, p, {}) expect(database.start).toBeDefined() if (database.start) await database.start() - expect(clientMock.release).toBeCalledTimes(1) + expect(clientMock.release).toHaveBeenCalledTimes(1) }) }) @@ -62,7 +62,7 @@ describe('DatabaseClient', () => { const database = await createDatabase({ logs, env, metrics }, pool, {}) const aQuery = 'a query' await database.query(aQuery) - expect(pool.query).toBeCalledWith(aQuery) + expect(pool.query).toHaveBeenCalledWith(aQuery) }) it('(queryWithValues) should use pool', async () => { @@ -71,7 +71,7 @@ describe('DatabaseClient', () => { const database = await createDatabase({ logs, env, metrics }, pool, {}) const aSQLQuery = SQL`aQuery` await database.queryWithValues(aSQLQuery) - expect(pool.query).toBeCalledWith(aSQLQuery) + expect(pool.query).toHaveBeenCalledWith(aSQLQuery) }) }) @@ -85,7 +85,7 @@ describe('DatabaseClient', () => { jest.spyOn(pool, 'connect').mockImplementation(() => poolClient) const database = await createDatabase({ logs, env, metrics }, pool, {}) await database.transaction(async () => {}) - expect(pool.connect).toBeCalled() + expect(pool.connect).toHaveBeenCalled() }) it('should query BEGIN when it starts', async () => { @@ -97,8 +97,8 @@ describe('DatabaseClient', () => { jest.spyOn(pool, 'connect').mockImplementation(() => poolClient) const database = await createDatabase({ logs, env, metrics }, pool, {}) await database.transaction(async () => {}) - expect(pool.connect).toBeCalled() - expect(poolClient.query).toBeCalledWith('BEGIN') + expect(pool.connect).toHaveBeenCalled() + expect(poolClient.query).toHaveBeenCalledWith('BEGIN') }) it('should run all inner queries with the provided client', async () => { @@ -115,8 +115,8 @@ describe('DatabaseClient', () => { databaseClient.queryWithValues(aQuery) databaseClient.queryWithValues(otherQuery) }) - expect(poolClient.query).toBeCalledWith(aQuery) - expect(poolClient.query).toBeCalledWith(otherQuery) + expect(poolClient.query).toHaveBeenCalledWith(aQuery) + expect(poolClient.query).toHaveBeenCalledWith(otherQuery) }) it('should use the provided client when running within another transaction', async () => { @@ -133,8 +133,8 @@ describe('DatabaseClient', () => { databaseClient.queryWithValues(aQuery) databaseClient.queryWithValues(otherQuery) }) - expect(poolClient.query).toBeCalledWith(aQuery) - expect(poolClient.query).toBeCalledWith(otherQuery) + expect(poolClient.query).toHaveBeenCalledWith(aQuery) + expect(poolClient.query).toHaveBeenCalledWith(otherQuery) }) it('should query COMMIT when callback finishes successfully', async () => { @@ -146,8 +146,8 @@ describe('DatabaseClient', () => { jest.spyOn(pool, 'connect').mockImplementation(() => poolClient) const database = await createDatabase({ logs, env, metrics }, pool, {}) await database.transaction(async () => {}) - expect(pool.connect).toBeCalled() - expect(poolClient.query).toBeCalledWith('COMMIT') + expect(pool.connect).toHaveBeenCalled() + expect(poolClient.query).toHaveBeenCalledWith('COMMIT') }) it('should query ROLLBACK when callback throws error', async () => { @@ -158,15 +158,19 @@ describe('DatabaseClient', () => { } jest.spyOn(pool, 'connect').mockImplementation(() => poolClient) const database = await createDatabase({ logs, env, metrics }, pool, {}) - await expect( - database.transaction(async () => { + let thrownError: Error | undefined + try { + await database.transaction(async () => { throw new Error('error during transaction') }) - ).rejects.toThrowError('error during transaction') - expect(poolClient.query).toBeCalledWith('ROLLBACK') + } catch (error) { + thrownError = error as Error + } + expect(thrownError?.message).toBe('error during transaction') + expect(poolClient.query).toHaveBeenCalledWith('ROLLBACK') }) - it('should release client if the callback is successfull', async () => { + it('should release client if the callback is successful', async () => { const pool = new Pool() const poolClient = { query: jest.fn(), @@ -175,7 +179,7 @@ describe('DatabaseClient', () => { jest.spyOn(pool, 'connect').mockImplementation(() => poolClient) const database = await createDatabase({ logs, env, metrics }, pool, {}) await database.transaction(async () => {}) - expect(poolClient.release).toBeCalledTimes(1) + expect(poolClient.release).toHaveBeenCalledTimes(1) }) it('should release client if the callback failed', async () => { @@ -186,12 +190,16 @@ describe('DatabaseClient', () => { } jest.spyOn(pool, 'connect').mockImplementation(() => poolClient) const database = await createDatabase({ logs, env, metrics }, pool, {}) - await expect( - database.transaction(async () => { + let thrownError: Error | undefined + try { + await database.transaction(async () => { throw new Error('error during transaction') }) - ).rejects.toThrowError('error during transaction') - expect(poolClient.release).toBeCalledTimes(1) + } catch (error) { + thrownError = error as Error + } + expect(thrownError?.message).toBe('error during transaction') + expect(poolClient.release).toHaveBeenCalledTimes(1) }) it('should use the pool to make queries when not using the provided database client', async () => { @@ -208,8 +216,8 @@ describe('DatabaseClient', () => { await database.transaction(async () => { await database.queryWithValues(aQuery) }) - expect(pool.query).toBeCalledWith(aQuery) - expect(poolClient.query).not.toBeCalledWith(aQuery) + expect(pool.query).toHaveBeenCalledWith(aQuery) + expect(poolClient.query).not.toHaveBeenCalledWith(aQuery) }) }) }) @@ -231,7 +239,7 @@ it('should use the pool to make external queries even if there is a transaction const aQuery = SQL`a-query` const queryPromise = database.queryWithValues(aQuery) await Promise.all([txPromise, queryPromise]) - expect(pool.query).toBeCalledWith(aQuery) - expect(poolClient.query).not.toBeCalledWith(aQuery) - expect(poolClient.query).toBeCalledWith(txQuery) + expect(pool.query).toHaveBeenCalledWith(aQuery) + expect(poolClient.query).not.toHaveBeenCalledWith(aQuery) + expect(poolClient.query).toHaveBeenCalledWith(txQuery) }) diff --git a/content/test/unit/ports/processedSnapshotStorage.spec.ts b/content/test/unit/ports/processedSnapshotStorage.spec.ts index 131c9f67b..b1700c190 100644 --- a/content/test/unit/ports/processedSnapshotStorage.spec.ts +++ b/content/test/unit/ports/processedSnapshotStorage.spec.ts @@ -38,11 +38,11 @@ describe('processed snapshot storage', () => { .mockResolvedValue(new Set([processedSnapshot])) await processedSnapshotStorage.filterProcessedSnapshotsFrom([processedSnapshot]) - expect(dbQuerySpy).toBeCalledTimes(1) + expect(dbQuerySpy).toHaveBeenCalledTimes(1) // now the result should be cached dbQuerySpy.mockReset() await processedSnapshotStorage.filterProcessedSnapshotsFrom([processedSnapshot]) - expect(dbQuerySpy).toBeCalledTimes(0) + expect(dbQuerySpy).toHaveBeenCalledTimes(0) }) it('should query the db if not ALL the snapshots are in the cache', async () => { @@ -56,7 +56,7 @@ describe('processed snapshot storage', () => { // now the snapshot 'processedSnapshot' is cached const anotherHashNotInCache = 'anotherHashNotInCache' await processedSnapshotStorage.filterProcessedSnapshotsFrom([processedSnapshot, anotherHashNotInCache]) - expect(dbQuerySpy).toBeCalledWith( + expect(dbQuerySpy).toHaveBeenCalledWith( expect.anything(), expect.arrayContaining([processedSnapshot, anotherHashNotInCache]) ) @@ -82,7 +82,7 @@ describe('processed snapshot storage', () => { otherProcessedSnapshot, anotherProcessedSnapshot ]) - expect(dbQuerySpy).toBeCalledTimes(0) + expect(dbQuerySpy).toHaveBeenCalledTimes(0) }) }) @@ -96,7 +96,7 @@ describe('processed snapshot storage', () => { await processedSnapshotStorage.markSnapshotAsProcessed(processedSnapshot) - expect(saveProcessedSnapshotSpy).toBeCalledWith(database, processedSnapshot, expectedProcessTime) + expect(saveProcessedSnapshotSpy).toHaveBeenCalledWith(database, processedSnapshot, expectedProcessTime) }) it('should cache the processed snapshot when saving a snapshot', async () => { @@ -107,7 +107,7 @@ describe('processed snapshot storage', () => { await processedSnapshotStorage.markSnapshotAsProcessed(processedSnapshot) const dbQuerySpy = jest.spyOn(snapshotQueries, 'getProcessedSnapshots') const processedSnapshots = await processedSnapshotStorage.filterProcessedSnapshotsFrom([processedSnapshot]) - expect(dbQuerySpy).toBeCalledTimes(0) + expect(dbQuerySpy).toHaveBeenCalledTimes(0) expect(processedSnapshots).toEqual(new Set([processedSnapshot])) }) }) diff --git a/content/test/unit/service/pointers/NoOpPointerManager.ts b/content/test/unit/service/pointers/NoOpPointerManager.ts index c196871a7..506a16fa0 100644 --- a/content/test/unit/service/pointers/NoOpPointerManager.ts +++ b/content/test/unit/service/pointers/NoOpPointerManager.ts @@ -1,10 +1,9 @@ -import { anything, instance, mock, when } from 'ts-mockito' import { PointerManager } from '../../../../src/service/pointers/PointerManager' export class NoOpPointerManager { - static build(): PointerManager { - const mockedManager: PointerManager = mock(PointerManager) - when(mockedManager.referenceEntityFromPointers(anything(), anything(), anything(), anything())).thenResolve(new Map()) - return instance(mockedManager) + static build(): jest.Mocked { + return { + referenceEntityFromPointers: jest.fn().mockResolvedValue(new Map()) + } as unknown as jest.Mocked } } diff --git a/content/test/unit/service/synchronization/ContentCluster.spec.ts b/content/test/unit/service/synchronization/ContentCluster.spec.ts index 41a677291..76d7f2e47 100644 --- a/content/test/unit/service/synchronization/ContentCluster.spec.ts +++ b/content/test/unit/service/synchronization/ContentCluster.spec.ts @@ -60,7 +60,7 @@ describe('ContentCluster', function () { process.env.CI = 'true' // Check that no identity was detected expect(await contentCluster.getIdentity()).toBeUndefined() - expect(sleep).toBeCalledTimes(10) + expect(sleep).toHaveBeenCalledTimes(10) expect(sleep).toHaveBeenCalledWith(1000) }) }) diff --git a/lambdas/package.json b/lambdas/package.json index 360ea57d2..dcac5234e 100644 --- a/lambdas/package.json +++ b/lambdas/package.json @@ -46,24 +46,20 @@ "@types/jest": "27.4.1", "@types/lru-cache": "7.6.1", "@types/morgan": "^1", - "@types/node": "17.0.45", + "@types/node": "^24", "@types/sharp": "0.30.5", - "@types/sinon": "10.0.13", "@types/uuid": "^8", "@typescript-eslint/eslint-plugin": "5.33.0", "@typescript-eslint/parser": "5.33.0", "eslint": "8.21.0", "eslint-config-prettier": "8.5.0", "eslint-plugin-prettier": "4.2.1", - "jest": "27.4.7", + "jest": "^30.2.0", "jest-junit": "^13.0.0", "lint-staged": "13.0.3", "prettier": "2.7.1", - "sinon": "13.0.2", - "ts-jest": "27.1.5", - "ts-mockito": "2.6.1", - "ts-node": "10.7.0", - "tsc": "2.0.4", - "typescript": "^4.7.4" + "ts-jest": "^29.4.6", + "ts-node": "^10.9.2", + "typescript": "^5.9.3" } } diff --git a/lambdas/src/apis/collections/controllers/collections.ts b/lambdas/src/apis/collections/controllers/collections.ts index 43ee85d31..38c501328 100644 --- a/lambdas/src/apis/collections/controllers/collections.ts +++ b/lambdas/src/apis/collections/controllers/collections.ts @@ -191,7 +191,7 @@ async function fetchEntity(client: SmartContentClient, urn: string): Promise 0 && entities[0].metadata ? entities[0] : undefined } -export function getBodyShapes(representations: WearableRepresentation[]) { +function getBodyShapes(representations: WearableRepresentation[]) { const bodyShapes = new Set() for (const representation of representations) { for (const bodyShape of representation.bodyShapes) { diff --git a/lambdas/src/apis/collections/types.ts b/lambdas/src/apis/collections/types.ts index 37dbd518e..b9085c018 100644 --- a/lambdas/src/apis/collections/types.ts +++ b/lambdas/src/apis/collections/types.ts @@ -11,7 +11,7 @@ export type LambdasWearable = Omit & { representations: LambdasWearableRepresentation[] } } -export type LambdasWearableRepresentation = Omit & { +type LambdasWearableRepresentation = Omit & { contents: { key: string; url: string }[] } @@ -21,7 +21,7 @@ export type LambdasEmote = Omit & { } } -export type LambdasEmoteRepresentation = Omit & { +type LambdasEmoteRepresentation = Omit & { contents: { key: string; url: string }[] } diff --git a/lambdas/src/apis/images/controllers/images.ts b/lambdas/src/apis/images/controllers/images.ts index ce27c3728..5b1d8cec0 100644 --- a/lambdas/src/apis/images/controllers/images.ts +++ b/lambdas/src/apis/images/controllers/images.ts @@ -6,6 +6,7 @@ import log4js from 'log4js' import fetch from 'node-fetch' import onFinished from 'on-finished' import sharp from 'sharp' +import { Readable } from 'stream' import { SmartContentServerFetcher } from '../../../utils/SmartContentServerFetcher' const LOGGER = log4js.getLogger('ImagesController') @@ -51,7 +52,7 @@ export async function getResizedImage( validateSize(size) - const [stream, length]: [NodeJS.ReadableStream, number] = await getStreamFor(cid, size) + const [stream, length]: [Readable, number] = await getStreamFor(cid, size) res.writeHead(200, { 'Content-Type': 'application/octet-stream', @@ -73,7 +74,7 @@ export async function getResizedImage( } } - async function getFileStream(filePath: string): Promise<[NodeJS.ReadableStream, number]> { + async function getFileStream(filePath: string): Promise<[Readable, number]> { const stat = await fs.promises.stat(filePath) return [fs.createReadStream(filePath), stat.size] } diff --git a/lambdas/src/apis/profiles/controllers/profiles.ts b/lambdas/src/apis/profiles/controllers/profiles.ts index 312ae34b9..3619fb823 100644 --- a/lambdas/src/apis/profiles/controllers/profiles.ts +++ b/lambdas/src/apis/profiles/controllers/profiles.ts @@ -1,5 +1,5 @@ import { EthAddress } from '@dcl/crypto' -import { Entity, Profile, WearableId } from '@dcl/schemas' +import { Entity, WearableId } from '@dcl/schemas' import { NextFunction, Request, RequestHandler, Response } from 'express' import log4js from 'log4js' import { TheGraphClient } from '../../../ports/the-graph/types' @@ -385,10 +385,6 @@ export type ProfileMetadata = { }[] } -export type LambdasProfile = Profile & { - timestamp: number -} - type AvatarSnapshots = Record type Avatar = { @@ -405,16 +401,6 @@ type Avatar = { }[] } -export type ProfileMetadataForSnapshots = { - ethAddress: EthAddress - avatars: { - avatar: AvatarForSnapshots - }[] -} -type AvatarForSnapshots = { - snapshots: AvatarSnapshots -} - function asyncHandler(handler: (req: Request, res: Response, next: NextFunction) => Promise): RequestHandler { return (req, res, next) => { handler(req, res, next).catch((e) => { diff --git a/lambdas/test/apis/collections/Utils.spec.ts b/lambdas/test/apis/collections/Utils.spec.ts index cdf060474..134b43295 100644 --- a/lambdas/test/apis/collections/Utils.spec.ts +++ b/lambdas/test/apis/collections/Utils.spec.ts @@ -1,5 +1,4 @@ import { BodyShape, Entity, EntityType, Rarity, Wearable, WearableCategory, Emote, EmoteCategory } from '@dcl/schemas' -import { instance, mock, when } from 'ts-mockito' import { translateEntityIntoWearable, translateEntityIntoEmote } from '../../../src/apis/collections/Utils' import { SmartContentClient } from '../../../src/utils/SmartContentClient' @@ -8,40 +7,51 @@ const [CONTENT_KEY1, CONTENT_KEY2, CONTENT_KEY3] = ['key1', 'key2', 'key3'] const [CONTENT_HASH1, CONTENT_HASH2, CONTENT_HASH3] = ['hash1', 'hash2', 'hash3'] describe('Collection Utils', () => { - it(`When wearable metadata is translated, then url is added to file references`, async () => { - const client = getClient() - const entity = buildEntity() - - let wearable = translateEntityIntoWearable(client, entity) - const entityMetadata: Wearable = entity.metadata - - // Compare top level properties - expect(wearable).toBeDefined() - assertAreEqualExceptProperties(wearable!, entityMetadata, 'thumbnail', 'image', 'data') - wearable = wearable! - expect(wearable.thumbnail).toEqual(`${EXTERNAL_URL}/contents/${CONTENT_HASH1}`) - expect(wearable.image).toEqual(`${EXTERNAL_URL}/contents/${CONTENT_HASH2}`) - - // Compare data - assertAreEqualExceptProperties(wearable.data, entityMetadata.data, 'representations') - - // Compare representations - expect(wearable.data.representations.length).toEqual(1) - const [translatedRepresentation] = wearable.data.representations - const [originalRepresentation] = entityMetadata.data.representations - assertAreEqualExceptProperties(translatedRepresentation, originalRepresentation, 'contents') - - // Compare contents - expect(translatedRepresentation.contents.length).toEqual(1) - const [translatedContent] = translatedRepresentation.contents - const [originalContent] = originalRepresentation.contents - expect(translatedContent.key).toEqual(originalContent) - expect(translatedContent.url).toEqual(`${EXTERNAL_URL}/contents/${CONTENT_HASH3}`) + describe('when wearable metadata is translated', () => { + let client: jest.Mocked + let entity: Entity + + beforeEach(() => { + client = getClient() + entity = buildEntity() + }) + + afterEach(() => { + jest.resetAllMocks() + }) + + it('should add url to file references', () => { + let wearable = translateEntityIntoWearable(client, entity) + const entityMetadata: Wearable = entity.metadata + + // Compare top level properties + expect(wearable).toBeDefined() + assertAreEqualExceptProperties(wearable!, entityMetadata, 'thumbnail', 'image', 'data') + wearable = wearable! + expect(wearable.thumbnail).toEqual(`${EXTERNAL_URL}/contents/${CONTENT_HASH1}`) + expect(wearable.image).toEqual(`${EXTERNAL_URL}/contents/${CONTENT_HASH2}`) + + // Compare data + assertAreEqualExceptProperties(wearable.data, entityMetadata.data, 'representations') + + // Compare representations + expect(wearable.data.representations.length).toEqual(1) + const [translatedRepresentation] = wearable.data.representations + const [originalRepresentation] = entityMetadata.data.representations + assertAreEqualExceptProperties(translatedRepresentation, originalRepresentation, 'contents') + + // Compare contents + expect(translatedRepresentation.contents.length).toEqual(1) + const [translatedContent] = translatedRepresentation.contents + const [originalContent] = originalRepresentation.contents + expect(translatedContent.key).toEqual(originalContent) + expect(translatedContent.url).toEqual(`${EXTERNAL_URL}/contents/${CONTENT_HASH3}`) + }) }) describe('when emote metadata is translated', () => { describe('and emote metadata is ADR74', () => { - let client: SmartContentClient + let client: jest.Mocked let entity: Entity let emote: any let entityMetadata: Emote @@ -104,7 +114,7 @@ describe('Collection Utils', () => { }) describe('and emote is saved as wearable metadata', () => { - let client: SmartContentClient + let client: jest.Mocked let entity: Entity let emote: any let entityMetadata: Wearable @@ -348,8 +358,8 @@ function buildEmoteAsWearableMetadata(): Wearable { } } -function getClient(): SmartContentClient { - const mockedClient = mock(SmartContentClient) - when(mockedClient.getExternalContentServerUrl()).thenReturn(EXTERNAL_URL) - return instance(mockedClient) +function getClient(): jest.Mocked { + return { + getExternalContentServerUrl: jest.fn().mockReturnValue(EXTERNAL_URL) + } as unknown as jest.Mocked } diff --git a/lambdas/test/apis/collections/controller/emotes/utils.spec.ts b/lambdas/test/apis/collections/controller/emotes/utils.spec.ts index a8e78d627..729938350 100644 --- a/lambdas/test/apis/collections/controller/emotes/utils.spec.ts +++ b/lambdas/test/apis/collections/controller/emotes/utils.spec.ts @@ -1,172 +1,223 @@ import { Emote, Entity, EntityType, Wearable, WearableCategory } from '@dcl/schemas' -import { instance, mock, when } from 'ts-mockito' import { translateEntityIntoEmote } from '../../../../../src/apis/collections/Utils' import { SmartContentClient } from '../../../../../src/utils/SmartContentClient' describe('emotes translation', () => { - it('translate old emote into LambdasEmote', async () => { - const mockedClient: SmartContentClient = mock() - const contentServerUrl = 'content-server-url' - when(mockedClient.getExternalContentServerUrl()).thenReturn(contentServerUrl) - const femaleFilename = 'female/emote.glb' - const femaleHash = 'bafkreiaq2amoomlngobzh6l2e7stofkbzozwlyx2z45asdfasdfhrasdff' - const maleFilename = 'male/emote.glb' - const maleHash = 'bafkreiaq2amoomlngobzh6l2e7stofkbzozwlyx2z45dzgjwcku2g6ayfu' - const emoteSavedAsWearable = { - version: 'v3', - id: 'i am an id', - type: EntityType.WEARABLE, - timestamp: 1234, - content: [ - { file: 'image.png', hash: 'Qmbd1mvR7Wuo4VGEPfRkMGLDnhXwY3v4cZYdCQz2P4cZY1' }, - { file: 'thumbnail.png', hash: 'QmeuXyj1tu1biCbNuNTB2eyEfJ32g1oDRU2xWtgzSeFgqg' }, - { file: femaleFilename, hash: femaleHash }, - { file: maleFilename, hash: maleHash } - ], - pointers: [], - metadata: { - id: 'urn:decentraland:mumbai:collections-v2:0x93e1c9479569d397fd3751fe5169da58e9cae4ae:1', - name: 'Fashionista', - description: '', - collectionAddress: '0x93e1c9479569d397fd3751fe5169da58e9cae4ae', - rarity: 'rare', - i18n: [{ code: 'en', text: 'Fashionista' }], - data: { - tags: [], - // Old Emotes were saved as 'simple' category but currently that is not allowed - category: WearableCategory.EYES, - representations: [ - { - bodyShapes: ['urn:decentraland:off-chain:base-avatars:BaseMale'], - mainFile: maleFilename, - contents: [maleFilename], - overrideHides: [], - overrideReplaces: [] - }, - { - bodyShapes: ['urn:decentraland:off-chain:base-avatars:BaseFemale'], - mainFile: femaleFilename, - contents: [femaleFilename], - overrideHides: [], - overrideReplaces: [] - } - ], - hides: [], - replaces: [] - }, - image: 'image.png', - thumbnail: 'thumbnail.png', - metrics: { - triangles: 0, - materials: 0, - textures: 0, - meshes: 0, - bodies: 0, - entities: 1 - }, - emoteDataV0: { - loop: true + describe('when translating old emote into LambdasEmote', () => { + let mockedClient: jest.Mocked + let contentServerUrl: string + let femaleFilename: string + let femaleHash: string + let maleFilename: string + let maleHash: string + let emoteSavedAsWearable: any + + beforeEach(() => { + contentServerUrl = 'content-server-url' + mockedClient = { + getExternalContentServerUrl: jest.fn().mockReturnValue(contentServerUrl) + } as unknown as jest.Mocked + femaleFilename = 'female/emote.glb' + femaleHash = 'bafkreiaq2amoomlngobzh6l2e7stofkbzozwlyx2z45asdfasdfhrasdff' + maleFilename = 'male/emote.glb' + maleHash = 'bafkreiaq2amoomlngobzh6l2e7stofkbzozwlyx2z45dzgjwcku2g6ayfu' + emoteSavedAsWearable = { + version: 'v3', + id: 'i am an id', + type: EntityType.WEARABLE, + timestamp: 1234, + content: [ + { file: 'image.png', hash: 'Qmbd1mvR7Wuo4VGEPfRkMGLDnhXwY3v4cZYdCQz2P4cZY1' }, + { file: 'thumbnail.png', hash: 'QmeuXyj1tu1biCbNuNTB2eyEfJ32g1oDRU2xWtgzSeFgqg' }, + { file: femaleFilename, hash: femaleHash }, + { file: maleFilename, hash: maleHash } + ], + pointers: [], + metadata: { + id: 'urn:decentraland:mumbai:collections-v2:0x93e1c9479569d397fd3751fe5169da58e9cae4ae:1', + name: 'Fashionista', + description: '', + collectionAddress: '0x93e1c9479569d397fd3751fe5169da58e9cae4ae', + rarity: 'rare', + i18n: [{ code: 'en', text: 'Fashionista' }], + data: { + tags: [], + // Old Emotes were saved as 'simple' category but currently that is not allowed + category: WearableCategory.EYES, + representations: [ + { + bodyShapes: ['urn:decentraland:off-chain:base-avatars:BaseMale'], + mainFile: maleFilename, + contents: [maleFilename], + overrideHides: [], + overrideReplaces: [] + }, + { + bodyShapes: ['urn:decentraland:off-chain:base-avatars:BaseFemale'], + mainFile: femaleFilename, + contents: [femaleFilename], + overrideHides: [], + overrideReplaces: [] + } + ], + hides: [], + replaces: [] + }, + image: 'image.png', + thumbnail: 'thumbnail.png', + metrics: { + triangles: 0, + materials: 0, + textures: 0, + meshes: 0, + bodies: 0, + entities: 1 + }, + emoteDataV0: { + loop: true + } } } - } - expect(Wearable.validate(emoteSavedAsWearable.metadata)).toBeTruthy() - const lambdasEmote = translateEntityIntoEmote(instance(mockedClient), emoteSavedAsWearable) - // We validate that the representations are correctly mapped - const allContents: { key: string; url: string }[] = lambdasEmote.emoteDataADR74.representations.flatMap( - (r: { contents: { key: string; url: string }[] }) => r.contents - ) - expect(allContents.length).toBe(2) - for (const content of allContents) { - if (content.key == femaleFilename) { - expect(content.url).toBe(`${contentServerUrl}/contents/${femaleHash}`) - } else { - expect(content.url).toBe(`${contentServerUrl}/contents/${maleHash}`) + }) + + afterEach(() => { + jest.resetAllMocks() + }) + + it('should validate as a Wearable', () => { + expect(Wearable.validate(emoteSavedAsWearable.metadata)).toBeTruthy() + }) + + it('should correctly map representations', () => { + const lambdasEmote = translateEntityIntoEmote(mockedClient, emoteSavedAsWearable) + const allContents: { key: string; url: string }[] = lambdasEmote.emoteDataADR74.representations.flatMap( + (r: { contents: { key: string; url: string }[] }) => r.contents + ) + expect(allContents.length).toBe(2) + for (const content of allContents) { + if (content.key == femaleFilename) { + expect(content.url).toBe(`${contentServerUrl}/contents/${femaleHash}`) + } else { + expect(content.url).toBe(`${contentServerUrl}/contents/${maleHash}`) + } } - } - expect('data' in lambdasEmote).toBeFalsy() - expect('emoteDataV0' in lambdasEmote).toBeFalsy() - // Now we validate that, expect the representations, it is an actual Emote - const validEmote: any = { - ...lambdasEmote - } - validEmote.emoteDataADR74.representations = [ - { - bodyShapes: ['urn:decentraland:off-chain:base-avatars:BaseMale'], - mainFile: 'male/emote.glb', - contents: ['male/emote.glb'] + }) + + it('should not have data property', () => { + const lambdasEmote = translateEntityIntoEmote(mockedClient, emoteSavedAsWearable) + expect('data' in lambdasEmote).toBeFalsy() + }) + + it('should not have emoteDataV0 property', () => { + const lambdasEmote = translateEntityIntoEmote(mockedClient, emoteSavedAsWearable) + expect('emoteDataV0' in lambdasEmote).toBeFalsy() + }) + + it('should be a valid Emote when representations are fixed', () => { + const lambdasEmote = translateEntityIntoEmote(mockedClient, emoteSavedAsWearable) + const validEmote: any = { + ...lambdasEmote } - ] - expect(Emote.validate(validEmote)).toBeTruthy() + validEmote.emoteDataADR74.representations = [ + { + bodyShapes: ['urn:decentraland:off-chain:base-avatars:BaseMale'], + mainFile: 'male/emote.glb', + contents: ['male/emote.glb'] + } + ] + expect(Emote.validate(validEmote)).toBeTruthy() + }) }) - it('translate new emote into LambasEmote', async () => { - const mockedClient: SmartContentClient = mock() - const contentServerUrl = 'content-server-url' - when(mockedClient.getExternalContentServerUrl()).thenReturn(contentServerUrl) - const femaleFilename = 'female/emote.glb' - const femaleHash = 'bafkreiaq2amoomlngobzh6l2e7stofkbzozwlyx2z45asdfasdfhrasdff' - const maleFilename = 'male/emote.glb' - const maleHash = 'bafkreiaq2amoomlngobzh6l2e7stofkbzozwlyx2z45dzgjwcku2g6ayfu' - const trueEmote: Entity = { - version: 'v3', - id: 'bafkreibkbswiu6nhbkaj7wo3yfwnaf4k73sqzkajv3bb3kjquvqwpfyiz4', - type: EntityType.EMOTE, - timestamp: 1658763609095, - pointers: ['urn:decentraland:mumbai:collections-v2:0x4c2cd3106d934e83db3b365baafb6623a8b80099:0'], - content: [ - { file: 'thumbnail.png', hash: 'bafkreibhdozxxroantqhehz3z2wjwpbrchyjyyboutoecqn67ofl745jji' }, - { file: 'image.png', hash: 'bafkreiarq4yg3db2gaibjfzkq53s6ppgznx4e4qz4do3qvdhvn7qawbjry' }, - { file: femaleFilename, hash: femaleHash }, - { file: maleFilename, hash: maleHash } - ], - metadata: { - id: 'urn:decentraland:mumbai:collections-v2:0x4c2cd3106d934e83db3b365baafb6623a8b80099:0', - name: 'Emote', - description: '', - collectionAddress: '0x4c2cd3106d934e83db3b365baafb6623a8b80099', - rarity: 'unique', - i18n: [{ code: 'en', text: 'Emote' }], - emoteDataADR74: { - category: 'dance', - representations: [ - { - bodyShapes: ['urn:decentraland:off-chain:base-avatars:BaseMale'], - mainFile: 'male/emote.glb', - contents: ['male/emote.glb'] - }, - { - bodyShapes: ['urn:decentraland:off-chain:base-avatars:BaseFemale'], - mainFile: 'female/emote.glb', - contents: ['female/emote.glb'] - } - ], - tags: [], - loop: false - }, - image: 'image.png', - thumbnail: 'thumbnail.png', - metrics: { - triangles: 0, - materials: 0, - textures: 0, - meshes: 0, - bodies: 0, - entities: 1 + describe('when translating new emote into LambdasEmote', () => { + let mockedClient: jest.Mocked + let contentServerUrl: string + let femaleFilename: string + let femaleHash: string + let maleFilename: string + let maleHash: string + let trueEmote: Entity + + beforeEach(() => { + contentServerUrl = 'content-server-url' + mockedClient = { + getExternalContentServerUrl: jest.fn().mockReturnValue(contentServerUrl) + } as unknown as jest.Mocked + femaleFilename = 'female/emote.glb' + femaleHash = 'bafkreiaq2amoomlngobzh6l2e7stofkbzozwlyx2z45asdfasdfhrasdff' + maleFilename = 'male/emote.glb' + maleHash = 'bafkreiaq2amoomlngobzh6l2e7stofkbzozwlyx2z45dzgjwcku2g6ayfu' + trueEmote = { + version: 'v3', + id: 'bafkreibkbswiu6nhbkaj7wo3yfwnaf4k73sqzkajv3bb3kjquvqwpfyiz4', + type: EntityType.EMOTE, + timestamp: 1658763609095, + pointers: ['urn:decentraland:mumbai:collections-v2:0x4c2cd3106d934e83db3b365baafb6623a8b80099:0'], + content: [ + { file: 'thumbnail.png', hash: 'bafkreibhdozxxroantqhehz3z2wjwpbrchyjyyboutoecqn67ofl745jji' }, + { file: 'image.png', hash: 'bafkreiarq4yg3db2gaibjfzkq53s6ppgznx4e4qz4do3qvdhvn7qawbjry' }, + { file: femaleFilename, hash: femaleHash }, + { file: maleFilename, hash: maleHash } + ], + metadata: { + id: 'urn:decentraland:mumbai:collections-v2:0x4c2cd3106d934e83db3b365baafb6623a8b80099:0', + name: 'Emote', + description: '', + collectionAddress: '0x4c2cd3106d934e83db3b365baafb6623a8b80099', + rarity: 'unique', + i18n: [{ code: 'en', text: 'Emote' }], + emoteDataADR74: { + category: 'dance', + representations: [ + { + bodyShapes: ['urn:decentraland:off-chain:base-avatars:BaseMale'], + mainFile: 'male/emote.glb', + contents: ['male/emote.glb'] + }, + { + bodyShapes: ['urn:decentraland:off-chain:base-avatars:BaseFemale'], + mainFile: 'female/emote.glb', + contents: ['female/emote.glb'] + } + ], + tags: [], + loop: false + }, + image: 'image.png', + thumbnail: 'thumbnail.png', + metrics: { + triangles: 0, + materials: 0, + textures: 0, + meshes: 0, + bodies: 0, + entities: 1 + } } } - } - expect(Emote.validate(trueEmote.metadata)).toBeTruthy() - const lambdasEmote = translateEntityIntoEmote(instance(mockedClient), trueEmote) - const allContents: { key: string; url: string }[] = lambdasEmote.emoteDataADR74.representations.flatMap( - (r: { contents: { key: string; url: string }[] }) => r.contents - ) - expect(allContents.length).toBe(2) - for (const content of allContents) { - if (content.key == femaleFilename) { - expect(content.url).toBe(`${contentServerUrl}/contents/${femaleHash}`) - } else { - expect(content.url).toBe(`${contentServerUrl}/contents/${maleHash}`) + }) + + afterEach(() => { + jest.resetAllMocks() + }) + + it('should validate as an Emote', () => { + expect(Emote.validate(trueEmote.metadata)).toBeTruthy() + }) + + it('should correctly map representation contents', () => { + const lambdasEmote = translateEntityIntoEmote(mockedClient, trueEmote) + const allContents: { key: string; url: string }[] = lambdasEmote.emoteDataADR74.representations.flatMap( + (r: { contents: { key: string; url: string }[] }) => r.contents + ) + expect(allContents.length).toBe(2) + for (const content of allContents) { + if (content.key == femaleFilename) { + expect(content.url).toBe(`${contentServerUrl}/contents/${femaleHash}`) + } else { + expect(content.url).toBe(`${contentServerUrl}/contents/${maleHash}`) + } } - } + }) }) }) diff --git a/lambdas/test/apis/collections/controller/wearables/wearables-by-owner.spec.ts b/lambdas/test/apis/collections/controller/wearables/wearables-by-owner.spec.ts index 9bbddf520..c84767c7c 100644 --- a/lambdas/test/apis/collections/controller/wearables/wearables-by-owner.spec.ts +++ b/lambdas/test/apis/collections/controller/wearables/wearables-by-owner.spec.ts @@ -1,6 +1,4 @@ import { EntityType } from '@dcl/schemas' -import { ISubgraphComponent } from '@well-known-components/thegraph-component' -import { anything, instance, mock, verify, when } from 'ts-mockito' import { getWearablesByOwner, getWearablesByOwnerFromUrns @@ -16,151 +14,282 @@ const WEARABLE_ID_2 = 'someOtherCollection-someOtherWearable' const TPW_WEARABLE_ID = 'urn:decentraland:mumbai:collections-thirdparty:some-third-party:someWearable' describe('getWearablesByOwnerFromUrns', () => { - it(`When user doesn't have any wearables, then the response is empty`, async () => { - const contentClientMock = mock(SmartContentClient) + describe(`when user doesn't have any wearables`, () => { + let contentClientMock: jest.Mocked - const wearables = await getWearablesByOwnerFromUrns(false, instance(contentClientMock), []) + beforeEach(() => { + contentClientMock = { + fetchEntitiesByPointers: jest.fn() + } as unknown as jest.Mocked + }) + + afterEach(() => { + jest.resetAllMocks() + }) - expect(wearables.length).toEqual(0) - verify(contentClientMock.fetchEntitiesByPointers(anything(), anything())).never() + it(`should return empty response`, async () => { + const wearables = await getWearablesByOwnerFromUrns(false, contentClientMock, []) + + expect(wearables.length).toEqual(0) + expect(contentClientMock.fetchEntitiesByPointers).not.toHaveBeenCalled() + }) }) - it('When user has repeated wearables, then they are grouped together', async () => { - const contentClientMock = mock(SmartContentClient) - - const wearables = await getWearablesByOwnerFromUrns(false, instance(contentClientMock), [ - WEARABLE_ID_1, - WEARABLE_ID_1, - WEARABLE_ID_2 - ]) - - expect(wearables.length).toEqual(2) - const [wearable1, wearable2] = wearables - expect(wearable1.urn).toBe(WEARABLE_ID_1) - expect(wearable1.amount).toBe(2) - expect(wearable1.definition).toBeUndefined() - expect(wearable2.urn).toBe(WEARABLE_ID_2) - expect(wearable2.amount).toBe(1) - expect(wearable2.definition).toBeUndefined() - verify(contentClientMock.fetchEntitiesByPointers(anything(), anything())).never() + describe('when user has repeated wearables', () => { + let contentClientMock: jest.Mocked + + beforeEach(() => { + contentClientMock = { + fetchEntitiesByPointers: jest.fn() + } as unknown as jest.Mocked + }) + + afterEach(() => { + jest.resetAllMocks() + }) + + it('should group them together', async () => { + const wearables = await getWearablesByOwnerFromUrns(false, contentClientMock, [ + WEARABLE_ID_1, + WEARABLE_ID_1, + WEARABLE_ID_2 + ]) + + expect(wearables.length).toEqual(2) + const [wearable1, wearable2] = wearables + expect(wearable1.urn).toBe(WEARABLE_ID_1) + expect(wearable1.amount).toBe(2) + expect(wearable1.definition).toBeUndefined() + expect(wearable2.urn).toBe(WEARABLE_ID_2) + expect(wearable2.amount).toBe(1) + expect(wearable2.definition).toBeUndefined() + expect(contentClientMock.fetchEntitiesByPointers).not.toHaveBeenCalled() + }) }) - it('When user requests definitions, then they are included in the response', async () => { - const mockedClient = mock(SmartContentClient) - const wearableUrns = [WEARABLE_ID_1] - const wearableMetadata = { - id: WEARABLE_ID_1, - someProperty: 'someValue', - data: { representations: [] }, - image: undefined, - thumbnail: undefined - } - when(mockedClient.fetchEntitiesByPointers(wearableUrns)).thenResolve([ - { - version: 'v3', - id: 'someId', - type: EntityType.WEARABLE, - pointers: wearableUrns, - timestamp: 10, - content: [], - metadata: wearableMetadata + describe('when user requests definitions', () => { + let mockedClient: jest.Mocked + let wearableUrns: string[] + let wearableMetadata: any + + beforeEach(() => { + wearableUrns = [WEARABLE_ID_1] + wearableMetadata = { + id: WEARABLE_ID_1, + someProperty: 'someValue', + data: { representations: [] }, + image: undefined, + thumbnail: undefined } - ]) + mockedClient = { + fetchEntitiesByPointers: jest.fn().mockResolvedValue([ + { + version: 'v3', + id: 'someId', + type: EntityType.WEARABLE, + pointers: wearableUrns, + timestamp: 10, + content: [], + metadata: wearableMetadata + } + ]) + } as unknown as jest.Mocked + }) - const wearables = await getWearablesByOwnerFromUrns(true, instance(mockedClient), wearableUrns) + afterEach(() => { + jest.resetAllMocks() + }) + + it('should include them in the response', async () => { + const wearables = await getWearablesByOwnerFromUrns(true, mockedClient, wearableUrns) - expect(wearables.length).toEqual(1) - const [wearable] = wearables - expect(wearable.urn).toBe(WEARABLE_ID_1) - expect(wearable.amount).toBe(1) - expect(wearable.definition).toEqual(wearableMetadata) - verify(mockedClient.fetchEntitiesByPointers(wearableUrns)).once() + expect(wearables.length).toEqual(1) + const [wearable] = wearables + expect(wearable.urn).toBe(WEARABLE_ID_1) + expect(wearable.amount).toBe(1) + expect(wearable.definition).toEqual(wearableMetadata) + expect(mockedClient.fetchEntitiesByPointers).toHaveBeenCalledWith(wearableUrns) + expect(mockedClient.fetchEntitiesByPointers).toHaveBeenCalledTimes(1) + }) }) - it(`When wearable can't be found, then the definition is not returned`, async () => { - const contentClientMock = mock(SmartContentClient) - when(contentClientMock.fetchEntitiesByPointers(anything())).thenResolve([]) - const wearableUrns = [WEARABLE_ID_1] - const wearables = await getWearablesByOwnerFromUrns(true, instance(contentClientMock), wearableUrns) - - expect(wearables.length).toEqual(1) - const [wearable] = wearables - expect(wearable.urn).toBe(WEARABLE_ID_1) - expect(wearable.amount).toBe(1) - expect(wearable.definition).toBeUndefined() - verify(contentClientMock.fetchEntitiesByPointers(wearableUrns)).once() + describe(`when wearable can't be found`, () => { + let contentClientMock: jest.Mocked + let wearableUrns: string[] + + beforeEach(() => { + wearableUrns = [WEARABLE_ID_1] + contentClientMock = { + fetchEntitiesByPointers: jest.fn().mockResolvedValue([]) + } as unknown as jest.Mocked + }) + + afterEach(() => { + jest.resetAllMocks() + }) + + it(`should not return the definition`, async () => { + const wearables = await getWearablesByOwnerFromUrns(true, contentClientMock, wearableUrns) + + expect(wearables.length).toEqual(1) + const [wearable] = wearables + expect(wearable.urn).toBe(WEARABLE_ID_1) + expect(wearable.amount).toBe(1) + expect(wearable.definition).toBeUndefined() + expect(contentClientMock.fetchEntitiesByPointers).toHaveBeenCalledWith(wearableUrns) + expect(contentClientMock.fetchEntitiesByPointers).toHaveBeenCalledTimes(1) + }) }) }) describe('getWearablesByOwner', () => { - beforeEach(() => jest.resetAllMocks()) - it('When collectionId is defined, then assets are fetched from the third party', async () => { - const contentClientMock = mock(SmartContentClient) - const mockedGraphClient = { - findWearableUrnsByOwner: jest.fn() - } + afterEach(() => { + jest.resetAllMocks() + }) - const tpFetcher: ThirdPartyAssetFetcher = { - fetchAssets: () => - Promise.resolve([ - { - id: TPW_WEARABLE_ID, - amount: 1, - urn: { decentraland: TPW_WEARABLE_ID } - } - ]) - } - jest.spyOn(tpUrnFinder, 'findThirdPartyItemUrns').mockResolvedValue([TPW_WEARABLE_ID]) - - const wearables = await getWearablesByOwner( - false, - instance(contentClientMock), - mockedGraphClient as any, - tpFetcher, - 'some-collection', - SOME_ADDRESS - ) - - expect(wearables.length).toEqual(1) - expect(wearables[0].amount).toEqual(1) - expect(wearables[0].urn).toEqual(TPW_WEARABLE_ID) - expect(wearables[0].definition).toBeUndefined() - expect(mockedGraphClient.findWearableUrnsByOwner).not.toHaveBeenCalled() - verify(contentClientMock.fetchEntitiesByPointers(anything(), anything())).never() + describe('when collectionId is defined', () => { + let contentClientMock: jest.Mocked + let mockedGraphClient: { findWearableUrnsByOwner: jest.Mock } + let tpFetcher: ThirdPartyAssetFetcher + + beforeEach(() => { + contentClientMock = { + fetchEntitiesByPointers: jest.fn() + } as unknown as jest.Mocked + mockedGraphClient = { + findWearableUrnsByOwner: jest.fn() + } + tpFetcher = { + fetchAssets: () => + Promise.resolve([ + { + id: TPW_WEARABLE_ID, + amount: 1, + urn: { decentraland: TPW_WEARABLE_ID } + } + ]) + } + jest.spyOn(tpUrnFinder, 'findThirdPartyItemUrns').mockResolvedValue([TPW_WEARABLE_ID]) + }) + + afterEach(() => { + jest.resetAllMocks() + }) + + it('should fetch assets from the third party', async () => { + const wearables = await getWearablesByOwner( + false, + contentClientMock, + mockedGraphClient as any, + tpFetcher, + 'some-collection', + SOME_ADDRESS + ) + + expect(wearables.length).toEqual(1) + expect(wearables[0].amount).toEqual(1) + expect(wearables[0].urn).toEqual(TPW_WEARABLE_ID) + expect(wearables[0].definition).toBeUndefined() + expect(mockedGraphClient.findWearableUrnsByOwner).not.toHaveBeenCalled() + expect(contentClientMock.fetchEntitiesByPointers).not.toHaveBeenCalled() + }) }) - it('When collectionId is undefined, then assets are fetched from the graph client', async () => { - const contentClientMock = mock(SmartContentClient) - const mockedGraphClient = { - findWearableUrnsByOwner: jest.fn().mockResolvedValue([WEARABLE_ID_1]) - } + describe('when collectionId is undefined', () => { + let contentClientMock: jest.Mocked + let mockedGraphClient: { findWearableUrnsByOwner: jest.Mock } + let tpFetcher: { fetchAssets: jest.Mock } + let tpUrnFinderSpy: jest.SpyInstance + + beforeEach(() => { + contentClientMock = { + fetchEntitiesByPointers: jest.fn() + } as unknown as jest.Mocked + mockedGraphClient = { + findWearableUrnsByOwner: jest.fn().mockResolvedValue([WEARABLE_ID_1]) + } + tpFetcher = { fetchAssets: jest.fn() } + tpUrnFinderSpy = jest.spyOn(tpUrnFinder, 'findThirdPartyItemUrns').mockResolvedValue([]) + }) + + afterEach(() => { + jest.resetAllMocks() + }) + + it('should fetch assets from the graph client', async () => { + const wearables = await getWearablesByOwner( + false, + contentClientMock, + mockedGraphClient as any, + tpFetcher, + undefined, + SOME_ADDRESS + ) - const tpFetcher = { fetchAssets: jest.fn() } - const tpUrnFinderSpy = jest.spyOn(tpUrnFinder, 'findThirdPartyItemUrns').mockResolvedValue([]) - - const wearables = await getWearablesByOwner( - false, - instance(contentClientMock), - mockedGraphClient as any, - tpFetcher, - undefined, - SOME_ADDRESS - ) - - expect(wearables.length).toEqual(1) - expect(wearables[0].amount).toEqual(1) - expect(wearables[0].urn).toEqual(WEARABLE_ID_1) - expect(wearables[0].definition).toBeUndefined() - expect(mockedGraphClient.findWearableUrnsByOwner).toHaveBeenCalledWith(SOME_ADDRESS) - expect(mockedGraphClient.findWearableUrnsByOwner).toHaveBeenCalledTimes(1) - verify(contentClientMock.fetchEntitiesByPointers(anything(), anything())).never() - expect(tpUrnFinderSpy).not.toBeCalled() + expect(wearables.length).toEqual(1) + expect(wearables[0].amount).toEqual(1) + expect(wearables[0].urn).toEqual(WEARABLE_ID_1) + expect(wearables[0].definition).toBeUndefined() + expect(mockedGraphClient.findWearableUrnsByOwner).toHaveBeenCalledWith(SOME_ADDRESS) + expect(mockedGraphClient.findWearableUrnsByOwner).toHaveBeenCalledTimes(1) + expect(contentClientMock.fetchEntitiesByPointers).not.toHaveBeenCalled() + expect(tpUrnFinderSpy).not.toHaveBeenCalled() + }) }) - it('should call the graph client with the arguments correctly mapped', async () => { - const contentClientMock = mock(SmartContentClient) + describe('when verifying the graph client is called with the correct arguments', () => { + let contentClientMock: jest.Mocked + let subGraphs: { + ensSubgraph: { query: jest.Mock } + collectionsSubgraph: { query: jest.Mock } + maticCollectionsSubgraph: { query: jest.Mock } + thirdPartyRegistrySubgraph: { query: jest.Mock } + } + let tpFetcher: { fetchAssets: jest.Mock } + let tpUrnFinderSpy: jest.SpyInstance + + beforeEach(() => { + contentClientMock = { + fetchEntitiesByPointers: jest.fn() + } as unknown as jest.Mocked + subGraphs = { + ensSubgraph: { query: jest.fn() }, + collectionsSubgraph: { query: jest.fn() }, + maticCollectionsSubgraph: { query: jest.fn() }, + thirdPartyRegistrySubgraph: { query: jest.fn() } + } + subGraphs.collectionsSubgraph.query.mockResolvedValue({ + nfts: [ + { + id: 'im an id', + urn: WEARABLE_ID_1, + collection: { + isApproved: true + } + } + ] + }) + subGraphs.maticCollectionsSubgraph.query.mockResolvedValue({ + nfts: [ + { + id: 'im an id', + urn: WEARABLE_ID_1, + collection: { + isApproved: true + } + } + ] + }) + tpFetcher = { fetchAssets: jest.fn() } + tpUrnFinderSpy = jest.spyOn(tpUrnFinder, 'findThirdPartyItemUrns').mockResolvedValue([]) + }) + + afterEach(() => { + jest.resetAllMocks() + }) - const query = ` + it('should call the graph client with the arguments correctly mapped', async () => { + const query = ` query itemsByOwner($owner: String, $item_types:[String], $first: Int, $start: String) { nfts(where: {owner: $owner, searchItemType_in: $item_types, id_gt: $start}, first: $first) { id @@ -170,78 +299,49 @@ query itemsByOwner($owner: String, $item_types:[String], $first: Int, $start: St } } }` - const expectedVariables = { - owner: SOME_ADDRESS, - item_types: ['wearable_v1', 'wearable_v2', 'smart_wearable_v1'], - first: 1000, - start: '' - } - const subGraphs = { - ensSubgraph: jest.fn() as any as ISubgraphComponent, - collectionsSubgraph: { query: jest.fn() }, - maticCollectionsSubgraph: { query: jest.fn() }, - thirdPartyRegistrySubgraph: jest.fn() as any as ISubgraphComponent - } - subGraphs.collectionsSubgraph.query.mockResolvedValue({ - nfts: [ - { - id: 'im an id', - urn: WEARABLE_ID_1, - collection: { - isApproved: true - } - } - ] - }) - subGraphs.maticCollectionsSubgraph.query.mockResolvedValue({ - nfts: [ - { - id: 'im an id', - urn: WEARABLE_ID_1, - collection: { - isApproved: true - } - } - ] - }) - const graphClient = await createTheGraphClient({ - subgraphs: subGraphs, - log: { - getLogger: () => ({ - debug: jest.fn(), - error: jest.fn(), - info: jest.fn(), - log: jest.fn(), - warn: jest.fn() - }) + const expectedVariables = { + owner: SOME_ADDRESS, + item_types: ['wearable_v1', 'wearable_v2', 'smart_wearable_v1'], + first: 1000, + start: '' } - }) - const tpFetcher = { fetchAssets: jest.fn() } - const tpUrnFinderSpy = jest.spyOn(tpUrnFinder, 'findThirdPartyItemUrns').mockResolvedValue([]) - - const wearables = await getWearablesByOwner( - false, - instance(contentClientMock), - graphClient as any, - tpFetcher, - undefined, - SOME_ADDRESS - ) - - expect(wearables.length).toEqual(1) - expect(wearables[0].amount).toEqual(2) - expect(wearables[0].urn).toEqual(WEARABLE_ID_1) - expect(wearables[0].definition).toBeUndefined() - expect(subGraphs.collectionsSubgraph.query).toHaveBeenCalledTimes(1) - expect(subGraphs.collectionsSubgraph.query).toHaveBeenCalledWith(query, expectedVariables) - expect(subGraphs.maticCollectionsSubgraph.query).toHaveBeenCalledTimes(1) - expect(subGraphs.maticCollectionsSubgraph.query).toHaveBeenCalledWith(query, { - first: 1000, - item_types: ['wearable_v1', 'wearable_v2', 'smart_wearable_v1'], - owner: '0x079bed9c31cb772c4c156f86e1cff15bf751add0', - start: '' - }) - expect(tpUrnFinderSpy).not.toBeCalled() + const graphClient = await createTheGraphClient({ + subgraphs: subGraphs, + log: { + getLogger: () => ({ + debug: jest.fn(), + error: jest.fn(), + info: jest.fn(), + log: jest.fn(), + warn: jest.fn() + }) + } + }) + + const wearables = await getWearablesByOwner( + false, + contentClientMock, + graphClient as any, + tpFetcher, + undefined, + SOME_ADDRESS + ) + + expect(wearables.length).toEqual(1) + expect(wearables[0].amount).toEqual(2) + expect(wearables[0].urn).toEqual(WEARABLE_ID_1) + expect(wearables[0].definition).toBeUndefined() + expect(subGraphs.collectionsSubgraph.query).toHaveBeenCalledTimes(1) + expect(subGraphs.collectionsSubgraph.query).toHaveBeenCalledWith(query, expectedVariables) + expect(subGraphs.maticCollectionsSubgraph.query).toHaveBeenCalledTimes(1) + expect(subGraphs.maticCollectionsSubgraph.query).toHaveBeenCalledWith(query, { + first: 1000, + item_types: ['wearable_v1', 'wearable_v2', 'smart_wearable_v1'], + owner: '0x079bed9c31cb772c4c156f86e1cff15bf751add0', + start: '' + }) + expect(tpUrnFinderSpy).not.toHaveBeenCalled() + }) }) }) diff --git a/lambdas/test/apis/collections/controller/wearables/wearables.spec.ts b/lambdas/test/apis/collections/controller/wearables/wearables.spec.ts index 261aed6b5..2742b4257 100644 --- a/lambdas/test/apis/collections/controller/wearables/wearables.spec.ts +++ b/lambdas/test/apis/collections/controller/wearables/wearables.spec.ts @@ -1,5 +1,4 @@ import { Entity, EntityType, WearableId } from '@dcl/schemas' -import { anything, deepEqual, instance, mock, verify, when } from 'ts-mockito' import { getWearables } from '../../../../../src/apis/collections/controllers/wearables' import { BASE_AVATARS_COLLECTION_ID, @@ -16,112 +15,189 @@ const OFF_CHAIN_WEARABLE = { } as any describe('wearables', () => { - it(`When only off-chain ids are requested, then content server and subgraph are not queried`, async () => { - const { instance: contentClient, mock: contentServerMock } = emptyContentServer() - const mockedGraphClient = noExistingWearables() - const { instance: offChain } = offChainManagerWith(OFF_CHAIN_WEARABLE) - - const pagination = { limit: 3, lastId: undefined } - const response = await getWearables( - { itemIds: [OFF_CHAIN_WEARABLE_ID] }, - pagination, - contentClient, - mockedGraphClient as any, - offChain - ) - - expect(response.wearables).toEqual([OFF_CHAIN_WEARABLE]) - expect(response.lastId).toBeUndefined() - expect(mockedGraphClient.findWearableUrnsByFilters).not.toHaveBeenCalled() - verify(contentServerMock.fetchEntitiesByPointers(anything(), anything())).never() + describe('when only off-chain ids are requested', () => { + let contentClient: jest.Mocked + let mockedGraphClient: { findWearableUrnsByFilters: jest.Mock } + let offChain: jest.Mocked + + beforeEach(() => { + contentClient = emptyContentServer() + mockedGraphClient = noExistingWearables() + offChain = offChainManagerWith(OFF_CHAIN_WEARABLE) + }) + + afterEach(() => { + jest.resetAllMocks() + }) + + it('should not query content server and subgraph', async () => { + const pagination = { limit: 3, lastId: undefined } + const response = await getWearables( + { itemIds: [OFF_CHAIN_WEARABLE_ID] }, + pagination, + contentClient, + mockedGraphClient as any, + offChain + ) + + expect(response.wearables).toEqual([OFF_CHAIN_WEARABLE]) + expect(response.lastId).toBeUndefined() + expect(mockedGraphClient.findWearableUrnsByFilters).not.toHaveBeenCalled() + expect(contentClient.fetchEntitiesByPointers).not.toHaveBeenCalled() + }) }) -}) - -it(`When on-chain ids are requested, then content servers is queried, but subgraph isn't`, async () => { - const { instance: contentClient, mock: contentServerMock } = contentServerThatReturns(ON_CHAIN_WEARABLE_ID) - const mockedGraphClient = noExistingWearables() - const { instance: offChain } = offChainManagerWith(OFF_CHAIN_WEARABLE) - - const pagination = { limit: 3, lastId: undefined } - const response = await getWearables( - { itemIds: [OFF_CHAIN_WEARABLE_ID, ON_CHAIN_WEARABLE_ID] }, - pagination, - contentClient, - mockedGraphClient as any, - offChain - ) - - expectWearablesToBe(response, OFF_CHAIN_WEARABLE_ID, ON_CHAIN_WEARABLE_ID) - expect(response.lastId).toBeUndefined() - expect(mockedGraphClient.findWearableUrnsByFilters).not.toHaveBeenCalled() - verify(contentServerMock.fetchEntitiesByPointers(deepEqual([ON_CHAIN_WEARABLE_ID]))).once() -}) - -it(`When lastId isn't base avatar, then the offChainManager isn't called`, async () => { - const { instance: contentClient } = contentServerThatReturns(ON_CHAIN_WEARABLE_ID) - const mockedGraphClient = noExistingWearables() - const { instance: offChain, mock: offChainMock } = emptyOffChainManager() - - const pagination = { limit: 3, lastId: ON_CHAIN_WEARABLE_ID } - const filters = { textSearch: 'Something' } - const response = await getWearables(filters, pagination, contentClient, mockedGraphClient as any, offChain) - - expect(response.wearables.length).toEqual(0) - expect(mockedGraphClient.findWearableUrnsByFilters).toHaveBeenCalledWith(filters, expect.objectContaining(pagination)) - verify(offChainMock.find(anything(), anything())).never() -}) -it(`When lastId is a base avatar, then the offChainManager is called`, async () => { - const { instance: contentClient } = contentServerThatReturns(ON_CHAIN_WEARABLE_ID) - const mockedGraphClient = noExistingWearables() - const { instance: offChain, mock: offChainMock } = emptyOffChainManager() - - const pagination = { limit: 3, lastId: OFF_CHAIN_WEARABLE_ID } - const filters = { textSearch: 'Something' } - const response = await getWearables(filters, pagination, contentClient, mockedGraphClient as any, offChain) - - expect(response.wearables.length).toEqual(0) - expect(mockedGraphClient.findWearableUrnsByFilters).toHaveBeenCalledWith( - filters, - expect.objectContaining({ ...pagination, lastId: undefined }) - ) - verify(offChainMock.find(filters, OFF_CHAIN_WEARABLE_ID)).once() -}) + describe('when on-chain ids are requested', () => { + let contentClient: jest.Mocked + let mockedGraphClient: { findWearableUrnsByFilters: jest.Mock } + let offChain: jest.Mocked + + beforeEach(() => { + contentClient = contentServerThatReturns(ON_CHAIN_WEARABLE_ID) + mockedGraphClient = noExistingWearables() + offChain = offChainManagerWith(OFF_CHAIN_WEARABLE) + }) + + afterEach(() => { + jest.resetAllMocks() + }) + + it('should query content servers but not subgraph', async () => { + const pagination = { limit: 3, lastId: undefined } + const response = await getWearables( + { itemIds: [OFF_CHAIN_WEARABLE_ID, ON_CHAIN_WEARABLE_ID] }, + pagination, + contentClient, + mockedGraphClient as any, + offChain + ) + + expectWearablesToBe(response, OFF_CHAIN_WEARABLE_ID, ON_CHAIN_WEARABLE_ID) + expect(response.lastId).toBeUndefined() + expect(mockedGraphClient.findWearableUrnsByFilters).not.toHaveBeenCalled() + expect(contentClient.fetchEntitiesByPointers).toHaveBeenCalledWith([ON_CHAIN_WEARABLE_ID]) + expect(contentClient.fetchEntitiesByPointers).toHaveBeenCalledTimes(1) + }) + }) -it(`When collection id is base avatars, then subgraph is never queried`, async () => { - const { instance: contentClient } = contentServerThatReturns(ON_CHAIN_WEARABLE_ID) - const mockedGraphClient = noExistingWearables() - const { instance: offChain, mock: offChainMock } = emptyOffChainManager() + describe('when lastId is not a base avatar', () => { + let contentClient: jest.Mocked + let mockedGraphClient: { findWearableUrnsByFilters: jest.Mock } + let offChain: jest.Mocked + + beforeEach(() => { + contentClient = contentServerThatReturns(ON_CHAIN_WEARABLE_ID) + mockedGraphClient = noExistingWearables() + offChain = emptyOffChainManager() + }) + + afterEach(() => { + jest.resetAllMocks() + }) + + it('should not call the offChainManager', async () => { + const pagination = { limit: 3, lastId: ON_CHAIN_WEARABLE_ID } + const filters = { textSearch: 'Something' } + const response = await getWearables(filters, pagination, contentClient, mockedGraphClient as any, offChain) + + expect(response.wearables.length).toEqual(0) + expect(mockedGraphClient.findWearableUrnsByFilters).toHaveBeenCalledWith(filters, expect.objectContaining(pagination)) + expect(offChain.find).not.toHaveBeenCalled() + }) + }) - const pagination = { limit: 3, lastId: undefined } - const filters = { collectionIds: [BASE_AVATARS_COLLECTION_ID] } - const response = await getWearables(filters, pagination, contentClient, mockedGraphClient as any, offChain) + describe('when lastId is a base avatar', () => { + let contentClient: jest.Mocked + let mockedGraphClient: { findWearableUrnsByFilters: jest.Mock } + let offChain: jest.Mocked + + beforeEach(() => { + contentClient = contentServerThatReturns(ON_CHAIN_WEARABLE_ID) + mockedGraphClient = noExistingWearables() + offChain = emptyOffChainManager() + }) + + afterEach(() => { + jest.resetAllMocks() + }) + + it('should call the offChainManager', async () => { + const pagination = { limit: 3, lastId: OFF_CHAIN_WEARABLE_ID } + const filters = { textSearch: 'Something' } + const response = await getWearables(filters, pagination, contentClient, mockedGraphClient as any, offChain) + + expect(response.wearables.length).toEqual(0) + expect(mockedGraphClient.findWearableUrnsByFilters).toHaveBeenCalledWith( + filters, + expect.objectContaining({ ...pagination, lastId: undefined }) + ) + expect(offChain.find).toHaveBeenCalledWith(filters, OFF_CHAIN_WEARABLE_ID) + expect(offChain.find).toHaveBeenCalledTimes(1) + }) + }) - expect(response.wearables.length).toEqual(0) - expect(mockedGraphClient.findWearableUrnsByFilters).not.toHaveBeenCalled() - verify(offChainMock.find(filters, undefined)).once() -}) + describe('when collection id is base avatars', () => { + let contentClient: jest.Mocked + let mockedGraphClient: { findWearableUrnsByFilters: jest.Mock } + let offChain: jest.Mocked + + beforeEach(() => { + contentClient = contentServerThatReturns(ON_CHAIN_WEARABLE_ID) + mockedGraphClient = noExistingWearables() + offChain = emptyOffChainManager() + }) + + afterEach(() => { + jest.resetAllMocks() + }) + + it('should never query subgraph', async () => { + const pagination = { limit: 3, lastId: undefined } + const filters = { collectionIds: [BASE_AVATARS_COLLECTION_ID] } + const response = await getWearables(filters, pagination, contentClient, mockedGraphClient as any, offChain) + + expect(response.wearables.length).toEqual(0) + expect(mockedGraphClient.findWearableUrnsByFilters).not.toHaveBeenCalled() + expect(offChain.find).toHaveBeenCalledWith(filters, undefined) + expect(offChain.find).toHaveBeenCalledTimes(1) + }) + }) -it(`When there is more data than the one returned, then last id is included`, async () => { - const { instance: contentClient, mock: contentServerMock } = contentServerThatReturns(ON_CHAIN_WEARABLE_ID) - const mockedGraphClient = existingWearables(ON_CHAIN_WEARABLE_ID) - const { instance: offChain, mock: offChainMock } = offChainManagerWith(OFF_CHAIN_WEARABLE) - - const pagination = { limit: 1, lastId: undefined } - const filters = { textSearch: 'Something' } - const response = await getWearables(filters, pagination, contentClient, mockedGraphClient as any, offChain) - - expect(response.wearables.length).toEqual(1) - expect(response.lastId).toEqual(OFF_CHAIN_WEARABLE_ID) - expect(mockedGraphClient.findWearableUrnsByFilters).toHaveBeenCalledWith( - filters, - expect.objectContaining({ limit: 0, lastId: undefined }) - ) - verify(offChainMock.find(filters, undefined)).once() - verify(contentServerMock.fetchEntitiesByPointers(deepEqual([ON_CHAIN_WEARABLE_ID]))).once() + describe('when there is more data than the one returned', () => { + let contentClient: jest.Mocked + let mockedGraphClient: { findWearableUrnsByFilters: jest.Mock } + let offChain: jest.Mocked + + beforeEach(() => { + contentClient = contentServerThatReturns(ON_CHAIN_WEARABLE_ID) + mockedGraphClient = existingWearables(ON_CHAIN_WEARABLE_ID) + offChain = offChainManagerWith(OFF_CHAIN_WEARABLE) + }) + + afterEach(() => { + jest.resetAllMocks() + }) + + it('should include last id', async () => { + const pagination = { limit: 1, lastId: undefined } + const filters = { textSearch: 'Something' } + const response = await getWearables(filters, pagination, contentClient, mockedGraphClient as any, offChain) + + expect(response.wearables.length).toEqual(1) + expect(response.lastId).toEqual(OFF_CHAIN_WEARABLE_ID) + expect(mockedGraphClient.findWearableUrnsByFilters).toHaveBeenCalledWith( + filters, + expect.objectContaining({ limit: 0, lastId: undefined }) + ) + expect(offChain.find).toHaveBeenCalledWith(filters, undefined) + expect(offChain.find).toHaveBeenCalledTimes(1) + expect(contentClient.fetchEntitiesByPointers).toHaveBeenCalledWith([ON_CHAIN_WEARABLE_ID]) + expect(contentClient.fetchEntitiesByPointers).toHaveBeenCalledTimes(1) + }) + }) }) -function emptyContentServer() { +function emptyContentServer(): jest.Mocked { return contentServerThatReturns() } @@ -130,21 +206,17 @@ function expectWearablesToBe(response: { wearables: LambdasWearable[] }, ...expe expect(ids).toEqual(expectedIds) } -function emptyOffChainManager(): { instance: OffChainWearablesManager; mock: OffChainWearablesManager } { +function emptyOffChainManager(): jest.Mocked { return offChainManagerWith() } -function offChainManagerWith(...wearables: LambdasWearable[]): { - instance: OffChainWearablesManager - mock: OffChainWearablesManager -} { - const mockedManager = mock(OffChainWearablesManager) - when(mockedManager.find(anything())).thenResolve(wearables) - when(mockedManager.find(anything(), anything())).thenResolve(wearables) - return { instance: instance(mockedManager), mock: mockedManager } +function offChainManagerWith(...wearables: LambdasWearable[]): jest.Mocked { + return { + find: jest.fn().mockResolvedValue(wearables) + } as unknown as jest.Mocked } -function contentServerThatReturns(id?: WearableId) { +function contentServerThatReturns(id?: WearableId): jest.Mocked { const entity: Entity = { version: 'v3', id: '', @@ -160,9 +232,9 @@ function contentServerThatReturns(id?: WearableId) { thumbnail: undefined } } - const mockedClient = mock(SmartContentClient) - when(mockedClient.fetchEntitiesByPointers(anything())).thenResolve(id ? [entity] : []) - return { instance: instance(mockedClient), mock: mockedClient } + return { + fetchEntitiesByPointers: jest.fn().mockResolvedValue(id ? [entity] : []) + } as unknown as jest.Mocked } function noExistingWearables() { @@ -170,8 +242,7 @@ function noExistingWearables() { } function existingWearables(...existingWearables: WearableId[]) { - const mockedGraphClient = { + return { findWearableUrnsByFilters: jest.fn().mockResolvedValue(existingWearables) } - return mockedGraphClient } diff --git a/lambdas/test/apis/collections/off-chain/OffChainWearablesManager.spec.ts b/lambdas/test/apis/collections/off-chain/OffChainWearablesManager.spec.ts index 785d2f338..4a6b798e4 100644 --- a/lambdas/test/apis/collections/off-chain/OffChainWearablesManager.spec.ts +++ b/lambdas/test/apis/collections/off-chain/OffChainWearablesManager.spec.ts @@ -1,9 +1,18 @@ import { Entity, EntityType, WearableId } from '@dcl/schemas' -import { anything, deepEqual, instance, mock, objectContaining, resetCalls, verify, when } from 'ts-mockito' import { OffChainWearablesManager } from '../../../../src/apis/collections/off-chain/OffChainWearablesManager' import { LambdasWearable } from '../../../../src/apis/collections/types' import { SmartContentClient } from '../../../../src/utils/SmartContentClient' +/** + * Flushes the microtask queue by yielding to pending promises. + * Multiple awaits are needed because async operations may chain promises. + */ +async function flushPromises(): Promise { + await Promise.resolve() + await Promise.resolve() + await Promise.resolve() +} + const COLLECTION_ID_1 = 'some-collection' const COLLECTION_ID_2 = 'some-other-collection' const WEARABLE_ID_1 = `${COLLECTION_ID_1}-some-wearable` @@ -19,112 +28,229 @@ describe('OffChainWearablesManager', () => { afterAll(() => jest.useRealTimers()) - it(`When definitions are loaded for the first time, then content server is queried`, async () => { - const { instance: contentClient, mock: contentClientMock } = contentServer() - const manager = new OffChainWearablesManager({ client: contentClient, collections: COLLECTIONS, refreshTime: '2s' }) + describe('when definitions are loaded for the first time', () => { + let contentClient: jest.Mocked + + beforeEach(() => { + contentClient = contentServer() + }) + + afterEach(() => { + jest.resetAllMocks() + }) + + it('should query the content server', async () => { + const manager = new OffChainWearablesManager({ + client: contentClient, + collections: COLLECTIONS, + refreshTime: '2s' + }) - await manager.find({ collectionIds: [COLLECTION_ID_1] }) + await manager.find({ collectionIds: [COLLECTION_ID_1] }) - assertContentServerWasCalledOnceWithIds(contentClientMock, WEARABLE_ID_1, WEARABLE_ID_2) - assertContentServerWasCalledOnceWithIds(contentClientMock, WEARABLE_ID_3) + expect(contentClient.fetchEntitiesByPointers).toHaveBeenCalledWith([WEARABLE_ID_1, WEARABLE_ID_2]) + expect(contentClient.fetchEntitiesByPointers).toHaveBeenCalledWith([WEARABLE_ID_3]) + }) }) - it(`When expire time ends, then the content server is called again`, async () => { - const { instance: contentClient, mock: contentClientMock } = contentServer() - const manager = new OffChainWearablesManager({ client: contentClient, collections: COLLECTIONS, refreshTime: '2s' }) + describe('when expire time ends', () => { + let contentClient: jest.Mocked + + beforeEach(() => { + contentClient = contentServer() + }) + + afterEach(() => { + jest.resetAllMocks() + }) + + it('should call the content server again', async () => { + const manager = new OffChainWearablesManager({ + client: contentClient, + collections: COLLECTIONS, + refreshTime: '2s' + }) - await manager.find({ collectionIds: [COLLECTION_ID_1] }) + await manager.find({ collectionIds: [COLLECTION_ID_1] }) - assertContentServerWasCalledOnceWithIds(contentClientMock, WEARABLE_ID_1, WEARABLE_ID_2) - assertContentServerWasCalledOnceWithIds(contentClientMock, WEARABLE_ID_3) + expect(contentClient.fetchEntitiesByPointers).toHaveBeenCalledWith([WEARABLE_ID_1, WEARABLE_ID_2]) + expect(contentClient.fetchEntitiesByPointers).toHaveBeenCalledWith([WEARABLE_ID_3]) - resetCalls(contentClientMock) - jest.runOnlyPendingTimers() - // Althouth the find method isn't the one that triggers the update, it is needed for process to run the next tick - await manager.find({ collectionIds: [COLLECTION_ID_1] }) - assertContentServerWasCalledOnceWithIds(contentClientMock, WEARABLE_ID_1, WEARABLE_ID_2) - assertContentServerWasCalledOnceWithIds(contentClientMock, WEARABLE_ID_3) + contentClient.fetchEntitiesByPointers.mockClear() + jest.runOnlyPendingTimers() + // Although the find method isn't the one that triggers the update, it is needed for process to run the next tick + await manager.find({ collectionIds: [COLLECTION_ID_1] }) + expect(contentClient.fetchEntitiesByPointers).toHaveBeenCalledWith([WEARABLE_ID_1, WEARABLE_ID_2]) + expect(contentClient.fetchEntitiesByPointers).toHaveBeenCalledWith([WEARABLE_ID_3]) + }) }) - it(`When expire time ends, new objects are fetched from the content server`, async () => { - jest.useFakeTimers('legacy') - const contentClientMock = mock(SmartContentClient) - const contentClient = instance(contentClientMock) - const t1 = 1 - const t2 = 2 - - when(contentClientMock.fetchEntitiesByPointers(objectContaining([WEARABLE_ID_3]))) - .thenResolve([buildEntityWithTimestampInMetadata(WEARABLE_ID_3, t1)]) - .thenResolve([buildEntityWithTimestampInMetadata(WEARABLE_ID_3, t2)]) - - const manager = new OffChainWearablesManager({ - client: contentClient, - collections: { [COLLECTION_ID_2]: [WEARABLE_ID_3] }, - refreshTime: '2s' - }) - - const firstWearables = await manager.find({ collectionIds: [COLLECTION_ID_2] }) - expect(firstWearables.length).toBe(1) - expect(firstWearables[0].id).toBe(WEARABLE_ID_3) - expect(firstWearables[0]['timestamp']).toBe(t1) - - resetCalls(contentClientMock) - jest.advanceTimersByTime(2000) - // Needed to finish the promise in the TimeRefreshedDataHolder that calls the content server - await new Promise(process.nextTick) - const secondWearables = await manager.find({ collectionIds: [COLLECTION_ID_2] }) - expect(secondWearables.length).toBe(1) - expect(secondWearables[0].id).toBe(WEARABLE_ID_3) - expect(secondWearables[0]['timestamp']).toBe(t2) + describe('when expire time ends and new objects need to be fetched', () => { + let contentClientMock: jest.Mocked + let t1: number + let t2: number + + beforeEach(() => { + t1 = 1 + t2 = 2 + contentClientMock = { + fetchEntitiesByPointers: jest + .fn() + .mockResolvedValueOnce([buildEntityWithTimestampInMetadata(WEARABLE_ID_3, t1)]) + .mockResolvedValueOnce([buildEntityWithTimestampInMetadata(WEARABLE_ID_3, t2)]) + } as unknown as jest.Mocked + }) + + afterEach(() => { + jest.resetAllMocks() + }) + + it('should fetch new objects from the content server', async () => { + const manager = new OffChainWearablesManager({ + client: contentClientMock, + collections: { [COLLECTION_ID_2]: [WEARABLE_ID_3] }, + refreshTime: '2s' + }) + + const firstWearables = await manager.find({ collectionIds: [COLLECTION_ID_2] }) + expect(firstWearables.length).toBe(1) + expect(firstWearables[0].id).toBe(WEARABLE_ID_3) + expect(firstWearables[0]['timestamp']).toBe(t1) + + // Advance timers to trigger the refresh and flush pending async operations + jest.advanceTimersByTime(2000) + await flushPromises() + + const secondWearables = await manager.find({ collectionIds: [COLLECTION_ID_2] }) + expect(secondWearables.length).toBe(1) + expect(secondWearables[0].id).toBe(WEARABLE_ID_3) + expect(secondWearables[0]['timestamp']).toBe(t2) + }) }) - it(`When multiple requests happen concurrently, then definition is only calculated once`, async () => { - const { instance: contentClient, mock: contentClientMock } = contentServer() - const manager = new OffChainWearablesManager({ client: contentClient, collections: COLLECTIONS, refreshTime: '2s' }) + describe('when multiple requests happen concurrently', () => { + let contentClient: jest.Mocked - await Promise.all([ - manager.find({ collectionIds: [COLLECTION_ID_1] }), - manager.find({ collectionIds: [COLLECTION_ID_2] }) - ]) + beforeEach(() => { + contentClient = contentServer() + }) + + afterEach(() => { + jest.resetAllMocks() + }) - assertContentServerWasCalledOnceWithIds(contentClientMock, WEARABLE_ID_1, WEARABLE_ID_2) - assertContentServerWasCalledOnceWithIds(contentClientMock, WEARABLE_ID_3) + it('should calculate definition only once', async () => { + const manager = new OffChainWearablesManager({ + client: contentClient, + collections: COLLECTIONS, + refreshTime: '2s' + }) + + await Promise.all([ + manager.find({ collectionIds: [COLLECTION_ID_1] }), + manager.find({ collectionIds: [COLLECTION_ID_2] }) + ]) + + expect(contentClient.fetchEntitiesByPointers).toHaveBeenCalledWith([WEARABLE_ID_1, WEARABLE_ID_2]) + expect(contentClient.fetchEntitiesByPointers).toHaveBeenCalledWith([WEARABLE_ID_3]) + expect(contentClient.fetchEntitiesByPointers).toHaveBeenCalledTimes(2) + }) }) - it(`When the collection id filter is used, then wearables are filtered correctly`, async () => { - const { instance: contentClient } = contentServer() - const manager = new OffChainWearablesManager({ client: contentClient, collections: COLLECTIONS, refreshTime: '2s' }) + describe('when the collection id filter is used', () => { + let contentClient: jest.Mocked + + beforeEach(() => { + contentClient = contentServer() + }) + + afterEach(() => { + jest.resetAllMocks() + }) + + it('should filter wearables correctly', async () => { + const manager = new OffChainWearablesManager({ + client: contentClient, + collections: COLLECTIONS, + refreshTime: '2s' + }) - const wearables = await manager.find({ collectionIds: [COLLECTION_ID_1] }) + const wearables = await manager.find({ collectionIds: [COLLECTION_ID_1] }) - assertReturnWearablesAre(wearables, WEARABLE_ID_1, WEARABLE_ID_2) + assertReturnWearablesAre(wearables, WEARABLE_ID_1, WEARABLE_ID_2) + }) }) - it(`When the wearable id filter is used, then wearables are filtered correctly`, async () => { - const { instance: contentClient } = contentServer() - const manager = new OffChainWearablesManager({ client: contentClient, collections: COLLECTIONS, refreshTime: '2s' }) + describe('when the wearable id filter is used', () => { + let contentClient: jest.Mocked - const wearables = await manager.find({ itemIds: [WEARABLE_ID_2, WEARABLE_ID_3] }) + beforeEach(() => { + contentClient = contentServer() + }) + + afterEach(() => { + jest.resetAllMocks() + }) - assertReturnWearablesAre(wearables, WEARABLE_ID_2, WEARABLE_ID_3) + it('should filter wearables correctly', async () => { + const manager = new OffChainWearablesManager({ + client: contentClient, + collections: COLLECTIONS, + refreshTime: '2s' + }) + + const wearables = await manager.find({ itemIds: [WEARABLE_ID_2, WEARABLE_ID_3] }) + + assertReturnWearablesAre(wearables, WEARABLE_ID_2, WEARABLE_ID_3) + }) }) - it(`When the text search filter is used, then wearables are filtered correctly`, async () => { - const { instance: contentClient } = contentServer() - const manager = new OffChainWearablesManager({ client: contentClient, collections: COLLECTIONS, refreshTime: '2s' }) + describe('when the text search filter is used', () => { + let contentClient: jest.Mocked - const wearables = await manager.find({ textSearch: 'other' }) + beforeEach(() => { + contentClient = contentServer() + }) + + afterEach(() => { + jest.resetAllMocks() + }) - assertReturnWearablesAre(wearables, WEARABLE_ID_2, WEARABLE_ID_3) + it('should filter wearables correctly', async () => { + const manager = new OffChainWearablesManager({ + client: contentClient, + collections: COLLECTIONS, + refreshTime: '2s' + }) + + const wearables = await manager.find({ textSearch: 'other' }) + + assertReturnWearablesAre(wearables, WEARABLE_ID_2, WEARABLE_ID_3) + }) }) - it(`When multiple filters are used, then wearables are filtered correctly`, async () => { - const { instance: contentClient } = contentServer() - const manager = new OffChainWearablesManager({ client: contentClient, collections: COLLECTIONS, refreshTime: '2s' }) + describe('when multiple filters are used', () => { + let contentClient: jest.Mocked + + beforeEach(() => { + contentClient = contentServer() + }) + + afterEach(() => { + jest.resetAllMocks() + }) + + it('should filter wearables correctly', async () => { + const manager = new OffChainWearablesManager({ + client: contentClient, + collections: COLLECTIONS, + refreshTime: '2s' + }) - const wearables = await manager.find({ textSearch: 'other', collectionIds: [COLLECTION_ID_1] }) + const wearables = await manager.find({ textSearch: 'other', collectionIds: [COLLECTION_ID_1] }) - assertReturnWearablesAre(wearables, WEARABLE_ID_2) + assertReturnWearablesAre(wearables, WEARABLE_ID_2) + }) }) }) @@ -133,16 +259,12 @@ function assertReturnWearablesAre(wearables: LambdasWearable[], ...ids: Wearable expect(returnedIds).toEqual(new Set(ids)) } -function assertContentServerWasCalledOnceWithIds(contentClient: SmartContentClient, ...ids: WearableId[]) { - verify(contentClient.fetchEntitiesByPointers(deepEqual(ids))).once() -} - -function contentServer() { - const mockedClient = mock(SmartContentClient) - when(mockedClient.fetchEntitiesByPointers(anything())).thenCall((ids) => - Promise.resolve(ids.map((id) => buildEntity(id))) - ) - return { instance: instance(mockedClient), mock: mockedClient } +function contentServer(): jest.Mocked { + return { + fetchEntitiesByPointers: jest + .fn() + .mockImplementation((ids: string[]) => Promise.resolve(ids.map((id) => buildEntity(id)))) + } as unknown as jest.Mocked } function buildEntity(id: WearableId) { diff --git a/lambdas/test/apis/profiles/controller/profiles.spec.ts b/lambdas/test/apis/profiles/controller/profiles.spec.ts index f98307c88..c199b90be 100644 --- a/lambdas/test/apis/profiles/controller/profiles.spec.ts +++ b/lambdas/test/apis/profiles/controller/profiles.spec.ts @@ -1,13 +1,11 @@ import { EthAddress } from '@dcl/crypto' import { Entity, EntityType, WearableId } from '@dcl/schemas' -import { anything, instance, mock, when } from 'ts-mockito' import { EmotesOwnership } from '../../../../src/apis/profiles/EmotesOwnership' import { EnsOwnership } from '../../../../src/apis/profiles/EnsOwnership' import { NFTOwnership } from '../../../../src/apis/profiles/NFTOwnership' import { WearablesOwnership } from '../../../../src/apis/profiles/WearablesOwnership' import * as pfs from '../../../../src/apis/profiles/controllers/profiles' import * as tpOwnership from '../../../../src/apis/profiles/tp-wearables-ownership' -import * as tpUrnFinder from '../../../../src/logic/third-party-urn-finder' import { TheGraphClient } from '../../../../src/ports/the-graph/types' import { SmartContentClient } from '../../../../src/utils/SmartContentClient' @@ -19,241 +17,443 @@ describe('profiles', () => { const WEARABLE_ID_1 = 'someCollection-someWearable' const TPW_ID = 'urn:decentraland:mumbai:collections-thirdparty:jean-pier:testing-deployment-6:eed7e679-4b5b-455a-a76b-7ce6c0e3bee3' - const theGraphClient = theGraph() - const thirdPartyFetcher = { fetchAssets: () => Promise.resolve([]) } - - it(`When profiles are fetched and NFTs are owned, then the returned profile is the same as the content server`, async () => { - const { entity, metadata } = profileWith(SOME_ADDRESS, { name: SOME_NAME, wearables: [WEARABLE_ID_1], emotes: [] }) - const client = contentServerThatReturns(entity) - const ensOwnership = ownedNFTs(EnsOwnership, SOME_ADDRESS, SOME_NAME) - const wearablesOwnership = ownedNFTs(WearablesOwnership, SOME_ADDRESS, WEARABLE_ID_1) - const emotesOwnership = ownedNFTs(EmotesOwnership, SOME_ADDRESS, WEARABLE_ID_1) - - const profiles = (await pfs.fetchProfiles( - [SOME_ADDRESS], - theGraphClient, - client, - ensOwnership, - wearablesOwnership, - emotesOwnership, - thirdPartyFetcher - ))! - - expect(profiles.length).toEqual(1) - expect(profiles[0]).toEqual(metadata) - }) - it(`When the current name is not owned, then it says so in the profile`, async () => { - const { entity } = profileWith(SOME_ADDRESS, { name: SOME_NAME }) - const client = contentServerThatReturns(entity) - const ensOwnership = noNFTs(EnsOwnership) - const wearablesOwnership = noNFTs(WearablesOwnership) - const emotesOwnership = ownedNFTs(EmotesOwnership, SOME_ADDRESS, WEARABLE_ID_1) - - const profiles = (await pfs.fetchProfiles( - [SOME_ADDRESS], - theGraphClient, - client, - ensOwnership, - wearablesOwnership, - emotesOwnership, - thirdPartyFetcher - ))! - - expect(profiles.length).toEqual(1) - expect(profiles[0].avatars[0].name).toEqual(SOME_NAME) - expect(profiles[0].avatars[0].hasClaimedName).toEqual(false) + afterEach(() => { + jest.resetAllMocks() }) - it(`When some of the worn wearables are not owned, then they are filtered out`, async () => { - const { entity } = profileWith(SOME_ADDRESS, { wearables: [WEARABLE_ID_1] }) - const client = contentServerThatReturns(entity) - const ensOwnership = noNFTs(EnsOwnership) - const wearablesOwnership = noNFTs(WearablesOwnership) - const emotesOwnership = ownedNFTs(EmotesOwnership, SOME_ADDRESS, WEARABLE_ID_1) - - const profiles = (await pfs.fetchProfiles( - [SOME_ADDRESS], - theGraphClient, - client, - ensOwnership, - wearablesOwnership, - emotesOwnership, - thirdPartyFetcher - ))! - - expect(profiles.length).toEqual(1) - expect(profiles[0].avatars[0].avatar.wearables.length).toEqual(0) + describe('when profiles are fetched and NFTs are owned', () => { + let entity: Entity + let metadata: pfs.ProfileMetadata + let client: jest.Mocked + let ensOwnership: jest.Mocked + let wearablesOwnership: jest.Mocked + let emotesOwnership: jest.Mocked + let theGraphClient: TheGraphClient + let thirdPartyFetcher: { fetchAssets: () => Promise } + + beforeEach(() => { + const profile = profileWith(SOME_ADDRESS, { name: SOME_NAME, wearables: [WEARABLE_ID_1], emotes: [] }) + entity = profile.entity + metadata = profile.metadata + client = contentServerThatReturns(entity) + ensOwnership = ownedNFTs(SOME_ADDRESS, SOME_NAME) + wearablesOwnership = ownedNFTs(SOME_ADDRESS, WEARABLE_ID_1) + emotesOwnership = ownedNFTs(SOME_ADDRESS, WEARABLE_ID_1) + theGraphClient = theGraph() + thirdPartyFetcher = { fetchAssets: () => Promise.resolve([]) } + }) + + afterEach(() => { + jest.resetAllMocks() + }) + + it('should return the same profile as the content server', async () => { + const profiles = (await pfs.fetchProfiles( + [SOME_ADDRESS], + theGraphClient, + client, + ensOwnership, + wearablesOwnership, + emotesOwnership, + thirdPartyFetcher + ))! + + expect(profiles.length).toEqual(1) + expect(profiles[0]).toEqual(metadata) + }) }) - it(`When having TPW owned, then they are shown`, async () => { - const { entity, metadata } = profileWith(SOME_ADDRESS, { name: SOME_NAME, wearables: [TPW_ID], emotes: [] }) - const client = contentServerThatReturns(entity) - const ensOwnership = ownedNFTs(EnsOwnership, SOME_ADDRESS, SOME_NAME) - const wearablesOwnership = noNFTs(WearablesOwnership) - const tpWearablesOwnership = jest.spyOn(tpOwnership, 'checkForThirdPartyWearablesOwnership') - tpWearablesOwnership.mockReturnValue(Promise.resolve(new Map([[SOME_ADDRESS, [TPW_ID]]]))) - const emotesOwnership = ownedNFTs(EmotesOwnership, SOME_ADDRESS, WEARABLE_ID_1) - - const profiles = (await pfs.fetchProfiles( - [SOME_ADDRESS], - theGraphClient, - client, - ensOwnership, - wearablesOwnership, - emotesOwnership, - thirdPartyFetcher - ))! - - expect(profiles.length).toEqual(1) - expect(profiles[0]).toEqual(metadata) + describe('when the current name is not owned', () => { + let entity: Entity + let client: jest.Mocked + let ensOwnership: jest.Mocked + let wearablesOwnership: jest.Mocked + let emotesOwnership: jest.Mocked + let theGraphClient: TheGraphClient + let thirdPartyFetcher: { fetchAssets: () => Promise } + + beforeEach(() => { + const profile = profileWith(SOME_ADDRESS, { name: SOME_NAME }) + entity = profile.entity + client = contentServerThatReturns(entity) + ensOwnership = noNFTs() + wearablesOwnership = noNFTs() + emotesOwnership = ownedNFTs(SOME_ADDRESS, WEARABLE_ID_1) + theGraphClient = theGraph() + thirdPartyFetcher = { fetchAssets: () => Promise.resolve([]) } + }) + + afterEach(() => { + jest.resetAllMocks() + }) + + it('should say so in the profile', async () => { + const profiles = (await pfs.fetchProfiles( + [SOME_ADDRESS], + theGraphClient, + client, + ensOwnership, + wearablesOwnership, + emotesOwnership, + thirdPartyFetcher + ))! + + expect(profiles.length).toEqual(1) + expect(profiles[0].avatars[0].name).toEqual(SOME_NAME) + expect(profiles[0].avatars[0].hasClaimedName).toEqual(false) + }) }) - it(`When having non-urn items, then they are removed without logging an error`, async () => { - const { entity, metadata } = profileWith(SOME_ADDRESS, { - name: SOME_NAME, - wearables: ['hammer', TPW_ID] - }) - const client = contentServerThatReturns(entity) - const ensOwnership = ownedNFTs(EnsOwnership, SOME_ADDRESS, SOME_NAME) - const wearablesOwnership = noNFTs(WearablesOwnership) - const tpUrnFinderMock = jest.spyOn(tpUrnFinder, 'findThirdPartyItemUrns') - tpUrnFinderMock.mockReturnValue(Promise.resolve([TPW_ID])) - const emotesOwnership = ownedNFTs(EmotesOwnership, SOME_ADDRESS, WEARABLE_ID_1) - - const profiles = (await pfs.fetchProfiles( - [SOME_ADDRESS], - theGraphClient, - client, - ensOwnership, - wearablesOwnership, - emotesOwnership, - thirdPartyFetcher - ))! - - expect(profiles.length).toEqual(1) - metadata.avatars[0].avatar.wearables = [TPW_ID] - expect(profiles[0]).toEqual(metadata) + describe('when some of the worn wearables are not owned', () => { + let entity: Entity + let client: jest.Mocked + let ensOwnership: jest.Mocked + let wearablesOwnership: jest.Mocked + let emotesOwnership: jest.Mocked + let theGraphClient: TheGraphClient + let thirdPartyFetcher: { fetchAssets: () => Promise } + + beforeEach(() => { + const profile = profileWith(SOME_ADDRESS, { wearables: [WEARABLE_ID_1] }) + entity = profile.entity + client = contentServerThatReturns(entity) + ensOwnership = noNFTs() + wearablesOwnership = noNFTs() + emotesOwnership = ownedNFTs(SOME_ADDRESS, WEARABLE_ID_1) + theGraphClient = theGraph() + thirdPartyFetcher = { fetchAssets: () => Promise.resolve([]) } + }) + + afterEach(() => { + jest.resetAllMocks() + }) + + it('should filter them out', async () => { + const profiles = (await pfs.fetchProfiles( + [SOME_ADDRESS], + theGraphClient, + client, + ensOwnership, + wearablesOwnership, + emotesOwnership, + thirdPartyFetcher + ))! + + expect(profiles.length).toEqual(1) + expect(profiles[0].avatars[0].avatar.wearables.length).toEqual(0) + }) }) - it(`When some of the 3TPW worn wearables are not owned, then they are filtered out`, async () => { - const { entity } = profileWith(SOME_ADDRESS, { wearables: [TPW_ID] }) - const client = contentServerThatReturns(entity) - const ensOwnership = noNFTs(EnsOwnership) - const wearablesOwnership = noNFTs(WearablesOwnership) - const tpWearablesOwnership = jest.spyOn(tpOwnership, 'checkForThirdPartyWearablesOwnership') - tpWearablesOwnership.mockReturnValue(Promise.resolve(new Map())) - const emotesOwnership = ownedNFTs(EmotesOwnership, SOME_ADDRESS, WEARABLE_ID_1) - - const profiles = (await pfs.fetchProfiles( - [SOME_ADDRESS], - theGraphClient, - client, - ensOwnership, - wearablesOwnership, - emotesOwnership, - thirdPartyFetcher - ))! - - expect(profiles.length).toEqual(1) - expect(profiles[0].avatars[0].avatar.wearables.length).toEqual(0) + describe('when having TPW owned', () => { + let entity: Entity + let metadata: pfs.ProfileMetadata + let client: jest.Mocked + let ensOwnership: jest.Mocked + let wearablesOwnership: jest.Mocked + let emotesOwnership: jest.Mocked + let theGraphClient: TheGraphClient + let thirdPartyFetcher: { fetchAssets: () => Promise } + + beforeEach(() => { + const profile = profileWith(SOME_ADDRESS, { name: SOME_NAME, wearables: [TPW_ID], emotes: [] }) + entity = profile.entity + metadata = profile.metadata + client = contentServerThatReturns(entity) + ensOwnership = ownedNFTs(SOME_ADDRESS, SOME_NAME) + wearablesOwnership = noNFTs() + emotesOwnership = ownedNFTs(SOME_ADDRESS, WEARABLE_ID_1) + theGraphClient = theGraph() + thirdPartyFetcher = { fetchAssets: () => Promise.resolve([]) } + jest + .spyOn(tpOwnership, 'checkForThirdPartyWearablesOwnership') + .mockResolvedValue(new Map([[SOME_ADDRESS, [TPW_ID]]])) + }) + + afterEach(() => { + jest.resetAllMocks() + }) + + it('should show them', async () => { + const profiles = (await pfs.fetchProfiles( + [SOME_ADDRESS], + theGraphClient, + client, + ensOwnership, + wearablesOwnership, + emotesOwnership, + thirdPartyFetcher + ))! + + expect(profiles.length).toEqual(1) + expect(profiles[0]).toEqual(metadata) + }) }) - it(`When the is no profile with that address, then an empty list is returned`, async () => { - const client = contentServerThatReturns() - const ensOwnership = noNFTs(EnsOwnership) - const wearablesOwnership = noNFTs(WearablesOwnership) - const emotesOwnership = ownedNFTs(EmotesOwnership, SOME_ADDRESS, WEARABLE_ID_1) - - const profiles = (await pfs.fetchProfiles( - [SOME_ADDRESS], - theGraphClient, - client, - ensOwnership, - wearablesOwnership, - emotesOwnership, - thirdPartyFetcher - ))! - - expect(profiles.length).toEqual(0) + describe('when having non-urn items', () => { + let entity: Entity + let metadata: pfs.ProfileMetadata + let client: jest.Mocked + let ensOwnership: jest.Mocked + let wearablesOwnership: jest.Mocked + let emotesOwnership: jest.Mocked + let theGraphClient: TheGraphClient + let thirdPartyFetcher: { fetchAssets: () => Promise } + + beforeEach(() => { + const profile = profileWith(SOME_ADDRESS, { + name: SOME_NAME, + wearables: ['hammer', TPW_ID] + }) + entity = profile.entity + metadata = profile.metadata + client = contentServerThatReturns(entity) + ensOwnership = ownedNFTs(SOME_ADDRESS, SOME_NAME) + wearablesOwnership = noNFTs() + emotesOwnership = ownedNFTs(SOME_ADDRESS, WEARABLE_ID_1) + theGraphClient = theGraph() + thirdPartyFetcher = { fetchAssets: () => Promise.resolve([]) } + jest + .spyOn(tpOwnership, 'checkForThirdPartyWearablesOwnership') + .mockResolvedValue(new Map([[SOME_ADDRESS, [TPW_ID]]])) + }) + + afterEach(() => { + jest.resetAllMocks() + }) + + it('should remove them without logging an error', async () => { + const profiles = (await pfs.fetchProfiles( + [SOME_ADDRESS], + theGraphClient, + client, + ensOwnership, + wearablesOwnership, + emotesOwnership, + thirdPartyFetcher + ))! + + expect(profiles.length).toEqual(1) + metadata.avatars[0].avatar.wearables = [TPW_ID] + expect(profiles[0]).toEqual(metadata) + }) }) - it(`When profiles are returned, external urls are added to snapshots`, async () => { - const { entity } = profileWith(SOME_ADDRESS, { snapshots: { aKey: 'aHash' } }) - const client = contentServerThatReturns(entity) - const ensOwnership = noNFTs(EnsOwnership) - const wearablesOwnership = noNFTs(WearablesOwnership) - const emotesOwnership = ownedNFTs(EmotesOwnership, SOME_ADDRESS, WEARABLE_ID_1) - - const profiles = (await pfs.fetchProfiles( - [SOME_ADDRESS], - theGraphClient, - client, - ensOwnership, - wearablesOwnership, - emotesOwnership, - thirdPartyFetcher - ))! - - expect(profiles.length).toEqual(1) - expect(profiles[0].avatars[0].avatar.snapshots.aKey).toEqual(`${EXTERNAL_URL}/contents/aHash`) + describe('when some of the 3TPW worn wearables are not owned', () => { + let entity: Entity + let client: jest.Mocked + let ensOwnership: jest.Mocked + let wearablesOwnership: jest.Mocked + let emotesOwnership: jest.Mocked + let theGraphClient: TheGraphClient + let thirdPartyFetcher: { fetchAssets: () => Promise } + + beforeEach(() => { + const profile = profileWith(SOME_ADDRESS, { wearables: [TPW_ID] }) + entity = profile.entity + client = contentServerThatReturns(entity) + ensOwnership = noNFTs() + wearablesOwnership = noNFTs() + emotesOwnership = ownedNFTs(SOME_ADDRESS, WEARABLE_ID_1) + theGraphClient = theGraph() + thirdPartyFetcher = { fetchAssets: () => Promise.resolve([]) } + jest.spyOn(tpOwnership, 'checkForThirdPartyWearablesOwnership').mockResolvedValue(new Map()) + }) + + afterEach(() => { + jest.resetAllMocks() + }) + + it('should filter them out', async () => { + const profiles = (await pfs.fetchProfiles( + [SOME_ADDRESS], + theGraphClient, + client, + ensOwnership, + wearablesOwnership, + emotesOwnership, + thirdPartyFetcher + ))! + + expect(profiles.length).toEqual(1) + expect(profiles[0].avatars[0].avatar.wearables.length).toEqual(0) + }) }) - it(`When the snapshot references a content file, external urls pointing to the hash are added to snapshots`, async () => { - const { entity } = profileWith(SOME_ADDRESS, { - snapshots: { aKey: './file' }, - content: { file: './file', hash: 'fileHash' } - }) - const client = contentServerThatReturns(entity) - const ensOwnership = noNFTs(EnsOwnership) - const wearablesOwnership = noNFTs(WearablesOwnership) - const emotesOwnership = ownedNFTs(EmotesOwnership, SOME_ADDRESS, WEARABLE_ID_1) - - const profiles = (await pfs.fetchProfiles( - [SOME_ADDRESS], - theGraphClient, - client, - ensOwnership, - wearablesOwnership, - emotesOwnership, - thirdPartyFetcher - ))! - - expect(profiles.length).toEqual(1) - expect(profiles[0].avatars[0].avatar.snapshots.aKey).toEqual(`${EXTERNAL_URL}/contents/fileHash`) + describe('when there is no profile with that address', () => { + let client: jest.Mocked + let ensOwnership: jest.Mocked + let wearablesOwnership: jest.Mocked + let emotesOwnership: jest.Mocked + let theGraphClient: TheGraphClient + let thirdPartyFetcher: { fetchAssets: () => Promise } + + beforeEach(() => { + client = contentServerThatReturns() + ensOwnership = noNFTs() + wearablesOwnership = noNFTs() + emotesOwnership = ownedNFTs(SOME_ADDRESS, WEARABLE_ID_1) + theGraphClient = theGraph() + thirdPartyFetcher = { fetchAssets: () => Promise.resolve([]) } + }) + + afterEach(() => { + jest.resetAllMocks() + }) + + it('should return an empty list', async () => { + const profiles = (await pfs.fetchProfiles( + [SOME_ADDRESS], + theGraphClient, + client, + ensOwnership, + wearablesOwnership, + emotesOwnership, + thirdPartyFetcher + ))! + + expect(profiles.length).toEqual(0) + }) }) - it(`When an ifModifiedSince timestamp is provided and it is after the profile's last update, pfs.fetchProfiles returns undefined`, async () => { - const { entity } = profileWith(SOME_ADDRESS, { name: SOME_NAME, wearables: [WEARABLE_ID_1] }) - const client = contentServerThatReturns(entity) - const ensOwnership = ownedNFTs(EnsOwnership, SOME_ADDRESS, SOME_NAME) - const wearablesOwnership = ownedNFTs(WearablesOwnership, SOME_ADDRESS, WEARABLE_ID_1) - const emotesOwnership = ownedNFTs(EmotesOwnership, SOME_ADDRESS, WEARABLE_ID_1) + describe('when profiles are returned', () => { + let entity: Entity + let client: jest.Mocked + let ensOwnership: jest.Mocked + let wearablesOwnership: jest.Mocked + let emotesOwnership: jest.Mocked + let theGraphClient: TheGraphClient + let thirdPartyFetcher: { fetchAssets: () => Promise } + + beforeEach(() => { + const profile = profileWith(SOME_ADDRESS, { snapshots: { aKey: 'aHash' } }) + entity = profile.entity + client = contentServerThatReturns(entity) + ensOwnership = noNFTs() + wearablesOwnership = noNFTs() + emotesOwnership = ownedNFTs(SOME_ADDRESS, WEARABLE_ID_1) + theGraphClient = theGraph() + thirdPartyFetcher = { fetchAssets: () => Promise.resolve([]) } + jest.spyOn(tpOwnership, 'checkForThirdPartyWearablesOwnership').mockResolvedValue(new Map()) + }) - expect( - await pfs.fetchProfiles( + afterEach(() => { + jest.resetAllMocks() + }) + + it('should add external urls to snapshots', async () => { + const profiles = (await pfs.fetchProfiles( [SOME_ADDRESS], theGraphClient, client, ensOwnership, wearablesOwnership, emotesOwnership, - thirdPartyFetcher, - 2000 - ) - ).toBe(undefined) - expect( - await pfs.fetchProfiles( + thirdPartyFetcher + ))! + + expect(profiles.length).toEqual(1) + expect(profiles[0].avatars[0].avatar.snapshots.aKey).toEqual(`${EXTERNAL_URL}/contents/aHash`) + }) + }) + + describe('when the snapshot references a content file', () => { + let entity: Entity + let client: jest.Mocked + let ensOwnership: jest.Mocked + let wearablesOwnership: jest.Mocked + let emotesOwnership: jest.Mocked + let theGraphClient: TheGraphClient + let thirdPartyFetcher: { fetchAssets: () => Promise } + + beforeEach(() => { + const profile = profileWith(SOME_ADDRESS, { + snapshots: { aKey: './file' }, + content: { file: './file', hash: 'fileHash' } + }) + entity = profile.entity + client = contentServerThatReturns(entity) + ensOwnership = noNFTs() + wearablesOwnership = noNFTs() + emotesOwnership = ownedNFTs(SOME_ADDRESS, WEARABLE_ID_1) + theGraphClient = theGraph() + thirdPartyFetcher = { fetchAssets: () => Promise.resolve([]) } + jest.spyOn(tpOwnership, 'checkForThirdPartyWearablesOwnership').mockResolvedValue(new Map()) + }) + + afterEach(() => { + jest.resetAllMocks() + }) + + it('should add external urls pointing to the hash to snapshots', async () => { + const profiles = (await pfs.fetchProfiles( [SOME_ADDRESS], theGraphClient, client, ensOwnership, wearablesOwnership, emotesOwnership, - thirdPartyFetcher, - 3000 - ) - ).toBe(undefined) + thirdPartyFetcher + ))! + + expect(profiles.length).toEqual(1) + expect(profiles[0].avatars[0].avatar.snapshots.aKey).toEqual(`${EXTERNAL_URL}/contents/fileHash`) + }) + }) + + describe('when an ifModifiedSince timestamp is provided and it is after the profile last update', () => { + let entity: Entity + let client: jest.Mocked + let ensOwnership: jest.Mocked + let wearablesOwnership: jest.Mocked + let emotesOwnership: jest.Mocked + let theGraphClient: TheGraphClient + let thirdPartyFetcher: { fetchAssets: () => Promise } + + beforeEach(() => { + const profile = profileWith(SOME_ADDRESS, { name: SOME_NAME, wearables: [WEARABLE_ID_1] }) + entity = profile.entity + client = contentServerThatReturns(entity) + ensOwnership = ownedNFTs(SOME_ADDRESS, SOME_NAME) + wearablesOwnership = ownedNFTs(SOME_ADDRESS, WEARABLE_ID_1) + emotesOwnership = ownedNFTs(SOME_ADDRESS, WEARABLE_ID_1) + theGraphClient = theGraph() + thirdPartyFetcher = { fetchAssets: () => Promise.resolve([]) } + }) + + afterEach(() => { + jest.resetAllMocks() + }) + + it('should return undefined for timestamp 2000', async () => { + expect( + await pfs.fetchProfiles( + [SOME_ADDRESS], + theGraphClient, + client, + ensOwnership, + wearablesOwnership, + emotesOwnership, + thirdPartyFetcher, + 2000 + ) + ).toBe(undefined) + }) + + it('should return undefined for timestamp 3000', async () => { + expect( + await pfs.fetchProfiles( + [SOME_ADDRESS], + theGraphClient, + client, + ensOwnership, + wearablesOwnership, + emotesOwnership, + thirdPartyFetcher, + 3000 + ) + ).toBe(undefined) + }) }) }) @@ -301,11 +501,11 @@ function profileWith( return { entity, metadata } } -function contentServerThatReturns(profile?: Entity): SmartContentClient { - const mockedClient = mock(SmartContentClient) - when(mockedClient.fetchEntitiesByPointers(anything())).thenResolve(profile ? [profile] : []) - when(mockedClient.getExternalContentServerUrl()).thenReturn(EXTERNAL_URL) - return instance(mockedClient) +function contentServerThatReturns(profile?: Entity): jest.Mocked { + return { + fetchEntitiesByPointers: jest.fn().mockResolvedValue(profile ? [profile] : []), + getExternalContentServerUrl: jest.fn().mockReturnValue(EXTERNAL_URL) + } as unknown as jest.Mocked } function theGraph(): TheGraphClient { @@ -323,30 +523,26 @@ function theGraph(): TheGraphClient { } } -function noNFTs(clazz: new (...args: any[]) => T): T { - const mockedOwnership = mock(clazz) - when(mockedOwnership.areNFTsOwned(anything())).thenCall((names: Map) => { - const entries = Array.from(names.entries()).map<[EthAddress, Map]>(([address, names]) => [ - address, - new Map(names.map((name) => [name, false])) - ]) - return Promise.resolve(new Map(entries)) - }) - return instance(mockedOwnership) +function noNFTs(): jest.Mocked { + return { + areNFTsOwned: jest.fn().mockImplementation((nftsToCheck: Map) => { + const entries = Array.from(nftsToCheck.entries()).map<[EthAddress, Map]>(([address, nftIds]) => [ + address, + new Map(nftIds.map((nftId) => [nftId, false])) + ]) + return Promise.resolve(new Map(entries)) + }) + } as unknown as jest.Mocked } -function ownedNFTs( - clazz: new (...args: any[]) => T, - ethAddress: EthAddress, - ...ownedWearables: WearableId[] -): T { - const mockedOwnership = mock(clazz) - when(mockedOwnership.areNFTsOwned(anything())).thenCall((names: Map) => { - const entries = Array.from(names.entries()).map<[EthAddress, Map]>(([address, names]) => [ - address, - new Map(names.map((name) => [name, address === ethAddress && ownedWearables.includes(name)])) - ]) - return Promise.resolve(new Map(entries)) - }) - return instance(mockedOwnership) +function ownedNFTs(ethAddress: EthAddress, ...ownedWearables: WearableId[]): jest.Mocked { + return { + areNFTsOwned: jest.fn().mockImplementation((nftsToCheck: Map) => { + const entries = Array.from(nftsToCheck.entries()).map<[EthAddress, Map]>(([address, nftIds]) => [ + address, + new Map(nftIds.map((nftId) => [nftId, address === ethAddress && ownedWearables.includes(nftId)])) + ]) + return Promise.resolve(new Map(entries)) + }) + } as unknown as jest.Mocked } diff --git a/lambdas/test/apis/status/health.spec.ts b/lambdas/test/apis/status/health.spec.ts index f6d2a2b71..1da7270cb 100644 --- a/lambdas/test/apis/status/health.spec.ts +++ b/lambdas/test/apis/status/health.spec.ts @@ -1,140 +1,172 @@ -import { Logger } from 'log4js' -import sinon from 'sinon' -import { anything, instance, mock, when } from 'ts-mockito' import { HealthStatus, refreshContentServerStatus } from '../../../src/apis/status/health' import { SmartContentClient } from '../../../src/utils/SmartContentClient' describe("Lambda's Controller Utils", () => { describe('refreshContentServerStatus', () => { - let contentClientMock: SmartContentClient - describe('when the service is synced', () => { - const mockedHealthyStatus = { - currentTime: 100, - synchronizationStatus: { - lastSyncWithOtherServers: 100, - synchronizationState: 'Syncing', + let contentClientMock: jest.Mocked + let mockedHealthyStatus: any + let logger: any + + beforeEach(() => { + mockedHealthyStatus = { + currentTime: 100, + synchronizationStatus: { + lastSyncWithOtherServers: 100, + synchronizationState: 'Syncing' + } + } + contentClientMock = { + fetchContentStatus: jest.fn().mockResolvedValue(mockedHealthyStatus), + fetchEntitiesByPointers: jest.fn().mockResolvedValue(mockedHealthyStatus) + } as unknown as jest.Mocked + logger = { + debug: jest.fn(), + error: jest.fn(), + info: jest.fn(), + log: jest.fn(), + warn: jest.fn() } - } - - beforeAll(() => { - contentClientMock = mock(SmartContentClient) - when(contentClientMock.fetchContentStatus()).thenReturn(Promise.resolve(mockedHealthyStatus as any)) - when(contentClientMock.fetchEntitiesByPointers(anything(), anything())).thenReturn( - Promise.resolve(mockedHealthyStatus as any) - ) }) - it('should return a healthy status', async () => { - const logger = mock(Logger) + afterEach(() => { + jest.resetAllMocks() + }) - expect(await refreshContentServerStatus(instance(contentClientMock), '10s', '10s', logger)).toEqual( - HealthStatus.HEALTHY - ) + it('should return a healthy status', async () => { + expect(await refreshContentServerStatus(contentClientMock, '10s', '10s', logger)).toEqual(HealthStatus.HEALTHY) }) }) describe('when the service has old information', () => { - const mockedHealthyStatus = { - currentTime: 1000000, - synchronizationStatus: { - lastSyncWithOtherServers: 100, - synchronizationState: 'Syncing', + let contentClientMock: jest.Mocked + let mockedHealthyStatus: any + let logger: any + + beforeEach(() => { + mockedHealthyStatus = { + currentTime: 1000000, + synchronizationStatus: { + lastSyncWithOtherServers: 100, + synchronizationState: 'Syncing' + } + } + contentClientMock = { + fetchContentStatus: jest.fn().mockResolvedValue(mockedHealthyStatus), + fetchEntitiesByPointers: jest.fn().mockResolvedValue(mockedHealthyStatus) + } as unknown as jest.Mocked + logger = { + debug: jest.fn(), + error: jest.fn(), + info: jest.fn(), + log: jest.fn(), + warn: jest.fn() } - } - - beforeAll(() => { - contentClientMock = mock(SmartContentClient) - when(contentClientMock.fetchContentStatus()).thenReturn(Promise.resolve(mockedHealthyStatus as any)) - when(contentClientMock.fetchEntitiesByPointers(anything(), anything())).thenReturn( - Promise.resolve(mockedHealthyStatus as any) - ) }) - it('should return an unhealthy status', async () => { - const logger = mock(Logger) + afterEach(() => { + jest.resetAllMocks() + }) - expect(await refreshContentServerStatus(instance(contentClientMock), '10s', '10s', logger)).toEqual( - HealthStatus.UNHEALTHY - ) + it('should return an unhealthy status', async () => { + expect(await refreshContentServerStatus(contentClientMock, '10s', '10s', logger)).toEqual(HealthStatus.UNHEALTHY) }) }) describe('when the service takes too much time to obtain deployment', () => { - const mockedHealthyStatus = { - currentTime: 100, - synchronizationStatus: { - lastSyncWithOtherServers: 100, - synchronizationState: 'Syncing', + let contentClientMock: jest.Mocked + let mockedHealthyStatus: any + let logger: any + let dateNowSpy: jest.SpyInstance + + beforeEach(() => { + mockedHealthyStatus = { + currentTime: 100, + synchronizationStatus: { + lastSyncWithOtherServers: 100, + synchronizationState: 'Syncing' + } + } + contentClientMock = { + fetchContentStatus: jest.fn().mockResolvedValue(mockedHealthyStatus), + fetchEntitiesByPointers: jest.fn().mockResolvedValue(mockedHealthyStatus) + } as unknown as jest.Mocked + logger = { + debug: jest.fn(), + error: jest.fn(), + info: jest.fn(), + log: jest.fn(), + warn: jest.fn() } - } - let dateNowStub: sinon.SinonStub - - beforeAll(() => { - contentClientMock = mock(SmartContentClient) - when(contentClientMock.fetchContentStatus()).thenReturn(Promise.resolve(mockedHealthyStatus as any)) - when(contentClientMock.fetchEntitiesByPointers(anything(), anything())).thenReturn( - Promise.resolve(mockedHealthyStatus as any) - ) - - dateNowStub = sinon - .stub(Date, 'now' as any) - .onFirstCall() - .returns(100) - .onSecondCall() - .returns(1000000) - }) - afterAll(() => { - dateNowStub.restore() + dateNowSpy = jest.spyOn(Date, 'now').mockReturnValueOnce(100).mockReturnValueOnce(1000000) }) - it('should return aa unhealthy status', async () => { - const logger = mock(Logger) + afterEach(() => { + dateNowSpy.mockRestore() + jest.resetAllMocks() + }) - expect(await refreshContentServerStatus(instance(contentClientMock), '10s', '10s', logger)).toEqual( - HealthStatus.UNHEALTHY - ) + it('should return an unhealthy status', async () => { + expect(await refreshContentServerStatus(contentClientMock, '10s', '10s', logger)).toEqual(HealthStatus.UNHEALTHY) }) }) describe('when the service is bootstrapping', () => { - const mockedUnhealthyStatus = { - currentTime: 100, - synchronizationStatus: { - lastSyncWithOtherServers: 100, - synchronizationState: 'Bootstrapping', + let contentClientMock: jest.Mocked + let mockedUnhealthyStatus: any + let logger: any + + beforeEach(() => { + mockedUnhealthyStatus = { + currentTime: 100, + synchronizationStatus: { + lastSyncWithOtherServers: 100, + synchronizationState: 'Bootstrapping' + } + } + contentClientMock = { + fetchContentStatus: jest.fn().mockResolvedValue(mockedUnhealthyStatus), + fetchEntitiesByPointers: jest.fn().mockResolvedValue(mockedUnhealthyStatus) + } as unknown as jest.Mocked + logger = { + debug: jest.fn(), + error: jest.fn(), + info: jest.fn(), + log: jest.fn(), + warn: jest.fn() } - } - - beforeAll(() => { - contentClientMock = mock(SmartContentClient) - when(contentClientMock.fetchContentStatus()).thenReturn(Promise.resolve(mockedUnhealthyStatus as any)) - when(contentClientMock.fetchEntitiesByPointers(anything(), anything())).thenReturn( - Promise.resolve(mockedUnhealthyStatus as any) - ) }) - it('should return an unhealthy status', async () => { - const logger = mock(Logger) + afterEach(() => { + jest.resetAllMocks() + }) - expect(await refreshContentServerStatus(instance(contentClientMock), '10s', '10s', logger)).toEqual( - HealthStatus.UNHEALTHY - ) + it('should return an unhealthy status', async () => { + expect(await refreshContentServerStatus(contentClientMock, '10s', '10s', logger)).toEqual(HealthStatus.UNHEALTHY) }) }) describe('when the request fails', () => { - it('should return a down status', async () => { - const logger = mock(Logger) + let logger: any + + beforeEach(() => { + logger = { + debug: jest.fn(), + error: jest.fn(), + info: jest.fn(), + log: jest.fn(), + warn: jest.fn() + } + }) + afterEach(() => { + jest.resetAllMocks() + }) + + it('should return a down status', async () => { expect( - await refreshContentServerStatus( - { getClientUrl: () => Promise.resolve('mockUrl') } as any, - '10s', - '10s', - logger - ) + await refreshContentServerStatus({ getClientUrl: () => Promise.resolve('mockUrl') } as any, '10s', '10s', logger) ).toEqual(HealthStatus.DOWN) }) }) diff --git a/lambdas/test/logic/third-party-urn-finder.spec.ts b/lambdas/test/logic/third-party-urn-finder.spec.ts index ac1d311e1..94d6ae9de 100644 --- a/lambdas/test/logic/third-party-urn-finder.spec.ts +++ b/lambdas/test/logic/third-party-urn-finder.spec.ts @@ -1,4 +1,3 @@ -import { verify } from 'ts-mockito' import { findThirdPartyItemUrns } from '../../src/logic/third-party-urn-finder' import { ThirdPartyAssetFetcher } from '../../src/ports/third-party/third-party-fetcher' @@ -6,101 +5,142 @@ const SOME_ADDRESS = '0x079bed9c31cb772c4c156f86e1cff15bf751add0' const TPW_WEARABLE_ID = 'urn:decentraland:mumbai:collections-thirdparty:some-third-party:someWearable' describe('findItemUrns', () => { - it('when resolver and assets exists for the owner, it returns the correct urn', async () => { - const expectedRegistryId = 'some-third-party' - const expectedOwner = SOME_ADDRESS - const tpFetcher: ThirdPartyAssetFetcher = { - fetchAssets: (url, registryId, owner) => { - const assets = - registryId === expectedRegistryId && owner === expectedOwner - ? [ - { - id: TPW_WEARABLE_ID, - amount: 1, - urn: { decentraland: TPW_WEARABLE_ID } - } - ] - : [] - return Promise.resolve(assets) + describe('when resolver and assets exist for the owner', () => { + let expectedRegistryId: string + let expectedOwner: string + let tpFetcher: ThirdPartyAssetFetcher + let mockedGraphClient: { findThirdPartyResolver: jest.Mock } + + beforeEach(() => { + expectedRegistryId = 'some-third-party' + expectedOwner = SOME_ADDRESS + tpFetcher = { + fetchAssets: (url, registryId, owner) => { + const assets = + registryId === expectedRegistryId && owner === expectedOwner + ? [ + { + id: TPW_WEARABLE_ID, + amount: 1, + urn: { decentraland: TPW_WEARABLE_ID } + } + ] + : [] + return Promise.resolve(assets) + } + } + mockedGraphClient = { + findThirdPartyResolver: jest.fn().mockResolvedValue('some-url') } - } + }) - const mockedGraphClient = { - findThirdPartyResolver: jest.fn().mockResolvedValue('some-url') - } + afterEach(() => { + jest.resetAllMocks() + }) - const wearableUrns = await findThirdPartyItemUrns( - mockedGraphClient as any, - tpFetcher, - SOME_ADDRESS, - 'urn:decentraland:mumbai:collections-thirdparty:some-third-party' - ) + it('should return the correct urn', async () => { + const wearableUrns = await findThirdPartyItemUrns( + mockedGraphClient as any, + tpFetcher, + SOME_ADDRESS, + 'urn:decentraland:mumbai:collections-thirdparty:some-third-party' + ) - expect(wearableUrns.length).toEqual(1) - expect(wearableUrns[0]).toEqual(TPW_WEARABLE_ID) - verify(mockedGraphClient.findThirdPartyResolver('thirdPartyRegistrySubgraph', 'some-third-party')) + expect(wearableUrns.length).toEqual(1) + expect(wearableUrns[0]).toEqual(TPW_WEARABLE_ID) + expect(mockedGraphClient.findThirdPartyResolver).toHaveBeenCalledWith( + 'thirdPartyRegistrySubgraph', + 'urn:decentraland:mumbai:collections-thirdparty:some-third-party' + ) + }) }) - it('when the resolver does not exist, it rejects with error', async () => { - const expectedRegistryId = 'some-third-party' - const collectionId = 'urn:decentraland:mumbai:collections-thirdparty:' + expectedRegistryId - const expectedOwner = SOME_ADDRESS - const tpFetcher: ThirdPartyAssetFetcher = { - fetchAssets: (url, registryId, owner) => { - const assets = - registryId === expectedRegistryId && owner === expectedOwner - ? [ - { - id: TPW_WEARABLE_ID, - amount: 1, - urn: { decentraland: TPW_WEARABLE_ID } - } - ] - : [] - return Promise.resolve(assets) + describe('when the resolver does not exist', () => { + let expectedRegistryId: string + let collectionId: string + let expectedOwner: string + let tpFetcher: ThirdPartyAssetFetcher + let mockedGraphClient: { findThirdPartyResolver: jest.Mock } + + beforeEach(() => { + expectedRegistryId = 'some-third-party' + collectionId = 'urn:decentraland:mumbai:collections-thirdparty:' + expectedRegistryId + expectedOwner = SOME_ADDRESS + tpFetcher = { + fetchAssets: (url, registryId, owner) => { + const assets = + registryId === expectedRegistryId && owner === expectedOwner + ? [ + { + id: TPW_WEARABLE_ID, + amount: 1, + urn: { decentraland: TPW_WEARABLE_ID } + } + ] + : [] + return Promise.resolve(assets) + } } - } + mockedGraphClient = { + findThirdPartyResolver: jest.fn().mockResolvedValue(undefined) + } + }) - const mockedGraphClient = { - findThirdPartyResolver: jest.fn().mockResolvedValue(undefined) - } + afterEach(() => { + jest.resetAllMocks() + }) - await expect( - findThirdPartyItemUrns(mockedGraphClient as any, tpFetcher, SOME_ADDRESS, collectionId) - ).rejects.toThrow(`Could not find third party resolver for collectionId: ${collectionId}`) + it('should reject with error', async () => { + await expect( + findThirdPartyItemUrns(mockedGraphClient as any, tpFetcher, SOME_ADDRESS, collectionId) + ).rejects.toThrow(`Could not find third party resolver for collectionId: ${collectionId}`) + }) }) - it('when the fetcher returns assets from another thirdparty, then they get filtered', async () => { - const tpFetcher: ThirdPartyAssetFetcher = { - fetchAssets: () => { - return Promise.resolve([ - { - id: TPW_WEARABLE_ID, - amount: 1, - urn: { decentraland: TPW_WEARABLE_ID } - }, - { - id: TPW_WEARABLE_ID, - amount: 1, - urn: { decentraland: 'wrongUrn!' } - } - ]) + describe('when the fetcher returns assets from another thirdparty', () => { + let tpFetcher: ThirdPartyAssetFetcher + let mockedGraphClient: { findThirdPartyResolver: jest.Mock } + + beforeEach(() => { + tpFetcher = { + fetchAssets: () => { + return Promise.resolve([ + { + id: TPW_WEARABLE_ID, + amount: 1, + urn: { decentraland: TPW_WEARABLE_ID } + }, + { + id: TPW_WEARABLE_ID, + amount: 1, + urn: { decentraland: 'wrongUrn!' } + } + ]) + } + } + mockedGraphClient = { + findThirdPartyResolver: jest.fn().mockResolvedValue('some-url') } - } + }) - const mockedGraphClient = { - findThirdPartyResolver: jest.fn().mockResolvedValue('some-url') - } + afterEach(() => { + jest.resetAllMocks() + }) - const wearableUrns = await findThirdPartyItemUrns( - mockedGraphClient as any, - tpFetcher, - SOME_ADDRESS, - 'urn:decentraland:mumbai:collections-thirdparty:some-third-party' - ) + it('should filter them out', async () => { + const wearableUrns = await findThirdPartyItemUrns( + mockedGraphClient as any, + tpFetcher, + SOME_ADDRESS, + 'urn:decentraland:mumbai:collections-thirdparty:some-third-party' + ) - expect(wearableUrns.length).toEqual(1) - expect(wearableUrns[0]).toEqual(TPW_WEARABLE_ID) - verify(mockedGraphClient.findThirdPartyResolver('thirdPartyRegistrySubgraph', 'some-third-party')) + expect(wearableUrns.length).toEqual(1) + expect(wearableUrns[0]).toEqual(TPW_WEARABLE_ID) + expect(mockedGraphClient.findThirdPartyResolver).toHaveBeenCalledWith( + 'thirdPartyRegistrySubgraph', + 'urn:decentraland:mumbai:collections-thirdparty:some-third-party' + ) + }) }) }) diff --git a/package.json b/package.json index 08e98ef54..86bd8c589 100644 --- a/package.json +++ b/package.json @@ -50,10 +50,10 @@ "lint-staged": "13.0.3", "prettier": "2.7.1", "syncpack": "8.2.4", - "typescript": "^4.7.4" + "tslib": "^2.8.1", + "typescript": "^5.9.3" }, "jest-junit": { "addFileAttribute": "true" - }, - "dependencies": {} + } } diff --git a/tsconfig.json b/tsconfig.json index fc312c30d..e7570111e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "module": "commonjs", - "target": "es2020", + "target": "es2022", "declaration": true, "declarationMap": true, "sourceMap": true, @@ -17,7 +17,7 @@ "jsx": "react", "skipLibCheck": true, "lib": [ - "es2020", + "es2022", "esnext.asynciterable", "esnext" ] diff --git a/yarn.lock b/yarn.lock index 2ff17ca40..b70dd7203 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,14 +2,6 @@ # yarn lockfile v1 -"@ampproject/remapping@^2.1.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== - dependencies: - "@jridgewell/gen-mapping" "^0.1.0" - "@jridgewell/trace-mapping" "^0.3.9" - "@apidevtools/json-schema-ref-parser@9.0.9": version "9.0.9" resolved "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz" @@ -20,150 +12,119 @@ call-me-maybe "^1.0.1" js-yaml "^4.1.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== - dependencies: - "@babel/highlight" "^7.18.6" - -"@babel/compat-data@^7.18.8": - version "7.18.8" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz" - integrity sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ== - -"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.2", "@babel/core@^7.7.5", "@babel/core@^7.8.0": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.18.9.tgz" - integrity sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.9" - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-module-transforms" "^7.18.9" - "@babel/helpers" "^7.18.9" - "@babel/parser" "^7.18.9" - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" - convert-source-map "^1.7.0" +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz" + integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== + dependencies: + "@babel/helper-validator-identifier" "^7.27.1" + js-tokens "^4.0.0" + picocolors "^1.1.1" + +"@babel/compat-data@^7.27.2": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz" + integrity sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA== + +"@babel/core@^7.0.0", "@babel/core@^7.0.0 || ^8.0.0-0", "@babel/core@^7.0.0-0", "@babel/core@^7.11.0 || ^8.0.0-0", "@babel/core@^7.11.0 || ^8.0.0-beta.1", "@babel/core@^7.23.9", "@babel/core@^7.27.4", "@babel/core@>=7.0.0-beta.0 <8": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz" + integrity sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.28.5" + "@babel/helper-compilation-targets" "^7.27.2" + "@babel/helper-module-transforms" "^7.28.3" + "@babel/helpers" "^7.28.4" + "@babel/parser" "^7.28.5" + "@babel/template" "^7.27.2" + "@babel/traverse" "^7.28.5" + "@babel/types" "^7.28.5" + "@jridgewell/remapping" "^2.3.5" + convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.2.1" - semver "^6.3.0" - -"@babel/generator@^7.18.9", "@babel/generator@^7.7.2": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.18.9.tgz" - integrity sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug== - dependencies: - "@babel/types" "^7.18.9" - "@jridgewell/gen-mapping" "^0.3.2" - jsesc "^2.5.1" - -"@babel/helper-compilation-targets@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz" - integrity sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg== - dependencies: - "@babel/compat-data" "^7.18.8" - "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.20.2" - semver "^6.3.0" - -"@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== - -"@babel/helper-function-name@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz" - integrity sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A== - dependencies: - "@babel/template" "^7.18.6" - "@babel/types" "^7.18.9" - -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-transforms@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz" - integrity sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.18.6" - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.8.0": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz" - integrity sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w== - -"@babel/helper-simple-access@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz" - integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-validator-identifier@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz" - integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== - -"@babel/helper-validator-option@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz" - integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== - -"@babel/helpers@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz" - integrity sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ== - dependencies: - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.6", "@babel/parser@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz" - integrity sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg== + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.27.5", "@babel/generator@^7.28.5": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz" + integrity sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ== + dependencies: + "@babel/parser" "^7.28.5" + "@babel/types" "^7.28.5" + "@jridgewell/gen-mapping" "^0.3.12" + "@jridgewell/trace-mapping" "^0.3.28" + jsesc "^3.0.2" + +"@babel/helper-compilation-targets@^7.27.2": + version "7.27.2" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz" + integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== + dependencies: + "@babel/compat-data" "^7.27.2" + "@babel/helper-validator-option" "^7.27.1" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-globals@^7.28.0": + version "7.28.0" + resolved "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz" + integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== + +"@babel/helper-module-imports@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz" + integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== + dependencies: + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/helper-module-transforms@^7.28.3": + version "7.28.3" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz" + integrity sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw== + dependencies: + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + "@babel/traverse" "^7.28.3" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.27.1", "@babel/helper-plugin-utils@^7.8.0": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz" + integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== + +"@babel/helper-string-parser@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz" + integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== + +"@babel/helper-validator-identifier@^7.27.1", "@babel/helper-validator-identifier@^7.28.5": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz" + integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== + +"@babel/helper-validator-option@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz" + integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== + +"@babel/helpers@^7.28.4": + version "7.28.4" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz" + integrity sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w== + dependencies: + "@babel/template" "^7.27.2" + "@babel/types" "^7.28.4" + +"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.27.2", "@babel/parser@^7.28.5": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz" + integrity sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ== + dependencies: + "@babel/types" "^7.28.5" "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -179,14 +140,28 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.8.3": +"@babel/plugin-syntax-class-properties@^7.12.13": version "7.12.13" resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-syntax-import-meta@^7.8.3": +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-import-attributes@^7.24.7": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz" + integrity sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-syntax-import-meta@^7.10.4": version "7.10.4" resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== @@ -200,7 +175,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": +"@babel/plugin-syntax-jsx@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz" + integrity sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== @@ -214,7 +196,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.8.3": +"@babel/plugin-syntax-numeric-separator@^7.10.4": version "7.10.4" resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== @@ -242,52 +224,56 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-top-level-await@^7.8.3": +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": version "7.14.5" resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.7.2": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz" - integrity sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/template@^7.18.6", "@babel/template@^7.3.3": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz" - integrity sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.18.6" - "@babel/types" "^7.18.6" - -"@babel/traverse@^7.18.9", "@babel/traverse@^7.7.2": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.9.tgz" - integrity sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.9" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.18.9" - "@babel/types" "^7.18.9" - debug "^4.1.0" - globals "^11.1.0" +"@babel/plugin-syntax-typescript@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz" + integrity sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/template@^7.27.2": + version "7.27.2" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz" + integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/parser" "^7.27.2" + "@babel/types" "^7.27.1" + +"@babel/traverse@^7.27.1", "@babel/traverse@^7.28.3", "@babel/traverse@^7.28.5": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz" + integrity sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.28.5" + "@babel/helper-globals" "^7.28.0" + "@babel/parser" "^7.28.5" + "@babel/template" "^7.27.2" + "@babel/types" "^7.28.5" + debug "^4.3.1" -"@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz" - integrity sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.28.4", "@babel/types@^7.28.5", "@babel/types@^7.3.0": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz" + integrity sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA== dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - to-fast-properties "^2.0.0" + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.28.5" "@balena/dockerignore@^1.0.2": version "1.0.2" @@ -301,20 +287,90 @@ "@borewit/text-codec@^0.1.0": version "0.1.1" - resolved "https://registry.yarnpkg.com/@borewit/text-codec/-/text-codec-0.1.1.tgz#7e7f27092473d5eabcffef693a849f2cc48431da" + resolved "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.1.1.tgz" integrity sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA== -"@cspotcode/source-map-consumer@0.8.0": - version "0.8.0" - resolved "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz" - integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== +"@catalyst/content-server@file:/Users/lpetaccio/repositories/catalyst/content": + version "0.1.0" + resolved "file:content" + dependencies: + "@dcl/block-indexer" "^1.1.2" + "@dcl/catalyst-api-specs" "^3.3.0" + "@dcl/catalyst-contracts" "^4.4.2" + "@dcl/catalyst-storage" "^4.3.1" + "@dcl/content-validator" "^7.0.3" + "@dcl/crypto" "^3.4.5" + "@dcl/hashing" "^3.0.4" + "@dcl/job-component" "^0.2.8" + "@dcl/schemas" "^20.1.1" + "@dcl/snapshots-fetcher" "^9.1.0" + "@dcl/urn-resolver" "^3.6.0" + "@well-known-components/env-config-provider" "^1.2.0" + "@well-known-components/fetch-component" "^2.0.2" + "@well-known-components/http-server" "^2.1.0" + "@well-known-components/interfaces" "^1.5.2" + "@well-known-components/logger" "^3.1.3" + "@well-known-components/metrics" "^2.1.0" + "@well-known-components/multipart-wrapper" "^1.0.3" + "@well-known-components/thegraph-component" "^1.6.0" + bloom-filters "^3.0.4" + dcl-catalyst-client "^21.7.0" + eth-connect "^6.2.4" + file-type "^21.1.1" + form-data "^4.0.5" + fp-future "^1.0.1" + joi "^17.9.2" + lru-cache "7.8.2" + ms "2.1.3" + node-cache "^5.1.2" + node-fetch "2.6.7" + node-pg-migrate "6.2.2" + p-queue "6.6.2" + path-to-regexp "^6.2.1" + pg "8.8.0" + pg-query-stream "^4.2.3" + qs "^6.11.1" + sql-template-strings "^2.2.2" + uuid "8.3.2" + +"@catalyst/lambdas-server@file:/Users/lpetaccio/repositories/catalyst/lambdas": + version "0.1.0" + resolved "file:lambdas" + dependencies: + "@dcl/catalyst-api-specs" "^3.3.0" + "@dcl/content-validator" "^7.0.3" + "@dcl/crypto" "^3.4.5" + "@dcl/schemas" "^20.1.1" + "@dcl/urn-resolver" "^3.6.0" + "@well-known-components/env-config-provider" "^1.2.0" + "@well-known-components/fetch-component" "^2.0.2" + "@well-known-components/http-server" "^2.1.0" + "@well-known-components/interfaces" "^1.5.2" + "@well-known-components/logger" "^3.1.3" + "@well-known-components/metrics" "^2.1.0" + "@well-known-components/thegraph-component" "^1.6.0" + compression "1.7.4" + cors "2.8.5" + dcl-catalyst-client "^21.7.0" + destroy "1.2.0" + eth-connect "^6.2.4" + express "4.20.0" + express-openapi-validator "4.13.8" + fp-future "^1.0.1" + log4js "6.4.7" + lru-cache "7.8.2" + morgan "1.10.0" + ms "2.1.3" + node-fetch "2.6.7" + on-finished "2.4.1" + sharp "0.32.6" -"@cspotcode/source-map-support@0.7.0": - version "0.7.0" - resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz" - integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA== +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== dependencies: - "@cspotcode/source-map-consumer" "0.8.0" + "@jridgewell/trace-mapping" "0.3.9" "@dcl/block-indexer@^1.1.2": version "1.1.2" @@ -338,20 +394,9 @@ resolved "https://registry.npmjs.org/@dcl/catalyst-contracts/-/catalyst-contracts-4.4.2.tgz" integrity sha512-gJZo3IB8U+jhBJWR0DgoLS+zaUDIb/u79e7Rp+MEM78uH3bvC19S3Dd8lxWEbPXNKlCB0saUptfK/Buw0c1y2Q== -"@dcl/catalyst-storage@^4.0.0": - version "4.3.0" - resolved "https://registry.npmjs.org/@dcl/catalyst-storage/-/catalyst-storage-4.3.0.tgz" - integrity sha512-5r+Ip29fgG9sT9qVU5GRP2YmuA9rPd7K+STa/ofjgURdMb+1/uDhoJbMRfMbu+ft9FcEN3qYkVnIipxf5v2KzA== - dependencies: - "@well-known-components/interfaces" "^1.1.1" - aws-sdk "^2.1426.0" - aws-sdk-client-mock "^3.0.0" - destroy "^1.2.0" - file-type "15" - -"@dcl/catalyst-storage@^4.3.1": +"@dcl/catalyst-storage@^4.0.0", "@dcl/catalyst-storage@^4.3.1": version "4.3.1" - resolved "https://registry.yarnpkg.com/@dcl/catalyst-storage/-/catalyst-storage-4.3.1.tgz#a30d441d2952210eb141b061913769fa6dddc2ca" + resolved "https://registry.npmjs.org/@dcl/catalyst-storage/-/catalyst-storage-4.3.1.tgz" integrity sha512-6CXKFsS2I0cDX7fvL2TsXj1r2CzeOoSpns6NMvQxj0W1/W4LXqXLXz3XgDtfLy3EoHYJMTBXaJfmU07mZ0MyCQ== dependencies: "@well-known-components/interfaces" "^1.1.1" @@ -369,7 +414,7 @@ "@dcl/content-validator@^7.0.3": version "7.0.3" - resolved "https://registry.yarnpkg.com/@dcl/content-validator/-/content-validator-7.0.3.tgz#c25609060b72b33f114d2e1bb9cfbb8c6dd04880" + resolved "https://registry.npmjs.org/@dcl/content-validator/-/content-validator-7.0.3.tgz" integrity sha512-0rfoU6OL1HolMJDtTiMCE4EOPRp+1udqF3u5ZwoVqQgQkK6NmS5reJc4DhMY7WkemVp6qGxL8i8F/BPpMukFbw== dependencies: "@dcl/block-indexer" "^1.1.2" @@ -383,10 +428,10 @@ p-queue "^6.6.2" sharp "0.32.6" -"@dcl/core-commons@0.5.1": - version "0.5.1" - resolved "https://registry.yarnpkg.com/@dcl/core-commons/-/core-commons-0.5.1.tgz#a0fe702ac3dfe09b8253ef319f1ba8be63cfbfff" - integrity sha512-958pmcxYQ3YI8olTH09IMf4w35MjPWAo48+k0uf97b3IiySGz0akjidawY0wK8oVbE849umgDiQSf3keiJJaew== +"@dcl/core-commons@0.6.0": + version "0.6.0" + resolved "https://registry.npmjs.org/@dcl/core-commons/-/core-commons-0.6.0.tgz" + integrity sha512-t7+Q+oZcj8PKjvP0iQXkjnK5+pNCNUpBcEFP+V0Lcurl3DdndI7sOsYPIzkxhdjFgOfcaT9SdgFD/LxmjwA3Tg== dependencies: "@well-known-components/interfaces" "^1.5.2" @@ -404,45 +449,44 @@ resolved "https://registry.npmjs.org/@dcl/hashing/-/hashing-3.0.4.tgz" integrity sha512-Cg+MoIOn+BYmQV2q8zSFnNYY+GldlnUazwBnfgrq3i66ZxOaZ65h01btd8OUtSAlfWG4VTNIOHDjtKqmuwJNBg== -"@dcl/job-component@^0.2.7": - version "0.2.7" - resolved "https://registry.yarnpkg.com/@dcl/job-component/-/job-component-0.2.7.tgz#d05d7a246b4734f588c25a488ccd21a5fe74e407" - integrity sha512-ONVTlRTZWlOR0Wj0TP8KSXQR3dyBnsSi7Ekzv7QM5p62E6fcumyLI8S6VuhbCZ0sfF3RgraTcMmBbPApUz18zQ== +"@dcl/job-component@^0.2.8": + version "0.2.8" + resolved "https://registry.npmjs.org/@dcl/job-component/-/job-component-0.2.8.tgz" + integrity sha512-cg/MlxkqRql8+X2rdscL2ZwPjBq8Ln1bPWLky1ZqziAl4F1bRxLwjXdPDMYlQWm+RL8mF5V+DbvaP0ZHFyzKJw== dependencies: - "@dcl/core-commons" "0.5.1" + "@dcl/core-commons" "0.6.0" "@well-known-components/interfaces" "^1.5.2" -"@dcl/schemas@20.4.1": - version "20.4.1" - resolved "https://registry.yarnpkg.com/@dcl/schemas/-/schemas-20.4.1.tgz#b94943b46f1f2e672b743aa369877912d89a4fc7" - integrity sha512-lEbNJ8Iu7rHwoeaxGTUY0vWZaGbHbjcw0glaL21kk3KYNGTXgO0i9W9yKBzzHCBi3ff224u9RxA1XMa+9837CQ== +"@dcl/schemas@^11.5.0": + version "11.12.0" + resolved "https://registry.npmjs.org/@dcl/schemas/-/schemas-11.12.0.tgz" + integrity sha512-L04KTucvxSnrHDAl3/rnkzhjfZ785dSSPeKarBVfzyuw41uyQ0Mh4HVFWjX9hC+f/nMpM5Adg5udlT5efmepcA== dependencies: ajv "^8.11.0" ajv-errors "^3.0.0" ajv-keywords "^5.1.0" mitt "^3.0.1" -"@dcl/schemas@^11.5.0": - version "11.12.0" - resolved "https://registry.npmjs.org/@dcl/schemas/-/schemas-11.12.0.tgz" - integrity sha512-L04KTucvxSnrHDAl3/rnkzhjfZ785dSSPeKarBVfzyuw41uyQ0Mh4HVFWjX9hC+f/nMpM5Adg5udlT5efmepcA== +"@dcl/schemas@^20.1.1", "@dcl/schemas@20.4.1": + version "20.4.1" + resolved "https://registry.npmjs.org/@dcl/schemas/-/schemas-20.4.1.tgz" + integrity sha512-lEbNJ8Iu7rHwoeaxGTUY0vWZaGbHbjcw0glaL21kk3KYNGTXgO0i9W9yKBzzHCBi3ff224u9RxA1XMa+9837CQ== dependencies: ajv "^8.11.0" ajv-errors "^3.0.0" ajv-keywords "^5.1.0" mitt "^3.0.1" -"@dcl/schemas@^20.1.1": - version "20.2.0" - resolved "https://registry.npmjs.org/@dcl/schemas/-/schemas-20.2.0.tgz" - integrity sha512-7NIEDNvAybLrzUPcB700gMWs1zXlzsKOZCVKlph8/SLzloB84iT6gdyE1Zs0yyKmBx4+9G2B7ojf0sbQIqJ1XA== +"@dcl/schemas@^9.1.1": + version "9.15.0" + resolved "https://registry.npmjs.org/@dcl/schemas/-/schemas-9.15.0.tgz" + integrity sha512-nip5rsOcJplNfBWeImwezuHLprM0gLW03kEeqGIvT9J6HnEBTtvIwkk9+NSt7hzFKEvWGI+C23vyNWbG3nU+SQ== dependencies: ajv "^8.11.0" ajv-errors "^3.0.0" ajv-keywords "^5.1.0" - mitt "^3.0.1" -"@dcl/schemas@^9.1.1", "@dcl/schemas@^9.2.0": +"@dcl/schemas@^9.2.0": version "9.15.0" resolved "https://registry.npmjs.org/@dcl/schemas/-/schemas-9.15.0.tgz" integrity sha512-nip5rsOcJplNfBWeImwezuHLprM0gLW03kEeqGIvT9J6HnEBTtvIwkk9+NSt7hzFKEvWGI+C23vyNWbG3nU+SQ== @@ -483,7 +527,7 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.7.0": +"@ethersproject/abi@^5.7.0", "@ethersproject/abi@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz" integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== @@ -498,7 +542,7 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": +"@ethersproject/abstract-provider@^5.7.0", "@ethersproject/abstract-provider@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz" integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== @@ -511,7 +555,7 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/web" "^5.7.0" -"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": +"@ethersproject/abstract-signer@^5.7.0", "@ethersproject/abstract-signer@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz" integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== @@ -522,7 +566,7 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/properties" "^5.7.0" -"@ethersproject/address@5.7.0", "@ethersproject/address@^5.7.0": +"@ethersproject/address@^5.7.0", "@ethersproject/address@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz" integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== @@ -533,14 +577,14 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/rlp" "^5.7.0" -"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": +"@ethersproject/base64@^5.7.0", "@ethersproject/base64@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz" integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== dependencies: "@ethersproject/bytes" "^5.7.0" -"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": +"@ethersproject/basex@^5.7.0", "@ethersproject/basex@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz" integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== @@ -548,7 +592,7 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/properties" "^5.7.0" -"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0": +"@ethersproject/bignumber@^5.7.0", "@ethersproject/bignumber@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz" integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== @@ -557,14 +601,14 @@ "@ethersproject/logger" "^5.7.0" bn.js "^5.2.1" -"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0": +"@ethersproject/bytes@^5.7.0", "@ethersproject/bytes@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz" integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": +"@ethersproject/constants@^5.7.0", "@ethersproject/constants@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz" integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== @@ -587,7 +631,7 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/transactions" "^5.7.0" -"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": +"@ethersproject/hash@^5.7.0", "@ethersproject/hash@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz" integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== @@ -602,7 +646,7 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": +"@ethersproject/hdnode@^5.7.0", "@ethersproject/hdnode@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz" integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== @@ -620,7 +664,7 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/wordlists" "^5.7.0" -"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": +"@ethersproject/json-wallets@^5.7.0", "@ethersproject/json-wallets@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz" integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== @@ -639,7 +683,7 @@ aes-js "3.0.0" scrypt-js "3.0.1" -"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": +"@ethersproject/keccak256@^5.7.0", "@ethersproject/keccak256@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz" integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== @@ -647,19 +691,19 @@ "@ethersproject/bytes" "^5.7.0" js-sha3 "0.8.0" -"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": +"@ethersproject/logger@^5.7.0", "@ethersproject/logger@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz" integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== -"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": +"@ethersproject/networks@^5.7.0", "@ethersproject/networks@5.7.1": version "5.7.1" resolved "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz" integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": +"@ethersproject/pbkdf2@^5.7.0", "@ethersproject/pbkdf2@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz" integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== @@ -667,7 +711,7 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/sha2" "^5.7.0" -"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": +"@ethersproject/properties@^5.7.0", "@ethersproject/properties@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz" integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== @@ -700,7 +744,7 @@ bech32 "1.1.4" ws "7.4.6" -"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": +"@ethersproject/random@^5.7.0", "@ethersproject/random@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz" integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== @@ -708,7 +752,7 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": +"@ethersproject/rlp@^5.7.0", "@ethersproject/rlp@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz" integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== @@ -716,7 +760,7 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": +"@ethersproject/sha2@^5.7.0", "@ethersproject/sha2@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz" integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== @@ -725,7 +769,7 @@ "@ethersproject/logger" "^5.7.0" hash.js "1.1.7" -"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": +"@ethersproject/signing-key@^5.7.0", "@ethersproject/signing-key@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz" integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== @@ -749,7 +793,7 @@ "@ethersproject/sha2" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": +"@ethersproject/strings@^5.7.0", "@ethersproject/strings@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz" integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== @@ -758,7 +802,7 @@ "@ethersproject/constants" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": +"@ethersproject/transactions@^5.7.0", "@ethersproject/transactions@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz" integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== @@ -803,7 +847,7 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/wordlists" "^5.7.0" -"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": +"@ethersproject/web@^5.7.0", "@ethersproject/web@5.7.1": version "5.7.1" resolved "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz" integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== @@ -814,7 +858,7 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": +"@ethersproject/wordlists@^5.7.0", "@ethersproject/wordlists@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz" integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== @@ -856,6 +900,18 @@ resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" @@ -867,118 +923,150 @@ js-yaml "^3.13.1" resolve-from "^5.0.0" -"@istanbuljs/schema@^0.1.2": +"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": version "0.1.3" resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz" - integrity sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg== +"@jest/console@30.2.0": + version "30.2.0" + resolved "https://registry.npmjs.org/@jest/console/-/console-30.2.0.tgz" + integrity sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ== dependencies: - "@jest/types" "^27.5.1" + "@jest/types" "30.2.0" "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^27.5.1" - jest-util "^27.5.1" + chalk "^4.1.2" + jest-message-util "30.2.0" + jest-util "30.2.0" slash "^3.0.0" -"@jest/core@^27.4.7", "@jest/core@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz" - integrity sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ== - dependencies: - "@jest/console" "^27.5.1" - "@jest/reporters" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" +"@jest/core@30.2.0": + version "30.2.0" + resolved "https://registry.npmjs.org/@jest/core/-/core-30.2.0.tgz" + integrity sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ== + dependencies: + "@jest/console" "30.2.0" + "@jest/pattern" "30.0.1" + "@jest/reporters" "30.2.0" + "@jest/test-result" "30.2.0" + "@jest/transform" "30.2.0" + "@jest/types" "30.2.0" "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.8.1" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-changed-files "^27.5.1" - jest-config "^27.5.1" - jest-haste-map "^27.5.1" - jest-message-util "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-resolve-dependencies "^27.5.1" - jest-runner "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" - jest-watcher "^27.5.1" - micromatch "^4.0.4" - rimraf "^3.0.0" + ansi-escapes "^4.3.2" + chalk "^4.1.2" + ci-info "^4.2.0" + exit-x "^0.2.2" + graceful-fs "^4.2.11" + jest-changed-files "30.2.0" + jest-config "30.2.0" + jest-haste-map "30.2.0" + jest-message-util "30.2.0" + jest-regex-util "30.0.1" + jest-resolve "30.2.0" + jest-resolve-dependencies "30.2.0" + jest-runner "30.2.0" + jest-runtime "30.2.0" + jest-snapshot "30.2.0" + jest-util "30.2.0" + jest-validate "30.2.0" + jest-watcher "30.2.0" + micromatch "^4.0.8" + pretty-format "30.2.0" slash "^3.0.0" - strip-ansi "^6.0.0" -"@jest/environment@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz" - integrity sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA== +"@jest/diff-sequences@30.0.1": + version "30.0.1" + resolved "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz" + integrity sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw== + +"@jest/environment@30.2.0": + version "30.2.0" + resolved "https://registry.npmjs.org/@jest/environment/-/environment-30.2.0.tgz" + integrity sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g== dependencies: - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" + "@jest/fake-timers" "30.2.0" + "@jest/types" "30.2.0" "@types/node" "*" - jest-mock "^27.5.1" + jest-mock "30.2.0" -"@jest/fake-timers@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz" - integrity sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ== +"@jest/expect-utils@30.2.0": + version "30.2.0" + resolved "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.2.0.tgz" + integrity sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA== dependencies: - "@jest/types" "^27.5.1" - "@sinonjs/fake-timers" "^8.0.1" - "@types/node" "*" - jest-message-util "^27.5.1" - jest-mock "^27.5.1" - jest-util "^27.5.1" + "@jest/get-type" "30.1.0" -"@jest/globals@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz" - integrity sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q== +"@jest/expect@30.2.0": + version "30.2.0" + resolved "https://registry.npmjs.org/@jest/expect/-/expect-30.2.0.tgz" + integrity sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA== dependencies: - "@jest/environment" "^27.5.1" - "@jest/types" "^27.5.1" - expect "^27.5.1" + expect "30.2.0" + jest-snapshot "30.2.0" -"@jest/reporters@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz" - integrity sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw== +"@jest/fake-timers@30.2.0": + version "30.2.0" + resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.2.0.tgz" + integrity sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw== + dependencies: + "@jest/types" "30.2.0" + "@sinonjs/fake-timers" "^13.0.0" + "@types/node" "*" + jest-message-util "30.2.0" + jest-mock "30.2.0" + jest-util "30.2.0" + +"@jest/get-type@30.1.0": + version "30.1.0" + resolved "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz" + integrity sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA== + +"@jest/globals@30.2.0": + version "30.2.0" + resolved "https://registry.npmjs.org/@jest/globals/-/globals-30.2.0.tgz" + integrity sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw== + dependencies: + "@jest/environment" "30.2.0" + "@jest/expect" "30.2.0" + "@jest/types" "30.2.0" + jest-mock "30.2.0" + +"@jest/pattern@30.0.1": + version "30.0.1" + resolved "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz" + integrity sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA== + dependencies: + "@types/node" "*" + jest-regex-util "30.0.1" + +"@jest/reporters@30.2.0": + version "30.2.0" + resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-30.2.0.tgz" + integrity sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" + "@jest/console" "30.2.0" + "@jest/test-result" "30.2.0" + "@jest/transform" "30.2.0" + "@jest/types" "30.2.0" + "@jridgewell/trace-mapping" "^0.3.25" "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.2" - graceful-fs "^4.2.9" + chalk "^4.1.2" + collect-v8-coverage "^1.0.2" + exit-x "^0.2.2" + glob "^10.3.10" + graceful-fs "^4.2.11" istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^5.1.0" + istanbul-lib-instrument "^6.0.0" istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" + istanbul-lib-source-maps "^5.0.0" istanbul-reports "^3.1.3" - jest-haste-map "^27.5.1" - jest-resolve "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" + jest-message-util "30.2.0" + jest-util "30.2.0" + jest-worker "30.2.0" slash "^3.0.0" - source-map "^0.6.0" - string-length "^4.0.1" - terminal-link "^2.0.0" - v8-to-istanbul "^8.1.0" + string-length "^4.0.2" + v8-to-istanbul "^9.0.1" "@jest/schemas@^29.0.0": version "29.0.0" @@ -987,118 +1075,144 @@ dependencies: "@sinclair/typebox" "^0.24.1" -"@jest/source-map@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz" - integrity sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg== +"@jest/schemas@30.0.5": + version "30.0.5" + resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz" + integrity sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA== dependencies: - callsites "^3.0.0" - graceful-fs "^4.2.9" - source-map "^0.6.0" + "@sinclair/typebox" "^0.34.0" -"@jest/test-result@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz" - integrity sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag== +"@jest/snapshot-utils@30.2.0": + version "30.2.0" + resolved "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.2.0.tgz" + integrity sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug== dependencies: - "@jest/console" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" + "@jest/types" "30.2.0" + chalk "^4.1.2" + graceful-fs "^4.2.11" + natural-compare "^1.4.0" -"@jest/test-sequencer@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz" - integrity sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ== - dependencies: - "@jest/test-result" "^27.5.1" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-runtime "^27.5.1" +"@jest/source-map@30.0.1": + version "30.0.1" + resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-30.0.1.tgz" + integrity sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg== + dependencies: + "@jridgewell/trace-mapping" "^0.3.25" + callsites "^3.1.0" + graceful-fs "^4.2.11" + +"@jest/test-result@30.2.0": + version "30.2.0" + resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-30.2.0.tgz" + integrity sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg== + dependencies: + "@jest/console" "30.2.0" + "@jest/types" "30.2.0" + "@types/istanbul-lib-coverage" "^2.0.6" + collect-v8-coverage "^1.0.2" + +"@jest/test-sequencer@30.2.0": + version "30.2.0" + resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.2.0.tgz" + integrity sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q== + dependencies: + "@jest/test-result" "30.2.0" + graceful-fs "^4.2.11" + jest-haste-map "30.2.0" + slash "^3.0.0" -"@jest/transform@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz" - integrity sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw== - dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^27.5.1" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-regex-util "^27.5.1" - jest-util "^27.5.1" - micromatch "^4.0.4" - pirates "^4.0.4" +"@jest/transform@^29.0.0 || ^30.0.0", "@jest/transform@30.2.0": + version "30.2.0" + resolved "https://registry.npmjs.org/@jest/transform/-/transform-30.2.0.tgz" + integrity sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA== + dependencies: + "@babel/core" "^7.27.4" + "@jest/types" "30.2.0" + "@jridgewell/trace-mapping" "^0.3.25" + babel-plugin-istanbul "^7.0.1" + chalk "^4.1.2" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.11" + jest-haste-map "30.2.0" + jest-regex-util "30.0.1" + jest-util "30.2.0" + micromatch "^4.0.8" + pirates "^4.0.7" slash "^3.0.0" - source-map "^0.6.1" - write-file-atomic "^3.0.0" + write-file-atomic "^5.0.1" -"@jest/types@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz" - integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== +"@jest/types@^29.0.0 || ^30.0.0", "@jest/types@30.2.0": + version "30.2.0" + resolved "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz" + integrity sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg== dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" + "@jest/pattern" "30.0.1" + "@jest/schemas" "30.0.5" + "@types/istanbul-lib-coverage" "^2.0.6" + "@types/istanbul-reports" "^3.0.4" "@types/node" "*" - "@types/yargs" "^16.0.0" - chalk "^4.0.0" + "@types/yargs" "^17.0.33" + chalk "^4.1.2" -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== +"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": + version "0.3.13" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz" + integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/sourcemap-codec" "^1.5.0" + "@jridgewell/trace-mapping" "^0.3.24" -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== +"@jridgewell/remapping@^2.3.5": + version "2.3.5" + resolved "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz" + integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" "@jridgewell/resolve-uri@^3.0.3": + version "3.1.2" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/resolve-uri@^3.1.0": version "3.1.0" resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== -"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": + version "1.5.5" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz" + integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.23", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.28": + version "0.3.31" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz" + integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" -"@jridgewell/trace-mapping@^0.3.9": - version "0.3.14" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz" - integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ== +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== dependencies: "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jsdevtools/ono@7.1.3", "@jsdevtools/ono@^7.1.3": +"@jsdevtools/ono@^7.1.3", "@jsdevtools/ono@7.1.3": version "7.1.3" resolved "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz" integrity sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg== -"@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": +"@noble/hashes@~1.2.0", "@noble/hashes@1.2.0": version "1.2.0" resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz" integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== -"@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": +"@noble/secp256k1@~1.7.0", "@noble/secp256k1@1.7.1": version "1.7.1" resolved "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz" integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== @@ -1111,7 +1225,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -1129,6 +1243,16 @@ resolved "https://registry.npmjs.org/@opentelemetry/api/-/api-1.8.0.tgz" integrity sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w== +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@pkgr/core@^0.2.9": + version "0.2.9" + resolved "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz" + integrity sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA== + "@scure/base@~1.1.0": version "1.1.6" resolved "https://registry.npmjs.org/@scure/base/-/base-1.1.6.tgz" @@ -1173,7 +1297,12 @@ resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz" integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== -"@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.8.3": +"@sinclair/typebox@^0.34.0": + version "0.34.46" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.46.tgz" + integrity sha512-kiW7CtS/NkdvTUjkjUJo7d5JsFfbJ14YjdhDk9KoEgK6nFjKNXZPrX0jfLA8ZlET4cFLHxOZ/0vFKOP+bOxIOQ== + +"@sinonjs/commons@^1.7.0": version "1.8.3" resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz" integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== @@ -1194,12 +1323,12 @@ dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@>=5", "@sinonjs/fake-timers@^9.1.2": - version "9.1.2" - resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz" - integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== +"@sinonjs/commons@^3.0.1": + version "3.0.1" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz" + integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== dependencies: - "@sinonjs/commons" "^1.7.0" + type-detect "4.0.8" "@sinonjs/fake-timers@^10.0.2": version "10.3.0" @@ -1208,21 +1337,19 @@ dependencies: "@sinonjs/commons" "^3.0.0" -"@sinonjs/fake-timers@^8.0.1": - version "8.1.0" - resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz" - integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg== +"@sinonjs/fake-timers@^13.0.0": + version "13.0.5" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz" + integrity sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw== dependencies: - "@sinonjs/commons" "^1.7.0" + "@sinonjs/commons" "^3.0.1" -"@sinonjs/samsam@^6.1.1": - version "6.1.1" - resolved "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.1.tgz" - integrity sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA== +"@sinonjs/fake-timers@^9.1.2": + version "9.1.2" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz" + integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== dependencies: - "@sinonjs/commons" "^1.6.0" - lodash.get "^4.4.2" - type-detect "^4.0.8" + "@sinonjs/commons" "^1.7.0" "@sinonjs/samsam@^7.0.1": version "7.0.1" @@ -1240,7 +1367,7 @@ "@tokenizer/inflate@^0.4.1": version "0.4.1" - resolved "https://registry.yarnpkg.com/@tokenizer/inflate/-/inflate-0.4.1.tgz#fa6cdb8366151b3cc8426bf9755c1ea03a2fba08" + resolved "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.4.1.tgz" integrity sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA== dependencies: debug "^4.4.3" @@ -1256,11 +1383,6 @@ resolved "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz" integrity sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A== -"@tootallnate/once@1": - version "1.1.2" - resolved "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz" - integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== - "@tsconfig/node10@^1.0.7": version "1.0.9" resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz" @@ -1288,13 +1410,13 @@ dependencies: "@types/glob" "*" -"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": - version "7.1.19" - resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz" - integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== +"@types/babel__core@^7.20.5": + version "7.20.5" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" "@types/babel__generator" "*" "@types/babel__template" "*" "@types/babel__traverse" "*" @@ -1314,7 +1436,7 @@ "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": +"@types/babel__traverse@*": version "7.17.1" resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.17.1.tgz" integrity sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA== @@ -1413,22 +1535,15 @@ "@types/minimatch" "*" "@types/node" "*" -"@types/graceful-fs@^4.1.2": - version "4.1.5" - resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz" - integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== - dependencies: - "@types/node" "*" - "@types/http-errors@^2.0.1": version "2.0.1" resolved "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz" integrity sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ== -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.4" - resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.1", "@types/istanbul-lib-coverage@^2.0.6": + version "2.0.6" + resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== "@types/istanbul-lib-report@*": version "3.0.0" @@ -1437,10 +1552,10 @@ dependencies: "@types/istanbul-lib-coverage" "*" -"@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== +"@types/istanbul-reports@^3.0.4": + version "3.0.4" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== dependencies: "@types/istanbul-lib-report" "*" @@ -1501,10 +1616,12 @@ dependencies: undici-types "~5.26.4" -"@types/node@17.0.45": - version "17.0.45" - resolved "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz" - integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== +"@types/node@^24": + version "24.10.4" + resolved "https://registry.npmjs.org/@types/node/-/node-24.10.4.tgz" + integrity sha512-vnDVpYPMzs4wunl27jHrfmwojOGKya0xyM3sH+UE5iv5uPS6vX7UIoh6m+vQc5LGBq52HBKPIn/zcSZVzeDEZg== + dependencies: + undici-types "~7.16.0" "@types/parse-json@^4.0.0": version "4.0.0" @@ -1520,11 +1637,6 @@ pg-protocol "*" pg-types "^2.2.0" -"@types/prettier@^2.1.5": - version "2.6.3" - resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.3.tgz" - integrity sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg== - "@types/qs@*": version "6.9.7" resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" @@ -1537,7 +1649,7 @@ "@types/seedrandom@^3.0.8": version "3.0.8" - resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-3.0.8.tgz#61cc8ed88f93a3c31289c295e6df8ca40be42bdf" + resolved "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.8.tgz" integrity sha512-TY1eezMU2zH2ozQoAFAQFOPpvP15g+ZgSfTZt31AUUH/Rxtnz3H+A/Sv1Snw2/amp//omibc+AEkTaA8KUeOLQ== "@types/serve-static@*": @@ -1555,13 +1667,6 @@ dependencies: "@types/node" "*" -"@types/sinon@10.0.13": - version "10.0.13" - resolved "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.13.tgz" - integrity sha512-UVjDqJblVNQYvVNUsj0PuYYw0ELRmgt1Nt5Vk0pT5f16ROGfcKJY8o1HVuMOJOpD727RrGB9EGvoaTQE5tgxZQ== - dependencies: - "@types/sinonjs__fake-timers" "*" - "@types/sinon@^10.0.10": version "10.0.15" resolved "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.15.tgz" @@ -1596,10 +1701,10 @@ "@types/node" "*" "@types/ssh2-streams" "*" -"@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== +"@types/stack-utils@^2.0.3": + version "2.0.3" + resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz" + integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== "@types/uuid@^8": version "8.3.4" @@ -1611,10 +1716,10 @@ resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== -"@types/yargs@^16.0.0": - version "16.0.4" - resolved "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz" - integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== +"@types/yargs@^17.0.33": + version "17.0.35" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz" + integrity sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg== dependencies: "@types/yargs-parser" "*" @@ -1633,7 +1738,7 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/parser@5.33.0": +"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@5.33.0": version "5.33.0" resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.33.0.tgz" integrity sha512-cgM5cJrWmrDV2KpvlcSkelTBASAs1mgqq+IUGKJvFxWrapHpaRy5EXPQz9YaKF3nZ8KY18ILTiVpUtbIac86/w== @@ -1698,6 +1803,16 @@ "@typescript-eslint/types" "5.33.0" eslint-visitor-keys "^3.3.0" +"@ungap/structured-clone@^1.3.0": + version "1.3.0" + resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz" + integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== + +"@unrs/resolver-binding-darwin-arm64@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz" + integrity sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g== + "@well-known-components/env-config-provider@^1.2.0": version "1.2.0" resolved "https://registry.npmjs.org/@well-known-components/env-config-provider/-/env-config-provider-1.2.0.tgz" @@ -1727,7 +1842,16 @@ on-finished "^2.4.1" path-to-regexp "^6.2.1" -"@well-known-components/interfaces@^1.1.1", "@well-known-components/interfaces@^1.1.3", "@well-known-components/interfaces@^1.3.0", "@well-known-components/interfaces@^1.4.0", "@well-known-components/interfaces@^1.4.1", "@well-known-components/interfaces@^1.4.2", "@well-known-components/interfaces@^1.4.3": +"@well-known-components/interfaces@^1.0.0", "@well-known-components/interfaces@^1.4.2", "@well-known-components/interfaces@^1.5.2": + version "1.5.2" + resolved "https://registry.npmjs.org/@well-known-components/interfaces/-/interfaces-1.5.2.tgz" + integrity sha512-TzKQblOci2Azczk1DZ4JL5aJW7hwq7kHrFMO4lCRMmW51bA71BtiZlq0WP72Dln067xTSoHQAU4WHCFJlGYvEQ== + dependencies: + "@types/node" "^20.3.1" + "@types/node-fetch" "^2.5.12" + typed-url-params "^1.0.1" + +"@well-known-components/interfaces@^1.1.1": version "1.4.3" resolved "https://registry.npmjs.org/@well-known-components/interfaces/-/interfaces-1.4.3.tgz" integrity sha512-roVtoOHG6uaH+nL4C0ISnAwkkopc2FLsS7fqX+roI22EdX9PAknPoImhPU8/3u6jgRAVpglX5Zj4nWZkSaXPkQ== @@ -1736,10 +1860,46 @@ "@types/node-fetch" "^2.5.12" typed-url-params "^1.0.1" -"@well-known-components/interfaces@^1.5.2": - version "1.5.2" - resolved "https://registry.yarnpkg.com/@well-known-components/interfaces/-/interfaces-1.5.2.tgz#ef7001a19d410459e65b216dd948d15be19e4efa" - integrity sha512-TzKQblOci2Azczk1DZ4JL5aJW7hwq7kHrFMO4lCRMmW51bA71BtiZlq0WP72Dln067xTSoHQAU4WHCFJlGYvEQ== +"@well-known-components/interfaces@^1.1.3": + version "1.4.3" + resolved "https://registry.npmjs.org/@well-known-components/interfaces/-/interfaces-1.4.3.tgz" + integrity sha512-roVtoOHG6uaH+nL4C0ISnAwkkopc2FLsS7fqX+roI22EdX9PAknPoImhPU8/3u6jgRAVpglX5Zj4nWZkSaXPkQ== + dependencies: + "@types/node" "^20.3.1" + "@types/node-fetch" "^2.5.12" + typed-url-params "^1.0.1" + +"@well-known-components/interfaces@^1.3.0": + version "1.4.3" + resolved "https://registry.npmjs.org/@well-known-components/interfaces/-/interfaces-1.4.3.tgz" + integrity sha512-roVtoOHG6uaH+nL4C0ISnAwkkopc2FLsS7fqX+roI22EdX9PAknPoImhPU8/3u6jgRAVpglX5Zj4nWZkSaXPkQ== + dependencies: + "@types/node" "^20.3.1" + "@types/node-fetch" "^2.5.12" + typed-url-params "^1.0.1" + +"@well-known-components/interfaces@^1.4.0": + version "1.4.3" + resolved "https://registry.npmjs.org/@well-known-components/interfaces/-/interfaces-1.4.3.tgz" + integrity sha512-roVtoOHG6uaH+nL4C0ISnAwkkopc2FLsS7fqX+roI22EdX9PAknPoImhPU8/3u6jgRAVpglX5Zj4nWZkSaXPkQ== + dependencies: + "@types/node" "^20.3.1" + "@types/node-fetch" "^2.5.12" + typed-url-params "^1.0.1" + +"@well-known-components/interfaces@^1.4.1": + version "1.4.3" + resolved "https://registry.npmjs.org/@well-known-components/interfaces/-/interfaces-1.4.3.tgz" + integrity sha512-roVtoOHG6uaH+nL4C0ISnAwkkopc2FLsS7fqX+roI22EdX9PAknPoImhPU8/3u6jgRAVpglX5Zj4nWZkSaXPkQ== + dependencies: + "@types/node" "^20.3.1" + "@types/node-fetch" "^2.5.12" + typed-url-params "^1.0.1" + +"@well-known-components/interfaces@^1.4.3": + version "1.4.3" + resolved "https://registry.npmjs.org/@well-known-components/interfaces/-/interfaces-1.4.3.tgz" + integrity sha512-roVtoOHG6uaH+nL4C0ISnAwkkopc2FLsS7fqX+roI22EdX9PAknPoImhPU8/3u6jgRAVpglX5Zj4nWZkSaXPkQ== dependencies: "@types/node" "^20.3.1" "@types/node-fetch" "^2.5.12" @@ -1779,11 +1939,6 @@ dependencies: "@well-known-components/interfaces" "^1.4.2" -abab@^2.0.3, abab@^2.0.5: - version "2.0.6" - resolved "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz" - integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== - accepts@~1.3.5, accepts@~1.3.8: version "1.3.8" resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" @@ -1792,35 +1947,17 @@ accepts@~1.3.5, accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" -acorn-globals@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz" - integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== - dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" - acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn-walk@^7.1.1: - version "7.2.0" - resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== - acorn-walk@^8.1.1: version "8.2.0" resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^7.1.1: - version "7.4.1" - resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -acorn@^8.2.4, acorn@^8.4.1, acorn@^8.7.1, acorn@^8.8.0: +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.4.1, acorn@^8.7.1, acorn@^8.8.0: version "8.8.0" resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz" integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== @@ -1830,13 +1967,6 @@ aes-js@3.0.0: resolved "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz" integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== -agent-base@6: - version "6.0.2" - resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" @@ -1857,7 +1987,27 @@ ajv-keywords@^5.1.0: dependencies: fast-deep-equal "^3.1.3" -ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.6: +ajv@^6.10.0: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^6.12.6: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -1867,7 +2017,7 @@ ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.6: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.11.0: +ajv@^8.0.1, ajv@^8.11.0, ajv@^8.8.2: version "8.12.0" resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== @@ -1877,7 +2027,7 @@ ajv@^8.11.0: require-from-string "^2.0.2" uri-js "^4.2.2" -ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: +ansi-escapes@^4.3.0, ansi-escapes@^4.3.2: version "4.3.2" resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== @@ -1890,16 +2040,9 @@ ansi-regex@^5.0.1: integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" + version "6.2.2" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz" + integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" @@ -1913,15 +2056,25 @@ ansi-styles@^5.0.0: resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== +ansi-styles@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + ansi-styles@^6.0.0: version "6.1.0" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz" integrity sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ== -anymatch@^3.0.3: - version "3.1.2" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== +ansi-styles@^6.1.0: + version "6.2.3" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz" + integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== + +anymatch@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" @@ -1931,13 +2084,6 @@ append-field@^1.0.0: resolved "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz" integrity sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw== -append-transform@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz" - integrity sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg== - dependencies: - default-require-extensions "^3.0.0" - archiver-utils@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz" @@ -1967,11 +2113,6 @@ archiver@^5.3.1: tar-stream "^2.2.0" zip-stream "^4.1.0" -archy@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz" - integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw== - arg@^4.1.0: version "4.1.3" resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" @@ -2056,66 +2197,65 @@ b4a@^1.6.4: resolved "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz" integrity sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg== -babel-jest@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz" - integrity sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg== - dependencies: - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^27.5.1" - chalk "^4.0.0" - graceful-fs "^4.2.9" +"babel-jest@^29.0.0 || ^30.0.0", babel-jest@30.2.0: + version "30.2.0" + resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-30.2.0.tgz" + integrity sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw== + dependencies: + "@jest/transform" "30.2.0" + "@types/babel__core" "^7.20.5" + babel-plugin-istanbul "^7.0.1" + babel-preset-jest "30.2.0" + chalk "^4.1.2" + graceful-fs "^4.2.11" slash "^3.0.0" -babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== +babel-plugin-istanbul@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz" + integrity sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" + "@istanbuljs/schema" "^0.1.3" + istanbul-lib-instrument "^6.0.2" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz" - integrity sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ== +babel-plugin-jest-hoist@30.2.0: + version "30.2.0" + resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.2.0.tgz" + integrity sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA== dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.0.0" - "@types/babel__traverse" "^7.0.6" + "@types/babel__core" "^7.20.5" -babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== +babel-preset-current-node-syntax@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz" + integrity sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg== dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-import-attributes" "^7.24.7" + "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" -babel-preset-jest@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz" - integrity sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag== +babel-preset-jest@30.2.0: + version "30.2.0" + resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.2.0.tgz" + integrity sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ== dependencies: - babel-plugin-jest-hoist "^27.5.1" - babel-preset-current-node-syntax "^1.0.0" + babel-plugin-jest-hoist "30.2.0" + babel-preset-current-node-syntax "^1.2.0" balanced-match@^1.0.0: version "1.0.2" @@ -2158,6 +2298,11 @@ base64-js@^1.0.2, base64-js@^1.3.1: resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +baseline-browser-mapping@^2.9.0: + version "2.9.11" + resolved "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz" + integrity sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ== + basic-auth@~2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz" @@ -2193,7 +2338,7 @@ bl@^4.0.3: bloom-filters@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/bloom-filters/-/bloom-filters-3.0.4.tgz#2712bd8f8092fd0a081fe52a17c63be79dbbfc1e" + resolved "https://registry.npmjs.org/bloom-filters/-/bloom-filters-3.0.4.tgz" integrity sha512-BdnPWo2OpYhlvuP2fRzJBdioMCkm7Zp0HCf8NJgF5Mbyqy7VQ/CnTiVWMMyq4EZCBHwj0Kq6098gW2/3RsZsrA== dependencies: "@types/seedrandom" "^3.0.8" @@ -2242,40 +2387,36 @@ brace-expansion@^1.1.7: concat-map "0.0.1" brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + version "2.0.2" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz" + integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== dependencies: balanced-match "^1.0.0" -braces@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== +braces@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - fill-range "^7.0.1" + fill-range "^7.1.1" brorand@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== -browser-process-hrtime@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz" - integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== - -browserslist@^4.20.2: - version "4.21.2" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.2.tgz" - integrity sha512-MonuOgAtUB46uP5CezYbRaYKBNt2LxP0yX+Pmj4LkcDFGkn9Cbpi83d9sCjwQDErXsIJSzY5oKGDbgOlF/LPAA== +browserslist@^4.24.0, "browserslist@>= 4.21.0": + version "4.28.1" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz" + integrity sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA== dependencies: - caniuse-lite "^1.0.30001366" - electron-to-chromium "^1.4.188" - node-releases "^2.0.6" - update-browserslist-db "^1.0.4" + baseline-browser-mapping "^2.9.0" + caniuse-lite "^1.0.30001759" + electron-to-chromium "^1.5.263" + node-releases "^2.0.27" + update-browserslist-db "^1.2.0" -bs-logger@0.x: +bs-logger@^0.2.6: version "0.2.6" resolved "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz" integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== @@ -2304,15 +2445,6 @@ buffer-writer@2.0.0: resolved "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz" integrity sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw== -buffer@4.9.2: - version "4.9.2" - resolved "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz" - integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - buffer@^5.5.0: version "5.7.1" resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" @@ -2321,10 +2453,14 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" -buildcheck@0.0.3: - version "0.0.3" - resolved "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.3.tgz" - integrity sha512-pziaA+p/wdVImfcbsZLNF32EiWyujlQLwolMqUQE8xpKNOH7KmZQaY8sXN7DGOEzPAElo9QTaeNRfGnf3iOJbA== +buffer@4.9.2: + version "4.9.2" + resolved "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" busboy@^1.0.0, busboy@^1.6.0: version "1.6.0" @@ -2348,19 +2484,9 @@ bytes@3.1.2: resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== -caching-transform@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz" - integrity sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA== - dependencies: - hasha "^5.0.0" - make-dir "^3.0.0" - package-hash "^4.0.0" - write-file-atomic "^3.0.0" - call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz" integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== dependencies: es-errors "^1.3.0" @@ -2390,27 +2516,27 @@ call-me-maybe@^1.0.1: resolved "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz" integrity sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw== -callsites@^3.0.0: +callsites@^3.0.0, callsites@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camelcase@^5.0.0, camelcase@^5.3.1: +camelcase@^5.3.1: version "5.3.1" resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.2.0: +camelcase@^6.3.0: version "6.3.0" resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001366: - version "1.0.30001368" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001368.tgz" - integrity sha512-wgfRYa9DenEomLG/SdWgQxpIyvdtH3NW8Vq+tB6AwR9e56iOIcu1im5F/wNdDf04XlKHXqIx4N8Jo0PemeBenQ== +caniuse-lite@^1.0.30001759: + version "1.0.30001762" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001762.tgz" + integrity sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw== -chalk@4.1.2, chalk@^4.0.0: +chalk@^4.0.0, chalk@^4.1.2, chalk@4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -2418,15 +2544,6 @@ chalk@4.1.2, chalk@^4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - char-regex@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" @@ -2437,15 +2554,15 @@ chownr@^1.1.1: resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== -ci-info@^3.2.0: - version "3.3.2" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz" - integrity sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg== +ci-info@^4.2.0: + version "4.3.1" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz" + integrity sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA== -cjs-module-lexer@^1.0.0: - version "1.2.2" - resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz" - integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== +cjs-module-lexer@^2.1.0: + version "2.2.0" + resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz" + integrity sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ== clean-stack@^2.0.0: version "2.2.0" @@ -2475,15 +2592,6 @@ cli-truncate@^3.1.0: slice-ansi "^5.0.0" string-width "^5.0.0" -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" - cliui@^7.0.2: version "7.0.4" resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" @@ -2493,32 +2601,34 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" -clone@2.x: - version "2.1.2" - resolved "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz" - integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" clone@^1.0.2: version "1.0.4" resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz" integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== +clone@2.x: + version "2.1.2" + resolved "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz" + integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== + co@^4.6.0: version "4.6.0" resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz" integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== -collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" +collect-v8-coverage@^1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz" + integrity sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw== color-convert@^2.0.1: version "2.0.1" @@ -2527,11 +2637,6 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" @@ -2573,20 +2678,15 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" -commander@9.3.0: - version "9.3.0" - resolved "https://registry.npmjs.org/commander/-/commander-9.3.0.tgz" - integrity sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw== - commander@^9.3.0: version "9.4.0" resolved "https://registry.npmjs.org/commander/-/commander-9.4.0.tgz" integrity sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw== -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== +commander@9.3.0: + version "9.3.0" + resolved "https://registry.npmjs.org/commander/-/commander-9.3.0.tgz" + integrity sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw== compress-commons@^4.1.0: version "4.1.1" @@ -2650,28 +2750,26 @@ content-type@~1.0.5: resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== -convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -cookie@0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz" - integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== - cookie@^0.5.0: version "0.5.0" resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== +cookie@0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz" + integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== + core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" @@ -2696,14 +2794,6 @@ cosmiconfig@7.0.1: path-type "^4.0.0" yaml "^1.10.0" -cpu-features@~0.0.4: - version "0.0.4" - resolved "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.4.tgz" - integrity sha512-fKiZ/zp1mUwQbnzb9IghXtHtDoTMtNeb8oYGx6kX2SYfhnG0HNdBEBIzB9b5KlXu5DQPhfy3mInbBxFcgwAr3A== - dependencies: - buildcheck "0.0.3" - nan "^2.15.0" - crc-32@^1.2.0: version "1.2.2" resolved "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz" @@ -2729,46 +2819,20 @@ cross-fetch@^3.1.5: dependencies: node-fetch "^2.6.12" -cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== +cross-spawn@^7.0.2, cross-spawn@^7.0.3, cross-spawn@^7.0.6: + version "7.0.6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" which "^2.0.1" -cssom@^0.4.4: - version "0.4.4" - resolved "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz" - integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== - -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== - dependencies: - cssom "~0.3.6" - cuint@^0.2.2: version "0.2.2" resolved "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz" integrity sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw== -data-urls@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz" - integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== - dependencies: - abab "^2.0.3" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" - date-format@^4.0.10, date-format@^4.0.13: version "4.0.13" resolved "https://registry.npmjs.org/date-format/-/date-format-4.0.13.tgz" @@ -2788,14 +2852,7 @@ dcl-catalyst-client@^21.7.0: cross-fetch "^3.1.5" form-data "^4.0.0" -debug@2.6.9: - version "2.6.9" - resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -2804,26 +2861,23 @@ debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: debug@^4.4.3: version "4.4.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== dependencies: ms "^2.1.3" -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== +debug@2.6.9: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" decamelize@^5.0.0: version "5.0.1" resolved "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz" integrity sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA== -decimal.js@^10.2.1: - version "10.3.1" - resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz" - integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== - decompress-response@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz" @@ -2831,32 +2885,25 @@ decompress-response@^6.0.0: dependencies: mimic-response "^3.1.0" -dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" - integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== +dedent@^1.6.0: + version "1.7.1" + resolved "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz" + integrity sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg== deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -deep-is@^0.1.3, deep-is@~0.1.3: +deep-is@^0.1.3: version "0.1.4" resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== - -default-require-extensions@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz" - integrity sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg== - dependencies: - strip-bom "^4.0.0" +deepmerge@^4.3.1: + version "4.3.1" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== defaults@^1.0.3: version "1.0.3" @@ -2879,12 +2926,12 @@ delayed-stream@~1.0.0: resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -depd@2.0.0, depd@~2.0.0: +depd@~2.0.0, depd@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== -destroy@1.2.0, destroy@^1.2.0: +destroy@^1.2.0, destroy@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== @@ -2894,7 +2941,7 @@ detect-libc@^2.0.0, detect-libc@^2.0.2: resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz" integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== -detect-newline@^3.0.0: +detect-newline@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== @@ -2953,13 +3000,6 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -domexception@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz" - integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== - dependencies: - webidl-conversions "^5.0.0" - dotenv@^16.0.1: version "16.0.3" resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz" @@ -2967,7 +3007,7 @@ dotenv@^16.0.1: dunder-proto@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz" integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== dependencies: call-bind-apply-helpers "^1.0.1" @@ -2984,10 +3024,10 @@ ee-first@1.1.1: resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.4.188: - version "1.4.198" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.198.tgz" - integrity sha512-jwqQPdKGeAslcq8L+1SZZgL6uDiIDmTe9Gq4brsdWAH27y7MJ2g9Ue6MyST3ogmSM49EAQP7bype1V5hsuNrmQ== +electron-to-chromium@^1.5.263: + version "1.5.267" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz" + integrity sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw== elliptic@6.5.4: version "6.5.4" @@ -3002,10 +3042,10 @@ elliptic@6.5.4: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" -emittery@^0.8.1: - version "0.8.1" - resolved "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz" - integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== emoji-regex@^8.0.0: version "8.0.0" @@ -3057,7 +3097,7 @@ es-define-property@^1.0.0: es-define-property@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz" integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== es-errors@^1.3.0: @@ -3067,14 +3107,14 @@ es-errors@^1.3.0: es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz" integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== dependencies: es-errors "^1.3.0" es-set-tostringtag@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz" integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== dependencies: es-errors "^1.3.0" @@ -3082,26 +3122,16 @@ es-set-tostringtag@^2.1.0: has-tostringtag "^1.0.2" hasown "^2.0.2" -es6-error@^4.0.1: - version "4.1.1" - resolved "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz" - integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +escalade@^3.1.1, escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-html@~1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - escape-string-regexp@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" @@ -3112,18 +3142,6 @@ escape-string-regexp@^4.0.0: resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - eslint-config-prettier@8.5.0: version "8.5.0" resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz" @@ -3169,7 +3187,7 @@ eslint-visitor-keys@^3.3.0: resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz" integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== -eslint@8.21.0: +eslint@*, "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", eslint@>=5, eslint@>=7.0.0, eslint@>=7.28.0, eslint@8.21.0: version "8.21.0" resolved "https://registry.npmjs.org/eslint/-/eslint-8.21.0.tgz" integrity sha512-/XJ1+Qurf1T9G2M5IHrsjp+xrGT73RZf23xA1z5wB1ZzzEAWSZKvRwhWxTFp1rvkvCfwcvAUNAP31bhKTTGfDA== @@ -3232,7 +3250,7 @@ espree@^9.3.3: acorn-jsx "^5.3.2" eslint-visitor-keys "^3.3.0" -esprima@^4.0.0, esprima@^4.0.1: +esprima@^4.0.0: version "4.0.1" resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -3332,7 +3350,7 @@ events@1.1.1: resolved "https://registry.npmjs.org/events/-/events-1.1.1.tgz" integrity sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw== -execa@^5.0.0: +execa@^5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== @@ -3362,10 +3380,10 @@ execa@^6.1.0: signal-exit "^3.0.7" strip-final-newline "^3.0.0" -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== +exit-x@^0.2.2: + version "0.2.2" + resolved "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz" + integrity sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ== expand-template@^2.0.3: version "2.0.3" @@ -3377,15 +3395,17 @@ expect-more@1.2.0: resolved "https://registry.npmjs.org/expect-more/-/expect-more-1.2.0.tgz" integrity sha512-AVnjc5oh2jgiJjOrjbiKxbwLlNA/zsl2044Nbd09H4+2KwThtSLYKhdOusLYOrcToFAa2uBOWR1ExCN4kOWgbQ== -expect@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz" - integrity sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw== +expect@30.2.0: + version "30.2.0" + resolved "https://registry.npmjs.org/expect/-/expect-30.2.0.tgz" + integrity sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw== dependencies: - "@jest/types" "^27.5.1" - jest-get-type "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" + "@jest/expect-utils" "30.2.0" + "@jest/get-type" "30.1.0" + jest-matcher-utils "30.2.0" + jest-message-util "30.2.0" + jest-mock "30.2.0" + jest-util "30.2.0" express-openapi-validator@4.13.8: version "4.13.8" @@ -3473,12 +3493,12 @@ fast-glob@^3.2.9: merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0, fast-json-stable-stringify@2.x: version "2.1.0" resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6: version "2.0.6" resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== @@ -3490,10 +3510,10 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" -fb-watchman@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz" - integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== +fb-watchman@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== dependencies: bser "2.1.1" @@ -3504,6 +3524,16 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" +file-type@^21.1.1: + version "21.1.1" + resolved "https://registry.npmjs.org/file-type/-/file-type-21.1.1.tgz" + integrity sha512-ifJXo8zUqbQ/bLbl9sFoqHNTNWbnPY1COImFfM6CCy7z+E+jC1eY9YfOKkx0fckIg+VljAy2/87T61fp0+eEkg== + dependencies: + "@tokenizer/inflate" "^0.4.1" + strtok3 "^10.3.4" + token-types "^6.1.1" + uint8array-extras "^1.4.0" + file-type@15: version "15.0.1" resolved "https://registry.npmjs.org/file-type/-/file-type-15.0.1.tgz" @@ -3514,20 +3544,10 @@ file-type@15: token-types "^2.0.0" typedarray-to-buffer "^3.1.5" -file-type@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-21.1.1.tgz#79be659d9a29e72bd32bdaf9ac2c83d203a58ca0" - integrity sha512-ifJXo8zUqbQ/bLbl9sFoqHNTNWbnPY1COImFfM6CCy7z+E+jC1eY9YfOKkx0fckIg+VljAy2/87T61fp0+eEkg== - dependencies: - "@tokenizer/inflate" "^0.4.1" - strtok3 "^10.3.4" - token-types "^6.1.1" - uint8array-extras "^1.4.0" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" @@ -3544,15 +3564,6 @@ finalhandler@1.2.0: statuses "2.0.1" unpipe "~1.0.0" -find-cache-dir@^3.2.0: - version "3.3.2" - resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" @@ -3589,22 +3600,13 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" -foreground-child@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz" - integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^3.0.2" - -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== +foreground-child@^3.1.0: + version "3.3.1" + resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz" + integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" + cross-spawn "^7.0.6" + signal-exit "^4.0.1" form-data@^4.0.0: version "4.0.0" @@ -3617,7 +3619,7 @@ form-data@^4.0.0: form-data@^4.0.5: version "4.0.5" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.5.tgz#b49e48858045ff4cbf6b03e1805cebcad3679053" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz" integrity sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w== dependencies: asynckit "^0.4.0" @@ -3646,25 +3648,11 @@ fresh@0.5.2: resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== -fromentries@^1.2.0: - version "1.3.2" - resolved "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz" - integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== - fs-constants@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== -fs-extra@10.1.0: - version "10.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" @@ -3674,15 +3662,24 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@10.1.0: + version "10.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^2.3.2: - version "2.3.2" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== +fsevents@^2.3.3: + version "2.3.3" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.1: version "1.1.1" @@ -3704,7 +3701,7 @@ gensync@^1.0.0-beta.2: resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^2.0.1, get-caller-file@^2.0.5: +get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== @@ -3741,7 +3738,7 @@ get-intrinsic@^1.2.4: get-intrinsic@^1.2.6: version "1.3.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz" integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== dependencies: call-bind-apply-helpers "^1.0.2" @@ -3767,7 +3764,7 @@ get-port@^5.1.1: get-proto@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz" integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== dependencies: dunder-proto "^1.0.1" @@ -3797,18 +3794,31 @@ glob-parent@^6.0.1: dependencies: is-glob "^4.0.3" -glob@8.0.3: - version "8.0.3" - resolved "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz" - integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ== +glob@^10.3.10: + version "10.5.0" + resolved "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz" + integrity sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^5.0.1" + minimatch "^3.1.1" once "^1.3.0" + path-is-absolute "^1.0.0" -glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@^7.1.4: version "7.2.3" resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -3820,10 +3830,16 @@ glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== +glob@8.0.3: + version "8.0.3" + resolved "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz" + integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" globals@^13.15.0: version "13.17.0" @@ -3853,23 +3869,30 @@ gopd@^1.0.1: gopd@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== -graceful-fs@^4.1.15, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.9: - version "4.2.10" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11: + version "4.2.11" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== grapheme-splitter@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz" integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== +handlebars@^4.7.8: + version "4.7.8" + resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz" + integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.2" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" has-flag@^4.0.0: version "4.0.0" @@ -3895,7 +3918,7 @@ has-symbols@^1.0.2, has-symbols@^1.0.3: has-symbols@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz" integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== has-tostringtag@^1.0.0: @@ -3907,7 +3930,7 @@ has-tostringtag@^1.0.0: has-tostringtag@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: has-symbols "^1.0.3" @@ -3919,7 +3942,7 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: +hash.js@^1.0.0, hash.js@^1.0.3, hash.js@1.1.7: version "1.1.7" resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== @@ -3927,14 +3950,6 @@ hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" -hasha@^5.0.0: - version "5.2.2" - resolved "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz" - integrity sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ== - dependencies: - is-stream "^2.0.0" - type-fest "^0.8.0" - hasown@^2.0.0, hasown@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" @@ -3951,19 +3966,12 @@ hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -html-encoding-sniffer@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz" - integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== - dependencies: - whatwg-encoding "^1.0.5" - html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -http-errors@2.0.0, http-errors@^2.0.0: +http-errors@^2.0.0, http-errors@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== @@ -3974,23 +3982,6 @@ http-errors@2.0.0, http-errors@^2.0.0: statuses "2.0.1" toidentifier "1.0.1" -http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== - dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - -https-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - human-signals@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" @@ -4008,16 +3999,21 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -ieee754@1.1.13: - version "1.1.13" - resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz" - integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== +ieee754@^1.1.13, ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ieee754@^1.1.13, ieee754@^1.1.4, ieee754@^1.2.1: +ieee754@^1.1.4: version "1.2.1" resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== +ieee754@1.1.13: + version "1.1.13" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + ignore@^5.2.0: version "5.2.0" resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz" @@ -4031,10 +4027,10 @@ import-fresh@^3.0.0, import-fresh@^3.2.1: parent-module "^1.0.0" resolve-from "^4.0.0" -import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== +import-local@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz" + integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== dependencies: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" @@ -4057,7 +4053,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: +inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@2, inherits@2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -4100,13 +4096,6 @@ is-callable@^1.1.3: resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.9.0: - version "2.9.0" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz" - integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== - dependencies: - has "^1.0.3" - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" @@ -4122,7 +4111,7 @@ is-fullwidth-code-point@^4.0.0: resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz" integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== -is-generator-fn@^2.0.0: +is-generator-fn@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== @@ -4146,11 +4135,6 @@ is-number@^7.0.0: resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== - is-stream@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" @@ -4173,21 +4157,16 @@ is-typedarray@^1.0.0: resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== +isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== isarray@0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== -isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - isexe@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" @@ -4198,45 +4177,16 @@ istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz" integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== -istanbul-lib-hook@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz" - integrity sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ== - dependencies: - append-transform "^2.0.0" - -istanbul-lib-instrument@^4.0.0: - version "4.0.3" - resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz" - integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== - dependencies: - "@babel/core" "^7.7.5" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.0.0" - semver "^6.3.0" - -istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: - version "5.2.0" - resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz" - integrity sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-processinfo@^2.0.2: - version "2.0.3" - resolved "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz" - integrity sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg== +istanbul-lib-instrument@^6.0.0, istanbul-lib-instrument@^6.0.2: + version "6.0.3" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz" + integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== dependencies: - archy "^1.0.0" - cross-spawn "^7.0.3" + "@babel/core" "^7.23.9" + "@babel/parser" "^7.23.9" + "@istanbuljs/schema" "^0.1.3" istanbul-lib-coverage "^3.2.0" - p-map "^3.0.0" - rimraf "^3.0.0" - uuid "^8.3.2" + semver "^7.5.4" istanbul-lib-report@^3.0.0: version "3.0.0" @@ -4247,16 +4197,16 @@ istanbul-lib-report@^3.0.0: make-dir "^3.0.0" supports-color "^7.1.0" -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== +istanbul-lib-source-maps@^5.0.0: + version "5.0.6" + resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz" + integrity sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A== dependencies: + "@jridgewell/trace-mapping" "^0.3.23" debug "^4.1.1" istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" -istanbul-reports@^3.0.2, istanbul-reports@^3.1.3: +istanbul-reports@^3.1.3: version "3.1.5" resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz" integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== @@ -4264,85 +4214,93 @@ istanbul-reports@^3.0.2, istanbul-reports@^3.1.3: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jest-changed-files@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz" - integrity sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw== - dependencies: - "@jest/types" "^27.5.1" - execa "^5.0.0" - throat "^6.0.1" - -jest-circus@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz" - integrity sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw== +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== dependencies: - "@jest/environment" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jest-changed-files@30.2.0: + version "30.2.0" + resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.2.0.tgz" + integrity sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ== + dependencies: + execa "^5.1.1" + jest-util "30.2.0" + p-limit "^3.1.0" + +jest-circus@30.2.0: + version "30.2.0" + resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-30.2.0.tgz" + integrity sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg== + dependencies: + "@jest/environment" "30.2.0" + "@jest/expect" "30.2.0" + "@jest/test-result" "30.2.0" + "@jest/types" "30.2.0" "@types/node" "*" - chalk "^4.0.0" + chalk "^4.1.2" co "^4.6.0" - dedent "^0.7.0" - expect "^27.5.1" - is-generator-fn "^2.0.0" - jest-each "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" + dedent "^1.6.0" + is-generator-fn "^2.1.0" + jest-each "30.2.0" + jest-matcher-utils "30.2.0" + jest-message-util "30.2.0" + jest-runtime "30.2.0" + jest-snapshot "30.2.0" + jest-util "30.2.0" + p-limit "^3.1.0" + pretty-format "30.2.0" + pure-rand "^7.0.0" slash "^3.0.0" - stack-utils "^2.0.3" - throat "^6.0.1" - -jest-cli@^27.4.7: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz" - integrity sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw== - dependencies: - "@jest/core" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - import-local "^3.0.2" - jest-config "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" - prompts "^2.0.1" - yargs "^16.2.0" - -jest-config@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz" - integrity sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA== - dependencies: - "@babel/core" "^7.8.0" - "@jest/test-sequencer" "^27.5.1" - "@jest/types" "^27.5.1" - babel-jest "^27.5.1" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.1" - graceful-fs "^4.2.9" - jest-circus "^27.5.1" - jest-environment-jsdom "^27.5.1" - jest-environment-node "^27.5.1" - jest-get-type "^27.5.1" - jest-jasmine2 "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-runner "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" - micromatch "^4.0.4" + stack-utils "^2.0.6" + +jest-cli@30.2.0: + version "30.2.0" + resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-30.2.0.tgz" + integrity sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA== + dependencies: + "@jest/core" "30.2.0" + "@jest/test-result" "30.2.0" + "@jest/types" "30.2.0" + chalk "^4.1.2" + exit-x "^0.2.2" + import-local "^3.2.0" + jest-config "30.2.0" + jest-util "30.2.0" + jest-validate "30.2.0" + yargs "^17.7.2" + +jest-config@30.2.0: + version "30.2.0" + resolved "https://registry.npmjs.org/jest-config/-/jest-config-30.2.0.tgz" + integrity sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA== + dependencies: + "@babel/core" "^7.27.4" + "@jest/get-type" "30.1.0" + "@jest/pattern" "30.0.1" + "@jest/test-sequencer" "30.2.0" + "@jest/types" "30.2.0" + babel-jest "30.2.0" + chalk "^4.1.2" + ci-info "^4.2.0" + deepmerge "^4.3.1" + glob "^10.3.10" + graceful-fs "^4.2.11" + jest-circus "30.2.0" + jest-docblock "30.2.0" + jest-environment-node "30.2.0" + jest-regex-util "30.0.1" + jest-resolve "30.2.0" + jest-runner "30.2.0" + jest-util "30.2.0" + jest-validate "30.2.0" + micromatch "^4.0.8" parse-json "^5.2.0" - pretty-format "^27.5.1" + pretty-format "30.2.0" slash "^3.0.0" strip-json-comments "^3.1.1" @@ -4356,48 +4314,46 @@ jest-diff@^27.5.1: jest-get-type "^27.5.1" pretty-format "^27.5.1" -jest-docblock@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz" - integrity sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ== - dependencies: - detect-newline "^3.0.0" - -jest-each@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz" - integrity sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ== - dependencies: - "@jest/types" "^27.5.1" - chalk "^4.0.0" - jest-get-type "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" - -jest-environment-jsdom@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz" - integrity sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - jest-mock "^27.5.1" - jest-util "^27.5.1" - jsdom "^16.6.0" - -jest-environment-node@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz" - integrity sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" +jest-diff@30.2.0: + version "30.2.0" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz" + integrity sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A== + dependencies: + "@jest/diff-sequences" "30.0.1" + "@jest/get-type" "30.1.0" + chalk "^4.1.2" + pretty-format "30.2.0" + +jest-docblock@30.2.0: + version "30.2.0" + resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.2.0.tgz" + integrity sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA== + dependencies: + detect-newline "^3.1.0" + +jest-each@30.2.0: + version "30.2.0" + resolved "https://registry.npmjs.org/jest-each/-/jest-each-30.2.0.tgz" + integrity sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ== + dependencies: + "@jest/get-type" "30.1.0" + "@jest/types" "30.2.0" + chalk "^4.1.2" + jest-util "30.2.0" + pretty-format "30.2.0" + +jest-environment-node@30.2.0: + version "30.2.0" + resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.2.0.tgz" + integrity sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA== + dependencies: + "@jest/environment" "30.2.0" + "@jest/fake-timers" "30.2.0" + "@jest/types" "30.2.0" "@types/node" "*" - jest-mock "^27.5.1" - jest-util "^27.5.1" + jest-mock "30.2.0" + jest-util "30.2.0" + jest-validate "30.2.0" jest-extra-utils@^0.1.0: version "0.1.0" @@ -4416,48 +4372,23 @@ jest-get-type@^29.2.0: resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz" integrity sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA== -jest-haste-map@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz" - integrity sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng== +jest-haste-map@30.2.0: + version "30.2.0" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.2.0.tgz" + integrity sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw== dependencies: - "@jest/types" "^27.5.1" - "@types/graceful-fs" "^4.1.2" + "@jest/types" "30.2.0" "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^27.5.1" - jest-serializer "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" - micromatch "^4.0.4" - walker "^1.0.7" + anymatch "^3.1.3" + fb-watchman "^2.0.2" + graceful-fs "^4.2.11" + jest-regex-util "30.0.1" + jest-util "30.2.0" + jest-worker "30.2.0" + micromatch "^4.0.8" + walker "^1.0.8" optionalDependencies: - fsevents "^2.3.2" - -jest-jasmine2@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz" - integrity sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/source-map" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - expect "^27.5.1" - is-generator-fn "^2.0.0" - jest-each "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" - throat "^6.0.1" + fsevents "^2.3.3" jest-junit@^13.0.0: version "13.2.0" @@ -4469,14 +4400,6 @@ jest-junit@^13.0.0: uuid "^8.3.2" xml "^1.0.1" -jest-leak-detector@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz" - integrity sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ== - dependencies: - jest-get-type "^27.5.1" - pretty-format "^27.5.1" - jest-leak-detector@^29.3.1: version "29.3.1" resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz" @@ -4485,7 +4408,15 @@ jest-leak-detector@^29.3.1: jest-get-type "^29.2.0" pretty-format "^29.3.1" -jest-matcher-utils@^27.0.0, jest-matcher-utils@^27.5.1: +jest-leak-detector@30.2.0: + version "30.2.0" + resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.2.0.tgz" + integrity sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ== + dependencies: + "@jest/get-type" "30.1.0" + pretty-format "30.2.0" + +jest-matcher-utils@^27.0.0: version "27.5.1" resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz" integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== @@ -4495,209 +4426,213 @@ jest-matcher-utils@^27.0.0, jest-matcher-utils@^27.5.1: jest-get-type "^27.5.1" pretty-format "^27.5.1" -jest-message-util@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz" - integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^27.5.1" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^27.5.1" +jest-matcher-utils@30.2.0: + version "30.2.0" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz" + integrity sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg== + dependencies: + "@jest/get-type" "30.1.0" + chalk "^4.1.2" + jest-diff "30.2.0" + pretty-format "30.2.0" + +jest-message-util@30.2.0: + version "30.2.0" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.2.0.tgz" + integrity sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw== + dependencies: + "@babel/code-frame" "^7.27.1" + "@jest/types" "30.2.0" + "@types/stack-utils" "^2.0.3" + chalk "^4.1.2" + graceful-fs "^4.2.11" + micromatch "^4.0.8" + pretty-format "30.2.0" slash "^3.0.0" - stack-utils "^2.0.3" + stack-utils "^2.0.6" -jest-mock@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz" - integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og== +jest-mock@30.2.0: + version "30.2.0" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-30.2.0.tgz" + integrity sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw== dependencies: - "@jest/types" "^27.5.1" + "@jest/types" "30.2.0" "@types/node" "*" + jest-util "30.2.0" -jest-pnp-resolver@^1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz" - integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== - -jest-regex-util@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz" - integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== - -jest-resolve-dependencies@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz" - integrity sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg== - dependencies: - "@jest/types" "^27.5.1" - jest-regex-util "^27.5.1" - jest-snapshot "^27.5.1" - -jest-resolve@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz" - integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw== - dependencies: - "@jest/types" "^27.5.1" - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-pnp-resolver "^1.2.2" - jest-util "^27.5.1" - jest-validate "^27.5.1" - resolve "^1.20.0" - resolve.exports "^1.1.0" +jest-pnp-resolver@^1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== + +jest-regex-util@30.0.1: + version "30.0.1" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz" + integrity sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA== + +jest-resolve-dependencies@30.2.0: + version "30.2.0" + resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.2.0.tgz" + integrity sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w== + dependencies: + jest-regex-util "30.0.1" + jest-snapshot "30.2.0" + +jest-resolve@*, jest-resolve@30.2.0: + version "30.2.0" + resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.2.0.tgz" + integrity sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A== + dependencies: + chalk "^4.1.2" + graceful-fs "^4.2.11" + jest-haste-map "30.2.0" + jest-pnp-resolver "^1.2.3" + jest-util "30.2.0" + jest-validate "30.2.0" slash "^3.0.0" - -jest-runner@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz" - integrity sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ== - dependencies: - "@jest/console" "^27.5.1" - "@jest/environment" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" + unrs-resolver "^1.7.11" + +jest-runner@30.2.0: + version "30.2.0" + resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-30.2.0.tgz" + integrity sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ== + dependencies: + "@jest/console" "30.2.0" + "@jest/environment" "30.2.0" + "@jest/test-result" "30.2.0" + "@jest/transform" "30.2.0" + "@jest/types" "30.2.0" "@types/node" "*" - chalk "^4.0.0" - emittery "^0.8.1" - graceful-fs "^4.2.9" - jest-docblock "^27.5.1" - jest-environment-jsdom "^27.5.1" - jest-environment-node "^27.5.1" - jest-haste-map "^27.5.1" - jest-leak-detector "^27.5.1" - jest-message-util "^27.5.1" - jest-resolve "^27.5.1" - jest-runtime "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" - source-map-support "^0.5.6" - throat "^6.0.1" - -jest-runtime@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz" - integrity sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/globals" "^27.5.1" - "@jest/source-map" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - execa "^5.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-message-util "^27.5.1" - jest-mock "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" + chalk "^4.1.2" + emittery "^0.13.1" + exit-x "^0.2.2" + graceful-fs "^4.2.11" + jest-docblock "30.2.0" + jest-environment-node "30.2.0" + jest-haste-map "30.2.0" + jest-leak-detector "30.2.0" + jest-message-util "30.2.0" + jest-resolve "30.2.0" + jest-runtime "30.2.0" + jest-util "30.2.0" + jest-watcher "30.2.0" + jest-worker "30.2.0" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@30.2.0: + version "30.2.0" + resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.2.0.tgz" + integrity sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg== + dependencies: + "@jest/environment" "30.2.0" + "@jest/fake-timers" "30.2.0" + "@jest/globals" "30.2.0" + "@jest/source-map" "30.0.1" + "@jest/test-result" "30.2.0" + "@jest/transform" "30.2.0" + "@jest/types" "30.2.0" + "@types/node" "*" + chalk "^4.1.2" + cjs-module-lexer "^2.1.0" + collect-v8-coverage "^1.0.2" + glob "^10.3.10" + graceful-fs "^4.2.11" + jest-haste-map "30.2.0" + jest-message-util "30.2.0" + jest-mock "30.2.0" + jest-regex-util "30.0.1" + jest-resolve "30.2.0" + jest-snapshot "30.2.0" + jest-util "30.2.0" slash "^3.0.0" strip-bom "^4.0.0" -jest-serializer@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz" - integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w== - dependencies: - "@types/node" "*" - graceful-fs "^4.2.9" - -jest-snapshot@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz" - integrity sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA== - dependencies: - "@babel/core" "^7.7.2" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/traverse" "^7.7.2" - "@babel/types" "^7.0.0" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/babel__traverse" "^7.0.4" - "@types/prettier" "^2.1.5" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^27.5.1" - graceful-fs "^4.2.9" - jest-diff "^27.5.1" - jest-get-type "^27.5.1" - jest-haste-map "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-util "^27.5.1" - natural-compare "^1.4.0" - pretty-format "^27.5.1" - semver "^7.3.2" - -jest-util@^27.0.0, jest-util@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz" - integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== - dependencies: - "@jest/types" "^27.5.1" +jest-snapshot@30.2.0: + version "30.2.0" + resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.2.0.tgz" + integrity sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA== + dependencies: + "@babel/core" "^7.27.4" + "@babel/generator" "^7.27.5" + "@babel/plugin-syntax-jsx" "^7.27.1" + "@babel/plugin-syntax-typescript" "^7.27.1" + "@babel/types" "^7.27.3" + "@jest/expect-utils" "30.2.0" + "@jest/get-type" "30.1.0" + "@jest/snapshot-utils" "30.2.0" + "@jest/transform" "30.2.0" + "@jest/types" "30.2.0" + babel-preset-current-node-syntax "^1.2.0" + chalk "^4.1.2" + expect "30.2.0" + graceful-fs "^4.2.11" + jest-diff "30.2.0" + jest-matcher-utils "30.2.0" + jest-message-util "30.2.0" + jest-util "30.2.0" + pretty-format "30.2.0" + semver "^7.7.2" + synckit "^0.11.8" + +"jest-util@^29.0.0 || ^30.0.0", jest-util@30.2.0: + version "30.2.0" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-30.2.0.tgz" + integrity sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA== + dependencies: + "@jest/types" "30.2.0" "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-validate@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz" - integrity sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ== - dependencies: - "@jest/types" "^27.5.1" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^27.5.1" + chalk "^4.1.2" + ci-info "^4.2.0" + graceful-fs "^4.2.11" + picomatch "^4.0.2" + +jest-validate@30.2.0: + version "30.2.0" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-30.2.0.tgz" + integrity sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw== + dependencies: + "@jest/get-type" "30.1.0" + "@jest/types" "30.2.0" + camelcase "^6.3.0" + chalk "^4.1.2" leven "^3.1.0" - pretty-format "^27.5.1" + pretty-format "30.2.0" -jest-watcher@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz" - integrity sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw== +jest-watcher@30.2.0: + version "30.2.0" + resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.2.0.tgz" + integrity sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg== dependencies: - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" + "@jest/test-result" "30.2.0" + "@jest/types" "30.2.0" "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - jest-util "^27.5.1" - string-length "^4.0.1" + ansi-escapes "^4.3.2" + chalk "^4.1.2" + emittery "^0.13.1" + jest-util "30.2.0" + string-length "^4.0.2" -jest-worker@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== +jest-worker@30.2.0: + version "30.2.0" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-30.2.0.tgz" + integrity sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g== dependencies: "@types/node" "*" + "@ungap/structured-clone" "^1.3.0" + jest-util "30.2.0" merge-stream "^2.0.0" - supports-color "^8.0.0" + supports-color "^8.1.1" -jest@27.4.7: - version "27.4.7" - resolved "https://registry.npmjs.org/jest/-/jest-27.4.7.tgz" - integrity sha512-8heYvsx7nV/m8m24Vk26Y87g73Ba6ueUd0MWed/NXMhSZIm62U/llVbS0PJe1SHunbyXjJ/BqG1z9bFjGUIvTg== +"jest@^29.0.0 || ^30.0.0", jest@^30.2.0: + version "30.2.0" + resolved "https://registry.npmjs.org/jest/-/jest-30.2.0.tgz" + integrity sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A== dependencies: - "@jest/core" "^27.4.7" - import-local "^3.0.2" - jest-cli "^27.4.7" + "@jest/core" "30.2.0" + "@jest/types" "30.2.0" + import-local "^3.2.0" + jest-cli "30.2.0" jmespath@0.16.0: version "0.16.0" @@ -4740,43 +4675,10 @@ js-yaml@^4.0.0, js-yaml@^4.1.0: dependencies: argparse "^2.0.1" -jsdom@^16.6.0: - version "16.7.0" - resolved "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz" - integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== - dependencies: - abab "^2.0.5" - acorn "^8.2.4" - acorn-globals "^6.0.0" - cssom "^0.4.4" - cssstyle "^2.3.0" - data-urls "^2.0.0" - decimal.js "^10.2.1" - domexception "^2.0.1" - escodegen "^2.0.0" - form-data "^3.0.0" - html-encoding-sniffer "^2.0.1" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.0" - parse5 "6.0.1" - saxes "^5.0.1" - symbol-tree "^3.2.4" - tough-cookie "^4.0.0" - w3c-hr-time "^1.0.2" - w3c-xmlserializer "^2.0.0" - webidl-conversions "^6.1.0" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.5.0" - ws "^7.4.6" - xml-name-validator "^3.0.0" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +jsesc@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== json-parse-even-better-errors@^2.3.0: version "2.3.1" @@ -4805,10 +4707,10 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json5@2.x, json5@^2.2.1: - version "2.2.1" - resolved "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz" - integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonfile@^4.0.0: version "4.0.0" @@ -4831,11 +4733,6 @@ just-extend@^4.0.2: resolved "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz" integrity sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg== -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - lazystream@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz" @@ -4856,14 +4753,6 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - lilconfig@2.0.5: version "2.0.5" resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz" @@ -4941,11 +4830,6 @@ lodash.flatten@^4.4.0: resolved "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz" integrity sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g== -lodash.flattendeep@^4.4.0: - version "4.4.0" - resolved "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz" - integrity sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ== - lodash.get@^4.4.2: version "4.4.2" resolved "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz" @@ -4956,7 +4840,7 @@ lodash.isplainobject@^4.0.6: resolved "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz" integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== -lodash.memoize@4.x: +lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== @@ -4981,7 +4865,7 @@ lodash.zipobject@^4.1.3: resolved "https://registry.npmjs.org/lodash.zipobject/-/lodash.zipobject-4.1.3.tgz" integrity sha512-A9SzX4hMKWS25MyalwcOnNoplyHbkNVsjidhTp8ru0Sj23wY9GWBKS8gAIGDSAqeWjIjvE4KBEl24XXAs+v4wQ== -lodash@^4.17.21, lodash@^4.17.5, lodash@^4.7.0: +lodash@^4.17.21: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -5012,10 +4896,17 @@ long@^5.2.0: resolved "https://registry.npmjs.org/long/-/long-5.2.0.tgz" integrity sha512-9RTUNjK60eJbx3uz+TEGF7fUr29ZDxR5QzXcyDpeSfeH28S9ycINflOgOlppit5U+4kNTe83KQnMEerw7GmE8w== -lru-cache@7.8.2: - version "7.8.2" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-7.8.2.tgz" - integrity sha512-tVtvt+EqoUgjtIPD3rXSJCSf5izSRJShgnzUeK59T+wxZ9LrFEP3GxhX/Mhf8Rl7kk4ngd4vZaV+5sEibhvQ+A== +lru-cache@^10.2.0: + version "10.4.3" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" lru-cache@^6.0.0: version "6.0.0" @@ -5029,14 +4920,19 @@ lru-cache@^7.14.0: resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz" integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== -make-dir@^3.0.0, make-dir@^3.0.2: +lru-cache@7.8.2: + version "7.8.2" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-7.8.2.tgz" + integrity sha512-tVtvt+EqoUgjtIPD3rXSJCSf5izSRJShgnzUeK59T+wxZ9LrFEP3GxhX/Mhf8Rl7kk4ngd4vZaV+5sEibhvQ+A== + +make-dir@^3.0.0: version "3.1.0" resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" -make-error@1.x, make-error@^1.1.1: +make-error@^1.1.1, make-error@^1.3.6: version "1.3.6" resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== @@ -5050,19 +4946,19 @@ makeerror@1.0.12: math-intrinsics@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz" integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - media-typer@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz" integrity sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw== +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + merge-descriptors@1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz" @@ -5083,15 +4979,15 @@ methods@~1.1.2: resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== -micromatch@^4.0.4, micromatch@^4.0.5: - version "4.0.5" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== +micromatch@^4.0.4, micromatch@^4.0.5, micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: - braces "^3.0.2" + braces "^3.0.3" picomatch "^2.3.1" -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": +"mime-db@>= 1.43.0 < 2", mime-db@1.52.0: version "1.52.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== @@ -5133,21 +5029,35 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== -minimatch@5.1.0, minimatch@^5.0.1, minimatch@^5.1.0: +minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1, minimatch@5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz" integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg== dependencies: brace-expansion "^2.0.1" -minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== +minimatch@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz" + integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg== dependencies: - brace-expansion "^1.1.7" + brace-expansion "^2.0.1" + +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" -minimist@^1.2.0, minimist@^1.2.3: +minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5: version "1.2.8" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -5157,6 +5067,11 @@ minimist@^1.2.6: resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + mitt@^3.0.0, mitt@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz" @@ -5190,6 +5105,11 @@ morgan@1.10.0: on-finished "~2.3.0" on-headers "~1.0.2" +ms@^2.1.3, ms@2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + ms@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" @@ -5200,11 +5120,6 @@ ms@2.1.2: resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3, ms@^2.1.3: - version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - multer@^1.4.5-lts.1: version "1.4.5-lts.1" resolved "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz" @@ -5218,7 +5133,7 @@ multer@^1.4.5-lts.1: type-is "^1.6.4" xtend "^4.0.0" -nan@^2.15.0, nan@^2.16.0: +nan@^2.16.0: version "2.16.0" resolved "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz" integrity sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA== @@ -5228,6 +5143,11 @@ napi-build-utils@^1.0.1: resolved "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz" integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== +napi-postinstall@^0.3.0: + version "0.3.4" + resolved "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz" + integrity sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" @@ -5238,16 +5158,10 @@ negotiator@0.6.3: resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== -nise@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/nise/-/nise-5.1.1.tgz" - integrity sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A== - dependencies: - "@sinonjs/commons" "^1.8.3" - "@sinonjs/fake-timers" ">=5" - "@sinonjs/text-encoding" "^0.7.1" - just-extend "^4.0.2" - path-to-regexp "^1.7.0" +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== nise@^5.1.2: version "5.1.4" @@ -5279,13 +5193,6 @@ node-cache@^5.1.2: dependencies: clone "2.x" -node-fetch@2.6.7: - version "2.6.7" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" - node-fetch@^2.6.12: version "2.7.0" resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz" @@ -5300,6 +5207,13 @@ node-fetch@^2.6.9: dependencies: whatwg-url "^5.0.0" +node-fetch@2.6.7: + version "2.6.7" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" @@ -5315,17 +5229,10 @@ node-pg-migrate@6.2.2: mkdirp "~1.0.0" yargs "~17.3.0" -node-preload@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz" - integrity sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ== - dependencies: - process-on-spawn "^1.0.0" - -node-releases@^2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz" - integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== +node-releases@^2.0.27: + version "2.0.27" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz" + integrity sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA== normalize-path@^3.0.0: version "3.0.0" @@ -5346,44 +5253,6 @@ npm-run-path@^5.1.0: dependencies: path-key "^4.0.0" -nwsapi@^2.2.0: - version "2.2.1" - resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.1.tgz" - integrity sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg== - -nyc@^15.1.0: - version "15.1.0" - resolved "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz" - integrity sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A== - dependencies: - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - caching-transform "^4.0.0" - convert-source-map "^1.7.0" - decamelize "^1.2.0" - find-cache-dir "^3.2.0" - find-up "^4.1.0" - foreground-child "^2.0.0" - get-package-type "^0.1.0" - glob "^7.1.6" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-hook "^3.0.0" - istanbul-lib-instrument "^4.0.0" - istanbul-lib-processinfo "^2.0.2" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.0.2" - make-dir "^3.0.0" - node-preload "^0.2.1" - p-map "^3.0.0" - process-on-spawn "^1.0.0" - resolve-from "^5.0.0" - rimraf "^3.0.0" - signal-exit "^3.0.2" - spawn-wrap "^2.0.0" - test-exclude "^6.0.0" - yargs "^15.0.2" - object-assign@^4, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" @@ -5399,7 +5268,7 @@ object-inspect@^1.13.1: resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz" integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== -on-finished@2.4.1, on-finished@^2.4.1: +on-finished@^2.4.1, on-finished@2.4.1: version "2.4.1" resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== @@ -5446,18 +5315,6 @@ ono@^7.1.3: dependencies: "@jsdevtools/ono" "7.1.3" -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - optionator@^0.9.1: version "0.9.1" resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" @@ -5482,7 +5339,7 @@ p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-limit@^3.0.2: +p-limit@^3.0.2, p-limit@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== @@ -5503,13 +5360,6 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" -p-map@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz" - integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== - dependencies: - aggregate-error "^3.0.0" - p-map@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" @@ -5517,7 +5367,7 @@ p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" -p-queue@6.6.2, p-queue@^6.6.2: +p-queue@^6.6.2, p-queue@6.6.2: version "6.6.2" resolved "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz" integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== @@ -5537,15 +5387,10 @@ p-try@^2.0.0: resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -package-hash@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz" - integrity sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ== - dependencies: - graceful-fs "^4.1.15" - hasha "^5.0.0" - lodash.flattendeep "^4.4.0" - release-zalgo "^1.0.0" +package-json-from-dist@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz" + integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== packet-reader@1.0.0: version "1.0.0" @@ -5569,11 +5414,6 @@ parse-json@^5.0.0, parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" -parse5@6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - parseurl@~1.3.3: version "1.3.3" resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" @@ -5599,20 +5439,13 @@ path-key@^4.0.0: resolved "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz" integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-to-regexp@0.1.10: - version "0.1.10" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz" - integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" path-to-regexp@^1.7.0: version "1.8.0" @@ -5626,6 +5459,11 @@ path-to-regexp@^6.2.0, path-to-regexp@^6.2.1: resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz" integrity sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw== +path-to-regexp@0.1.10: + version "0.1.10" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz" + integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== + path-type@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" @@ -5679,7 +5517,7 @@ pg-types@^2.1.0, pg-types@^2.2.0: postgres-date "~1.0.4" postgres-interval "^1.1.0" -pg@8.8.0: +pg@^8, "pg@>=4.3.0 <9.0.0", pg@>=8.0, pg@8.8.0: version "8.8.0" resolved "https://registry.npmjs.org/pg/-/pg-8.8.0.tgz" integrity sha512-UXYN0ziKj+AeNNP7VDMwrehpACThH7LUl/p8TDFpEUuSejCUIwGSfxpHsPvtM6/WXFy6SU4E5RG4IJV/TZAGjw== @@ -5699,27 +5537,32 @@ pgpass@1.x: dependencies: split2 "^4.1.0" -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== -picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +picomatch@^4.0.2: + version "4.0.3" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz" + integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== + pidtree@^0.6.0: version "0.6.0" resolved "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz" integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== -pirates@^4.0.4: - version "4.0.5" - resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== +pirates@^4.0.7: + version "4.0.7" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz" + integrity sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA== -pkg-dir@^4.1.0, pkg-dir@^4.2.0: +pkg-dir@^4.2.0: version "4.2.0" resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== @@ -5771,11 +5614,6 @@ prelude-ls@^1.2.1: resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== - prettier-linter-helpers@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz" @@ -5783,7 +5621,7 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@2.7.1: +prettier@>=2.0.0, prettier@2.7.1: version "2.7.1" resolved "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz" integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== @@ -5806,18 +5644,20 @@ pretty-format@^29.3.1: ansi-styles "^5.0.0" react-is "^18.0.0" +pretty-format@30.2.0: + version "30.2.0" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz" + integrity sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA== + dependencies: + "@jest/schemas" "30.0.5" + ansi-styles "^5.2.0" + react-is "^18.3.1" + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -process-on-spawn@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz" - integrity sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg== - dependencies: - fromentries "^1.2.0" - prom-client@^14.1.0: version "14.2.0" resolved "https://registry.npmjs.org/prom-client/-/prom-client-14.2.0.tgz" @@ -5833,14 +5673,6 @@ prom-client@^15.1.0: "@opentelemetry/api" "^1.4.0" tdigest "^0.1.1" -prompts@^2.0.1: - version "2.4.2" - resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - properties-reader@^2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/properties-reader/-/properties-reader-2.2.0.tgz" @@ -5856,11 +5688,6 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" -psl@^1.1.33: - version "1.9.0" - resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== - pump@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" @@ -5869,20 +5696,27 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + punycode@1.3.2: version "1.3.2" resolved "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz" integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== -punycode@^2.1.0: - version "2.3.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== +pure-rand@^7.0.0: + version "7.0.1" + resolved "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz" + integrity sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ== -punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +qs@^6.11.1: + version "6.11.1" + resolved "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz" + integrity sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ== + dependencies: + side-channel "^1.0.4" qs@6.11.0: version "6.11.0" @@ -5898,13 +5732,6 @@ qs@6.13.0: dependencies: side-channel "^1.0.6" -qs@^6.11.1: - version "6.11.1" - resolved "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz" - integrity sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ== - dependencies: - side-channel "^1.0.4" - querystring@0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz" @@ -5955,6 +5782,11 @@ react-is@^18.0.0: resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== +react-is@^18.3.1: + version "18.3.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz" + integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== + read-yaml-file@2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-2.1.0.tgz" @@ -5963,7 +5795,33 @@ read-yaml-file@2.1.0: js-yaml "^4.0.0" strip-bom "^4.0.0" -readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.2.2: +readable-stream@^2.0.0: + version "2.3.7" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^2.0.5: + version "2.3.7" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^2.2.2: version "2.3.7" resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -6016,13 +5874,6 @@ regexpp@^3.2.0: resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== -release-zalgo@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz" - integrity sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA== - dependencies: - es6-error "^4.0.1" - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" @@ -6033,11 +5884,6 @@ require-from-string@^2.0.2: resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" @@ -6055,20 +5901,6 @@ resolve-from@^5.0.0: resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -resolve.exports@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz" - integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== - -resolve@^1.20.0: - version "1.22.1" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== - dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz" @@ -6087,7 +5919,7 @@ rfdc@^1.3.0: resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== -rimraf@^3.0.0, rimraf@^3.0.2: +rimraf@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== @@ -6108,12 +5940,22 @@ rxjs@^7.5.5: dependencies: tslib "^2.1.0" -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@^5.0.1: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1, safe-buffer@5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@~5.2.0: +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@5.2.1: version "5.2.1" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -6123,22 +5965,15 @@ safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@~5.2.0: resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sax@1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz" - integrity sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA== - sax@>=0.6.0: version "1.2.4" resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -saxes@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz" - integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== - dependencies: - xmlchars "^2.2.0" +sax@1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz" + integrity sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA== scrypt-js@3.0.1: version "3.0.1" @@ -6150,22 +5985,39 @@ seedrandom@^3.0.5: resolved "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz" integrity sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg== -semver@7.3.7, semver@7.x, semver@^7.3.2, semver@^7.3.7: +semver@^6.0.0: + version "6.3.1" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.5: + version "7.6.0" + resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" + +semver@^7.3.7: version "7.3.7" resolved "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== dependencies: lru-cache "^6.0.0" -semver@^6.0.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^7.5.4, semver@^7.7.2, semver@^7.7.3: + version "7.7.3" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz" + integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== -semver@^7.3.5, semver@^7.5.4: - version "7.6.0" - resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz" - integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== +semver@7.3.7: + version "7.3.7" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== dependencies: lru-cache "^6.0.0" @@ -6217,11 +6069,6 @@ serve-static@1.16.0: parseurl "~1.3.3" send "0.18.0" -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== - set-function-length@^1.2.1: version "1.2.2" resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" @@ -6289,6 +6136,11 @@ signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + simple-concat@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz" @@ -6310,18 +6162,6 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" -sinon@13.0.2: - version "13.0.2" - resolved "https://registry.npmjs.org/sinon/-/sinon-13.0.2.tgz" - integrity sha512-KvOrztAVqzSJWMDoxM4vM+GPys1df2VBoXm+YciyB/OLMamfS3VXh3oGh5WtrAGSzrgczNWFFY22oKb7Fi5eeA== - dependencies: - "@sinonjs/commons" "^1.8.3" - "@sinonjs/fake-timers" "^9.1.2" - "@sinonjs/samsam" "^6.1.1" - diff "^5.0.0" - nise "^5.1.1" - supports-color "^7.2.0" - sinon@^14.0.2: version "14.0.2" resolved "https://registry.npmjs.org/sinon/-/sinon-14.0.2.tgz" @@ -6334,11 +6174,6 @@ sinon@^14.0.2: nise "^5.1.2" supports-color "^7.2.0" -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - slash@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" @@ -6370,36 +6205,19 @@ slice-ansi@^5.0.0: ansi-styles "^6.0.0" is-fullwidth-code-point "^4.0.0" -source-map-support@^0.5.6: - version "0.5.21" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1: version "0.6.1" resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@^0.7.3: - version "0.7.4" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz" - integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== - -spawn-wrap@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz" - integrity sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg== - dependencies: - foreground-child "^2.0.0" - is-windows "^1.0.2" - make-dir "^3.0.0" - rimraf "^3.0.0" - signal-exit "^3.0.2" - which "^2.0.1" - split-ca@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz" @@ -6439,10 +6257,10 @@ ssh2@^1.4.0: cpu-features "~0.0.4" nan "^2.16.0" -stack-utils@^2.0.3: - version "2.0.5" - resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz" - integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== +stack-utils@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== dependencies: escape-string-regexp "^2.0.0" @@ -6480,12 +6298,26 @@ streamx@^2.13.0, streamx@^2.15.0: optionalDependencies: bare-events "^2.2.0" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + string-argv@^0.3.1: version "0.3.1" resolved "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz" integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== -string-length@^4.0.1: +string-length@^4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== @@ -6493,6 +6325,15 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" @@ -6511,19 +6352,21 @@ string-width@^5.0.0: emoji-regex "^9.2.2" strip-ansi "^7.0.1" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: - safe-buffer "~5.2.0" + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: - safe-buffer "~5.1.0" + ansi-regex "^5.0.1" strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" @@ -6533,9 +6376,9 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: ansi-regex "^5.0.1" strip-ansi@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz" - integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== + version "7.1.2" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz" + integrity sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA== dependencies: ansi-regex "^6.0.1" @@ -6566,7 +6409,7 @@ strip-json-comments@~2.0.1: strtok3@^10.3.4: version "10.3.4" - resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-10.3.4.tgz#793ebd0d59df276a085586134b73a406e60be9c1" + resolved "https://registry.npmjs.org/strtok3/-/strtok3-10.3.4.tgz" integrity sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg== dependencies: "@tokenizer/token" "^0.3.0" @@ -6579,44 +6422,26 @@ strtok3@^6.0.3: "@tokenizer/token" "^0.3.0" peek-readable "^4.1.0" -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.0.0, supports-color@^7.1.0, supports-color@^7.2.0: +supports-color@^7.1.0, supports-color@^7.2.0: version "7.2.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" -supports-color@^8.0.0: +supports-color@^8.1.1: version "8.1.1" resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" -supports-hyperlinks@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz" - integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== +synckit@^0.11.8: + version "0.11.11" + resolved "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz" + integrity sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw== dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + "@pkgr/core" "^0.2.9" syncpack@8.2.4: version "8.2.4" @@ -6692,14 +6517,6 @@ tdigest@^0.1.1: dependencies: bintrees "1.0.2" -terminal-link@^2.0.0: - version "2.1.1" - resolved "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz" - integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== - dependencies: - ansi-escapes "^4.2.1" - supports-hyperlinks "^2.0.0" - test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" @@ -6732,11 +6549,6 @@ text-table@^0.2.0: resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== -throat@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz" - integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== - through@^2.3.8: version "2.3.8" resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" @@ -6747,11 +6559,6 @@ tmpl@1.0.5: resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" @@ -6774,61 +6581,39 @@ token-types@^2.0.0: token-types@^6.1.1: version "6.1.1" - resolved "https://registry.yarnpkg.com/token-types/-/token-types-6.1.1.tgz#85bd0ada82939b9178ecd5285881a538c4c00fdd" + resolved "https://registry.npmjs.org/token-types/-/token-types-6.1.1.tgz" integrity sha512-kh9LVIWH5CnL63Ipf0jhlBIy0UsrMj/NJDfpsy1SqOXlLKEVyXXYrnFxFT1yOOYVGBSApeVnjPw/sBz5BfEjAQ== dependencies: "@borewit/text-codec" "^0.1.0" "@tokenizer/token" "^0.3.0" ieee754 "^1.2.1" -tough-cookie@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz" - integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.1.2" - -tr46@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz" - integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== - dependencies: - punycode "^2.1.1" - tr46@~0.0.3: version "0.0.3" resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== -ts-jest@27.1.5: - version "27.1.5" - resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.5.tgz" - integrity sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA== - dependencies: - bs-logger "0.x" - fast-json-stable-stringify "2.x" - jest-util "^27.0.0" - json5 "2.x" - lodash.memoize "4.x" - make-error "1.x" - semver "7.x" - yargs-parser "20.x" - -ts-mockito@2.6.1: - version "2.6.1" - resolved "https://registry.npmjs.org/ts-mockito/-/ts-mockito-2.6.1.tgz" - integrity sha512-qU9m/oEBQrKq5hwfbJ7MgmVN5Gu6lFnIGWvpxSjrqq6YYEVv+RwVFWySbZMBgazsWqv6ctAyVBpo9TmAxnOEKw== - dependencies: - lodash "^4.17.5" - -ts-node@10.7.0: - version "10.7.0" - resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.7.0.tgz" - integrity sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A== - dependencies: - "@cspotcode/source-map-support" "0.7.0" +ts-jest@^29.4.6: + version "29.4.6" + resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.6.tgz" + integrity sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA== + dependencies: + bs-logger "^0.2.6" + fast-json-stable-stringify "^2.1.0" + handlebars "^4.7.8" + json5 "^2.2.3" + lodash.memoize "^4.1.2" + make-error "^1.3.6" + semver "^7.7.3" + type-fest "^4.41.0" + yargs-parser "^21.1.1" + +ts-node@^10.9.2: + version "10.9.2" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" "@tsconfig/node10" "^1.0.7" "@tsconfig/node12" "^1.0.7" "@tsconfig/node14" "^1.0.0" @@ -6839,23 +6624,37 @@ ts-node@10.7.0: create-require "^1.1.0" diff "^4.0.1" make-error "^1.1.1" - v8-compile-cache-lib "^3.0.0" + v8-compile-cache-lib "^3.0.1" yn "3.1.1" -tsc@2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/tsc/-/tsc-2.0.4.tgz" - integrity sha512-fzoSieZI5KKJVBYGvwbVZs/J5za84f2lSTLPYf6AGiIf43tZ3GNrI1QzTLcjtyDDP4aLxd46RTZq1nQxe7+k5Q== +ts-node@>=9.0.0: + version "10.9.2" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" tslib@^1.8.1: version "1.14.1" resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.1.0: - version "2.4.0" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz" - integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== +tslib@^2.1.0, tslib@^2.8.1: + version "2.8.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== tsutils@^3.21.0: version "3.21.0" @@ -6883,14 +6682,7 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== - dependencies: - prelude-ls "~1.1.2" - -type-detect@4.0.8, type-detect@^4.0.8: +type-detect@^4.0.8, type-detect@4.0.8: version "4.0.8" resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== @@ -6905,10 +6697,10 @@ type-fest@^0.21.3: resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -type-fest@^0.8.0: - version "0.8.1" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +type-fest@^4.41.0: + version "4.41.0" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz" + integrity sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA== type-is@^1.6.4, type-is@~1.6.18: version "1.6.18" @@ -6935,14 +6727,19 @@ typedarray@^0.0.6: resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typescript@^4.7.4: - version "4.7.4" - resolved "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz" - integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== +typescript@^5.9.3, typescript@>=2.7, "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", "typescript@>=4.3 <6": + version "5.9.3" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz" + integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== + +uglify-js@^3.1.4: + version "3.19.3" + resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz" + integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== uint8array-extras@^1.4.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/uint8array-extras/-/uint8array-extras-1.5.0.tgz#10d2a85213de3ada304fea1c454f635c73839e86" + resolved "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz" integrity sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A== undici-types@~5.26.4: @@ -6950,7 +6747,12 @@ undici-types@~5.26.4: resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== -universalify@^0.1.0, universalify@^0.1.2: +undici-types@~7.16.0: + version "7.16.0" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz" + integrity sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw== + +universalify@^0.1.0: version "0.1.2" resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== @@ -6960,18 +6762,45 @@ universalify@^2.0.0: resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -unpipe@1.0.0, unpipe@~1.0.0: +unpipe@~1.0.0, unpipe@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -update-browserslist-db@^1.0.4: - version "1.0.5" - resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz" - integrity sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q== +unrs-resolver@^1.7.11: + version "1.11.1" + resolved "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz" + integrity sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg== dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" + napi-postinstall "^0.3.0" + optionalDependencies: + "@unrs/resolver-binding-android-arm-eabi" "1.11.1" + "@unrs/resolver-binding-android-arm64" "1.11.1" + "@unrs/resolver-binding-darwin-arm64" "1.11.1" + "@unrs/resolver-binding-darwin-x64" "1.11.1" + "@unrs/resolver-binding-freebsd-x64" "1.11.1" + "@unrs/resolver-binding-linux-arm-gnueabihf" "1.11.1" + "@unrs/resolver-binding-linux-arm-musleabihf" "1.11.1" + "@unrs/resolver-binding-linux-arm64-gnu" "1.11.1" + "@unrs/resolver-binding-linux-arm64-musl" "1.11.1" + "@unrs/resolver-binding-linux-ppc64-gnu" "1.11.1" + "@unrs/resolver-binding-linux-riscv64-gnu" "1.11.1" + "@unrs/resolver-binding-linux-riscv64-musl" "1.11.1" + "@unrs/resolver-binding-linux-s390x-gnu" "1.11.1" + "@unrs/resolver-binding-linux-x64-gnu" "1.11.1" + "@unrs/resolver-binding-linux-x64-musl" "1.11.1" + "@unrs/resolver-binding-wasm32-wasi" "1.11.1" + "@unrs/resolver-binding-win32-arm64-msvc" "1.11.1" + "@unrs/resolver-binding-win32-ia32-msvc" "1.11.1" + "@unrs/resolver-binding-win32-x64-msvc" "1.11.1" + +update-browserslist-db@^1.2.0: + version "1.2.3" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz" + integrity sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.1" uri-js@^4.2.2: version "4.4.1" @@ -7009,17 +6838,17 @@ utils-merge@1.0.1: resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== +uuid@^8.3.2, uuid@8.3.2: + version "8.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + uuid@8.0.0: version "8.0.0" resolved "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz" integrity sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw== -uuid@8.3.2, uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -v8-compile-cache-lib@^3.0.0: +v8-compile-cache-lib@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== @@ -7029,35 +6858,21 @@ v8-compile-cache@^2.0.3: resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== -v8-to-istanbul@^8.1.0: - version "8.1.1" - resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz" - integrity sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w== +v8-to-istanbul@^9.0.1: + version "9.3.0" + resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz" + integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== dependencies: + "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" - source-map "^0.7.3" + convert-source-map "^2.0.0" vary@^1, vary@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== -w3c-hr-time@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz" - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== - dependencies: - browser-process-hrtime "^1.0.0" - -w3c-xmlserializer@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz" - integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== - dependencies: - xml-name-validator "^3.0.0" - -walker@^1.0.7: +walker@^1.0.8: version "1.0.8" resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== @@ -7076,28 +6891,6 @@ webidl-conversions@^3.0.0: resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== -webidl-conversions@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz" - integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== - -webidl-conversions@^6.1.0: - version "6.1.0" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz" - integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== - -whatwg-encoding@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== - dependencies: - iconv-lite "0.4.24" - -whatwg-mimetype@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== - whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" @@ -7106,20 +6899,6 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" -whatwg-url@^8.0.0, whatwg-url@^8.5.0: - version "8.7.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz" - integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== - dependencies: - lodash "^4.7.0" - tr46 "^2.1.0" - webidl-conversions "^6.1.0" - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz" - integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== - which-typed-array@^1.1.11, which-typed-array@^1.1.2: version "1.1.11" resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz" @@ -7138,11 +6917,25 @@ which@^2.0.1: dependencies: isexe "^2.0.0" -word-wrap@^1.2.3, word-wrap@~1.2.3: +word-wrap@^1.2.3: version "1.2.3" resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" @@ -7161,35 +6954,37 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + wrappy@1: version "1.0.2" resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== +write-file-atomic@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz" + integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== dependencies: imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" + signal-exit "^4.0.1" ws@7.4.6: version "7.4.6" resolved "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== -ws@^7.4.6: - version "7.5.9" - resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== - -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== +xml@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz" + integrity sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw== xml2js@0.5.0: version "0.5.0" @@ -7199,21 +6994,11 @@ xml2js@0.5.0: sax ">=0.6.0" xmlbuilder "~11.0.0" -xml@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz" - integrity sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw== - xmlbuilder@~11.0.0: version "11.0.1" resolved "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz" integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - xtend@^4.0.0: version "4.0.2" resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" @@ -7226,16 +7011,16 @@ xxhashjs@^0.2.2: dependencies: cuint "^0.2.2" -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== - y18n@^5.0.5: version "5.0.8" resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + yallist@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" @@ -7246,58 +7031,38 @@ yaml@^1.10.0, yaml@^1.10.2: resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yaml@^2.1.1, yaml@^2.3.4: +yaml@^2.1.1: version "2.3.4" resolved "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz" integrity sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA== -yargs-parser@20.x, yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-parser@^18.1.2: - version "18.1.3" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" +yaml@^2.3.4: + version "2.3.4" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz" + integrity sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA== yargs-parser@^21.0.0: version "21.0.1" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz" integrity sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg== -yargs@^15.0.2: - version "15.4.1" - resolved "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz" - integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== - dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.2" +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@^16.2.0: - version "16.2.0" - resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== +yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: - cliui "^7.0.2" + cliui "^8.0.1" escalade "^3.1.1" get-caller-file "^2.0.5" require-directory "^2.1.1" - string-width "^4.2.0" + string-width "^4.2.3" y18n "^5.0.5" - yargs-parser "^20.2.2" + yargs-parser "^21.1.1" yargs@~17.3.0: version "17.3.1"