diff --git a/chronix.config.ts b/chronix.config.ts index 6da3da4c..6ab555e2 100644 --- a/chronix.config.ts +++ b/chronix.config.ts @@ -3,7 +3,7 @@ export default { port: 8001, }, commands: { - test: 'jest --config jest-e2e-onchain.json', + test: 'jest -i --config jest-e2e-onchain.json', }, plugins: ['simple-dvt-v1'], }; diff --git a/package.json b/package.json index ea7497f9..8d760fe7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "lido-keys-api", - "version": "1.0.1", + "version": "1.0.2", "description": "Lido Node Operators keys service", "author": "Lido team", "private": true, @@ -52,13 +52,13 @@ "@lido-nestjs/fetch": "^1.4.0", "@lido-nestjs/logger": "^1.3.2", "@lido-nestjs/middleware": "^1.2.0", - "@lido-nestjs/validators-registry": "^1.3.0", - "@mikro-orm/cli": "^5.5.3", - "@mikro-orm/core": "^5.5.3", - "@mikro-orm/knex": "^5.5.3", - "@mikro-orm/migrations": "^5.5.3", + "@lido-nestjs/validators-registry": "^1.3.1", + "@mikro-orm/cli": "^5.7.13", + "@mikro-orm/core": "^5.7.13", + "@mikro-orm/knex": "^5.7.13", + "@mikro-orm/migrations": "^5.7.13", "@mikro-orm/nestjs": "^5.1.2", - "@mikro-orm/postgresql": "^5.5.3", + "@mikro-orm/postgresql": "^5.7.13", "@nestjs/common": "^8.2.5", "@nestjs/config": "^1.1.6", "@nestjs/core": "^8.2.5", @@ -85,7 +85,6 @@ "@types/k6": "~0.44.2" }, "devDependencies": { - "@mikro-orm/sqlite": "5.5.3", "@nestjs/cli": "^8.2.5", "@nestjs/schematics": "^8.0.5", "@nestjs/testing": "^8.2.5", diff --git a/sample.env b/sample.env index 3987c61a..d81a1458 100644 --- a/sample.env +++ b/sample.env @@ -47,3 +47,7 @@ CL_API_URLS=https://quiknode.pro/ # for some applications we dont need validators registry library # value below is default VALIDATOR_REGISTRY_ENABLE=true + +# When streaming lasts more than STREAM_TIMEOUT seconds, the stream will be destroyed +# This prevents the retrieval of outdated data. +STREAM_TIMEOUT=60000 diff --git a/src/app/app-testing.module.ts b/src/app/app-testing.module.ts index 8de87552..75e5f195 100644 --- a/src/app/app-testing.module.ts +++ b/src/app/app-testing.module.ts @@ -7,13 +7,13 @@ import { HealthModule } from '../common/health'; import { AppService } from './app.service'; import { ExecutionProviderModule } from '../common/execution-provider'; import { ConsensusProviderModule } from '../common/consensus-provider'; -import { MikroOrmModule } from '@mikro-orm/nestjs'; import { ScheduleModule } from '@nestjs/schedule'; import { LoggerModule, nullTransport } from '@lido-nestjs/logger'; import { SimpleFallbackJsonRpcBatchProvider } from '@lido-nestjs/execution'; import { KeyRegistryModule } from 'common/registry'; import { StakingRouterModule } from 'staking-router-modules'; import { KeysUpdateModule } from 'jobs/keys-update'; +import { DatabaseE2ETestingModule } from './database-e2e-testing.module'; @Module({ imports: [ @@ -22,12 +22,7 @@ import { KeysUpdateModule } from 'jobs/keys-update'; ConfigModule, ExecutionProviderModule, ConsensusProviderModule, - MikroOrmModule.forRoot({ - dbName: ':memory:', - type: 'sqlite', - allowGlobalContext: true, - entities: ['./**/*.entity.ts'], - }), + DatabaseE2ETestingModule.forRoot(), LoggerModule.forRoot({ transports: [nullTransport()] }), ScheduleModule.forRoot(), KeyRegistryModule.forRootAsync({ diff --git a/src/app/database-testing.module.ts b/src/app/database-e2e-testing.module.ts similarity index 93% rename from src/app/database-testing.module.ts rename to src/app/database-e2e-testing.module.ts index 3741bd95..212f8bb1 100644 --- a/src/app/database-testing.module.ts +++ b/src/app/database-e2e-testing.module.ts @@ -4,10 +4,10 @@ import config from 'mikro-orm.config'; import { ConfigModule, ConfigService } from 'common/config'; @Module({}) -export class DatabaseTestingModule { +export class DatabaseE2ETestingModule { static forRoot(mikroOrmConfigOverrides: Partial = {}): DynamicModule { return { - module: DatabaseTestingModule, + module: DatabaseE2ETestingModule, imports: [ ConfigModule, MikroOrmModule.forRootAsync({ diff --git a/src/app/index.ts b/src/app/index.ts index e8af5d49..0c90e95c 100644 --- a/src/app/index.ts +++ b/src/app/index.ts @@ -1,4 +1,4 @@ export * from './app.constants'; export * from './app.module'; export * from './app.service'; -export * from './database-testing.module'; +export * from './database-e2e-testing.module'; diff --git a/src/app/simple-dvt-deploy.e2e-chain.ts b/src/app/simple-dvt-deploy.e2e-chain.ts index a47f75b4..adcdd506 100644 --- a/src/app/simple-dvt-deploy.e2e-chain.ts +++ b/src/app/simple-dvt-deploy.e2e-chain.ts @@ -40,7 +40,7 @@ describe('Simple DVT deploy', () => { let dvtNodeOperator2WithoutKeys: chronix.StoryResult<'simple-dvt/set-node-operator-name'>; let moduleRef: TestingModule; - + let configService: ConfigService; let keysStorageService: RegistryKeyStorageService; let moduleStorageService: SRModuleStorageService; let elMetaStorageService: ElMetaStorageService; @@ -61,6 +61,7 @@ describe('Simple DVT deploy', () => { session = await sdk.env.hardhat({ fork: forkUrl, chainId: 1, + forkBlockNumber: 19282216 }); moduleRef = await Test.createTestingModule({ imports: [AppModule] }) @@ -84,26 +85,27 @@ describe('Simple DVT deploy', () => { validatorsRegistryLastSlot: jest.fn(), validatorsEnabled: jest.fn(), }) - .overrideProvider(ConfigService) - .useValue({ - get(path) { - const conf = { - LIDO_LOCATOR_ADDRESS: '0xC1d0b3DE6792Bf6b4b37EccdcC24e45978Cfd2Eb', - }; - return conf[path]; - }, - }) .compile(); const generator = moduleRef.get(MikroORM).getSchemaGenerator(); - await generator.updateSchema(); + await generator.refreshDatabase(); + await generator.clearDatabase(); + configService = moduleRef.get(ConfigService); elMetaStorageService = moduleRef.get(ElMetaStorageService); keysStorageService = moduleRef.get(RegistryKeyStorageService); moduleStorageService = moduleRef.get(SRModuleStorageService); keysUpdateService = moduleRef.get(KeysUpdateService); stakingRouterService = moduleRef.get(StakingRouterService); + + jest.spyOn(configService, 'get').mockImplementation((path: any) => { + if (path === 'LIDO_LOCATOR_ADDRESS') { + return '0xC1d0b3DE6792Bf6b4b37EccdcC24e45978Cfd2Eb'; + } + + return configService.get(path); + }); }); afterAll(async () => { diff --git a/src/common/config/env.validation.ts b/src/common/config/env.validation.ts index 18a92697..69fd021e 100644 --- a/src/common/config/env.validation.ts +++ b/src/common/config/env.validation.ts @@ -171,6 +171,11 @@ export class EnvironmentVariables { @IsPositive() @Transform(({ value }) => parseInt(value, 10)) KEYS_FETCH_BATCH_SIZE = 1100; + + @IsOptional() + @IsPositive() + @Transform(({ value }) => parseInt(value, 10)) + STREAM_TIMEOUT = 60_000; } export function validate(config: Record) { diff --git a/src/common/registry/storage/constants.ts b/src/common/registry/storage/constants.ts index 1742d59d..f455db1c 100644 --- a/src/common/registry/storage/constants.ts +++ b/src/common/registry/storage/constants.ts @@ -1,6 +1,6 @@ export const KEY_LEN = 98; export const DEPOSIT_SIGNATURE_LEN = 194; export const ADDRESS_LEN = 42; -export const STREAM_TIMEOUT = 60_000; +export const DEFAULT_STREAM_TIMEOUT = 60_000; export const STREAM_KEYS_TIMEOUT_MESSAGE = 'A timeout occurred loading keys from the database'; export const STREAM_OPERATORS_TIMEOUT_MESSAGE = 'A timeout occurred loading operators from the database'; diff --git a/src/common/registry/storage/key.storage.ts b/src/common/registry/storage/key.storage.ts index 6e24d485..744d21d8 100644 --- a/src/common/registry/storage/key.storage.ts +++ b/src/common/registry/storage/key.storage.ts @@ -1,14 +1,15 @@ import { QueryOrder } from '@mikro-orm/core'; import { FilterQuery, FindOptions } from '@mikro-orm/core'; import { Injectable } from '@nestjs/common'; +import { ConfigService } from 'common/config'; import { addTimeoutToStream } from '../utils/stream.utils'; import { RegistryKey } from './key.entity'; import { RegistryKeyRepository } from './key.repository'; -import { STREAM_KEYS_TIMEOUT_MESSAGE, STREAM_TIMEOUT } from './constants'; +import { DEFAULT_STREAM_TIMEOUT, STREAM_KEYS_TIMEOUT_MESSAGE } from './constants'; @Injectable() export class RegistryKeyStorageService { - constructor(private readonly repository: RegistryKeyRepository) {} + constructor(private readonly repository: RegistryKeyRepository, private readonly configService: ConfigService) {} /** find keys */ async find

( @@ -27,7 +28,8 @@ export class RegistryKeyStorageService { const knex = qb.getKnexQuery(); const stream = knex.stream(); - addTimeoutToStream(stream, STREAM_TIMEOUT, STREAM_KEYS_TIMEOUT_MESSAGE); + const streamTimeout = this.configService.get('STREAM_TIMEOUT') ?? DEFAULT_STREAM_TIMEOUT; + addTimeoutToStream(stream, streamTimeout, STREAM_KEYS_TIMEOUT_MESSAGE); return stream; } diff --git a/src/common/registry/storage/operator.storage.ts b/src/common/registry/storage/operator.storage.ts index 9daf8dc6..3cd8bcb4 100644 --- a/src/common/registry/storage/operator.storage.ts +++ b/src/common/registry/storage/operator.storage.ts @@ -1,14 +1,15 @@ import { QueryOrder } from '@mikro-orm/core'; import { FilterQuery, FindOptions } from '@mikro-orm/core'; import { Injectable } from '@nestjs/common'; +import { ConfigService } from 'common/config'; import { addTimeoutToStream } from '../utils/stream.utils'; import { RegistryOperator } from './operator.entity'; import { RegistryOperatorRepository } from './operator.repository'; -import { STREAM_OPERATORS_TIMEOUT_MESSAGE, STREAM_TIMEOUT } from './constants'; +import { DEFAULT_STREAM_TIMEOUT, STREAM_OPERATORS_TIMEOUT_MESSAGE } from './constants'; @Injectable() export class RegistryOperatorStorageService { - constructor(private readonly repository: RegistryOperatorRepository) {} + constructor(private readonly repository: RegistryOperatorRepository, private readonly configService: ConfigService) {} /** find operators */ async find

( @@ -28,7 +29,8 @@ export class RegistryOperatorStorageService { const knex = qb.getKnexQuery(); const stream = knex.stream(); - addTimeoutToStream(stream, STREAM_TIMEOUT, STREAM_OPERATORS_TIMEOUT_MESSAGE); + const streamTimeout = this.configService.get('STREAM_TIMEOUT') ?? DEFAULT_STREAM_TIMEOUT; + addTimeoutToStream(stream, streamTimeout, STREAM_OPERATORS_TIMEOUT_MESSAGE); return stream; } diff --git a/src/common/registry/storage/registry-storage.module.ts b/src/common/registry/storage/registry-storage.module.ts index 4b3c3af5..09176e98 100644 --- a/src/common/registry/storage/registry-storage.module.ts +++ b/src/common/registry/storage/registry-storage.module.ts @@ -6,12 +6,14 @@ import { RegistryKeyStorageService } from './key.storage'; import { MikroOrmModule } from '@mikro-orm/nestjs'; import { RegistryKey } from './key.entity'; import { RegistryOperator } from './operator.entity'; +import { ConfigModule } from 'common/config'; @Module({ imports: [ MikroOrmModule.forFeature({ entities: [RegistryKey, RegistryOperator], }), + ConfigModule, ], providers: [RegistryStorageService, RegistryOperatorStorageService, RegistryKeyStorageService], exports: [RegistryStorageService, RegistryOperatorStorageService, RegistryKeyStorageService], diff --git a/src/common/registry/test/fetch/key-batch.fetch.e2e-spec.ts b/src/common/registry/test/fetch/key-batch.fetch.e2e-spec.ts index 7f076dd9..d52bc559 100644 --- a/src/common/registry/test/fetch/key-batch.fetch.e2e-spec.ts +++ b/src/common/registry/test/fetch/key-batch.fetch.e2e-spec.ts @@ -27,7 +27,8 @@ describe('Fetch keys in batch', () => { }); test('fetch one key', async () => { - const keys = await fetchService.fetch(address, 17, 0, 3, { blockTag: 9641262 }); + const overrides = { blockTag: 10573030 }; + const keys = await fetchService.fetch(address, 17, 0, 3, overrides); expect(keys).toBeInstanceOf(Array); diff --git a/src/common/registry/test/fetch/key.fetch.e2e-spec.ts b/src/common/registry/test/fetch/key.fetch.e2e-spec.ts index 5bec7523..7e320e5d 100644 --- a/src/common/registry/test/fetch/key.fetch.e2e-spec.ts +++ b/src/common/registry/test/fetch/key.fetch.e2e-spec.ts @@ -28,7 +28,7 @@ describe('Keys', () => { }); test('fetch one key', async () => { - const key = await fetchService.fetchOne(address, 21, 0, { blockTag: 6912872 }); + const key = await fetchService.fetchOne(address, 17, 0, { blockTag: 10573030 }); expect(key).toBeInstanceOf(Object); @@ -40,23 +40,23 @@ describe('Keys', () => { }); test('fetch operator keys', async () => { - const keys = await fetchService.fetch(address, 21, 0, -1, { - blockTag: 6912872, + const keys = await fetchService.fetch(address, 17, 0, 3, { + blockTag: 10573030, }); expect(keys).toBeInstanceOf(Array); expect(keys.length).toBe(3); }, 15_000); test('fetch several keys', async () => { - const keys = await fetchService.fetch(address, 21, 0, 2, { - blockTag: 6912872, + const keys = await fetchService.fetch(address, 17, 0, 2, { + blockTag: 10573030, }); expect(keys).toBeInstanceOf(Array); expect(keys.length).toBe(2); - expect(keys[0].operatorIndex).toBe(21); - expect(keys[1].operatorIndex).toBe(21); + expect(keys[0].operatorIndex).toBe(17); + expect(keys[1].operatorIndex).toBe(17); expect(keys[0].index).toBe(0); expect(keys[1].index).toBe(1); diff --git a/src/common/registry/test/fetch/operator.fetch.e2e-spec.ts b/src/common/registry/test/fetch/operator.fetch.e2e-spec.ts index 218aab87..c23e7c6c 100644 --- a/src/common/registry/test/fetch/operator.fetch.e2e-spec.ts +++ b/src/common/registry/test/fetch/operator.fetch.e2e-spec.ts @@ -52,7 +52,7 @@ describe('Operators', () => { test('fetch all operators', async () => { const operators = await fetchService.fetch(address, 0, -1, { - blockTag: 9641262, + blockTag: 10573030, }); expect(operators).toBeInstanceOf(Array); @@ -60,7 +60,9 @@ describe('Operators', () => { }, 30_000); test('fetch multiply operators', async () => { - const operators = await fetchService.fetch(address, 1, 3); + const operators = await fetchService.fetch(address, 1, 3, { + blockTag: 10573030, + }); expect(operators).toBeInstanceOf(Array); expect(operators.length).toBe(2); diff --git a/src/common/registry/test/key-registry/async.spec.ts b/src/common/registry/test/key-registry/async.e2e-spec.ts similarity index 81% rename from src/common/registry/test/key-registry/async.spec.ts rename to src/common/registry/test/key-registry/async.e2e-spec.ts index 90fb4355..22f78c88 100644 --- a/src/common/registry/test/key-registry/async.spec.ts +++ b/src/common/registry/test/key-registry/async.e2e-spec.ts @@ -1,12 +1,11 @@ -import { MikroOrmModule } from '@mikro-orm/nestjs'; import { ModuleMetadata } from '@nestjs/common'; import { Test } from '@nestjs/testing'; import { nullTransport, LoggerModule } from '@lido-nestjs/logger'; import { getNetwork } from '@ethersproject/networks'; import { getDefaultProvider } from '@ethersproject/providers'; -import { KeyRegistryModule, KeyRegistryService, RegistryStorageService } from '../../'; +import { KeyRegistryModule, KeyRegistryService, RegistryStorageService } from '../..'; import { MikroORM } from '@mikro-orm/core'; -import { mikroORMConfig } from '../testing.utils'; +import { DatabaseE2ETestingModule } from 'app'; describe('Async module initializing', () => { const provider = getDefaultProvider('mainnet'); @@ -19,7 +18,8 @@ describe('Async module initializing', () => { const storageService = moduleRef.get(RegistryStorageService); const generator = moduleRef.get(MikroORM).getSchemaGenerator(); - await generator.updateSchema(); + await generator.refreshDatabase(); + await generator.clearDatabase(); expect(registryService).toBeDefined(); await storageService.onModuleDestroy(); @@ -27,7 +27,7 @@ describe('Async module initializing', () => { test('forRootAsync', async () => { await testModules([ - MikroOrmModule.forRoot(mikroORMConfig), + DatabaseE2ETestingModule.forRoot(), LoggerModule.forRoot({ transports: [nullTransport()] }), KeyRegistryModule.forRootAsync({ async useFactory() { @@ -39,12 +39,7 @@ describe('Async module initializing', () => { test('forFeatureAsync', async () => { await testModules([ - MikroOrmModule.forRoot({ - dbName: ':memory:', - type: 'sqlite', - allowGlobalContext: true, - entities: ['./**/*.entity.ts'], - }), + DatabaseE2ETestingModule.forRoot(), LoggerModule.forRoot({ transports: [nullTransport()] }), KeyRegistryModule.forFeatureAsync({ async useFactory() { diff --git a/src/common/registry/test/key-registry/connect.e2e-spec.ts b/src/common/registry/test/key-registry/connect.e2e-spec.ts index 7f407314..874ddab1 100644 --- a/src/common/registry/test/key-registry/connect.e2e-spec.ts +++ b/src/common/registry/test/key-registry/connect.e2e-spec.ts @@ -1,13 +1,12 @@ import { Test } from '@nestjs/testing'; -import { MikroOrmModule } from '@mikro-orm/nestjs'; import { nullTransport, LoggerModule } from '@lido-nestjs/logger'; import { BatchProviderModule, ExtendedJsonRpcBatchProvider } from '@lido-nestjs/execution'; import { KeyRegistryModule, KeyRegistryService, RegistryOperatorFetchService, RegistryStorageService } from '../../'; -import { clearDb, compareTestOperators, mikroORMConfig } from '../testing.utils'; -import { operators } from '../fixtures/connect.fixture'; +import { clearDb } from '../testing.utils'; import { MikroORM } from '@mikro-orm/core'; import { REGISTRY_CONTRACT_ADDRESSES } from '@lido-nestjs/contracts'; import * as dotenv from 'dotenv'; +import { DatabaseE2ETestingModule } from 'app'; dotenv.config(); @@ -21,15 +20,15 @@ describe('Registry', () => { process.exit(1); } const address = REGISTRY_CONTRACT_ADDRESSES[process.env.CHAIN_ID]; - const operatorsWithModuleAddress = operators.map((key) => { - return { ...key, moduleAddress: address }; - }); + // const operatorsWithModuleAddress = operators.map((key) => { + // return { ...key, moduleAddress: address }; + // }); - const blockHash = '0x4ef0f15a8a04a97f60a9f76ba83d27bcf98dac9635685cd05fe1d78bd6e93418'; + const blockHash = '0x42e6d3fe6df4bc4bdfda27595a015ac9fd5af65cf9bd9d8ad0f2ac802dd73749'; beforeEach(async () => { const imports = [ - MikroOrmModule.forRoot(mikroORMConfig), + DatabaseE2ETestingModule.forRoot(), BatchProviderModule.forRoot({ url: process.env.PROVIDERS_URLS as string, requestPolicy: { @@ -51,11 +50,11 @@ describe('Registry', () => { storageService = moduleRef.get(RegistryStorageService); registryOperatorFetchService = moduleRef.get(RegistryOperatorFetchService); mikroOrm = moduleRef.get(MikroORM); - jest.spyOn(registryOperatorFetchService, 'getFinalizedBlockTag').mockImplementation(() => ({ blockHash } as any)); const generator = mikroOrm.getSchemaGenerator(); - await generator.updateSchema(); + await generator.refreshDatabase(); + await generator.clearDatabase(); }); afterEach(async () => { @@ -66,11 +65,14 @@ describe('Registry', () => { test('Update', async () => { await registryService.update(address, blockHash); - await compareTestOperators(address, registryService, { - operators: operatorsWithModuleAddress, - }); + // TODO: consider uncommit on holesky + // await compareTestOperators(address, registryService, { + // operators: operatorsWithModuleAddress, + // }); + const operators = await registryService.getOperatorsFromStorage(address); + expect(operators).toHaveLength(89); const keys = await registryService.getOperatorsKeysFromStorage(address); - expect(keys).toHaveLength(20527); + expect(keys).toHaveLength(57816); }, 400_000); }); diff --git a/src/common/registry/test/key-registry/registry-db.e2e-spec.ts b/src/common/registry/test/key-registry/registry-db.e2e-spec.ts index 4c2f9b8b..99217c20 100644 --- a/src/common/registry/test/key-registry/registry-db.e2e-spec.ts +++ b/src/common/registry/test/key-registry/registry-db.e2e-spec.ts @@ -1,5 +1,4 @@ import { Test } from '@nestjs/testing'; -import { MikroOrmModule } from '@mikro-orm/nestjs'; import { nullTransport, LoggerModule } from '@lido-nestjs/logger'; import { getNetwork } from '@ethersproject/networks'; import { JsonRpcBatchProvider } from '@ethersproject/providers'; @@ -11,9 +10,10 @@ import { RegistryOperatorStorageService, } from '../..'; import { keys, operators } from '../fixtures/db.fixture'; -import { clearDb, compareTestKeysAndOperators, mikroORMConfig } from '../testing.utils'; +import { clearDb, compareTestKeysAndOperators } from '../testing.utils'; import { MikroORM } from '@mikro-orm/core'; import { REGISTRY_CONTRACT_ADDRESSES } from '@lido-nestjs/contracts'; +import { DatabaseE2ETestingModule } from 'app'; describe('Registry', () => { const provider = new JsonRpcBatchProvider(process.env.PROVIDERS_URLS); @@ -41,7 +41,7 @@ describe('Registry', () => { beforeEach(async () => { const imports = [ - MikroOrmModule.forRoot(mikroORMConfig), + DatabaseE2ETestingModule.forRoot(), LoggerModule.forRoot({ transports: [nullTransport()] }), KeyRegistryModule.forFeature({ provider }), ]; @@ -54,7 +54,8 @@ describe('Registry', () => { mikroOrm = moduleRef.get(MikroORM); const generator = mikroOrm.getSchemaGenerator(); - await generator.updateSchema(); + await generator.refreshDatabase(); + await generator.clearDatabase(); await keyStorageService.save(keysWithModuleAddress); diff --git a/src/common/registry/test/key-registry/registry-update.spec.ts b/src/common/registry/test/key-registry/registry-update.e2e-spec.ts similarity index 96% rename from src/common/registry/test/key-registry/registry-update.spec.ts rename to src/common/registry/test/key-registry/registry-update.e2e-spec.ts index 0ece5c5c..60b5f1d7 100644 --- a/src/common/registry/test/key-registry/registry-update.spec.ts +++ b/src/common/registry/test/key-registry/registry-update.e2e-spec.ts @@ -1,5 +1,4 @@ import { Test, TestingModule } from '@nestjs/testing'; -import { MikroOrmModule } from '@mikro-orm/nestjs'; import { nullTransport, LoggerModule, MockLoggerModule, LOGGER_PROVIDER } from '@lido-nestjs/logger'; import { getNetwork } from '@ethersproject/networks'; import { JsonRpcBatchProvider } from '@ethersproject/providers'; @@ -9,17 +8,11 @@ import { RegistryStorageService, RegistryKeyStorageService, RegistryOperatorStorageService, -} from '../../'; +} from '../..'; import { keys, newKey, newOperator, operators, operatorWithDefaultsRecords } from '../fixtures/db.fixture'; -import { - clone, - compareTestKeysAndOperators, - compareTestKeys, - compareTestOperators, - mikroORMConfig, - clearDb, -} from '../testing.utils'; +import { clone, compareTestKeysAndOperators, compareTestKeys, compareTestOperators, clearDb } from '../testing.utils'; import { registryServiceMock } from '../mock-utils'; +import { DatabaseE2ETestingModule } from 'app'; import { MikroORM } from '@mikro-orm/core'; import { REGISTRY_CONTRACT_ADDRESSES } from '@lido-nestjs/contracts'; import * as dotenv from 'dotenv'; @@ -56,7 +49,7 @@ describe('Registry', () => { beforeEach(async () => { const imports = [ - MikroOrmModule.forRoot(mikroORMConfig), + DatabaseE2ETestingModule.forRoot(), LoggerModule.forRoot({ transports: [nullTransport()] }), KeyRegistryModule.forFeature({ provider }), ]; @@ -69,8 +62,9 @@ describe('Registry', () => { operatorStorageService = moduleRef.get(RegistryOperatorStorageService); mikroOrm = moduleRef.get(MikroORM); - const generator = mikroOrm.getSchemaGenerator(); - await generator.updateSchema(); + const generator = moduleRef.get(MikroORM).getSchemaGenerator(); + await generator.refreshDatabase(); + await generator.clearDatabase(); await keyStorageService.save(keysWithModuleAddress); await operatorStorageService.save(operatorsWithModuleAddress); @@ -300,7 +294,7 @@ describe('Reorg detection', () => { beforeEach(async () => { const imports = [ - MikroOrmModule.forRoot(mikroORMConfig), + DatabaseE2ETestingModule.forRoot(), MockLoggerModule.forRoot({ log: jest.fn(), error: jest.fn(), @@ -316,7 +310,8 @@ describe('Reorg detection', () => { registryStorageService = moduleRef.get(RegistryStorageService); mikroOrm = moduleRef.get(MikroORM); const generator = mikroOrm.getSchemaGenerator(); - await generator.updateSchema(); + await generator.refreshDatabase(); + await generator.clearDatabase(); }); afterEach(async () => { diff --git a/src/common/registry/test/key-registry/registry.spec.ts b/src/common/registry/test/key-registry/registry.e2e-spec.ts similarity index 89% rename from src/common/registry/test/key-registry/registry.spec.ts rename to src/common/registry/test/key-registry/registry.e2e-spec.ts index 9b24949f..ef3b88f7 100644 --- a/src/common/registry/test/key-registry/registry.spec.ts +++ b/src/common/registry/test/key-registry/registry.e2e-spec.ts @@ -1,14 +1,12 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ import { Test } from '@nestjs/testing'; import { nullTransport, LoggerModule } from '@lido-nestjs/logger'; import { getNetwork } from '@ethersproject/networks'; import { JsonRpcBatchProvider } from '@ethersproject/providers'; -import { MikroOrmModule } from '@mikro-orm/nestjs'; import { key } from '../fixtures/key.fixture'; -import { RegistryKeyStorageService, KeyRegistryModule, KeyRegistryService, RegistryStorageService } from '../../'; +import { RegistryKeyStorageService, KeyRegistryModule, KeyRegistryService, RegistryStorageService } from '../..'; import { MikroORM } from '@mikro-orm/core'; import { REGISTRY_CONTRACT_ADDRESSES } from '@lido-nestjs/contracts'; -import { mikroORMConfig } from '../testing.utils'; +import { DatabaseE2ETestingModule } from 'app'; describe('Key', () => { const CHAIN_ID = process.env.CHAIN_ID || 1; @@ -24,7 +22,7 @@ describe('Key', () => { beforeEach(async () => { const imports = [ - MikroOrmModule.forRoot(mikroORMConfig), + DatabaseE2ETestingModule.forRoot(), LoggerModule.forRoot({ transports: [nullTransport()] }), KeyRegistryModule.forFeature({ provider }), ]; @@ -34,7 +32,8 @@ describe('Key', () => { storageService = moduleRef.get(RegistryStorageService); const generator = moduleRef.get(MikroORM).getSchemaGenerator(); - await generator.updateSchema(); + await generator.refreshDatabase(); + await generator.clearDatabase(); }); afterEach(async () => { diff --git a/src/common/registry/test/key-registry/sync.spec.ts b/src/common/registry/test/key-registry/sync.e2e-spec.ts similarity index 78% rename from src/common/registry/test/key-registry/sync.spec.ts rename to src/common/registry/test/key-registry/sync.e2e-spec.ts index dd101cd0..35d780e7 100644 --- a/src/common/registry/test/key-registry/sync.spec.ts +++ b/src/common/registry/test/key-registry/sync.e2e-spec.ts @@ -1,4 +1,3 @@ -import { MikroOrmModule } from '@mikro-orm/nestjs'; import { nullTransport, LoggerModule } from '@lido-nestjs/logger'; import { ModuleMetadata } from '@nestjs/common'; import { getNetwork } from '@ethersproject/networks'; @@ -6,7 +5,7 @@ import { getDefaultProvider, Provider } from '@ethersproject/providers'; import { Test } from '@nestjs/testing'; import { KeyRegistryModule, KeyRegistryService, RegistryStorageService } from '../../index'; import { MikroORM } from '@mikro-orm/core'; -import { mikroORMConfig } from '../testing.utils'; +import { DatabaseE2ETestingModule } from 'app'; describe('Sync module initializing', () => { const provider = getDefaultProvider('mainnet'); @@ -19,7 +18,8 @@ describe('Sync module initializing', () => { const storageService = moduleRef.get(RegistryStorageService); const generator = moduleRef.get(MikroORM).getSchemaGenerator(); - await generator.updateSchema(); + await generator.refreshDatabase(); + await generator.clearDatabase(); expect(registryService).toBeDefined(); await storageService.onModuleDestroy(); @@ -27,7 +27,7 @@ describe('Sync module initializing', () => { test('forRoot', async () => { const imports = [ - MikroOrmModule.forRoot(mikroORMConfig), + DatabaseE2ETestingModule.forRoot(), LoggerModule.forRoot({ transports: [nullTransport()] }), KeyRegistryModule.forRoot({ provider, @@ -39,12 +39,7 @@ describe('Sync module initializing', () => { test('forFeature', async () => { const imports = [ - MikroOrmModule.forRoot({ - dbName: ':memory:', - type: 'sqlite', - allowGlobalContext: true, - entities: ['./**/*.entity.ts'], - }), + DatabaseE2ETestingModule.forRoot(), LoggerModule.forRoot({ transports: [nullTransport()] }), KeyRegistryModule.forFeature({ provider, @@ -56,12 +51,7 @@ describe('Sync module initializing', () => { test('forFeature + global provider', async () => { const imports = [ - MikroOrmModule.forRoot({ - dbName: ':memory:', - type: 'sqlite', - allowGlobalContext: true, - entities: ['./**/*.entity.ts'], - }), + DatabaseE2ETestingModule.forRoot(), LoggerModule.forRoot({ transports: [nullTransport()] }), KeyRegistryModule.forFeature(), ]; diff --git a/src/common/registry/test/storage/async.spec.ts b/src/common/registry/test/storage/async.e2e-spec.ts similarity index 85% rename from src/common/registry/test/storage/async.spec.ts rename to src/common/registry/test/storage/async.e2e-spec.ts index c84e5615..f459bef6 100644 --- a/src/common/registry/test/storage/async.spec.ts +++ b/src/common/registry/test/storage/async.e2e-spec.ts @@ -1,10 +1,9 @@ -import { MikroOrmModule } from '@mikro-orm/nestjs'; import { DynamicModule, Injectable, Module } from '@nestjs/common'; import { ModuleMetadata } from '@nestjs/common'; import { Test } from '@nestjs/testing'; -import { RegistryStorageModule, RegistryStorageService } from '../../'; +import { RegistryStorageModule, RegistryStorageService } from '../..'; import { MikroORM } from '@mikro-orm/core'; -import { mikroORMConfig } from '../testing.utils'; +import { DatabaseE2ETestingModule } from 'app'; @Injectable() class TestService {} @@ -27,7 +26,8 @@ describe('Async module initializing', () => { const storageService: RegistryStorageService = moduleRef.get(RegistryStorageService); const generator = moduleRef.get(MikroORM).getSchemaGenerator(); - await generator.updateSchema(); + await generator.refreshDatabase(); + await generator.clearDatabase(); expect(storageService).toBeDefined(); await storageService.onModuleDestroy(); @@ -36,7 +36,7 @@ describe('Async module initializing', () => { test('forRootAsync', async () => { await testModules([ TestModule.forRoot(), - MikroOrmModule.forRoot(mikroORMConfig), + DatabaseE2ETestingModule.forRoot(), RegistryStorageModule.forRootAsync({ async useFactory() { return {}; @@ -49,7 +49,7 @@ describe('Async module initializing', () => { test('forFeatureAsync', async () => { await testModules([ TestModule.forRoot(), - MikroOrmModule.forRoot(mikroORMConfig), + DatabaseE2ETestingModule.forRoot(), RegistryStorageModule.forFeatureAsync({ async useFactory() { return {}; diff --git a/src/common/registry/test/storage/key.storage.e2e-spec.ts b/src/common/registry/test/storage/key.storage.e2e-spec.ts index 8c190f9c..3fe07023 100644 --- a/src/common/registry/test/storage/key.storage.e2e-spec.ts +++ b/src/common/registry/test/storage/key.storage.e2e-spec.ts @@ -1,11 +1,10 @@ import { Test } from '@nestjs/testing'; import { MikroORM, QueryOrder } from '@mikro-orm/core'; -import { MikroOrmModule } from '@mikro-orm/nestjs'; import { key } from '../fixtures/key.fixture'; import { RegistryStorageModule, RegistryStorageService, RegistryKeyStorageService } from '../../'; import { REGISTRY_CONTRACT_ADDRESSES } from '@lido-nestjs/contracts'; -import { mikroORMConfig } from '../testing.utils'; import * as dotenv from 'dotenv'; +import { DatabaseE2ETestingModule } from 'app'; dotenv.config(); @@ -19,14 +18,15 @@ describe('Keys', () => { const address = REGISTRY_CONTRACT_ADDRESSES[process.env.CHAIN_ID]; beforeEach(async () => { - const imports = [MikroOrmModule.forRoot(mikroORMConfig), RegistryStorageModule.forFeature()]; + const imports = [DatabaseE2ETestingModule.forRoot(), RegistryStorageModule.forFeature()]; const moduleRef = await Test.createTestingModule({ imports }).compile(); storageService = moduleRef.get(RegistryKeyStorageService); registryService = moduleRef.get(RegistryStorageService); const generator = moduleRef.get(MikroORM).getSchemaGenerator(); - await generator.updateSchema(); + await generator.refreshDatabase(); + await generator.clearDatabase(); }); afterEach(async () => { diff --git a/src/common/registry/test/storage/key.storage.spec.ts b/src/common/registry/test/storage/key.storage.spec.ts index a60dd53a..94aa8917 100644 --- a/src/common/registry/test/storage/key.storage.spec.ts +++ b/src/common/registry/test/storage/key.storage.spec.ts @@ -3,7 +3,8 @@ import { key } from '../fixtures/key.fixture'; import { RegistryKeyStorageService, RegistryKey, RegistryKeyRepository } from '../../'; import { REGISTRY_CONTRACT_ADDRESSES } from '@lido-nestjs/contracts'; import * as streamUtils from '../../utils/stream.utils'; -import { STREAM_KEYS_TIMEOUT_MESSAGE, STREAM_TIMEOUT } from '../../../registry/storage/constants'; +import { STREAM_KEYS_TIMEOUT_MESSAGE, DEFAULT_STREAM_TIMEOUT } from '../../../registry/storage/constants'; +import { ConfigModule, ConfigService } from 'common/config'; describe('Keys', () => { const CHAIN_ID = process.env.CHAIN_ID || 1; @@ -53,13 +54,24 @@ describe('Keys', () => { }; let storageService: RegistryKeyStorageService; + let configService: ConfigService; beforeEach(async () => { const moduleRef = await Test.createTestingModule({ + imports: [ConfigModule], providers: [RegistryKeyStorageService, { provide: RegistryKeyRepository, useValue: mockRegistryKeyRepository }], }).compile(); storageService = moduleRef.get(RegistryKeyStorageService); + configService = moduleRef.get(ConfigService); + + jest.spyOn(configService, 'get').mockImplementation((path) => { + if (path === 'STREAM_TIMEOUT') { + return DEFAULT_STREAM_TIMEOUT; + } + + return configService.get(path); + }); }); beforeEach(() => { @@ -87,7 +99,7 @@ describe('Keys', () => { expect(mockedCreateQueryBuilder.orderBy).toBeCalledWith({ index: 'asc', operator_index: 'asc' }); expect(mockedCreateQueryBuilder.getKnexQuery).toBeCalledTimes(1); expect(streamValue).toBeCalledTimes(1); - expect(addTimeoutToStream).toBeCalledWith(stream, STREAM_TIMEOUT, STREAM_KEYS_TIMEOUT_MESSAGE); + expect(addTimeoutToStream).toBeCalledWith(stream, DEFAULT_STREAM_TIMEOUT, STREAM_KEYS_TIMEOUT_MESSAGE); }); test('findAll', async () => { diff --git a/src/common/registry/test/storage/key.storage.transactions.e2e-spec.ts b/src/common/registry/test/storage/key.storage.transactions.e2e-spec.ts index 1f6b0b4e..162ba65e 100644 --- a/src/common/registry/test/storage/key.storage.transactions.e2e-spec.ts +++ b/src/common/registry/test/storage/key.storage.transactions.e2e-spec.ts @@ -4,7 +4,7 @@ import { key } from '../fixtures/key.fixture'; import { RegistryStorageModule, RegistryStorageService, RegistryKeyStorageService, RegistryKey } from '../..'; import { REGISTRY_CONTRACT_ADDRESSES } from '@lido-nestjs/contracts'; import * as dotenv from 'dotenv'; -import { DatabaseTestingModule } from 'app'; +import { DatabaseE2ETestingModule } from 'app'; import { EntityManager } from '@mikro-orm/knex'; dotenv.config(); @@ -21,7 +21,10 @@ describe('check that findAsStream method dont create a new connection', () => { const address = REGISTRY_CONTRACT_ADDRESSES[process.env.CHAIN_ID]; beforeEach(async () => { - const imports = [DatabaseTestingModule.forRoot({ pool: { min: 1, max: 1 } }), RegistryStorageModule.forFeature()]; + const imports = [ + DatabaseE2ETestingModule.forRoot({ pool: { min: 1, max: 1 } }), + RegistryStorageModule.forFeature(), + ]; const moduleRef = await Test.createTestingModule({ imports }).compile(); keyStorageService = moduleRef.get(RegistryKeyStorageService); diff --git a/src/common/registry/test/storage/operator.storage.e2e-spec.ts b/src/common/registry/test/storage/operator.storage.e2e-spec.ts index 0b99597b..9896578c 100644 --- a/src/common/registry/test/storage/operator.storage.e2e-spec.ts +++ b/src/common/registry/test/storage/operator.storage.e2e-spec.ts @@ -1,11 +1,10 @@ import { Test } from '@nestjs/testing'; import { MikroORM, QueryOrder } from '@mikro-orm/core'; -import { MikroOrmModule } from '@mikro-orm/nestjs'; import { operator } from '../fixtures/operator.fixture'; import { RegistryStorageModule, RegistryStorageService, RegistryOperatorStorageService } from '../../'; import { REGISTRY_CONTRACT_ADDRESSES } from '@lido-nestjs/contracts'; -import { mikroORMConfig } from '../testing.utils'; import * as dotenv from 'dotenv'; +import { DatabaseE2ETestingModule } from 'app'; dotenv.config(); @@ -19,14 +18,15 @@ describe('Operators', () => { const address = REGISTRY_CONTRACT_ADDRESSES[process.env.CHAIN_ID]; beforeEach(async () => { - const imports = [MikroOrmModule.forRoot(mikroORMConfig), RegistryStorageModule.forFeature()]; + const imports = [DatabaseE2ETestingModule.forRoot(), RegistryStorageModule.forFeature()]; const moduleRef = await Test.createTestingModule({ imports }).compile(); storageService = moduleRef.get(RegistryOperatorStorageService); registryService = moduleRef.get(RegistryStorageService); const generator = moduleRef.get(MikroORM).getSchemaGenerator(); - await generator.updateSchema(); + await generator.refreshDatabase(); + await generator.clearDatabase(); }); afterEach(async () => { diff --git a/src/common/registry/test/storage/operator.storage.spec.ts b/src/common/registry/test/storage/operator.storage.spec.ts index f4ff4dda..c047b36f 100644 --- a/src/common/registry/test/storage/operator.storage.spec.ts +++ b/src/common/registry/test/storage/operator.storage.spec.ts @@ -3,7 +3,8 @@ import { operator } from '../fixtures/operator.fixture'; import { RegistryOperatorStorageService, RegistryOperator, RegistryOperatorRepository } from '../../'; import { REGISTRY_CONTRACT_ADDRESSES } from '@lido-nestjs/contracts'; import * as streamUtils from '../../utils/stream.utils'; -import { STREAM_OPERATORS_TIMEOUT_MESSAGE, STREAM_TIMEOUT } from '../../../registry/storage/constants'; +import { DEFAULT_STREAM_TIMEOUT, STREAM_OPERATORS_TIMEOUT_MESSAGE } from '../../../registry/storage/constants'; +import { ConfigModule, ConfigService } from 'common/config'; describe('Operators', () => { const CHAIN_ID = process.env.CHAIN_ID || 1; @@ -53,9 +54,11 @@ describe('Operators', () => { }; let storageService: RegistryOperatorStorageService; + let configService: ConfigService; beforeEach(async () => { const moduleRef = await Test.createTestingModule({ + imports: [ConfigModule], providers: [ RegistryOperatorStorageService, { @@ -66,6 +69,15 @@ describe('Operators', () => { }).compile(); storageService = moduleRef.get(RegistryOperatorStorageService); + configService = moduleRef.get(ConfigService); + + jest.spyOn(configService, 'get').mockImplementation((path) => { + if (path === 'STREAM_TIMEOUT') { + return DEFAULT_STREAM_TIMEOUT; + } + + return configService.get(path); + }); }); beforeEach(() => { @@ -93,7 +105,7 @@ describe('Operators', () => { expect(mockedCreateQueryBuilder.orderBy).toBeCalledWith({ index: 'asc', module_address: 'asc' }); expect(mockedCreateQueryBuilder.getKnexQuery).toBeCalledTimes(1); expect(streamValue).toBeCalledTimes(1); - expect(addTimeoutToStream).toBeCalledWith(stream, STREAM_TIMEOUT, STREAM_OPERATORS_TIMEOUT_MESSAGE); + expect(addTimeoutToStream).toBeCalledWith(stream, DEFAULT_STREAM_TIMEOUT, STREAM_OPERATORS_TIMEOUT_MESSAGE); }); test('findAll', async () => { diff --git a/src/common/registry/test/storage/operator.storage.transactions.e2e-spec.ts b/src/common/registry/test/storage/operator.storage.transactions.e2e-spec.ts index a4bd3002..4c6b64a9 100644 --- a/src/common/registry/test/storage/operator.storage.transactions.e2e-spec.ts +++ b/src/common/registry/test/storage/operator.storage.transactions.e2e-spec.ts @@ -4,7 +4,7 @@ import { operator } from '../fixtures/operator.fixture'; import { RegistryStorageModule, RegistryStorageService, RegistryOperatorStorageService, RegistryOperator } from '../..'; import { REGISTRY_CONTRACT_ADDRESSES } from '@lido-nestjs/contracts'; import * as dotenv from 'dotenv'; -import { DatabaseTestingModule } from 'app'; +import { DatabaseE2ETestingModule } from 'app'; import { EntityManager } from '@mikro-orm/knex'; dotenv.config(); @@ -21,7 +21,10 @@ describe('check that findAsStream method dont create a new connection', () => { const address = REGISTRY_CONTRACT_ADDRESSES[process.env.CHAIN_ID]; beforeEach(async () => { - const imports = [DatabaseTestingModule.forRoot({ pool: { min: 1, max: 1 } }), RegistryStorageModule.forFeature()]; + const imports = [ + DatabaseE2ETestingModule.forRoot({ pool: { min: 1, max: 1 } }), + RegistryStorageModule.forFeature(), + ]; const moduleRef = await Test.createTestingModule({ imports }).compile(); operatorStorageService = moduleRef.get(RegistryOperatorStorageService); diff --git a/src/common/registry/test/storage/sync.spec.ts b/src/common/registry/test/storage/sync.e2e-spec.ts similarity index 67% rename from src/common/registry/test/storage/sync.spec.ts rename to src/common/registry/test/storage/sync.e2e-spec.ts index c6792174..a8753881 100644 --- a/src/common/registry/test/storage/sync.spec.ts +++ b/src/common/registry/test/storage/sync.e2e-spec.ts @@ -1,9 +1,8 @@ -import { MikroOrmModule } from '@mikro-orm/nestjs'; import { ModuleMetadata } from '@nestjs/common'; import { Test } from '@nestjs/testing'; -import { RegistryStorageModule, RegistryStorageService } from '../../'; +import { RegistryStorageModule, RegistryStorageService } from '../..'; import { MikroORM } from '@mikro-orm/core'; -import { mikroORMConfig } from '../testing.utils'; +import { DatabaseE2ETestingModule } from 'app'; describe('Sync module initializing', () => { const testModules = async (imports: ModuleMetadata['imports']) => { @@ -11,17 +10,18 @@ describe('Sync module initializing', () => { const storageService: RegistryStorageService = moduleRef.get(RegistryStorageService); const generator = moduleRef.get(MikroORM).getSchemaGenerator(); - await generator.updateSchema(); + await generator.refreshDatabase(); + await generator.clearDatabase(); expect(storageService).toBeDefined(); await storageService.onModuleDestroy(); }; test('forRoot', async () => { - await testModules([MikroOrmModule.forRoot(mikroORMConfig), RegistryStorageModule.forRoot({})]); + await testModules([DatabaseE2ETestingModule.forRoot(), RegistryStorageModule.forRoot({})]); }); test('forFeature', async () => { - await testModules([MikroOrmModule.forRoot(mikroORMConfig), RegistryStorageModule.forFeature()]); + await testModules([DatabaseE2ETestingModule.forRoot(), RegistryStorageModule.forFeature()]); }); }); diff --git a/src/common/registry/test/testing.utils.ts b/src/common/registry/test/testing.utils.ts index 61d4dc87..c75fda4d 100644 --- a/src/common/registry/test/testing.utils.ts +++ b/src/common/registry/test/testing.utils.ts @@ -53,10 +53,3 @@ export const clearDb = async (orm) => { await operatorRepository.nativeDelete({}); }); }; - -export const mikroORMConfig = { - dbName: ':memory:', - type: 'sqlite' as const, - allowGlobalContext: true, - entities: ['./**/*.entity.ts'], -}; diff --git a/src/common/registry/test/validator-registry/async.spec.ts b/src/common/registry/test/validator-registry/async.e2e-spec.ts similarity index 86% rename from src/common/registry/test/validator-registry/async.spec.ts rename to src/common/registry/test/validator-registry/async.e2e-spec.ts index 5225f72c..f038ab04 100644 --- a/src/common/registry/test/validator-registry/async.spec.ts +++ b/src/common/registry/test/validator-registry/async.e2e-spec.ts @@ -1,12 +1,11 @@ -import { MikroOrmModule } from '@mikro-orm/nestjs'; import { ModuleMetadata } from '@nestjs/common'; import { Test } from '@nestjs/testing'; import { nullTransport, LoggerModule } from '@lido-nestjs/logger'; import { getNetwork } from '@ethersproject/networks'; import { getDefaultProvider } from '@ethersproject/providers'; -import { ValidatorRegistryModule, ValidatorRegistryService, RegistryStorageService } from '../../'; +import { ValidatorRegistryModule, ValidatorRegistryService, RegistryStorageService } from '../..'; import { MikroORM } from '@mikro-orm/core'; -import { mikroORMConfig } from '../testing.utils'; +import { DatabaseE2ETestingModule } from 'app'; describe('Async module initializing', () => { const provider = getDefaultProvider('mainnet'); @@ -19,7 +18,8 @@ describe('Async module initializing', () => { const storageService = moduleRef.get(RegistryStorageService); const generator = moduleRef.get(MikroORM).getSchemaGenerator(); - await generator.updateSchema(); + await generator.refreshDatabase(); + await generator.clearDatabase(); expect(registryService).toBeDefined(); await storageService.onModuleDestroy(); @@ -27,7 +27,7 @@ describe('Async module initializing', () => { test('forRootAsync', async () => { await testModules([ - MikroOrmModule.forRoot(mikroORMConfig), + DatabaseE2ETestingModule.forRoot(), LoggerModule.forRoot({ transports: [nullTransport()] }), ValidatorRegistryModule.forRootAsync({ async useFactory() { @@ -39,7 +39,7 @@ describe('Async module initializing', () => { test('forFeatureAsync', async () => { await testModules([ - MikroOrmModule.forRoot(mikroORMConfig), + DatabaseE2ETestingModule.forRoot(), LoggerModule.forRoot({ transports: [nullTransport()] }), ValidatorRegistryModule.forFeatureAsync({ async useFactory() { diff --git a/src/common/registry/test/validator-registry/connect.e2e-spec.ts b/src/common/registry/test/validator-registry/connect.e2e-spec.ts index c25644a6..fe7eb850 100644 --- a/src/common/registry/test/validator-registry/connect.e2e-spec.ts +++ b/src/common/registry/test/validator-registry/connect.e2e-spec.ts @@ -1,7 +1,7 @@ import { Test } from '@nestjs/testing'; -import { MikroOrmModule } from '@mikro-orm/nestjs'; import { nullTransport, LoggerModule } from '@lido-nestjs/logger'; import { BatchProviderModule, ExtendedJsonRpcBatchProvider } from '@lido-nestjs/execution'; +import { DatabaseE2ETestingModule } from 'app'; import { ValidatorRegistryModule, @@ -10,8 +10,7 @@ import { RegistryOperatorFetchService, } from '../../'; -import { clearDb, compareTestOperators, mikroORMConfig } from '../testing.utils'; -import { operators } from '../fixtures/connect.fixture'; +import { clearDb } from '../testing.utils'; import { MikroORM } from '@mikro-orm/core'; import { REGISTRY_CONTRACT_ADDRESSES } from '@lido-nestjs/contracts'; import * as dotenv from 'dotenv'; @@ -30,15 +29,15 @@ describe('Registry', () => { } const address = REGISTRY_CONTRACT_ADDRESSES[process.env.CHAIN_ID]; - const operatorsWithModuleAddress = operators.map((key) => { - return { ...key, moduleAddress: address }; - }); + // const operatorsWithModuleAddress = operators.map((key) => { + // return { ...key, moduleAddress: address }; + // }); - const blockHash = '0x4ef0f15a8a04a97f60a9f76ba83d27bcf98dac9635685cd05fe1d78bd6e93418'; + const blockHash = '0x42e6d3fe6df4bc4bdfda27595a015ac9fd5af65cf9bd9d8ad0f2ac802dd73749'; beforeEach(async () => { const imports = [ - MikroOrmModule.forRoot(mikroORMConfig), + DatabaseE2ETestingModule.forRoot(), BatchProviderModule.forRoot({ url: process.env.PROVIDERS_URLS as string, requestPolicy: { @@ -64,7 +63,8 @@ describe('Registry', () => { jest.spyOn(registryOperatorFetchService, 'getFinalizedBlockTag').mockImplementation(() => ({ blockHash } as any)); const generator = mikroOrm.getSchemaGenerator(); - await generator.updateSchema(); + await generator.refreshDatabase(); + await generator.clearDatabase(); }); afterEach(async () => { @@ -76,10 +76,13 @@ describe('Registry', () => { test('Update', async () => { await registryService.update(address, blockHash); - await compareTestOperators(address, registryService, { - operators: operatorsWithModuleAddress, - }); + // await compareTestOperators(address, registryService, { + // operators: operatorsWithModuleAddress, + // }); + + const operators = await registryService.getOperatorsFromStorage(address); + expect(operators).toHaveLength(89); const keys = await registryService.getOperatorsKeysFromStorage(address); - expect(keys).toHaveLength(15283); + expect(keys).toHaveLength(55131); }, 400_000); }); diff --git a/src/common/registry/test/validator-registry/registry-db.spec.ts b/src/common/registry/test/validator-registry/registry-db.e2e-spec.ts similarity index 90% rename from src/common/registry/test/validator-registry/registry-db.spec.ts rename to src/common/registry/test/validator-registry/registry-db.e2e-spec.ts index 943f142f..ba48161e 100644 --- a/src/common/registry/test/validator-registry/registry-db.spec.ts +++ b/src/common/registry/test/validator-registry/registry-db.e2e-spec.ts @@ -1,5 +1,4 @@ import { Test } from '@nestjs/testing'; -import { MikroOrmModule } from '@mikro-orm/nestjs'; import { nullTransport, LoggerModule } from '@lido-nestjs/logger'; import { getNetwork } from '@ethersproject/networks'; import { JsonRpcBatchProvider } from '@ethersproject/providers'; @@ -9,11 +8,12 @@ import { RegistryStorageService, RegistryKeyStorageService, RegistryOperatorStorageService, -} from '../../'; +} from '../..'; import { keys, operators } from '../fixtures/db.fixture'; -import { clearDb, compareTestKeysAndOperators, mikroORMConfig } from '../testing.utils'; +import { clearDb, compareTestKeysAndOperators } from '../testing.utils'; import { MikroORM } from '@mikro-orm/core'; import { REGISTRY_CONTRACT_ADDRESSES } from '@lido-nestjs/contracts'; +import { DatabaseE2ETestingModule } from 'app'; describe('Registry', () => { const provider = new JsonRpcBatchProvider(process.env.PROVIDERS_URLS); @@ -41,7 +41,7 @@ describe('Registry', () => { beforeEach(async () => { const imports = [ - MikroOrmModule.forRoot(mikroORMConfig), + DatabaseE2ETestingModule.forRoot(), LoggerModule.forRoot({ transports: [nullTransport()] }), ValidatorRegistryModule.forFeature({ provider }), ]; @@ -54,7 +54,8 @@ describe('Registry', () => { mikroOrm = moduleRef.get(MikroORM); const generator = mikroOrm.getSchemaGenerator(); - await generator.updateSchema(); + await generator.refreshDatabase(); + await generator.clearDatabase(); await keyStorageService.save(keysWithModuleAddress); await operatorStorageService.save(operatorsWithModuleAddress); diff --git a/src/common/registry/test/validator-registry/registry-update.spec.ts b/src/common/registry/test/validator-registry/registry-update.e2e-spec.ts similarity index 96% rename from src/common/registry/test/validator-registry/registry-update.spec.ts rename to src/common/registry/test/validator-registry/registry-update.e2e-spec.ts index 96ff7f2f..4f5952d9 100644 --- a/src/common/registry/test/validator-registry/registry-update.spec.ts +++ b/src/common/registry/test/validator-registry/registry-update.e2e-spec.ts @@ -1,5 +1,4 @@ import { Test, TestingModule } from '@nestjs/testing'; -import { MikroOrmModule } from '@mikro-orm/nestjs'; import { nullTransport, LoggerModule, LOGGER_PROVIDER, MockLoggerModule } from '@lido-nestjs/logger'; import { getNetwork } from '@ethersproject/networks'; import { JsonRpcBatchProvider } from '@ethersproject/providers'; @@ -9,19 +8,13 @@ import { RegistryStorageService, RegistryKeyStorageService, RegistryOperatorStorageService, -} from '../../'; +} from '../..'; import { keys, newKey, newOperator, operators, operatorWithDefaultsRecords } from '../fixtures/db.fixture'; -import { - clone, - compareTestKeysAndOperators, - compareTestKeys, - compareTestOperators, - clearDb, - mikroORMConfig, -} from '../testing.utils'; +import { clone, compareTestKeysAndOperators, compareTestKeys, compareTestOperators, clearDb } from '../testing.utils'; import { registryServiceMock } from '../mock-utils'; import { MikroORM } from '@mikro-orm/core'; import { REGISTRY_CONTRACT_ADDRESSES } from '@lido-nestjs/contracts'; +import { DatabaseE2ETestingModule } from 'app'; const blockHash = '0x4ef0f15a8a04a97f60a9f76ba83d27bcf98dac9635685cd05fe1d78bd6e93418'; @@ -53,7 +46,7 @@ describe('Validator registry', () => { beforeEach(async () => { const imports = [ - MikroOrmModule.forRoot(mikroORMConfig), + DatabaseE2ETestingModule.forRoot(), LoggerModule.forRoot({ transports: [nullTransport()] }), ValidatorRegistryModule.forFeature({ provider }), ]; @@ -67,7 +60,8 @@ describe('Validator registry', () => { mikroOrm = moduleRef.get(MikroORM); const generator = mikroOrm.getSchemaGenerator(); - await generator.updateSchema(); + await generator.refreshDatabase(); + await generator.clearDatabase(); await keyStorageService.save(keysWithModuleAddress); await operatorStorageService.save(operatorsWithModuleAddress); @@ -281,7 +275,7 @@ describe('Empty registry', () => { beforeEach(async () => { const imports = [ - MikroOrmModule.forRoot(mikroORMConfig), + DatabaseE2ETestingModule.forRoot(), MockLoggerModule.forRoot({ log: jest.fn(), error: jest.fn(), @@ -297,7 +291,8 @@ describe('Empty registry', () => { registryStorageService = moduleRef.get(RegistryStorageService); mikroOrm = moduleRef.get(MikroORM); const generator = mikroOrm.getSchemaGenerator(); - await generator.updateSchema(); + await generator.refreshDatabase(); + await generator.clearDatabase(); }); afterEach(async () => { @@ -339,7 +334,7 @@ describe('Reorg detection', () => { beforeEach(async () => { const imports = [ - MikroOrmModule.forRoot(mikroORMConfig), + DatabaseE2ETestingModule.forRoot(), MockLoggerModule.forRoot({ log: jest.fn(), error: jest.fn(), @@ -355,7 +350,8 @@ describe('Reorg detection', () => { registryStorageService = moduleRef.get(RegistryStorageService); mikroOrm = moduleRef.get(MikroORM); const generator = mikroOrm.getSchemaGenerator(); - await generator.updateSchema(); + await generator.refreshDatabase(); + await generator.clearDatabase(); }); afterEach(async () => { diff --git a/src/common/registry/test/validator-registry/registry.spec.ts b/src/common/registry/test/validator-registry/registry.e2e-spec.ts similarity index 89% rename from src/common/registry/test/validator-registry/registry.spec.ts rename to src/common/registry/test/validator-registry/registry.e2e-spec.ts index a81f09b2..c68bedd7 100644 --- a/src/common/registry/test/validator-registry/registry.spec.ts +++ b/src/common/registry/test/validator-registry/registry.e2e-spec.ts @@ -1,9 +1,7 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ import { Test } from '@nestjs/testing'; import { nullTransport, LoggerModule } from '@lido-nestjs/logger'; import { getNetwork } from '@ethersproject/networks'; import { JsonRpcBatchProvider } from '@ethersproject/providers'; -import { MikroOrmModule } from '@mikro-orm/nestjs'; import { key } from '../fixtures/key.fixture'; import { RegistryKeyStorageService, @@ -13,7 +11,7 @@ import { } from '../..'; import { MikroORM } from '@mikro-orm/core'; import { REGISTRY_CONTRACT_ADDRESSES } from '@lido-nestjs/contracts'; -import { mikroORMConfig } from '../testing.utils'; +import { DatabaseE2ETestingModule } from 'app'; describe('Validator', () => { const provider = new JsonRpcBatchProvider(process.env.PROVIDERS_URLS); @@ -30,7 +28,7 @@ describe('Validator', () => { beforeEach(async () => { const imports = [ - MikroOrmModule.forRoot(mikroORMConfig), + DatabaseE2ETestingModule.forRoot(), LoggerModule.forRoot({ transports: [nullTransport()] }), ValidatorRegistryModule.forFeature({ provider }), ]; @@ -40,7 +38,8 @@ describe('Validator', () => { storageService = moduleRef.get(RegistryStorageService); const generator = moduleRef.get(MikroORM).getSchemaGenerator(); - await generator.updateSchema(); + await generator.refreshDatabase(); + await generator.clearDatabase(); }); afterEach(async () => { diff --git a/src/common/registry/test/validator-registry/sync.spec.ts b/src/common/registry/test/validator-registry/sync.e2e-spec.ts similarity index 85% rename from src/common/registry/test/validator-registry/sync.spec.ts rename to src/common/registry/test/validator-registry/sync.e2e-spec.ts index e172adfe..7d872b5c 100644 --- a/src/common/registry/test/validator-registry/sync.spec.ts +++ b/src/common/registry/test/validator-registry/sync.e2e-spec.ts @@ -1,12 +1,11 @@ -import { MikroOrmModule } from '@mikro-orm/nestjs'; import { nullTransport, LoggerModule } from '@lido-nestjs/logger'; import { ModuleMetadata } from '@nestjs/common'; import { getNetwork } from '@ethersproject/networks'; import { getDefaultProvider, Provider } from '@ethersproject/providers'; import { Test } from '@nestjs/testing'; -import { ValidatorRegistryModule, ValidatorRegistryService, RegistryStorageService } from '../../'; +import { ValidatorRegistryModule, ValidatorRegistryService, RegistryStorageService } from '../..'; import { MikroORM } from '@mikro-orm/core'; -import { mikroORMConfig } from '../testing.utils'; +import { DatabaseE2ETestingModule } from 'app'; describe('Sync module initializing', () => { const provider = getDefaultProvider('mainnet'); @@ -19,7 +18,8 @@ describe('Sync module initializing', () => { const storageService = moduleRef.get(RegistryStorageService); const generator = moduleRef.get(MikroORM).getSchemaGenerator(); - await generator.updateSchema(); + await generator.refreshDatabase(); + await generator.clearDatabase(); expect(registryService).toBeDefined(); await storageService.onModuleDestroy(); @@ -27,7 +27,7 @@ describe('Sync module initializing', () => { test('forRoot', async () => { const imports = [ - MikroOrmModule.forRoot(mikroORMConfig), + DatabaseE2ETestingModule.forRoot(), LoggerModule.forRoot({ transports: [nullTransport()] }), ValidatorRegistryModule.forRoot({ provider, @@ -38,7 +38,7 @@ describe('Sync module initializing', () => { test('forFeature', async () => { const imports = [ - MikroOrmModule.forRoot(mikroORMConfig), + DatabaseE2ETestingModule.forRoot(), LoggerModule.forRoot({ transports: [nullTransport()] }), ValidatorRegistryModule.forFeature({ provider, @@ -49,7 +49,7 @@ describe('Sync module initializing', () => { test('forFeature + global provider', async () => { const imports = [ - MikroOrmModule.forRoot(mikroORMConfig), + DatabaseE2ETestingModule.forRoot(), LoggerModule.forRoot({ transports: [nullTransport()] }), ValidatorRegistryModule.forFeature(), ]; diff --git a/src/http/keys/keys.e2e-spec.ts b/src/http/keys/keys.e2e-spec.ts index 4d4b36cf..ffd648ed 100644 --- a/src/http/keys/keys.e2e-spec.ts +++ b/src/http/keys/keys.e2e-spec.ts @@ -20,7 +20,7 @@ import { FastifyAdapter, NestFastifyApplication } from '@nestjs/platform-fastify import { elMeta } from '../el-meta.fixture'; import { curatedKeyWithDuplicate, curatedModule, curatedModuleKeys, dvtModule, keys } from '../db.fixtures'; import { curatedModuleKeysResponse, dvtModuleKeysResponse } from 'http/keys.fixtures'; -import { DatabaseTestingModule } from 'app'; +import { DatabaseE2ETestingModule } from 'app'; describe('KeyController (e2e)', () => { let app: INestApplication; @@ -52,7 +52,7 @@ describe('KeyController (e2e)', () => { beforeAll(async () => { const imports = [ - DatabaseTestingModule.forRoot(), + DatabaseE2ETestingModule.forRoot(), LoggerModule.forRoot({ transports: [nullTransport()] }), KeyRegistryModule, StakingRouterModule, diff --git a/src/http/sr-modules-keys/sr-modules-keys.e2e-spec.ts b/src/http/sr-modules-keys/sr-modules-keys.e2e-spec.ts index 1e0dd449..8776010b 100644 --- a/src/http/sr-modules-keys/sr-modules-keys.e2e-spec.ts +++ b/src/http/sr-modules-keys/sr-modules-keys.e2e-spec.ts @@ -21,7 +21,7 @@ import { curatedModule, dvtModule, keys } from '../db.fixtures'; import { dvtModuleResp, curatedModuleResp } from '../module.fixture'; import { curatedModuleKeysResponse, dvtModuleKeysResponse } from '../keys.fixtures'; import { elMeta } from '../el-meta.fixture'; -import { DatabaseTestingModule } from 'app'; +import { DatabaseE2ETestingModule } from 'app'; describe('SRModulesKeysController (e2e)', () => { let app: INestApplication; @@ -64,7 +64,7 @@ describe('SRModulesKeysController (e2e)', () => { beforeAll(async () => { const imports = [ - DatabaseTestingModule.forRoot(), + DatabaseE2ETestingModule.forRoot(), LoggerModule.forRoot({ transports: [nullTransport()] }), KeyRegistryModule, StakingRouterModule, diff --git a/src/http/sr-modules-operators-keys/sr-modules-operators-keys.controller.ts b/src/http/sr-modules-operators-keys/sr-modules-operators-keys.controller.ts index c85d7840..514f0354 100644 --- a/src/http/sr-modules-operators-keys/sr-modules-operators-keys.controller.ts +++ b/src/http/sr-modules-operators-keys/sr-modules-operators-keys.controller.ts @@ -1,4 +1,3 @@ -import { pipeline } from 'node:stream/promises'; import { IsolationLevel } from '@mikro-orm/core'; import { Controller, @@ -20,7 +19,6 @@ import { TooEarlyResponse } from '../common/entities/http-exceptions'; import { EntityManager } from '@mikro-orm/knex'; import * as JSONStream from 'jsonstream'; import type { FastifyReply } from 'fastify'; -import { streamify } from 'common/streams'; import { ModuleIdPipe } from 'http/common/pipeline/module-id-pipe'; import { LOGGER_PROVIDER } from '@lido-nestjs/logger'; @@ -122,14 +120,29 @@ export class SRModulesOperatorsKeysController { reply.type('application/json').send(jsonStream); - try { - await this.entityManager.transactional( - () => pipeline([streamify(this.srModulesOperatorsKeys.getModulesOperatorsKeysGenerator()), jsonStream]), - { isolationLevel: IsolationLevel.REPEATABLE_READ }, - ); - } catch (error) { - this.logger.error('modules-operators-keys error', error); - jsonStream.destroy(); - } + const generator = await this.srModulesOperatorsKeys.getModulesOperatorsKeysGenerator(); + + await this.entityManager.transactional( + async () => { + try { + for await (const value of generator) { + jsonStream.write(value); + } + + jsonStream.end(); + } catch (error) { + if (error instanceof Error) { + const message = error.message; + const stack = error.stack; + this.logger.error(`modules-operators-keys error: ${message}`, stack); + } else { + this.logger.error('modules-operators-keys unknown error'); + } + + jsonStream.destroy(); + } + }, + { isolationLevel: IsolationLevel.REPEATABLE_READ }, + ); } } diff --git a/src/http/sr-modules-operators-keys/sr-modules-operators-keys.e2e-spec.ts b/src/http/sr-modules-operators-keys/sr-modules-operators-keys.e2e-spec.ts index 32a1ce8d..fc8ec760 100644 --- a/src/http/sr-modules-operators-keys/sr-modules-operators-keys.e2e-spec.ts +++ b/src/http/sr-modules-operators-keys/sr-modules-operators-keys.e2e-spec.ts @@ -25,7 +25,7 @@ import { elMeta } from '../el-meta.fixture'; import { keys, operators, dvtModule, curatedModule } from '../db.fixtures'; import { curatedModuleKeysResponse, dvtModuleKeysResponse } from '../keys.fixtures'; import { curatedOperatorsResp, dvtOperatorsResp } from '../operator.fixtures'; -import { DatabaseTestingModule } from 'app'; +import { DatabaseE2ETestingModule } from 'app'; import { ModulesOperatorsKeysRecord } from './sr-modules-operators-keys.types'; describe('SRModulesOperatorsKeysController (e2e)', () => { @@ -59,7 +59,7 @@ describe('SRModulesOperatorsKeysController (e2e)', () => { beforeAll(async () => { const imports = [ - DatabaseTestingModule.forRoot(), + DatabaseE2ETestingModule.forRoot(), LoggerModule.forRoot({ transports: [nullTransport()] }), KeyRegistryModule, StakingRouterModule, diff --git a/src/http/sr-modules-operators/sr-modules-operators.e2e-spec.ts b/src/http/sr-modules-operators/sr-modules-operators.e2e-spec.ts index 32c9b230..2e5ec7bb 100644 --- a/src/http/sr-modules-operators/sr-modules-operators.e2e-spec.ts +++ b/src/http/sr-modules-operators/sr-modules-operators.e2e-spec.ts @@ -22,7 +22,7 @@ import { elMeta } from '../el-meta.fixture'; import { operators, dvtModule, curatedModule, srModules } from '../db.fixtures'; import { dvtModuleResp, curatedModuleResp } from '../module.fixture'; import { dvtOperatorsResp, curatedOperatorsResp } from '../operator.fixtures'; -import { DatabaseTestingModule } from 'app'; +import { DatabaseE2ETestingModule } from 'app'; describe('SRModuleOperatorsController (e2e)', () => { let app: INestApplication; @@ -65,7 +65,7 @@ describe('SRModuleOperatorsController (e2e)', () => { beforeAll(async () => { const imports = [ - DatabaseTestingModule.forRoot(), + DatabaseE2ETestingModule.forRoot(), LoggerModule.forRoot({ transports: [nullTransport()] }), KeyRegistryModule, StakingRouterModule, diff --git a/src/http/sr-modules-validators/sr-modules-validators.e2e-spec.ts b/src/http/sr-modules-validators/sr-modules-validators.e2e-spec.ts index 33e43926..ed65324f 100644 --- a/src/http/sr-modules-validators/sr-modules-validators.e2e-spec.ts +++ b/src/http/sr-modules-validators/sr-modules-validators.e2e-spec.ts @@ -41,7 +41,7 @@ import { dvtOpOneRespExitMessages20percent, dvtOpOneRespExitMessages5maxAmount, } from '../consensus.fixtures'; -import { DatabaseTestingModule } from 'app'; +import { DatabaseE2ETestingModule } from 'app'; describe('SRModulesValidatorsController (e2e)', () => { let app: INestApplication; @@ -87,7 +87,7 @@ describe('SRModulesValidatorsController (e2e)', () => { beforeAll(async () => { const imports = [ - DatabaseTestingModule.forRoot(), + DatabaseE2ETestingModule.forRoot(), LoggerModule.forRoot({ transports: [nullTransport()] }), KeyRegistryModule, StakingRouterModule, diff --git a/src/http/sr-modules/sr-modules.e2e-spec.ts b/src/http/sr-modules/sr-modules.e2e-spec.ts index c86a452b..e1048866 100644 --- a/src/http/sr-modules/sr-modules.e2e-spec.ts +++ b/src/http/sr-modules/sr-modules.e2e-spec.ts @@ -18,7 +18,7 @@ import { SRModulesService } from './sr-modules.service'; import { elMeta } from '../el-meta.fixture'; import { curatedModule, dvtModule } from '../db.fixtures'; -import { DatabaseTestingModule } from 'app'; +import { DatabaseE2ETestingModule } from 'app'; describe('SRModulesController (e2e)', () => { let app: INestApplication; @@ -48,7 +48,7 @@ describe('SRModulesController (e2e)', () => { beforeAll(async () => { const imports = [ - DatabaseTestingModule.forRoot(), + DatabaseE2ETestingModule.forRoot(), LoggerModule.forRoot({ transports: [nullTransport()] }), KeyRegistryModule, StakingRouterModule, diff --git a/src/jobs/keys-update/keys-update.service.ts b/src/jobs/keys-update/keys-update.service.ts index e2a7ee6d..6ec022f5 100644 --- a/src/jobs/keys-update/keys-update.service.ts +++ b/src/jobs/keys-update/keys-update.service.ts @@ -117,9 +117,12 @@ export class KeysUpdateService { public async update(): Promise<{ number: number; hash: string; timestamp: number } | undefined> { // reading latest block from blockchain const currElMeta = await this.executionProvider.getBlock('latest'); + this.logger.log('Fetched latest block'); // read from database last execution layer data const prevElMeta = await this.elMetaStorage.get(); + this.logger.log('Fetched current execution meta and meta from database'); + // handle the situation when the node has fallen behind the service state if (prevElMeta && prevElMeta?.blockNumber > currElMeta.number) { this.logger.warn('Previous data is newer than current data', prevElMeta); @@ -133,6 +136,9 @@ export class KeysUpdateService { // Get modules from storage const storageModules = await this.srModulesStorage.findAll(); + + this.logger.log('Fetched modules from database'); + // Get staking modules from SR contract const contractModules = await this.stakingRouterFetchService.getStakingModules({ blockHash: currElMeta.hash }); diff --git a/src/storage/sr-module.storage.e2e-spec.ts b/src/storage/sr-module.storage.e2e-spec.ts index 7dd0d392..c836fe52 100644 --- a/src/storage/sr-module.storage.e2e-spec.ts +++ b/src/storage/sr-module.storage.e2e-spec.ts @@ -1,31 +1,24 @@ import { Test } from '@nestjs/testing'; -import { MikroOrmModule } from '@mikro-orm/nestjs'; import { StorageModule } from './storage.module'; import { SRModuleStorageService } from './sr-module.storage'; import { MikroORM } from '@mikro-orm/core'; import { curatedModule, dvtModule, updatedCuratedModule } from '../http/db.fixtures'; +import { DatabaseE2ETestingModule } from 'app'; describe('Staking Module Storage', () => { let srModuleStorageService: SRModuleStorageService; let mikroOrm: MikroORM; beforeEach(async () => { - const imports = [ - MikroOrmModule.forRoot({ - dbName: ':memory:', - type: 'sqlite', - allowGlobalContext: true, - entities: ['./**/*.entity.ts'], - }), - StorageModule, - ]; + const imports = [DatabaseE2ETestingModule.forRoot(), StorageModule]; const moduleRef = await Test.createTestingModule({ imports }).compile(); srModuleStorageService = moduleRef.get(SRModuleStorageService); mikroOrm = moduleRef.get(MikroORM); const generator = mikroOrm.getSchemaGenerator(); - await generator.updateSchema(); + await generator.refreshDatabase(); + await generator.clearDatabase(); }); afterEach(async () => { diff --git a/src/validators/validators.service.ts b/src/validators/validators.service.ts index 18ceb5e7..de90face 100644 --- a/src/validators/validators.service.ts +++ b/src/validators/validators.service.ts @@ -4,6 +4,7 @@ import { ConsensusValidatorsAndMetadata, Validator, ConsensusMeta, + ValidatorStatus, } from '@lido-nestjs/validators-registry'; import { LOGGER_PROVIDER, LoggerService } from '../common/logger'; import { ConfigService } from '../common/config'; @@ -11,7 +12,7 @@ import { QueryOrder } from '@mikro-orm/core'; export interface ValidatorsFilter { pubkeys: string[]; - statuses: string[]; + statuses: ValidatorStatus[]; max_amount: number | undefined; percent: number | undefined; } diff --git a/yarn.lock b/yarn.lock index e0c68a6c..13fd7e22 100644 --- a/yarn.lock +++ b/yarn.lock @@ -986,11 +986,6 @@ resolved "https://registry.yarnpkg.com/@fastify/error/-/error-2.0.0.tgz#a9f94af56eb934f0ab1ce4ef9f0ced6ebf2319dc" integrity sha512-wI3fpfDT0t7p8E6dA2eTECzzOd+bZsZCJ2Hcv+Onn2b7ZwK3RwD27uW2QDaMtQhAfWQQP+WNK7nKf0twLsBf9w== -"@gar/promisify@^1.0.1": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" - integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== - "@humanwhocodes/config-array@^0.10.4": version "0.10.4" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.4.tgz#01e7366e57d2ad104feea63e72248f22015c520c" @@ -1031,6 +1026,15 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== +"@jercle/yargonaut@1.1.5": + version "1.1.5" + resolved "https://registry.yarnpkg.com/@jercle/yargonaut/-/yargonaut-1.1.5.tgz#b640a73a2e82d6f9b636e93f310c9bb4947f5754" + integrity sha512-zBp2myVvBHp1UaJsNTyS6q4UDKT7eRiqTS4oNTS6VQMd6mpxYOdbeK4pY279cDCdakGy6hG0J3ejoXZVsPwHqw== + dependencies: + chalk "^4.1.2" + figlet "^1.5.2" + parent-require "^1.0.0" + "@jest/console@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.5.1.tgz#260fe7239602fe5130a94f1aa386eff54b014bba" @@ -1329,10 +1333,10 @@ resolved "https://registry.yarnpkg.com/@lido-nestjs/utils/-/utils-1.3.0.tgz#8bdc69c3fd18bc57752b1799516096d284f1112b" integrity sha512-/5I30Dos9TC18YfZq8O9ele28DpUQQCySB9X9GXPeSmY1AV4w2kIGQrws1wu2gtw7x5mZnW8PtWthJmH1f6vJQ== -"@lido-nestjs/validators-registry@^1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@lido-nestjs/validators-registry/-/validators-registry-1.3.0.tgz#d40ad9cee57dbccad4da45ad5635e05c68a77c5e" - integrity sha512-qULzEmKSVbYUP8q9oOyS5O8v64XOY37Fk+KZTGtzWql/dW+P+EEz6htaVXbtGhI72c3TBKEleb6hS2TsZBOeCw== +"@lido-nestjs/validators-registry@^1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@lido-nestjs/validators-registry/-/validators-registry-1.3.1.tgz#0851efcff7af8c56ebd27ee9021b1ccbe010e399" + integrity sha512-20frZsj7VG5iOoof+iPpXn3s5oBwuwsKuB9sRAGnqTFmwtiEr4AAGtE0WgGQNd4YLX9G7yF1bHr8mXCeaG8wUg== dependencies: "@lido-nestjs/consensus" "1.5.0" "@lido-nestjs/di" "1.0.1" @@ -1342,21 +1346,6 @@ stream-json "^1.8.0" zod "^3.20.2" -"@mapbox/node-pre-gyp@^1.0.0": - version "1.0.10" - resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz#8e6735ccebbb1581e5a7e652244cadc8a844d03c" - integrity sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA== - dependencies: - detect-libc "^2.0.0" - https-proxy-agent "^5.0.0" - make-dir "^3.1.0" - node-fetch "^2.6.7" - nopt "^5.0.0" - npmlog "^5.0.1" - rimraf "^3.0.2" - semver "^7.3.5" - tar "^6.1.11" - "@metamask/eth-sig-util@^4.0.0": version "4.0.1" resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088" @@ -1368,72 +1357,63 @@ tweetnacl "^1.0.3" tweetnacl-util "^0.15.1" -"@mikro-orm/cli@^5.5.3": - version "5.5.3" - resolved "https://registry.yarnpkg.com/@mikro-orm/cli/-/cli-5.5.3.tgz#b88fd2773ae63c696f17631c98cd6bb5f3d0eda4" - integrity sha512-lktxPeJHqUDbFYbo+e0zWBsQ9v/cChmM0ooxLHxK2Y+OA+frYUNf+LhQ61TGDFm4Ga/nbbA9+3J9qDy4XWIRRQ== +"@mikro-orm/cli@^5.7.13": + version "5.9.8" + resolved "https://registry.yarnpkg.com/@mikro-orm/cli/-/cli-5.9.8.tgz#53dc169cc6f27f84db49ebbcce91b2ec5ddd8c26" + integrity sha512-v3KHddyrovHiPz31mfa44GjnOYH2CuEZLiyWo8G/Wy0WP87EuDv5eEGuHJ9GAfd9jvOD4Cy8l56tu/bg/0YGGA== dependencies: - "@mikro-orm/core" "^5.5.3" - "@mikro-orm/knex" "^5.5.3" - fs-extra "10.1.0" - tsconfig-paths "4.1.0" - yargonaut "1.1.4" - yargs "15.4.1" + "@jercle/yargonaut" "1.1.5" + "@mikro-orm/core" "5.9.8" + "@mikro-orm/knex" "5.9.8" + fs-extra "11.1.1" + tsconfig-paths "4.2.0" + yargs "17.7.2" -"@mikro-orm/core@^5.5.3": - version "5.5.3" - resolved "https://registry.yarnpkg.com/@mikro-orm/core/-/core-5.5.3.tgz#8c9ed8ee3997a51fd47a1e6f4be32dd10189c026" - integrity sha512-/iQ6YKDp8EfTYibAOTkvW44uIc3qk0N+VSsUqMtO3sjb5Y2C6B+Wz4E1Qjb+oSeZtvWZn469HMCiOTgdMl6KSw== +"@mikro-orm/core@5.9.8", "@mikro-orm/core@^5.7.13": + version "5.9.8" + resolved "https://registry.yarnpkg.com/@mikro-orm/core/-/core-5.9.8.tgz#0b9732525f04df11fbe6dffc864e28f2ef6cefcc" + integrity sha512-bfTYInwc+EtPgLOxa5iBG5vKT1qq5swDcsc2F7Iu6sesBLKNputURA7qPmY6TCWQtSL/hvB3QjsCzY48LllD+w== dependencies: acorn-loose "8.3.0" acorn-walk "8.2.0" - dotenv "16.0.3" - fs-extra "10.1.0" - globby "11.0.4" - mikro-orm "^5.5.3" + dotenv "16.3.1" + fs-extra "11.1.1" + globby "11.1.0" + mikro-orm "5.9.8" reflect-metadata "0.1.13" -"@mikro-orm/knex@^5.5.3": - version "5.5.3" - resolved "https://registry.yarnpkg.com/@mikro-orm/knex/-/knex-5.5.3.tgz#0319105be81fce26b6a44804ae19cf0ba518baab" - integrity sha512-vimh9DLsXwauuQj7Lrr70RP9tESIm4LB1BpUwMsj/6qRBaEBefV/BVQzPFDKUOe3bghB4kTEHAdJ7qCnpg1Byw== +"@mikro-orm/knex@5.9.8", "@mikro-orm/knex@^5.7.13": + version "5.9.8" + resolved "https://registry.yarnpkg.com/@mikro-orm/knex/-/knex-5.9.8.tgz#9e60a8e423d7b19a056ef2f2d13f8cfc72541aff" + integrity sha512-Kitz11QY7Id37huNUfsxSkgnET8X/fuL861yUK9rJ8xrRiEakdm1r/lM1pLYcB/oikAphYLTgW+M/t3LoJb8aw== dependencies: - fs-extra "10.1.0" - knex "2.3.0" + fs-extra "11.1.1" + knex "2.5.1" sqlstring "2.3.3" -"@mikro-orm/migrations@^5.5.3": - version "5.5.3" - resolved "https://registry.yarnpkg.com/@mikro-orm/migrations/-/migrations-5.5.3.tgz#2f2ffa0cc754c8f751a7befd647924f438c5a141" - integrity sha512-1RQ451TkR37Zbpl73NoI/9jSWQ1dM3SPvJeHd+R3nbwtDcYoPI8eCOi/wrCu+ylQgkDE+LyuFFO+y7DpxsdvOQ== +"@mikro-orm/migrations@^5.7.13": + version "5.9.8" + resolved "https://registry.yarnpkg.com/@mikro-orm/migrations/-/migrations-5.9.8.tgz#3213057f50eb65f998e1cc859e433a131e296864" + integrity sha512-D4s2Hd8TFLimddftC/El4Vtiq6AcGG/lc7+LUHieVzkAfdvcddxnxYQ3q1qH7IxqdDWNcZr0dYPxqLvgFhYqqg== dependencies: - "@mikro-orm/knex" "^5.5.3" - fs-extra "10.1.0" - knex "2.3.0" - umzug "3.2.1" + "@mikro-orm/knex" "5.9.8" + fs-extra "11.1.1" + knex "2.5.1" + umzug "3.3.1" "@mikro-orm/nestjs@^5.1.2": version "5.1.2" resolved "https://registry.yarnpkg.com/@mikro-orm/nestjs/-/nestjs-5.1.2.tgz#1fb47bf4667eba564924f2117e62f42a886bcfbf" integrity sha512-kHvrcZoIsZUwaahWIjuJDII0rfikGucsyZg9UJRDLcDIYm9nm39Qtos9uGgTAySejll/g/XdOM6QirPHtgR8FQ== -"@mikro-orm/postgresql@^5.5.3": - version "5.5.3" - resolved "https://registry.yarnpkg.com/@mikro-orm/postgresql/-/postgresql-5.5.3.tgz#5a7af2933a0adf434c41e13e1a2881d8ee93aacc" - integrity sha512-9rJEDT6nfkHOyP4p25AOYbgTkjrlXHlm8e+u1FFW2CZKpdxpmH3hiY5H1x8muOI/fvHP7njt2Da71i2MXakw0g== +"@mikro-orm/postgresql@^5.7.13": + version "5.9.8" + resolved "https://registry.yarnpkg.com/@mikro-orm/postgresql/-/postgresql-5.9.8.tgz#a8defac2f82725d94156ca7480a1ffa1a92ea370" + integrity sha512-ALXHS9fb3B93RozuF8n3+gYZz/I+d8Swo/5hmcMbaQN4Zs8hhHOhmjfwIj83IWb1QBPYcBeIc2M8TCmhxXX//g== dependencies: - "@mikro-orm/knex" "^5.5.3" - pg "8.8.0" - -"@mikro-orm/sqlite@5.5.3": - version "5.5.3" - resolved "https://registry.yarnpkg.com/@mikro-orm/sqlite/-/sqlite-5.5.3.tgz#b103a8d7116ad92e9bfcd006316572d046bc507c" - integrity sha512-94OGj+4l5VpmxjaFWdjvEO2HDUS/EYYAPSm1mF0s4aejBmjulXWrTDRIXBgTaeBBcoUSM3iTPfLf5oaqGjajXQ== - dependencies: - "@mikro-orm/knex" "^5.5.3" - fs-extra "10.1.0" - sqlite3 "5.1.2" - sqlstring-sqlite "0.1.1" + "@mikro-orm/knex" "5.9.8" + pg "8.11.3" + postgres-date "2.1.0" "@morgan-stanley/ts-mocking-bird@^0.6.2": version "0.6.4" @@ -1829,22 +1809,6 @@ resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz#b41053e360c31a32c2640c9a45ee981a7e603fe0" integrity sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg== -"@npmcli/fs@^1.0.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257" - integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ== - dependencies: - "@gar/promisify" "^1.0.1" - semver "^7.3.5" - -"@npmcli/move-file@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" - integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== - dependencies: - mkdirp "^1.0.4" - rimraf "^3.0.2" - "@nuxtjs/opencollective@0.3.2": version "0.3.2" resolved "https://registry.yarnpkg.com/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz#620ce1044f7ac77185e825e1936115bb38e2681c" @@ -2912,11 +2876,6 @@ abab@^2.0.3, abab@^2.0.5: resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" @@ -3024,22 +2983,13 @@ aes-js@^3.1.1, aes-js@^3.1.2: resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.2.tgz#db9aabde85d5caabbfc0d4f2a4446960f627146a" integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ== -agent-base@6, agent-base@^6.0.2: +agent-base@6: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" -agentkeepalive@^4.1.3: - version "4.3.0" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.3.0.tgz#bb999ff07412653c1803b3ced35e50729830a255" - integrity sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg== - dependencies: - debug "^4.1.0" - depd "^2.0.0" - humanize-ms "^1.2.1" - aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" @@ -3162,32 +3112,11 @@ anymatch@^3.0.3, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -"aproba@^1.0.3 || ^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" - integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== - archy@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw== -are-we-there-yet@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c" - integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== - dependencies: - delegates "^1.0.0" - readable-stream "^3.6.0" - -are-we-there-yet@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" - integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== - dependencies: - delegates "^1.0.0" - readable-stream "^3.6.0" - arg@^4.1.0: version "4.1.3" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" @@ -4300,30 +4229,6 @@ bytes@3.1.2: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== -cacache@^15.2.0: - version "15.3.0" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" - integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== - dependencies: - "@npmcli/fs" "^1.0.0" - "@npmcli/move-file" "^1.0.1" - chownr "^2.0.0" - fs-minipass "^2.0.0" - glob "^7.1.4" - infer-owner "^1.0.4" - lru-cache "^6.0.0" - minipass "^3.1.1" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.2" - mkdirp "^1.0.3" - p-map "^4.0.0" - promise-inflight "^1.0.1" - rimraf "^3.0.2" - ssri "^8.0.1" - tar "^6.0.2" - unique-filename "^1.1.1" - cache-manager@^3.6.1: version "3.6.3" resolved "https://registry.yarnpkg.com/cache-manager/-/cache-manager-3.6.3.tgz#48052f3cf9ee4bac1cbb6adeedd69faf9da4ec04" @@ -4351,7 +4256,7 @@ camelcase@^3.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" integrity sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg== -camelcase@^5.0.0, camelcase@^5.3.1: +camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== @@ -4399,7 +4304,7 @@ chalk@3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^1.1.1, chalk@^1.1.3: +chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== @@ -4469,11 +4374,6 @@ chokidar@3.5.3, chokidar@^3.4.0, chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" -chownr@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" - integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== - chrome-trace-event@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" @@ -4612,15 +4512,6 @@ cliui@^3.2.0: strip-ansi "^3.0.1" wrap-ansi "^2.0.0" -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" - 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.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" @@ -4630,6 +4521,15 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + 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.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" @@ -4687,11 +4587,6 @@ color-string@^1.6.0: color-name "^1.0.0" simple-swizzle "^0.2.2" -color-support@^1.1.2, color-support@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" - integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== - color@^3.1.3: version "3.2.1" resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" @@ -4760,6 +4655,11 @@ commander@4.1.1: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== +commander@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + commander@^11.0.0: version "11.0.0" resolved "https://registry.yarnpkg.com/commander/-/commander-11.0.0.tgz#43e19c25dbedc8256203538e8d7e9346877a6f67" @@ -4770,11 +4670,6 @@ commander@^2.15.0, commander@^2.20.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^9.1.0: - version "9.4.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-9.4.1.tgz#d1dd8f2ce6faf93147295c0df13c7c21141cfbdd" - integrity sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw== - component-emitter@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" @@ -4810,11 +4705,6 @@ consola@^2.15.0: resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.3.tgz#2e11f98d6a4be71ff72e0bdf07bd23e12cb61550" integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== -console-control-strings@^1.0.0, console-control-strings@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== - content-disposition@0.5.4, content-disposition@^0.5.3: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" @@ -5018,7 +4908,7 @@ debug@^3.1.0: dependencies: ms "^2.1.1" -decamelize@^1.1.1, decamelize@^1.2.0: +decamelize@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== @@ -5119,12 +5009,7 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== - -depd@2.0.0, depd@^2.0.0: +depd@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== @@ -5151,11 +5036,6 @@ detect-indent@^4.0.0: dependencies: repeating "^2.0.0" -detect-libc@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" - integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w== - detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -5229,10 +5109,10 @@ dotenv@16.0.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.0.tgz#c619001253be89ebb638d027b609c75c26e47411" integrity sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q== -dotenv@16.0.3: - version "16.0.3" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07" - integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== +dotenv@16.3.1: + version "16.3.1" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" + integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== dotignore@~0.1.2: version "0.1.2" @@ -5299,10 +5179,10 @@ elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.4: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" -emittery@^0.12.1: - version "0.12.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.12.1.tgz#cb9a4a18745816f7a1fa03a8953e7eaededb45f2" - integrity sha512-pYyW59MIZo0HxPFf+Vb3+gacUu0gxVS3TZwB2ClwkEZywgF9f9OJDoVmNLojTn0vKX3tO9LC+pdQEcLP4Oz/bQ== +emittery@^0.13.0: + version "0.13.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== emittery@^0.8.1: version "0.8.1" @@ -5329,7 +5209,7 @@ encoding-negotiator@^2.0.1: resolved "https://registry.yarnpkg.com/encoding-negotiator/-/encoding-negotiator-2.0.1.tgz#79871bb5473b81f6a0670e8de5303fb5ee0868a3" integrity sha512-GSK7qphNR4iPcejfAlZxKDoz3xMhnspwImK+Af5WhePS9jUpK/Oh7rUdyENWu+9rgDflOCTmAojBsgsvM8neAQ== -encoding@^0.1.11, encoding@^0.1.12, encoding@^0.1.13: +encoding@^0.1.11, encoding@^0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== @@ -5364,11 +5244,6 @@ env-paths@^2.2.0: resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== -err-code@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" - integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== - err-code@^3.0.0, err-code@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/err-code/-/err-code-3.0.1.tgz#a444c7b992705f2b120ee320b09972eef331c920" @@ -6217,17 +6092,6 @@ fast-fifo@^1.0.0: resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== -fast-glob@^3.1.1: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - fast-glob@^3.2.9: version "3.2.11" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" @@ -6384,10 +6248,10 @@ fetch-ponyfill@^4.0.0: dependencies: node-fetch "~1.7.1" -figlet@^1.1.1: - version "1.5.2" - resolved "https://registry.yarnpkg.com/figlet/-/figlet-1.5.2.tgz#dda34ff233c9a48e36fcff6741aeb5bafe49b634" - integrity sha512-WOn21V8AhyE1QqVfPIVxe3tupJacq1xGkPTB4iagT6o+P2cAgEOOwIxMftr4+ZCTI6d551ij9j61DFr0nsP2uQ== +figlet@^1.5.2: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figlet/-/figlet-1.7.0.tgz#46903a04603fd19c3e380358418bb2703587a72e" + integrity sha512-gO8l3wvqo0V7wEFLXPbkX83b7MVjRrk1oRLfYlZXol8nEpb/ON9pcKLI4qpBv5YtOTfrINtqb7b40iYY2FTWFg== figures@^3.0.0: version "3.2.0" @@ -6604,6 +6468,15 @@ fs-extra@10.1.0, fs-extra@^10.0.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d" + integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^0.30.0: version "0.30.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" @@ -6643,21 +6516,6 @@ fs-extra@^9.1.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-jetpack@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/fs-jetpack/-/fs-jetpack-4.3.1.tgz#cdfd4b64e6bfdec7c7dc55c76b39efaa7853bb20" - integrity sha512-dbeOK84F6BiQzk2yqqCVwCPWTxAvVGJ3fMQc6E2wuEohS28mR6yHngbrKuVCK1KHRx/ccByDylqu4H5PCP2urQ== - dependencies: - minimatch "^3.0.2" - rimraf "^2.6.3" - -fs-minipass@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== - dependencies: - minipass "^3.0.0" - fs-monkey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" @@ -6698,35 +6556,6 @@ functions-have-names@^1.2.3: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== -gauge@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395" - integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== - dependencies: - aproba "^1.0.3 || ^2.0.0" - color-support "^1.1.2" - console-control-strings "^1.0.0" - has-unicode "^2.0.1" - object-assign "^4.1.1" - signal-exit "^3.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - wide-align "^1.1.2" - -gauge@^4.0.3: - version "4.0.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" - integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== - dependencies: - aproba "^1.0.3 || ^2.0.0" - color-support "^1.1.3" - console-control-strings "^1.1.0" - has-unicode "^2.0.1" - signal-exit "^3.0.7" - string-width "^4.2.3" - strip-ansi "^6.0.1" - wide-align "^1.1.5" - gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -6737,7 +6566,7 @@ get-caller-file@^1.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== -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.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== @@ -6901,19 +6730,7 @@ globalthis@^1.0.3: dependencies: define-properties "^1.1.3" -globby@11.0.4: - version "11.0.4" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" - integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.1.1" - ignore "^5.1.4" - merge2 "^1.3.0" - slash "^3.0.0" - -globby@^11.1.0: +globby@11.1.0, globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -6937,7 +6754,7 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== -graceful-fs@^4.1.9, graceful-fs@^4.2.6: +graceful-fs@^4.1.9: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -7060,11 +6877,6 @@ has-tostringtag@^1.0.0: dependencies: has-symbols "^1.0.2" -has-unicode@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== - has@^1.0.3, has@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -7146,11 +6958,6 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -http-cache-semantics@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" - integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== - http-errors@1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" @@ -7214,13 +7021,6 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -humanize-ms@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" - integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== - dependencies: - ms "^2.0.0" - iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -7247,7 +7047,7 @@ ieee754@^1.1.13, ieee754@^1.2.1: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore@^5.1.4, ignore@^5.2.0: +ignore@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== @@ -7288,11 +7088,6 @@ indent-string@^4.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== -infer-owner@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== - inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -7418,11 +7213,6 @@ ip-regex@^4.0.0: resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== -ip@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" - integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== - ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" @@ -7730,11 +7520,6 @@ is-ip@^3.1.0: dependencies: ip-regex "^4.0.0" -is-lambda@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" - integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== - is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" @@ -8609,6 +8394,11 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" +json5@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + jsonc-parser@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.0.0.tgz#abdd785701c7e7eaca8a9ec8cf070ca51a745a22" @@ -8686,13 +8476,13 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -knex@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/knex/-/knex-2.3.0.tgz#87fa2a9553d7cafb125d7a0645256fbe29ef5967" - integrity sha512-WMizPaq9wRMkfnwKXKXgBZeZFOSHGdtoSz5SaLAVNs3WRDfawt9O89T4XyH52PETxjV8/kRk0Yf+8WBEP/zbYw== +knex@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/knex/-/knex-2.5.1.tgz#a6c6b449866cf4229f070c17411f23871ba52ef9" + integrity sha512-z78DgGKUr4SE/6cm7ku+jHvFT0X97aERh/f0MUKAKgFnwCYBEW4TFBqtHWFYiJFid7fMrtpZ/gxJthvz5mEByA== dependencies: colorette "2.0.19" - commander "^9.1.0" + commander "^10.0.0" debug "4.3.4" escalade "^3.1.1" esm "^3.2.25" @@ -8700,7 +8490,7 @@ knex@2.3.0: getopts "2.3.0" interpret "^2.2.0" lodash "^4.17.21" - pg-connection-string "2.5.0" + pg-connection-string "2.6.1" rechoir "^0.8.0" resolve-from "^5.0.0" tarn "^3.0.2" @@ -8995,7 +8785,7 @@ magic-string@0.25.7: dependencies: sourcemap-codec "^1.4.4" -make-dir@^3.0.0, make-dir@^3.1.0: +make-dir@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== @@ -9007,28 +8797,6 @@ make-error@1.x, make-error@^1.1.1: resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== -make-fetch-happen@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968" - integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg== - dependencies: - agentkeepalive "^4.1.3" - cacache "^15.2.0" - http-cache-semantics "^4.1.0" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - is-lambda "^1.0.1" - lru-cache "^6.0.0" - minipass "^3.1.3" - minipass-collect "^1.0.2" - minipass-fetch "^1.3.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - negotiator "^0.6.2" - promise-retry "^2.0.1" - socks-proxy-agent "^6.0.0" - ssri "^8.0.0" - makeerror@1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" @@ -9155,10 +8923,10 @@ middie@6.1.0: path-to-regexp "^6.1.0" reusify "^1.0.4" -mikro-orm@^5.5.3: - version "5.5.3" - resolved "https://registry.yarnpkg.com/mikro-orm/-/mikro-orm-5.5.3.tgz#919966413115980c837bef2407d5f21eb87c5d43" - integrity sha512-aF2FfyB4OI+1LEXM57mPFfpj/OpmghGZq4Hmi4kHB6920GyqeruBYLMiFkT7MflHVgLCfj+2tZV8+uBsGWBEDQ== +mikro-orm@5.9.8: + version "5.9.8" + resolved "https://registry.yarnpkg.com/mikro-orm/-/mikro-orm-5.9.8.tgz#8fe379bdb7e14cfdc5eb320f3dfa366d40791e35" + integrity sha512-iBku1gU9xkA2FCw2wy0K4x3EQzsRE52dYGkGUVQEthRmc/vIMBwXyiTAj+oARzXrkWqslFtlZA/2upeqZhMQlw== mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": version "1.52.0" @@ -9221,7 +8989,7 @@ minimatch@5.0.1: dependencies: brace-expansion "^2.0.1" -minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -9245,65 +9013,6 @@ minimist@~1.2.7: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -minipass-collect@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" - integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== - dependencies: - minipass "^3.0.0" - -minipass-fetch@^1.3.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.4.1.tgz#d75e0091daac1b0ffd7e9d41629faff7d0c1f1b6" - integrity sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw== - dependencies: - minipass "^3.1.0" - minipass-sized "^1.0.3" - minizlib "^2.0.0" - optionalDependencies: - encoding "^0.1.12" - -minipass-flush@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" - integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== - dependencies: - minipass "^3.0.0" - -minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" - integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== - dependencies: - minipass "^3.0.0" - -minipass-sized@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" - integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== - dependencies: - minipass "^3.0.0" - -minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: - version "3.3.6" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" - integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== - dependencies: - yallist "^4.0.0" - -minipass@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" - integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== - -minizlib@^2.0.0, minizlib@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" - integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== - dependencies: - minipass "^3.0.0" - yallist "^4.0.0" - mkdirp@^0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" @@ -9311,7 +9020,7 @@ mkdirp@^0.5.1: dependencies: minimist "^1.2.6" -mkdirp@^1.0.3, mkdirp@^1.0.4: +mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== @@ -9365,7 +9074,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3, ms@^2.0.0, ms@^2.1.1: +ms@2.1.3, ms@^2.1.1: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -9471,7 +9180,7 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -negotiator@0.6.3, negotiator@^0.6.2: +negotiator@0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== @@ -9498,11 +9207,6 @@ node-addon-api@^2.0.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== -node-addon-api@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f" - integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ== - node-emoji@1.11.0: version "1.11.0" resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" @@ -9541,22 +9245,6 @@ node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.1.tgz#24b6d075e5e391b8d5539d98c7fc5c210cac8a3e" integrity sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ== -node-gyp@8.x: - version "8.4.1" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-8.4.1.tgz#3d49308fc31f768180957d6b5746845fbd429937" - integrity sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w== - dependencies: - env-paths "^2.2.0" - glob "^7.1.4" - graceful-fs "^4.2.6" - make-fetch-happen "^9.1.0" - nopt "^5.0.0" - npmlog "^6.0.0" - rimraf "^3.0.2" - semver "^7.3.5" - tar "^6.1.2" - which "^2.0.2" - node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -9572,13 +9260,6 @@ node-releases@^2.0.6: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== -nopt@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" - integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== - dependencies: - abbrev "1" - normalize-package-data@^2.3.2: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -9601,26 +9282,6 @@ npm-run-path@^4.0.0, npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" -npmlog@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" - integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== - dependencies: - are-we-there-yet "^2.0.0" - console-control-strings "^1.1.0" - gauge "^3.0.0" - set-blocking "^2.0.0" - -npmlog@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" - integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== - dependencies: - are-we-there-yet "^3.0.0" - console-control-strings "^1.1.0" - gauge "^4.0.3" - set-blocking "^2.0.0" - number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" @@ -10028,10 +9689,20 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== -pg-connection-string@2.5.0, pg-connection-string@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.5.0.tgz#538cadd0f7e603fc09a12590f3b8a452c2c0cf34" - integrity sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ== +pg-cloudflare@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz#e6d5833015b170e23ae819e8c5d7eaedb472ca98" + integrity sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q== + +pg-connection-string@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.6.1.tgz#78c23c21a35dd116f48e12e23c0965e8d9e2cbfb" + integrity sha512-w6ZzNu6oMmIzEAYVw+RLK0+nqHPt8K3ZnknKi+g48Ak2pr3dtljJW3o+D/n2zzCG07Zoe9VOX3aiKpj+BN0pjg== + +pg-connection-string@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.6.2.tgz#713d82053de4e2bd166fab70cd4f26ad36aab475" + integrity sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA== pg-cursor@^2.10.3: version "2.10.3" @@ -10043,15 +9714,15 @@ pg-int8@1.0.1: resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== -pg-pool@^3.5.2: - version "3.5.2" - resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.5.2.tgz#ed1bed1fb8d79f1c6fd5fb1c99e990fbf9ddf178" - integrity sha512-His3Fh17Z4eg7oANLob6ZvH8xIVen3phEZh2QuyrIl4dQSDVEabNducv6ysROKpDNPSD+12tONZVWfSgMvDD9w== +pg-pool@^3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.6.1.tgz#5a902eda79a8d7e3c928b77abf776b3cb7d351f7" + integrity sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og== -pg-protocol@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.5.0.tgz#b5dd452257314565e2d54ab3c132adc46565a6a0" - integrity sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ== +pg-protocol@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.6.0.tgz#4c91613c0315349363af2084608db843502f8833" + integrity sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q== pg-query-stream@^4.5.3: version "4.5.3" @@ -10071,18 +9742,20 @@ pg-types@^2.1.0: postgres-date "~1.0.4" postgres-interval "^1.1.0" -pg@8.8.0: - version "8.8.0" - resolved "https://registry.yarnpkg.com/pg/-/pg-8.8.0.tgz#a77f41f9d9ede7009abfca54667c775a240da686" - integrity sha512-UXYN0ziKj+AeNNP7VDMwrehpACThH7LUl/p8TDFpEUuSejCUIwGSfxpHsPvtM6/WXFy6SU4E5RG4IJV/TZAGjw== +pg@8.11.3: + version "8.11.3" + resolved "https://registry.yarnpkg.com/pg/-/pg-8.11.3.tgz#d7db6e3fe268fcedd65b8e4599cda0b8b4bf76cb" + integrity sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g== dependencies: buffer-writer "2.0.0" packet-reader "1.0.0" - pg-connection-string "^2.5.0" - pg-pool "^3.5.2" - pg-protocol "^1.5.0" + pg-connection-string "^2.6.2" + pg-pool "^3.6.1" + pg-protocol "^1.6.0" pg-types "^2.1.0" pgpass "1.x" + optionalDependencies: + pg-cloudflare "^1.1.1" pgpass@1.x: version "1.0.5" @@ -10158,10 +9831,10 @@ pluralize@8.0.0: resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== -pony-cause@^2.1.2: - version "2.1.4" - resolved "https://registry.yarnpkg.com/pony-cause/-/pony-cause-2.1.4.tgz#18ef4799b5207ad0a7bacf5ea4602e6b06c75c8c" - integrity sha512-6jNyaeEi1I4rGD338qmNmx2yLg8N/JZJZU8JCrqDtfxCEYZttfuN6AnKhBGfMyTydW4t2iBioxDzKeZJC2mJVw== +pony-cause@^2.1.4: + version "2.1.10" + resolved "https://registry.yarnpkg.com/pony-cause/-/pony-cause-2.1.10.tgz#828457ad6f13be401a075dbf14107a9057945174" + integrity sha512-3IKLNXclQgkU++2fSi93sQ6BznFuxSLB11HdvZQ6JW/spahf/P1pAHBQEahr20rs0htZW0UDkM1HmA+nZkXKsw== postgres-array@~2.0.0: version "2.0.0" @@ -10173,6 +9846,11 @@ postgres-bytea@~1.0.0: resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35" integrity sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w== +postgres-date@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-2.1.0.tgz#b85d3c1fb6fb3c6c8db1e9942a13a3bf625189d0" + integrity sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA== + postgres-date@~1.0.4: version "1.0.7" resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.7.tgz#51bc086006005e5061c591cee727f2531bf641a8" @@ -10258,19 +9936,6 @@ prom-client@^14.0.1: dependencies: tdigest "^0.1.1" -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== - -promise-retry@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" - integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== - dependencies: - err-code "^2.0.2" - retry "^0.12.0" - promise-to-callback@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/promise-to-callback/-/promise-to-callback-1.0.0.tgz#5d2a749010bfb67d963598fcd3960746a68feef7" @@ -10641,11 +10306,6 @@ require-main-filename@^1.0.1: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" integrity sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug== -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" @@ -10732,11 +10392,6 @@ retimer@^2.0.0: resolved "https://registry.yarnpkg.com/retimer/-/retimer-2.0.0.tgz#e8bd68c5e5a8ec2f49ccb5c636db84c04063bbca" integrity sha512-KLXY85WkEq2V2bKex/LOO1ViXVn2KGYe4PYysAdYdjmraYIUsVkXu8O4am+8+5UbaaGl1qho4aqAAPHNQ4GSbg== -retry@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== - reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -10754,7 +10409,7 @@ rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: dependencies: glob "^7.1.3" -rimraf@^2.2.8, rimraf@^2.6.3: +rimraf@^2.2.8: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -11083,7 +10738,7 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: +signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== @@ -11154,28 +10809,6 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -smart-buffer@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" - integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== - -socks-proxy-agent@^6.0.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz#2687a31f9d7185e38d530bef1944fe1f1496d6ce" - integrity sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ== - dependencies: - agent-base "^6.0.2" - debug "^4.3.3" - socks "^2.6.2" - -socks@^2.6.2: - version "2.7.1" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" - integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== - dependencies: - ip "^2.0.0" - smart-buffer "^4.2.0" - solc@0.7.3: version "0.7.3" resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" @@ -11286,22 +10919,6 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -sqlite3@5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-5.1.2.tgz#f50d5b1482b6972fb650daf6f718e6507c6cfb0f" - integrity sha512-D0Reg6pRWAFXFUnZKsszCI67tthFD8fGPewRddDCX6w4cYwz3MbvuwRICbL+YQjBAh9zbw+lJ/V9oC8nG5j6eg== - dependencies: - "@mapbox/node-pre-gyp" "^1.0.0" - node-addon-api "^4.2.0" - tar "^6.1.11" - optionalDependencies: - node-gyp "8.x" - -sqlstring-sqlite@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/sqlstring-sqlite/-/sqlstring-sqlite-0.1.1.tgz#c8c61810663f2e59a6b0d737b70a8752bda3a078" - integrity sha512-9CAYUJ0lEUPYJrswqiqdINNSfq3jqWo/bFJ7tufdoNeSK0Fy+d1kFTxjqO9PIqza0Kri+ZtYMfPVf1aZaFOvrQ== - sqlstring@2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/sqlstring/-/sqlstring-2.3.3.tgz#2ddc21f03bce2c387ed60680e739922c65751d0c" @@ -11322,13 +10939,6 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" -ssri@^8.0.0, ssri@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" - integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== - dependencies: - minipass "^3.1.1" - stable@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" @@ -11424,7 +11034,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -11649,18 +11259,6 @@ tape@^4.4.0, tape@^4.6.3: string.prototype.trim "~1.2.7" through "~2.3.8" -tar@^6.0.2, tar@^6.1.11, tar@^6.1.2: - version "6.1.15" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.15.tgz#c9738b0b98845a3b344d334b8fa3041aaba53a69" - integrity sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^5.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - tarn@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/tarn/-/tarn-3.0.2.tgz#73b6140fbb881b71559c4f8bfde3d9a4b3d27693" @@ -11977,12 +11575,12 @@ tsconfig-paths@3.14.1, tsconfig-paths@^3.12.0, tsconfig-paths@^3.9.0: minimist "^1.2.6" strip-bom "^3.0.0" -tsconfig-paths@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.1.0.tgz#f8ef7d467f08ae3a695335bf1ece088c5538d2c1" - integrity sha512-AHx4Euop/dXFC+Vx589alFba8QItjF+8hf8LtmuiCwHyI4rHXQtOOENaM8kvYf5fR0dRChy3wzWIZ9WbB7FWow== +tsconfig-paths@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz#ef78e19039133446d244beac0fd6a1632e2d107c" + integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== dependencies: - json5 "^2.2.1" + json5 "^2.2.2" minimist "^1.2.6" strip-bom "^3.0.0" @@ -12064,10 +11662,10 @@ type-fest@^0.7.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== -type-fest@^2.18.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" - integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== +type-fest@^3.0.0: + version "3.13.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.13.1.tgz#bb744c1f0678bea7543a2d1ec24e83e68e8c8706" + integrity sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g== type-is@~1.6.18: version "1.6.18" @@ -12201,17 +11799,16 @@ uint8arrays@^3.0.0: dependencies: multiformats "^9.4.2" -umzug@3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/umzug/-/umzug-3.2.1.tgz#01c3a109efb037a10a317d4191be22810c37b195" - integrity sha512-XyWQowvP9CKZycKc/Zg9SYWrAWX/gJCE799AUTFqk8yC3tp44K1xWr3LoFF0MNEjClKOo1suCr5ASnoy+KltdA== +umzug@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/umzug/-/umzug-3.3.1.tgz#4ed726e7ec216049d826623a9c4faf66d412eb61" + integrity sha512-jG3C35jti1YnCuH/k3fJEfHbnIG9c3Q9ITZ0B9eWwnXngh/AUd0mRHv8OdpE2Q9VoK7tB6xL990JrMCr0LtfNA== dependencies: "@rushstack/ts-command-line" "^4.12.2" - emittery "^0.12.1" - fs-jetpack "^4.3.1" + emittery "^0.13.0" glob "^8.0.3" - pony-cause "^2.1.2" - type-fest "^2.18.0" + pony-cause "^2.1.4" + type-fest "^3.0.0" unbox-primitive@^1.0.2: version "1.0.2" @@ -12235,20 +11832,6 @@ undici@^5.14.0: dependencies: busboy "^1.6.0" -unique-filename@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" - integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== - dependencies: - unique-slug "^2.0.0" - -unique-slug@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" - integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== - dependencies: - imurmurhash "^0.1.4" - universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -12707,11 +12290,6 @@ which-module@^1.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" integrity sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ== -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - 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.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" @@ -12723,20 +12301,13 @@ which-typed-array@^1.1.11, which-typed-array@^1.1.2: gopd "^1.0.1" has-tostringtag "^1.0.0" -which@^2.0.1, which@^2.0.2: +which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" -wide-align@^1.1.2, wide-align@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" - integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== - dependencies: - string-width "^1.0.2 || 2 || 3 || 4" - window-size@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" @@ -12818,15 +12389,6 @@ wrap-ansi@^2.0.0: string-width "^1.0.1" strip-ansi "^3.0.1" -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" @@ -12949,11 +12511,6 @@ y18n@^3.2.1: resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== - y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" @@ -12979,15 +12536,6 @@ yaml@^2.2.2: resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.2.tgz#f522db4313c671a0ca963a75670f1c12ea909144" integrity sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg== -yargonaut@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/yargonaut/-/yargonaut-1.1.4.tgz#c64f56432c7465271221f53f5cc517890c3d6e0c" - integrity sha512-rHgFmbgXAAzl+1nngqOcwEljqHGG9uUZoPjsdZEs1w5JW9RXYzrSvH/u70C1JE5qFi0qjsdhnUX/dJRpWqitSA== - dependencies: - chalk "^1.1.1" - figlet "^1.1.1" - parent-require "^1.0.0" - yargs-parser@20.2.4: version "20.2.4" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" @@ -12998,14 +12546,6 @@ yargs-parser@20.x, yargs-parser@^20.2.2: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs-parser@^18.1.2: - version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - yargs-parser@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4" @@ -13014,6 +12554,11 @@ yargs-parser@^2.4.1: camelcase "^3.0.0" lodash.assign "^4.0.6" +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + yargs-unparser@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" @@ -13024,23 +12569,6 @@ yargs-unparser@2.0.0: flat "^5.0.2" is-plain-obj "^2.1.0" -yargs@15.4.1: - version "15.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" - 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@16.2.0, yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" @@ -13054,6 +12582,19 @@ yargs@16.2.0, yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" +yargs@17.7.2: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yargs@^4.7.1: version "4.8.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0"