diff --git a/package.json b/package.json index 3d5d305..5305a9b 100644 --- a/package.json +++ b/package.json @@ -44,21 +44,21 @@ "zod": "^3.21.4" }, "devDependencies": { - "@snapshot-labs/eslint-config": "^0.1.0-beta.7", - "@snapshot-labs/prettier-config": "^0.1.0-beta.7", + "@snapshot-labs/eslint-config": "^0.1.0-beta.21", + "@snapshot-labs/prettier-config": "^0.1.0-beta.19", "@types/bn.js": "^5.1.0", "@types/jest": "^29.5.0", - "@types/node": "^18.11.6", + "@types/node": "^22.18.0", "@types/pg": "^8.6.6", "dotenv": "^16.0.1", - "eslint": "^8.28.0", + "eslint": "^8.57.0", "jest": "^29.5.0", "jest-mock-extended": "^3.0.4", - "prettier": "^2.7.1", + "prettier": "^3.6.2", "sqlite3": "^5.1.6", "ts-jest": "^29.1.0", "ts-node": "^10.9.1", - "typescript": "^4.9.3" + "typescript": "^5.9.2" }, "files": [ "dist/**/*", diff --git a/src/bin/index.ts b/src/bin/index.ts index 57e0fe6..36db602 100644 --- a/src/bin/index.ts +++ b/src/bin/index.ts @@ -1,21 +1,25 @@ #!/usr/bin/env node -import path from 'path'; import fs from 'fs/promises'; +import path from 'path'; import process from 'process'; -import yargs from 'yargs/yargs'; +import { printSchema } from 'graphql'; import { hideBin } from 'yargs/helpers'; +import yargs from 'yargs/yargs'; import { codegen } from '../codegen'; +import { GqlEntityController } from '../graphql/controller'; import { OverridesConfig } from '../types'; import { extendSchema } from '../utils/graphql'; -import { GqlEntityController } from '../graphql/controller'; -import { printSchema } from 'graphql'; const DEFAULT_CONFIG_PATH = 'src/overrides.json'; const DEFAULT_SCHEMA_PATH = 'src/schema.gql'; const OUTPUT_DIRECTORY = '.checkpoint'; -async function generate(schemaFile: string, overridesConfigFile: string, format: string) { +async function generate( + schemaFile: string, + overridesConfigFile: string, + format: string +) { if (format !== 'typescript' && format !== 'javascript') { throw new Error('Invalid output format'); } @@ -29,7 +33,7 @@ async function generate(schemaFile: string, overridesConfigFile: string, format: let config: OverridesConfig = {}; try { config = await import(overridesConfigFilePath); - } catch (err) {} + } catch {} let schema = await fs.readFile(schemaFilePath, 'utf8'); schema = extendSchema(schema); @@ -49,7 +53,10 @@ async function generate(schemaFile: string, overridesConfigFile: string, format: console.log('Generating query schema'); const querySchema = controller.generateSchema(); const schemaOutputPath = path.join(OUTPUT_DIRECTORY, 'schema.gql'); - await fs.writeFile(path.join(cwd, schemaOutputPath), printSchema(querySchema)); + await fs.writeFile( + path.join(cwd, schemaOutputPath), + printSchema(querySchema) + ); console.log('Schema generated to', schemaOutputPath); } @@ -81,7 +88,11 @@ yargs(hideBin(process.argv)) }, async argv => { try { - await generate(argv['schema-file'], argv['overrides-config-file'], argv['output-format']); + await generate( + argv['schema-file'], + argv['overrides-config-file'], + argv['output-format'] + ); } catch (err) { console.error('Error generating models:', err); process.exit(1); diff --git a/src/checkpoint.ts b/src/checkpoint.ts index fc778a4..a810d3e 100644 --- a/src/checkpoint.ts +++ b/src/checkpoint.ts @@ -1,17 +1,17 @@ import { Knex } from 'knex'; import { Pool as PgPool } from 'pg'; +import { Container } from './container'; import getGraphQL from './graphql'; import { GqlEntityController } from './graphql/controller'; -import { CheckpointsStore } from './stores/checkpoints'; -import { BaseIndexer } from './providers'; -import { createLogger, Logger, LogLevel } from './utils/logger'; -import { extendSchema } from './utils/graphql'; import { createKnex } from './knex'; import { createPgPool } from './pg'; -import { checkpointConfigSchema } from './schemas'; +import { BaseIndexer } from './providers'; import { register } from './register'; +import { checkpointConfigSchema } from './schemas'; +import { CheckpointsStore } from './stores/checkpoints'; import { CheckpointConfig, CheckpointOptions } from './types'; -import { Container } from './container'; +import { extendSchema } from './utils/graphql'; +import { createLogger, Logger, LogLevel } from './utils/logger'; export default class Checkpoint { private readonly entityController: GqlEntityController; @@ -28,7 +28,10 @@ export default class Checkpoint { constructor(schema: string, opts?: CheckpointOptions) { this.schema = extendSchema(schema); - this.entityController = new GqlEntityController(this.schema, opts?.overridesConfig); + this.entityController = new GqlEntityController( + this.schema, + opts?.overridesConfig + ); this.opts = opts; this.log = createLogger({ @@ -57,10 +60,16 @@ export default class Checkpoint { register.setKnex(this.knex); } - public addIndexer(name: string, config: CheckpointConfig, indexer: BaseIndexer) { + public addIndexer( + name: string, + config: CheckpointConfig, + indexer: BaseIndexer + ) { const validationResult = checkpointConfigSchema.safeParse(config); if (validationResult.success === false) { - throw new Error(`Checkpoint config is invalid: ${validationResult.error.message}`); + throw new Error( + `Checkpoint config is invalid: ${validationResult.error.message}` + ); } const container = new Container( @@ -100,7 +109,11 @@ export default class Checkpoint { public get graphql() { const schema = this.getSchema(); - return getGraphQL(schema, this.getBaseContext(), this.entityController.generateSampleQuery()); + return getGraphQL( + schema, + this.getBaseContext(), + this.entityController.generateSampleQuery() + ); } /** @@ -113,7 +126,9 @@ export default class Checkpoint { public async start() { this.log.debug('starting'); - await Promise.all([...this.containers.values()].map(container => container.start())); + await Promise.all( + [...this.containers.values()].map(container => container.start()) + ); } /** diff --git a/src/codegen.ts b/src/codegen.ts index f0fc859..742962f 100644 --- a/src/codegen.ts +++ b/src/codegen.ts @@ -13,8 +13,8 @@ import { } from 'graphql'; import pluralize from 'pluralize'; import { GqlEntityController } from './graphql/controller'; -import { getDerivedFromDirective } from './utils/graphql'; import { OverridesConfig } from './types'; +import { getDerivedFromDirective } from './utils/graphql'; type TypeInfo = { type: string; @@ -74,7 +74,10 @@ export const getTypeInfo = ( const nonNullNestedType = type.ofType instanceof GraphQLNonNull ? type.ofType.ofType : type.ofType; - return { type: `${getTypeInfo(nonNullNestedType, decimalTypes).type}[]`, initialValue: '[]' }; + return { + type: `${getTypeInfo(nonNullNestedType, decimalTypes).type}[]`, + initialValue: '[]' + }; } throw new Error('Unknown type'); @@ -104,7 +107,8 @@ export const getJSType = ( field: GraphQLField, decimalTypes: DecimalTypes = DEFAULT_DECIMAL_TYPES ) => { - const nonNullType = field.type instanceof GraphQLNonNull ? field.type.ofType : field.type; + const nonNullType = + field.type instanceof GraphQLNonNull ? field.type.ofType : field.type; const isNullable = !(field.type instanceof GraphQLNonNull); const isList = nonNullType instanceof GraphQLList; const baseType = getBaseType(nonNullType, decimalTypes); @@ -139,7 +143,9 @@ export const codegen = ( idType.isNullable || idType.isList ) { - throw new Error(`Model ${modelName} must have an id field of type string or number`); + throw new Error( + `Model ${modelName} must have an id field of type string or number` + ); } contents += @@ -148,7 +154,8 @@ export const codegen = ( : ` constructor(id: ${idType.baseType}, indexerName: string) {\n`; contents += ` super(${modelName}.tableName, indexerName);\n\n`; typeFields.forEach(field => { - const fieldType = field.type instanceof GraphQLNonNull ? field.type.ofType : field.type; + const fieldType = + field.type instanceof GraphQLNonNull ? field.type.ofType : field.type; if ( isListType(fieldType) && fieldType.ofType instanceof GraphQLObjectType && @@ -158,7 +165,8 @@ export const codegen = ( } const rawInitialValue = getInitialValue(field.type, decimalTypes); - const initialValue = field.name === 'id' ? 'id' : JSON.stringify(rawInitialValue); + const initialValue = + field.name === 'id' ? 'id' : JSON.stringify(rawInitialValue); contents += ` this.initialSet('${field.name}', ${initialValue});\n`; }); contents += ` }\n\n`; @@ -181,7 +189,8 @@ export const codegen = ( contents += ` }\n\n`; typeFields.forEach(field => { - const fieldType = field.type instanceof GraphQLNonNull ? field.type.ofType : field.type; + const fieldType = + field.type instanceof GraphQLNonNull ? field.type.ofType : field.type; if ( isListType(fieldType) && fieldType.ofType instanceof GraphQLObjectType && @@ -198,7 +207,9 @@ export const codegen = ( ? ` get ${field.name}() {\n` : ` get ${field.name}(): ${typeAnnotation} {\n`; contents += ` return ${ - isList ? `JSON.parse(this.get('${field.name}'))` : `this.get('${field.name}')` + isList + ? `JSON.parse(this.get('${field.name}'))` + : `this.get('${field.name}')` };\n`; contents += ` }\n\n`; diff --git a/src/container.ts b/src/container.ts index ce8856b..a663c30 100644 --- a/src/container.ts +++ b/src/container.ts @@ -1,13 +1,27 @@ -import { BaseIndexer, BlockNotFoundError, Instance, ReorgDetectedError } from './providers'; -import { CheckpointConfig, CheckpointOptions, ContractSourceConfig, TemplateSource } from './types'; -import { CheckpointRecord, CheckpointsStore, MetadataId } from './stores/checkpoints'; -import { Logger } from './utils/logger'; -import { getConfigChecksum, getContractsFromConfig } from './utils/checkpoint'; -import { GqlEntityController } from './graphql/controller'; import { Knex } from 'knex'; -import { sleep } from './utils/helpers'; +import { GqlEntityController } from './graphql/controller'; +import { + BaseIndexer, + BlockNotFoundError, + Instance, + ReorgDetectedError +} from './providers'; import { register } from './register'; +import { + CheckpointRecord, + CheckpointsStore, + MetadataId +} from './stores/checkpoints'; +import { + CheckpointConfig, + CheckpointOptions, + ContractSourceConfig, + TemplateSource +} from './types'; +import { getConfigChecksum, getContractsFromConfig } from './utils/checkpoint'; import { getTableName } from './utils/database'; +import { sleep } from './utils/helpers'; +import { Logger } from './utils/logger'; const SCHEMA_VERSION = 1; @@ -71,7 +85,9 @@ export class Container implements Instance { } public get sourceContracts() { - return this.indexer.getProvider().formatAddresses(getContractsFromConfig(this.config)); + return this.indexer + .getProvider() + .formatAddresses(getContractsFromConfig(this.config)); } public getCurrentSources(blockNumber: number) { @@ -80,7 +96,9 @@ export class Container implements Instance { return this.config.sources.filter(source => source.start <= blockNumber); } - private async getNextCheckpointBlock(blockNum: number): Promise { + private async getNextCheckpointBlock( + blockNum: number + ): Promise { if (this.cpBlocksCache && this.cpBlocksCache.length !== 0) { return this.cpBlocksCache.shift() || null; } @@ -99,7 +117,10 @@ export class Container implements Instance { } private async getBlockHash(blockNumber: number): Promise { - if (this.blockHashCache && this.blockHashCache.blockNumber === blockNumber) { + if ( + this.blockHashCache && + this.blockHashCache.blockNumber === blockNumber + ) { return this.blockHashCache.hash; } @@ -133,10 +154,19 @@ export class Container implements Instance { ); if (existingTemplate) return; - this.activeTemplates.push({ template: name, contractAddress: contract, startBlock: start }); + this.activeTemplates.push({ + template: name, + contractAddress: contract, + startBlock: start + }); if (persist) { - await this.store.insertTemplateSource(this.indexerName, contract, start, name); + await this.store.insertTemplateSource( + this.indexerName, + contract, + start, + name + ); } this.addSource({ @@ -160,7 +190,11 @@ export class Container implements Instance { } public async setLastIndexedBlock(block: number) { - await this.store.setMetadata(this.indexerName, MetadataId.LastIndexedBlock, block); + await this.store.setMetadata( + this.indexerName, + MetadataId.LastIndexedBlock, + block + ); } public async insertCheckpoints(checkpoints: CheckpointRecord[]) { @@ -177,7 +211,9 @@ export class Container implements Instance { public async start() { await this.validateStore(); - const templateSources = await this.store.getTemplateSources(this.indexerName); + const templateSources = await this.store.getTemplateSources( + this.indexerName + ); await Promise.all( templateSources.map(source => this.executeTemplate( @@ -193,22 +229,32 @@ export class Container implements Instance { const blockNum = await this.getStartBlockNum(); this.preloadEndBlock = - (await this.indexer.getProvider().getLatestBlockNumber()) - BLOCK_PRELOAD_OFFSET; + (await this.indexer.getProvider().getLatestBlockNumber()) - + BLOCK_PRELOAD_OFFSET; return this.process(blockNum); } private async preload(blockNum: number) { - if (this.preloadedBlocks.length > 0) return this.preloadedBlocks.shift() as number; + if (this.preloadedBlocks.length > 0) + return this.preloadedBlocks.shift() as number; let currentBlock = blockNum; while (currentBlock <= this.preloadEndBlock) { - const endBlock = Math.min(currentBlock + this.preloadStep, this.preloadEndBlock); + const endBlock = Math.min( + currentBlock + this.preloadStep, + this.preloadEndBlock + ); let checkpoints: CheckpointRecord[]; try { - this.log.info({ start: currentBlock, end: endBlock }, 'preloading blocks'); - checkpoints = await this.indexer.getProvider().getCheckpointsRange(currentBlock, endBlock); + this.log.info( + { start: currentBlock, end: endBlock }, + 'preloading blocks' + ); + checkpoints = await this.indexer + .getProvider() + .getCheckpointsRange(currentBlock, endBlock); } catch (e) { this.log.error( { blockNumber: currentBlock, err: e }, @@ -219,12 +265,19 @@ export class Container implements Instance { } const increase = - checkpoints.length > BLOCK_PRELOAD_TARGET ? -BLOCK_PRELOAD_STEP : +BLOCK_PRELOAD_STEP; - this.preloadStep = Math.max(BLOCK_RELOAD_MIN_RANGE, this.preloadStep + increase); + checkpoints.length > BLOCK_PRELOAD_TARGET + ? -BLOCK_PRELOAD_STEP + : +BLOCK_PRELOAD_STEP; + this.preloadStep = Math.max( + BLOCK_RELOAD_MIN_RANGE, + this.preloadStep + increase + ); if (checkpoints.length > 0) { this.preloadedBlocks = [ - ...new Set(checkpoints.map(cp => cp.blockNumber).sort((a, b) => a - b)) + ...new Set( + checkpoints.map(cp => cp.blockNumber).sort((a, b) => a - b) + ) ]; return this.preloadedBlocks.shift() as number; } @@ -256,7 +309,9 @@ export class Container implements Instance { if (!checkpointBlock && !preloadedBlock) { if (blockNumber % CHECK_LATEST_BLOCK_INTERVAL === 0) { try { - const latestBlock = await this.indexer.getProvider().getLatestBlockNumber(); + const latestBlock = await this.indexer + .getProvider() + .getLatestBlockNumber(); this.log.info( { latestBlock, behind: latestBlock - blockNumber }, @@ -341,8 +396,13 @@ export class Container implements Instance { let lastGoodBlock: null | number = null; while (lastGoodBlock === null) { try { - const storedBlockHash = await this.store.getBlockHash(this.indexerName, current); - const currentBlockHash = await this.indexer.getProvider().getBlockHash(current); + const storedBlockHash = await this.store.getBlockHash( + this.indexerName, + current + ); + const currentBlockHash = await this.indexer + .getProvider() + .getBlockHash(current); if (storedBlockHash === null || storedBlockHash === currentBlockHash) { lastGoodBlock = current; @@ -350,13 +410,18 @@ export class Container implements Instance { current -= 1; } } catch (e) { - this.log.error({ blockNumber: current, err: e }, 'error occurred during block hash check'); + this.log.error( + { blockNumber: current, err: e }, + 'error occurred during block hash check' + ); await sleep(this.config.fetch_interval || DEFAULT_FETCH_INTERVAL); } } const entities = await this.entityController.schemaObjects; - const tables = entities.map(entity => getTableName(entity.name.toLowerCase())); + const tables = entities.map(entity => + getTableName(entity.name.toLowerCase()) + ); await this.knex.transaction(async trx => { for (const tableName of tables) { @@ -388,13 +453,25 @@ export class Container implements Instance { } public async reset() { - await this.store.setMetadata(this.indexerName, MetadataId.LastIndexedBlock, 0); - await this.store.setMetadata(this.indexerName, MetadataId.SchemaVersion, SCHEMA_VERSION); + await this.store.setMetadata( + this.indexerName, + MetadataId.LastIndexedBlock, + 0 + ); + await this.store.setMetadata( + this.indexerName, + MetadataId.SchemaVersion, + SCHEMA_VERSION + ); await this.store.removeBlocks(this.indexerName); } public async resetMetadata() { - await this.store.setMetadata(this.indexerName, MetadataId.SchemaVersion, SCHEMA_VERSION); + await this.store.setMetadata( + this.indexerName, + MetadataId.SchemaVersion, + SCHEMA_VERSION + ); } /** @@ -430,13 +507,18 @@ export class Container implements Instance { return this.config.start; } - return Math.min(...(this.config.sources?.map(source => source.start) || [])); + return Math.min( + ...(this.config.sources?.map(source => source.start) || []) + ); } public async getStartBlockNum() { const start = this.getConfigStartBlock(); const lastBlock = - (await this.store.getMetadataNumber(this.indexerName, MetadataId.LastIndexedBlock)) ?? 0; + (await this.store.getMetadataNumber( + this.indexerName, + MetadataId.LastIndexedBlock + )) ?? 0; const nextBlock = lastBlock + 1; @@ -477,7 +559,9 @@ export class Container implements Instance { } public async validateStore() { - const networkIdentifier = await this.indexer.getProvider().getNetworkIdentifier(); + const networkIdentifier = await this.indexer + .getProvider() + .getNetworkIdentifier(); const configChecksum = getConfigChecksum(this.config); const storedNetworkIdentifier = await this.store.getMetadata( @@ -501,11 +585,15 @@ export class Container implements Instance { storedNetworkIdentifier && storedNetworkIdentifier !== networkIdentifier; const hasStartBlockChanged = storedStartBlock && storedStartBlock !== this.getConfigStartBlock(); - const hasConfigChanged = storedConfigChecksum && storedConfigChecksum !== configChecksum; + const hasConfigChanged = + storedConfigChecksum && storedConfigChecksum !== configChecksum; const hasSchemaChanged = storedSchemaVersion !== SCHEMA_VERSION; if ( - (hasNetworkChanged || hasStartBlockChanged || hasConfigChanged || hasSchemaChanged) && + (hasNetworkChanged || + hasStartBlockChanged || + hasConfigChanged || + hasSchemaChanged) && this.opts?.resetOnConfigChange ) { await this.resetMetadata(); @@ -521,7 +609,11 @@ export class Container implements Instance { MetadataId.StartBlock, this.getConfigStartBlock() ); - await this.store.setMetadata(this.indexerName, MetadataId.ConfigChecksum, configChecksum); + await this.store.setMetadata( + this.indexerName, + MetadataId.ConfigChecksum, + configChecksum + ); } else if (hasNetworkChanged) { this.log.error( `network identifier changed from ${storedNetworkIdentifier} to ${networkIdentifier}. @@ -572,7 +664,11 @@ export class Container implements Instance { } if (!storedConfigChecksum) { - await this.store.setMetadata(this.indexerName, MetadataId.ConfigChecksum, configChecksum); + await this.store.setMetadata( + this.indexerName, + MetadataId.ConfigChecksum, + configChecksum + ); } } } diff --git a/src/graphql/controller.ts b/src/graphql/controller.ts index ef9ab0b..565d8fa 100644 --- a/src/graphql/controller.ts +++ b/src/graphql/controller.ts @@ -1,3 +1,4 @@ +import { addResolversToSchema } from '@graphql-tools/schema'; import { buildSchema, GraphQLEnumType, @@ -23,18 +24,17 @@ import { } from 'graphql'; import { Knex } from 'knex'; import pluralize from 'pluralize'; +import { CheckpointsGraphQLObject, MetadataGraphQLObject } from '.'; import { KnexType } from '../knex'; +import { OverridesConfig } from '../types'; +import { getNestedResolver, queryMulti, querySingle } from './resolvers'; import { generateQueryForEntity, - multiEntityQueryName, - singleEntityQueryName, + getDerivedFromDirective, getNonNullType, - getDerivedFromDirective + multiEntityQueryName, + singleEntityQueryName } from '../utils/graphql'; -import { OverridesConfig } from '../types'; -import { querySingle, queryMulti, getNestedResolver } from './resolvers'; -import { CheckpointsGraphQLObject, MetadataGraphQLObject } from '.'; -import { addResolversToSchema } from '@graphql-tools/schema'; /** * Type for single and multiple query resolvers @@ -136,14 +136,13 @@ export class GqlEntityController { const queryFields: GraphQLFieldConfigMap = {}; schemaObjects.forEach(type => { - queryFields[singleEntityQueryName(type)] = this.getSingleEntityQueryConfig( - type, - resolvers.singleEntityResolver - ); - queryFields[multiEntityQueryName(type)] = this.getMultipleEntityQueryConfig( - type, - resolvers.multipleEntityResolver - ); + queryFields[singleEntityQueryName(type)] = + this.getSingleEntityQueryConfig(type, resolvers.singleEntityResolver); + queryFields[multiEntityQueryName(type)] = + this.getMultipleEntityQueryConfig( + type, + resolvers.multipleEntityResolver + ); }); return queryFields; @@ -160,23 +159,29 @@ export class GqlEntityController { */ public generateEntityResolvers(fields: GraphQLFieldConfigMap) { return this.schemaObjects.reduce((entities, obj) => { - entities[obj.name] = this.getTypeFields(obj).reduce((resolvers, field) => { - const nonNullType = getNonNullType(field.type); + entities[obj.name] = this.getTypeFields(obj).reduce( + (resolvers, field) => { + const nonNullType = getNonNullType(field.type); - if (isListType(nonNullType)) { - const itemType = getNonNullType(nonNullType.ofType); + if (isListType(nonNullType)) { + const itemType = getNonNullType(nonNullType.ofType); - if (itemType instanceof GraphQLObjectType) { - resolvers[field.name] = getNestedResolver(multiEntityQueryName(itemType)); + if (itemType instanceof GraphQLObjectType) { + resolvers[field.name] = getNestedResolver( + multiEntityQueryName(itemType) + ); + } } - } - if (nonNullType instanceof GraphQLObjectType) { - resolvers[field.name] = fields[singleEntityQueryName(nonNullType)].resolve; - } + if (nonNullType instanceof GraphQLObjectType) { + resolvers[field.name] = + fields[singleEntityQueryName(nonNullType)].resolve; + } - return resolvers; - }, {}); + return resolvers; + }, + {} + ); return entities; }, {}); @@ -208,7 +213,9 @@ export class GqlEntityController { * ``` * */ - public async createEntityStores(knex: Knex): Promise<{ builder: Knex.SchemaBuilder }> { + public async createEntityStores( + knex: Knex + ): Promise<{ builder: Knex.SchemaBuilder }> { let builder = knex.schema; if (knex.client.config.client === 'pg') { @@ -222,35 +229,40 @@ export class GqlEntityController { this.schemaObjects.map(type => { const tableName = pluralize(type.name.toLowerCase()); - builder = builder.dropTableIfExists(tableName).createTable(tableName, t => { - t.uuid('uid').primary().defaultTo(knex.fn.uuid()); - t.specificType('block_range', 'int8range').notNullable(); - - this.getTypeFields(type).forEach(field => { - const fieldType = field.type instanceof GraphQLNonNull ? field.type.ofType : field.type; - if ( - isListType(fieldType) && - fieldType.ofType instanceof GraphQLObjectType && - getDerivedFromDirective(field) - ) { - return; - } - const sqlType = this.getSqlType(field.type); + builder = builder + .dropTableIfExists(tableName) + .createTable(tableName, t => { + t.uuid('uid').primary().defaultTo(knex.fn.uuid()); + t.specificType('block_range', 'int8range').notNullable(); + + this.getTypeFields(type).forEach(field => { + const fieldType = + field.type instanceof GraphQLNonNull + ? field.type.ofType + : field.type; + if ( + isListType(fieldType) && + fieldType.ofType instanceof GraphQLObjectType && + getDerivedFromDirective(field) + ) { + return; + } + const sqlType = this.getSqlType(field.type); - let column = - 'options' in sqlType - ? t[sqlType.name](field.name, ...sqlType.options) - : t[sqlType.name](field.name); + let column = + 'options' in sqlType + ? t[sqlType.name](field.name, ...sqlType.options) + : t[sqlType.name](field.name); - if (field.type instanceof GraphQLNonNull) { - column = column.notNullable(); - } + if (field.type instanceof GraphQLNonNull) { + column = column.notNullable(); + } - if (!['text', 'json'].includes(sqlType.name)) { - column.index(); - } + if (!['text', 'json'].includes(sqlType.name)) { + column.index(); + } + }); }); - }); if (knex.client.config.client === 'pg') { builder = builder.raw( @@ -301,11 +313,15 @@ export class GqlEntityController { return this._schemaObjects; } - this._schemaObjects = Object.values(this.schema.getTypeMap()).filter(type => { - return ( - type instanceof GraphQLObjectType && type.name != 'Query' && !type.name.startsWith('__') - ); - }) as GraphQLObjectType[]; + this._schemaObjects = Object.values(this.schema.getTypeMap()).filter( + type => { + return ( + type instanceof GraphQLObjectType && + type.name != 'Query' && + !type.name.startsWith('__') + ); + } + ) as GraphQLObjectType[]; return this._schemaObjects; } @@ -345,7 +361,9 @@ export class GqlEntityController { nestedType: GraphQLObjectType, prefix?: string ): WhereResult => { - const name = prefix ? `${prefix}_${nestedType.name}_filter` : `${nestedType.name}_filter`; + const name = prefix + ? `${prefix}_${nestedType.name}_filter` + : `${nestedType.name}_filter`; const orderByValues = {}; const whereInputConfig: GraphQLInputObjectTypeConfig = { @@ -387,13 +405,19 @@ export class GqlEntityController { } whereInputConfig.fields[`${field.name}`] = { type: nonNullFieldType }; - whereInputConfig.fields[`${field.name}_not`] = { type: nonNullFieldType }; + whereInputConfig.fields[`${field.name}_not`] = { + type: nonNullFieldType + }; if (itemType === GraphQLString) { // those are the only supported operators for string arrays because PostgreSQL intersection // for jsonb is only supported for string arrays - whereInputConfig.fields[`${field.name}_contains`] = { type: nonNullFieldType }; - whereInputConfig.fields[`${field.name}_not_contains`] = { type: nonNullFieldType }; + whereInputConfig.fields[`${field.name}_contains`] = { + type: nonNullFieldType + }; + whereInputConfig.fields[`${field.name}_not_contains`] = { + type: nonNullFieldType + }; } } @@ -410,28 +434,47 @@ export class GqlEntityController { } if ( - (nonNullFieldType instanceof GraphQLScalarType && nonNullFieldType.name === 'BigInt') || + (nonNullFieldType instanceof GraphQLScalarType && + nonNullFieldType.name === 'BigInt') || this.decimalTypes[nonNullFieldType.name] ) { - whereInputConfig.fields[`${field.name}_gt`] = { type: nonNullFieldType }; - whereInputConfig.fields[`${field.name}_gte`] = { type: nonNullFieldType }; - whereInputConfig.fields[`${field.name}_lt`] = { type: nonNullFieldType }; - whereInputConfig.fields[`${field.name}_lte`] = { type: nonNullFieldType }; + whereInputConfig.fields[`${field.name}_gt`] = { + type: nonNullFieldType + }; + whereInputConfig.fields[`${field.name}_gte`] = { + type: nonNullFieldType + }; + whereInputConfig.fields[`${field.name}_lt`] = { + type: nonNullFieldType + }; + whereInputConfig.fields[`${field.name}_lte`] = { + type: nonNullFieldType + }; } if ( nonNullFieldType === GraphQLString || (nonNullFieldType as GraphQLScalarType).name === 'Text' ) { - whereInputConfig.fields[`${field.name}_contains`] = { type: GraphQLString }; - whereInputConfig.fields[`${field.name}_not_contains`] = { type: GraphQLString }; - whereInputConfig.fields[`${field.name}_contains_nocase`] = { type: GraphQLString }; - whereInputConfig.fields[`${field.name}_not_contains_nocase`] = { type: GraphQLString }; + whereInputConfig.fields[`${field.name}_contains`] = { + type: GraphQLString + }; + whereInputConfig.fields[`${field.name}_not_contains`] = { + type: GraphQLString + }; + whereInputConfig.fields[`${field.name}_contains_nocase`] = { + type: GraphQLString + }; + whereInputConfig.fields[`${field.name}_not_contains_nocase`] = { + type: GraphQLString + }; } if ((nonNullFieldType as GraphQLScalarType).name !== 'Text') { whereInputConfig.fields[`${field.name}`] = { type: nonNullFieldType }; - whereInputConfig.fields[`${field.name}_not`] = { type: nonNullFieldType }; + whereInputConfig.fields[`${field.name}_not`] = { + type: nonNullFieldType + }; whereInputConfig.fields[`${field.name}_in`] = { type: new GraphQLList(nonNullFieldType) }; diff --git a/src/graphql/index.ts b/src/graphql/index.ts index a2efc2c..ba299f7 100644 --- a/src/graphql/index.ts +++ b/src/graphql/index.ts @@ -1,3 +1,4 @@ +import DataLoader from 'dataloader'; import { graphqlHTTP } from 'express-graphql'; import { GraphQLID, @@ -7,9 +8,13 @@ import { GraphQLSchema, GraphQLString } from 'graphql'; -import DataLoader from 'dataloader'; import { ResolverContextInput } from './resolvers'; -import { getTableName, applyQueryFilter, QueryFilter, applyDefaultOrder } from '../utils/database'; +import { + applyDefaultOrder, + applyQueryFilter, + getTableName, + QueryFilter +} from '../utils/database'; /** * Creates getLoader function that will return existing, or create a new dataloader @@ -35,7 +40,10 @@ export const createGetLoader = (context: ResolverContextInput) => { query = applyQueryFilter(query, tableName, filter); query = applyDefaultOrder(query, tableName); - context.log.debug({ sql: query.toQuery(), ids }, 'executing batched query'); + context.log.debug( + { sql: query.toQuery(), ids }, + 'executing batched query' + ); const results = await query; @@ -85,7 +93,10 @@ export const MetadataGraphQLObject = new GraphQLObjectType({ name: '_Metadata', description: 'Core metadata values used internally by Checkpoint', fields: { - id: { type: new GraphQLNonNull(GraphQLID), description: 'example: last_indexed_block' }, + id: { + type: new GraphQLNonNull(GraphQLID), + description: 'example: last_indexed_block' + }, indexer: { type: new GraphQLNonNull(GraphQLString) }, value: { type: GraphQLString } } diff --git a/src/graphql/resolvers.ts b/src/graphql/resolvers.ts index 5bd68fc..be6a56b 100644 --- a/src/graphql/resolvers.ts +++ b/src/graphql/resolvers.ts @@ -1,3 +1,4 @@ +import DataLoader from 'dataloader'; import { GraphQLField, GraphQLList, @@ -15,10 +16,14 @@ import { } from 'graphql-parse-resolve-info'; import { Knex } from 'knex'; import { Pool as PgPool } from 'pg'; -import { getNonNullType, getDerivedFromDirective } from '../utils/graphql'; -import { getTableName, applyQueryFilter, QueryFilter, applyDefaultOrder } from '../utils/database'; +import { + applyDefaultOrder, + applyQueryFilter, + getTableName, + QueryFilter +} from '../utils/database'; +import { getDerivedFromDirective, getNonNullType } from '../utils/graphql'; import { Logger } from '../utils/logger'; -import type DataLoader from 'dataloader'; type BaseArgs = { block?: number; @@ -82,7 +87,11 @@ export async function queryMulti( indexer: args.indexer }); - const handleWhere = (query: Knex.QueryBuilder, prefix: string, where: Record) => { + const handleWhere = ( + query: Knex.QueryBuilder, + prefix: string, + where: Record + ) => { const isFieldList = (fieldName: string) => { const fieldType = getNonNullType(returnType.getFields()[fieldName].type); return isListType(fieldType); @@ -97,10 +106,13 @@ export async function queryMulti( const isList = isFieldList(fieldName); if (isList) { - query = query.whereRaw(`NOT :field: @> :value::jsonb OR NOT :field: <@ :value::jsonb`, { - field: `${prefix}.${fieldName}`, - value: JSON.stringify(w[1]) - }); + query = query.whereRaw( + `NOT :field: @> :value::jsonb OR NOT :field: <@ :value::jsonb`, + { + field: `${prefix}.${fieldName}`, + value: JSON.stringify(w[1]) + } + ); } else { query = query.where(`${prefix}.${fieldName}`, '!=', w[1]); } @@ -126,7 +138,10 @@ export async function queryMulti( query = query.not.whereLike(`${prefix}.${fieldName}`, `%${w[1]}%`); } } else if (w[0].endsWith('_not_contains_nocase')) { - query = query.not.whereILike(`${prefix}.${w[0].slice(0, -20)}`, `%${w[1]}%`); + query = query.not.whereILike( + `${prefix}.${w[0].slice(0, -20)}`, + `%${w[1]}%` + ); } else if (w[0].endsWith('_contains')) { const fieldName = w[0].slice(0, -9); const isList = isFieldList(fieldName); @@ -141,7 +156,10 @@ export async function queryMulti( query = query.whereLike(`${prefix}.${fieldName}`, `%${w[1]}%`); } } else if (w[0].endsWith('_contains_nocase')) { - query = query.whereILike(`${prefix}.${w[0].slice(0, -16)}`, `%${w[1]}%`); + query = query.whereILike( + `${prefix}.${w[0].slice(0, -16)}`, + `%${w[1]}%` + ); } else if (w[0].endsWith('_not_in')) { query = query.not.whereIn(`${prefix}.${w[0].slice(0, -7)}`, w[1]); } else if (w[0].endsWith('_in')) { @@ -151,7 +169,9 @@ export async function queryMulti( const nestedReturnType = getNonNullType( returnType.getFields()[fieldName].type as GraphQLObjectType ); - const nestedTableName = getTableName(nestedReturnType.name.toLowerCase()); + const nestedTableName = getTableName( + nestedReturnType.name.toLowerCase() + ); const fields = Object.values(nestedReturnType.getFields()) .filter(field => { @@ -168,14 +188,25 @@ export async function queryMulti( nestedEntitiesMappings[fieldName] = { [`${fieldName}.id`]: `${nestedTableName}.id`, ...Object.fromEntries( - fields.map(field => [`${fieldName}.${field}`, `${nestedTableName}.${field}`]) + fields.map(field => [ + `${fieldName}.${field}`, + `${nestedTableName}.${field}` + ]) ) }; query = query .columns(nestedEntitiesMappings[fieldName]) - .innerJoin(nestedTableName, `${tableName}.${fieldName}`, '=', `${nestedTableName}.id`) - .whereRaw('?? = ??', [`${tableName}._indexer`, `${nestedTableName}._indexer`]); + .innerJoin( + nestedTableName, + `${tableName}.${fieldName}`, + '=', + `${nestedTableName}.id` + ) + .whereRaw('?? = ??', [ + `${tableName}._indexer`, + `${nestedTableName}._indexer` + ]); query = applyQueryFilter(query, nestedTableName, { block: args.block, @@ -188,10 +219,13 @@ export async function queryMulti( const isList = isFieldList(fieldName); if (isList) { - query = query.whereRaw(`:field: @> :value::jsonb AND :field: <@ :value::jsonb`, { - field: `${prefix}.${fieldName}`, - value: JSON.stringify(w[1]) - }); + query = query.whereRaw( + `:field: @> :value::jsonb AND :field: <@ :value::jsonb`, + { + field: `${prefix}.${fieldName}`, + value: JSON.stringify(w[1]) + } + ); } else { query = query.where(`${prefix}.${fieldName}`, w[1]); } @@ -271,16 +305,24 @@ export async function querySingle( const parsed = parseResolveInfo(info); if (parsed && parentResolvedValue) { - // @ts-ignore - const simplified = simplifyParsedResolveInfoFragmentWithType(parsed, returnType); + const simplified = simplifyParsedResolveInfoFragmentWithType( + // @ts-ignore + parsed, + returnType + ); - if (Object.keys(simplified.fields).length === 1 && simplified.fields['id']) { + if ( + Object.keys(simplified.fields).length === 1 && + simplified.fields['id'] + ) { return { id: parentResolvedValue, _args: queryFilter }; } } const id = parentResolvedValue || args.id; - const items = await context.getLoader(returnType.name.toLowerCase(), 'id', queryFilter).load(id); + const items = await context + .getLoader(returnType.name.toLowerCase(), 'id', queryFilter) + .load(id); if (items.length === 0) { throw new Error(`Row not found: ${id}`); } @@ -309,34 +351,48 @@ export const getNestedResolver = const returnType = getNonNullType(info.returnType) as | GraphQLList | GraphQLList>; - const jsonFields = getJsonFields(getNonNullType(returnType.ofType) as GraphQLObjectType); + const jsonFields = getJsonFields( + getNonNullType(returnType.ofType) as GraphQLObjectType + ); const parentType = getNonNullType(info.parentType) as GraphQLObjectType; const field = parentType.getFields()[info.fieldName]; const fieldType = - info.returnType instanceof GraphQLNonNull ? info.returnType.ofType : info.returnType; + info.returnType instanceof GraphQLNonNull + ? info.returnType.ofType + : info.returnType; if (!isListType(fieldType)) return []; const derivedFromDirective = getDerivedFromDirective(field); let result: Record[] = []; if (!derivedFromDirective) { - const loaderResult = await getLoader(columnName, 'id', queryFilter).loadMany( - parent[info.fieldName] - ); + const loaderResult = await getLoader( + columnName, + 'id', + queryFilter + ).loadMany(parent[info.fieldName]); // NOTE: loader returns array of arrays when used with loadMany, because in some cases, // for example when fetching derived entities we expect multiple results for a single id // this is why we need to flatten it. In the future it would be nice to have clearer API result = loaderResult.flat(); } else { - const fieldArgument = derivedFromDirective.arguments?.find(arg => arg.name.value === 'field'); + const fieldArgument = derivedFromDirective.arguments?.find( + arg => arg.name.value === 'field' + ); if (!fieldArgument || fieldArgument.value.kind !== 'StringValue') { - throw new Error(`field ${field.name} is missing field in derivedFrom directive`); + throw new Error( + `field ${field.name} is missing field in derivedFrom directive` + ); } - result = await getLoader(columnName, fieldArgument.value.value, queryFilter).load(parent.id); + result = await getLoader( + columnName, + fieldArgument.value.value, + queryFilter + ).load(parent.id); } return result.map(item => ({ @@ -353,7 +409,10 @@ function getJsonFields(type: GraphQLObjectType) { }); } -function formatItem(item: Record, jsonFields: GraphQLField[]) { +function formatItem( + item: Record, + jsonFields: GraphQLField[] +) { const formatted = { ...item }; jsonFields.forEach(field => { diff --git a/src/knex.ts b/src/knex.ts index 8d0a34a..93c9aa7 100644 --- a/src/knex.ts +++ b/src/knex.ts @@ -1,6 +1,6 @@ import fs from 'fs'; -import knex, { Knex } from 'knex'; import { ConnectionString } from 'connection-string'; +import knex, { Knex } from 'knex'; export type KnexType = | { @@ -26,16 +26,26 @@ const PROTOCOLS = { export function getConnectionData(connectionString: string) { const connectionConfig = new ConnectionString(connectionString); - if (!connectionConfig.protocol || !connectionConfig.hosts || !connectionConfig.path) { + if ( + !connectionConfig.protocol || + !connectionConfig.hosts || + !connectionConfig.path + ) { throw new Error('invalid connection string provided'); } const client = PROTOCOLS[connectionConfig.protocol]; if (!client) { - throw new Error(`Supplied protocol ${connectionConfig.protocol} is not supported`); + throw new Error( + `Supplied protocol ${connectionConfig.protocol} is not supported` + ); } - const sslConfig: { rejectUnauthorized?: boolean; sslmode?: string; ca?: string } = {}; + const sslConfig: { + rejectUnauthorized?: boolean; + sslmode?: string; + ca?: string; + } = {}; if ( connectionConfig.params?.sslaccept === 'strict' || connectionConfig.params?.ssl === 'rejectUnauthorized' @@ -70,7 +80,8 @@ export function createKnexConfig(connectionString: string): Knex.Config { } export function createKnex(config: string | Knex.Config) { - const parsedConfig = typeof config === 'string' ? createKnexConfig(config) : config; + const parsedConfig = + typeof config === 'string' ? createKnexConfig(config) : config; return knex(parsedConfig); } diff --git a/src/orm/model.ts b/src/orm/model.ts index f48f6b0..e8932b2 100644 --- a/src/orm/model.ts +++ b/src/orm/model.ts @@ -17,7 +17,9 @@ export default class Model { const currentBlock = register.getCurrentBlock(this.indexerName); const diff = Object.fromEntries( - [...this.values.entries()].filter(([key]) => this.valuesImplicitlySet.has(key)) + [...this.values.entries()].filter(([key]) => + this.valuesImplicitlySet.has(key) + ) ); return knex.transaction(async trx => { @@ -27,7 +29,9 @@ export default class Model { .andWhere('_indexer', this.indexerName) .andWhereRaw('upper_inf(block_range)') .update({ - block_range: knex.raw('int8range(lower(block_range), ?)', [currentBlock]) + block_range: knex.raw('int8range(lower(block_range), ?)', [ + currentBlock + ]) }); const newEntity = { @@ -55,7 +59,9 @@ export default class Model { .insert({ ...entity, _indexer: this.indexerName, - block_range: register.getKnex().raw('int8range(?, NULL)', [currentBlock]) + block_range: register + .getKnex() + .raw('int8range(?, NULL)', [currentBlock]) }); } @@ -69,7 +75,9 @@ export default class Model { .andWhere('_indexer', this.indexerName) .andWhereRaw('upper_inf(block_range)') .update({ - block_range: register.getKnex().raw('int8range(lower(block_range), ?)', [currentBlock]) + block_range: register + .getKnex() + .raw('int8range(lower(block_range), ?)', [currentBlock]) }); } diff --git a/src/providers/base.ts b/src/providers/base.ts index c44bfd0..0f47128 100644 --- a/src/providers/base.ts +++ b/src/providers/base.ts @@ -1,6 +1,10 @@ import { CheckpointRecord } from '../stores/checkpoints'; +import { + CheckpointConfig, + CheckpointOptions, + ContractSourceConfig +} from '../types'; import { Logger } from '../utils/logger'; -import { CheckpointConfig, CheckpointOptions, ContractSourceConfig } from '../types'; export type Instance = { config: CheckpointConfig; @@ -75,7 +79,9 @@ export class BaseProvider { // eslint-disable-next-line @typescript-eslint/no-unused-vars processBlock(blockNum: number, parentHash: string | null): Promise { - throw new Error(`processBlock method was not defined when fetching block ${blockNum}`); + throw new Error( + `processBlock method was not defined when fetching block ${blockNum}` + ); } processPool(blockNumber: number): Promise { @@ -84,7 +90,10 @@ export class BaseProvider { ); } - async getCheckpointsRange(fromBlock: number, toBlock: number): Promise { + async getCheckpointsRange( + fromBlock: number, + toBlock: number + ): Promise { throw new Error( `getCheckpointsRange method was not defined when fetching events from ${fromBlock} to ${toBlock}` ); @@ -94,8 +103,17 @@ export class BaseProvider { export class BaseIndexer { protected provider?: BaseProvider; - // eslint-disable-next-line @typescript-eslint/no-unused-vars - init({ instance, log, abis }: { instance: Instance; log: Logger; abis?: Record }) { + init({ + /* eslint-disable @typescript-eslint/no-unused-vars */ + instance, + log, + abis + /* eslint-enable @typescript-eslint/no-unused-vars */ + }: { + instance: Instance; + log: Logger; + abis?: Record; + }) { throw new Error('init method was not defined'); } diff --git a/src/providers/evm/helpers.test.ts b/src/providers/evm/helpers.test.ts index 723c9f1..15174ad 100644 --- a/src/providers/evm/helpers.test.ts +++ b/src/providers/evm/helpers.test.ts @@ -14,7 +14,9 @@ describe('getRangeHint', () => { }); it('should return null on unknown errors', () => { - const unknownError = new CustomJsonRpcError('Unknown error', -99999, { some: 'data' }); + const unknownError = new CustomJsonRpcError('Unknown error', -99999, { + some: 'data' + }); expect( getRangeHint(unknownError, { @@ -26,10 +28,14 @@ describe('getRangeHint', () => { describe('Infura error (code: -32005)', () => { it('should return range from error data', () => { - const infuraError = new CustomJsonRpcError('Block range too large', -32005, { - from: '0x3e8', - to: '0x4cf' - }); + const infuraError = new CustomJsonRpcError( + 'Block range too large', + -32005, + { + from: '0x3e8', + to: '0x4cf' + } + ); const result = getRangeHint(infuraError, { from: 1000, @@ -43,7 +49,11 @@ describe('getRangeHint', () => { }); it('should not return range if data is invalid', () => { - const infuraError = new CustomJsonRpcError('Block range too large', -32005, {}); + const infuraError = new CustomJsonRpcError( + 'Block range too large', + -32005, + {} + ); const result = getRangeHint(infuraError, { from: 1000, @@ -56,7 +66,11 @@ describe('getRangeHint', () => { describe('Ankr error (code: -32062)', () => { it('should return half the current range', () => { - const ankrError = new CustomJsonRpcError('Block range is too large', -32062, {}); + const ankrError = new CustomJsonRpcError( + 'Block range is too large', + -32062, + {} + ); const result = getRangeHint(ankrError, { from: 1000, @@ -70,7 +84,11 @@ describe('getRangeHint', () => { }); it('should round up', () => { - const ankrError = new CustomJsonRpcError('Block range is too large', -32062, {}); + const ankrError = new CustomJsonRpcError( + 'Block range is too large', + -32062, + {} + ); const result = getRangeHint(ankrError, { from: 1000, diff --git a/src/providers/evm/helpers.ts b/src/providers/evm/helpers.ts index b3552df..1206ffc 100644 --- a/src/providers/evm/helpers.ts +++ b/src/providers/evm/helpers.ts @@ -30,7 +30,8 @@ export function getRangeHint(err: unknown, currentRange: Range): Range | null { // We have no range in the error data, so we return the current range, but half as long return { from: currentRange.from, - to: currentRange.from + Math.ceil((currentRange.to - currentRange.from) / 2) + to: + currentRange.from + Math.ceil((currentRange.to - currentRange.from) / 2) }; } diff --git a/src/providers/evm/indexer.ts b/src/providers/evm/indexer.ts index 258e1f9..f848839 100644 --- a/src/providers/evm/indexer.ts +++ b/src/providers/evm/indexer.ts @@ -1,5 +1,5 @@ import { Logger } from '../../utils/logger'; -import { Instance, BaseIndexer } from '../base'; +import { BaseIndexer, Instance } from '../base'; import { EvmProvider } from './provider'; import { Writer } from './types'; @@ -11,8 +11,21 @@ export class EvmIndexer extends BaseIndexer { this.writers = writers; } - init({ instance, log, abis }: { instance: Instance; log: Logger; abis?: Record }) { - this.provider = new EvmProvider({ instance, log, abis, writers: this.writers }); + init({ + instance, + log, + abis + }: { + instance: Instance; + log: Logger; + abis?: Record; + }) { + this.provider = new EvmProvider({ + instance, + log, + abis, + writers: this.writers + }); } public getHandlers(): string[] { diff --git a/src/providers/evm/provider.ts b/src/providers/evm/provider.ts index f88b70f..b18d0e0 100644 --- a/src/providers/evm/provider.ts +++ b/src/providers/evm/provider.ts @@ -1,14 +1,19 @@ -import { BaseProvider, BlockNotFoundError, ReorgDetectedError } from '../base'; -import { getAddress } from '@ethersproject/address'; -import { Formatter, Log, Provider, StaticJsonRpcProvider } from '@ethersproject/providers'; import { Interface, LogDescription } from '@ethersproject/abi'; +import { getAddress } from '@ethersproject/address'; import { keccak256 } from '@ethersproject/keccak256'; +import { + Formatter, + Log, + Provider, + StaticJsonRpcProvider +} from '@ethersproject/providers'; import { toUtf8Bytes } from '@ethersproject/strings'; +import { getRangeHint } from './helpers'; +import { Block, CustomJsonRpcError, EventsData, Writer } from './types'; import { CheckpointRecord } from '../../stores/checkpoints'; -import { Block, Writer, EventsData, CustomJsonRpcError } from './types'; import { ContractSourceConfig } from '../../types'; import { sleep } from '../../utils/helpers'; -import { getRangeHint } from './helpers'; +import { BaseProvider, BlockNotFoundError, ReorgDetectedError } from '../base'; type GetLogsBlockHashFilter = { blockHash: string; @@ -36,10 +41,14 @@ export class EvmProvider extends BaseProvider { log, abis, writers - }: ConstructorParameters[0] & { writers: Record }) { + }: ConstructorParameters[0] & { + writers: Record; + }) { super({ instance, log, abis }); - this.provider = new StaticJsonRpcProvider(this.instance.config.network_node_url); + this.provider = new StaticJsonRpcProvider( + this.instance.config.network_node_url + ); this.writers = writers; } @@ -66,14 +75,18 @@ export class EvmProvider extends BaseProvider { let eventsData: EventsData; const skipBlockFetching = this.instance.opts?.skipBlockFetching ?? false; - const hasPreloadedBlockEvents = skipBlockFetching && this.logsCache.has(blockNum); + const hasPreloadedBlockEvents = + skipBlockFetching && this.logsCache.has(blockNum); try { if (!hasPreloadedBlockEvents) { block = await this.provider.getBlock(blockNum); } } catch (e) { - this.log.error({ blockNumber: blockNum, err: e }, 'getting block failed... retrying'); + this.log.error( + { blockNumber: blockNum, err: e }, + 'getting block failed... retrying' + ); throw e; } @@ -93,7 +106,10 @@ export class EvmProvider extends BaseProvider { throw new BlockNotFoundError(); } - this.log.error({ blockNumber: blockNum, err: e }, 'getting events failed... retrying'); + this.log.error( + { blockNumber: blockNum, err: e }, + 'getting events failed... retrying' + ); throw e; } @@ -113,7 +129,11 @@ export class EvmProvider extends BaseProvider { return blockNum + 1; } - private async handleBlock(blockNumber: number, block: Block | null, eventsData: EventsData) { + private async handleBlock( + blockNumber: number, + block: Block | null, + eventsData: EventsData + ) { this.log.info({ blockNumber }, 'handling block'); const blockTransactions = Object.keys(eventsData.events); @@ -152,20 +172,27 @@ export class EvmProvider extends BaseProvider { } if (this.instance.config.global_events) { - const globalEventHandlers = this.instance.config.global_events.reduce((handlers, event) => { - handlers[this.getEventHash(event.name)] = { - name: event.name, - fn: event.fn - }; - return handlers; - }, {}); + const globalEventHandlers = this.instance.config.global_events.reduce( + (handlers, event) => { + handlers[this.getEventHash(event.name)] = { + name: event.name, + fn: event.fn + }; + return handlers; + }, + {} + ); for (const event of logs) { const handler = globalEventHandlers[event.topics[0]]; if (!handler) continue; this.log.info( - { contract: event.address, event: handler.name, handlerFn: handler.fn }, + { + contract: event.address, + event: handler.name, + handlerFn: handler.fn + }, 'found contract event' ); @@ -193,7 +220,11 @@ export class EvmProvider extends BaseProvider { if (targetTopic === log.topics[0]) { foundContractData = true; this.log.info( - { contract: source.contract, event: sourceEvent.name, handlerFn: sourceEvent.fn }, + { + contract: source.contract, + event: sourceEvent.name, + handlerFn: sourceEvent.fn + }, 'found contract event' ); @@ -204,7 +235,12 @@ export class EvmProvider extends BaseProvider { parsedEvent = iface.parseLog(log); } catch (err) { this.log.warn( - { contract: source.contract, txId, handlerFn: sourceEvent.fn }, + { + err, + contract: source.contract, + txId, + handlerFn: sourceEvent.fn + }, 'failed to parse event' ); } @@ -354,10 +390,16 @@ export class EvmProvider extends BaseProvider { const json = await res.json(); if (json.error) { - throw new CustomJsonRpcError(json.error.message, json.error.code, json.error.data); + throw new CustomJsonRpcError( + json.error.message, + json.error.code, + json.error.data + ); } - return Formatter.arrayOf(this.formatter.filterLog.bind(this.formatter))(json.result); + return Formatter.arrayOf(this.formatter.filterLog.bind(this.formatter))( + json.result + ); } async getLogs( @@ -429,14 +471,19 @@ export class EvmProvider extends BaseProvider { source.events.map(event => this.getEventHash(event.name)) ); - const chunkEvents = await this.getLogs(fromBlock, toBlock, address, [topics]); + const chunkEvents = await this.getLogs(fromBlock, toBlock, address, [ + topics + ]); events = events.concat(chunkEvents); } return events; } - async getCheckpointsRange(fromBlock: number, toBlock: number): Promise { + async getCheckpointsRange( + fromBlock: number, + toBlock: number + ): Promise { const events = await this.getLogsForSources({ fromBlock, toBlock, diff --git a/src/providers/evm/types.ts b/src/providers/evm/types.ts index 4e82e7d..504ce8f 100644 --- a/src/providers/evm/types.ts +++ b/src/providers/evm/types.ts @@ -1,9 +1,13 @@ -import { Provider, Log } from '@ethersproject/providers'; import { LogDescription } from '@ethersproject/abi'; +import { Log, Provider } from '@ethersproject/providers'; import { BaseWriterParams } from '../../types'; export class CustomJsonRpcError extends Error { - constructor(message: string, public code: number, public data: any) { + constructor( + message: string, + public code: number, + public data: any + ) { super(message); } } diff --git a/src/providers/starknet/indexer.ts b/src/providers/starknet/indexer.ts index c3ac265..12b3c2a 100644 --- a/src/providers/starknet/indexer.ts +++ b/src/providers/starknet/indexer.ts @@ -1,6 +1,6 @@ -import { Logger } from '../../utils/logger'; -import { Instance, BaseIndexer } from '../base'; import { StarknetProvider } from '.'; +import { Logger } from '../../utils/logger'; +import { BaseIndexer, Instance } from '../base'; import { Writer } from './types'; export class StarknetIndexer extends BaseIndexer { @@ -11,8 +11,21 @@ export class StarknetIndexer extends BaseIndexer { this.writers = writers; } - init({ instance, log, abis }: { instance: Instance; log: Logger; abis?: Record }) { - this.provider = new StarknetProvider({ instance, log, abis, writers: this.writers }); + init({ + instance, + log, + abis + }: { + instance: Instance; + log: Logger; + abis?: Record; + }) { + this.provider = new StarknetProvider({ + instance, + log, + abis, + writers: this.writers + }); } public getHandlers(): string[] { diff --git a/src/providers/starknet/provider.ts b/src/providers/starknet/provider.ts index fdc92a3..87c74e4 100644 --- a/src/providers/starknet/provider.ts +++ b/src/providers/starknet/provider.ts @@ -1,14 +1,26 @@ -import { RpcProvider, hash, validateAndParseAddress } from 'starknet'; import { BlockWithTxReceipts, SPEC } from '@starknet-io/types-js'; +import { hash, RpcProvider, validateAndParseAddress } from 'starknet'; import { BaseProvider, BlockNotFoundError, ReorgDetectedError } from '../base'; +import { + Block, + Event, + EventsData, + FullBlock, + isFullBlock, + ParsedEvent, + Writer +} from './types'; import { parseEvent } from './utils'; import { CheckpointRecord } from '../../stores/checkpoints'; -import { Block, FullBlock, Event, EventsData, ParsedEvent, isFullBlock, Writer } from './types'; import { ContractSourceConfig } from '../../types'; import { sleep } from '../../utils/helpers'; class CustomJsonRpcError extends Error { - constructor(message: string, public code: number, public data: any) { + constructor( + message: string, + public code: number, + public data: any + ) { super(message); } } @@ -60,7 +72,8 @@ export class StarknetProvider extends BaseProvider { let eventsData: EventsData; try { const skipBlockFetching = this.instance.opts?.skipBlockFetching ?? false; - const hasPreloadedBlockEvents = skipBlockFetching && this.logsCache.has(blockNum); + const hasPreloadedBlockEvents = + skipBlockFetching && this.logsCache.has(blockNum); if (!hasPreloadedBlockEvents) { block = await this.provider.getBlockWithTxHashes(blockNum); @@ -81,7 +94,10 @@ export class StarknetProvider extends BaseProvider { throw new BlockNotFoundError(); } - this.log.error({ blockNumber: blockNum, err: e }, 'getting block failed... retrying'); + this.log.error( + { blockNumber: blockNum, err: e }, + 'getting block failed... retrying' + ); throw e; } @@ -105,7 +121,9 @@ export class StarknetProvider extends BaseProvider { const block = await this.getBlockWithReceipts('pending'); const receipts = block.transactions .map(({ receipt }) => receipt) - .filter(receipt => !this.seenPoolTransactions.has(receipt.transaction_hash)); + .filter( + receipt => !this.seenPoolTransactions.has(receipt.transaction_hash) + ); const txIds = receipts.map(receipt => receipt.transaction_hash); @@ -122,11 +140,17 @@ export class StarknetProvider extends BaseProvider { await this.handlePool(txIds, eventsData, blockNumber); } - private async handleBlock(blockNumber: number, block: FullBlock | null, eventsData: EventsData) { + private async handleBlock( + blockNumber: number, + block: FullBlock | null, + eventsData: EventsData + ) { this.log.info({ blockNumber }, 'handling block'); const blockTransactions = Object.keys(eventsData.events); - const txsToCheck = blockTransactions.filter(txId => !this.seenPoolTransactions.has(txId)); + const txsToCheck = blockTransactions.filter( + txId => !this.seenPoolTransactions.has(txId) + ); for (const txId of txsToCheck) { await this.handleTx( @@ -143,7 +167,11 @@ export class StarknetProvider extends BaseProvider { this.log.debug({ blockNumber }, 'handling block done'); } - private async handlePool(txIds: string[], eventsData: EventsData, blockNumber: number) { + private async handlePool( + txIds: string[], + eventsData: EventsData, + blockNumber: number + ) { this.log.info('handling pool'); for (const txId of txIds) { @@ -190,20 +218,27 @@ export class StarknetProvider extends BaseProvider { } if (this.instance.config.global_events) { - const globalEventHandlers = this.instance.config.global_events.reduce((handlers, event) => { - handlers[this.getEventHash(event.name)] = { - name: event.name, - fn: event.fn - }; - return handlers; - }, {}); + const globalEventHandlers = this.instance.config.global_events.reduce( + (handlers, event) => { + handlers[this.getEventHash(event.name)] = { + name: event.name, + fn: event.fn + }; + return handlers; + }, + {} + ); for (const event of events) { const handler = globalEventHandlers[event.keys[0]]; if (!handler) continue; this.log.info( - { contract: event.from_address, event: handler.name, handlerFn: handler.fn }, + { + contract: event.from_address, + event: handler.name, + handlerFn: handler.fn + }, 'found contract event' ); @@ -233,7 +268,11 @@ export class StarknetProvider extends BaseProvider { if (this.getEventHash(sourceEvent.name) === event.keys[0]) { foundContractData = true; this.log.info( - { contract: source.contract, event: sourceEvent.name, handlerFn: sourceEvent.fn }, + { + contract: source.contract, + event: sourceEvent.name, + handlerFn: sourceEvent.fn + }, 'found contract event' ); @@ -243,7 +282,12 @@ export class StarknetProvider extends BaseProvider { parsedEvent = parseEvent(this.abis[source.abi], event); } catch (err) { this.log.warn( - { contract: source.contract, txId, handlerFn: sourceEvent.fn }, + { + err, + contract: source.contract, + txId, + handlerFn: sourceEvent.fn + }, 'failed to parse event' ); } @@ -271,7 +315,10 @@ export class StarknetProvider extends BaseProvider { if (foundContractData) { await this.instance.insertCheckpoints([ - { blockNumber, contractAddress: validateAndParseAddress(source.contract) } + { + blockNumber, + contractAddress: validateAndParseAddress(source.contract) + } ]); const nextSources = this.instance.getCurrentSources(blockNumber); @@ -323,7 +370,11 @@ export class StarknetProvider extends BaseProvider { const json = await res.json(); if (json.error) { - throw new CustomJsonRpcError(json.error.message, json.error.code, json.error.data); + throw new CustomJsonRpcError( + json.error.message, + json.error.code, + json.error.data + ); } return json.result as BlockWithTxReceipts; @@ -435,7 +486,10 @@ export class StarknetProvider extends BaseProvider { return events; } - async getCheckpointsRange(fromBlock: number, toBlock: number): Promise { + async getCheckpointsRange( + fromBlock: number, + toBlock: number + ): Promise { const events = await this.getEventsForSources({ fromBlock, toBlock, @@ -458,7 +512,10 @@ export class StarknetProvider extends BaseProvider { getEventHash(eventName: string) { if (!this.sourceHashes.has(eventName)) { - this.sourceHashes.set(eventName, `0x${hash.starknetKeccak(eventName).toString(16)}`); + this.sourceHashes.set( + eventName, + `0x${hash.starknetKeccak(eventName).toString(16)}` + ); } return this.sourceHashes.get(eventName) as string; diff --git a/src/providers/starknet/utils.ts b/src/providers/starknet/utils.ts index 91572c0..7040821 100644 --- a/src/providers/starknet/utils.ts +++ b/src/providers/starknet/utils.ts @@ -1,10 +1,12 @@ -import { Abi, CallData, Event, ParsedEvent, events } from 'starknet'; +import { Abi, CallData, Event, events, ParsedEvent } from 'starknet'; const convertEvent = (input: any) => { if (typeof input === 'bigint') return `0x${input.toString(16)}`; if (Array.isArray(input)) return input.map(convertEvent); if (typeof input === 'object') - return Object.fromEntries(Object.entries(input).map(([k, v]) => [k, convertEvent(v)])); + return Object.fromEntries( + Object.entries(input).map(([k, v]) => [k, convertEvent(v)]) + ); return input; }; diff --git a/src/stores/checkpoints.ts b/src/stores/checkpoints.ts index ce1a680..cd6b46c 100644 --- a/src/stores/checkpoints.ts +++ b/src/stores/checkpoints.ts @@ -1,8 +1,8 @@ import * as crypto from 'crypto'; import { Knex } from 'knex'; -import { Logger } from '../utils/logger'; -import { chunk } from '../utils/helpers'; import { TemplateSource } from '../types'; +import { chunk } from '../utils/helpers'; +import { Logger } from '../utils/logger'; export const Table = { Blocks: '_blocks', @@ -68,7 +68,11 @@ const CheckpointIdSize = 10; */ export const getCheckpointId = (contract: string, block: number): string => { const data = `${contract}${block}`; - return crypto.createHash('sha256').update(data).digest('hex').slice(-CheckpointIdSize); + return crypto + .createHash('sha256') + .update(data) + .digest('hex') + .slice(-CheckpointIdSize); }; /** @@ -80,7 +84,10 @@ export const getCheckpointId = (contract: string, block: number): string => { export class CheckpointsStore { private readonly log: Logger; - constructor(private readonly knex: Knex, log: Logger) { + constructor( + private readonly knex: Knex, + log: Logger + ) { this.log = log.child({ component: 'checkpoints_store' }); } @@ -93,9 +100,13 @@ export class CheckpointsStore { this.log.debug('creating checkpoints tables...'); const hasBlocksTable = await this.knex.schema.hasTable(Table.Blocks); - const hasCheckpointsTable = await this.knex.schema.hasTable(Table.Checkpoints); + const hasCheckpointsTable = await this.knex.schema.hasTable( + Table.Checkpoints + ); const hasMetadataTable = await this.knex.schema.hasTable(Table.Metadata); - const hasTemplateSourcesTable = await this.knex.schema.hasTable(Table.TemplateSources); + const hasTemplateSourcesTable = await this.knex.schema.hasTable( + Table.TemplateSources + ); let builder = this.knex.schema; @@ -154,9 +165,13 @@ export class CheckpointsStore { this.log.debug('truncating checkpoints tables'); const hasBlocksTable = await this.knex.schema.hasTable(Table.Blocks); - const hasCheckpointsTable = await this.knex.schema.hasTable(Table.Checkpoints); + const hasCheckpointsTable = await this.knex.schema.hasTable( + Table.Checkpoints + ); const hasMetadataTable = await this.knex.schema.hasTable(Table.Metadata); - const hasTemplateSourcesTable = await this.knex.schema.hasTable(Table.TemplateSources); + const hasTemplateSourcesTable = await this.knex.schema.hasTable( + Table.TemplateSources + ); if (hasBlocksTable) { await this.knex.schema.dropTable(Table.Blocks); @@ -179,7 +194,10 @@ export class CheckpointsStore { await this.createStore(); } - public async removeFutureData(indexer: string, blockNumber: number): Promise { + public async removeFutureData( + indexer: string, + blockNumber: number + ): Promise { return this.knex.transaction(async trx => { await trx .table(Table.Metadata) @@ -197,11 +215,18 @@ export class CheckpointsStore { .where(Fields.Checkpoints.BlockNumber, '>', blockNumber) .del(); - await trx.table(Table.Blocks).where(Fields.Blocks.Number, '>', blockNumber).del(); + await trx + .table(Table.Blocks) + .where(Fields.Blocks.Number, '>', blockNumber) + .del(); }); } - public async setBlockHash(indexer: string, blockNumber: number, hash: string): Promise { + public async setBlockHash( + indexer: string, + blockNumber: number, + hash: string + ): Promise { await this.knex.table(Table.Blocks).insert({ [Fields.Blocks.Indexer]: indexer, [Fields.Blocks.Number]: blockNumber, @@ -209,7 +234,10 @@ export class CheckpointsStore { }); } - public async getBlockHash(indexer: string, blockNumber: number): Promise { + public async getBlockHash( + indexer: string, + blockNumber: number + ): Promise { const blocks = await this.knex .select(Fields.Blocks.Hash) .from(Table.Blocks) @@ -228,7 +256,11 @@ export class CheckpointsStore { return this.knex(Table.Blocks).where(Fields.Blocks.Indexer, indexer).del(); } - public async setMetadata(indexer: string, id: string, value: ToString): Promise { + public async setMetadata( + indexer: string, + id: string, + value: ToString + ): Promise { await this.knex .table(Table.Metadata) .insert({ @@ -240,7 +272,10 @@ export class CheckpointsStore { .merge(); } - public async getMetadata(indexer: string, id: string): Promise { + public async getMetadata( + indexer: string, + id: string + ): Promise { const value = await this.knex .select(Fields.Metadata.Value) .from(Table.Metadata) @@ -255,21 +290,31 @@ export class CheckpointsStore { return value[0][Fields.Metadata.Value]; } - public async getMetadataNumber(indexer: string, id: string, base = 10): Promise { + public async getMetadataNumber( + indexer: string, + id: string, + base = 10 + ): Promise { const strValue = await this.getMetadata(indexer, id); if (strValue === null) return null; return parseInt(strValue, base); } - public async insertCheckpoints(indexer: string, checkpoints: CheckpointRecord[]): Promise { + public async insertCheckpoints( + indexer: string, + checkpoints: CheckpointRecord[] + ): Promise { const insert = async (items: CheckpointRecord[]) => { try { await this.knex .table(Table.Checkpoints) .insert( items.map(checkpoint => { - const id = getCheckpointId(checkpoint.contractAddress, checkpoint.blockNumber); + const id = getCheckpointId( + checkpoint.contractAddress, + checkpoint.blockNumber + ); return { [Fields.Checkpoints.Id]: id, diff --git a/src/types.ts b/src/types.ts index 97283fe..a3d7306 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,13 +1,13 @@ import pino from 'pino'; import { z } from 'zod'; -import { LogLevel } from './utils/logger'; +import { Instance } from './providers'; import { + checkpointConfigSchema, contractSourceConfigSchema, contractTemplateSchema, - checkpointConfigSchema, overridesConfigSchema } from './schemas'; -import { Instance } from './providers'; +import { LogLevel } from './utils/logger'; export type TemplateSource = { contractAddress: string; diff --git a/src/utils/checkpoint.ts b/src/utils/checkpoint.ts index 8c1e1ec..28912b3 100644 --- a/src/utils/checkpoint.ts +++ b/src/utils/checkpoint.ts @@ -1,11 +1,17 @@ import objectHash from 'object-hash'; -import { CheckpointConfig, ContractSourceConfig, ContractTemplate } from '../types'; +import { + CheckpointConfig, + ContractSourceConfig, + ContractTemplate +} from '../types'; export const getContractsFromConfig = (config: CheckpointConfig): string[] => { return (config.sources || []).map(source => source.contract); }; -const getHashableProperties = (config: ContractTemplate | ContractSourceConfig) => ({ +const getHashableProperties = ( + config: ContractTemplate | ContractSourceConfig +) => ({ contract: 'contract' in config ? config.contract : undefined, start: 'start' in config ? config.start : undefined, events: (config.events || []).map(event => event.name) @@ -20,7 +26,10 @@ export const getConfigChecksum = (config: CheckpointConfig): string => { global_events, sources: (sources || []).map(source => getHashableProperties(source)), templates: Object.fromEntries( - Object.entries(templates || {}).map(([key, value]) => [key, getHashableProperties(value)]) + Object.entries(templates || {}).map(([key, value]) => [ + key, + getHashableProperties(value) + ]) ) }, { diff --git a/src/utils/database.ts b/src/utils/database.ts index d8ace34..cd8d146 100644 --- a/src/utils/database.ts +++ b/src/utils/database.ts @@ -1,5 +1,5 @@ -import pluralize from 'pluralize'; import { Knex } from 'knex'; +import pluralize from 'pluralize'; import { INTERNAL_TABLES } from '../stores/checkpoints'; export type QueryFilter = { @@ -25,14 +25,19 @@ export function applyQueryFilter( if (!isInternalTable) { filteredQuery = filters.block !== undefined - ? query.andWhereRaw(`${tableName}.block_range @> int8(??)`, [filters.block]) + ? query.andWhereRaw(`${tableName}.block_range @> int8(??)`, [ + filters.block + ]) : query.andWhereRaw(`upper_inf(${tableName}.block_range)`); } if (filters.indexer !== undefined) { const columnName = isInternalTable ? 'indexer' : `_indexer`; - filteredQuery = query.andWhere(`${tableName}.${columnName}`, filters.indexer); + filteredQuery = query.andWhere( + `${tableName}.${columnName}`, + filters.indexer + ); } return filteredQuery; diff --git a/src/utils/graphql.ts b/src/utils/graphql.ts index d8e5252..58c2a2f 100644 --- a/src/utils/graphql.ts +++ b/src/utils/graphql.ts @@ -1,13 +1,13 @@ import { - GraphQLObjectType, + GraphQLField, GraphQLNonNull, + GraphQLObjectType, + GraphQLScalarType, isLeafType, isListType, - GraphQLScalarType, - GraphQLField, parse, - visit, - print + print, + visit } from 'graphql'; import { jsonToGraphQLQuery } from 'json-to-graphql-query'; import pluralize from 'pluralize'; @@ -26,7 +26,10 @@ export const extendSchema = (schema: string): string => { name: { kind: 'Name', value: 'field' }, type: { kind: 'NonNullType', - type: { kind: 'NamedType', name: { kind: 'Name', value: 'String' } } + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'String' } + } } } ], @@ -62,7 +65,8 @@ export const extendSchema = (schema: string): string => { * Returns name of query for fetching single entity record * */ -export const singleEntityQueryName = (entity: GraphQLObjectType) => entity.name.toLowerCase(); +export const singleEntityQueryName = (entity: GraphQLObjectType) => + entity.name.toLowerCase(); /** * Returns name of query for fetching multiple entity records @@ -80,12 +84,18 @@ export const multiEntityQueryName = (entity: GraphQLObjectType) => { */ export const generateQueryForEntity = (entity: GraphQLObjectType): string => { // function to recursively build fields map - const getObjectFields = (object: GraphQLObjectType, queryFields = {}): Record => { + const getObjectFields = ( + object: GraphQLObjectType, + queryFields = {} + ): Record => { const objectFields = object.getFields(); Object.keys(objectFields).forEach(fieldName => { const rawFieldType = objectFields[fieldName].type; - const fieldType = rawFieldType instanceof GraphQLNonNull ? rawFieldType.ofType : rawFieldType; + const fieldType = + rawFieldType instanceof GraphQLNonNull + ? rawFieldType.ofType + : rawFieldType; if (isLeafType(fieldType)) { queryFields[fieldName] = true; diff --git a/src/utils/logger.ts b/src/utils/logger.ts index 9d57b99..e1ac476 100644 --- a/src/utils/logger.ts +++ b/src/utils/logger.ts @@ -1,4 +1,4 @@ -import pino, { Logger as PinoLogger, LoggerOptions } from 'pino'; +import pino, { LoggerOptions, Logger as PinoLogger } from 'pino'; /** The minimum level to log. */ export enum LogLevel { diff --git a/test/fixtures/checkpointConfig.fixture.ts b/test/fixtures/checkpointConfig.fixture.ts index 82344b7..7c728de 100644 --- a/test/fixtures/checkpointConfig.fixture.ts +++ b/test/fixtures/checkpointConfig.fixture.ts @@ -2,7 +2,8 @@ export const validCheckpointConfig = { network_node_url: 'https://starknet-goerli.infura.io/v3/SOME_KEY', sources: [ { - contract: '0x0625dc1290b6e936be5f1a3e963cf629326b1f4dfd5a56738dea98e1ad31b7f3', + contract: + '0x0625dc1290b6e936be5f1a3e963cf629326b1f4dfd5a56738dea98e1ad31b7f3', start: 112319, events: [ { diff --git a/test/unit/codegen.test.ts b/test/unit/codegen.test.ts index 30e67c6..4e18847 100644 --- a/test/unit/codegen.test.ts +++ b/test/unit/codegen.test.ts @@ -1,5 +1,11 @@ -import { GraphQLObjectType, buildSchema } from 'graphql'; -import { getInitialValue, getBaseType, getJSType, codegen, getTypeInfo } from '../../src/codegen'; +import { buildSchema, GraphQLObjectType } from 'graphql'; +import { + codegen, + getBaseType, + getInitialValue, + getJSType, + getTypeInfo +} from '../../src/codegen'; import { GqlEntityController } from '../../src/graphql/controller'; import { extendSchema } from '../../src/utils/graphql'; @@ -103,7 +109,9 @@ describe('getInitialValue', () => { it('should return stringified empty array for List types', () => { expect(getInitialValue(spaceFields['strategies'].type)).toEqual('[]'); - expect(getInitialValue(spaceFields['strategies_nonnull'].type)).toEqual('[]'); + expect(getInitialValue(spaceFields['strategies_nonnull'].type)).toEqual( + '[]' + ); }); it('should return empty string for object types', () => { @@ -145,7 +153,9 @@ describe('getBaseType', () => { it('should return array type for List types', () => { expect(getBaseType(spaceFields['strategies'].type)).toBe('string[]'); - expect(getBaseType(spaceFields['strategies_nonnull'].type)).toBe('string[]'); + expect(getBaseType(spaceFields['strategies_nonnull'].type)).toBe( + 'string[]' + ); }); it('should return string for BigDecimal types', () => { @@ -177,10 +187,14 @@ describe('codegen', () => { const controller = new GqlEntityController(extendedSchema); it('should generate typescript code', () => { - expect(codegen(controller, overridesConfig, 'typescript')).toMatchSnapshot(); + expect( + codegen(controller, overridesConfig, 'typescript') + ).toMatchSnapshot(); }); it('should generate javascript code', () => { - expect(codegen(controller, overridesConfig, 'javascript')).toMatchSnapshot(); + expect( + codegen(controller, overridesConfig, 'javascript') + ).toMatchSnapshot(); }); }); diff --git a/test/unit/graphql/controller.test.ts b/test/unit/graphql/controller.test.ts index d0708d8..6305b03 100644 --- a/test/unit/graphql/controller.test.ts +++ b/test/unit/graphql/controller.test.ts @@ -38,7 +38,9 @@ type Vote { } ])('should fail for $reason', ({ schema }) => { const controller = new GqlEntityController(schema); - expect(() => controller.generateQueryFields()).toThrowErrorMatchingSnapshot(); + expect(() => + controller.generateQueryFields() + ).toThrowErrorMatchingSnapshot(); }); }); diff --git a/test/unit/knex.test.ts b/test/unit/knex.test.ts index 3e8182f..2350946 100644 --- a/test/unit/knex.test.ts +++ b/test/unit/knex.test.ts @@ -2,7 +2,11 @@ import { createKnexConfig } from '../../src/knex'; describe('createKnexConfig', () => { it('should create knex config', () => { - expect(createKnexConfig('postgres://root:default_password@localhost:3306/checkpoint')).toEqual({ + expect( + createKnexConfig( + 'postgres://root:default_password@localhost:3306/checkpoint' + ) + ).toEqual({ client: 'pg', connection: { database: 'checkpoint', diff --git a/test/unit/providers/starknet/fixtures.ts b/test/unit/providers/starknet/fixtures.ts index 494f9a3..2e231bb 100644 --- a/test/unit/providers/starknet/fixtures.ts +++ b/test/unit/providers/starknet/fixtures.ts @@ -31,26 +31,37 @@ export const spaceDeployedEvent = { '0x34367363356162767a6f6c6f6864343666717a6d71616b6e6f337467716c36', '0x32686669' ], - from_address: '0xe1e511e496a72791ab3d591ba7d571a32de4261d84e4d183f26b6325970e20', + from_address: + '0xe1e511e496a72791ab3d591ba7d571a32de4261d84e4d183f26b6325970e20', keys: ['0xfb483ab6758cfd02170a30e08181f6e7397c1a32c2966ce3a8c4702b7ec142'] }; export const voteCreatedEvent = { - data: ['0x8', '0xef8305e140ac520225daf050e2f71d5fbcc543e7', '0x1', '0x1', '0x0'], - from_address: '0x750118894bf8b3ad7fd79763899c4528b2a7a0c17d7185dff78eaddbff2cb0b', + data: [ + '0x8', + '0xef8305e140ac520225daf050e2f71d5fbcc543e7', + '0x1', + '0x1', + '0x0' + ], + from_address: + '0x750118894bf8b3ad7fd79763899c4528b2a7a0c17d7185dff78eaddbff2cb0b', keys: ['0x35a0a3a79d25118031c4960817fe040fe30a9d229c30e63c993a5bfee52d32b'] }; export const spaceDeployedEventCairo1 = { - block_hash: '0x8c069e00a34ae275efe05b4b5f9395d615f9caf003c4a0d0576c225a95d673', + block_hash: + '0x8c069e00a34ae275efe05b4b5f9395d615f9caf003c4a0d0576c225a95d673', block_number: 114, data: [ '0x7b52be32f53235445c94247942b516cb9f8ace110c82ca8a72af527eb7d44b0', '0x40279a6371314c37464ebc327856a2d332b89022109f55b9ee93179bbbe727a' ], - from_address: '0x6838e761bc2e07c9563251a03a60b9a013f2d36b73246fc9d850932ac519696', + from_address: + '0x6838e761bc2e07c9563251a03a60b9a013f2d36b73246fc9d850932ac519696', keys: ['0x2d8cd3e2509f757328c6abf59278c05024d30ae28426655f886b32be3eeaa9f'], - transaction_hash: '0x569e2dac76352ea03888e9ff3135374e87124324ce22ce98ab5d16f922cc33e' + transaction_hash: + '0x569e2dac76352ea03888e9ff3135374e87124324ce22ce98ab5d16f922cc33e' }; export const spaceFactoryAbi = [ diff --git a/test/unit/providers/starknet/utils.test.ts b/test/unit/providers/starknet/utils.test.ts index 1ef79e3..1e8b545 100644 --- a/test/unit/providers/starknet/utils.test.ts +++ b/test/unit/providers/starknet/utils.test.ts @@ -1,12 +1,12 @@ -import { parseEvent } from '../../../../src/providers/starknet/utils'; import { - spaceFactoryAbi, - spaceAbi, factoryAbiCairo1, + spaceAbi, spaceDeployedEvent, - voteCreatedEvent, - spaceDeployedEventCairo1 + spaceDeployedEventCairo1, + spaceFactoryAbi, + voteCreatedEvent } from './fixtures'; +import { parseEvent } from '../../../../src/providers/starknet/utils'; describe('utils', () => { describe('parseEvent', () => { diff --git a/test/unit/stores/checkpoints.test.ts b/test/unit/stores/checkpoints.test.ts index 23f0c05..f48a465 100644 --- a/test/unit/stores/checkpoints.test.ts +++ b/test/unit/stores/checkpoints.test.ts @@ -1,6 +1,10 @@ -import knex from 'knex'; import { mockDeep } from 'jest-mock-extended'; -import { CheckpointsStore, MetadataId, Table } from '../../../src/stores/checkpoints'; +import knex from 'knex'; +import { + CheckpointsStore, + MetadataId, + Table +} from '../../../src/stores/checkpoints'; import { Logger } from '../../../src/utils/logger'; function createMockLogger() { @@ -188,10 +192,16 @@ describe('CheckpointsStore', () => { }); it('should return next checkpoint blocks', async () => { - let result = await store.getNextCheckpointBlocks(INDEXER, 4000, [CONTRACT_A, CONTRACT_B]); + let result = await store.getNextCheckpointBlocks(INDEXER, 4000, [ + CONTRACT_A, + CONTRACT_B + ]); expect(result).toEqual([5000, 9000, 11000]); - result = await store.getNextCheckpointBlocks(INDEXER, 7000, [CONTRACT_A, CONTRACT_B]); + result = await store.getNextCheckpointBlocks(INDEXER, 7000, [ + CONTRACT_A, + CONTRACT_B + ]); expect(result).toEqual([9000, 11000]); result = await store.getNextCheckpointBlocks(INDEXER, 4000, [CONTRACT_B]); diff --git a/test/unit/utils/database.test.ts b/test/unit/utils/database.test.ts index 10a2d00..f6bf964 100644 --- a/test/unit/utils/database.test.ts +++ b/test/unit/utils/database.test.ts @@ -1,5 +1,5 @@ import knex from 'knex'; -import { getTableName, applyQueryFilter } from '../../../src/utils/database'; +import { applyQueryFilter, getTableName } from '../../../src/utils/database'; const mockKnex = knex({ client: 'sqlite3', @@ -34,7 +34,10 @@ describe('applyQueryFilter', () => { it('should not apply block filter filter for internal tables', () => { const query = mockKnex.select('*').from('_metadatas'); - const result = applyQueryFilter(query, '_metadatas', { block: 123, indexer: 'indexer' }); + const result = applyQueryFilter(query, '_metadatas', { + block: 123, + indexer: 'indexer' + }); expect(result.toString()).toBe( "select * from `_metadatas` where `_metadatas`.`indexer` = 'indexer'" @@ -44,7 +47,10 @@ describe('applyQueryFilter', () => { it('should apply capped block filter if block is provided', () => { const query = mockKnex.select('*').from('posts'); - const result = applyQueryFilter(query, 'posts', { block: 123, indexer: 'indexer' }); + const result = applyQueryFilter(query, 'posts', { + block: 123, + indexer: 'indexer' + }); expect(result.toString()).toBe( "select * from `posts` where posts.block_range @> int8(123) and `posts`.`_indexer` = 'indexer'" @@ -66,6 +72,8 @@ describe('applyQueryFilter', () => { const result = applyQueryFilter(query, 'posts', {}); - expect(result.toString()).toBe('select * from `posts` where upper_inf(posts.block_range)'); + expect(result.toString()).toBe( + 'select * from `posts` where upper_inf(posts.block_range)' + ); }); }); diff --git a/yarn.lock b/yarn.lock index dbc8d3b..ed27fb0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -494,21 +494,38 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@eslint/eslintrc@^1.3.3": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.3.tgz#2b044ab39fdfa75b4688184f9e573ce3c5b0ff95" - integrity sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg== +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.7.0": + version "4.7.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz#607084630c6c033992a082de6e6fbc1a8b52175a" + integrity sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw== + dependencies: + eslint-visitor-keys "^3.4.3" + +"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" + integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== dependencies: ajv "^6.12.4" debug "^4.3.2" - espree "^9.4.0" - globals "^13.15.0" + espree "^9.6.0" + globals "^13.19.0" ignore "^5.2.0" import-fresh "^3.2.1" js-yaml "^4.1.0" minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@eslint/js@8.57.1": + version "8.57.1" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" + integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== + "@ethersproject/abi@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" @@ -767,13 +784,13 @@ dependencies: tslib "^2.4.0" -"@humanwhocodes/config-array@^0.11.6": - version "0.11.7" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.7.tgz#38aec044c6c828f6ed51d5d7ae3d9b9faf6dbb0f" - integrity sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw== +"@humanwhocodes/config-array@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" + integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== dependencies: - "@humanwhocodes/object-schema" "^1.2.1" - debug "^4.1.1" + "@humanwhocodes/object-schema" "^2.0.3" + debug "^4.3.1" minimatch "^3.0.5" "@humanwhocodes/module-importer@^1.0.1": @@ -781,10 +798,10 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@humanwhocodes/object-schema@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" @@ -1134,6 +1151,11 @@ mkdirp "^1.0.4" rimraf "^3.0.2" +"@pkgr/core@^0.2.9": + version "0.2.9" + resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.2.9.tgz#d229a7b7f9dac167a156992ef23c7f023653f53b" + integrity sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA== + "@rometools/cli-darwin-arm64@12.1.3": version "12.1.3" resolved "https://registry.yarnpkg.com/@rometools/cli-darwin-arm64/-/cli-darwin-arm64-12.1.3.tgz#b00fe225e34047c4dac63588e237b11ebec47694" @@ -1164,6 +1186,11 @@ resolved "https://registry.yarnpkg.com/@rometools/cli-win32-x64/-/cli-win32-x64-12.1.3.tgz#b4f53491d2ca8f1234b3613b7cc73418ad8d76bb" integrity sha512-yHSKYidqJMV9nADqg78GYA+cZ0hS1twANAjiFibQdXj9aGzD+s/IzIFEIi/U/OBLvWYg/SCw0QVozi2vTlKFDQ== +"@rtsao/scc@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" + integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== + "@sinclair/typebox@^0.25.16": version "0.25.24" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" @@ -1183,27 +1210,28 @@ dependencies: "@sinonjs/commons" "^3.0.0" -"@snapshot-labs/eslint-config-base@^0.1.0-beta.7": - version "0.1.0-beta.7" - resolved "https://registry.yarnpkg.com/@snapshot-labs/eslint-config-base/-/eslint-config-base-0.1.0-beta.7.tgz#8a500d24b07720fcb7f19e120c13b1443c818541" - integrity sha512-1RPzSvS2muKL5JIpJ6pjGUD9xkyAFeeF90tZJsS1z3+8cmsZ0J1VJRW8iUyWr6+1HJiYJE3XupaCLWzluWQbCA== +"@snapshot-labs/eslint-config-base@^0.1.0-beta.21": + version "0.1.0-beta.21" + resolved "https://registry.yarnpkg.com/@snapshot-labs/eslint-config-base/-/eslint-config-base-0.1.0-beta.21.tgz#286c34f86d7c9cde864a2f954f89ba6b83a78729" + integrity sha512-1ZuKV3bn8OW3l9NgA0wnt55khoc0hIWBbkNjIytPnG00WlJTWLNgjHAhRQHaD4swK/3oaj8GSTxiOm0eEIfXeA== dependencies: - "@typescript-eslint/eslint-plugin" "^5.44.0" - "@typescript-eslint/parser" "^5.44.0" - eslint-config-prettier "^8.5.0" - eslint-plugin-prettier "^4.2.1" + "@typescript-eslint/eslint-plugin" "^8.29.1" + "@typescript-eslint/parser" "^8.29.1" + eslint-config-prettier "^10.1.1" + eslint-plugin-import "^2.31.0" + eslint-plugin-prettier "^5.2.6" -"@snapshot-labs/eslint-config@^0.1.0-beta.7": - version "0.1.0-beta.7" - resolved "https://registry.yarnpkg.com/@snapshot-labs/eslint-config/-/eslint-config-0.1.0-beta.7.tgz#3bb708f2ee65ad5b05e750eb03ce37a9f1e89f8a" - integrity sha512-jcuIGlhNdhg8kxb70MAYTf2La2h8NvrBzum4KzNTFCqXbgGEgl3mZ9aK6IOJoNX+irUznSPadD4nTMkRMEo42Q== +"@snapshot-labs/eslint-config@^0.1.0-beta.21": + version "0.1.0-beta.21" + resolved "https://registry.yarnpkg.com/@snapshot-labs/eslint-config/-/eslint-config-0.1.0-beta.21.tgz#c5618d0ba196af48492bd5a43d8c37d14c3db19a" + integrity sha512-3Y+sjt/c4ScVUYvsKu1u6O0ggcxM6t0AE0mMd8rcnX8kMfFikiWOTKN8c3m4ZmnuUb2vRCdCNxtMGMGju9JY+A== dependencies: - "@snapshot-labs/eslint-config-base" "^0.1.0-beta.7" + "@snapshot-labs/eslint-config-base" "^0.1.0-beta.21" -"@snapshot-labs/prettier-config@^0.1.0-beta.7": - version "0.1.0-beta.7" - resolved "https://registry.yarnpkg.com/@snapshot-labs/prettier-config/-/prettier-config-0.1.0-beta.7.tgz#c8e07e7e9baabee245020a72ac05835b65139823" - integrity sha512-k/FUf4VWhwLFUmKuWs2mNvmPe691hqhvCJuujD4TfbIivWysmL1TqthwfdQUrQEAQUqVQ2ZKEiGkbufp5J27eQ== +"@snapshot-labs/prettier-config@^0.1.0-beta.19": + version "0.1.0-beta.19" + resolved "https://registry.yarnpkg.com/@snapshot-labs/prettier-config/-/prettier-config-0.1.0-beta.19.tgz#0c463b172ed22668fc9cd69ac8b433110f7e3dee" + integrity sha512-vpfk3WU4idf7o0go4J+JnzZTRXB+KJEw39yElZhXxq4rzBQBzeZm/9xvlew4ZdN2A2bAHY4Ov6NL0/C8I+R1TA== "@starknet-io/types-js@^0.7.10": version "0.7.10" @@ -1309,20 +1337,22 @@ expect "^29.0.0" pretty-format "^29.0.0" -"@types/json-schema@^7.0.9": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/node@*": version "18.6.3" resolved "https://registry.yarnpkg.com/@types/node/-/node-18.6.3.tgz#4e4a95b6fe44014563ceb514b2598b3e623d1c98" integrity sha512-6qKpDtoaYLM+5+AFChLhHermMQxc3TOEFIDzrZLPRGHPrLEwqFkkT5Kx3ju05g6X7uDPazz3jHbKPX0KzCjntg== -"@types/node@^18.11.6": - version "18.11.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.9.tgz#02d013de7058cea16d36168ef2fc653464cfbad4" - integrity sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg== +"@types/node@^22.18.0": + version "22.18.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.18.0.tgz#9e4709be4f104e3568f7dd1c71e2949bf147a47b" + integrity sha512-m5ObIqwsUp6BZzyiy4RdZpzWGub9bqLJMvZDD0QMXhxjqMHMENlj+SqF5QxoUwaQNFe+8kz8XM8ZQhqkQPTgMQ== + dependencies: + undici-types "~6.21.0" "@types/pg@^8.6.6": version "8.6.6" @@ -1338,11 +1368,6 @@ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.6.0.tgz#efcbd41937f9ae7434c714ab698604822d890759" integrity sha512-G/AdOadiZhnJp0jXCaBQU449W2h716OW/EoXeYkCytxKL06X1WCXB4DZpp8TpZ8eyIJVS1cw4lrlkkSYU21cDw== -"@types/semver@^7.3.12": - version "7.3.13" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" - integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== - "@types/stack-utils@^2.0.0": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" @@ -1360,88 +1385,108 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^5.44.0": - version "5.44.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.44.0.tgz#105788f299050c917eb85c4d9fd04b089e3740de" - integrity sha512-j5ULd7FmmekcyWeArx+i8x7sdRHzAtXTkmDPthE4amxZOWKFK7bomoJ4r7PJ8K7PoMzD16U8MmuZFAonr1ERvw== +"@typescript-eslint/eslint-plugin@^8.29.1": + version "8.41.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.41.0.tgz#42209e2ce3e2274de0f5f9b75c777deedacaa558" + integrity sha512-8fz6oa6wEKZrhXWro/S3n2eRJqlRcIa6SlDh59FXJ5Wp5XRZ8B9ixpJDcjadHq47hMx0u+HW6SNa6LjJQ6NLtw== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "8.41.0" + "@typescript-eslint/type-utils" "8.41.0" + "@typescript-eslint/utils" "8.41.0" + "@typescript-eslint/visitor-keys" "8.41.0" + graphemer "^1.4.0" + ignore "^7.0.0" + natural-compare "^1.4.0" + ts-api-utils "^2.1.0" + +"@typescript-eslint/parser@^8.29.1": + version "8.41.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.41.0.tgz#677f5b2b3fa947ee1eac4129220c051b1990d898" + integrity sha512-gTtSdWX9xiMPA/7MV9STjJOOYtWwIJIYxkQxnSV1U3xcE+mnJSH3f6zI0RYP+ew66WSlZ5ed+h0VCxsvdC1jJg== dependencies: - "@typescript-eslint/scope-manager" "5.44.0" - "@typescript-eslint/type-utils" "5.44.0" - "@typescript-eslint/utils" "5.44.0" - debug "^4.3.4" - ignore "^5.2.0" - natural-compare-lite "^1.4.0" - regexpp "^3.2.0" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/parser@^5.44.0": - version "5.44.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.44.0.tgz#99e2c710a2252191e7a79113264f438338b846ad" - integrity sha512-H7LCqbZnKqkkgQHaKLGC6KUjt3pjJDx8ETDqmwncyb6PuoigYajyAwBGz08VU/l86dZWZgI4zm5k2VaKqayYyA== - dependencies: - "@typescript-eslint/scope-manager" "5.44.0" - "@typescript-eslint/types" "5.44.0" - "@typescript-eslint/typescript-estree" "5.44.0" + "@typescript-eslint/scope-manager" "8.41.0" + "@typescript-eslint/types" "8.41.0" + "@typescript-eslint/typescript-estree" "8.41.0" + "@typescript-eslint/visitor-keys" "8.41.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.44.0": - version "5.44.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.44.0.tgz#988c3f34b45b3474eb9ff0674c18309dedfc3e04" - integrity sha512-2pKml57KusI0LAhgLKae9kwWeITZ7IsZs77YxyNyIVOwQ1kToyXRaJLl+uDEXzMN5hnobKUOo2gKntK9H1YL8g== +"@typescript-eslint/project-service@8.41.0": + version "8.41.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.41.0.tgz#08ebf882d413a038926e73fda36e00c3dba84882" + integrity sha512-b8V9SdGBQzQdjJ/IO3eDifGpDBJfvrNTp2QD9P2BeqWTGrRibgfgIlBSw6z3b6R7dPzg752tOs4u/7yCLxksSQ== dependencies: - "@typescript-eslint/types" "5.44.0" - "@typescript-eslint/visitor-keys" "5.44.0" + "@typescript-eslint/tsconfig-utils" "^8.41.0" + "@typescript-eslint/types" "^8.41.0" + debug "^4.3.4" -"@typescript-eslint/type-utils@5.44.0": - version "5.44.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.44.0.tgz#bc5a6e8a0269850714a870c9268c038150dfb3c7" - integrity sha512-A1u0Yo5wZxkXPQ7/noGkRhV4J9opcymcr31XQtOzcc5nO/IHN2E2TPMECKWYpM3e6olWEM63fq/BaL1wEYnt/w== +"@typescript-eslint/scope-manager@8.41.0": + version "8.41.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.41.0.tgz#c8aba12129cb9cead1f1727f58e6a0fcebeecdb5" + integrity sha512-n6m05bXn/Cd6DZDGyrpXrELCPVaTnLdPToyhBoFkLIMznRUQUEQdSp96s/pcWSQdqOhrgR1mzJ+yItK7T+WPMQ== dependencies: - "@typescript-eslint/typescript-estree" "5.44.0" - "@typescript-eslint/utils" "5.44.0" - debug "^4.3.4" - tsutils "^3.21.0" + "@typescript-eslint/types" "8.41.0" + "@typescript-eslint/visitor-keys" "8.41.0" -"@typescript-eslint/types@5.44.0": - version "5.44.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.44.0.tgz#f3f0b89aaff78f097a2927fe5688c07e786a0241" - integrity sha512-Tp+zDnHmGk4qKR1l+Y1rBvpjpm5tGXX339eAlRBDg+kgZkz9Bw+pqi4dyseOZMsGuSH69fYfPJCBKBrbPCxYFQ== +"@typescript-eslint/tsconfig-utils@8.41.0", "@typescript-eslint/tsconfig-utils@^8.41.0": + version "8.41.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.41.0.tgz#134dee36eb16cdd78095a20bca0516d10b5dda75" + integrity sha512-TDhxYFPUYRFxFhuU5hTIJk+auzM/wKvWgoNYOPcOf6i4ReYlOoYN8q1dV5kOTjNQNJgzWN3TUUQMtlLOcUgdUw== -"@typescript-eslint/typescript-estree@5.44.0": - version "5.44.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.44.0.tgz#0461b386203e8d383bb1268b1ed1da9bc905b045" - integrity sha512-M6Jr+RM7M5zeRj2maSfsZK2660HKAJawv4Ud0xT+yauyvgrsHu276VtXlKDFnEmhG+nVEd0fYZNXGoAgxwDWJw== +"@typescript-eslint/type-utils@8.41.0": + version "8.41.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.41.0.tgz#68d401e38fccf239925447e97bdbd048a9891ae5" + integrity sha512-63qt1h91vg3KsjVVonFJWjgSK7pZHSQFKH6uwqxAH9bBrsyRhO6ONoKyXxyVBzG1lJnFAJcKAcxLS54N1ee1OQ== dependencies: - "@typescript-eslint/types" "5.44.0" - "@typescript-eslint/visitor-keys" "5.44.0" + "@typescript-eslint/types" "8.41.0" + "@typescript-eslint/typescript-estree" "8.41.0" + "@typescript-eslint/utils" "8.41.0" + debug "^4.3.4" + ts-api-utils "^2.1.0" + +"@typescript-eslint/types@8.41.0", "@typescript-eslint/types@^8.41.0": + version "8.41.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.41.0.tgz#9935afeaae65e535abcbcee95383fa649c64d16d" + integrity sha512-9EwxsWdVqh42afLbHP90n2VdHaWU/oWgbH2P0CfcNfdKL7CuKpwMQGjwev56vWu9cSKU7FWSu6r9zck6CVfnag== + +"@typescript-eslint/typescript-estree@8.41.0": + version "8.41.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.41.0.tgz#7c9cff8b4334ce96f14e9689692e8cf426ce4d59" + integrity sha512-D43UwUYJmGhuwHfY7MtNKRZMmfd8+p/eNSfFe6tH5mbVDto+VQCayeAt35rOx3Cs6wxD16DQtIKw/YXxt5E0UQ== + dependencies: + "@typescript-eslint/project-service" "8.41.0" + "@typescript-eslint/tsconfig-utils" "8.41.0" + "@typescript-eslint/types" "8.41.0" + "@typescript-eslint/visitor-keys" "8.41.0" debug "^4.3.4" - globby "^11.1.0" + fast-glob "^3.3.2" is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/utils@5.44.0": - version "5.44.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.44.0.tgz#d733da4d79d6c30f1a68b531cdda1e0c1f00d52d" - integrity sha512-fMzA8LLQ189gaBjS0MZszw5HBdZgVwxVFShCO3QN+ws3GlPkcy9YuS3U4wkT6su0w+Byjq3mS3uamy9HE4Yfjw== - dependencies: - "@types/json-schema" "^7.0.9" - "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.44.0" - "@typescript-eslint/types" "5.44.0" - "@typescript-eslint/typescript-estree" "5.44.0" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" - semver "^7.3.7" - -"@typescript-eslint/visitor-keys@5.44.0": - version "5.44.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.44.0.tgz#10740dc28902bb903d12ee3a005cc3a70207d433" - integrity sha512-a48tLG8/4m62gPFbJ27FxwCOqPKxsb8KC3HkmYoq2As/4YyjQl1jDbRr1s63+g4FS/iIehjmN3L5UjmKva1HzQ== - dependencies: - "@typescript-eslint/types" "5.44.0" - eslint-visitor-keys "^3.3.0" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^2.1.0" + +"@typescript-eslint/utils@8.41.0": + version "8.41.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.41.0.tgz#17cb3b766c1626311004ea41ffd8c27eb226b953" + integrity sha512-udbCVstxZ5jiPIXrdH+BZWnPatjlYwJuJkDA4Tbo3WyYLh8NvB+h/bKeSZHDOFKfphsZYJQqaFtLeXEqurQn1A== + dependencies: + "@eslint-community/eslint-utils" "^4.7.0" + "@typescript-eslint/scope-manager" "8.41.0" + "@typescript-eslint/types" "8.41.0" + "@typescript-eslint/typescript-estree" "8.41.0" + +"@typescript-eslint/visitor-keys@8.41.0": + version "8.41.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.41.0.tgz#16eb99b55d207f6688002a2cf425e039579aa9a9" + integrity sha512-+GeGMebMCy0elMNg67LRNoVnUFPIm37iu5CmHESVx56/9Jsfdpsvbv605DQ81Pi/x11IdKUsS5nzgTYbCQU9fg== + dependencies: + "@typescript-eslint/types" "8.41.0" + eslint-visitor-keys "^4.2.1" + +"@ungap/structured-clone@^1.2.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" + integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== abbrev@1: version "1.1.1" @@ -1477,11 +1522,16 @@ acorn-walk@^8.1.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^8.4.1, acorn@^8.8.0: +acorn@^8.4.1: version "8.8.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== +acorn@^8.9.0: + version "8.15.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" + integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== + agent-base@6, agent-base@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -1506,7 +1556,7 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv@^6.10.0, ajv@^6.12.4: +ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -1593,16 +1643,91 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== +array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b" + integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== + dependencies: + call-bound "^1.0.3" + is-array-buffer "^3.0.5" + +array-includes@^3.1.9: + version "3.1.9" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.9.tgz#1f0ccaa08e90cdbc3eb433210f903ad0f17c3f3a" + integrity sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.4" + define-properties "^1.2.1" + es-abstract "^1.24.0" + es-object-atoms "^1.1.1" + get-intrinsic "^1.3.0" + is-string "^1.1.1" + math-intrinsics "^1.1.0" + +array.prototype.findlastindex@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz#cfa1065c81dcb64e34557c9b81d012f6a421c564" + integrity sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.4" + define-properties "^1.2.1" + es-abstract "^1.23.9" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + es-shim-unscopables "^1.1.0" + +array.prototype.flat@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz#534aaf9e6e8dd79fb6b9a9917f839ef1ec63afe5" + integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" + +array.prototype.flatmap@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz#712cc792ae70370ae40586264629e33aab5dd38b" + integrity sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" + +arraybuffer.prototype.slice@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c" + integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + is-array-buffer "^3.0.4" + +async-function@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-function/-/async-function-1.0.0.tgz#509c9fca60eaf85034c6829838188e4e4c8ffb2b" + integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== atomic-sleep@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + babel-jest@^29.5.0: version "29.5.0" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.5.0.tgz#3fe3ddb109198e78b1c88f9ebdecd5e4fc2f50a5" @@ -1691,6 +1816,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7" + integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== + dependencies: + balanced-match "^1.0.0" + braces@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -1698,6 +1830,13 @@ braces@^3.0.2: dependencies: fill-range "^7.0.1" +braces@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + brorand@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" @@ -1777,6 +1916,32 @@ cacache@^15.2.0: tar "^6.0.2" unique-filename "^1.1.1" +call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + +call-bind@^1.0.7, call-bind@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" + get-intrinsic "^1.2.4" + set-function-length "^1.2.2" + +call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -1953,6 +2118,33 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +data-view-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz#211a03ba95ecaf7798a8c7198d79536211f88570" + integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" + +data-view-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz#9e80f7ca52453ce3e93d25a35318767ea7704735" + integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" + +data-view-byte-offset@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz#068307f9b71ab76dbbe10291389e020856606191" + integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-data-view "^1.0.1" + dataloader@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-2.1.0.tgz#c69c538235e85e7ac6c6c444bae8ecabf5de9df7" @@ -1970,6 +2162,20 @@ debug@4, debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, de dependencies: ms "2.1.2" +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.3.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" + integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== + dependencies: + ms "^2.1.3" + dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" @@ -1985,6 +2191,24 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" @@ -2020,12 +2244,12 @@ diff@^4.0.1: resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: - path-type "^4.0.0" + esutils "^2.0.2" doctrine@^3.0.0: version "3.0.0" @@ -2039,6 +2263,15 @@ dotenv@^16.0.1: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.1.tgz#8f8f9d94876c35dac989876a5d3a82a267fdce1d" integrity sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ== +dunder-proto@^1.0.0, dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + electron-to-chromium@^1.4.118: version "1.4.137" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.137.tgz#186180a45617283f1c012284458510cd99d6787f" @@ -2103,6 +2336,109 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" +es-abstract@^1.23.2, es-abstract@^1.23.5, es-abstract@^1.23.9, es-abstract@^1.24.0: + version "1.24.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.24.0.tgz#c44732d2beb0acc1ed60df840869e3106e7af328" + integrity sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg== + dependencies: + array-buffer-byte-length "^1.0.2" + arraybuffer.prototype.slice "^1.0.4" + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" + data-view-buffer "^1.0.2" + data-view-byte-length "^1.0.2" + data-view-byte-offset "^1.0.1" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + es-set-tostringtag "^2.1.0" + es-to-primitive "^1.3.0" + function.prototype.name "^1.1.8" + get-intrinsic "^1.3.0" + get-proto "^1.0.1" + get-symbol-description "^1.1.0" + globalthis "^1.0.4" + gopd "^1.2.0" + has-property-descriptors "^1.0.2" + has-proto "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + internal-slot "^1.1.0" + is-array-buffer "^3.0.5" + is-callable "^1.2.7" + is-data-view "^1.0.2" + is-negative-zero "^2.0.3" + is-regex "^1.2.1" + is-set "^2.0.3" + is-shared-array-buffer "^1.0.4" + is-string "^1.1.1" + is-typed-array "^1.1.15" + is-weakref "^1.1.1" + math-intrinsics "^1.1.0" + object-inspect "^1.13.4" + object-keys "^1.1.1" + object.assign "^4.1.7" + own-keys "^1.0.1" + regexp.prototype.flags "^1.5.4" + safe-array-concat "^1.1.3" + safe-push-apply "^1.0.0" + safe-regex-test "^1.1.0" + set-proto "^1.0.0" + stop-iteration-iterator "^1.1.0" + string.prototype.trim "^1.2.10" + string.prototype.trimend "^1.0.9" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.3" + typed-array-byte-length "^1.0.3" + typed-array-byte-offset "^1.0.4" + typed-array-length "^1.0.7" + unbox-primitive "^1.1.0" + which-typed-array "^1.1.19" + +es-define-property@^1.0.0, es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== + dependencies: + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +es-shim-unscopables@^1.0.2, es-shim-unscopables@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz#438df35520dac5d105f3943d927549ea3b00f4b5" + integrity sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw== + dependencies: + hasown "^2.0.2" + +es-to-primitive@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz#96c89c82cc49fd8794a24835ba3e1ff87f214e18" + integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== + dependencies: + is-callable "^1.2.7" + is-date-object "^1.0.5" + is-symbol "^1.0.4" + escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -2123,94 +2459,120 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-config-prettier@^8.5.0: - version "8.5.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" - integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== +eslint-config-prettier@^10.1.1: + version "10.1.8" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz#15734ce4af8c2778cc32f0b01b37b0b5cd1ecb97" + integrity sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w== -eslint-plugin-prettier@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" - integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== +eslint-import-resolver-node@^0.3.9: + version "0.3.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== + dependencies: + debug "^3.2.7" + is-core-module "^2.13.0" + resolve "^1.22.4" + +eslint-module-utils@^2.12.1: + version "2.12.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz#f76d3220bfb83c057651359295ab5854eaad75ff" + integrity sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw== + dependencies: + debug "^3.2.7" + +eslint-plugin-import@^2.31.0: + version "2.32.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz#602b55faa6e4caeaa5e970c198b5c00a37708980" + integrity sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA== + dependencies: + "@rtsao/scc" "^1.1.0" + array-includes "^3.1.9" + array.prototype.findlastindex "^1.2.6" + array.prototype.flat "^1.3.3" + array.prototype.flatmap "^1.3.3" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.9" + eslint-module-utils "^2.12.1" + hasown "^2.0.2" + is-core-module "^2.16.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.fromentries "^2.0.8" + object.groupby "^1.0.3" + object.values "^1.2.1" + semver "^6.3.1" + string.prototype.trimend "^1.0.9" + tsconfig-paths "^3.15.0" + +eslint-plugin-prettier@^5.2.6: + version "5.5.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz#9d61c4ea11de5af704d4edf108c82ccfa7f2e61c" + integrity sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg== dependencies: prettier-linter-helpers "^1.0.0" + synckit "^0.11.7" -eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-scope@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" - integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== +eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint-visitor-keys@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" - integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== - -eslint@^8.28.0: - version "8.28.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.28.0.tgz#81a680732634677cc890134bcdd9fdfea8e63d6e" - integrity sha512-S27Di+EVyMxcHiwDrFzk8dJYAaD+/5SoWKxL1ri/71CRHsnJnRDPNt2Kzj24+MT9FDupf4aqqyqPrvI8MvQ4VQ== - dependencies: - "@eslint/eslintrc" "^1.3.3" - "@humanwhocodes/config-array" "^0.11.6" +eslint-visitor-keys@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1" + integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== + +eslint@^8.57.0: + version "8.57.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" + integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.1" + "@humanwhocodes/config-array" "^0.13.0" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" - ajv "^6.10.0" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.3.2" doctrine "^3.0.0" escape-string-regexp "^4.0.0" - eslint-scope "^7.1.1" - eslint-utils "^3.0.0" - eslint-visitor-keys "^3.3.0" - espree "^9.4.0" - esquery "^1.4.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" find-up "^5.0.0" glob-parent "^6.0.2" - globals "^13.15.0" - grapheme-splitter "^1.0.4" + globals "^13.19.0" + graphemer "^1.4.0" ignore "^5.2.0" - import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" is-path-inside "^3.0.3" - js-sdsl "^4.1.4" js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" lodash.merge "^4.6.2" minimatch "^3.1.2" natural-compare "^1.4.0" - optionator "^0.9.1" - regexpp "^3.2.0" + optionator "^0.9.3" strip-ansi "^6.0.1" - strip-json-comments "^3.1.0" text-table "^0.2.0" esm@^3.2.25: @@ -2218,24 +2580,24 @@ esm@^3.2.25: resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== -espree@^9.4.0: - version "9.4.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.1.tgz#51d6092615567a2c2cff7833445e37c28c0065bd" - integrity sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg== +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== dependencies: - acorn "^8.8.0" + acorn "^8.9.0" acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.3.0" + eslint-visitor-keys "^3.4.1" esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== +esquery@^1.4.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== dependencies: estraverse "^5.1.0" @@ -2246,11 +2608,6 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - estraverse@^5.1.0, estraverse@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" @@ -2317,16 +2674,16 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== -fast-glob@^3.2.9: - version "3.2.11" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" - integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== +fast-glob@^3.3.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== 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" + micromatch "^4.0.8" fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" @@ -2376,6 +2733,13 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" @@ -2405,6 +2769,13 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== +for-each@^0.3.3, for-each@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" + integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== + dependencies: + is-callable "^1.2.7" + fs-extra@^10.0.0: version "10.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" @@ -2436,6 +2807,28 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz#e68e1df7b259a5c949eeef95cdbde53edffabb78" + integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + functions-have-names "^1.2.3" + hasown "^2.0.2" + is-callable "^1.2.7" + +functions-have-names@^1.2.3: + version "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" @@ -2475,16 +2868,49 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + function-bind "^1.1.2" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" + get-package-type@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== +get-proto@^1.0.0, get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + get-stream@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== +get-symbol-description@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee" + integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + getopts@2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/getopts/-/getopts-2.3.0.tgz#71e5593284807e03e2427449d4f6712a268666f4" @@ -2521,24 +2947,25 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^13.15.0: - version "13.15.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.15.0.tgz#38113218c907d2f7e98658af246cef8b77e90bac" - integrity sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog== +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== dependencies: type-fest "^0.20.2" -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== +globalthis@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" + define-properties "^1.2.1" + gopd "^1.0.1" + +gopd@^1.0.1, gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.11" @@ -2550,10 +2977,10 @@ graceful-fs@^4.2.6, graceful-fs@^4.2.9: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== -grapheme-splitter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" - integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== graphql-fields@^2.0.3: version "2.0.3" @@ -2573,6 +3000,11 @@ graphql@^16.5.0: resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.5.0.tgz#41b5c1182eaac7f3d47164fb247f61e4dfb69c85" integrity sha512-qbHgh8Ix+j/qY+a/ZcJnFQ+j8ezakqPiHwPiZhV/3PgGlgf96QMBB5/f2rkiC9sgLoy/xvT6TSiaf2nTHJh5iA== +has-bigints@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.1.0.tgz#28607e965ac967e03cd2a2c70a2636a1edad49fe" + integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -2583,6 +3015,32 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5" + integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== + dependencies: + dunder-proto "^1.0.0" + +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + has-unicode@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -2603,6 +3061,13 @@ hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + help-me@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/help-me/-/help-me-5.0.0.tgz#b1ebe63b967b74060027c2ac61f9be12d354a6f6" @@ -2697,7 +3162,12 @@ ignore@^5.2.0: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== -import-fresh@^3.0.0, import-fresh@^3.2.1: +ignore@^7.0.0: + version "7.0.5" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.5.tgz#4cb5f6cd7d4c7ab0365738c7aea888baa6d7efd9" + integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== + +import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -2741,6 +3211,15 @@ inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +internal-slot@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961" + integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.2" + side-channel "^1.1.0" + interpret@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" @@ -2751,11 +3230,58 @@ ip@^2.0.0: resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== +is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280" + integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + get-intrinsic "^1.2.6" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= +is-async-function@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.1.tgz#3e69018c8e04e73b738793d020bfe884b9fd3523" + integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ== + dependencies: + async-function "^1.0.0" + call-bound "^1.0.3" + get-proto "^1.0.1" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" + +is-bigint@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672" + integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== + dependencies: + has-bigints "^1.0.2" + +is-boolean-object@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz#7067f47709809a393c71ff5bb3e135d8a9215d9e" + integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.13.0, is-core-module@^2.16.0, is-core-module@^2.16.1: + version "2.16.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== + dependencies: + hasown "^2.0.2" + is-core-module@^2.8.1: version "2.9.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" @@ -2763,11 +3289,35 @@ is-core-module@^2.8.1: dependencies: has "^1.0.3" +is-data-view@^1.0.1, is-data-view@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e" + integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== + dependencies: + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + is-typed-array "^1.1.13" + +is-date-object@^1.0.5, is-date-object@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.1.0.tgz#ad85541996fc7aa8b2729701d27b7319f95d82f7" + integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== + dependencies: + call-bound "^1.0.2" + has-tostringtag "^1.0.2" + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= +is-finalizationregistry@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz#eefdcdc6c94ddd0674d9c85887bf93f944a97c90" + integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== + dependencies: + call-bound "^1.0.3" + is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" @@ -2778,6 +3328,16 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== +is-generator-function@^1.0.10: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.0.tgz#bf3eeda931201394f57b5dba2800f91a238309ca" + integrity sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ== + dependencies: + call-bound "^1.0.3" + get-proto "^1.0.0" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" + is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -2790,6 +3350,24 @@ is-lambda@^1.0.1: resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== +is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== + +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + +is-number-object@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541" + integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -2800,11 +3378,82 @@ is-path-inside@^3.0.3: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== +is-regex@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" + integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== + dependencies: + call-bound "^1.0.2" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== + +is-shared-array-buffer@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz#9b67844bd9b7f246ba0708c3a93e34269c774f6f" + integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== + dependencies: + call-bound "^1.0.3" + is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== +is-string@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9" + integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-symbol@^1.0.4, is-symbol@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.1.tgz#f47761279f532e2b05a7024a7506dbbedacd0634" + integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== + dependencies: + call-bound "^1.0.2" + has-symbols "^1.1.0" + safe-regex-test "^1.1.0" + +is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: + version "1.1.15" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" + integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== + dependencies: + which-typed-array "^1.1.16" + +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== + +is-weakref@^1.0.2, is-weakref@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.1.tgz#eea430182be8d64174bd96bffbc46f21bf3f9293" + integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew== + dependencies: + call-bound "^1.0.3" + +is-weakset@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.4.tgz#c9f5deb0bc1906c6d6f1027f284ddf459249daca" + integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== + dependencies: + call-bound "^1.0.3" + get-intrinsic "^1.2.6" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -3233,11 +3882,6 @@ joycon@^3.1.1: resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== -js-sdsl@^4.1.4: - version "4.2.0" - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.2.0.tgz#278e98b7bea589b8baaf048c20aeb19eb7ad09d0" - integrity sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ== - js-sha3@0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" @@ -3288,6 +3932,13 @@ json-to-graphql-query@^2.2.4: resolved "https://registry.yarnpkg.com/json-to-graphql-query/-/json-to-graphql-query-2.2.4.tgz#ada9cfdbb9bf38589fd2661e1588d1edd0a882cc" integrity sha512-vNvsOKDSlEqYCzejI1xHS9Hm738dSnG4Upy09LUGqyybZXSIIb7NydDphB/6WxW2EEVpPU4JeU/Yo63Nw9dEJg== +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + json5@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" @@ -3439,12 +4090,17 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.3.0, merge2@^1.4.1: +merge2@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== @@ -3465,6 +4121,14 @@ micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" +micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + mime-db@1.52.0: version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" @@ -3499,6 +4163,18 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + minimist@^1.2.6: version "1.2.6" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" @@ -3573,16 +4249,11 @@ 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.0.0: +ms@^2.0.0, ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -natural-compare-lite@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" - integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== - natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -3692,6 +4363,57 @@ object-hash@^3.0.0: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== +object-inspect@^1.13.3, object-inspect@^1.13.4: + version "1.13.4" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.7: + version "4.1.7" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" + integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + has-symbols "^1.1.0" + object-keys "^1.1.1" + +object.fromentries@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +object.groupby@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + +object.values@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.1.tgz#deed520a50809ff7f75a7cfd4bc64c7a038c6216" + integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + on-exit-leak-free@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-2.1.0.tgz#5c703c968f7e7f851885f6459bf8a8a57edc9cc4" @@ -3711,17 +4433,26 @@ onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" - word-wrap "^1.2.3" + word-wrap "^1.2.5" + +own-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358" + integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== + dependencies: + get-intrinsic "^1.2.6" + object-keys "^1.1.1" + safe-push-apply "^1.0.0" p-limit@^2.2.0: version "2.3.0" @@ -3810,11 +4541,6 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - 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" @@ -3946,6 +4672,11 @@ pluralize@^8.0.0: resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== +possible-typed-array-names@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" + integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== + postgres-array@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" @@ -3980,10 +4711,10 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@^2.7.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" - integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== +prettier@^3.6.2: + version "3.6.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.6.2.tgz#ccda02a1003ebbb2bfda6f83a074978f608b9393" + integrity sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ== pretty-format@^29.0.0, pretty-format@^29.5.0: version "29.5.0" @@ -4084,10 +4815,31 @@ rechoir@^0.8.0: dependencies: resolve "^1.20.0" -regexpp@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== +reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz#c629219e78a3316d8b604c765ef68996964e7bf9" + integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.9" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.7" + get-proto "^1.0.1" + which-builtin-type "^1.2.1" + +regexp.prototype.flags@^1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19" + integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-errors "^1.3.0" + get-proto "^1.0.1" + gopd "^1.2.0" + set-function-name "^2.0.2" require-directory@^2.1.1: version "2.1.1" @@ -4125,6 +4877,15 @@ resolve@^1.20.0: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^1.22.4: + version "1.22.10" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" + integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== + dependencies: + is-core-module "^2.16.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + retry@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" @@ -4161,6 +4922,17 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +safe-array-concat@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz#c9e54ec4f603b0bbb8e7e5007a5ee7aecd1538c3" + integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + has-symbols "^1.1.0" + isarray "^2.0.5" + safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -4171,6 +4943,23 @@ safe-buffer@~5.2.0: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-push-apply@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz#01850e981c1602d398c85081f360e4e6d03d27f5" + integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== + dependencies: + es-errors "^1.3.0" + isarray "^2.0.5" + +safe-regex-test@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" + integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-regex "^1.2.1" + safe-stable-stringify@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.3.1.tgz#ab67cbe1fe7d40603ca641c5e765cb942d04fc73" @@ -4186,7 +4975,7 @@ secure-json-parse@^4.0.0: resolved "https://registry.yarnpkg.com/secure-json-parse/-/secure-json-parse-4.0.0.tgz#2ee1b7581be38ab348bab5a3e49280ba80a89c85" integrity sha512-dxtLJO6sc35jWidmLxo7ij+Eg48PM/kleBsxpC8QJE0qJICe+KawkDQmvCMZUr9u7WKVHgMW6vy3fQ7zMiFZMA== -semver@7.x, semver@^7.3.7: +semver@7.x: version "7.3.7" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== @@ -4198,6 +4987,11 @@ semver@^6.0.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + semver@^7.3.5: version "7.3.8" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" @@ -4205,11 +4999,47 @@ semver@^7.3.5: dependencies: lru-cache "^6.0.0" +semver@^7.6.0: + version "7.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" + integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== + set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== +set-function-length@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + +set-proto@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/set-proto/-/set-proto-1.0.0.tgz#0760dbcff30b2d7e801fd6e19983e56da337565e" + integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== + dependencies: + dunder-proto "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + setprototypeof@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" @@ -4227,6 +5057,46 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + +side-channel@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + side-channel-list "^1.0.0" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" + signal-exit@^3.0.0, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" @@ -4342,6 +5212,14 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= +stop-iteration-iterator@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz#f481ff70a548f6124d0312c3aa14cbfa7aa542ad" + integrity sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ== + dependencies: + es-errors "^1.3.0" + internal-slot "^1.1.0" + string-length@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" @@ -4359,6 +5237,38 @@ string-length@^4.0.1: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string.prototype.trim@^1.2.10: + version "1.2.10" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz#40b2dd5ee94c959b4dcfb1d65ce72e90da480c81" + integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + define-data-property "^1.1.4" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-object-atoms "^1.0.0" + has-property-descriptors "^1.0.2" + +string.prototype.trimend@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz#62e2731272cd285041b36596054e9f66569b6942" + integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -4373,6 +5283,11 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + strip-bom@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" @@ -4383,7 +5298,7 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -4419,6 +5334,13 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +synckit@^0.11.7: + version "0.11.11" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.11.11.tgz#c0b619cf258a97faa209155d9cd1699b5c998cb0" + integrity sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw== + dependencies: + "@pkgr/core" "^0.2.9" + tar@^6.0.2, tar@^6.1.11, tar@^6.1.2: version "6.1.13" resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.13.tgz#46e22529000f612180601a6fe0680e7da508847b" @@ -4494,6 +5416,11 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +ts-api-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.1.0.tgz#595f7094e46eed364c13fd23e75f9513d29baf91" + integrity sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ== + ts-essentials@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-7.0.3.tgz#686fd155a02133eedcc5362dc8b5056cde3e5a38" @@ -4532,10 +5459,15 @@ ts-node@^10.9.1: v8-compile-cache-lib "^3.0.1" yn "3.1.1" -tslib@^1.8.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +tsconfig-paths@^3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" tslib@^2.0.1: version "2.4.1" @@ -4547,13 +5479,6 @@ tslib@^2.4.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -4576,16 +5501,76 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -typescript@^4.9.3: - version "4.9.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.3.tgz#3aea307c1746b8c384435d8ac36b8a2e580d85db" - integrity sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA== +typed-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" + integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-typed-array "^1.1.14" + +typed-array-byte-length@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz#8407a04f7d78684f3d252aa1a143d2b77b4160ce" + integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== + dependencies: + call-bind "^1.0.8" + for-each "^0.3.3" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.14" + +typed-array-byte-offset@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz#ae3698b8ec91a8ab945016108aef00d5bff12355" + integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + for-each "^0.3.3" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.15" + reflect.getprototypeof "^1.0.9" + +typed-array-length@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d" + integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + reflect.getprototypeof "^1.0.6" typescript@^4.9.5: version "4.9.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== +typescript@^5.9.2: + version "5.9.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.2.tgz#d93450cddec5154a2d5cabe3b8102b83316fb2a6" + integrity sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A== + +unbox-primitive@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2" + integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== + dependencies: + call-bound "^1.0.3" + has-bigints "^1.0.2" + has-symbols "^1.1.0" + which-boxed-primitive "^1.1.1" + +undici-types@~6.21.0: + version "6.21.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb" + integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== + unique-filename@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" @@ -4679,6 +5664,59 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" +which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e" + integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== + dependencies: + is-bigint "^1.1.0" + is-boolean-object "^1.2.1" + is-number-object "^1.1.1" + is-string "^1.1.1" + is-symbol "^1.1.1" + +which-builtin-type@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz#89183da1b4907ab089a6b02029cc5d8d6574270e" + integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== + dependencies: + call-bound "^1.0.2" + function.prototype.name "^1.1.6" + has-tostringtag "^1.0.2" + is-async-function "^2.0.0" + is-date-object "^1.1.0" + is-finalizationregistry "^1.1.0" + is-generator-function "^1.0.10" + is-regex "^1.2.1" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.1.0" + which-collection "^1.0.2" + which-typed-array "^1.1.16" + +which-collection@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== + dependencies: + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" + +which-typed-array@^1.1.16, which-typed-array@^1.1.19: + version "1.1.19" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.19.tgz#df03842e870b6b88e117524a4b364b6fc689f956" + integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" + for-each "^0.3.5" + get-proto "^1.0.1" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + which@^2.0.1, which@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -4693,10 +5731,10 @@ wide-align@^1.1.2, wide-align@^1.1.5: dependencies: string-width "^1.0.2 || 2 || 3 || 4" -word-wrap@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== wrap-ansi@^7.0.0: version "7.0.0"