From f5e9dac302f71865b072c6000235e2c607d96dd8 Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Wed, 9 Apr 2025 10:15:15 +0200 Subject: [PATCH 1/7] perf: cache usd rate map from API --- src/cached.ts | 32 ++++++++ src/external-api.ts | 123 +++++++++++++++++++++++------- src/factory/factory-api.ts | 2 +- src/pools/subClasses/corePool.ts | 6 +- src/pools/subClasses/statsPool.ts | 2 +- src/pools/utils.ts | 2 +- src/utils.ts | 73 +----------------- 7 files changed, 135 insertions(+), 105 deletions(-) create mode 100644 src/cached.ts diff --git a/src/cached.ts b/src/cached.ts new file mode 100644 index 00000000..63aaaa70 --- /dev/null +++ b/src/cached.ts @@ -0,0 +1,32 @@ +import memoize from "memoizee"; +import {IDict, IExtendedPoolDataFromApi, INetworkName, IPoolType} from "./interfaces.js"; +import {uncached_getAllPoolsFromApi, uncached_getUsdPricesFromApi} from './external-api.js' + +const _getCachedData = memoize( + async (network: INetworkName, isLiteChain: boolean) => { + const allPools = await uncached_getAllPoolsFromApi(network, isLiteChain); + const poolLists = Object.values(allPools) + const usdPrices = uncached_getUsdPricesFromApi(poolLists); + return { allPools, poolLists, usdPrices } + }, + { + promise: true, + maxAge: 5 * 60 * 1000, // 5m + } +) + +export const _getPoolsFromApi = + async (network: INetworkName, poolType: IPoolType, isLiteChain = false): Promise => { + const {allPools} = await _getCachedData(network, isLiteChain); + return allPools[poolType] + } + +export const _getAllPoolsFromApi = async (network: INetworkName, isLiteChain = false): Promise => { + const {poolLists} = await _getCachedData(network, isLiteChain); + return poolLists +} + +export const _getUsdPricesFromApi = async (): Promise> => { + const {usdPrices} = await _getCachedData("ethereum", false); + return usdPrices +} diff --git a/src/external-api.ts b/src/external-api.ts index 5b93d097..97da7666 100644 --- a/src/external-api.ts +++ b/src/external-api.ts @@ -12,38 +12,103 @@ import { } from "./interfaces"; -export const _getPoolsFromApi = memoize( - async (network: INetworkName, poolType: IPoolType, isLiteChain = false): Promise => { - const api = isLiteChain ? "https://api-core.curve.fi/v1/" : "https://api.curve.fi/api"; - const url = `${api}/getPools/${network}/${poolType}`; - return await fetchData(url) ?? { poolData: [], tvl: 0, tvlAll: 0 }; - }, - { - promise: true, - maxAge: 5 * 60 * 1000, // 5m +const uncached_getPoolsFromApi = async (network: INetworkName, poolType: IPoolType, isLiteChain = false): Promise => { + const api = isLiteChain ? "https://api-core.curve.fi/v1/" : "https://api.curve.fi/api"; + const url = `${api}/getPools/${network}/${poolType}`; + return await fetchData(url) ?? { poolData: [], tvl: 0, tvlAll: 0 }; +} + +export const uncached_getAllPoolsFromApi = async (network: INetworkName, isLiteChain = false): Promise> => { + const poolTypes = isLiteChain ? [ + "factory-twocrypto", + "factory-tricrypto", + "factory-stable-ng", + ] as const : [ + "main", + "crypto", + "factory", + "factory-crvusd", + "factory-eywa", + "factory-crypto", + "factory-twocrypto", + "factory-tricrypto", + "factory-stable-ng", + ] as const; + return Object.fromEntries( + await Promise.all(poolTypes.map(async (poolType) => { + const data = await uncached_getPoolsFromApi(network, poolType, isLiteChain); + return [poolType, data]; + })) + ) +} + +export const uncached_getUsdPricesFromApi = async (allTypesExtendedPoolData: IExtendedPoolDataFromApi[]): Promise> => { + const priceDict: IDict[]> = {}; + const priceDictByMaxTvl: IDict = {}; + + for (const extendedPoolData of allTypesExtendedPoolData) { + for (const pool of extendedPoolData.poolData) { + const lpTokenAddress = pool.lpTokenAddress ?? pool.address; + const totalSupply = pool.totalSupply / (10 ** 18); + if(lpTokenAddress.toLowerCase() in priceDict) { + priceDict[lpTokenAddress.toLowerCase()].push({ + price: pool.usdTotal && totalSupply ? pool.usdTotal / totalSupply : 0, + tvl: pool.usdTotal, + }) + } else { + priceDict[lpTokenAddress.toLowerCase()] = [] + priceDict[lpTokenAddress.toLowerCase()].push({ + price: pool.usdTotal && totalSupply ? pool.usdTotal / totalSupply : 0, + tvl: pool.usdTotal, + }) + } + + for (const coin of pool.coins) { + if (typeof coin.usdPrice === "number") { + if(coin.address.toLowerCase() in priceDict) { + priceDict[coin.address.toLowerCase()].push({ + price: coin.usdPrice, + tvl: pool.usdTotal, + }) + } else { + priceDict[coin.address.toLowerCase()] = [] + priceDict[coin.address.toLowerCase()].push({ + price: coin.usdPrice, + tvl: pool.usdTotal, + }) + } + } + } + + for (const coin of pool.gaugeRewards ?? []) { + if (typeof coin.tokenPrice === "number") { + if(coin.tokenAddress.toLowerCase() in priceDict) { + priceDict[coin.tokenAddress.toLowerCase()].push({ + price: coin.tokenPrice, + tvl: pool.usdTotal, + }); + } else { + priceDict[coin.tokenAddress.toLowerCase()] = [] + priceDict[coin.tokenAddress.toLowerCase()].push({ + price: coin.tokenPrice, + tvl: pool.usdTotal, + }); + } + } + } + } } -) -export const _getAllPoolsFromApi = async (network: INetworkName, isLiteChain = false): Promise => { - if(isLiteChain) { - return await Promise.all([ - _getPoolsFromApi(network, "factory-twocrypto", isLiteChain), - _getPoolsFromApi(network, "factory-tricrypto", isLiteChain), - _getPoolsFromApi(network, "factory-stable-ng", isLiteChain), - ]); - } else { - return await Promise.all([ - _getPoolsFromApi(network, "main", isLiteChain), - _getPoolsFromApi(network, "crypto", isLiteChain), - _getPoolsFromApi(network, "factory", isLiteChain), - _getPoolsFromApi(network, "factory-crvusd", isLiteChain), - _getPoolsFromApi(network, "factory-eywa", isLiteChain), - _getPoolsFromApi(network, "factory-crypto", isLiteChain), - _getPoolsFromApi(network, "factory-twocrypto", isLiteChain), - _getPoolsFromApi(network, "factory-tricrypto", isLiteChain), - _getPoolsFromApi(network, "factory-stable-ng", isLiteChain), - ]); + for(const address in priceDict) { + if (priceDict[address].length) { + const maxTvlItem = priceDict[address].reduce((prev, current) => +current.tvl > +prev.tvl ? current : prev); + priceDictByMaxTvl[address] = maxTvlItem.price + } else { + priceDictByMaxTvl[address] = 0 + } } + + return priceDictByMaxTvl } export const _getSubgraphData = memoize( diff --git a/src/factory/factory-api.ts b/src/factory/factory-api.ts index ba51ae5c..8760e540 100644 --- a/src/factory/factory-api.ts +++ b/src/factory/factory-api.ts @@ -8,7 +8,7 @@ import twocryptoFactorySwapABI from "../constants/abis/factory-twocrypto/factory import tricryptoFactorySwapABI from "../constants/abis/factory-tricrypto/factory-tricrypto-pool.json" with { type: 'json' }; import tricryptoFactoryEthDisabledSwapABI from "../constants/abis/factory-tricrypto/factory-tricrypto-pool-eth-disabled.json" with { type: 'json' }; import { getPoolIdByAddress, setFactoryZapContracts } from "./common.js"; -import { _getPoolsFromApi } from "../external-api.js"; +import { _getPoolsFromApi } from "../cached.js"; import {assetTypeNameHandler, getPoolName, isStableNgPool} from "../utils.js"; import StableNgBasePoolZapABI from "../constants/abis/stable-ng-base-pool-zap.json" with { type: 'json' }; import MetaStableSwapNGABI from "../constants/abis/factory-stable-ng/meta-stableswap-ng.json" with { type: 'json' }; diff --git a/src/pools/subClasses/corePool.ts b/src/pools/subClasses/corePool.ts index 3a4bee73..1134dfd2 100644 --- a/src/pools/subClasses/corePool.ts +++ b/src/pools/subClasses/corePool.ts @@ -69,7 +69,11 @@ export class CorePool implements ICorePool { inApi: boolean; constructor(id: string) { - const poolData = curve.getPoolsData()[id]; + const poolsData = curve.getPoolsData(); + if (!poolsData[id]) { + throw new Error(`Pool ${id} not found. Available pools: ${Object.keys(poolsData).join(', ')}`); + } + const poolData = poolsData[id]; this.id = id; this.name = poolData.name; diff --git a/src/pools/subClasses/statsPool.ts b/src/pools/subClasses/statsPool.ts index 1505c01c..ddc26ef1 100644 --- a/src/pools/subClasses/statsPool.ts +++ b/src/pools/subClasses/statsPool.ts @@ -1,6 +1,6 @@ import { curve } from "../../curve.js"; import {IPoolType, IReward} from '../../interfaces.js'; -import {_getPoolsFromApi} from '../../external-api.js'; +import {_getPoolsFromApi} from '../../cached.js'; import { _getUsdRate, BN, diff --git a/src/pools/utils.ts b/src/pools/utils.ts index c7f44405..eb84c07b 100644 --- a/src/pools/utils.ts +++ b/src/pools/utils.ts @@ -2,7 +2,7 @@ import { getPool } from "./poolConstructor.js"; import { IDict } from "../interfaces"; import { curve } from "../curve.js"; import { _getRewardsFromApi, _getUsdRate, _setContracts, toBN } from "../utils.js"; -import { _getAllPoolsFromApi } from "../external-api.js"; +import { _getAllPoolsFromApi } from "../cached.js"; import ERC20Abi from "../constants/abis/ERC20.json" with { type: 'json' }; // _userLpBalance: { address: { poolId: { _lpBalance: 0, time: 0 } } } diff --git a/src/utils.ts b/src/utils.ts index ff898c9e..75dea5e4 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -15,13 +15,13 @@ import { } from './interfaces'; import {curve} from "./curve.js"; import { - _getAllPoolsFromApi, _getCurveLiteNetworks, _getFactoryAPYs, _getLiteNetworksData, _getSubgraphData, _getVolumes, } from "./external-api.js"; +import {_getAllPoolsFromApi, _getUsdPricesFromApi} from "./cached.js"; import ERC20Abi from './constants/abis/ERC20.json' with { type: 'json' }; import {L2Networks} from './constants/L2Networks.js'; import {volumeNetworks} from "./constants/volumeNetworks.js"; @@ -316,77 +316,6 @@ export const getPoolIdBySwapAddress = (swapAddress: string): string => { return poolIds[0][0]; } -export const _getUsdPricesFromApi = async (): Promise> => { - const network = curve.constants.NETWORK_NAME; - const allTypesExtendedPoolData = await _getAllPoolsFromApi(network, curve.isLiteChain); - const priceDict: IDict[]> = {}; - const priceDictByMaxTvl: IDict = {}; - - for (const extendedPoolData of allTypesExtendedPoolData) { - for (const pool of extendedPoolData.poolData) { - const lpTokenAddress = pool.lpTokenAddress ?? pool.address; - const totalSupply = pool.totalSupply / (10 ** 18); - if(lpTokenAddress.toLowerCase() in priceDict) { - priceDict[lpTokenAddress.toLowerCase()].push({ - price: pool.usdTotal && totalSupply ? pool.usdTotal / totalSupply : 0, - tvl: pool.usdTotal, - }) - } else { - priceDict[lpTokenAddress.toLowerCase()] = [] - priceDict[lpTokenAddress.toLowerCase()].push({ - price: pool.usdTotal && totalSupply ? pool.usdTotal / totalSupply : 0, - tvl: pool.usdTotal, - }) - } - - for (const coin of pool.coins) { - if (typeof coin.usdPrice === "number") { - if(coin.address.toLowerCase() in priceDict) { - priceDict[coin.address.toLowerCase()].push({ - price: coin.usdPrice, - tvl: pool.usdTotal, - }) - } else { - priceDict[coin.address.toLowerCase()] = [] - priceDict[coin.address.toLowerCase()].push({ - price: coin.usdPrice, - tvl: pool.usdTotal, - }) - } - } - } - - for (const coin of pool.gaugeRewards ?? []) { - if (typeof coin.tokenPrice === "number") { - if(coin.tokenAddress.toLowerCase() in priceDict) { - priceDict[coin.tokenAddress.toLowerCase()].push({ - price: coin.tokenPrice, - tvl: pool.usdTotal, - }); - } else { - priceDict[coin.tokenAddress.toLowerCase()] = [] - priceDict[coin.tokenAddress.toLowerCase()].push({ - price: coin.tokenPrice, - tvl: pool.usdTotal, - }); - } - } - } - } - } - - for(const address in priceDict) { - if (priceDict[address].length) { - const maxTvlItem = priceDict[address].reduce((prev, current) => +current.tvl > +prev.tvl ? current : prev); - priceDictByMaxTvl[address] = maxTvlItem.price - } else { - priceDictByMaxTvl[address] = 0 - } - } - - return priceDictByMaxTvl -} - export const _getCrvApyFromApi = async (): Promise> => { const network = curve.constants.NETWORK_NAME; const allTypesExtendedPoolData = await _getAllPoolsFromApi(network, curve.isLiteChain); From e22c8bc8f199035b715653778d0cd48dccc42fb5 Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Wed, 9 Apr 2025 10:23:26 +0200 Subject: [PATCH 2/7] perf: cache crv APY dict --- src/cached.ts | 23 ++++++++++++++++------- src/external-api.ts | 20 ++++++++++++++++++++ src/pools/subClasses/statsPool.ts | 3 +-- src/utils.ts | 20 -------------------- 4 files changed, 37 insertions(+), 29 deletions(-) diff --git a/src/cached.ts b/src/cached.ts index 63aaaa70..9ee880d5 100644 --- a/src/cached.ts +++ b/src/cached.ts @@ -1,13 +1,15 @@ import memoize from "memoizee"; import {IDict, IExtendedPoolDataFromApi, INetworkName, IPoolType} from "./interfaces.js"; -import {uncached_getAllPoolsFromApi, uncached_getUsdPricesFromApi} from './external-api.js' +import {uncached_getAllPoolsFromApi, uncached_getCrvApyFromApi, uncached_getUsdPricesFromApi} from './external-api.js' +import {curve} from "./curve"; const _getCachedData = memoize( async (network: INetworkName, isLiteChain: boolean) => { - const allPools = await uncached_getAllPoolsFromApi(network, isLiteChain); - const poolLists = Object.values(allPools) + const poolsDict = await uncached_getAllPoolsFromApi(network, isLiteChain); + const poolLists = Object.values(poolsDict) const usdPrices = uncached_getUsdPricesFromApi(poolLists); - return { allPools, poolLists, usdPrices } + const crvApy = uncached_getCrvApyFromApi(poolLists) + return { poolsDict, poolLists, usdPrices, crvApy }; }, { promise: true, @@ -17,8 +19,8 @@ const _getCachedData = memoize( export const _getPoolsFromApi = async (network: INetworkName, poolType: IPoolType, isLiteChain = false): Promise => { - const {allPools} = await _getCachedData(network, isLiteChain); - return allPools[poolType] + const {poolsDict} = await _getCachedData(network, isLiteChain); + return poolsDict[poolType] } export const _getAllPoolsFromApi = async (network: INetworkName, isLiteChain = false): Promise => { @@ -27,6 +29,13 @@ export const _getAllPoolsFromApi = async (network: INetworkName, isLiteChain = f } export const _getUsdPricesFromApi = async (): Promise> => { - const {usdPrices} = await _getCachedData("ethereum", false); + const network = curve.constants.NETWORK_NAME; + const {usdPrices} = await _getCachedData(network, false); return usdPrices } + +export const _getCrvApyFromApi = async (): Promise> => { + const network = curve.constants.NETWORK_NAME; + const {crvApy} = await _getCachedData(network, false); + return crvApy +} diff --git a/src/external-api.ts b/src/external-api.ts index 97da7666..79db3b12 100644 --- a/src/external-api.ts +++ b/src/external-api.ts @@ -10,6 +10,8 @@ import { IPoolType, IVolumeAndAPYs, } from "./interfaces"; +import {curve} from "./curve"; +import {_getAllPoolsFromApi} from "./cached"; const uncached_getPoolsFromApi = async (network: INetworkName, poolType: IPoolType, isLiteChain = false): Promise => { @@ -111,6 +113,24 @@ export const uncached_getUsdPricesFromApi = async (allTypesExtendedPoolData: IE return priceDictByMaxTvl } +export const uncached_getCrvApyFromApi = (allTypesExtendedPoolData: IExtendedPoolDataFromApi[]): IDict<[number, number]> => { + const apyDict: IDict<[number, number]> = {}; + + for (const extendedPoolData of allTypesExtendedPoolData) { + for (const pool of extendedPoolData.poolData) { + if (pool.gaugeAddress) { + if (!pool.gaugeCrvApy) { + apyDict[pool.gaugeAddress.toLowerCase()] = [0, 0]; + } else { + apyDict[pool.gaugeAddress.toLowerCase()] = [pool.gaugeCrvApy[0] ?? 0, pool.gaugeCrvApy[1] ?? 0]; + } + } + } + } + + return apyDict +} + export const _getSubgraphData = memoize( async (network: INetworkName): Promise => { const data = await fetchData(`https://api.curve.fi/api/getSubgraphData/${network}`); diff --git a/src/pools/subClasses/statsPool.ts b/src/pools/subClasses/statsPool.ts index ddc26ef1..36b4e55b 100644 --- a/src/pools/subClasses/statsPool.ts +++ b/src/pools/subClasses/statsPool.ts @@ -1,11 +1,10 @@ import { curve } from "../../curve.js"; import {IPoolType, IReward} from '../../interfaces.js'; -import {_getPoolsFromApi} from '../../cached.js'; +import {_getPoolsFromApi,_getCrvApyFromApi} from '../../cached.js'; import { _getUsdRate, BN, toBN, - _getCrvApyFromApi, _getRewardsFromApi, getVolumeApiController, } from '../../utils.js'; diff --git a/src/utils.ts b/src/utils.ts index 75dea5e4..438a4f99 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -316,26 +316,6 @@ export const getPoolIdBySwapAddress = (swapAddress: string): string => { return poolIds[0][0]; } -export const _getCrvApyFromApi = async (): Promise> => { - const network = curve.constants.NETWORK_NAME; - const allTypesExtendedPoolData = await _getAllPoolsFromApi(network, curve.isLiteChain); - const apyDict: IDict<[number, number]> = {}; - - for (const extendedPoolData of allTypesExtendedPoolData) { - for (const pool of extendedPoolData.poolData) { - if (pool.gaugeAddress) { - if (!pool.gaugeCrvApy) { - apyDict[pool.gaugeAddress.toLowerCase()] = [0, 0]; - } else { - apyDict[pool.gaugeAddress.toLowerCase()] = [pool.gaugeCrvApy[0] ?? 0, pool.gaugeCrvApy[1] ?? 0]; - } - } - } - } - - return apyDict -} - export const _getRewardsFromApi = async (): Promise> => { const network = curve.constants.NETWORK_NAME; const allTypesExtendedPoolData = await _getAllPoolsFromApi(network, curve.isLiteChain); From 0d54b2e8d245147176ab0990325427aa1a79c6c8 Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Wed, 9 Apr 2025 10:27:51 +0200 Subject: [PATCH 3/7] chore: self-review --- src/cached.ts | 1 + src/external-api.ts | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/cached.ts b/src/cached.ts index 9ee880d5..90a9d052 100644 --- a/src/cached.ts +++ b/src/cached.ts @@ -14,6 +14,7 @@ const _getCachedData = memoize( { promise: true, maxAge: 5 * 60 * 1000, // 5m + primitive: true, } ) diff --git a/src/external-api.ts b/src/external-api.ts index 79db3b12..14119a33 100644 --- a/src/external-api.ts +++ b/src/external-api.ts @@ -10,8 +10,6 @@ import { IPoolType, IVolumeAndAPYs, } from "./interfaces"; -import {curve} from "./curve"; -import {_getAllPoolsFromApi} from "./cached"; const uncached_getPoolsFromApi = async (network: INetworkName, poolType: IPoolType, isLiteChain = false): Promise => { From cfea777c246137c94754aca458e3e16a1a956885 Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Wed, 9 Apr 2025 10:55:14 +0200 Subject: [PATCH 4/7] fix: remove async --- src/external-api.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/external-api.ts b/src/external-api.ts index 14119a33..8f24112d 100644 --- a/src/external-api.ts +++ b/src/external-api.ts @@ -42,7 +42,7 @@ export const uncached_getAllPoolsFromApi = async (network: INetworkName, isLiteC ) } -export const uncached_getUsdPricesFromApi = async (allTypesExtendedPoolData: IExtendedPoolDataFromApi[]): Promise> => { +export const uncached_getUsdPricesFromApi = (allTypesExtendedPoolData: IExtendedPoolDataFromApi[]): IDict => { const priceDict: IDict[]> = {}; const priceDictByMaxTvl: IDict = {}; From fd9b4dab644fefa2a713e58fb79ef0ff5db7d24d Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Wed, 9 Apr 2025 12:38:02 +0200 Subject: [PATCH 5/7] chore: review comments --- src/cached.ts | 10 +++++++--- src/external-api.ts | 29 ++++++++--------------------- 2 files changed, 15 insertions(+), 24 deletions(-) diff --git a/src/cached.ts b/src/cached.ts index 90a9d052..8f6ca58e 100644 --- a/src/cached.ts +++ b/src/cached.ts @@ -1,14 +1,18 @@ import memoize from "memoizee"; import {IDict, IExtendedPoolDataFromApi, INetworkName, IPoolType} from "./interfaces.js"; -import {uncached_getAllPoolsFromApi, uncached_getCrvApyFromApi, uncached_getUsdPricesFromApi} from './external-api.js' +import {uncached_getAllPoolsFromApi, createCrvApyDict, createUsdPricesDict} from './external-api.js' import {curve} from "./curve"; +/** + * This function is used to cache the data fetched from the API and the data derived from it. + * Note: do not expose this function to the outside world, instead encapsulate it in a function that returns the data you need. + */ const _getCachedData = memoize( async (network: INetworkName, isLiteChain: boolean) => { const poolsDict = await uncached_getAllPoolsFromApi(network, isLiteChain); const poolLists = Object.values(poolsDict) - const usdPrices = uncached_getUsdPricesFromApi(poolLists); - const crvApy = uncached_getCrvApyFromApi(poolLists) + const usdPrices = createUsdPricesDict(poolLists); + const crvApy = createCrvApyDict(poolLists) return { poolsDict, poolLists, usdPrices, crvApy }; }, { diff --git a/src/external-api.ts b/src/external-api.ts index 8f24112d..4b67f1f2 100644 --- a/src/external-api.ts +++ b/src/external-api.ts @@ -18,31 +18,18 @@ const uncached_getPoolsFromApi = async (network: INetworkName, poolType: IPoolTy return await fetchData(url) ?? { poolData: [], tvl: 0, tvlAll: 0 }; } -export const uncached_getAllPoolsFromApi = async (network: INetworkName, isLiteChain = false): Promise> => { - const poolTypes = isLiteChain ? [ - "factory-twocrypto", - "factory-tricrypto", - "factory-stable-ng", - ] as const : [ - "main", - "crypto", - "factory", - "factory-crvusd", - "factory-eywa", - "factory-crypto", - "factory-twocrypto", - "factory-tricrypto", - "factory-stable-ng", - ] as const; - return Object.fromEntries( - await Promise.all(poolTypes.map(async (poolType) => { +const getPoolTypes = (isLiteChain: boolean) => isLiteChain ? ["factory-twocrypto", "factory-tricrypto", "factory-stable-ng"] as const : + ["main", "crypto", "factory", "factory-crvusd", "factory-eywa", "factory-crypto", "factory-twocrypto", "factory-tricrypto", "factory-stable-ng"] as const; + +export const uncached_getAllPoolsFromApi = async (network: INetworkName, isLiteChain = false): Promise> => + Object.fromEntries( + await Promise.all(getPoolTypes(isLiteChain).map(async (poolType) => { const data = await uncached_getPoolsFromApi(network, poolType, isLiteChain); return [poolType, data]; })) ) -} -export const uncached_getUsdPricesFromApi = (allTypesExtendedPoolData: IExtendedPoolDataFromApi[]): IDict => { +export const createUsdPricesDict = (allTypesExtendedPoolData: IExtendedPoolDataFromApi[]): IDict => { const priceDict: IDict[]> = {}; const priceDictByMaxTvl: IDict = {}; @@ -111,7 +98,7 @@ export const uncached_getUsdPricesFromApi = (allTypesExtendedPoolData: IExtende return priceDictByMaxTvl } -export const uncached_getCrvApyFromApi = (allTypesExtendedPoolData: IExtendedPoolDataFromApi[]): IDict<[number, number]> => { +export const createCrvApyDict = (allTypesExtendedPoolData: IExtendedPoolDataFromApi[]): IDict<[number, number]> => { const apyDict: IDict<[number, number]> = {}; for (const extendedPoolData of allTypesExtendedPoolData) { From 1b9bcc809ced3094e7c9d451d8d42009810e9b8e Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Wed, 21 May 2025 14:20:55 +0200 Subject: [PATCH 6/7] build: v2.66.27 --- package-lock.json | 104 ++++++++++++++++++++++------------------------ package.json | 17 ++++---- 2 files changed, 58 insertions(+), 63 deletions(-) diff --git a/package-lock.json b/package-lock.json index cb623b31..b67bb16e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,18 +1,18 @@ { "name": "@curvefi/api", - "version": "2.66.24", + "version": "2.66.27", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@curvefi/api", - "version": "2.66.24", + "version": "2.66.27", "license": "MIT", "dependencies": { - "@curvefi/ethcall": "6.0.12", - "bignumber.js": "^9.1.2", - "ethers": "^6.13.4", - "memoizee": "^0.4.17" + "@curvefi/ethcall": "6.0.13", + "bignumber.js": "9.3.0", + "ethers": "6.14.1", + "memoizee": "0.4.17" }, "devDependencies": { "@babel/eslint-parser": "^7.25.9", @@ -56,16 +56,16 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", + "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" @@ -214,9 +214,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, "license": "MIT", "peer": true, @@ -225,9 +225,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true, "license": "MIT", "peer": true, @@ -247,29 +247,29 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz", - "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz", + "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.9" + "@babel/template": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", - "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz", + "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/types": "^7.26.9" + "@babel/types": "^7.27.1" }, "bin": { "parser": "bin/babel-parser.js" @@ -279,16 +279,16 @@ } }, "node_modules/@babel/template": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", - "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.26.9", - "@babel/types": "^7.26.9" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -326,24 +326,25 @@ } }, "node_modules/@babel/types": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", - "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", + "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@curvefi/ethcall": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/@curvefi/ethcall/-/ethcall-6.0.12.tgz", - "integrity": "sha512-OWfeJGlWQHs27PUHwXsiW26Mqy7s0+ZXAewOznVyrT1m173JZkuhTglhHhiRaJHnYUNm4s9xrueW1AqnS+R68w==", + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/@curvefi/ethcall/-/ethcall-6.0.13.tgz", + "integrity": "sha512-SY8k/QqhZON9FXoJBYxUwBA9u5r3qXBiJxZjSon19FbPouuW+YrdfjiAAiJf1oNJjRe+qklsZWvDZWmUiXgNmA==", + "license": "MIT", "dependencies": { "@types/node": "^22.12.0", "abi-coder": "^5.0.0" @@ -352,14 +353,6 @@ "ethers": "^6.0.0" } }, - "node_modules/@curvefi/ethcall/node_modules/@types/node": { - "version": "22.13.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz", - "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==", - "dependencies": { - "undici-types": "~6.20.0" - } - }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", @@ -746,7 +739,6 @@ "version": "22.13.4", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz", "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==", - "dev": true, "dependencies": { "undici-types": "~6.20.0" } @@ -1092,9 +1084,10 @@ "dev": true }, "node_modules/bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.0.tgz", + "integrity": "sha512-EM7aMFTXbptt/wZdMlBv2t8IViwQL+h6SLHosp8Yf0dqJMTnY6iL32opnAB6kAdL0SZPuvcAzFr31o0c/R3/RA==", + "license": "MIT", "engines": { "node": "*" } @@ -1787,9 +1780,9 @@ } }, "node_modules/ethers": { - "version": "6.13.5", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.5.tgz", - "integrity": "sha512-+knKNieu5EKRThQJWwqaJ10a6HE9sSehGeqWN65//wE7j47ZpFhKAnHB/JJFibwwg61I/koxaPsXbXpD/skNOQ==", + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.14.1.tgz", + "integrity": "sha512-JnFiPFi3sK2Z6y7jZ3qrafDMwiXmU+6cNZ0M+kPq+mTy9skqEzwqAdFW3nb/em2xjlIVXX6Lz8ID6i3LmS4+fQ==", "funding": [ { "type": "individual", @@ -1800,6 +1793,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@adraffy/ens-normalize": "1.10.1", "@noble/curves": "1.2.0", diff --git a/package.json b/package.json index 02f8cc75..ca1e5377 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@curvefi/api", - "version": "2.66.26", + "version": "2.66.27", "description": "JavaScript library for curve.finance", "main": "lib/index.js", "author": "Macket", @@ -17,9 +17,10 @@ "url": "https://github.com/curvefi/curve-js/issues" }, "scripts": { - "build": "rm -rf lib && tsc -p tsconfig.build.json", - "lint": "eslint src", - "tsc": "tsc -w" + "build": "rm -rf lib && tsc --project tsconfig.build.json", + "lint": "eslint src --ext .ts", + "watch": "tsc --watch", + "watch:lib": "rm -rf lib && tsc --watch --project tsconfig.build.json" }, "type": "module", "devDependencies": { @@ -40,9 +41,9 @@ "vue-eslint-parser": "^9.4.3" }, "dependencies": { - "@curvefi/ethcall": "6.0.12", - "bignumber.js": "^9.1.2", - "ethers": "^6.13.4", - "memoizee": "^0.4.17" + "@curvefi/ethcall": "6.0.13", + "bignumber.js": "9.3.0", + "ethers": "6.14.1", + "memoizee": "0.4.17" } } From 8f5e0cab0c76fd12d5ee97e50f6956d2fbf3b47c Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Wed, 21 May 2025 14:24:22 +0200 Subject: [PATCH 7/7] chore: update dependencies --- package-lock.json | 536 ++++++++++++++++++++++------------------------ package.json | 36 ++-- 2 files changed, 278 insertions(+), 294 deletions(-) diff --git a/package-lock.json b/package-lock.json index b67bb16e..dd56b076 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,27 +9,27 @@ "version": "2.66.27", "license": "MIT", "dependencies": { - "@curvefi/ethcall": "6.0.13", - "bignumber.js": "9.3.0", - "ethers": "6.14.1", - "memoizee": "0.4.17" + "@curvefi/ethcall": "^6.0.13", + "bignumber.js": "^9.3.0", + "ethers": "^6.14.1", + "memoizee": "^0.4.17" }, "devDependencies": { - "@babel/eslint-parser": "^7.25.9", - "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "^9.16.0", - "@types/chai": "^5.0.1", - "@types/memoizee": "^0.4.11", + "@babel/eslint-parser": "^7.27.1", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "^9.27.0", + "@types/chai": "^5.2.2", + "@types/memoizee": "^0.4.12", "@types/mocha": "^10.0.10", - "@types/node": "^22.10.2", - "@typescript-eslint/eslint-plugin": "^8.18.0", - "@typescript-eslint/parser": "^8.18.0", - "chai": "^5.1.2", - "eslint": "^9.16.0", - "globals": "^15.13.0", - "mocha": "^11.0.1", - "typescript": "^5.7.2", - "vue-eslint-parser": "^9.4.3" + "@types/node": "^22.15.21", + "@typescript-eslint/eslint-plugin": "^8.32.1", + "@typescript-eslint/parser": "^8.32.1", + "chai": "^5.2.0", + "eslint": "^9.27.0", + "globals": "^16.1.0", + "mocha": "^11.4.0", + "typescript": "^5.8.3", + "vue-eslint-parser": "^10.1.3" }, "engines": { "node": "22" @@ -115,10 +115,11 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.26.8.tgz", - "integrity": "sha512-3tBctaHRW6xSub26z7n8uyOTwwUsCdvIug/oxBH9n6yCO5hMj2vwDJAo7RbBMKrM7P+W2j61zLKviJQFGOYKMg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.27.1.tgz", + "integrity": "sha512-q8rjOuadH0V6Zo4XLMkJ3RMQ9MSBqwaDByyYB0izsYdaIWGNLmEblbCOf1vyFHICcg16CD7Fsi51vcQnYxmt6Q==", "dev": true, + "license": "MIT", "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", @@ -354,10 +355,11 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", - "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", "dev": true, + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.4.3" }, @@ -393,10 +395,11 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz", - "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", + "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", @@ -406,11 +409,22 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/config-helpers": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz", + "integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/core": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.11.0.tgz", - "integrity": "sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz", + "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@types/json-schema": "^7.0.15" }, @@ -419,10 +433,11 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", - "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -454,12 +469,16 @@ } }, "node_modules/@eslint/js": { - "version": "9.20.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.20.0.tgz", - "integrity": "sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ==", + "version": "9.27.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.27.0.tgz", + "integrity": "sha512-G5JD9Tu5HJEu4z2Uo4aHY2sLV64B7CDMXxFzqzjl3NKd6RVzSXNoE80jk7Y0lJkTTkjiIhBAqmlYwjuBY3tvpA==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" } }, "node_modules/@eslint/object-schema": { @@ -467,17 +486,19 @@ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.6.tgz", - "integrity": "sha512-+0TjwR1eAUdZtvv/ir1mGX+v0tUoR3VEPB8Up0LLJC+whRW0GgBBtpbOkg/a/U4Dxa6l5a3l9AJ1aWIQVyoWJA==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz", + "integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.11.0", + "@eslint/core": "^0.14.0", "levn": "^0.4.1" }, "engines": { @@ -656,6 +677,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -669,6 +691,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -678,6 +701,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -697,10 +721,11 @@ } }, "node_modules/@types/chai": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.0.1.tgz", - "integrity": "sha512-5T8ajsg3M/FOncpLYW7sdOcD6yf4+722sze/tc4KQV0P8Z2rAr3SAuHCIkYmYpt8VbcQlnz8SxlOlPQYefe4cA==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", + "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", "dev": true, + "license": "MIT", "dependencies": { "@types/deep-eql": "*" } @@ -721,13 +746,15 @@ "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/memoizee": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/@types/memoizee/-/memoizee-0.4.11.tgz", - "integrity": "sha512-2gyorIBZu8GoDr9pYjROkxWWcFtHCquF7TVbN2I+/OvgZhnIGQS0vX5KJz4lXNKb8XOSfxFOSG5OLru1ESqLUg==", - "dev": true + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/@types/memoizee/-/memoizee-0.4.12.tgz", + "integrity": "sha512-EdtpwNYNhe3kZ+4TlXj/++pvBoU0KdrAICMzgI7vjWgu9sIvvUhu9XR8Ks4L6Wh3sxpZ22wkZR7yCLAqUjnZuQ==", + "dev": true, + "license": "MIT" }, "node_modules/@types/mocha": { "version": "10.0.10", @@ -736,28 +763,30 @@ "dev": true }, "node_modules/@types/node": { - "version": "22.13.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz", - "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==", + "version": "22.15.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.21.tgz", + "integrity": "sha512-EV/37Td6c+MgKAbkcLG6vqZ2zEYHD7bvSrzqqs2RIhbA6w3x+Dqz8MZM3sP6kGTeLrdoOgKZe+Xja7tUB2DNkQ==", + "license": "MIT", "dependencies": { - "undici-types": "~6.20.0" + "undici-types": "~6.21.0" } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.24.1.tgz", - "integrity": "sha512-ll1StnKtBigWIGqvYDVuDmXJHVH4zLVot1yQ4fJtLpL7qacwkxJc1T0bptqw+miBQ/QfUbhl1TcQ4accW5KUyA==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.32.1.tgz", + "integrity": "sha512-6u6Plg9nP/J1GRpe/vcjjabo6Uc5YQPAMxsgQyGC/I0RuukiG1wIe3+Vtg3IrSCVJDmqK3j8adrtzXSENRtFgg==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.24.1", - "@typescript-eslint/type-utils": "8.24.1", - "@typescript-eslint/utils": "8.24.1", - "@typescript-eslint/visitor-keys": "8.24.1", + "@typescript-eslint/scope-manager": "8.32.1", + "@typescript-eslint/type-utils": "8.32.1", + "@typescript-eslint/utils": "8.32.1", + "@typescript-eslint/visitor-keys": "8.32.1", "graphemer": "^1.4.0", - "ignore": "^5.3.1", + "ignore": "^7.0.0", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.0.1" + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -769,19 +798,30 @@ "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.4.tgz", + "integrity": "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.24.1.tgz", - "integrity": "sha512-Tqoa05bu+t5s8CTZFaGpCH2ub3QeT9YDkXbPd3uQ4SfsLoh1/vv2GEYAioPoxCWJJNsenXlC88tRjwoHNts1oQ==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.32.1.tgz", + "integrity": "sha512-LKMrmwCPoLhM45Z00O1ulb6jwyVr2kr3XJp+G+tSEZcbauNnScewcQwtJqXDhXeYPDEjZ8C1SjXm015CirEmGg==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.24.1", - "@typescript-eslint/types": "8.24.1", - "@typescript-eslint/typescript-estree": "8.24.1", - "@typescript-eslint/visitor-keys": "8.24.1", + "@typescript-eslint/scope-manager": "8.32.1", + "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/typescript-estree": "8.32.1", + "@typescript-eslint/visitor-keys": "8.32.1", "debug": "^4.3.4" }, "engines": { @@ -793,17 +833,18 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.24.1.tgz", - "integrity": "sha512-OdQr6BNBzwRjNEXMQyaGyZzgg7wzjYKfX2ZBV3E04hUCBDv3GQCHiz9RpqdUIiVrMgJGkXm3tcEh4vFSHreS2Q==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.32.1.tgz", + "integrity": "sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.24.1", - "@typescript-eslint/visitor-keys": "8.24.1" + "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/visitor-keys": "8.32.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -814,15 +855,16 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.24.1.tgz", - "integrity": "sha512-/Do9fmNgCsQ+K4rCz0STI7lYB4phTtEXqqCAs3gZW0pnK7lWNkvWd5iW545GSmApm4AzmQXmSqXPO565B4WVrw==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.32.1.tgz", + "integrity": "sha512-mv9YpQGA8iIsl5KyUPi+FGLm7+bA4fgXaeRcFKRDRwDMu4iwrSHeDPipwueNXhdIIZltwCJv+NkxftECbIZWfA==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.24.1", - "@typescript-eslint/utils": "8.24.1", + "@typescript-eslint/typescript-estree": "8.32.1", + "@typescript-eslint/utils": "8.32.1", "debug": "^4.3.4", - "ts-api-utils": "^2.0.1" + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -833,14 +875,15 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.24.1.tgz", - "integrity": "sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.32.1.tgz", + "integrity": "sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -850,19 +893,20 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.24.1.tgz", - "integrity": "sha512-UPyy4MJ/0RE648DSKQe9g0VDSehPINiejjA6ElqnFaFIhI6ZEiZAkUI0D5MCk0bQcTf/LVqZStvQ6K4lPn/BRg==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.32.1.tgz", + "integrity": "sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.24.1", - "@typescript-eslint/visitor-keys": "8.24.1", + "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/visitor-keys": "8.32.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", - "ts-api-utils": "^2.0.1" + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -872,7 +916,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { @@ -880,6 +924,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -889,6 +934,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -900,10 +946,11 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -912,15 +959,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.24.1.tgz", - "integrity": "sha512-OOcg3PMMQx9EXspId5iktsI3eMaXVwlhC8BvNnX6B5w9a4dVgpkQZuU8Hy67TolKcl+iFWq0XX+jbDGN4xWxjQ==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.32.1.tgz", + "integrity": "sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA==", "dev": true, + "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.24.1", - "@typescript-eslint/types": "8.24.1", - "@typescript-eslint/typescript-estree": "8.24.1" + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.32.1", + "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/typescript-estree": "8.32.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -931,16 +979,17 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.24.1.tgz", - "integrity": "sha512-EwVHlp5l+2vp8CoqJm9KikPZgi3gbdZAtabKT9KPShGeOcJhsv4Zdo3oc8T8I0uKEmYoU4ItyxbptjF08enaxg==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.32.1.tgz", + "integrity": "sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.24.1", + "@typescript-eslint/types": "8.32.1", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -956,6 +1005,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -1013,15 +1063,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/ansi-regex": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", @@ -1049,19 +1090,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -1092,18 +1120,6 @@ "node": "*" } }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1119,6 +1135,7 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -1251,27 +1268,19 @@ } }, "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, + "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "readdirp": "^4.0.1" }, "engines": { - "node": ">= 8.10.0" + "node": ">= 14.16.0" }, "funding": { "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" } }, "node_modules/cliui": { @@ -1449,10 +1458,11 @@ "dev": true }, "node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } @@ -1547,21 +1557,23 @@ } }, "node_modules/eslint": { - "version": "9.20.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.20.1.tgz", - "integrity": "sha512-m1mM33o6dBUjxl2qb6wv6nGNwCAsns1eKtaQ4l/NPHeTvhiUPbtdfMyktxN4B3fgHIgsYh1VT3V9txblpQHq+g==", + "version": "9.27.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.27.0.tgz", + "integrity": "sha512-ixRawFQuMB9DZ7fjU3iGGganFDp3+45bPOdaRurcFHSXO1e/sYwUX/FtQZpLZJR6SjMoJH8hR2pPEAfDyCoU2Q==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.19.0", - "@eslint/core": "^0.11.0", - "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.20.0", - "@eslint/plugin-kit": "^0.2.5", + "@eslint/config-array": "^0.20.0", + "@eslint/config-helpers": "^0.2.1", + "@eslint/core": "^0.14.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.27.0", + "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.1", + "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", @@ -1569,7 +1581,7 @@ "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.2.0", + "eslint-scope": "^8.3.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", @@ -1628,10 +1640,11 @@ } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", - "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", + "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -1660,6 +1673,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -1848,6 +1862,7 @@ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -1872,10 +1887,11 @@ "dev": true }, "node_modules/fastq": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", - "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dev": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } @@ -1897,6 +1913,7 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -1964,20 +1981,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -2023,6 +2026,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -2055,10 +2059,11 @@ } }, "node_modules/globals": { - "version": "15.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", - "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.1.0.tgz", + "integrity": "sha512-aibexHNbb/jiUSObBgpHLj+sIuUmJnYcgXBlrfsiDZ9rt4aF2TFRbyLgZ2iFQuVZ1K5Mx3FVkbKRSgKrbK3K2g==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -2124,18 +2129,6 @@ "node": ">=0.8.19" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2171,6 +2164,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -2396,6 +2390,7 @@ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -2405,6 +2400,7 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -2435,16 +2431,16 @@ } }, "node_modules/mocha": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.1.0.tgz", - "integrity": "sha512-8uJR5RTC2NgpY3GrYcgpZrsEd9zKbPDpob1RezyR2upGHRQtHWofmzTMzTMSV6dru3tj5Ukt0+Vnq1qhFEEwAg==", + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.4.0.tgz", + "integrity": "sha512-O6oi5Y9G6uu8f9iqXR6iKNLWHLRex3PKbmHynfpmUnMJJGrdgXh8ZmS85Ei5KR2Gnl+/gQ9s+Ktv5CqKybNw4A==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-colors": "^4.1.3", "browser-stdout": "^1.3.1", - "chokidar": "^3.5.3", + "chokidar": "^4.0.1", "debug": "^4.3.5", - "diff": "^5.2.0", + "diff": "^7.0.0", "escape-string-regexp": "^4.0.0", "find-up": "^5.0.0", "glob": "^10.4.5", @@ -2453,6 +2449,7 @@ "log-symbols": "^4.1.0", "minimatch": "^5.1.6", "ms": "^2.1.3", + "picocolors": "^1.1.1", "serialize-javascript": "^6.0.2", "strip-json-comments": "^3.1.1", "supports-color": "^8.1.1", @@ -2530,15 +2527,6 @@ "license": "MIT", "peer": true }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -2652,14 +2640,14 @@ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -2703,7 +2691,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/randombytes": { "version": "2.1.0", @@ -2715,15 +2704,17 @@ } }, "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, + "license": "MIT", "engines": { - "node": ">=8.10.0" + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, "node_modules/require-directory": { @@ -2745,10 +2736,11 @@ } }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -2773,6 +2765,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -2979,6 +2972,7 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -2987,10 +2981,11 @@ } }, "node_modules/ts-api-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz", - "integrity": "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18.12" }, @@ -3021,10 +3016,11 @@ } }, "node_modules/typescript": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", - "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -3034,9 +3030,10 @@ } }, "node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" }, "node_modules/update-browserslist-db": { "version": "1.1.3", @@ -3080,69 +3077,55 @@ } }, "node_modules/vue-eslint-parser": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz", - "integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==", + "version": "10.1.3", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-10.1.3.tgz", + "integrity": "sha512-dbCBnd2e02dYWsXoqX5yKUZlOt+ExIpq7hmHKPb5ZqKcjf++Eo0hMseFTZMLKThrUk61m+Uv6A2YSBve6ZvuDQ==", "dev": true, + "license": "MIT", "dependencies": { - "debug": "^4.3.4", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", + "debug": "^4.4.0", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.6.0", "lodash": "^4.17.21", - "semver": "^7.3.6" + "semver": "^7.6.3" }, "engines": { - "node": "^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://github.com/sponsors/mysticatea" }, "peerDependencies": { - "eslint": ">=6.0.0" + "eslint": "^8.57.0 || ^9.0.0" } }, "node_modules/vue-eslint-parser/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", + "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/vue-eslint-parser/node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, + "license": "Apache-2.0", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -3153,6 +3136,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } diff --git a/package.json b/package.json index ca1e5377..2ea64907 100644 --- a/package.json +++ b/package.json @@ -24,26 +24,26 @@ }, "type": "module", "devDependencies": { - "@babel/eslint-parser": "^7.25.9", - "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "^9.16.0", - "@types/chai": "^5.0.1", - "@types/memoizee": "^0.4.11", + "@babel/eslint-parser": "^7.27.1", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "^9.27.0", + "@types/chai": "^5.2.2", + "@types/memoizee": "^0.4.12", "@types/mocha": "^10.0.10", - "@types/node": "^22.10.2", - "@typescript-eslint/eslint-plugin": "^8.18.0", - "@typescript-eslint/parser": "^8.18.0", - "chai": "^5.1.2", - "eslint": "^9.16.0", - "globals": "^15.13.0", - "mocha": "^11.0.1", - "typescript": "^5.7.2", - "vue-eslint-parser": "^9.4.3" + "@types/node": "^22.15.21", + "@typescript-eslint/eslint-plugin": "^8.32.1", + "@typescript-eslint/parser": "^8.32.1", + "chai": "^5.2.0", + "eslint": "^9.27.0", + "globals": "^16.1.0", + "mocha": "^11.4.0", + "typescript": "^5.8.3", + "vue-eslint-parser": "^10.1.3" }, "dependencies": { - "@curvefi/ethcall": "6.0.13", - "bignumber.js": "9.3.0", - "ethers": "6.14.1", - "memoizee": "0.4.17" + "@curvefi/ethcall": "^6.0.13", + "bignumber.js": "^9.3.0", + "ethers": "^6.14.1", + "memoizee": "^0.4.17" } }