From e4eb424fb40a3f5d1a2d8188415330ff172590ad Mon Sep 17 00:00:00 2001 From: MuRong Date: Fri, 24 Jan 2025 12:15:02 +0800 Subject: [PATCH] feat: use ioredis --- packages/utils/package.json | 6 +- packages/utils/src/store/index.ts | 5 +- packages/utils/src/store/manager.ts | 57 +++------- packages/utils/src/store/memory.ts | 118 +++++++++++++++++-- packages/utils/src/store/redis.ts | 47 ++++---- pnpm-lock.yaml | 169 +++++----------------------- 6 files changed, 179 insertions(+), 223 deletions(-) diff --git a/packages/utils/package.json b/packages/utils/package.json index 0b5ca68..5874c76 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -43,13 +43,11 @@ "ethers": ">=6.13.0" }, "dependencies": { - "@keyv/redis": "^4.2.0", "@murongg/utils": "^0.1.28", - "cache-manager": "^6.3.2", - "cacheable": "^1.8.7", + "cache-manager": "5.7.6", + "cache-manager-ioredis-yet": "2.1.1", "debug": "^4.3.7", "ioredis": "^5.4.1", - "keyv": "^5.2.3", "lodash.clonedeep": "^4.5.0", "lru-cache": "^11.0.1", "picocolors": "^1.0.1", diff --git a/packages/utils/src/store/index.ts b/packages/utils/src/store/index.ts index 40e78c1..4eb92be 100644 --- a/packages/utils/src/store/index.ts +++ b/packages/utils/src/store/index.ts @@ -1,6 +1,5 @@ -export type { CacheManagerStore } from 'cache-manager' -export type { Store } from './types' +export type { Store, StoreConfig, Stores } from 'cache-manager' export { redisStore } from './redis' export * from './manager' export { memoryStore } from './memory' -export type { MemoryConfig } from './memory' +export type { MemoryStore, MemoryCache, MemoryConfig } from './memory' diff --git a/packages/utils/src/store/manager.ts b/packages/utils/src/store/manager.ts index 4afedb0..aa9f97a 100644 --- a/packages/utils/src/store/manager.ts +++ b/packages/utils/src/store/manager.ts @@ -1,42 +1,33 @@ -import type { Cache, CreateCacheOptions } from 'cache-manager' -import { createCache } from 'cache-manager' -import type { KeyvStoreAdapter } from 'keyv' -import { Keyv } from 'keyv' -import { KeyvCacheableMemory } from 'cacheable' +import type { Cache, Milliseconds, Store } from 'cache-manager' +import { createCache, memoryStore } from 'cache-manager' +import type { RedisStore } from 'cache-manager-ioredis-yet' export class SimpleStoreManager { private cache: Cache - private store: Keyv constructor( - options?: (Omit) & { store: Keyv }, + store?: Store, ) { - if (options) { - this.cache = createCache({ - ...options, - stores: [ - options.store, - ], - }) - this.store = options.store + if (store) { + this.cache = createCache(store) } else { - const store = new KeyvCacheableMemory({ ttl: 10 * 1000, lruSize: 100 }) - const keyv = new Keyv({ store }) - this.store = keyv - this.cache = createCache({ stores: [keyv] }) + this.cache = createCache(memoryStore({ + max: 100, + ttl: 10 * 1000 /* milliseconds */, + })) } } - get redisStore(): KeyvStoreAdapter { - return this.store.store + get redisStore(): RedisStore { + return this.cache.store } async get(key: string) { return await this.cache.get(key) } - async set(key: string, value: unknown, ttl?: number) { + async set(key: string, value: unknown, ttl?: Milliseconds) { await this.cache.set(key, value, ttl) } @@ -45,28 +36,16 @@ export class SimpleStoreManager { } async keys(pattern?: string): Promise { - const keys = [] - for await (const [key] of this.store.store.entries()) { - if (pattern) { - const regex = new RegExp(`(? { - return !!await this.cache.get(key) + return !!await this.cache.store.get(key) } async getAll(): Promise { - const values = [] - for await (const [, value] of this.store.store.entries()) - values.push(value) - return values + const keys = await this.keys() + const values = await Promise.all(keys.map(async key => await this.get(key))) + return values.filter(value => value !== undefined) } } diff --git a/packages/utils/src/store/memory.ts b/packages/utils/src/store/memory.ts index 5a2d6f4..ff82889 100644 --- a/packages/utils/src/store/memory.ts +++ b/packages/utils/src/store/memory.ts @@ -1,13 +1,113 @@ -import { Keyv } from 'keyv' -import type { CacheableMemoryOptions } from 'cacheable' -import { KeyvCacheableMemory } from 'cacheable' +import { LRUCache } from 'lru-cache' +import cloneDeep from 'lodash.clonedeep' +import type { Cache, Config, Store } from 'cache-manager' -export type MemoryConfig = CacheableMemoryOptions & { - namespace?: string +function clone(object: T): T { + if (typeof object === 'object' && object !== null) + return cloneDeep(object) + + return object } -export function memoryStore(options?: MemoryConfig) { - const store = new KeyvCacheableMemory(options) - const keyv = new Keyv({ store }, { namespace: '' }) - return keyv +type LRU = LRUCache + +type Pre = LRUCache.OptionsTTLLimit +type Options = Omit & Partial> +export type MemoryConfig = { + max?: number + sizeCalculation?: (value: unknown, key: string) => number + shouldCloneBeforeSet?: boolean +} & Options & +Config + +export type MemoryStore = Store & { + dump: LRU['dump'] + load: LRU['load'] + calculatedSize: LRU['calculatedSize'] + get size(): number +} +export type MemoryCache = Cache + +/** + * Wrapper for lru-cache. + */ +export function memoryStore(arguments_?: MemoryConfig): MemoryStore { + const shouldCloneBeforeSet = arguments_?.shouldCloneBeforeSet !== false // Clone by default + const isCacheable = arguments_?.isCacheable ?? (value => value !== undefined) + + const lruOptions = { + ttlAutopurge: true, + ...arguments_, + max: arguments_?.max ?? 500, + ttl: arguments_?.ttl === undefined ? 0 : arguments_.ttl, + } + + const lruCache = new LRUCache(lruOptions) + + return { + async del(key) { + lruCache.delete(key) + }, + get: async (key: string) => lruCache.get(key) as T, + keys: async (pattern?: string) => { + const keys = [...lruCache.keys()] + if (!pattern) + return keys + + const regex = new RegExp(`(? regex.test(key)) + }, + + mget: async (...arguments_) => arguments_.map(x => lruCache.get(x)), + async mset(arguments_, ttl?) { + const opt = { ttl: ttl ?? lruOptions.ttl } as const + for (const [key, value] of arguments_) { + if (!isCacheable(value)) + throw new Error(`no cacheable value ${JSON.stringify(value)}`) + + if (shouldCloneBeforeSet) + lruCache.set(key, clone(value), opt) + else + lruCache.set(key, value, opt) + } + }, + async mdel(...arguments_) { + for (const key of arguments_) + lruCache.delete(key) + }, + async reset() { + lruCache.clear() + }, + ttl: async key => lruCache.getRemainingTTL(key), + async set(key, value, opt) { + if (!isCacheable(value)) + throw new Error(`no cacheable value ${JSON.stringify(value)}`) + + if (shouldCloneBeforeSet) + value = clone(value) + + const ttl = opt ?? lruOptions.ttl + + lruCache.set(key, value, { ttl }) + }, + get calculatedSize() { + return lruCache.calculatedSize + }, + /** + * This method is not available in the caching modules. + */ + get size() { + return lruCache.size + }, + /** + * This method is not available in the caching modules. + */ + dump: () => lruCache.dump(), + /** + * This method is not available in the caching modules. + */ + load(...arguments_: Parameters) { + lruCache.load(...arguments_) + }, + } } diff --git a/packages/utils/src/store/redis.ts b/packages/utils/src/store/redis.ts index b96ee84..8051a01 100644 --- a/packages/utils/src/store/redis.ts +++ b/packages/utils/src/store/redis.ts @@ -1,33 +1,24 @@ -import type { KeyvRedisOptions, RedisClientConnectionType, RedisClientOptions, RedisClusterOptions } from '@keyv/redis' -import KeyvRedis, { Keyv } from '@keyv/redis' - -export interface RedisConnect { - host?: string - port?: number - username?: string - password?: string - db?: number -} +import type { RedisOptions } from 'ioredis' +import { Redis } from 'ioredis' +import type { Config } from 'cache-manager' +import { RedisClusterConfig, redisInsStore } from 'cache-manager-ioredis-yet' export function redisStore( - connect?: string | RedisClientOptions | RedisClusterOptions | RedisClientConnectionType | RedisConnect, - options?: KeyvRedisOptions, + options?: (RedisOptions | { clusterConfig: RedisClusterConfig }) & Config, ) { - if (typeof connect === 'object' && connect) { - if (Reflect.get(connect, 'host')) { - const c = connect as RedisConnect - let connectStr = 'redis://' - if (c.username) - connectStr += `${c.username}:${c.password}@` - connectStr += `${c.host}:${c.port}` - if (c.db) - connectStr += `/${c.db}` - connect = connectStr - } - } + options ||= {} + const redisCache + = 'clusterConfig' in options + ? new Redis.Cluster( + options.clusterConfig.nodes, + options.clusterConfig.options, + ) + : new Redis(options) + + return redisInsStore(redisCache, options) +} - const keyv = new Keyv(new KeyvRedis(connect, options), { - namespace: '', - }) - return keyv +export { + RedisClusterConfig, + redisInsStore, } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1d85855..db69681 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -138,18 +138,15 @@ importers: packages/utils: dependencies: - '@keyv/redis': - specifier: ^4.2.0 - version: 4.2.0 '@murongg/utils': specifier: ^0.1.28 version: 0.1.32 cache-manager: - specifier: ^6.3.2 - version: 6.3.2 - cacheable: - specifier: ^1.8.7 - version: 1.8.7 + specifier: 5.7.6 + version: 5.7.6 + cache-manager-ioredis-yet: + specifier: 2.1.1 + version: 2.1.1 debug: specifier: ^4.3.7 version: 4.4.0 @@ -159,9 +156,6 @@ importers: ioredis: specifier: ^5.4.1 version: 5.4.2 - keyv: - specifier: ^5.2.3 - version: 5.2.3 lodash.clonedeep: specifier: ^4.5.0 version: 4.5.0 @@ -888,13 +882,6 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@keyv/redis@4.2.0': - resolution: {integrity: sha512-QszmBfZZ3wOKJ5z1hn0CTLf04WN/552ITrSDYC3Yg4jT6yVdlz2fJxi5CNrnZ8NIu/Qaj7OAkbSL+pyFUXp6oA==} - engines: {node: '>= 18'} - - '@keyv/serialize@1.0.2': - resolution: {integrity: sha512-+E/LyaAeuABniD/RvUezWVXKpeuvwLEA9//nE9952zBaOdBd2mQ3pPoM8cUe2X6IcMByfuSLzmYqnYshG60+HQ==} - '@murongg/eslint-config-basic@0.2.1': resolution: {integrity: sha512-sgz4+v9bz7q4D1R1QhL9e+tCPdOstpHXBxT0xISbNQHw9STOUXlv9mojBjA6T+TGxDcHgCrf649LHAswPBGhCw==} peerDependencies: @@ -947,35 +934,6 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@redis/bloom@1.2.0': - resolution: {integrity: sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==} - peerDependencies: - '@redis/client': ^1.0.0 - - '@redis/client@1.6.0': - resolution: {integrity: sha512-aR0uffYI700OEEH4gYnitAnv3vzVGXCFvYfdpu/CJKvk4pHfLPEy/JSZyrpQ+15WhXe1yJRXLtfQ84s4mEXnPg==} - engines: {node: '>=14'} - - '@redis/graph@1.1.1': - resolution: {integrity: sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==} - peerDependencies: - '@redis/client': ^1.0.0 - - '@redis/json@1.0.7': - resolution: {integrity: sha512-6UyXfjVaTBTJtKNG4/9Z8PSpKE6XgSyEb8iwaqDcy+uKrd/DGYHTWkUdnQDyzm727V7p21WUMhsqz5oy65kPcQ==} - peerDependencies: - '@redis/client': ^1.0.0 - - '@redis/search@1.2.0': - resolution: {integrity: sha512-tYoDBbtqOVigEDMAcTGsRlMycIIjwMCgD8eR2t0NANeQmgK/lvxNAvYyb6bZDD4frHRhIHkJu2TBRvB0ERkOmw==} - peerDependencies: - '@redis/client': ^1.0.0 - - '@redis/time-series@1.1.0': - resolution: {integrity: sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g==} - peerDependencies: - '@redis/client': ^1.0.0 - '@rollup/plugin-alias@5.1.1': resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} engines: {node: '>=14.0.0'} @@ -1426,9 +1384,6 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -1447,9 +1402,6 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} @@ -1474,11 +1426,14 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - cache-manager@6.3.2: - resolution: {integrity: sha512-VmLouPUrvpm9dfwYB6OE7YVXDZ7BCfbt7hq10EHiBYaW9K9ZthK1bbjDQAtXGDK7d9u8t4G/7dMWSJOwN33msg==} + cache-manager-ioredis-yet@2.1.1: + resolution: {integrity: sha512-i4taQCesUa66Op2v3DQiF2oXHIeGyGAbOrwyVklN1TECyvKFgxd3JDP1MwkxvdpeKkPZh8dH4USFL9/wbmQp/Q==} + engines: {node: '>= 18'} + deprecated: With cache-manager v6 we now are using Keyv - cacheable@1.8.7: - resolution: {integrity: sha512-AbfG7dAuYNjYxFUtL1lAqmlWdxczCJ47w7cFjhGcnGnUdwSo6VgmSojfoW3tUI12HUkgTJ5kqj78yyq6TsFtlg==} + cache-manager@5.7.6: + resolution: {integrity: sha512-wBxnBHjDxF1RXpHCBD6HGvKER003Ts7IIm0CHpggliHzN1RZditb7rXoduE1rplc2DEFYKxhLKgFuchXMJje9w==} + engines: {node: '>= 18'} call-bind-apply-helpers@1.0.1: resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} @@ -2132,10 +2087,6 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - generic-pool@3.9.0: - resolution: {integrity: sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==} - engines: {node: '>= 4'} - gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -2248,9 +2199,6 @@ packages: hookable@5.5.3: resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} - hookified@1.6.0: - resolution: {integrity: sha512-se7cpwTA+iA/eY548Bu03JJqBiEZAqU2jnyKdj5B5qurtBg64CZGHTgqCv4Yh7NWu6FGI09W61MCq+NoPj9GXA==} - hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -2261,9 +2209,6 @@ packages: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -2507,9 +2452,6 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - keyv@5.2.3: - resolution: {integrity: sha512-AGKecUfzrowabUv0bH1RIR5Vf7w+l4S3xtQAypKaUpTdIR1EbrAcTxHCrpo9Q+IWeUlFE2palRtgIQcgm+PQJw==} - kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} @@ -3091,6 +3033,10 @@ packages: resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} engines: {node: ^14.13.1 || >=16.0.0} + promise-coalesce@1.1.2: + resolution: {integrity: sha512-zLaJ9b8hnC564fnJH6NFSOGZYYdzrAJn2JUUIwzoQb32fG2QAakpDNM+CZo1km6keXkRXRM+hml1BFAPVnPkxg==} + engines: {node: '>=16'} + prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} @@ -3131,9 +3077,6 @@ packages: resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} engines: {node: '>=4'} - redis@4.7.0: - resolution: {integrity: sha512-zvmkHEAdGMn+hMRXuMBtu4Vo5P6rHQjLoHftu+lBqq8ZTA3RCVC/WzD790bkKKiNFp7d5/9PcSD19fJyyRvOdQ==} - reflect.getprototypeof@1.0.10: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} @@ -4190,16 +4133,6 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@keyv/redis@4.2.0': - dependencies: - cluster-key-slot: 1.1.2 - keyv: 5.2.3 - redis: 4.7.0 - - '@keyv/serialize@1.0.2': - dependencies: - buffer: 6.0.3 - '@murongg/eslint-config-basic@0.2.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3)': dependencies: eslint: 8.57.1 @@ -4308,32 +4241,6 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@redis/bloom@1.2.0(@redis/client@1.6.0)': - dependencies: - '@redis/client': 1.6.0 - - '@redis/client@1.6.0': - dependencies: - cluster-key-slot: 1.1.2 - generic-pool: 3.9.0 - yallist: 4.0.0 - - '@redis/graph@1.1.1(@redis/client@1.6.0)': - dependencies: - '@redis/client': 1.6.0 - - '@redis/json@1.0.7(@redis/client@1.6.0)': - dependencies: - '@redis/client': 1.6.0 - - '@redis/search@1.2.0(@redis/client@1.6.0)': - dependencies: - '@redis/client': 1.6.0 - - '@redis/time-series@1.1.0(@redis/client@1.6.0)': - dependencies: - '@redis/client': 1.6.0 - '@rollup/plugin-alias@5.1.1(rollup@3.29.5)': optionalDependencies: rollup: 3.29.5 @@ -4847,8 +4754,6 @@ snapshots: balanced-match@1.0.2: {} - base64-js@1.5.1: {} - boolbase@1.0.0: {} brace-expansion@1.1.11: @@ -4871,11 +4776,6 @@ snapshots: node-releases: 2.0.19 update-browserslist-db: 1.1.2(browserslist@4.24.4) - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - builtin-modules@3.3.0: {} builtins@5.1.0: @@ -4914,14 +4814,20 @@ snapshots: cac@6.7.14: {} - cache-manager@6.3.2: + cache-manager-ioredis-yet@2.1.1: dependencies: - keyv: 5.2.3 + cache-manager: 5.7.6 + ioredis: 5.4.2 + telejson: 7.2.0 + transitivePeerDependencies: + - supports-color - cacheable@1.8.7: + cache-manager@5.7.6: dependencies: - hookified: 1.6.0 - keyv: 5.2.3 + eventemitter3: 5.0.1 + lodash.clonedeep: 4.5.0 + lru-cache: 10.4.3 + promise-coalesce: 1.1.2 call-bind-apply-helpers@1.0.1: dependencies: @@ -5842,8 +5748,6 @@ snapshots: functions-have-names@1.2.3: {} - generic-pool@3.9.0: {} - gensync@1.0.0-beta.2: {} get-east-asian-width@1.3.0: {} @@ -5981,8 +5885,6 @@ snapshots: hookable@5.5.3: {} - hookified@1.6.0: {} - hosted-git-info@2.8.9: {} htmlparser2@7.2.0: @@ -5994,8 +5896,6 @@ snapshots: human-signals@5.0.0: {} - ieee754@1.2.1: {} - ignore@5.3.2: {} import-fresh@3.3.0: @@ -6244,10 +6144,6 @@ snapshots: dependencies: json-buffer: 3.0.1 - keyv@5.2.3: - dependencies: - '@keyv/serialize': 1.0.2 - kleur@3.0.3: {} knitwork@1.2.0: {} @@ -6810,6 +6706,8 @@ snapshots: pretty-bytes@6.1.1: {} + promise-coalesce@1.1.2: {} + prompts@2.4.2: dependencies: kleur: 3.0.3 @@ -6853,15 +6751,6 @@ snapshots: dependencies: redis-errors: 1.2.0 - redis@4.7.0: - dependencies: - '@redis/bloom': 1.2.0(@redis/client@1.6.0) - '@redis/client': 1.6.0 - '@redis/graph': 1.1.1(@redis/client@1.6.0) - '@redis/json': 1.0.7(@redis/client@1.6.0) - '@redis/search': 1.2.0(@redis/client@1.6.0) - '@redis/time-series': 1.1.0(@redis/client@1.6.0) - reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.8