diff --git a/src/config/events.json b/config/events.json similarity index 100% rename from src/config/events.json rename to config/events.json diff --git a/package.json b/package.json index 30636b8..ddae9af 100644 --- a/package.json +++ b/package.json @@ -54,21 +54,20 @@ }, "devDependencies": { "@types/dotenv": "^8.2.0", - "@types/node": "^14.14.20", + "@types/node": "^16.18.68", "@types/node-fetch": "2.x", "@types/node-schedule": "^2.1.0", "@types/nodemailer": "^6.4.7", "@types/redis": "^2.8.28", - "@typescript-eslint/eslint-plugin": "^4.25.0", - "@typescript-eslint/parser": "^4.25.0", - "eslint": "^7.27.0", - "eslint-config-prettier": "^8.3.0", - "eslint-plugin-prettier": "^3.4.0", - "prettier": "^2.3.0", + "@typescript-eslint/eslint-plugin": "^6.19.0", + "@typescript-eslint/parser": "^6.19.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.1.3", + "prettier": "^3.2.4", "ts-node": "^10.9.1", "ts-node-dev": "^2.0.0", "tsconfig-paths": "^3.9.0", "tslint": "^6.1.1", - "typescript": "^4.1.3" + "typescript": "^5.3.3" } } diff --git a/src/chain/chain.api.ts b/src/chain/chain.api.ts index 8470250..8d4cfaf 100644 --- a/src/chain/chain.api.ts +++ b/src/chain/chain.api.ts @@ -1,4 +1,4 @@ -import fetch, {Response} from "node-fetch" +import fetch, { Response } from 'node-fetch' import { retry } from 'utils/promise.util' // AbortController was added in node v14.17.0 globally const AbortController = globalThis.AbortController @@ -6,36 +6,35 @@ const AbortController = globalThis.AbortController const request = async (url: string, options: any) => { const controller = new AbortController() const timeout = setTimeout(() => controller.abort(), 30000) - let res: Response; + let res: Response try { res = await fetch(url, { ...options, signal: controller.signal }) clearTimeout(timeout) } catch (err) { clearTimeout(timeout) - throw err; + throw err } return res } -const requestChain = async (rpc: string, method: string, params: any) => { +const requestChain = async (rpc: string, method: string, params: any) => { const data = { id: Date.now(), - jsonrpc: "2.0", + jsonrpc: '2.0', method, - params + params, } return request(rpc, { - method: "POST", + method: 'POST', headers: { - "Content-Type": "application/json; charset=utf-8" + 'Content-Type': 'application/json; charset=utf-8', }, - body: JSON.stringify(data) - }) - .then((res) => res.json()) + body: JSON.stringify(data), + }).then(res => res.json()) } export const ethBlockNumber = async (rpc: string) => { - return requestChain(rpc, "eth_blockNumber", []) + return requestChain(rpc, 'eth_blockNumber', []) } export const retryEthBlockNumber = async (rpc: string) => { @@ -47,61 +46,58 @@ export const retryEthBlockNumber = async (rpc: string) => { } export const ethGetBlockByNumber = async (rpc: string, blockNumber: string) => { - return requestChain(rpc, "eth_getBlockByNumber", [blockNumber, true]) + return requestChain(rpc, 'eth_getBlockByNumber', [blockNumber, true]) } export const ethGetLogs = async (rpc: string, params: any) => { - return requestChain(rpc, "eth_getLogs", params) + return requestChain(rpc, 'eth_getLogs', params) } export const _batchEthBlocks = async (rpc: string, blockNumber: number, amount: number) => { let batch = [] for (let i = 0; i < amount; i++) { batch.push({ - jsonrpc: "2.0", - method: "eth_getBlockByNumber", - params: ["0x" + (blockNumber + i).toString(16), true], - id: blockNumber + i + jsonrpc: '2.0', + method: 'eth_getBlockByNumber', + params: ['0x' + (blockNumber + i).toString(16), true], + id: blockNumber + i, }) } - return request(rpc, { - method: "POST", + return request(rpc, { + method: 'POST', headers: { - "Content-Type": "application/json; charset=utf-8" + 'Content-Type': 'application/json; charset=utf-8', }, - body: JSON.stringify(batch) - }) - .then((res) => res.json()) + body: JSON.stringify(batch), + }).then(res => res.json()) } export const batchEthBlocks = async (rpc: string, blockNumbers: number[]) => { let batch = [] for (let blockNum of blockNumbers) { batch.push({ - jsonrpc: "2.0", - method: "eth_getBlockByNumber", - params: ["0x" + blockNum.toString(16), true], - id: blockNum + jsonrpc: '2.0', + method: 'eth_getBlockByNumber', + params: ['0x' + blockNum.toString(16), true], + id: blockNum, }) } - + return request(rpc, { - method: "POST", + method: 'POST', headers: { - "Content-Type": "application/json; charset=utf-8" + 'Content-Type': 'application/json; charset=utf-8', }, - body: JSON.stringify(batch) - }) - .then((res) => res.json()) + body: JSON.stringify(batch), + }).then(res => res.json()) } export const batchEthLogs = async (rpc: string, params: any) => { return request(rpc, { - method: "POST", + method: 'POST', headers: { - "Content-Type": "application/json; charset=utf-8" + 'Content-Type': 'application/json; charset=utf-8', }, - body: JSON.stringify(params) - }) - .then((res) => res.json()) + body: JSON.stringify(params), + }).then(res => res.json()) } diff --git a/src/controllers/task.controllers.ts b/src/controllers/task.controllers.ts index ffbb333..95347aa 100644 --- a/src/controllers/task.controllers.ts +++ b/src/controllers/task.controllers.ts @@ -5,7 +5,6 @@ import { CheckIn } from 'models/CheckIn' import { NftHolder } from 'models/NftHolder' import { getMonthBegin, getNDayAgo } from 'utils/date.util' - class TaskController extends BaseController { @role('anon') @router('post /task/check_in') @@ -18,23 +17,23 @@ class TaskController extends BaseController { if (!limit) { if (typeof days === 'number') { let begin = getNDayAgo(days, true) - query.blockTime = {$gt: begin.getTime() / 1000 | 0} + query.blockTime = { $gt: (begin.getTime() / 1000) | 0 } } else if (typeof days === 'string') { if (days === '1month') { let date = getMonthBegin(new Date()) - query.blockTime = {$gt: date.getTime() / 1000 | 0} + query.blockTime = { $gt: (date.getTime() / 1000) | 0 } } else { query.dateTag = days } } else if (Array.isArray(days)) { - query.dateTag = {$in: days} + query.dateTag = { $in: days } } } let records if (limit) { - records = await CheckIn.find(query).sort({_id: -1}).limit(limit) + records = await CheckIn.find(query).sort({ _id: -1 }).limit(limit) } else { - records = await CheckIn.find(query).sort({_id: -1}) + records = await CheckIn.find(query).sort({ _id: -1 }) } let result = [] for (let record of records) { @@ -42,7 +41,7 @@ class TaskController extends BaseController { } return result } - + @role('anon') @router('post /task/check_in/max_seq') async maxSeqCheckin(req, res) { @@ -50,7 +49,7 @@ class TaskController extends BaseController { if (!address) { throw new ZError(10, 'params mismatch') } - const record = await CheckIn.findOne({from: address.toLowerCase()}).sort({count: -1}) + const record = await CheckIn.findOne({ from: address.toLowerCase() }).sort({ count: -1 }) return record.toJson() } @@ -64,7 +63,7 @@ class TaskController extends BaseController { address = address.toLowerCase() user = user.toLowerCase() - let records = await NftHolder.find({address, chain, user, burn: true }).sort({blockNumber: -1}) + let records = await NftHolder.find({ address, chain, user, burn: true }).sort({ blockNumber: -1 }) let result = [] for (let record of records) { result.push({ @@ -74,7 +73,7 @@ class TaskController extends BaseController { tokenId: record.tokenId, }) } - return result; + return result } } export default TaskController diff --git a/src/events.ts b/src/events.ts index ee50431..eee70c8 100644 --- a/src/events.ts +++ b/src/events.ts @@ -14,13 +14,12 @@ import { IEventCfg } from 'interface/IEventCfg' let svrs: any[] = [] let lock = false - async function initEventSvrs() { - const cfgMap: Map = new Map(); + const cfgMap: Map = new Map() for (let cfg of events) { cfg.address = cfg.address.toLowerCase() cfg.abi = require(`../config/event_abis/${cfg.abi}.json`) - const chainCfg = AllChains.find((chain) => chain.id === cfg.chain) + const chainCfg = AllChains.find(chain => chain.id === cfg.chain) if (!chainCfg) { logger.error('chainCfg not found: ' + cfg.chain) process.exit(1) @@ -42,12 +41,12 @@ async function parseAllEvents() { return } lock = true - logger.info('begin sync events: ' + svrs.map((svr) => svr.chainCfg.id).join(',') ) + logger.info('begin sync events: ' + svrs.map(svr => svr.chainCfg.id).join(',')) for (let svr of svrs) { try { await svr.execute() } catch (err) { - logger.info('sync events error:: chain: ' + svr.chainCfg.id ) + logger.info('sync events error:: chain: ' + svr.chainCfg.id) logger.info(err) } } @@ -63,5 +62,4 @@ async function parseAllEvents() { parseAllEvents() }, 10000) parseAllEvents() -})(); - +})() diff --git a/src/interface/IEventCfg.ts b/src/interface/IEventCfg.ts index 561daa6..30ec788 100644 --- a/src/interface/IEventCfg.ts +++ b/src/interface/IEventCfg.ts @@ -1,9 +1,9 @@ export interface IEventCfg { - address: string, - event: string, - abi: any, - fromBlock: number, - eventProcesser?: string, - chain: number, - topic?: string, -} \ No newline at end of file + address: string + event: string + abi: any + fromBlock: number + eventProcesser?: string + chain: number + topic?: string +} diff --git a/src/interface/IScriptionCfg.ts b/src/interface/IScriptionCfg.ts index 6b50058..1a9c3c7 100644 --- a/src/interface/IScriptionCfg.ts +++ b/src/interface/IScriptionCfg.ts @@ -10,7 +10,7 @@ export enum FilterEnum { like = 'like', nlike = 'nlike', isNull = 'isNull', - isNotNull = 'isNotNull' + isNotNull = 'isNotNull', } export enum FilterValueTypeEnum { @@ -19,20 +19,20 @@ export enum FilterValueTypeEnum { boolean = 'boolean', utf8_data = 'utf8_data', hex_data = 'hex_data', - address = 'address' + address = 'address', } export interface IFilter { - key: string, - type: string, - value: string, + key: string + type: string + value: string op: FilterEnum } export interface IScriptionCfg { - chain: number, - rpc?: string, - fromBlock: number, - filters?: IFilter[], - filter: (event: any) => boolean, - process: (event: any) => Promise, -} \ No newline at end of file + chain: number + rpc?: string + fromBlock: number + filters?: IFilter[] + filter: (event: any) => boolean + process: (event: any) => Promise +} diff --git a/src/models/BlockData.ts b/src/models/BlockData.ts index a3e120d..dd404fd 100644 --- a/src/models/BlockData.ts +++ b/src/models/BlockData.ts @@ -14,11 +14,11 @@ export class BlockDataClass extends BaseModule { @prop() public chainId: number - @prop({ type: mongoose.Schema.Types.Mixed}) + @prop({ type: mongoose.Schema.Types.Mixed }) public data: any public static async saveBlock(event: any) { - return BlockData.insertOrUpdate({ hash: event.hash }, {data: event}) + return BlockData.insertOrUpdate({ hash: event.hash }, { data: event }) } } diff --git a/src/models/CheckIn.ts b/src/models/CheckIn.ts index 27cfdfc..2d547c1 100644 --- a/src/models/CheckIn.ts +++ b/src/models/CheckIn.ts @@ -7,8 +7,8 @@ import { logger } from '@typegoose/typegoose/lib/logSettings' @dbconn() @index({ from: 1 }, { unique: false }) @index({ hash: 1 }, { unique: true }) -@index({ from: 1, dateTag: 1}, { unique: true }) -@index({ from: 1, blockTime: 1}, { unique: false }) +@index({ from: 1, dateTag: 1 }, { unique: true }) +@index({ from: 1, blockTime: 1 }, { unique: false }) @modelOptions({ schemaOptions: { collection: 'check_in_event', timestamps: true }, }) @@ -28,7 +28,7 @@ export class CheckInClass extends BaseModule { @prop() public dateTag: string // 连签天数 - @prop({default: 0}) + @prop({ default: 0 }) public count: number @prop() public value: string @@ -36,7 +36,7 @@ export class CheckInClass extends BaseModule { public input: string public static async saveEvent(event: any) { - const preDay = formatDate(yesterday()); + const preDay = formatDate(yesterday()) const preDayEvent = await CheckIn.findOne({ from: event.from, dateTag: preDay }) if (preDayEvent) { event.count = preDayEvent.count + 1 @@ -49,12 +49,12 @@ export class CheckInClass extends BaseModule { } public toJson() { - return { - address: this.from, - day: this.dateTag, - time: this.blockTime, - count: this.count - } + return { + address: this.from, + day: this.dateTag, + time: this.blockTime, + count: this.count, + } } } diff --git a/src/models/FtTransferEvent.ts b/src/models/FtTransferEvent.ts index ef2b33a..82fe4ee 100644 --- a/src/models/FtTransferEvent.ts +++ b/src/models/FtTransferEvent.ts @@ -5,7 +5,7 @@ import { TokenHolder } from './TokenHolder' @dbconn() @index({ address: 1 }, { unique: false }) -@index({ chain: 1, hash: 1, logIndex: 1}, { unique: true }) +@index({ chain: 1, hash: 1, logIndex: 1 }, { unique: true }) @modelOptions({ schemaOptions: { collection: 'ft_transfer_event', timestamps: true }, }) @@ -45,7 +45,7 @@ export class FtTransferEventClass extends BaseModule { if (amount == undefined) { return } - + const logIndex = parseInt(event.logIndex || '0') const from = event.decodedData.from.toLowerCase() const to = event.decodedData.to.toLowerCase() @@ -59,10 +59,10 @@ export class FtTransferEventClass extends BaseModule { amount, $inc: { version: 1 }, } - - let record = await FtTransferEvent.insertOrUpdate({ hash, logIndex, chain: event.chain }, data) + + let record = await FtTransferEvent.insertOrUpdate({ hash, logIndex, chain: event.chain }, data) await TokenHolder.saveData(record) - } + } } export const FtTransferEvent = getModelForClass(FtTransferEventClass, { diff --git a/src/models/GeneralEvent.ts b/src/models/GeneralEvent.ts index 86bb7f7..1447c34 100644 --- a/src/models/GeneralEvent.ts +++ b/src/models/GeneralEvent.ts @@ -4,7 +4,7 @@ import { BaseModule } from './Base' import { NftHolder } from './NftHolder' @dbconn() -@index({ chain: 1, hash: 1, logIndex: 1}, { unique: true }) +@index({ chain: 1, hash: 1, logIndex: 1 }, { unique: true }) @modelOptions({ schemaOptions: { collection: 'general_event', timestamps: true }, options: { allowMixed: Severity.ALLOW }, @@ -28,15 +28,14 @@ export class GeneralEventClass extends BaseModule { @prop() public removed: boolean - @prop({ type: mongoose.Schema.Types.Mixed}) + @prop({ type: mongoose.Schema.Types.Mixed }) public decodedData: any - + @prop() public blockTime: number @prop({ default: 0 }) public version: number - public static async saveEvent(event: any) { const logIndex = parseInt(event.logIndex || '0') const hash = event.hash || event.transactionHash @@ -49,8 +48,8 @@ export class GeneralEventClass extends BaseModule { event: event.event, $inc: { version: 1 }, } - - let record = await GeneralEvent.insertOrUpdate({ hash, logIndex, chain: event.chain }, data) + + let record = await GeneralEvent.insertOrUpdate({ hash, logIndex, chain: event.chain }, data) return record } } diff --git a/src/models/NftHolder.ts b/src/models/NftHolder.ts index c10d63d..26ee60c 100644 --- a/src/models/NftHolder.ts +++ b/src/models/NftHolder.ts @@ -21,14 +21,14 @@ export class NftHolderClass extends BaseModule { public blockNumber: number @prop() public user: string - @prop({default: false}) + @prop({ default: false }) public burn: boolean public static async parseEvent(event: typeof GeneralEvent) { - const address = event.address.toLowerCase(); - const chain = event.chain; - const tokenId = event.decodedData.tokenId; - const blockNumer = event.blockNumber; + const address = event.address.toLowerCase() + const chain = event.chain + const tokenId = event.decodedData.tokenId + const blockNumer = event.blockNumber const burn = event.decodedData.to === ZERO_ADDRESS let user = (burn ? event.decodedData.from : event.decodedData.to).toLowerCase() user = user.toLowerCase() @@ -42,7 +42,7 @@ export class NftHolderClass extends BaseModule { record.blockNumber = blockNumer } } - await record.save(); + await record.save() } } diff --git a/src/models/NftStake.ts b/src/models/NftStake.ts index 090112d..99f2422 100644 --- a/src/models/NftStake.ts +++ b/src/models/NftStake.ts @@ -4,13 +4,12 @@ import { BaseModule } from './Base' import logger from 'logger/logger' import { GeneralEvent } from './GeneralEvent' - const STAKE_EVENT = 'Staked' const REDEEM_EVENT = 'Redeem' @dbconn() -@index({ chain: 1, nft: 1, tokenId: 1, start: 1 }, { unique: true }) -@index({ chain:1, user: 1, nft: 1}, {unique: false}) +@index({ chain: 1, nft: 1, tokenId: 1, start: 1 }, { unique: true }) +@index({ chain: 1, user: 1, nft: 1 }, { unique: false }) @modelOptions({ schemaOptions: { collection: 'nft_stake_info', timestamps: true }, }) @@ -42,7 +41,6 @@ export class NftStakeClass extends BaseModule { @prop({ default: 0 }) public version: number - /** * { @@ -75,30 +73,31 @@ export class NftStakeClass extends BaseModule { stakeTime = parseInt(stakeTime) if (isStake) { logger.info(`stake nft: ${nft}, tokenId: ${tokenId}, user: ${user}, blockNumber: ${blockNumber}`) - let record = new NftStake({ + let record = new NftStake({ address, - chain, - nft, - tokenId, - user, - blockNumber, - status: 1, + chain, + nft, + tokenId, + user, + blockNumber, + status: 1, start, - stakeTime + stakeTime, }) await record.save() } else { logger.info(`redeem nft: ${nft}, tokenId: ${tokenId}, user: ${user}, blockNumber: ${blockNumber}`) await NftStake.insertOrUpdate( - { chain, nft, tokenId, start}, - { - status: 2, + { chain, nft, tokenId, start }, + { + status: 2, address, user, - redeemTime: Date.now() / 1000 | 0, + redeemTime: (Date.now() / 1000) | 0, blockNumber, $inc: { version: 1 }, - }) + }, + ) } } } diff --git a/src/models/NftTransferEvent.ts b/src/models/NftTransferEvent.ts index 315b1cb..2168b20 100644 --- a/src/models/NftTransferEvent.ts +++ b/src/models/NftTransferEvent.ts @@ -6,7 +6,7 @@ import { NftHolder } from './NftHolder' @dbconn() @index({ chain: 1, address: 1, tokenId: 1 }, { unique: false }) @index({ chain: 1, address: 1, from: 1, to: 1 }, { unique: false }) -@index({ chain: 1, hash: 1, logIndex: 1}, { unique: true }) +@index({ chain: 1, hash: 1, logIndex: 1 }, { unique: true }) @modelOptions({ schemaOptions: { collection: 'nft_transfer_event', timestamps: true }, }) @@ -57,8 +57,8 @@ export class NftTransferEventClass extends BaseModule { // blockTime: new Date(event.time).getTime(), $inc: { version: 1 }, } - - await NftTransferEvent.insertOrUpdate({ hash, logIndex, chain: event.chain }, data) + + await NftTransferEvent.insertOrUpdate({ hash, logIndex, chain: event.chain }, data) } } diff --git a/src/models/TokenHolder.ts b/src/models/TokenHolder.ts index f6c33b8..b575455 100644 --- a/src/models/TokenHolder.ts +++ b/src/models/TokenHolder.ts @@ -10,7 +10,6 @@ import { ZERO_ADDRESS } from 'common/Constants' schemaOptions: { collection: 'token_holder', timestamps: true }, }) export class TokenHolderClass extends BaseModule { - @prop({ required: true }) public chain: string @@ -26,11 +25,10 @@ export class TokenHolderClass extends BaseModule { @prop() public blockNumber: number - public static async parseEvent(event: typeof GeneralEvent) { - const address = event.address.toLowerCase(); - const chain = event.chain; - const blockNumber = event.blockNumber; + const address = event.address.toLowerCase() + const chain = event.chain + const blockNumber = event.blockNumber let { from, to, value } = event.decodedData from = from.toLowerCase() to = to.toLowerCase() @@ -40,7 +38,7 @@ export class TokenHolderClass extends BaseModule { record.amount = BigInt(record.amount) - BigInt(value) record.blockNumber = blockNumber } - await record.save(); + await record.save() } if (to !== ZERO_ADDRESS) { let record = await TokenHolder.findOne({ address, chain, user: to }) @@ -50,7 +48,7 @@ export class TokenHolderClass extends BaseModule { record.amount = BigInt(record.amount) + BigInt(value) record.blockNumber = blockNumber } - await record.save(); + await record.save() } } } diff --git a/src/monitor.ts b/src/monitor.ts index 301df11..d1c114e 100644 --- a/src/monitor.ts +++ b/src/monitor.ts @@ -17,7 +17,7 @@ let eventProcessers = { FtTransferEvent: FtTransferEvent, } -const events = require('config/events.json') +const events = require('../config/events.json') async function initEventSvrs() { for (let event of events) { diff --git a/src/scriptions.ts b/src/scriptions.ts index c28c024..74ad871 100644 --- a/src/scriptions.ts +++ b/src/scriptions.ts @@ -20,7 +20,7 @@ let eventProcessers = { } async function initEventSvrs() { - const cfgMap: Map = new Map(); + const cfgMap: Map = new Map() for (let cfg of scriptions) { if (!cfg.filter && cfg.filters) { cfg.filter = buildScriptionFilters(cfg) @@ -33,7 +33,7 @@ async function initEventSvrs() { } await processer.saveEvent(event) } - const chainCfg = AllChains.find((chain) => chain.id === cfg.chain) + const chainCfg = AllChains.find(chain => chain.id === cfg.chain) if (!chainCfg) { logger.error('chainCfg not found: ' + cfg.chain) process.exit(1) @@ -55,12 +55,12 @@ async function parseAllEvents() { return } lock = true - logger.info('begin sync block: ' + svrs.map((svr) => svr.chainCfg.id).join(',')) + logger.info('begin sync block: ' + svrs.map(svr => svr.chainCfg.id).join(',')) for (let svr of svrs) { try { await svr.execute() } catch (err) { - logger.info('sync block with error:: chain: ' + svr.chainCfg.id ) + logger.info('sync block with error:: chain: ' + svr.chainCfg.id) logger.info(err) } } @@ -76,5 +76,4 @@ async function parseAllEvents() { parseAllEvents() }, 20000) parseAllEvents() -})(); - +})() diff --git a/src/service/block.sync.service.ts b/src/service/block.sync.service.ts index 0d1b152..125c92e 100644 --- a/src/service/block.sync.service.ts +++ b/src/service/block.sync.service.ts @@ -1,11 +1,10 @@ -import { IChain } from "chain/allchain"; -import { retryEthBlockNumber } from "chain/chain.api"; -import { IScriptionCfg } from "interface/IScriptionCfg"; -import logger from "logger/logger"; -import { RedisClient } from "redis/RedisClient"; -import { getPastBlocksIter } from "utils/block.util"; -import { formatDate } from "utils/date.util"; - +import { IChain } from 'chain/allchain' +import { retryEthBlockNumber } from 'chain/chain.api' +import { IScriptionCfg } from 'interface/IScriptionCfg' +import logger from 'logger/logger' +import { RedisClient } from 'redis/RedisClient' +import { getPastBlocksIter } from 'utils/block.util' +import { formatDate } from 'utils/date.util' export class BlockSyncSvr { chainCfg: IChain @@ -13,9 +12,9 @@ export class BlockSyncSvr { fromBlock: number = Number.MAX_SAFE_INTEGER batchCount: number = 0 redisKey = '' - rpc = ''; + rpc = '' constructor(_chainCfg: IChain, _scriptionCfgs: IScriptionCfg[]) { - this.chainCfg =_chainCfg + this.chainCfg = _chainCfg this.scriptionCfgs = _scriptionCfgs this.rpc = _chainCfg.rpc.split('|')[0] for (let cfg of _scriptionCfgs) { @@ -28,22 +27,22 @@ export class BlockSyncSvr { } async execute() { - let currentBlock = await retryEthBlockNumber(this.rpc) - let blockStr = await new RedisClient().get(this.redisKey) - if (blockStr) { - this.fromBlock = Math.max(parseInt(blockStr), this.fromBlock) - } - this.batchCount = parseInt(currentBlock.result, 16) - this.fromBlock - if (this.batchCount <= 0) { - return - } - let blocks = getPastBlocksIter({ - chainId: this.chainCfg.id, - rpc: this.rpc, - fromBlock: this.fromBlock, - amount: this.batchCount - }) - await this.processBlockDatas(blocks) + let currentBlock = await retryEthBlockNumber(this.rpc) + let blockStr = await new RedisClient().get(this.redisKey) + if (blockStr) { + this.fromBlock = Math.max(parseInt(blockStr), this.fromBlock) + } + this.batchCount = parseInt(currentBlock.result, 16) - this.fromBlock + if (this.batchCount <= 0) { + return + } + let blocks = getPastBlocksIter({ + chainId: this.chainCfg.id, + rpc: this.rpc, + fromBlock: this.fromBlock, + amount: this.batchCount, + }) + await this.processBlockDatas(blocks) } async processBlockDatas(iterator: any) { @@ -57,21 +56,21 @@ export class BlockSyncSvr { continue } for (let i = 0; i < block.transactions.length; i++) { - const tx = block.transactions[i]; + const tx = block.transactions[i] if (block.timestamp) { - tx.blockTime = parseInt(block.timestamp, 16); - tx.dateTag = formatDate(new Date(tx.blockTime * 1000)); + tx.blockTime = parseInt(block.timestamp, 16) + tx.dateTag = formatDate(new Date(tx.blockTime * 1000)) } for (let j = 0; j < this.scriptionCfgs.length; j++) { - const cfg = this.scriptionCfgs[j]; + const cfg = this.scriptionCfgs[j] - if (cfg.filter && cfg.filter(tx) ) { + if (cfg.filter && cfg.filter(tx)) { try { await cfg.process(tx) } catch (err) { logger.error('process tx error: ', err.message || err) } - } + } } } } diff --git a/src/service/chain.service.ts b/src/service/chain.service.ts index 88d5f97..a9ce27b 100644 --- a/src/service/chain.service.ts +++ b/src/service/chain.service.ts @@ -14,4 +14,4 @@ export async function restartAllUnFinishedTask() { chainQueue.addTaskToQueue(subTask) } } -} \ No newline at end of file +} diff --git a/src/service/event.batch.service.ts b/src/service/event.batch.service.ts index cd0ec1d..9aeee58 100644 --- a/src/service/event.batch.service.ts +++ b/src/service/event.batch.service.ts @@ -1,20 +1,20 @@ -import { IChain } from "chain/allchain"; -import { batchEthLogs, ethGetLogs, retryEthBlockNumber } from "chain/chain.api"; -import logger from "logger/logger"; -import { GeneralEvent } from "models/GeneralEvent"; +import { IChain } from 'chain/allchain' +import { batchEthLogs, ethGetLogs, retryEthBlockNumber } from 'chain/chain.api' +import logger from 'logger/logger' +import { GeneralEvent } from 'models/GeneralEvent' -import { RedisClient } from "redis/RedisClient"; -import { decodeEvent, getTopics } from "utils/event.util"; +import { RedisClient } from 'redis/RedisClient' +import { decodeEvent, getTopics } from 'utils/event.util' import { NftHolder } from 'models/NftHolder' import { TokenHolder } from 'models/TokenHolder' import { NftStake } from 'models/NftStake' -import { IEventCfg } from "interface/IEventCfg"; +import { IEventCfg } from 'interface/IEventCfg' let eventProcessers = { NftHolder: NftHolder, TokenHolder: TokenHolder, - NftStake: NftStake + NftStake: NftStake, } export class EventBatchSvr { @@ -23,9 +23,9 @@ export class EventBatchSvr { processer: Map = new Map() fromBlock: number = Number.MAX_SAFE_INTEGER redisKey = '' - rpc = ''; + rpc = '' constructor(_chainCfg: IChain, _eventCfgs: IEventCfg[]) { - this.chainCfg =_chainCfg + this.chainCfg = _chainCfg this.eventCfgs = _eventCfgs this.rpc = _chainCfg.rpc.split('|')[0] for (let cfg of this.eventCfgs) { @@ -33,82 +33,81 @@ export class EventBatchSvr { if (!cfg.topic) { cfg.topic = getTopics(cfg) } - this.processer.set((cfg.address+cfg.topic).toLowerCase(), cfg) + this.processer.set((cfg.address + cfg.topic).toLowerCase(), cfg) } this.eventCfgs.sort((a, b) => a.topic.localeCompare(b.topic)) this.redisKey = `event_${this.chainCfg.id}` } async execute() { - - let currentBlock = await retryEthBlockNumber(this.rpc) - let toBlock = parseInt(currentBlock.result, 16) - let blockStr = await new RedisClient().get(this.redisKey) - if (blockStr) { - this.fromBlock = Math.max(parseInt(blockStr), this.fromBlock) - } - logger.info(`sync events with chain: ${this.chainCfg.id}, from: ${this.fromBlock}, to: ${toBlock}`) - let params = [] - let uninParams = [] - let topicsSet = new Set() - for (let cfg of this.eventCfgs) { - await this.fixBlockNumber(cfg); - if (cfg.fromBlock != this.fromBlock) { - let _param = this.buildQueryParams(cfg, toBlock) - params.push(_param) + let currentBlock = await retryEthBlockNumber(this.rpc) + let toBlock = parseInt(currentBlock.result, 16) + let blockStr = await new RedisClient().get(this.redisKey) + if (blockStr) { + this.fromBlock = Math.max(parseInt(blockStr), this.fromBlock) + } + logger.info(`sync events with chain: ${this.chainCfg.id}, from: ${this.fromBlock}, to: ${toBlock}`) + let params = [] + let uninParams = [] + let topicsSet = new Set() + for (let cfg of this.eventCfgs) { + await this.fixBlockNumber(cfg) + if (cfg.fromBlock != this.fromBlock) { + let _param = this.buildQueryParams(cfg, toBlock) + params.push(_param) + } else { + let _param = uninParams[uninParams.length - 1] + if (!_param || !topicsSet.has(cfg.topic)) { + _param = this.buildQueryParams(cfg, toBlock) + uninParams.push(_param) + topicsSet = new Set() + topicsSet.add(cfg.topic) } else { - let _param = uninParams[uninParams.length - 1] - if (!_param || !topicsSet.has(cfg.topic)) { - _param = this.buildQueryParams(cfg, toBlock) - uninParams.push(_param) - topicsSet = new Set() + if (!topicsSet.has(cfg.topic)) { + _param.params[0].topics.push(cfg.topic) topicsSet.add(cfg.topic) - } else { - if (!topicsSet.has(cfg.topic)) { - _param.params[0].topics.push(cfg.topic) - topicsSet.add(cfg.topic) - } - _param.params[0].address.push(cfg.address) } + _param.params[0].address.push(cfg.address) } } - let nextBlock = this.fromBlock - if (uninParams.length > 1) { - logger.debug(`unin params: ${uninParams.length}`) - let results = await batchEthLogs(this.rpc, uninParams) - for (let i = 0; i < results.length; i++) { - if (results[i].error) { - throw results[i].error - } - let events = results[i].result - await this.processEvents(events) + } + let nextBlock = this.fromBlock + if (uninParams.length > 1) { + logger.debug(`unin params: ${uninParams.length}`) + let results = await batchEthLogs(this.rpc, uninParams) + for (let i = 0; i < results.length; i++) { + if (results[i].error) { + throw results[i].error } - } else if (uninParams.length == 1) { - logger.debug(`unin params length 1, use eth_getLogs`) - let result = await ethGetLogs(this.rpc, uninParams[0].params) - if (result.error) { - throw result.error + let events = results[i].result + await this.processEvents(events) + } + } else if (uninParams.length == 1) { + logger.debug(`unin params length 1, use eth_getLogs`) + let result = await ethGetLogs(this.rpc, uninParams[0].params) + if (result.error) { + throw result.error + } + await this.processEvents(result.result) + } + if (params.length > 0) { + logger.debug(`params: ${params.length}`) + let results = await batchEthLogs(this.rpc, params) + for (let i = 0; i < results.length; i++) { + if (results[i].error) { + throw results[i].error } - await this.processEvents(result.result) + let events = results[i].result + await this.processEvents(events) } - if (params.length > 0) { - logger.debug(`params: ${params.length}`) - let results = await batchEthLogs(this.rpc, params) - for (let i = 0; i < results.length; i++) { - if (results[i].error) { - throw results[i].error - } - let events = results[i].result - await this.processEvents(events) - } - } - nextBlock = toBlock + 1; - for (let cfg of this.eventCfgs) { - cfg.fromBlock = nextBlock - const redisKey = this.buildRedisKey(cfg) - await new RedisClient().set(redisKey, cfg.fromBlock + '') - } - await new RedisClient().set(this.redisKey, nextBlock + '') + } + nextBlock = toBlock + 1 + for (let cfg of this.eventCfgs) { + cfg.fromBlock = nextBlock + const redisKey = this.buildRedisKey(cfg) + await new RedisClient().set(redisKey, cfg.fromBlock + '') + } + await new RedisClient().set(this.redisKey, nextBlock + '') } buildRedisKey(cfg: IEventCfg) { @@ -127,14 +126,14 @@ export class EventBatchSvr { const params: any = { fromBlock: '0x' + cfg.fromBlock.toString(16), toBlock: toBlock ? '0x' + toBlock?.toString(16) : 'latest', - address: [cfg.address] + address: [cfg.address], } params.topics = [cfg.topic] const result = { - jsonrpc: "2.0", - method: "eth_getLogs", + jsonrpc: '2.0', + method: 'eth_getLogs', params: [params], - id: `${cfg.address}_${cfg.event}` + id: `${cfg.address}_${cfg.event}`, } return result } @@ -148,13 +147,13 @@ export class EventBatchSvr { for (const event of events) { const address = events[0].address const topic = events[0].topics[0] - const cfg = this.processer.get((address+topic).toLowerCase()) + const cfg = this.processer.get((address + topic).toLowerCase()) if (!cfg) { - continue; + continue } event.chain = this.chainCfg.id + '' event.event = cfg.event - let result = decodeEvent(cfg, event); + let result = decodeEvent(cfg, event) // cfg.fromBlock = Math.max (parseInt(event.blockNumber, 16) + 1, cfg.fromBlock) event.decodedData = result const record = await GeneralEvent.saveEvent(event) @@ -165,7 +164,7 @@ export class EventBatchSvr { } catch (err) { logger.error('process event error: ', err.message || err) } - } + } } return blockNumber } diff --git a/src/utils/block.util.ts b/src/utils/block.util.ts index d876832..2aecea6 100644 --- a/src/utils/block.util.ts +++ b/src/utils/block.util.ts @@ -1,27 +1,50 @@ -import { batchEthBlocks } from "chain/chain.api"; -import { IScriptionCfg } from "interface/IScriptionCfg"; -import logger from "logger/logger"; -import { RedisClient } from "redis/RedisClient"; -import { utf8ToHex } from "./string.util"; +import { batchEthBlocks } from 'chain/chain.api' +import { IScriptionCfg } from 'interface/IScriptionCfg' +import logger from 'logger/logger' +import { RedisClient } from 'redis/RedisClient' +import { utf8ToHex } from './string.util' const MAX_BATCH_AMOUNT = +process.env.MAX_BLOCK_BATCH_AMOUNT const REQUEST_INTERVAL = 0.5 * 1000 -export async function divQueryPassBlocks({chainId, rpc, fromBlock, amount} - : {chainId: number, rpc: string, fromBlock: number, amount: number}) { +export async function divQueryPassBlocks({ + chainId, + rpc, + fromBlock, + amount, +}: { + chainId: number + rpc: string + fromBlock: number + amount: number +}) { const middleBlock = fromBlock + Math.floor(amount / 2) - const firstBlocks = await getPastBlocks({chainId, rpc, fromBlock, amount: middleBlock - fromBlock}) - const secondBlocks = await getPastBlocks({chainId, rpc, fromBlock: middleBlock, amount: amount - (middleBlock - fromBlock)}) + const firstBlocks = await getPastBlocks({ chainId, rpc, fromBlock, amount: middleBlock - fromBlock }) + const secondBlocks = await getPastBlocks({ + chainId, + rpc, + fromBlock: middleBlock, + amount: amount - (middleBlock - fromBlock), + }) return [...firstBlocks, ...secondBlocks] } -export async function getPastBlocks({chainId, rpc, fromBlock, amount} - : {chainId: number, rpc: string, fromBlock: number, amount: number}) { +export async function getPastBlocks({ + chainId, + rpc, + fromBlock, + amount, +}: { + chainId: number + rpc: string + fromBlock: number + amount: number +}) { let blocks = [] logger.info(`chain: ${chainId} from: ${fromBlock} amount: ${amount}`) let blockNumber = fromBlock const redisKey = `blocknum_${chainId}` - let retryCount = 0; + let retryCount = 0 const parseBlocksAndRetry = async (blockNums: number[]) => { let records = await batchEthBlocks(rpc, blockNums) if (records.error) { @@ -31,7 +54,7 @@ export async function getPastBlocks({chainId, rpc, fromBlock, amount} let retryNums: number[] = [] let maxBlockNumber = 0 for (let i = 0; i < records.length; i++) { - const block = records[i].result; + const block = records[i].result if (block?.hash) { blocks.push(block) realAmount++ @@ -40,21 +63,20 @@ export async function getPastBlocks({chainId, rpc, fromBlock, amount} if (block) { logger.warn(`block ${blockNumber + i}: ${block}`) } else { - logger.warn(`block ${blockNumber + i} is null`) retryNums.push(blockNumber + i) } } } - if (retryNums.length > 0 && ++retryCount < 3) { - logger.info(`${retryCount} retry ${retryNums.length} blocks`) + if (retryNums.length > 0 && ++retryCount < 5) { + logger.info(`${retryCount} retry: ${retryNums.join(', ')}`) const retryBlocks = await parseBlocksAndRetry(retryNums) realAmount += retryBlocks } return realAmount } try { - const numsArr = Array.from({length: amount}, (v, k) => k + blockNumber) - const realAmount = await parseBlocksAndRetry(numsArr) + const numsArr = Array.from({ length: amount }, (v, k) => k + blockNumber) + await parseBlocksAndRetry(numsArr) if (retryCount > 0) { blocks.sort((a, b) => parseInt(a.number) - parseInt(b.number)) } @@ -63,31 +85,39 @@ export async function getPastBlocks({chainId, rpc, fromBlock, amount} } catch (e) { logger.log(e.message || e) if (e.message && /Too Many Requests/.test(e.message) && amount > 1) { - blocks = await divQueryPassBlocks({chainId, rpc, fromBlock, amount}) + blocks = await divQueryPassBlocks({ chainId, rpc, fromBlock, amount }) } else if (e.message && /Public RPC Rate Limit Hit, limit will reset in \d+ seconds/.test(e.message)) { const match = e.message.match(/Public RPC Rate Limit Hit, limit will reset in (\d+) seconds/) const seconds = parseInt(match[1]) await new Promise(resolve => setTimeout(resolve, seconds * 1000)) - blocks = await getPastBlocks({chainId, rpc, fromBlock, amount}) - }else { + blocks = await getPastBlocks({ chainId, rpc, fromBlock, amount }) + } else { throw e } } return blocks } -export function* getPastBlocksIter({chainId, rpc, fromBlock, amount} - : {chainId: number, rpc: string, fromBlock: number, amount: number}) { +export function* getPastBlocksIter({ + chainId, + rpc, + fromBlock, + amount, +}: { + chainId: number + rpc: string + fromBlock: number + amount: number +}) { logger.info(`chain: ${chainId} from: ${fromBlock} amount: ${amount}`) let remain = amount while (remain > 0) { - yield getPastBlocks({chainId, rpc, fromBlock, amount: Math.min(MAX_BATCH_AMOUNT, remain)}) + yield getPastBlocks({ chainId, rpc, fromBlock, amount: Math.min(MAX_BATCH_AMOUNT, remain) }) fromBlock += MAX_BATCH_AMOUNT remain -= MAX_BATCH_AMOUNT } } - export const buildScriptionFilters = (cfg: IScriptionCfg) => { if (cfg.filter) { return cfg.filter @@ -144,7 +174,7 @@ export const buildScriptionFilters = (cfg: IScriptionCfg) => { } else if (filter.type === 'utf8_data') { value = `'0x${utf8ToHex(value)}'` } else if (filter.type === 'hex_data') { - value = `'${value.indexOf('0x') === 0 ? value : '0x'+value}'` + value = `'${value.indexOf('0x') === 0 ? value : '0x' + value}'` } else if (filter.type === 'number') { value = parseInt(value) } else if (filter.type === 'boolean') { @@ -162,7 +192,7 @@ export const buildScriptionFilters = (cfg: IScriptionCfg) => { } else if (op === 'like') { body += new RegExp(value).test(`event.${filter.key}`) } else { - body += `event.${filter.key}${op}${value}` + body += `event.${filter.key}${op}${value}` } } } diff --git a/src/utils/date.util.ts b/src/utils/date.util.ts index 0ce761c..bf89187 100644 --- a/src/utils/date.util.ts +++ b/src/utils/date.util.ts @@ -1,39 +1,39 @@ // format the date to the format we want export const formatDate = (date: Date): string => { - const year = date.getFullYear(); - const month = (date.getMonth() + 1 + '').padStart(2, '0'); - const day = (date.getDate() + '').padStart(2, '0'); - return `${year}${month}${day}`; -}; + const year = date.getFullYear() + const month = (date.getMonth() + 1 + '').padStart(2, '0') + const day = (date.getDate() + '').padStart(2, '0') + return `${year}${month}${day}` +} // get begin of one day export const getDayBegin = (date: Date): Date => { - const year = date.getFullYear(); - const month = date.getMonth(); - const day = date.getDate(); - return new Date(year, month, day); -}; + const year = date.getFullYear() + const month = date.getMonth() + const day = date.getDate() + return new Date(year, month, day) +} // get begin of n day ago export const getNDayAgo = (n: number, begin: boolean): Date => { const date = new Date(Date.now() - n * 24 * 60 * 60 * 1000) if (begin) { - return getDayBegin(date); + return getDayBegin(date) } else { - return date; + return date } -}; +} // get begin of this month export const getMonthBegin = (date: Date): Date => { - const year = date.getFullYear(); - const month = date.getMonth(); - return new Date(year, month, 1); + const year = date.getFullYear() + const month = date.getMonth() + return new Date(year, month, 1) } // get formated datestring of yesterday export const yesterday = () => { - const date = new Date(); - date.setDate(date.getDate() - 1); - return date; -}; \ No newline at end of file + const date = new Date() + date.setDate(date.getDate() - 1) + return date +} diff --git a/src/utils/event.util.ts b/src/utils/event.util.ts index ebe887a..c769b08 100644 --- a/src/utils/event.util.ts +++ b/src/utils/event.util.ts @@ -1,8 +1,7 @@ - //@ts-ignore -import { keccak256, _jsonInterfaceMethodToString, AbiInput } from "web3-utils"; -import web3abi from 'web3-eth-abi'; -import { IEventCfg } from "interface/IEventCfg"; +import { keccak256, _jsonInterfaceMethodToString, AbiInput } from 'web3-utils' +import web3abi from 'web3-eth-abi' +import { IEventCfg } from 'interface/IEventCfg' export const getTopics = (cfg: IEventCfg) => { // let abi = cfg.abi @@ -12,21 +11,21 @@ export const getTopics = (cfg: IEventCfg) => { // } // topic = topic.slice(0, -1) // topic += ')' - return keccak256(_jsonInterfaceMethodToString(cfg.abi)) + return keccak256(_jsonInterfaceMethodToString(cfg.abi)) } -export const decodeEvent = (cfg: IEventCfg, eventData: {data: string, topics: string[]}) => { - const abiInputs = cfg.abi.inputs; - let result = web3abi.decodeLog(abiInputs, eventData.data, eventData.topics.slice(1)); +export const decodeEvent = (cfg: IEventCfg, eventData: { data: string; topics: string[] }) => { + const abiInputs = cfg.abi.inputs + let result = web3abi.decodeLog(abiInputs, eventData.data, eventData.topics.slice(1)) let decodedData: any = {} for (let i = 0; i < abiInputs.length; i++) { - const input: AbiInput = abiInputs[i]; + const input: AbiInput = abiInputs[i] if (input.type === 'tuple[]') { // @ts-ignore decodedData[input.name] = result[i].map(item => { let itemData = {} for (let j = 0; j < input.components.length; j++) { - const component = input.components[j]; + const component = input.components[j] itemData[component.name] = item[j] } return itemData @@ -34,7 +33,7 @@ export const decodeEvent = (cfg: IEventCfg, eventData: {data: string, topics: st } else if (input.type === 'tuple') { let itemData = {} for (let j = 0; j < input.components.length; j++) { - const component = input.components[j]; + const component = input.components[j] itemData[component.name] = result[i][j] } decodedData[input.name] = itemData diff --git a/src/utils/number.util.ts b/src/utils/number.util.ts index be0b1ef..b967a44 100644 --- a/src/utils/number.util.ts +++ b/src/utils/number.util.ts @@ -1,5 +1,5 @@ -import Web3 from 'web3'; -import { BN } from 'ethereumjs-util'; +import Web3 from 'web3' +import { BN } from 'ethereumjs-util' /** * Converts some token minimal unit to render format string, showing 5 decimals @@ -10,23 +10,17 @@ import { BN } from 'ethereumjs-util'; * @returns {String} - Number of token minimal unit, in render format * If value is less than 5 precision decimals will show '< 0.00001' */ -export function renderFromTokenMinimalUnit( - tokenValue, - decimals, - decimalsToShow = 5 -) { - const minimalUnit = fromTokenMinimalUnit(tokenValue || 0, decimals); - const minimalUnitNumber = parseFloat(minimalUnit); - let renderMinimalUnit; +export function renderFromTokenMinimalUnit(tokenValue, decimals, decimalsToShow = 5) { + const minimalUnit = fromTokenMinimalUnit(tokenValue || 0, decimals) + const minimalUnitNumber = parseFloat(minimalUnit) + let renderMinimalUnit if (minimalUnitNumber < 0.00001 && minimalUnitNumber > 0) { - renderMinimalUnit = "< 0.00001"; + renderMinimalUnit = '< 0.00001' } else { - const base = Math.pow(10, decimalsToShow); - renderMinimalUnit = ( - Math.round(minimalUnitNumber * base) / base - ).toString(); + const base = Math.pow(10, decimalsToShow) + renderMinimalUnit = (Math.round(minimalUnitNumber * base) / base).toString() } - return renderMinimalUnit; + return renderMinimalUnit } /** * Converts token minimal unit to readable string value @@ -36,25 +30,25 @@ export function renderFromTokenMinimalUnit( * @returns {string} - String containing the new number */ export function fromTokenMinimalUnit(minimalInput, decimals) { - minimalInput = addHexPrefix(Number(minimalInput).toString(16)); - let minimal = safeNumberToBN(minimalInput); - const negative = minimal.lt(new BN(0)); - const base = Web3.utils.toBN(Math.pow(10, decimals).toString()); + minimalInput = addHexPrefix(Number(minimalInput).toString(16)) + let minimal = safeNumberToBN(minimalInput) + const negative = minimal.lt(new BN(0)) + const base = Web3.utils.toBN(Math.pow(10, decimals).toString()) if (negative) { - minimal = minimal.mul(new BN(-1)); + minimal = minimal.mul(new BN(-1)) } - let fraction = minimal.mod(base).toString(10); + let fraction = minimal.mod(base).toString(10) while (fraction.length < decimals) { - fraction = "0" + fraction; + fraction = '0' + fraction } - fraction = fraction.match(/^([0-9]*[1-9]|0)(0*)/)[1]; - const whole = minimal.div(base).toString(10); - let value = "" + whole + (fraction === "0" ? "" : "." + fraction); + fraction = fraction.match(/^([0-9]*[1-9]|0)(0*)/)[1] + const whole = minimal.div(base).toString(10) + let value = '' + whole + (fraction === '0' ? '' : '.' + fraction) if (negative) { - value = "-" + value; + value = '-' + value } - return value; + return value } /** @@ -65,20 +59,20 @@ export function fromTokenMinimalUnit(minimalInput, decimals) { * @returns {String} - Number of token minimal unit, in render format * If value is less than 5 precision decimals will show '< 0.00001' */ - export function renderFromWei(value, decimalsToShow = 5) { - let renderWei = '0'; +export function renderFromWei(value, decimalsToShow = 5) { + let renderWei = '0' // avoid undefined if (value) { - const wei = Web3.utils.fromWei(value); - const weiNumber = parseFloat(wei); + const wei = Web3.utils.fromWei(value) + const weiNumber = parseFloat(wei) if (weiNumber < 0.00001 && weiNumber > 0) { - renderWei = '< 0.00001'; + renderWei = '< 0.00001' } else { - const base = Math.pow(10, decimalsToShow); - renderWei = (Math.round(weiNumber * base) / base).toString(); + const base = Math.pow(10, decimalsToShow) + renderWei = (Math.round(weiNumber * base) / base).toString() } } - return renderWei; + return renderWei } /** @@ -89,7 +83,7 @@ export function fromTokenMinimalUnit(minimalInput, decimals) { * @returns {string} - String of the hex token value */ export function calcTokenValueToSend(value, decimals) { - return value ? (value * Math.pow(10, decimals)).toString(16) : 0; + return value ? (value * Math.pow(10, decimals)).toString(16) : 0 } /** @@ -99,11 +93,7 @@ export function calcTokenValueToSend(value, decimals) { * @returns {boolean} - True if the string is a valid decimal */ export function isDecimal(value) { - return ( - Number.isFinite(parseFloat(value)) && - !Number.isNaN(parseFloat(value)) && - !isNaN(+value) - ); + return Number.isFinite(parseFloat(value)) && !Number.isNaN(parseFloat(value)) && !isNaN(+value) } /** @@ -113,7 +103,7 @@ export function isDecimal(value) { * @returns {Object} - BN instance */ export function toBN(value) { - return Web3.utils.toBN(value); + return Web3.utils.toBN(value) } /** @@ -123,20 +113,20 @@ export function toBN(value) { * @returns {string} The prefixed string. */ export const addHexPrefix = (str: string) => { - if (typeof str !== "string" || str.match(/^-?0x/u)) { - return str; + if (typeof str !== 'string' || str.match(/^-?0x/u)) { + return str } if (str.match(/^-?0X/u)) { - return str.replace("0X", "0x"); + return str.replace('0X', '0x') } - if (str.startsWith("-")) { - return str.replace("-", "-0x"); + if (str.startsWith('-')) { + return str.replace('-', '-0x') } - return `0x${str}`; -}; + return `0x${str}` +} /** * Wraps 'numberToBN' method to avoid potential undefined and decimal values @@ -145,8 +135,8 @@ export const addHexPrefix = (str: string) => { * @returns {Object} - The converted value as BN instance */ export function safeNumberToBN(value: number | string) { - const safeValue = fastSplit(value.toString()) || "0"; - return numberToBN(safeValue); + const safeValue = fastSplit(value.toString()) || '0' + return numberToBN(safeValue) } /** @@ -157,60 +147,52 @@ export function safeNumberToBN(value: number | string) { * @returns {string} - the selected splitted element */ -export function fastSplit(value, divider = ".") { - value += ""; - const [from, to] = [value.indexOf(divider), 0]; - return value.substring(from, to) || value; +export function fastSplit(value, divider = '.') { + value += '' + const [from, to] = [value.indexOf(divider), 0] + return value.substring(from, to) || value } export function stripHexPrefix(str: string) { - if (typeof str !== "string") { - return str; + if (typeof str !== 'string') { + return str } - return str.slice(0, 2) === "0x" ? str.slice(2) : str; + return str.slice(0, 2) === '0x' ? str.slice(2) : str } export function numberToBN(arg) { - if (typeof arg === "string" || typeof arg === "number") { + if (typeof arg === 'string' || typeof arg === 'number') { var multiplier = Web3.utils.toBN(1); // eslint-disable-line - var formattedString = String(arg).toLowerCase().trim(); - var isHexPrefixed = - formattedString.substr(0, 2) === "0x" || - formattedString.substr(0, 3) === "-0x"; + var formattedString = String(arg).toLowerCase().trim() + var isHexPrefixed = formattedString.substr(0, 2) === '0x' || formattedString.substr(0, 3) === '-0x' var stringArg = stripHexPrefix(formattedString); // eslint-disable-line - if (stringArg.substr(0, 1) === "-") { - stringArg = stripHexPrefix(stringArg.slice(1)); - multiplier = Web3.utils.toBN(-1); + if (stringArg.substr(0, 1) === '-') { + stringArg = stripHexPrefix(stringArg.slice(1)) + multiplier = Web3.utils.toBN(-1) } - stringArg = stringArg === "" ? "0" : stringArg; + stringArg = stringArg === '' ? '0' : stringArg if ( (!stringArg.match(/^-?[0-9]+$/) && stringArg.match(/^[0-9A-Fa-f]+$/)) || stringArg.match(/^[a-fA-F]+$/) || (isHexPrefixed === true && stringArg.match(/^[0-9A-Fa-f]+$/)) ) { - return Web3.utils.toBN(stringArg).mul(multiplier); + return Web3.utils.toBN(stringArg).mul(multiplier) } - if ( - (stringArg.match(/^-?[0-9]+$/) || stringArg === "") && - isHexPrefixed === false - ) { - return Web3.utils.toBN(stringArg).mul(multiplier); + if ((stringArg.match(/^-?[0-9]+$/) || stringArg === '') && isHexPrefixed === false) { + return Web3.utils.toBN(stringArg).mul(multiplier) } - } else if (typeof arg === "object" && arg.toString && !arg.pop && !arg.push) { - if ( - arg.toString(10).match(/^-?[0-9]+$/) && - (arg.mul || arg.dividedToIntegerBy) - ) { - return Web3.utils.toBN(arg.toString(10)); + } else if (typeof arg === 'object' && arg.toString && !arg.pop && !arg.push) { + if (arg.toString(10).match(/^-?[0-9]+$/) && (arg.mul || arg.dividedToIntegerBy)) { + return Web3.utils.toBN(arg.toString(10)) } } throw new Error( - "[number-to-bn] while converting number " + + '[number-to-bn] while converting number ' + JSON.stringify(arg) + - " to BN.js instance, error: invalid number value. Value must be an integer, hex string, BN or BigNumber instance. Note, decimals are not supported." - ); + ' to BN.js instance, error: invalid number value. Value must be an integer, hex string, BN or BigNumber instance. Note, decimals are not supported.', + ) } diff --git a/src/utils/string.util.ts b/src/utils/string.util.ts index d923052..422f203 100644 --- a/src/utils/string.util.ts +++ b/src/utils/string.util.ts @@ -107,18 +107,17 @@ export function string62to10(numberCode: string) { export function hexToUtf8(hexString) { // Remove any leading "0x" prefix and split into pairs of characters - let _hexString = hexString.replace(/^0x/, ""); + let _hexString = hexString.replace(/^0x/, '') let buffer = Buffer.from(_hexString, 'hex') return buffer.toString('utf8') } export function utf8ToHex(utf8String) { // Create a Buffer object from the UTF-8 string - const buffer = Buffer.from(utf8String, "utf8"); + const buffer = Buffer.from(utf8String, 'utf8') // Convert the Buffer object to a hex string - const hexString = buffer.toString("hex"); + const hexString = buffer.toString('hex') - return hexString; + return hexString } - diff --git a/yarn.lock b/yarn.lock index 4ffcfc3..616acba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,13 +2,6 @@ # yarn lockfile v1 -"@babel/code-frame@7.12.11": - version "7.12.11" - resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" - integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== - dependencies: - "@babel/highlight" "^7.10.4" - "@babel/code-frame@^7.0.0": version "7.18.6" resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" @@ -21,7 +14,7 @@ resolved "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== -"@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": +"@babel/highlight@^7.18.6": version "7.18.6" resolved "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== @@ -37,20 +30,17 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@eslint/eslintrc@^0.4.3": - version "0.4.3" - resolved "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" - integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== +"@eslint-community/eslint-utils@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== dependencies: - ajv "^6.12.4" - debug "^4.1.1" - espree "^7.3.0" - globals "^13.9.0" - ignore "^4.0.6" - import-fresh "^3.2.1" - js-yaml "^3.13.1" - minimatch "^3.0.4" - strip-json-comments "^3.1.1" + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.5.1": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== "@ethereumjs/common@^2.5.0", "@ethereumjs/common@^2.6.4": version "2.6.5" @@ -306,20 +296,6 @@ fastify-plugin "^4.0.0" steed "^1.1.3" -"@humanwhocodes/config-array@^0.5.0": - version "0.5.0" - resolved "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" - integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== - dependencies: - "@humanwhocodes/object-schema" "^1.2.0" - debug "^4.1.1" - minimatch "^3.0.4" - -"@humanwhocodes/object-schema@^1.2.0": - version "1.2.1" - resolved "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== - "@jridgewell/resolve-uri@^3.0.3": version "3.1.0" resolved "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" @@ -375,6 +351,11 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@pkgr/core@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31" + integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== + "@sindresorhus/is@^4.0.0", "@sindresorhus/is@^4.6.0": version "4.6.0" resolved "https://registry.npmmirror.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" @@ -471,10 +452,10 @@ resolved "https://registry.npmmirror.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== -"@types/json-schema@^7.0.7": - version "7.0.11" - resolved "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== +"@types/json-schema@^7.0.12": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/json5@^0.0.29": version "0.0.29" @@ -518,16 +499,16 @@ resolved "https://registry.npmmirror.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== -"@types/node@^14.14.20": - version "14.18.31" - resolved "https://registry.npmmirror.com/@types/node/-/node-14.18.31.tgz#4b873dea3122e71af4f77e65ec5841397ff254d3" - integrity sha512-vQAnaReSQkEDa8uwAyQby8bYGKu84R/deEc6mg5T8fX6gzCn8QW6rziSgsti1fNvsrswKUKPnVTi7uoB+u62Mw== - "@types/node@^16.11.0": version "16.11.64" resolved "https://registry.npmmirror.com/@types/node/-/node-16.11.64.tgz#9171f327298b619e2c52238b120c19056415d820" integrity sha512-z5hPTlVFzNwtJ2LNozTpJcD1Cu44c4LNuzaq1mwxmiHWQh2ULdR6Vjwo1UGldzRpzL0yUEdZddnfqGW2G70z6Q== +"@types/node@^16.18.68": + version "16.18.71" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.71.tgz#305a955ab99353d4b8a9e9b6b6682ed6cbc186cc" + integrity sha512-ARO+458bNJQeNEFuPyT6W+q9ULotmsQzhV3XABsFSxEvRMUYENcBsNAHWYPlahU+UHa5gCVwyKT1Z3f1Wwr26Q== + "@types/nodemailer@^6.4.7": version "6.4.7" resolved "https://registry.yarnpkg.com/@types/nodemailer/-/nodemailer-6.4.7.tgz#658f4bca47c1a895b1d7e054b3b54030a5e1f5e0" @@ -563,6 +544,11 @@ dependencies: "@types/node" "*" +"@types/semver@^7.5.0": + version "7.5.6" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.6.tgz#c65b2bfce1bec346582c07724e3f8c1017a20339" + integrity sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A== + "@types/strip-bom@^3.0.0": version "3.0.0" resolved "https://registry.npmmirror.com/@types/strip-bom/-/strip-bom-3.0.0.tgz#14a8ec3956c2e81edb7520790aecf21c290aebd2" @@ -573,75 +559,91 @@ resolved "https://registry.npmmirror.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1" integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ== -"@typescript-eslint/eslint-plugin@^4.25.0": - version "4.33.0" - resolved "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz#c24dc7c8069c7706bc40d99f6fa87edcb2005276" - integrity sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg== +"@typescript-eslint/eslint-plugin@^6.19.0": + version "6.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.19.0.tgz#db03f3313b57a30fbbdad2e6929e88fc7feaf9ba" + integrity sha512-DUCUkQNklCQYnrBSSikjVChdc84/vMPDQSgJTHBZ64G9bA9w0Crc0rd2diujKbTdp6w2J47qkeHQLoi0rpLCdg== dependencies: - "@typescript-eslint/experimental-utils" "4.33.0" - "@typescript-eslint/scope-manager" "4.33.0" - debug "^4.3.1" - functional-red-black-tree "^1.0.1" - ignore "^5.1.8" - regexpp "^3.1.0" - semver "^7.3.5" - tsutils "^3.21.0" + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "6.19.0" + "@typescript-eslint/type-utils" "6.19.0" + "@typescript-eslint/utils" "6.19.0" + "@typescript-eslint/visitor-keys" "6.19.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.4" + natural-compare "^1.4.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" -"@typescript-eslint/experimental-utils@4.33.0": - version "4.33.0" - resolved "https://registry.npmmirror.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz#6f2a786a4209fa2222989e9380b5331b2810f7fd" - integrity sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q== +"@typescript-eslint/parser@^6.19.0": + version "6.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.19.0.tgz#80344086f362181890ade7e94fc35fe0480bfdf5" + integrity sha512-1DyBLG5SH7PYCd00QlroiW60YJ4rWMuUGa/JBV0iZuqi4l4IK3twKPq5ZkEebmGqRjXWVgsUzfd3+nZveewgow== dependencies: - "@types/json-schema" "^7.0.7" - "@typescript-eslint/scope-manager" "4.33.0" - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/typescript-estree" "4.33.0" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" + "@typescript-eslint/scope-manager" "6.19.0" + "@typescript-eslint/types" "6.19.0" + "@typescript-eslint/typescript-estree" "6.19.0" + "@typescript-eslint/visitor-keys" "6.19.0" + debug "^4.3.4" -"@typescript-eslint/parser@^4.25.0": - version "4.33.0" - resolved "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-4.33.0.tgz#dfe797570d9694e560528d18eecad86c8c744899" - integrity sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA== +"@typescript-eslint/scope-manager@6.19.0": + version "6.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.19.0.tgz#b6d2abb825b29ab70cb542d220e40c61c1678116" + integrity sha512-dO1XMhV2ehBI6QN8Ufi7I10wmUovmLU0Oru3n5LVlM2JuzB4M+dVphCPLkVpKvGij2j/pHBWuJ9piuXx+BhzxQ== dependencies: - "@typescript-eslint/scope-manager" "4.33.0" - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/typescript-estree" "4.33.0" - debug "^4.3.1" + "@typescript-eslint/types" "6.19.0" + "@typescript-eslint/visitor-keys" "6.19.0" -"@typescript-eslint/scope-manager@4.33.0": - version "4.33.0" - resolved "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz#d38e49280d983e8772e29121cf8c6e9221f280a3" - integrity sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ== +"@typescript-eslint/type-utils@6.19.0": + version "6.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.19.0.tgz#522a494ef0d3e9fdc5e23a7c22c9331bbade0101" + integrity sha512-mcvS6WSWbjiSxKCwBcXtOM5pRkPQ6kcDds/juxcy/727IQr3xMEcwr/YLHW2A2+Fp5ql6khjbKBzOyjuPqGi/w== dependencies: - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/visitor-keys" "4.33.0" + "@typescript-eslint/typescript-estree" "6.19.0" + "@typescript-eslint/utils" "6.19.0" + debug "^4.3.4" + ts-api-utils "^1.0.1" -"@typescript-eslint/types@4.33.0": - version "4.33.0" - resolved "https://registry.npmmirror.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72" - integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ== +"@typescript-eslint/types@6.19.0": + version "6.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.19.0.tgz#689b0498c436272a6a2059b09f44bcbd90de294a" + integrity sha512-lFviGV/vYhOy3m8BJ/nAKoAyNhInTdXpftonhWle66XHAtT1ouBlkjL496b5H5hb8dWXHwtypTqgtb/DEa+j5A== -"@typescript-eslint/typescript-estree@4.33.0": - version "4.33.0" - resolved "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609" - integrity sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA== +"@typescript-eslint/typescript-estree@6.19.0": + version "6.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.19.0.tgz#0813ba364a409afb4d62348aec0202600cb468fa" + integrity sha512-o/zefXIbbLBZ8YJ51NlkSAt2BamrK6XOmuxSR3hynMIzzyMY33KuJ9vuMdFSXW+H0tVvdF9qBPTHA91HDb4BIQ== dependencies: - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/visitor-keys" "4.33.0" - debug "^4.3.1" - globby "^11.0.3" - is-glob "^4.0.1" - semver "^7.3.5" - tsutils "^3.21.0" + "@typescript-eslint/types" "6.19.0" + "@typescript-eslint/visitor-keys" "6.19.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "9.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" -"@typescript-eslint/visitor-keys@4.33.0": - version "4.33.0" - resolved "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd" - integrity sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg== +"@typescript-eslint/utils@6.19.0": + version "6.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.19.0.tgz#557b72c3eeb4f73bef8037c85dae57b21beb1a4b" + integrity sha512-QR41YXySiuN++/dC9UArYOg4X86OAYP83OWTewpVx5ct1IZhjjgTLocj7QNxGhWoTqknsgpl7L+hGygCO+sdYw== dependencies: - "@typescript-eslint/types" "4.33.0" - eslint-visitor-keys "^2.0.0" + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "6.19.0" + "@typescript-eslint/types" "6.19.0" + "@typescript-eslint/typescript-estree" "6.19.0" + semver "^7.5.4" + +"@typescript-eslint/visitor-keys@6.19.0": + version "6.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.19.0.tgz#4565e0ecd63ca1f81b96f1dd76e49f746c6b2b49" + integrity sha512-hZaUCORLgubBvtGpp1JEFEazcuEdfxta9j4iUwdSAr7mEsYYAp3EAUyCZk3VEEqGj6W+AV4uWyrDGtrlawAsgQ== + dependencies: + "@typescript-eslint/types" "6.19.0" + eslint-visitor-keys "^3.4.1" abort-controller@^3.0.0: version "3.0.0" @@ -668,21 +670,11 @@ accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" -acorn-jsx@^5.3.1: - version "5.3.2" - resolved "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - acorn-walk@^8.1.1: version "8.2.0" resolved "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^7.4.0: - version "7.4.1" - resolved "https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - acorn@^8.4.1: version "8.8.0" resolved "https://registry.npmmirror.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" @@ -708,7 +700,7 @@ ajv-formats@^2.1.1: dependencies: ajv "^8.0.0" -ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4: +ajv@^6.12.3: version "6.12.6" resolved "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -728,26 +720,6 @@ ajv@^8.0.0, ajv@^8.10.0, ajv@^8.11.0: require-from-string "^2.0.2" uri-js "^4.2.2" -ajv@^8.0.1: - version "8.11.0" - resolved "https://registry.npmmirror.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" - integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ansi-colors@^4.1.1: - version "4.1.3" - resolved "https://registry.npmmirror.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -755,13 +727,6 @@ ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - anymatch@~3.1.2: version "3.1.2" resolved "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" @@ -819,11 +784,6 @@ assert-plus@1.0.0, assert-plus@^1.0.0: resolved "https://registry.npmmirror.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - async-limiter@~1.0.0: version "1.0.1" resolved "https://registry.npmmirror.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" @@ -968,6 +928,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -1148,11 +1115,6 @@ call-bind@^1.0.0, call-bind@^1.0.2: function-bind "^1.1.1" get-intrinsic "^1.0.2" -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - caseless@~0.12.0: version "0.12.0" resolved "https://registry.npmmirror.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -1175,14 +1137,6 @@ chalk@^2.0.0, chalk@^2.3.0: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - chokidar@^3.5.1: version "3.5.3" resolved "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" @@ -1246,23 +1200,11 @@ color-convert@^1.9.0: dependencies: color-name "1.1.3" -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - color-name@1.1.3: version "1.1.3" resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - colors@1.4.0: version "1.4.0" resolved "https://registry.npmmirror.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" @@ -1390,15 +1332,6 @@ cross-fetch@^3.1.4: dependencies: node-fetch "2.6.7" -cross-spawn@^7.0.2: - version "7.0.3" - resolved "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - crypto-browserify@3.12.0: version "3.12.0" resolved "https://registry.npmmirror.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" @@ -1450,7 +1383,7 @@ debug@3.1.0: dependencies: ms "2.0.0" -debug@^4.0.0, debug@^4.0.1, debug@^4.1.1, debug@^4.3.1: +debug@^4.0.0, debug@^4.3.4: version "4.3.4" resolved "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -1476,11 +1409,6 @@ decompress-response@^6.0.0: dependencies: mimic-response "^3.1.0" -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - deepmerge@^4.2.2: version "4.2.2" resolved "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" @@ -1548,13 +1476,6 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - dom-walk@^0.1.0: version "0.1.2" resolved "https://registry.npmmirror.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" @@ -1605,11 +1526,6 @@ elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5 minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -1622,13 +1538,6 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enquirer@^2.3.5: - version "2.3.6" - resolved "https://registry.npmmirror.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== - dependencies: - ansi-colors "^4.1.1" - es-abstract@^1.19.0, es-abstract@^1.19.5, es-abstract@^1.20.0: version "1.20.4" resolved "https://registry.npmmirror.com/es-abstract/-/es-abstract-1.20.4.tgz#1d103f9f8d78d4cf0713edcd6d0ed1a46eed5861" @@ -1709,144 +1618,29 @@ escape-string-regexp@^1.0.5: resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +eslint-config-prettier@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz#31af3d94578645966c082fcb71a5846d3c94867f" + integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== -eslint-config-prettier@^8.3.0: - version "8.5.0" - resolved "https://registry.npmmirror.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" - integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== - -eslint-plugin-prettier@^3.4.0: - version "3.4.1" - resolved "https://registry.npmmirror.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz#e9ddb200efb6f3d05ffe83b1665a716af4a387e5" - integrity sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g== +eslint-plugin-prettier@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz#17cfade9e732cef32b5f5be53bd4e07afd8e67e1" + integrity sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw== dependencies: prettier-linter-helpers "^1.0.0" + synckit "^0.8.6" -eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.npmmirror.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-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.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@^1.1.0, eslint-visitor-keys@^1.3.0: - version "1.3.0" - resolved "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - -eslint@^7.27.0: - version "7.32.0" - resolved "https://registry.npmmirror.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" - integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== - dependencies: - "@babel/code-frame" "7.12.11" - "@eslint/eslintrc" "^0.4.3" - "@humanwhocodes/config-array" "^0.5.0" - ajv "^6.10.0" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.0.1" - doctrine "^3.0.0" - enquirer "^2.3.5" - escape-string-regexp "^4.0.0" - eslint-scope "^5.1.1" - eslint-utils "^2.1.0" - eslint-visitor-keys "^2.0.0" - espree "^7.3.1" - esquery "^1.4.0" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^5.1.2" - globals "^13.6.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - js-yaml "^3.13.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.0.4" - natural-compare "^1.4.0" - optionator "^0.9.1" - progress "^2.0.0" - regexpp "^3.1.0" - semver "^7.2.1" - strip-ansi "^6.0.0" - strip-json-comments "^3.1.0" - table "^6.0.9" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - -espree@^7.3.0, espree@^7.3.1: - version "7.3.1" - resolved "https://registry.npmmirror.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" - integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== - dependencies: - acorn "^7.4.0" - acorn-jsx "^5.3.1" - eslint-visitor-keys "^1.3.0" +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: + 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== esprima@^4.0.0: version "4.0.1" resolved "https://registry.npmmirror.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.npmmirror.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.npmmirror.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.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - etag@~1.8.1: version "1.8.1" resolved "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" @@ -2108,11 +1902,6 @@ fast-jwt@^2.0.0: ecdsa-sig-formatter "^1.0.11" mnemonist "^0.39.5" -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - fast-querystring@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/fast-querystring/-/fast-querystring-1.1.1.tgz#f4c56ef56b1a954880cfd8c01b83f9e1a3d3fda2" @@ -2235,13 +2024,6 @@ fastseries@^1.7.0: reusify "^1.0.0" xtend "^4.0.0" -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - fill-range@^7.0.1: version "7.0.1" resolved "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -2271,19 +2053,6 @@ find-my-way@^7.6.0: fast-querystring "^1.0.0" safe-regex2 "^2.0.0" -flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== - dependencies: - flatted "^3.1.0" - rimraf "^3.0.2" - -flatted@^3.1.0: - version "3.2.7" - resolved "https://registry.npmmirror.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== - follow-redirects@^1.14.0: version "1.15.2" resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" @@ -2380,11 +2149,6 @@ function.prototype.name@^1.1.5: es-abstract "^1.19.0" functions-have-names "^1.2.2" -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== - functions-have-names@^1.2.2: version "1.2.3" resolved "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" @@ -2453,16 +2217,9 @@ global@~4.4.0: min-document "^2.19.0" process "^0.11.10" -globals@^13.6.0, globals@^13.9.0: - version "13.17.0" - resolved "https://registry.npmmirror.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4" - integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== - dependencies: - type-fest "^0.20.2" - -globby@^11.0.3: +globby@^11.1.0: version "11.1.0" - resolved "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: array-union "^2.1.0" @@ -2513,6 +2270,11 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6: resolved "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + har-schema@^2.0.0: version "2.0.0" resolved "https://registry.npmmirror.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" @@ -2536,11 +2298,6 @@ has-flag@^3.0.0: resolved "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - has-property-descriptors@^1.0.0: version "1.0.0" resolved "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" @@ -2663,28 +2420,15 @@ ieee754@^1.1.13, ieee754@^1.2.1: resolved "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.npmmirror.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -ignore@^5.1.8, ignore@^5.2.0: +ignore@^5.2.0: version "5.2.0" resolved "https://registry.npmmirror.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== -import-fresh@^3.0.0, import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== +ignore@^5.2.4: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" + integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== inflight@^1.0.4: version "1.0.6" @@ -2767,11 +2511,6 @@ is-extglob@^2.1.1: resolved "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - is-function@^1.0.1: version "1.0.2" resolved "https://registry.npmmirror.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" @@ -2784,7 +2523,7 @@ is-generator-function@^1.0.7: dependencies: has-tostringtag "^1.0.0" -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: +is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== @@ -2878,11 +2617,6 @@ isarray@~1.0.0: resolved "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - isstream@~0.1.2: version "0.1.2" resolved "https://registry.npmmirror.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -2936,11 +2670,6 @@ json-schema@0.4.0: resolved "https://registry.npmmirror.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.npmmirror.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -2991,14 +2720,6 @@ keyv@^4.0.0: dependencies: json-buffer "3.0.1" -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - light-my-request@^5.6.1: version "5.9.1" resolved "https://registry.yarnpkg.com/light-my-request/-/light-my-request-5.9.1.tgz#076f8d4cc4639408cc48381d4f2860212d469d4b" @@ -3008,16 +2729,6 @@ light-my-request@^5.6.1: process-warning "^2.0.0" set-cookie-parser "^2.4.1" -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.npmmirror.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== - lodash@^4.17.15, lodash@^4.17.20: version "4.17.21" resolved "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" @@ -3163,6 +2874,13 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.npmmirror.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== +minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + minimatch@^3.0.4, minimatch@^3.1.1: version "3.1.2" resolved "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -3476,18 +3194,6 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.npmmirror.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== - 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" - p-cancelable@^2.0.0: version "2.1.1" resolved "https://registry.npmmirror.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" @@ -3498,13 +3204,6 @@ p-cancelable@^3.0.0: resolved "https://registry.npmmirror.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - parse-asn1@^5.0.0, parse-asn1@^5.1.5: version "5.1.6" resolved "https://registry.npmmirror.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" @@ -3531,11 +3230,6 @@ path-is-absolute@^1.0.0: resolved "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - path-parse@^1.0.7: version "1.0.7" resolved "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" @@ -3607,11 +3301,6 @@ pino@^8.5.0: sonic-boom "^3.1.0" thread-stream "^2.0.0" -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - prettier-linter-helpers@^1.0.0: version "1.0.0" resolved "https://registry.npmmirror.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" @@ -3619,10 +3308,10 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@^2.3.0: - version "2.7.1" - resolved "https://registry.npmmirror.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" - integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== +prettier@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.4.tgz#4723cadeac2ce7c9227de758e5ff9b14e075f283" + integrity sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ== printj@~1.1.0: version "1.1.2" @@ -3644,11 +3333,6 @@ process@^0.11.10: resolved "https://registry.npmmirror.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.npmmirror.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - proxy-addr@^2.0.7, proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -3848,11 +3532,6 @@ regexp.prototype.flags@^1.4.3: define-properties "^1.1.3" functions-have-names "^1.2.2" -regexpp@^3.1.0: - version "3.2.0" - resolved "https://registry.npmmirror.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - request@^2.79.0: version "2.88.2" resolved "https://registry.npmmirror.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" @@ -3902,11 +3581,6 @@ resolve-from@^2.0.0: resolved "https://registry.npmmirror.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" integrity sha512-qpFcKaXsq8+oRoLilkwyc7zHGF5i9Q2/25NIgLQQ/+VVv9rU4qvr6nXVAw1DsnXJyQkZsR4Ytfbtg5ehfcUssQ== -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - resolve@^1.0.0, resolve@^1.3.2: version "1.22.1" resolved "https://registry.npmmirror.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" @@ -3945,13 +3619,6 @@ rimraf@^2.6.1: dependencies: glob "^7.1.3" -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.npmmirror.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" @@ -4041,13 +3708,20 @@ semver@^5.1.0, semver@^5.3.0: resolved "https://registry.npmmirror.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^7.2.1, semver@^7.3.2, semver@^7.3.5, semver@^7.3.7: +semver@^7.3.2, semver@^7.3.7: version "7.3.8" resolved "https://registry.npmmirror.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== dependencies: lru-cache "^6.0.0" +semver@^7.5.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + send@0.18.0: version "0.18.0" resolved "https://registry.npmmirror.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" @@ -4111,18 +3785,6 @@ sha.js@^2.4.0, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - side-channel@^1.0.4: version "1.0.4" resolved "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" @@ -4156,15 +3818,6 @@ slash@^3.0.0: resolved "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - sliced@1.0.1: version "1.0.1" resolved "https://registry.npmmirror.com/sliced/-/sliced-1.0.1.tgz#0b3a662b5d04c3177b1926bea82b03f837a2ef41" @@ -4260,15 +3913,6 @@ strict-uri-encode@^1.0.0: resolved "https://registry.npmmirror.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ== -string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - string.prototype.trimend@^1.0.5: version "1.0.5" resolved "https://registry.npmmirror.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" @@ -4301,13 +3945,6 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.npmmirror.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -4325,11 +3962,6 @@ strip-json-comments@^2.0.0: resolved "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - strnum@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" @@ -4342,13 +3974,6 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" @@ -4371,16 +3996,13 @@ swarm-js@^0.1.40: tar "^4.0.2" xhr-request "^1.0.1" -table@^6.0.9: - version "6.8.0" - resolved "https://registry.npmmirror.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" - integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== +synckit@^0.8.6: + version "0.8.8" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.8.tgz#fe7fe446518e3d3d49f5e429f443cf08b6edfcd7" + integrity sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ== dependencies: - ajv "^8.0.1" - lodash.truncate "^4.4.2" - slice-ansi "^4.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" + "@pkgr/core" "^0.1.0" + tslib "^2.6.2" tar@^4.0.2: version "4.4.19" @@ -4395,11 +4017,6 @@ tar@^4.0.2: safe-buffer "^5.2.1" yallist "^3.1.1" -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - thread-stream@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-2.3.0.tgz#4fc07fb39eff32ae7bad803cb7dd9598349fed33" @@ -4462,6 +4079,11 @@ tree-kill@^1.2.2: resolved "https://registry.npmmirror.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== +ts-api-utils@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331" + integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg== + ts-node-dev@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ts-node-dev/-/ts-node-dev-2.0.0.tgz#bdd53e17ab3b5d822ef519928dc6b4a7e0f13065" @@ -4527,6 +4149,11 @@ tslib@^2.0.1: resolved "https://registry.npmmirror.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== +tslib@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + tslint@^6.1.1: version "6.1.3" resolved "https://registry.npmmirror.com/tslint/-/tslint-6.1.3.tgz#5c23b2eccc32487d5523bd3a470e9aa31789d904" @@ -4553,13 +4180,6 @@ tsutils@^2.29.0: dependencies: tslib "^1.8.1" -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.npmmirror.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.npmmirror.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -4582,18 +4202,6 @@ tweetnacl@^1.0.3: resolved "https://registry.npmmirror.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - type-is@~1.6.18: version "1.6.18" resolved "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -4619,10 +4227,10 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@^4.1.3: - version "4.8.4" - resolved "https://registry.npmmirror.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" - integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== +typescript@^5.3.3: + version "5.3.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" + integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== ultron@~1.1.0: version "1.1.1" @@ -4710,11 +4318,6 @@ v8-compile-cache-lib@^3.0.1: resolved "https://registry.npmmirror.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== -v8-compile-cache@^2.0.3: - version "2.3.0" - resolved "https://registry.npmmirror.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== - varint@^5.0.0: version "5.0.2" resolved "https://registry.npmmirror.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" @@ -5012,23 +4615,11 @@ which-typed-array@^1.1.2: has-tostringtag "^1.0.0" is-typed-array "^1.1.9" -which@^2.0.1: - version "2.0.2" - resolved "https://registry.npmmirror.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - wmf@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/wmf/-/wmf-1.0.2.tgz#7d19d621071a08c2bdc6b7e688a9c435298cc2da" integrity sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw== -word-wrap@^1.2.3: - version "1.2.3" - resolved "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - word@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/word/-/word-0.3.0.tgz#8542157e4f8e849f4a363a288992d47612db9961"