diff --git a/benchmark/package-lock.json b/benchmark/package-lock.json index 767d687018..49d77a5778 100644 --- a/benchmark/package-lock.json +++ b/benchmark/package-lock.json @@ -7,7 +7,7 @@ "name": "benchmark", "license": "ISC", "dependencies": { - "benny": "^3.6.15", + "benny": "^3.7.0", "v3": "npm:redis@3.1.2", "v4": "file:../" } @@ -24,20 +24,21 @@ }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@tsconfig/node12": "^1.0.9", "@types/mocha": "^9.0.0", - "@types/node": "^16.9.6", - "@types/sinon": "^10.0.3", + "@types/node": "^16.10.3", + "@types/sinon": "^10.0.4", "@types/which": "^2.0.1", "@types/yallist": "^4.0.1", - "mocha": "^9.1.1", + "mocha": "^9.1.2", "nyc": "^15.1.0", "release-it": "^14.11.6", "sinon": "^11.1.2", "source-map-support": "^0.5.20", - "ts-node": "^10.2.1", - "typedoc": "0.21.9", - "typedoc-github-wiki-theme": "^0.5.1", - "typedoc-plugin-markdown": "3.10.4", + "ts-node": "^10.3.0", + "typedoc": "^0.22.5", + "typedoc-github-wiki-theme": "^0.6.0", + "typedoc-plugin-markdown": "^3.11.3", "typescript": "^4.4.3", "which": "^2.0.2" }, @@ -126,14 +127,6 @@ "node": ">=8" } }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/benchmark": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", @@ -144,20 +137,21 @@ } }, "node_modules/benny": { - "version": "3.6.15", - "resolved": "https://registry.npmjs.org/benny/-/benny-3.6.15.tgz", - "integrity": "sha512-kq6XVGGYVou3Y8KNPs3SEF881vi5fJ8sIf9w69D2rreiNfRicWVWK6u6/mObMw6BiexoHHumtipn5gcu0Tngng==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/benny/-/benny-3.7.0.tgz", + "integrity": "sha512-tfQ8s4qwjfyMvFqe7wSGGel2Pzgl5ytwztS72Xh/ynPKJeXFLQ0sSVL95X9wHpqpXqW13pTHsEMCggrNKgeAoA==", "dependencies": { "@arrows/composition": "^1.0.0", "@arrows/dispatch": "^1.0.2", "@arrows/multimethod": "^1.1.6", "benchmark": "^2.1.4", - "fs-extra": "^9.0.1", - "json2csv": "^5.0.4", - "kleur": "^4.1.3", - "log-update": "^4.0.0", - "prettier": "^2.1.2", - "stats-median": "^1.0.1" + "fs-extra": "^10.0.0", + "json2csv": "^5.0.6", + "kleur": "^4.1.4", + "log-update": "^4.0.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/cli-cursor": { @@ -214,17 +208,16 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", "dependencies": { - "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/graceful-fs": { @@ -338,17 +331,6 @@ "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" }, - "node_modules/prettier": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", - "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/redis-commands": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", @@ -406,11 +388,6 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/stats-median": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stats-median/-/stats-median-1.0.1.tgz", - "integrity": "sha512-IYsheLg6dasD3zT/w9+8Iq9tcIQqqu91ZIpJOnIEM25C3X/g4Tl8mhXwW2ZQpbrsJISr9+wizEYgsibN5/b32Q==" - }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -555,11 +532,6 @@ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" - }, "benchmark": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", @@ -570,20 +542,18 @@ } }, "benny": { - "version": "3.6.15", - "resolved": "https://registry.npmjs.org/benny/-/benny-3.6.15.tgz", - "integrity": "sha512-kq6XVGGYVou3Y8KNPs3SEF881vi5fJ8sIf9w69D2rreiNfRicWVWK6u6/mObMw6BiexoHHumtipn5gcu0Tngng==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/benny/-/benny-3.7.0.tgz", + "integrity": "sha512-tfQ8s4qwjfyMvFqe7wSGGel2Pzgl5ytwztS72Xh/ynPKJeXFLQ0sSVL95X9wHpqpXqW13pTHsEMCggrNKgeAoA==", "requires": { "@arrows/composition": "^1.0.0", "@arrows/dispatch": "^1.0.2", "@arrows/multimethod": "^1.1.6", "benchmark": "^2.1.4", - "fs-extra": "^9.0.1", - "json2csv": "^5.0.4", - "kleur": "^4.1.3", - "log-update": "^4.0.0", - "prettier": "^2.1.2", - "stats-median": "^1.0.1" + "fs-extra": "^10.0.0", + "json2csv": "^5.0.6", + "kleur": "^4.1.4", + "log-update": "^4.0.0" } }, "cli-cursor": { @@ -628,11 +598,10 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", "requires": { - "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" @@ -716,11 +685,6 @@ "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" }, - "prettier": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", - "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==" - }, "redis-commands": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", @@ -763,11 +727,6 @@ "is-fullwidth-code-point": "^3.0.0" } }, - "stats-median": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stats-median/-/stats-median-1.0.1.tgz", - "integrity": "sha512-IYsheLg6dasD3zT/w9+8Iq9tcIQqqu91ZIpJOnIEM25C3X/g4Tl8mhXwW2ZQpbrsJISr9+wizEYgsibN5/b32Q==" - }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -811,23 +770,24 @@ "version": "file:..", "requires": { "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@tsconfig/node12": "^1.0.9", "@types/mocha": "^9.0.0", - "@types/node": "^16.9.6", - "@types/sinon": "^10.0.3", + "@types/node": "^16.10.3", + "@types/sinon": "^10.0.4", "@types/which": "^2.0.1", "@types/yallist": "^4.0.1", "cluster-key-slot": "1.1.0", "generic-pool": "3.8.2", - "mocha": "^9.1.1", + "mocha": "^9.1.2", "nyc": "^15.1.0", "redis-parser": "3.0.0", "release-it": "^14.11.6", "sinon": "^11.1.2", "source-map-support": "^0.5.20", - "ts-node": "^10.2.1", - "typedoc": "0.21.9", - "typedoc-github-wiki-theme": "^0.5.1", - "typedoc-plugin-markdown": "3.10.4", + "ts-node": "^10.3.0", + "typedoc": "^0.22.5", + "typedoc-github-wiki-theme": "^0.6.0", + "typedoc-plugin-markdown": "^3.11.3", "typescript": "^4.4.3", "which": "^2.0.2", "yallist": "4.0.0" diff --git a/benchmark/package.json b/benchmark/package.json index 5226a5b0c8..f56ad2f23c 100644 --- a/benchmark/package.json +++ b/benchmark/package.json @@ -10,7 +10,7 @@ "author": "", "license": "ISC", "dependencies": { - "benny": "^3.6.15", + "benny": "^3.7.0", "v3": "npm:redis@3.1.2", "v4": "file:../" } diff --git a/lib/commands-queue.ts b/lib/client/commands-queue.ts similarity index 97% rename from lib/commands-queue.ts rename to lib/client/commands-queue.ts index ef87184193..791c7638ba 100644 --- a/lib/commands-queue.ts +++ b/lib/client/commands-queue.ts @@ -1,7 +1,7 @@ import LinkedList from 'yallist'; import RedisParser from 'redis-parser'; -import { AbortError } from './errors'; -import { RedisReply } from './commands'; +import { AbortError } from '../errors'; +import { RedisCommandRawReply } from '../commands'; export interface QueueCommandOptions { asap?: boolean; @@ -107,7 +107,7 @@ export default class RedisCommandsQueue { this.#maxLength = maxLength; } - addCommand(args: Array, options?: QueueCommandOptions, bufferMode?: boolean): Promise { + addCommand(args: Array, options?: QueueCommandOptions, bufferMode?: boolean): Promise { if (this.#pubSubState.subscribing || this.#pubSubState.subscribed) { return Promise.reject(new Error('Cannot send commands in PubSub mode')); } else if (this.#maxLength && this.#waitingToBeSent.length + this.#waitingForReply.length >= this.#maxLength) { diff --git a/lib/client/commands.ts b/lib/client/commands.ts new file mode 100644 index 0000000000..c34f34be4f --- /dev/null +++ b/lib/client/commands.ts @@ -0,0 +1,233 @@ +import CLUSTER_COMMANDS from '../cluster/commands'; +import * as ACL_CAT from '../commands/ACL_CAT'; +import * as ACL_DELUSER from '../commands/ACL_DELUSER'; +import * as ACL_GENPASS from '../commands/ACL_GENPASS'; +import * as ACL_GETUSER from '../commands/ACL_GETUSER'; +import * as ACL_LIST from '../commands/ACL_LIST'; +import * as ACL_LOAD from '../commands/ACL_LOAD'; +import * as ACL_LOG_RESET from '../commands/ACL_LOG_RESET'; +import * as ACL_LOG from '../commands/ACL_LOG'; +import * as ACL_SAVE from '../commands/ACL_SAVE'; +import * as ACL_SETUSER from '../commands/ACL_SETUSER'; +import * as ACL_USERS from '../commands/ACL_USERS'; +import * as ACL_WHOAMI from '../commands/ACL_WHOAMI'; +import * as ASKING from '../commands/ASKING'; +import * as AUTH from '../commands/AUTH'; +import * as BGREWRITEAOF from '../commands/BGREWRITEAOF'; +import * as BGSAVE from '../commands/BGSAVE'; +import * as CLIENT_ID from '../commands/CLIENT_ID'; +import * as CLIENT_INFO from '../commands/CLIENT_INFO'; +import * as CLUSTER_ADDSLOTS from '../commands/CLUSTER_ADDSLOTS'; +import * as CLUSTER_FLUSHSLOTS from '../commands/CLUSTER_FLUSHSLOTS'; +import * as CLUSTER_INFO from '../commands/CLUSTER_INFO'; +import * as CLUSTER_NODES from '../commands/CLUSTER_NODES'; +import * as CLUSTER_MEET from '../commands/CLUSTER_MEET'; +import * as CLUSTER_RESET from '../commands/CLUSTER_RESET'; +import * as CLUSTER_SETSLOT from '../commands/CLUSTER_SETSLOT'; +import * as CLUSTER_SLOTS from '../commands/CLUSTER_SLOTS'; +import * as COMMAND_COUNT from '../commands/COMMAND_COUNT'; +import * as COMMAND_GETKEYS from '../commands/COMMAND_GETKEYS'; +import * as COMMAND_INFO from '../commands/COMMAND_INFO'; +import * as COMMAND from '../commands/COMMAND'; +import * as CONFIG_GET from '../commands/CONFIG_GET'; +import * as CONFIG_RESETASTAT from '../commands/CONFIG_RESETSTAT'; +import * as CONFIG_REWRITE from '../commands/CONFIG_REWRITE'; +import * as CONFIG_SET from '../commands/CONFIG_SET'; +import * as DBSIZE from '../commands/DBSIZE'; +import * as DISCARD from '../commands/DISCARD'; +import * as ECHO from '../commands/ECHO'; +import * as FAILOVER from '../commands/FAILOVER'; +import * as FLUSHALL from '../commands/FLUSHALL'; +import * as FLUSHDB from '../commands/FLUSHDB'; +import * as HELLO from '../commands/HELLO'; +import * as INFO from '../commands/INFO'; +import * as KEYS from '../commands/KEYS'; +import * as LASTSAVE from '../commands/LASTSAVE'; +import * as LOLWUT from '../commands/LOLWUT'; +import * as MEMOERY_DOCTOR from '../commands/MEMORY_DOCTOR'; +import * as MEMORY_MALLOC_STATS from '../commands/MEMORY_MALLOC-STATS'; +import * as MEMORY_PURGE from '../commands/MEMORY_PURGE'; +import * as MEMORY_STATS from '../commands/MEMORY_STATS'; +import * as MEMORY_USAGE from '../commands/MEMORY_USAGE'; +import * as MODULE_LIST from '../commands/MODULE_LIST'; +import * as MODULE_LOAD from '../commands/MODULE_LOAD'; +import * as MODULE_UNLOAD from '../commands/MODULE_UNLOAD'; +import * as MOVE from '../commands/MOVE'; +import * as PING from '../commands/PING'; +import * as PUBSUB_CHANNELS from '../commands/PUBSUB_CHANNELS'; +import * as PUBSUB_NUMPAT from '../commands/PUBSUB_NUMPAT'; +import * as PUBSUB_NUMSUB from '../commands/PUBSUB_NUMSUB'; +import * as RANDOMKEY from '../commands/RANDOMKEY'; +import * as READONLY from '../commands/READONLY'; +import * as READWRITE from '../commands/READWRITE'; +import * as REPLICAOF from '../commands/REPLICAOF'; +import * as RESTORE_ASKING from '../commands/RESTORE-ASKING'; +import * as ROLE from '../commands/ROLE'; +import * as SAVE from '../commands/SAVE'; +import * as SCAN from '../commands/SCAN'; +import * as SCRIPT_DEBUG from '../commands/SCRIPT_DEBUG'; +import * as SCRIPT_EXISTS from '../commands/SCRIPT_EXISTS'; +import * as SCRIPT_FLUSH from '../commands/SCRIPT_FLUSH'; +import * as SCRIPT_KILL from '../commands/SCRIPT_KILL'; +import * as SCRIPT_LOAD from '../commands/SCRIPT_LOAD'; +import * as SHUTDOWN from '../commands/SHUTDOWN'; +import * as SWAPDB from '../commands/SWAPDB'; +import * as TIME from '../commands/TIME'; +import * as UNWATCH from '../commands/UNWATCH'; +import * as WAIT from '../commands/WAIT'; + +export default { + ...CLUSTER_COMMANDS, + ACL_CAT, + aclCat: ACL_CAT, + ACL_DELUSER, + aclDelUser: ACL_DELUSER, + ACL_GENPASS, + aclGenPass: ACL_GENPASS, + ACL_GETUSER, + aclGetUser: ACL_GETUSER, + ACL_LIST, + aclList: ACL_LIST, + ACL_LOAD, + aclLoad: ACL_LOAD, + ACL_LOG_RESET, + aclLogReset: ACL_LOG_RESET, + ACL_LOG, + aclLog: ACL_LOG, + ACL_SAVE, + aclSave: ACL_SAVE, + ACL_SETUSER, + aclSetUser: ACL_SETUSER, + ACL_USERS, + aclUsers: ACL_USERS, + ACL_WHOAMI, + aclWhoAmI: ACL_WHOAMI, + ASKING, + asking: ASKING, + AUTH, + auth: AUTH, + BGREWRITEAOF, + bgRewriteAof: BGREWRITEAOF, + BGSAVE, + bgSave: BGSAVE, + CLIENT_ID, + clientId: CLIENT_ID, + CLIENT_INFO, + clientInfo: CLIENT_INFO, + CLUSTER_ADDSLOTS, + clusterAddSlots: CLUSTER_ADDSLOTS, + CLUSTER_FLUSHSLOTS, + clusterFlushSlots: CLUSTER_FLUSHSLOTS, + CLUSTER_INFO, + clusterInfo: CLUSTER_INFO, + CLUSTER_NODES, + clusterNodes: CLUSTER_NODES, + CLUSTER_MEET, + clusterMeet: CLUSTER_MEET, + CLUSTER_RESET, + clusterReset: CLUSTER_RESET, + CLUSTER_SETSLOT, + clusterSetSlot: CLUSTER_SETSLOT, + CLUSTER_SLOTS, + clusterSlots: CLUSTER_SLOTS, + COMMAND_COUNT, + commandCount: COMMAND_COUNT, + COMMAND_GETKEYS, + commandGetKeys: COMMAND_GETKEYS, + COMMAND_INFO, + commandInfo: COMMAND_INFO, + COMMAND, + command: COMMAND, + CONFIG_GET, + configGet: CONFIG_GET, + CONFIG_RESETASTAT, + configResetStat: CONFIG_RESETASTAT, + CONFIG_REWRITE, + configRewrite: CONFIG_REWRITE, + CONFIG_SET, + configSet: CONFIG_SET, + DBSIZE, + dbSize: DBSIZE, + DISCARD, + discard: DISCARD, + ECHO, + echo: ECHO, + FAILOVER, + failover: FAILOVER, + FLUSHALL, + flushAll: FLUSHALL, + FLUSHDB, + flushDb: FLUSHDB, + HELLO, + hello: HELLO, + INFO, + info: INFO, + KEYS, + keys: KEYS, + LASTSAVE, + lastSave: LASTSAVE, + LOLWUT, + lolwut: LOLWUT, + MEMOERY_DOCTOR, + memoryDoctor: MEMOERY_DOCTOR, + 'MEMORY_MALLOC-STATS': MEMORY_MALLOC_STATS, + memoryMallocStats: MEMORY_MALLOC_STATS, + MEMORY_PURGE, + memoryPurge: MEMORY_PURGE, + MEMORY_STATS, + memoryStats: MEMORY_STATS, + MEMORY_USAGE, + memoryUsage: MEMORY_USAGE, + MODULE_LIST, + moduleList: MODULE_LIST, + MODULE_LOAD, + moduleLoad: MODULE_LOAD, + MODULE_UNLOAD, + moduleUnload: MODULE_UNLOAD, + MOVE, + move: MOVE, + PING, + ping: PING, + PUBSUB_CHANNELS, + pubSubChannels: PUBSUB_CHANNELS, + PUBSUB_NUMPAT, + pubSubNumPat: PUBSUB_NUMPAT, + PUBSUB_NUMSUB, + pubSubNumSub: PUBSUB_NUMSUB, + RANDOMKEY, + randomKey: RANDOMKEY, + READONLY, + readonly: READONLY, + READWRITE, + readwrite: READWRITE, + REPLICAOF, + replicaOf: REPLICAOF, + 'RESTORE-ASKING': RESTORE_ASKING, + restoreAsking: RESTORE_ASKING, + ROLE, + role: ROLE, + SAVE, + save: SAVE, + SCAN, + scan: SCAN, + SCRIPT_DEBUG, + scriptDebug: SCRIPT_DEBUG, + SCRIPT_EXISTS, + scriptExists: SCRIPT_EXISTS, + SCRIPT_FLUSH, + scriptFlush: SCRIPT_FLUSH, + SCRIPT_KILL, + scriptKill: SCRIPT_KILL, + SCRIPT_LOAD, + scriptLoad: SCRIPT_LOAD, + SHUTDOWN, + shutdown: SHUTDOWN, + SWAPDB, + swapDb: SWAPDB, + TIME, + time: TIME, + UNWATCH, + unwatch: UNWATCH, + WAIT, + wait: WAIT, +}; diff --git a/lib/client.spec.ts b/lib/client/index.spec.ts similarity index 97% rename from lib/client.spec.ts rename to lib/client/index.spec.ts index 2cf6ea4964..e98814d058 100644 --- a/lib/client.spec.ts +++ b/lib/client/index.spec.ts @@ -1,11 +1,11 @@ import { strict as assert, AssertionError } from 'assert'; import { once } from 'events'; -import { itWithClient, TEST_REDIS_SERVERS, TestRedisServers, waitTillBeenCalled, isRedisVersionGreaterThan } from './test-utils'; -import RedisClient from './client'; -import { AbortError, ClientClosedError, ConnectionTimeoutError, WatchError } from './errors'; -import { defineScript } from './lua-script'; +import { itWithClient, TEST_REDIS_SERVERS, TestRedisServers, waitTillBeenCalled, isRedisVersionGreaterThan } from '../test-utils'; +import RedisClient from '.'; +import { AbortError, ClientClosedError, ConnectionTimeoutError, WatchError } from '../errors'; +import { defineScript } from '../lua-script'; import { spy } from 'sinon'; -import { RedisNetSocketOptions } from './socket'; +import { RedisNetSocketOptions } from '../client/socket'; export const SQUARE_SCRIPT = defineScript({ NUMBER_OF_KEYS: 0, @@ -366,6 +366,15 @@ describe('Client', () => { WatchError ); }); + + itWithClient(TestRedisServers.OPEN, 'execAsPipeline', async client => { + assert.deepEqual( + await client.multi() + .ping() + .exec(true), + ['PONG'] + ); + }); }); it('scripts', async () => { diff --git a/lib/client.ts b/lib/client/index.ts similarity index 82% rename from lib/client.ts rename to lib/client/index.ts index 98169bc302..5aeffd365d 100644 --- a/lib/client.ts +++ b/lib/client/index.ts @@ -1,79 +1,81 @@ +import COMMANDS from './commands'; +import { RedisCommand, RedisCommandArguments, RedisCommandRawReply, RedisCommandReply, RedisModules, RedisPlugins, RedisScript, RedisScripts } from '../commands'; import RedisSocket, { RedisSocketOptions, RedisNetSocketOptions, RedisTlsSocketOptions } from './socket'; import RedisCommandsQueue, { PubSubListener, PubSubSubscribeCommands, PubSubUnsubscribeCommands, QueueCommandOptions } from './commands-queue'; -import COMMANDS, { RedisCommandReply, TransformArgumentsReply } from './commands'; -import { RedisCommand, RedisModules, RedisReply } from './commands'; -import RedisMultiCommand, { MultiQueuedCommand, RedisMultiCommandType } from './multi-command'; +import RedisClientMultiCommand, { RedisClientMultiCommandType } from './multi-command'; +import { RedisMultiQueuedCommand } from '../multi-command'; import EventEmitter from 'events'; -import { CommandOptions, commandOptions, isCommandOptions } from './command-options'; -import { RedisLuaScript, RedisLuaScripts } from './lua-script'; -import { ScanOptions, ZMember } from './commands/generic-transformers'; -import { ScanCommandOptions } from './commands/SCAN'; -import { HScanTuple } from './commands/HSCAN'; -import { encodeCommand, extendWithDefaultCommands, extendWithModulesAndScripts, transformCommandArguments, transformCommandReply } from './commander'; +import { CommandOptions, commandOptions, isCommandOptions } from '../command-options'; +import { ScanOptions, ZMember } from '../commands/generic-transformers'; +import { ScanCommandOptions } from '../commands/SCAN'; +import { HScanTuple } from '../commands/HSCAN'; +import { encodeCommand, extendWithCommands, extendWithModulesAndScripts, transformCommandArguments, transformCommandReply } from '../commander'; import { Pool, Options as PoolOptions, createPool } from 'generic-pool'; -import { ClientClosedError } from './errors'; +import { ClientClosedError } from '../errors'; import { URL } from 'url'; -export interface RedisClientOptions { +export interface RedisClientOptions extends RedisPlugins { url?: string; socket?: RedisSocketOptions; username?: string; password?: string; database?: number; - modules?: M; - scripts?: S; commandsQueueMaxLength?: number; readonly?: boolean; legacyMode?: boolean; isolationPoolOptions?: PoolOptions; } -export type RedisCommandSignature = +export type RedisClientCommandSignature = (...args: Parameters | [options: CommandOptions, ...rest: Parameters]) => Promise>; type WithCommands = { - [P in keyof typeof COMMANDS]: RedisCommandSignature<(typeof COMMANDS)[P]>; + [P in keyof typeof COMMANDS]: RedisClientCommandSignature<(typeof COMMANDS)[P]>; }; -type WithModules = { +export type WithModules = { [P in keyof M]: { - [C in keyof M[P]]: RedisCommandSignature; + [C in keyof M[P]]: RedisClientCommandSignature; }; }; -type WithScripts = { - [P in keyof S]: RedisCommandSignature; +export type WithScripts = { + [P in keyof S]: RedisClientCommandSignature; }; -export type WithPlugins = - WithCommands & WithModules & WithScripts; +export type RedisClientType = + RedisClient & WithCommands & WithModules & WithScripts; -export type RedisClientType = - WithPlugins & RedisClient; +export type InstantiableRedisClient = + new (...args: ConstructorParameters) => RedisClientType; export interface ClientCommandOptions extends QueueCommandOptions { isolated?: boolean; } -export default class RedisClient extends EventEmitter { +export default class RedisClient extends EventEmitter { static commandOptions(options: ClientCommandOptions): CommandOptions { return commandOptions(options); } - static create(options?: RedisClientOptions): RedisClientType { - const Client = (extendWithModulesAndScripts({ + static extend(plugins?: RedisPlugins): InstantiableRedisClient { + const Client = extendWithModulesAndScripts({ BaseClass: RedisClient, - modules: options?.modules, + modules: plugins?.modules, modulesCommandsExecutor: RedisClient.prototype.commandsExecutor, - scripts: options?.scripts, + scripts: plugins?.scripts, scriptsExecutor: RedisClient.prototype.scriptsExecutor - })); + }); if (Client !== RedisClient) { - Client.prototype.Multi = RedisMultiCommand.extend(options); + Client.prototype.Multi = RedisClientMultiCommand.extend(plugins); } - return new Client(options); + return Client; + } + + static create(options?: RedisClientOptions): RedisClientType { + return new (RedisClient.extend(options))(options); } static parseURL(url: string): RedisClientOptions<{}, {}> { @@ -285,12 +287,12 @@ export default class RedisClient(args: TransformArgumentsReply, options?: ClientCommandOptions, bufferMode?: boolean): Promise { + sendCommand(args: RedisCommandArguments, options?: ClientCommandOptions, bufferMode?: boolean): Promise { return this.#sendCommand(args, options, bufferMode); } // using `#sendCommand` cause `sendCommand` is overwritten in legacy mode - async #sendCommand(args: TransformArgumentsReply, options?: ClientCommandOptions, bufferMode?: boolean): Promise { + async #sendCommand(args: RedisCommandArguments, options?: ClientCommandOptions, bufferMode?: boolean): Promise { if (!this.#socket.isOpen) { throw new ClientClosedError(); } @@ -309,7 +311,7 @@ export default class RedisClient): Promise> { + async scriptsExecutor(script: RedisScript, args: Array): Promise> { const { args: redisArgs, options } = transformCommandArguments(script, args); return transformCommandReply( @@ -319,7 +321,7 @@ export default class RedisClient> { + async executeScript(script: RedisScript, args: RedisCommandArguments, options?: ClientCommandOptions, bufferMode?: boolean): Promise> { try { return await this.#sendCommand([ 'EVALSHA', @@ -341,8 +343,6 @@ export default class RedisClient; async SELECT(options: CommandOptions, db: number): Promise; async SELECT(options?: any, db?: any): Promise { @@ -429,14 +429,14 @@ export default class RedisClient { + multi(): RedisClientMultiCommandType { return new (this as any).Multi( - this.#multiExecutor.bind(this), - this.#options + this.multiExecutor.bind(this), + this.#options?.legacyMode ); } - #multiExecutor(commands: Array, chainId?: symbol): Promise> { + multiExecutor(commands: Array, chainId?: symbol): Promise> { const promise = Promise.all( commands.map(({ args }) => { return this.#queue.addCommand(args, RedisClient.commandOptions({ @@ -508,5 +508,9 @@ export default class RedisClient = + (...args: Parameters) => RedisClientMultiCommandType; + +type WithCommands = { + [P in keyof typeof COMMANDS]: RedisClientMultiCommandSignature<(typeof COMMANDS)[P], M, S> +}; + +type WithModules = { + [P in keyof M]: { + [C in keyof M[P]]: RedisClientMultiCommandSignature; + }; +}; + +type WithScripts = { + [P in keyof S]: RedisClientMultiCommandSignature +}; + +export type RedisClientMultiCommandType = + RedisClientMultiCommand & WithCommands & WithModules & WithScripts; + +export type RedisClientMultiExecutor = (queue: Array, chainId?: symbol) => Promise>; + +export default class RedisClientMultiCommand { + readonly #multi = new RedisMultiCommand(); + readonly #executor: RedisClientMultiExecutor; + + static extend( + plugins?: RedisPlugins + ): new (...args: ConstructorParameters) => RedisClientMultiCommandType { + return extendWithModulesAndScripts({ + BaseClass: RedisClientMultiCommand, + modules: plugins?.modules, + modulesCommandsExecutor: RedisClientMultiCommand.prototype.commandsExecutor, + scripts: plugins?.scripts, + scriptsExecutor: RedisClientMultiCommand.prototype.scriptsExecutor + }); + } + + readonly v4: Record = {}; + + constructor(executor: RedisClientMultiExecutor, legacyMode = false) { + this.#executor = executor; + if (legacyMode) { + this.#legacyMode(); + } + } + + #legacyMode(): void { + this.v4.addCommand = this.addCommand.bind(this); + (this as any).addCommand = (...args: Array>): this => { + this.#multi.addCommand(args.flat()); + return this; + }; + this.v4.exec = this.exec.bind(this); + (this as any).exec = (callback?: (err: Error | null, replies?: Array) => unknown): void => { + this.v4.exec() + .then((reply: Array) => { + if (!callback) return; + + callback(null, reply); + }) + .catch((err: Error) => { + if (!callback) { + // this.emit('error', err); + return; + } + + callback(err); + }); + }; + + for (const name of Object.keys(COMMANDS)) { + this.#defineLegacyCommand(name); + } + } + + #defineLegacyCommand(name: string): void { + (this as any).v4[name] = (this as any)[name].bind(this.v4); + (this as any)[name] = (...args: Array): void => (this as any).addCommand(name, args); + } + + commandsExecutor(command: RedisCommand, args: Array): this { + return this.addCommand( + command.transformArguments(...args), + command.transformReply + ); + } + + addCommand(args: RedisCommandArguments, transformReply?: RedisCommand['transformReply']): this { + this.#multi.addCommand(args, transformReply); + return this; + } + + scriptsExecutor(script: RedisScript, args: Array): this { + this.#multi.addScript(script, args); + return this; + } + + async exec(execAsPipeline = false): Promise> { + if (execAsPipeline) { + return this.execAsPipeline(); + } + + const commands = this.#multi.exec(); + if (!commands) return []; + + return this.#multi.handleExecReplies( + await this.#executor(commands, RedisMultiCommand.generateChainId()) + ); + } + + EXEC = this.exec; + + async execAsPipeline(): Promise> { + if (!this.#multi.queue.length) return []; + + return this.#multi.transformReplies( + await this.#executor(this.#multi.queue) + ); + } +} + +extendWithCommands({ + BaseClass: RedisClientMultiCommand, + commands: COMMANDS, + executor: RedisClientMultiCommand.prototype.commandsExecutor +}); diff --git a/lib/socket.spec.ts b/lib/client/socket.spec.ts similarity index 100% rename from lib/socket.spec.ts rename to lib/client/socket.spec.ts diff --git a/lib/socket.ts b/lib/client/socket.ts similarity index 98% rename from lib/socket.ts rename to lib/client/socket.ts index 8bc94c5ba0..ca48ad4d54 100644 --- a/lib/socket.ts +++ b/lib/client/socket.ts @@ -1,8 +1,8 @@ import EventEmitter from 'events'; import net from 'net'; import tls from 'tls'; -import { ConnectionTimeoutError, ClientClosedError } from './errors'; -import { promiseTimeout } from './utils'; +import { ConnectionTimeoutError, ClientClosedError } from '../errors'; +import { promiseTimeout } from '../utils'; export interface RedisSocketCommonOptions { connectTimeout?: number; diff --git a/lib/cluster-slots.ts b/lib/cluster/cluster-slots.ts similarity index 91% rename from lib/cluster-slots.ts rename to lib/cluster/cluster-slots.ts index 29730bf753..63834d4b4c 100644 --- a/lib/cluster-slots.ts +++ b/lib/cluster/cluster-slots.ts @@ -1,16 +1,15 @@ import calculateSlot from 'cluster-key-slot'; -import RedisClient, { RedisClientType } from './client'; -import { RedisClusterMasterNode, RedisClusterReplicaNode } from './commands/CLUSTER_NODES'; -import { RedisClusterClientOptions, RedisClusterOptions } from './cluster'; -import { RedisModules } from './commands'; -import { RedisLuaScripts } from './lua-script'; +import RedisClient, { InstantiableRedisClient, RedisClientType } from '../client'; +import { RedisClusterMasterNode, RedisClusterReplicaNode } from '../commands/CLUSTER_NODES'; +import { RedisClusterClientOptions, RedisClusterOptions } from '.'; +import { RedisModules, RedisScripts } from '../commands'; -export interface ClusterNode { +export interface ClusterNode { id: string; client: RedisClientType; } -interface SlotNodes { +interface SlotNodes { master: ClusterNode; replicas: Array>; clientIterator: IterableIterator> | undefined; @@ -18,14 +17,16 @@ interface SlotNodes { type OnError = (err: unknown) => void; -export default class RedisClusterSlots { - readonly #options: RedisClusterOptions; +export default class RedisClusterSlots { + readonly #options: RedisClusterOptions; + readonly #Client: InstantiableRedisClient; readonly #onError: OnError; readonly #nodeByUrl = new Map>(); readonly #slots: Array> = []; - constructor(options: RedisClusterOptions, onError: OnError) { + constructor(options: RedisClusterOptions, onError: OnError) { this.#options = options; + this.#Client = RedisClient.extend(options); this.#onError = onError; } @@ -50,7 +51,7 @@ export default class RedisClusterSlots { - const client = RedisClient.create(clientOptions); + const client = new this.#Client(clientOptions); await client.connect(); @@ -118,7 +119,7 @@ export default class RedisClusterSlots { it('sendCommand', async () => { @@ -15,7 +15,7 @@ describe('Cluster', () => { await cluster.connect(); try { - await cluster.ping(); + await cluster.publish('channel', 'message'); await cluster.set('a', 'b'); await cluster.set('a{a}', 'bb'); await cluster.set('aa', 'bb'); @@ -32,11 +32,10 @@ describe('Cluster', () => { const key = 'key'; assert.deepEqual( await cluster.multi(key) - .ping() .set(key, 'value') .get(key) .exec(), - ['PONG', 'OK', 'value'] + ['OK', 'value'] ); }); diff --git a/lib/cluster.ts b/lib/cluster/index.ts similarity index 68% rename from lib/cluster.ts rename to lib/cluster/index.ts index 295e193cbc..4b55a93d4a 100644 --- a/lib/cluster.ts +++ b/lib/cluster/index.ts @@ -1,27 +1,35 @@ -import { RedisCommand, RedisCommandReply, RedisModules, TransformArgumentsReply } from './commands'; -import RedisClient, { ClientCommandOptions, RedisClientOptions, RedisClientType, WithPlugins } from './client'; +import COMMANDS from './commands'; +import { RedisCommand, RedisCommandArguments, RedisCommandReply, RedisModules, RedisScript, RedisScripts } from '../commands'; +import { ClientCommandOptions, RedisClientCommandSignature, RedisClientOptions, RedisClientType, WithModules, WithScripts } from '../client'; import RedisClusterSlots, { ClusterNode } from './cluster-slots'; -import { RedisLuaScript, RedisLuaScripts } from './lua-script'; -import { extendWithModulesAndScripts, extendWithDefaultCommands, transformCommandArguments, transformCommandReply } from './commander'; -import RedisMultiCommand, { MultiQueuedCommand, RedisMultiCommandType } from './multi-command'; +import { extendWithModulesAndScripts, transformCommandArguments, transformCommandReply, extendWithCommands } from '../commander'; import { EventEmitter } from 'events'; +import RedisClusterMultiCommand, { RedisClusterMultiCommandType } from './multi-command'; +import { RedisMultiQueuedCommand } from '../multi-command'; export type RedisClusterClientOptions = Omit, 'modules' | 'scripts'>; -export interface RedisClusterOptions { - rootNodes: Array; - defaults?: Partial; +export interface RedisClusterPlugins { modules?: M; scripts?: S; +} + +export interface RedisClusterOptions extends RedisClusterPlugins { + rootNodes: Array; + defaults?: Partial; useReplicas?: boolean; maxCommandRedirections?: number; } -export type RedisClusterType = - WithPlugins & RedisCluster; +type WithCommands = { + [P in keyof typeof COMMANDS]: RedisClientCommandSignature<(typeof COMMANDS)[P]>; +}; -export default class RedisCluster extends EventEmitter { - static #extractFirstKey(command: RedisCommand, originalArgs: Array, redisArgs: TransformArgumentsReply): string | Buffer | undefined { +export type RedisClusterType = + RedisCluster & WithCommands & WithModules & WithScripts; + +export default class RedisCluster extends EventEmitter { + static extractFirstKey(command: RedisCommand, originalArgs: Array, redisArgs: RedisCommandArguments): string | Buffer | undefined { if (command.FIRST_KEY_INDEX === undefined) { return undefined; } else if (typeof command.FIRST_KEY_INDEX === 'number') { @@ -31,7 +39,7 @@ export default class RedisCluster(options?: RedisClusterOptions): RedisClusterType { + static create(options?: RedisClusterOptions): RedisClusterType { return new (extendWithModulesAndScripts({ BaseClass: RedisCluster, modules: options?.modules, @@ -41,20 +49,20 @@ export default class RedisCluster; readonly #slots: RedisClusterSlots; - readonly #Multi: new (...args: ConstructorParameters) => RedisMultiCommandType; + readonly #Multi: new (...args: ConstructorParameters) => RedisClusterMultiCommandType; constructor(options: RedisClusterOptions) { super(); this.#options = options; this.#slots = new RedisClusterSlots(options, err => this.emit('error', err)); - this.#Multi = RedisMultiCommand.extend(options); + this.#Multi = RedisClusterMultiCommand.extend(options); } - duplicate(): RedisClusterOptions { - return new (Object.getPrototypeOf(this).constructor)(this.#options); + duplicate(): RedisClusterType { + return new (Object.getPrototypeOf(this).constructor)(); } async connect(): Promise { @@ -67,7 +75,7 @@ export default class RedisCluster( firstKey: string | Buffer | undefined, isReadonly: boolean | undefined, - args: TransformArgumentsReply, + args: RedisCommandArguments, options?: ClientCommandOptions, bufferMode?: boolean, redirections = 0 @@ -101,7 +109,7 @@ export default class RedisCluster): Promise> { + async scriptsExecutor(script: RedisScript, args: Array): Promise> { const { args: redisArgs, options } = transformCommandArguments(script, args); return transformCommandReply( @@ -117,14 +125,14 @@ export default class RedisCluster, - redisArgs: TransformArgumentsReply, + redisArgs: RedisCommandArguments, options?: ClientCommandOptions, redirections = 0 ): Promise> { const client = this.#slots.getClient( - RedisCluster.#extractFirstKey(script, originalArgs, redisArgs), + RedisCluster.extractFirstKey(script, originalArgs, redisArgs), script.IS_READ_ONLY ); @@ -169,20 +177,14 @@ export default class RedisCluster { + multi(routing?: string | Buffer): RedisClusterMultiCommandType { return new this.#Multi( - async (commands: Array, chainId?: symbol) => { - const client = this.#slots.getClient(routing); - - return Promise.all( - commands.map(({ args }) => { - return client.sendCommand(args, RedisClient.commandOptions({ - chainId - })); - }) - ); + async (commands: Array, firstKey?: string | Buffer, chainId?: symbol) => { + return this.#slots + .getClient(firstKey) + .multiExecutor(commands, chainId); }, - this.#options + routing ); } @@ -199,4 +201,8 @@ export default class RedisCluster = + (...args: Parameters) => RedisClusterMultiCommandType; + +type WithCommands = { + [P in keyof typeof COMMANDS]: RedisClusterMultiCommandSignature<(typeof COMMANDS)[P], M, S> +}; + +type WithModules = { + [P in keyof M]: { + [C in keyof M[P]]: RedisClusterMultiCommandSignature; + }; +}; + +type WithScripts = { + [P in keyof S]: RedisClusterMultiCommandSignature +}; + +export type RedisClusterMultiCommandType = + RedisClusterMultiCommand & WithCommands & WithModules & WithScripts; + +export type RedisClusterMultiExecutor = (queue: Array, firstKey?: string | Buffer, chainId?: symbol) => Promise>; + +export default class RedisClusterMultiCommand { + readonly #multi = new RedisMultiCommand(); + readonly #executor: RedisClusterMultiExecutor; + #firstKey: string | Buffer | undefined; + + static extend( + plugins?: RedisPlugins + ): new (...args: ConstructorParameters) => RedisClusterMultiCommandType { + return extendWithModulesAndScripts({ + BaseClass: RedisClusterMultiCommand, + modules: plugins?.modules, + modulesCommandsExecutor: RedisClusterMultiCommand.prototype.commandsExecutor, + scripts: plugins?.scripts, + scriptsExecutor: RedisClusterMultiCommand.prototype.scriptsExecutor + }); + } + + constructor(executor: RedisClusterMultiExecutor, firstKey?: string | Buffer) { + this.#executor = executor; + this.#firstKey = firstKey; + } + + commandsExecutor(command: RedisCommand, args: Array): this { + const transformedArguments = command.transformArguments(...args); + if (!this.#firstKey) { + this.#firstKey = RedisCluster.extractFirstKey(command, args, transformedArguments); + } + + return this.addCommand( + undefined, + transformedArguments, + command.transformReply + ); + } + + addCommand( + firstKey: string | Buffer | undefined, + args: RedisCommandArguments, + transformReply?: RedisCommand['transformReply'] + ): this { + if (!this.#firstKey) { + this.#firstKey = firstKey; + } + + this.#multi.addCommand(args, transformReply); + return this; + } + + scriptsExecutor(script: RedisScript, args: Array): this { + const transformedArguments = this.#multi.addScript(script, args); + if (!this.#firstKey) { + this.#firstKey = RedisCluster.extractFirstKey(script, args, transformedArguments); + } + + return this.addCommand(undefined, transformedArguments); + } + + async exec(execAsPipeline = false): Promise> { + if (execAsPipeline) { + return this.execAsPipeline(); + } + + const commands = this.#multi.exec(); + if (!commands) return []; + + return this.#multi.handleExecReplies( + await this.#executor(commands, this.#firstKey, RedisMultiCommand.generateChainId()) + ); + } + + EXEC = this.exec; + + async execAsPipeline(): Promise> { + return this.#multi.transformReplies( + await this.#executor(this.#multi.queue, this.#firstKey) + ); + } +} + +extendWithCommands({ + BaseClass: RedisClusterMultiCommand, + commands: COMMANDS, + executor: RedisClusterMultiCommand.prototype.commandsExecutor +}); diff --git a/lib/commander.ts b/lib/commander.ts index 4e542bde74..5871c2f235 100644 --- a/lib/commander.ts +++ b/lib/commander.ts @@ -1,37 +1,32 @@ -import COMMANDS, { RedisCommand, RedisCommandReply, RedisModules, RedisReply, TransformArgumentsReply } from './commands'; -import { RedisLuaScript, RedisLuaScripts } from './lua-script'; import { CommandOptions, isCommandOptions } from './command-options'; +import { RedisCommand, RedisCommandArguments, RedisCommandRawReply, RedisCommandReply, RedisCommands, RedisModules, RedisScript, RedisScripts } from './commands'; type Instantiable = new(...args: Array) => T; -type CommandExecutor = (this: InstanceType, command: RedisCommand, args: Array) => unknown; +interface ExtendWithCommandsConfig { + BaseClass: T; + commands: RedisCommands; + executor(command: RedisCommand, args: Array): unknown; +} -export function extendWithDefaultCommands(BaseClass: T, executor: CommandExecutor): void { - for (const [name, command] of Object.entries(COMMANDS)) { +export function extendWithCommands({ BaseClass, commands, executor }: ExtendWithCommandsConfig): void { + for (const [name, command] of Object.entries(commands)) { BaseClass.prototype[name] = function (...args: Array): unknown { return executor.call(this, command, args); }; } } -interface ExtendWithModulesAndScriptsConfig< - T extends Instantiable, - M extends RedisModules, - S extends RedisLuaScripts -> { +interface ExtendWithModulesAndScriptsConfig { BaseClass: T; - modules: M | undefined; - modulesCommandsExecutor: CommandExecutor; - scripts: S | undefined; - scriptsExecutor(this: InstanceType, script: RedisLuaScript, args: Array): unknown; + modules?: RedisModules; + modulesCommandsExecutor(this: InstanceType, command: RedisCommand, args: Array): unknown; + scripts?: RedisScripts; + scriptsExecutor(this: InstanceType, script: RedisScript, args: Array): unknown; } -export function extendWithModulesAndScripts< - T extends Instantiable, - M extends RedisModules, - S extends RedisLuaScripts, ->(config: ExtendWithModulesAndScriptsConfig): T { +export function extendWithModulesAndScripts(config: ExtendWithModulesAndScriptsConfig): T { let Commander: T | undefined; if (config.modules) { @@ -39,7 +34,7 @@ export function extendWithModulesAndScripts< constructor(...args: Array) { super(...args); - for (const module of Object.keys(config.modules as RedisModules)) { + for (const module of Object.keys(config.modules!)) { this[module] = new this[module](this); } } @@ -79,7 +74,7 @@ export function transformCommandArguments( command: RedisCommand, args: Array ): { - args: TransformArgumentsReply; + args: RedisCommandArguments; options: CommandOptions | undefined; } { let options; @@ -96,7 +91,7 @@ export function transformCommandArguments( const DELIMITER = '\r\n'; -export function* encodeCommand(args: TransformArgumentsReply): IterableIterator { +export function* encodeCommand(args: RedisCommandArguments): IterableIterator { yield `*${args.length}${DELIMITER}`; for (const arg of args) { @@ -107,7 +102,11 @@ export function* encodeCommand(args: TransformArgumentsReply): IterableIterator< } } -export function transformCommandReply(command: RedisCommand, rawReply: RedisReply, preserved: unknown): RedisCommandReply { +export function transformCommandReply( + command: RedisCommand, + rawReply: RedisCommandRawReply, + preserved: unknown +): RedisCommandReply { if (!command.transformReply) { return rawReply; } diff --git a/lib/commands/ACL_DELUSER.ts b/lib/commands/ACL_DELUSER.ts index e83e4d7d0a..97f50d4894 100644 --- a/lib/commands/ACL_DELUSER.ts +++ b/lib/commands/ACL_DELUSER.ts @@ -1,7 +1,7 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; -export function transformArguments(username: string | Array): TransformArgumentsReply { +export function transformArguments(username: string | Array): RedisCommandArguments { return pushVerdictArguments(['ACL', 'DELUSER'], username); } diff --git a/lib/commands/ACL_SETUSER.ts b/lib/commands/ACL_SETUSER.ts index a590376ab8..d8734f0a1c 100644 --- a/lib/commands/ACL_SETUSER.ts +++ b/lib/commands/ACL_SETUSER.ts @@ -1,7 +1,7 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; -export function transformArguments(username: string, rule: string | Array): TransformArgumentsReply { +export function transformArguments(username: string, rule: string | Array): RedisCommandArguments { return pushVerdictArguments(['ACL', 'SETUSER', username], rule); } diff --git a/lib/commands/BITOP.ts b/lib/commands/BITOP.ts index 1a750f811c..af31f42f1d 100644 --- a/lib/commands/BITOP.ts +++ b/lib/commands/BITOP.ts @@ -1,11 +1,11 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 2; type BitOperations = 'AND' | 'OR' | 'XOR' | 'NOT'; -export function transformArguments(operation: BitOperations, destKey: string, key: string | Array): TransformArgumentsReply { +export function transformArguments(operation: BitOperations, destKey: string, key: string | Array): RedisCommandArguments { return pushVerdictArguments(['BITOP', operation, destKey], key); } diff --git a/lib/commands/BLPOP.ts b/lib/commands/BLPOP.ts index 1061f5e113..15c5272294 100644 --- a/lib/commands/BLPOP.ts +++ b/lib/commands/BLPOP.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(keys: string | Buffer | Array, timeout: number): TransformArgumentsReply { +export function transformArguments(keys: string | Buffer | Array, timeout: number): RedisCommandArguments { const args = pushVerdictArguments(['BLPOP'], keys); args.push(timeout.toString()); diff --git a/lib/commands/BRPOP.ts b/lib/commands/BRPOP.ts index 93ded4dbf1..602ce9c791 100644 --- a/lib/commands/BRPOP.ts +++ b/lib/commands/BRPOP.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string | Array, timeout: number): TransformArgumentsReply { +export function transformArguments(key: string | Array, timeout: number): RedisCommandArguments { const args = pushVerdictArguments(['BRPOP'], key); args.push(timeout.toString()); diff --git a/lib/commands/BZPOPMAX.ts b/lib/commands/BZPOPMAX.ts index 3db9ca42cb..eb6647ce9e 100644 --- a/lib/commands/BZPOPMAX.ts +++ b/lib/commands/BZPOPMAX.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments, transformReplyNumberInfinity, ZMember } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string | Array, timeout: number): TransformArgumentsReply { +export function transformArguments(key: string | Array, timeout: number): RedisCommandArguments { const args = pushVerdictArguments(['BZPOPMAX'], key); args.push(timeout.toString()); diff --git a/lib/commands/BZPOPMIN.ts b/lib/commands/BZPOPMIN.ts index 9106ae770d..75b092e543 100644 --- a/lib/commands/BZPOPMIN.ts +++ b/lib/commands/BZPOPMIN.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments, transformReplyNumberInfinity, ZMember } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string | Array, timeout: number): TransformArgumentsReply { +export function transformArguments(key: string | Array, timeout: number): RedisCommandArguments { const args = pushVerdictArguments(['BZPOPMIN'], key); args.push(timeout.toString()); diff --git a/lib/commands/CLUSTER_INFO.spec.ts b/lib/commands/CLUSTER_INFO.spec.ts index ce41151b67..a4def45cb7 100644 --- a/lib/commands/CLUSTER_INFO.spec.ts +++ b/lib/commands/CLUSTER_INFO.spec.ts @@ -1,5 +1,4 @@ import { strict as assert } from 'assert'; -import { itWithCluster, TestRedisClusters } from '../test-utils'; import { transformArguments, transformReply } from './CLUSTER_INFO'; describe('CLUSTER INFO', () => { @@ -44,21 +43,4 @@ describe('CLUSTER INFO', () => { } ); }); - - itWithCluster(TestRedisClusters.OPEN, 'cluster.clusterInfo', async cluster => { - const info = await cluster.clusterInfo(); - assert.equal(info.state, 'ok'); - assert.deepEqual(info.slots, { - assigned: 16384, - ok: 16384, - pfail: 0, - fail: 0 - }); - assert.equal(info.knownNodes, 3); - assert.equal(info.size, 3); - assert.equal(typeof info.currentEpoch, 'number'); - assert.equal(typeof info.myEpoch, 'number'); - assert.equal(typeof info.stats.messagesReceived, 'number'); - assert.equal(typeof info.stats.messagesSent, 'number'); - }); }); diff --git a/lib/commands/CLUSTER_NODES.spec.ts b/lib/commands/CLUSTER_NODES.spec.ts index 1f0e9dd425..2b3881d8cd 100644 --- a/lib/commands/CLUSTER_NODES.spec.ts +++ b/lib/commands/CLUSTER_NODES.spec.ts @@ -1,5 +1,4 @@ import { strict as assert } from 'assert'; -import { itWithCluster, TestRedisClusters } from '../test-utils'; import { RedisClusterNodeLinkStates, transformArguments, transformReply } from './CLUSTER_NODES'; describe('CLUSTER NODES', () => { @@ -93,24 +92,4 @@ describe('CLUSTER NODES', () => { ); }); }); - - itWithCluster(TestRedisClusters.OPEN, 'cluster.clusterNodes', async cluster => { - for (const node of (await cluster.clusterNodes())) { - assert.equal(typeof node.id, 'string'); - assert.equal(typeof node.url, 'string'); - assert.equal(typeof node.host, 'string'); - assert.equal(typeof node.port, 'number'); - assert.equal(typeof node.cport, 'number'); - assert.ok(Array.isArray(node.flags)); - assert.equal(typeof node.pingSent, 'number'); - assert.equal(typeof node.pongRecv, 'number'); - assert.equal(typeof node.configEpoch, 'number'); - assert.equal(typeof node.linkState, 'string'); - - for (const slot of node.slots) { - assert.equal(typeof slot.from, 'number'); - assert.equal(typeof slot.to, 'number'); - } - } - }); }); diff --git a/lib/commands/CLUSTER_SLOTS.ts b/lib/commands/CLUSTER_SLOTS.ts index b4672e731a..afe1ebc83d 100644 --- a/lib/commands/CLUSTER_SLOTS.ts +++ b/lib/commands/CLUSTER_SLOTS.ts @@ -1,6 +1,6 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; -export function transformArguments(): TransformArgumentsReply { +export function transformArguments(): RedisCommandArguments { return ['CLUSTER', 'SLOTS']; } diff --git a/lib/commands/COMMAND.ts b/lib/commands/COMMAND.ts index f72cc3f37d..b6ee50b2f4 100644 --- a/lib/commands/COMMAND.ts +++ b/lib/commands/COMMAND.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { CommandRawReply, CommandReply, transformCommandReply } from './generic-transformers'; export const IS_READ_ONLY = true; -export function transformArguments(): TransformArgumentsReply { +export function transformArguments(): RedisCommandArguments { return ['COMMAND']; } diff --git a/lib/commands/COMMAND_COUNT.spec.ts b/lib/commands/COMMAND_COUNT.spec.ts index 61ba1bf254..23e83c71ce 100644 --- a/lib/commands/COMMAND_COUNT.spec.ts +++ b/lib/commands/COMMAND_COUNT.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { itWithClient, itWithCluster, TestRedisClusters, TestRedisServers } from '../test-utils'; +import { TestRedisServers, itWithClient } from '../test-utils'; import { transformArguments } from './COMMAND_COUNT'; describe('COMMAND COUNT', () => { @@ -16,11 +16,4 @@ describe('COMMAND COUNT', () => { 'number' ); }); - - itWithCluster(TestRedisClusters.OPEN, 'cluster.commandCount', async cluster => { - assert.equal( - typeof await cluster.commandCount(), - 'number' - ); - }); }); diff --git a/lib/commands/COMMAND_COUNT.ts b/lib/commands/COMMAND_COUNT.ts index 4cdec7bebf..5b8283bcc6 100644 --- a/lib/commands/COMMAND_COUNT.ts +++ b/lib/commands/COMMAND_COUNT.ts @@ -1,8 +1,8 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; export const IS_READ_ONLY = true; -export function transformArguments(): TransformArgumentsReply { +export function transformArguments(): RedisCommandArguments { return ['COMMAND', 'COUNT']; } diff --git a/lib/commands/COMMAND_GETKEYS.spec.ts b/lib/commands/COMMAND_GETKEYS.spec.ts index 37e9178158..f2630db9af 100644 --- a/lib/commands/COMMAND_GETKEYS.spec.ts +++ b/lib/commands/COMMAND_GETKEYS.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { itWithClient, itWithCluster, TestRedisClusters, TestRedisServers } from '../test-utils'; +import { TestRedisServers, itWithClient } from '../test-utils'; import { transformArguments } from './COMMAND_GETKEYS'; describe('COMMAND GETKEYS', () => { @@ -16,11 +16,4 @@ describe('COMMAND GETKEYS', () => { ['key'] ); }); - - itWithCluster(TestRedisClusters.OPEN, 'cluster.commandGetKeys', async cluster => { - assert.deepEqual( - await cluster.commandGetKeys(['GET', 'key']), - ['key'] - ); - }); }); diff --git a/lib/commands/COMMAND_GETKEYS.ts b/lib/commands/COMMAND_GETKEYS.ts index 0b8f38e3d0..caf342088f 100644 --- a/lib/commands/COMMAND_GETKEYS.ts +++ b/lib/commands/COMMAND_GETKEYS.ts @@ -1,8 +1,8 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; export const IS_READ_ONLY = true; -export function transformArguments(args: Array): TransformArgumentsReply { +export function transformArguments(args: Array): RedisCommandArguments { return ['COMMAND', 'GETKEYS', ...args]; } diff --git a/lib/commands/COMMAND_INFO.ts b/lib/commands/COMMAND_INFO.ts index 274c57d6ae..6f84d0edaf 100644 --- a/lib/commands/COMMAND_INFO.ts +++ b/lib/commands/COMMAND_INFO.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { CommandRawReply, CommandReply, transformCommandReply } from './generic-transformers'; export const IS_READ_ONLY = true; -export function transformArguments(commands: Array): TransformArgumentsReply { +export function transformArguments(commands: Array): RedisCommandArguments { return ['COMMAND', 'INFO', ...commands]; } diff --git a/lib/commands/DBSIZE.spec.ts b/lib/commands/DBSIZE.spec.ts index 87e3c15453..36f591dbd2 100644 --- a/lib/commands/DBSIZE.spec.ts +++ b/lib/commands/DBSIZE.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster } from '../test-utils'; +import { TestRedisServers, itWithClient } from '../test-utils'; import { transformArguments } from './DBSIZE'; describe('DBSIZE', () => { @@ -16,11 +16,4 @@ describe('DBSIZE', () => { 0 ); }); - - itWithCluster(TestRedisClusters.OPEN, 'cluster.dbSize', async cluster => { - assert.equal( - await cluster.dbSize(), - 0 - ); - }); }); diff --git a/lib/commands/DEL.ts b/lib/commands/DEL.ts index b815258df1..02ef553f64 100644 --- a/lib/commands/DEL.ts +++ b/lib/commands/DEL.ts @@ -1,7 +1,7 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; -export function transformArguments(keys: string | Array): TransformArgumentsReply { +export function transformArguments(keys: string | Array): RedisCommandArguments { return pushVerdictArguments(['DEL'], keys); } diff --git a/lib/commands/ECHO.spec.ts b/lib/commands/ECHO.spec.ts index 4a1bf8fe37..d91b737395 100644 --- a/lib/commands/ECHO.spec.ts +++ b/lib/commands/ECHO.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster } from '../test-utils'; +import { TestRedisServers, itWithClient } from '../test-utils'; import { transformArguments } from './ECHO'; describe('ECHO', () => { @@ -16,11 +16,4 @@ describe('ECHO', () => { 'message' ); }); - - itWithCluster(TestRedisClusters.OPEN, 'cluster.echo', async cluster => { - assert.equal( - await cluster.echo('message'), - 'message' - ); - }); }); diff --git a/lib/commands/EXISTS.ts b/lib/commands/EXISTS.ts index 00d10b9eeb..aac164fc95 100644 --- a/lib/commands/EXISTS.ts +++ b/lib/commands/EXISTS.ts @@ -1,11 +1,11 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments, transformReplyBoolean } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; export const IS_READ_ONLY = true; -export function transformArguments(keys: string | Array): TransformArgumentsReply { +export function transformArguments(keys: string | Array): RedisCommandArguments { return pushVerdictArguments(['EXISTS'], keys); } diff --git a/lib/commands/GEOHASH.ts b/lib/commands/GEOHASH.ts index 2ee2c6a668..8613f37fa4 100644 --- a/lib/commands/GEOHASH.ts +++ b/lib/commands/GEOHASH.ts @@ -1,11 +1,11 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; export const IS_READ_ONLY = true; -export function transformArguments(key: string, member: string | Array): TransformArgumentsReply { +export function transformArguments(key: string, member: string | Array): RedisCommandArguments { return pushVerdictArguments(['GEOHASH', key], member); } diff --git a/lib/commands/GEOPOS.ts b/lib/commands/GEOPOS.ts index 893048cf6d..95f33d9e3a 100644 --- a/lib/commands/GEOPOS.ts +++ b/lib/commands/GEOPOS.ts @@ -1,11 +1,11 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; export const IS_READ_ONLY = true; -export function transformArguments(key: string, member: string | Array): TransformArgumentsReply { +export function transformArguments(key: string, member: string | Array): RedisCommandArguments { return pushVerdictArguments(['GEOPOS', key], member); } diff --git a/lib/commands/GEOSEARCH_WITH.spec.ts b/lib/commands/GEOSEARCH_WITH.spec.ts index a400fb965c..922c00d719 100644 --- a/lib/commands/GEOSEARCH_WITH.spec.ts +++ b/lib/commands/GEOSEARCH_WITH.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster, describeHandleMinimumRedisVersion } from '../test-utils'; import { GeoReplyWith } from './generic-transformers'; import { transformArguments } from './GEOSEARCH_WITH'; @@ -8,7 +8,7 @@ describe('GEOSEARCH WITH', () => { describeHandleMinimumRedisVersion([6, 2]); it('transformArguments', () => { - const expectedReply: TransformArgumentsReply = ['GEOSEARCH', 'key', 'FROMMEMBER', 'member', 'BYRADIUS', '1', 'm', 'WITHDIST'] + const expectedReply: RedisCommandArguments = ['GEOSEARCH', 'key', 'FROMMEMBER', 'member', 'BYRADIUS', '1', 'm', 'WITHDIST'] expectedReply.preserve = ['WITHDIST']; assert.deepEqual( diff --git a/lib/commands/GEOSEARCH_WITH.ts b/lib/commands/GEOSEARCH_WITH.ts index ef19ca5dfc..cd461c9677 100644 --- a/lib/commands/GEOSEARCH_WITH.ts +++ b/lib/commands/GEOSEARCH_WITH.ts @@ -1,4 +1,4 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { GeoSearchFrom, GeoSearchBy, GeoReplyWith, GeoSearchOptions, transformGeoMembersWithReply } from './generic-transformers'; import { transformArguments as geoSearchTransformArguments } from './GEOSEARCH'; @@ -10,8 +10,8 @@ export function transformArguments( by: GeoSearchBy, replyWith: Array, options?: GeoSearchOptions -): TransformArgumentsReply { - const args: TransformArgumentsReply = geoSearchTransformArguments(key, from, by, options); +): RedisCommandArguments { + const args: RedisCommandArguments = geoSearchTransformArguments(key, from, by, options); args.push(...replyWith); diff --git a/lib/commands/GET.ts b/lib/commands/GET.ts index dbd303d1c6..0e89a4e6a7 100644 --- a/lib/commands/GET.ts +++ b/lib/commands/GET.ts @@ -1,10 +1,10 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; export const FIRST_KEY_INDEX = 1; export const IS_READ_ONLY = true; -export function transformArguments(key: string | Buffer): TransformArgumentsReply { +export function transformArguments(key: string | Buffer): RedisCommandArguments { return ['GET', key]; } diff --git a/lib/commands/GETEX.ts b/lib/commands/GETEX.ts index 2c6a4f243f..cd4f283eee 100644 --- a/lib/commands/GETEX.ts +++ b/lib/commands/GETEX.ts @@ -1,4 +1,4 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { transformEXAT, transformPXAT } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -15,7 +15,7 @@ type GetExModes = { PERSIST: true; }; -export function transformArguments(key: string, mode: GetExModes): TransformArgumentsReply { +export function transformArguments(key: string, mode: GetExModes): RedisCommandArguments { const args = ['GETEX', key]; if ('EX' in mode) { diff --git a/lib/commands/HDEL.ts b/lib/commands/HDEL.ts index 75130c8723..58d057ebf1 100644 --- a/lib/commands/HDEL.ts +++ b/lib/commands/HDEL.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, field: string | Array): TransformArgumentsReply { +export function transformArguments(key: string, field: string | Array): RedisCommandArguments { return pushVerdictArguments(['HDEL', key], field); } diff --git a/lib/commands/HMGET.ts b/lib/commands/HMGET.ts index 420102d2b2..7ca3a55b69 100644 --- a/lib/commands/HMGET.ts +++ b/lib/commands/HMGET.ts @@ -1,11 +1,11 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; export const IS_READ_ONLY = true; -export function transformArguments(key: string, fields: string | Array): TransformArgumentsReply { +export function transformArguments(key: string, fields: string | Array): RedisCommandArguments { return pushVerdictArguments(['HMGET', key], fields); } diff --git a/lib/commands/HSET.ts b/lib/commands/HSET.ts index 1aecd50c0d..1d4acd6c01 100644 --- a/lib/commands/HSET.ts +++ b/lib/commands/HSET.ts @@ -1,4 +1,4 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; type HSETObject = Record; @@ -14,7 +14,7 @@ type SingleFieldArguments = [...generic: GenericArguments, field: string, value: type MultipleFieldsArguments = [...generic: GenericArguments, value: HSETObject | HSETMap | HSETTuples]; -export function transformArguments(...[ key, value, fieldValue ]: SingleFieldArguments | MultipleFieldsArguments): TransformArgumentsReply { +export function transformArguments(...[ key, value, fieldValue ]: SingleFieldArguments | MultipleFieldsArguments): RedisCommandArguments { const args = ['HSET', key]; if (typeof value === 'string') { diff --git a/lib/commands/LASTSAVE.spec.ts b/lib/commands/LASTSAVE.spec.ts index 1b13bed5d2..b8d801f70b 100644 --- a/lib/commands/LASTSAVE.spec.ts +++ b/lib/commands/LASTSAVE.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, itWithCluster, TestRedisClusters } from '../test-utils'; +import { TestRedisServers, itWithClient } from '../test-utils'; import { transformArguments } from './LASTSAVE'; describe('LASTSAVE', () => { @@ -13,8 +13,4 @@ describe('LASTSAVE', () => { itWithClient(TestRedisServers.OPEN, 'client.lastSave', async client => { assert.ok((await client.lastSave()) instanceof Date); }); - - itWithCluster(TestRedisClusters.OPEN, 'cluster.lastSave', async cluster => { - assert.ok((await cluster.lastSave()) instanceof Date); - }); }); diff --git a/lib/commands/LOLWUT.spec.ts b/lib/commands/LOLWUT.spec.ts index 8e77b85b59..8f4478aecc 100644 --- a/lib/commands/LOLWUT.spec.ts +++ b/lib/commands/LOLWUT.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, itWithCluster, TestRedisClusters } from '../test-utils'; +import { TestRedisServers, itWithClient } from '../test-utils'; import { transformArguments } from './LOLWUT'; describe('LOLWUT', () => { @@ -25,7 +25,7 @@ describe('LOLWUT', () => { ); }); }); - + itWithClient(TestRedisServers.OPEN, 'client.LOLWUT', async client => { assert.equal( @@ -33,11 +33,4 @@ describe('LOLWUT', () => { 'string' ); }); - - itWithCluster(TestRedisClusters.OPEN, 'cluster.LOLWUT', async cluster => { - assert.equal( - typeof (await cluster.LOLWUT()), - 'string' - ); - }); }); diff --git a/lib/commands/LPUSH.ts b/lib/commands/LPUSH.ts index 349affb5e0..b964434477 100644 --- a/lib/commands/LPUSH.ts +++ b/lib/commands/LPUSH.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, elements: string | Array): TransformArgumentsReply { +export function transformArguments(key: string, elements: string | Array): RedisCommandArguments { return pushVerdictArguments(['LPUSH', key], elements);} export declare function transformReply(): number; diff --git a/lib/commands/LPUSHX.ts b/lib/commands/LPUSHX.ts index 23b8bd9b91..5f92d84d3b 100644 --- a/lib/commands/LPUSHX.ts +++ b/lib/commands/LPUSHX.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, element: string | Array): TransformArgumentsReply { +export function transformArguments(key: string, element: string | Array): RedisCommandArguments { return pushVerdictArguments(['LPUSHX', key], element); } diff --git a/lib/commands/MEMORY_DOCTOR.spec.ts b/lib/commands/MEMORY_DOCTOR.spec.ts index da883deeb7..1b4d16fa0d 100644 --- a/lib/commands/MEMORY_DOCTOR.spec.ts +++ b/lib/commands/MEMORY_DOCTOR.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster } from '../test-utils'; +import { TestRedisServers, itWithClient } from '../test-utils'; import { transformArguments } from './MEMORY_DOCTOR'; describe('MEMORY DOCTOR', () => { @@ -16,11 +16,4 @@ describe('MEMORY DOCTOR', () => { 'string' ); }); - - itWithCluster(TestRedisClusters.OPEN, 'cluster.memoryDoctor', async cluster => { - assert.equal( - typeof (await cluster.memoryDoctor()), - 'string' - ); - }); }); diff --git a/lib/commands/MEMORY_MALLOC-STATS.spec.ts b/lib/commands/MEMORY_MALLOC-STATS.spec.ts index 2750ebdf7a..034b94f7c6 100644 --- a/lib/commands/MEMORY_MALLOC-STATS.spec.ts +++ b/lib/commands/MEMORY_MALLOC-STATS.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster } from '../test-utils'; +import { TestRedisServers, itWithClient } from '../test-utils'; import { transformArguments } from './MEMORY_MALLOC-STATS'; describe('MEMORY MALLOC-STATS', () => { @@ -16,11 +16,4 @@ describe('MEMORY MALLOC-STATS', () => { 'string' ); }); - - itWithCluster(TestRedisClusters.OPEN, 'cluster.memoryDoctor', async cluster => { - assert.equal( - typeof (await cluster.memoryDoctor()), - 'string' - ); - }); }); diff --git a/lib/commands/MEMORY_PURGE.spec.ts b/lib/commands/MEMORY_PURGE.spec.ts index ac9198ccfc..97ca6feebf 100644 --- a/lib/commands/MEMORY_PURGE.spec.ts +++ b/lib/commands/MEMORY_PURGE.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster } from '../test-utils'; +import { TestRedisServers, itWithClient } from '../test-utils'; import { transformArguments } from './MEMORY_PURGE'; describe('MEMORY PURGE', () => { @@ -16,11 +16,4 @@ describe('MEMORY PURGE', () => { 'OK' ); }); - - itWithCluster(TestRedisClusters.OPEN, 'cluster.memoryPurge', async cluster => { - assert.equal( - await cluster.memoryPurge(), - 'OK' - ); - }); }); diff --git a/lib/commands/MEMORY_USAGE.spec.ts b/lib/commands/MEMORY_USAGE.spec.ts index 7487e7e4ff..90dff62c67 100644 --- a/lib/commands/MEMORY_USAGE.spec.ts +++ b/lib/commands/MEMORY_USAGE.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster } from '../test-utils'; +import { TestRedisServers, itWithClient } from '../test-utils'; import { transformArguments } from './MEMORY_USAGE'; describe('MEMORY USAGE', () => { @@ -27,11 +27,4 @@ describe('MEMORY USAGE', () => { null ); }); - - itWithCluster(TestRedisClusters.OPEN, 'cluster.memoryUsage', async cluster => { - assert.equal( - await cluster.memoryUsage('key'), - null - ); - }); }); diff --git a/lib/commands/PFADD.ts b/lib/commands/PFADD.ts index cc99bed7f6..4328a18dfe 100644 --- a/lib/commands/PFADD.ts +++ b/lib/commands/PFADD.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments, transformReplyBoolean } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, element: string | Array): TransformArgumentsReply { +export function transformArguments(key: string, element: string | Array): RedisCommandArguments { return pushVerdictArguments(['PFADD', key], element); } diff --git a/lib/commands/PFCOUNT.ts b/lib/commands/PFCOUNT.ts index 1fe3b1ee5d..ec6c090604 100644 --- a/lib/commands/PFCOUNT.ts +++ b/lib/commands/PFCOUNT.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string | Array): TransformArgumentsReply { +export function transformArguments(key: string | Array): RedisCommandArguments { return pushVerdictArguments(['PFCOUNT'], key); } diff --git a/lib/commands/PFMERGE.ts b/lib/commands/PFMERGE.ts index 86bef6c4d7..e934062b3f 100644 --- a/lib/commands/PFMERGE.ts +++ b/lib/commands/PFMERGE.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(destination: string, source: string | Array): TransformArgumentsReply { +export function transformArguments(destination: string, source: string | Array): RedisCommandArguments { return pushVerdictArguments(['PFMERGE', destination], source); } diff --git a/lib/commands/PING.spec.ts b/lib/commands/PING.spec.ts index 87d9359a36..43b683f192 100644 --- a/lib/commands/PING.spec.ts +++ b/lib/commands/PING.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, itWithCluster, TestRedisClusters } from '../test-utils'; +import { TestRedisServers, itWithClient } from '../test-utils'; describe('PING', () => { itWithClient(TestRedisServers.OPEN, 'client.ping', async client => { @@ -8,11 +8,4 @@ describe('PING', () => { 'PONG' ); }); - - itWithCluster(TestRedisClusters.OPEN, 'cluster.ping', async cluster => { - assert.equal( - await cluster.ping(), - 'PONG' - ); - }); }); diff --git a/lib/commands/PUBSUB_CHANNELS.spec.ts b/lib/commands/PUBSUB_CHANNELS.spec.ts index 5ff9db60df..9e148bc7fd 100644 --- a/lib/commands/PUBSUB_CHANNELS.spec.ts +++ b/lib/commands/PUBSUB_CHANNELS.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster } from '../test-utils'; +import { TestRedisServers, itWithClient } from '../test-utils'; import { transformArguments } from './PUBSUB_CHANNELS'; describe('PUBSUB CHANNELS', () => { @@ -25,11 +25,4 @@ describe('PUBSUB CHANNELS', () => { [] ); }); - - itWithCluster(TestRedisClusters.OPEN, 'cluster.pubSubChannels', async cluster => { - assert.deepEqual( - await cluster.pubSubChannels(), - [] - ); - }); }); diff --git a/lib/commands/PUBSUB_NUMPAT.spec.ts b/lib/commands/PUBSUB_NUMPAT.spec.ts index 49a39eedae..55eef6a97d 100644 --- a/lib/commands/PUBSUB_NUMPAT.spec.ts +++ b/lib/commands/PUBSUB_NUMPAT.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster } from '../test-utils'; +import { TestRedisServers, itWithClient } from '../test-utils'; import { transformArguments } from './PUBSUB_NUMPAT'; describe('PUBSUB NUMPAT', () => { @@ -16,11 +16,4 @@ describe('PUBSUB NUMPAT', () => { 0 ); }); - - itWithCluster(TestRedisClusters.OPEN, 'cluster.pubSubNumPat', async cluster => { - assert.equal( - await cluster.pubSubNumPat(), - 0 - ); - }); }); diff --git a/lib/commands/PUBSUB_NUMSUB.spec.ts b/lib/commands/PUBSUB_NUMSUB.spec.ts index 403732f8f9..ef44faf2c0 100644 --- a/lib/commands/PUBSUB_NUMSUB.spec.ts +++ b/lib/commands/PUBSUB_NUMSUB.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster } from '../test-utils'; +import { TestRedisServers, itWithClient } from '../test-utils'; import { transformArguments } from './PUBSUB_NUMSUB'; describe('PUBSUB NUMSUB', () => { @@ -32,11 +32,4 @@ describe('PUBSUB NUMSUB', () => { Object.create(null) ); }); - - itWithCluster(TestRedisClusters.OPEN, 'cluster.pubSubNumSub', async cluster => { - assert.deepEqual( - await cluster.pubSubNumSub(), - Object.create(null) - ); - }); }); diff --git a/lib/commands/RPUSH.ts b/lib/commands/RPUSH.ts index 92df52f03f..575177755c 100644 --- a/lib/commands/RPUSH.ts +++ b/lib/commands/RPUSH.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, element: string | Array): TransformArgumentsReply { +export function transformArguments(key: string, element: string | Array): RedisCommandArguments { return pushVerdictArguments(['RPUSH', key], element); } diff --git a/lib/commands/RPUSHX.ts b/lib/commands/RPUSHX.ts index 14ad9dc9d5..bacc60d404 100644 --- a/lib/commands/RPUSHX.ts +++ b/lib/commands/RPUSHX.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, element: string | Array): TransformArgumentsReply { +export function transformArguments(key: string, element: string | Array): RedisCommandArguments { return pushVerdictArguments(['RPUSHX', key], element); } diff --git a/lib/commands/SADD.ts b/lib/commands/SADD.ts index 31623c435c..05e5a6858f 100644 --- a/lib/commands/SADD.ts +++ b/lib/commands/SADD.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, members: string | Array): TransformArgumentsReply { +export function transformArguments(key: string, members: string | Array): RedisCommandArguments { return pushVerdictArguments(['SADD', key], members); } diff --git a/lib/commands/SCRIPT_DEBUG.spec.ts b/lib/commands/SCRIPT_DEBUG.spec.ts index 9096605143..9d2ad1af26 100644 --- a/lib/commands/SCRIPT_DEBUG.spec.ts +++ b/lib/commands/SCRIPT_DEBUG.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster } from '../test-utils'; +import { TestRedisServers, itWithClient } from '../test-utils'; import { transformArguments } from './SCRIPT_DEBUG'; describe('SCRIPT DEBUG', () => { @@ -16,11 +16,4 @@ describe('SCRIPT DEBUG', () => { 'OK' ); }); - - itWithCluster(TestRedisClusters.OPEN, 'cluster.scriptDebug', async cluster => { - assert.equal( - await cluster.scriptDebug('NO'), - 'OK' - ); - }); }); diff --git a/lib/commands/SCRIPT_EXISTS.spec.ts b/lib/commands/SCRIPT_EXISTS.spec.ts index d03521a5c6..b23380c757 100644 --- a/lib/commands/SCRIPT_EXISTS.spec.ts +++ b/lib/commands/SCRIPT_EXISTS.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster } from '../test-utils'; +import { TestRedisServers, itWithClient } from '../test-utils'; import { transformArguments } from './SCRIPT_EXISTS'; describe('SCRIPT EXISTS', () => { @@ -25,11 +25,4 @@ describe('SCRIPT EXISTS', () => { [false] ); }); - - itWithCluster(TestRedisClusters.OPEN, 'cluster.scriptExists', async cluster => { - assert.deepEqual( - await cluster.scriptExists('sha1'), - [false] - ); - }); }); diff --git a/lib/commands/SCRIPT_EXISTS.ts b/lib/commands/SCRIPT_EXISTS.ts index 47a7f456e9..ee89f955e5 100644 --- a/lib/commands/SCRIPT_EXISTS.ts +++ b/lib/commands/SCRIPT_EXISTS.ts @@ -1,7 +1,7 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments, transformReplyBooleanArray } from './generic-transformers'; -export function transformArguments(sha1: string | Array): TransformArgumentsReply { +export function transformArguments(sha1: string | Array): RedisCommandArguments { return pushVerdictArguments(['SCRIPT', 'EXISTS'], sha1); } diff --git a/lib/commands/SCRIPT_FLUSH.spec.ts b/lib/commands/SCRIPT_FLUSH.spec.ts index c1321676eb..c77accb50a 100644 --- a/lib/commands/SCRIPT_FLUSH.spec.ts +++ b/lib/commands/SCRIPT_FLUSH.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster } from '../test-utils'; +import { TestRedisServers, itWithClient } from '../test-utils'; import { transformArguments } from './SCRIPT_FLUSH'; describe('SCRIPT FLUSH', () => { @@ -25,11 +25,4 @@ describe('SCRIPT FLUSH', () => { 'OK' ); }); - - itWithCluster(TestRedisClusters.OPEN, 'cluster.scriptFlush', async cluster => { - assert.equal( - await cluster.scriptFlush(), - 'OK' - ); - }); }); diff --git a/lib/commands/SCRIPT_LOAD.spec.ts b/lib/commands/SCRIPT_LOAD.spec.ts index 46490f35c8..1d7da3e9c2 100644 --- a/lib/commands/SCRIPT_LOAD.spec.ts +++ b/lib/commands/SCRIPT_LOAD.spec.ts @@ -1,6 +1,6 @@ import { strict as assert } from 'assert'; import { scriptSha1 } from '../lua-script'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster } from '../test-utils'; +import { TestRedisServers, itWithClient } from '../test-utils'; import { transformArguments } from './SCRIPT_LOAD'; describe('SCRIPT LOAD', () => { @@ -20,11 +20,4 @@ describe('SCRIPT LOAD', () => { SCRIPT_SHA1 ); }); - - itWithCluster(TestRedisClusters.OPEN, 'cluster.scriptLoad', async cluster => { - assert.equal( - await cluster.scriptLoad(SCRIPT), - SCRIPT_SHA1 - ); - }); }); diff --git a/lib/commands/SDIFF.ts b/lib/commands/SDIFF.ts index 134bd66ef8..7c1e4fc34a 100644 --- a/lib/commands/SDIFF.ts +++ b/lib/commands/SDIFF.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(keys: string | Array): TransformArgumentsReply { +export function transformArguments(keys: string | Array): RedisCommandArguments { return pushVerdictArguments(['SDIFF'], keys); } diff --git a/lib/commands/SDIFFSTORE.ts b/lib/commands/SDIFFSTORE.ts index 1c437087c5..9cca24beb6 100644 --- a/lib/commands/SDIFFSTORE.ts +++ b/lib/commands/SDIFFSTORE.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(destination: string, keys: string | Array): TransformArgumentsReply { +export function transformArguments(destination: string, keys: string | Array): RedisCommandArguments { return pushVerdictArguments(['SDIFFSTORE', destination], keys); } diff --git a/lib/commands/SET.ts b/lib/commands/SET.ts index 03853b3f7d..b19a1b2c5c 100644 --- a/lib/commands/SET.ts +++ b/lib/commands/SET.ts @@ -1,4 +1,4 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; export const FIRST_KEY_INDEX = 1; @@ -40,7 +40,7 @@ interface SetCommonOptions { type SetOptions = SetTTL & SetGuards & (SetCommonOptions | {}); -export function transformArguments(key: string | Buffer, value: string | Buffer, options?: SetOptions): TransformArgumentsReply { +export function transformArguments(key: string | Buffer, value: string | Buffer, options?: SetOptions): RedisCommandArguments { const args = ['SET', key, value]; if (!options) { diff --git a/lib/commands/SETBIT.ts b/lib/commands/SETBIT.ts index 7b96907dfe..7b0812a55b 100644 --- a/lib/commands/SETBIT.ts +++ b/lib/commands/SETBIT.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { BitValue } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, offset: number, value: BitValue): TransformArgumentsReply { +export function transformArguments(key: string, offset: number, value: BitValue): RedisCommandArguments { return ['SETBIT', key, offset.toString(), value.toString()]; } diff --git a/lib/commands/SETEX.ts b/lib/commands/SETEX.ts index 0d21479bdc..89c6e06a3f 100644 --- a/lib/commands/SETEX.ts +++ b/lib/commands/SETEX.ts @@ -1,8 +1,8 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string | Buffer, seconds: number, value: string): TransformArgumentsReply { +export function transformArguments(key: string | Buffer, seconds: number, value: string): RedisCommandArguments { return [ 'SETEX', key, diff --git a/lib/commands/SINTER.ts b/lib/commands/SINTER.ts index 6348bbc7ab..5d74e761f0 100644 --- a/lib/commands/SINTER.ts +++ b/lib/commands/SINTER.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(keys: string | Array): TransformArgumentsReply { +export function transformArguments(keys: string | Array): RedisCommandArguments { return pushVerdictArguments(['SINTER'], keys); } diff --git a/lib/commands/SINTERSTORE.ts b/lib/commands/SINTERSTORE.ts index 0d31c409da..40f31a8b7a 100644 --- a/lib/commands/SINTERSTORE.ts +++ b/lib/commands/SINTERSTORE.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(destination: string, keys: string | Array): TransformArgumentsReply { +export function transformArguments(destination: string, keys: string | Array): RedisCommandArguments { return pushVerdictArguments(['SINTERSTORE', destination], keys); } diff --git a/lib/commands/SREM.ts b/lib/commands/SREM.ts index 534de17054..9a37ac9bf9 100644 --- a/lib/commands/SREM.ts +++ b/lib/commands/SREM.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, members: string | Array): TransformArgumentsReply { +export function transformArguments(key: string, members: string | Array): RedisCommandArguments { return pushVerdictArguments(['SREM', key], members); } diff --git a/lib/commands/SUNION.ts b/lib/commands/SUNION.ts index 07a46e38ef..ae8b02b481 100644 --- a/lib/commands/SUNION.ts +++ b/lib/commands/SUNION.ts @@ -1,11 +1,11 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; export const IS_READ_ONLY = true; -export function transformArguments(keys: string | Array): TransformArgumentsReply { +export function transformArguments(keys: string | Array): RedisCommandArguments { return pushVerdictArguments(['SUNION'], keys); } diff --git a/lib/commands/SUNIONSTORE.ts b/lib/commands/SUNIONSTORE.ts index 8745c51643..f259769f49 100644 --- a/lib/commands/SUNIONSTORE.ts +++ b/lib/commands/SUNIONSTORE.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(destination: string, keys: string | Array): TransformArgumentsReply { +export function transformArguments(destination: string, keys: string | Array): RedisCommandArguments { return pushVerdictArguments(['SUNIONSTORE', destination], keys); } diff --git a/lib/commands/TOUCH.ts b/lib/commands/TOUCH.ts index 8632d848db..a3dc31e856 100644 --- a/lib/commands/TOUCH.ts +++ b/lib/commands/TOUCH.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string | Array): TransformArgumentsReply { +export function transformArguments(key: string | Array): RedisCommandArguments { return pushVerdictArguments(['TOUCH'], key); } diff --git a/lib/commands/UNLINK.ts b/lib/commands/UNLINK.ts index 2ff87974cf..467b4172e0 100644 --- a/lib/commands/UNLINK.ts +++ b/lib/commands/UNLINK.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string | Array): TransformArgumentsReply { +export function transformArguments(key: string | Array): RedisCommandArguments { return pushVerdictArguments(['UNLINK'], key); } diff --git a/lib/commands/UNWATCH.spec.ts b/lib/commands/UNWATCH.spec.ts index 238ffdc59b..07059310cb 100644 --- a/lib/commands/UNWATCH.spec.ts +++ b/lib/commands/UNWATCH.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster } from '../test-utils'; +import { TestRedisServers, itWithClient } from '../test-utils'; import { transformArguments } from './UNWATCH'; describe('UNWATCH', () => { @@ -16,11 +16,4 @@ describe('UNWATCH', () => { 'OK' ); }); - - itWithCluster(TestRedisClusters.OPEN, 'cluster.unwatch', async cluster => { - assert.equal( - await cluster.unwatch(), - 'OK' - ); - }); }); diff --git a/lib/commands/WATCH.ts b/lib/commands/WATCH.ts index 5ca42c0eb9..f66429b507 100644 --- a/lib/commands/WATCH.ts +++ b/lib/commands/WATCH.ts @@ -1,7 +1,7 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; -export function transformArguments(key: string | Array): TransformArgumentsReply { +export function transformArguments(key: string | Array): RedisCommandArguments { return pushVerdictArguments(['WATCH'], key); } diff --git a/lib/commands/XACK.ts b/lib/commands/XACK.ts index 4573b7f3d2..0d21a0ec08 100644 --- a/lib/commands/XACK.ts +++ b/lib/commands/XACK.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, group: string, id: string | Array): TransformArgumentsReply { +export function transformArguments(key: string, group: string, id: string | Array): RedisCommandArguments { return pushVerdictArguments(['XACK', key, group], id); } diff --git a/lib/commands/XDEL.ts b/lib/commands/XDEL.ts index 187e5b4e73..892b9a0de5 100644 --- a/lib/commands/XDEL.ts +++ b/lib/commands/XDEL.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, id: string | Array): TransformArgumentsReply { +export function transformArguments(key: string, id: string | Array): RedisCommandArguments { return pushVerdictArguments(['XDEL', key], id); } diff --git a/lib/commands/ZDIFF.ts b/lib/commands/ZDIFF.ts index 4c5b722131..a45bf01a52 100644 --- a/lib/commands/ZDIFF.ts +++ b/lib/commands/ZDIFF.ts @@ -1,11 +1,11 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArgument } from './generic-transformers'; export const FIRST_KEY_INDEX = 2; export const IS_READ_ONLY = true; -export function transformArguments(keys: Array | string): TransformArgumentsReply { +export function transformArguments(keys: Array | string): RedisCommandArguments { return pushVerdictArgument(['ZDIFF'], keys); } diff --git a/lib/commands/ZDIFFSTORE.ts b/lib/commands/ZDIFFSTORE.ts index 95c58c66b9..9c782b8a5a 100644 --- a/lib/commands/ZDIFFSTORE.ts +++ b/lib/commands/ZDIFFSTORE.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArgument } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(destination: string, keys: Array | string): TransformArgumentsReply { +export function transformArguments(destination: string, keys: Array | string): RedisCommandArguments { return pushVerdictArgument(['ZDIFFSTORE', destination], keys); } diff --git a/lib/commands/ZDIFF_WITHSCORES.ts b/lib/commands/ZDIFF_WITHSCORES.ts index 8412685336..4970756354 100644 --- a/lib/commands/ZDIFF_WITHSCORES.ts +++ b/lib/commands/ZDIFF_WITHSCORES.ts @@ -1,10 +1,10 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { transformReplySortedSetWithScores } from './generic-transformers'; import { transformArguments as transformZDiffArguments } from './ZDIFF'; export { FIRST_KEY_INDEX, IS_READ_ONLY } from './ZDIFF'; -export function transformArguments(...args: Parameters): TransformArgumentsReply { +export function transformArguments(...args: Parameters): RedisCommandArguments { return [ ...transformZDiffArguments(...args), 'WITHSCORES' diff --git a/lib/commands/ZINTER.ts b/lib/commands/ZINTER.ts index ae1b27a6c8..eee4983738 100644 --- a/lib/commands/ZINTER.ts +++ b/lib/commands/ZINTER.ts @@ -1,4 +1,4 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArgument } from './generic-transformers'; export const FIRST_KEY_INDEX = 2; @@ -10,7 +10,7 @@ interface ZInterOptions { AGGREGATE?: 'SUM' | 'MIN' | 'MAX'; } -export function transformArguments(keys: Array | string, options?: ZInterOptions): TransformArgumentsReply { +export function transformArguments(keys: Array | string, options?: ZInterOptions): RedisCommandArguments { const args = pushVerdictArgument(['ZINTER'], keys); if (options?.WEIGHTS) { diff --git a/lib/commands/ZINTERSTORE.ts b/lib/commands/ZINTERSTORE.ts index 496729a774..59a27e11c5 100644 --- a/lib/commands/ZINTERSTORE.ts +++ b/lib/commands/ZINTERSTORE.ts @@ -1,4 +1,4 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArgument } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -8,7 +8,7 @@ interface ZInterStoreOptions { AGGREGATE?: 'SUM' | 'MIN' | 'MAX'; } -export function transformArguments(destination: string, keys: Array | string, options?: ZInterStoreOptions): TransformArgumentsReply { +export function transformArguments(destination: string, keys: Array | string, options?: ZInterStoreOptions): RedisCommandArguments { const args = pushVerdictArgument(['ZINTERSTORE', destination], keys); if (options?.WEIGHTS) { diff --git a/lib/commands/ZINTER_WITHSCORES.ts b/lib/commands/ZINTER_WITHSCORES.ts index f4287d1a68..f75a506de7 100644 --- a/lib/commands/ZINTER_WITHSCORES.ts +++ b/lib/commands/ZINTER_WITHSCORES.ts @@ -1,10 +1,10 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { transformReplySortedSetWithScores } from './generic-transformers'; import { transformArguments as transformZInterArguments } from './ZINTER'; export { FIRST_KEY_INDEX, IS_READ_ONLY } from './ZINTER'; -export function transformArguments(...args: Parameters): TransformArgumentsReply { +export function transformArguments(...args: Parameters): RedisCommandArguments { return [ ...transformZInterArguments(...args), 'WITHSCORES' diff --git a/lib/commands/ZMSCORE.ts b/lib/commands/ZMSCORE.ts index 373adac3cf..2790f71231 100644 --- a/lib/commands/ZMSCORE.ts +++ b/lib/commands/ZMSCORE.ts @@ -1,11 +1,11 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments, transformReplyNumberInfinityNullArray } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; export const IS_READ_ONLY = true; -export function transformArguments(key: string, member: string | Array): TransformArgumentsReply { +export function transformArguments(key: string, member: string | Array): RedisCommandArguments { return pushVerdictArguments(['ZMSCORE', key], member); } diff --git a/lib/commands/ZRANGEBYLEX.ts b/lib/commands/ZRANGEBYLEX.ts index 5e4475800c..7e2e7613b0 100644 --- a/lib/commands/ZRANGEBYLEX.ts +++ b/lib/commands/ZRANGEBYLEX.ts @@ -1,4 +1,4 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { transformArgumentNumberInfinity } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -17,7 +17,7 @@ export function transformArguments( min: number | string, max: number | string, options?: ZRangeByLexOptions -): TransformArgumentsReply { +): RedisCommandArguments { const args = [ 'ZRANGEBYLEX', key, diff --git a/lib/commands/ZRANGEBYSCORE.ts b/lib/commands/ZRANGEBYSCORE.ts index 1932683f95..48dd8a415c 100644 --- a/lib/commands/ZRANGEBYSCORE.ts +++ b/lib/commands/ZRANGEBYSCORE.ts @@ -1,4 +1,4 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { transformArgumentNumberInfinity } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -17,7 +17,7 @@ export function transformArguments( min: number | string, max: number | string, options?: ZRangeByScoreOptions -): TransformArgumentsReply { +): RedisCommandArguments { const args = [ 'ZRANGEBYSCORE', key, diff --git a/lib/commands/ZRANGEBYSCORE_WITHSCORES.ts b/lib/commands/ZRANGEBYSCORE_WITHSCORES.ts index 050ebf5893..f6f7f993cb 100644 --- a/lib/commands/ZRANGEBYSCORE_WITHSCORES.ts +++ b/lib/commands/ZRANGEBYSCORE_WITHSCORES.ts @@ -1,4 +1,4 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { transformReplySortedSetWithScores } from './generic-transformers'; import { ZRangeByScoreOptions, transformArguments as transformZRangeByScoreArguments } from './ZRANGEBYSCORE'; @@ -9,7 +9,7 @@ export function transformArguments( min: number | string, max: number | string, options?: ZRangeByScoreOptions -): TransformArgumentsReply { +): RedisCommandArguments { return [ ...transformZRangeByScoreArguments(key, min, max, options), 'WITHSCORES' diff --git a/lib/commands/ZREM.ts b/lib/commands/ZREM.ts index 550a41e8b5..332289b3fd 100644 --- a/lib/commands/ZREM.ts +++ b/lib/commands/ZREM.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, member: string | Array): TransformArgumentsReply { +export function transformArguments(key: string, member: string | Array): RedisCommandArguments { return pushVerdictArguments(['ZREM', key], member); } diff --git a/lib/commands/ZUNION.ts b/lib/commands/ZUNION.ts index 1f0723eb02..2163978470 100644 --- a/lib/commands/ZUNION.ts +++ b/lib/commands/ZUNION.ts @@ -1,4 +1,4 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArgument } from './generic-transformers'; export const FIRST_KEY_INDEX = 2; @@ -10,7 +10,7 @@ interface ZUnionOptions { AGGREGATE?: 'SUM' | 'MIN' | 'MAX'; } -export function transformArguments(keys: Array | string, options?: ZUnionOptions): TransformArgumentsReply { +export function transformArguments(keys: Array | string, options?: ZUnionOptions): RedisCommandArguments { const args = pushVerdictArgument(['ZUNION'], keys); if (options?.WEIGHTS) { diff --git a/lib/commands/ZUNIONSTORE.ts b/lib/commands/ZUNIONSTORE.ts index d0a92b20a6..406f0430c5 100644 --- a/lib/commands/ZUNIONSTORE.ts +++ b/lib/commands/ZUNIONSTORE.ts @@ -1,4 +1,4 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArgument } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -8,7 +8,7 @@ interface ZUnionOptions { AGGREGATE?: 'SUM' | 'MIN' | 'MAX'; } -export function transformArguments(destination: string, keys: Array | string, options?: ZUnionOptions): TransformArgumentsReply { +export function transformArguments(destination: string, keys: Array | string, options?: ZUnionOptions): RedisCommandArguments { const args = pushVerdictArgument(['ZUNIONSTORE', destination], keys); if (options?.WEIGHTS) { diff --git a/lib/commands/ZUNION_WITHSCORES.ts b/lib/commands/ZUNION_WITHSCORES.ts index 2215dad974..d361fd432b 100644 --- a/lib/commands/ZUNION_WITHSCORES.ts +++ b/lib/commands/ZUNION_WITHSCORES.ts @@ -1,10 +1,10 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { transformReplySortedSetWithScores } from './generic-transformers'; import { transformArguments as transformZUnionArguments } from './ZUNION'; export { FIRST_KEY_INDEX, IS_READ_ONLY } from './ZUNION'; -export function transformArguments(...args: Parameters): TransformArgumentsReply { +export function transformArguments(...args: Parameters): RedisCommandArguments { return [ ...transformZUnionArguments(...args), 'WITHSCORES' diff --git a/lib/commands/generic-transformers.ts b/lib/commands/generic-transformers.ts index 98e6750f76..a531e86b43 100644 --- a/lib/commands/generic-transformers.ts +++ b/lib/commands/generic-transformers.ts @@ -1,4 +1,4 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; export function transformReplyBoolean(reply: number): boolean { return reply === 1; @@ -308,7 +308,7 @@ export function pushStringTuplesArguments(args: Array, tuples: StringTup return args; } -export function pushVerdictArguments(args: TransformArgumentsReply, value: string | Buffer | Array): TransformArgumentsReply { +export function pushVerdictArguments(args: RedisCommandArguments, value: string | Buffer | Array): RedisCommandArguments { if (Array.isArray(value)) { args.push(...value); } else { @@ -318,7 +318,7 @@ export function pushVerdictArguments(args: TransformArgumentsReply, value: strin return args; } -export function pushVerdictArgument(args: TransformArgumentsReply, value: string | Array): TransformArgumentsReply { +export function pushVerdictArgument(args: RedisCommandArguments, value: string | Array): RedisCommandArguments { if (typeof value === 'string') { args.push('1', value); } else { @@ -328,7 +328,7 @@ export function pushVerdictArgument(args: TransformArgumentsReply, value: string return args; } -export function pushOptionalVerdictArgument(args: TransformArgumentsReply, name: string, value: undefined | string | Array): TransformArgumentsReply { +export function pushOptionalVerdictArgument(args: RedisCommandArguments, name: string, value: undefined | string | Array): RedisCommandArguments { if (value === undefined) return args; args.push(name); diff --git a/lib/commands/index.ts b/lib/commands/index.ts index 014aff9e3a..f88d777c89 100644 --- a/lib/commands/index.ts +++ b/lib/commands/index.ts @@ -1,778 +1,18 @@ -import * as ACL_CAT from './ACL_CAT'; -import * as ACL_DELUSER from './ACL_DELUSER'; -import * as ACL_GENPASS from './ACL_GENPASS'; -import * as ACL_GETUSER from './ACL_GETUSER'; -import * as ACL_LIST from './ACL_LIST'; -import * as ACL_LOAD from './ACL_LOAD'; -import * as ACL_LOG_RESET from './ACL_LOG_RESET'; -import * as ACL_LOG from './ACL_LOG'; -import * as ACL_SAVE from './ACL_SAVE'; -import * as ACL_SETUSER from './ACL_SETUSER'; -import * as ACL_USERS from './ACL_USERS'; -import * as ACL_WHOAMI from './ACL_WHOAMI'; -import * as APPEND from './APPEND'; -import * as ASKING from './ASKING'; -import * as AUTH from './AUTH'; -import * as BGREWRITEAOF from './BGREWRITEAOF'; -import * as BGSAVE from './BGSAVE'; -import * as BITCOUNT from './BITCOUNT'; -import * as BITFIELD from './BITFIELD'; -import * as BITOP from './BITOP'; -import * as BITPOS from './BITPOS'; -import * as BLMOVE from './BLMOVE'; -import * as BLPOP from './BLPOP'; -import * as BRPOP from './BRPOP'; -import * as BRPOPLPUSH from './BRPOPLPUSH'; -import * as BZPOPMAX from './BZPOPMAX'; -import * as BZPOPMIN from './BZPOPMIN'; -import * as CLIENT_ID from './CLIENT_ID'; -import * as CLIENT_INFO from './CLIENT_INFO'; -import * as CLUSTER_ADDSLOTS from './CLUSTER_ADDSLOTS'; -import * as CLUSTER_FLUSHSLOTS from './CLUSTER_FLUSHSLOTS'; -import * as CLUSTER_INFO from './CLUSTER_INFO'; -import * as CLUSTER_NODES from './CLUSTER_NODES'; -import * as CLUSTER_MEET from './CLUSTER_MEET'; -import * as CLUSTER_RESET from './CLUSTER_RESET'; -import * as CLUSTER_SETSLOT from './CLUSTER_SETSLOT'; -import * as CLUSTER_SLOTS from './CLUSTER_SLOTS'; -import * as COMMAND_COUNT from './COMMAND_COUNT'; -import * as COMMAND_GETKEYS from './COMMAND_GETKEYS'; -import * as COMMAND_INFO from './COMMAND_INFO'; -import * as COMMAND from './COMMAND'; -import * as CONFIG_GET from './CONFIG_GET'; -import * as CONFIG_RESETASTAT from './CONFIG_RESETSTAT'; -import * as CONFIG_REWRITE from './CONFIG_REWRITE'; -import * as CONFIG_SET from './CONFIG_SET'; -import * as COPY from './COPY'; -import * as DBSIZE from './DBSIZE'; -import * as DECR from './DECR'; -import * as DECRBY from './DECRBY'; -import * as DEL from './DEL'; -import * as DISCARD from './DISCARD'; -import * as DUMP from './DUMP'; -import * as ECHO from './ECHO'; -import * as EVAL from './EVAL'; -import * as EVALSHA from './EVALSHA'; -import * as EXISTS from './EXISTS'; -import * as EXPIRE from './EXPIRE'; -import * as EXPIREAT from './EXPIREAT'; -import * as FAILOVER from './FAILOVER'; -import * as FLUSHALL from './FLUSHALL'; -import * as FLUSHDB from './FLUSHDB'; -import * as GEOADD from './GEOADD'; -import * as GEODIST from './GEODIST'; -import * as GEOHASH from './GEOHASH'; -import * as GEOPOS from './GEOPOS'; -import * as GEOSEARCH_WITH from './GEOSEARCH_WITH'; -import * as GEOSEARCH from './GEOSEARCH'; -import * as GEOSEARCHSTORE from './GEOSEARCHSTORE'; -import * as GET_BUFFER from './GET_BUFFER'; -import * as GET from './GET'; -import * as GETBIT from './GETBIT'; -import * as GETDEL from './GETDEL'; -import * as GETEX from './GETEX'; -import * as GETRANGE from './GETRANGE'; -import * as GETSET from './GETSET'; -import * as HDEL from './HDEL'; -import * as HELLO from './HELLO'; -import * as HEXISTS from './HEXISTS'; -import * as HGET from './HGET'; -import * as HGETALL from './HGETALL'; -import * as HINCRBY from './HINCRBY'; -import * as HINCRBYFLOAT from './HINCRBYFLOAT'; -import * as HKEYS from './HKEYS'; -import * as HLEN from './HLEN'; -import * as HMGET from './HMGET'; -import * as HRANDFIELD_COUNT_WITHVALUES from './HRANDFIELD_COUNT_WITHVALUES'; -import * as HRANDFIELD_COUNT from './HRANDFIELD_COUNT'; -import * as HRANDFIELD from './HRANDFIELD'; -import * as HSCAN from './HSCAN'; -import * as HSET from './HSET'; -import * as HSETNX from './HSETNX'; -import * as HSTRLEN from './HSTRLEN'; -import * as HVALS from './HVALS'; -import * as INCR from './INCR'; -import * as INCRBY from './INCRBY'; -import * as INCRBYFLOAT from './INCRBYFLOAT'; -import * as INFO from './INFO'; -import * as KEYS from './KEYS'; -import * as LASTSAVE from './LASTSAVE'; -import * as LINDEX from './LINDEX'; -import * as LINSERT from './LINSERT'; -import * as LLEN from './LLEN'; -import * as LMOVE from './LMOVE'; -import * as LOLWUT from './LOLWUT'; -import * as LPOP_COUNT from './LPOP_COUNT'; -import * as LPOP from './LPOP'; -import * as LPOS_COUNT from './LPOS_COUNT'; -import * as LPOS from './LPOS'; -import * as LPUSH from './LPUSH'; -import * as LPUSHX from './LPUSHX'; -import * as LRANGE from './LRANGE'; -import * as LREM from './LREM'; -import * as LSET from './LSET'; -import * as LTRIM from './LTRIM'; -import * as MEMOERY_DOCTOR from './MEMORY_DOCTOR'; -import * as MEMORY_MALLOC_STATS from './MEMORY_MALLOC-STATS'; -import * as MEMORY_PURGE from './MEMORY_PURGE'; -import * as MEMORY_STATS from './MEMORY_STATS'; -import * as MEMORY_USAGE from './MEMORY_USAGE'; -import * as MGET from './MGET'; -import * as MIGRATE from './MIGRATE'; -import * as MODULE_LIST from './MODULE_LIST'; -import * as MODULE_LOAD from './MODULE_LOAD'; -import * as MODULE_UNLOAD from './MODULE_UNLOAD'; -import * as MOVE from './MOVE'; -import * as MSET from './MSET'; -import * as MSETNX from './MSETNX'; -import * as PERSIST from './PERSIST'; -import * as PEXPIRE from './PEXPIRE'; -import * as PEXPIREAT from './PEXPIREAT'; -import * as PFADD from './PFADD'; -import * as PFCOUNT from './PFCOUNT'; -import * as PFMERGE from './PFMERGE'; -import * as PING from './PING'; -import * as PSETEX from './PSETEX'; -import * as PTTL from './PTTL'; -import * as PUBLISH from './PUBLISH'; -import * as PUBSUB_CHANNELS from './PUBSUB_CHANNELS'; -import * as PUBSUB_NUMPAT from './PUBSUB_NUMPAT'; -import * as PUBSUB_NUMSUB from './PUBSUB_NUMSUB'; -import * as RANDOMKEY from './RANDOMKEY'; -import * as READONLY from './READONLY'; -import * as READWRITE from './READWRITE'; -import * as RENAME from './RENAME'; -import * as RENAMENX from './RENAMENX'; -import * as REPLICAOF from './REPLICAOF'; -import * as RESTORE_ASKING from './RESTORE-ASKING'; -import * as ROLE from './ROLE'; -import * as RPOP_COUNT from './RPOP_COUNT'; -import * as RPOP from './RPOP'; -import * as RPOPLPUSH from './RPOPLPUSH'; -import * as RPUSH from './RPUSH'; -import * as RPUSHX from './RPUSHX'; -import * as SADD from './SADD'; -import * as SAVE from './SAVE'; -import * as SCAN from './SCAN'; -import * as SCARD from './SCARD'; -import * as SCRIPT_DEBUG from './SCRIPT_DEBUG'; -import * as SCRIPT_EXISTS from './SCRIPT_EXISTS'; -import * as SCRIPT_FLUSH from './SCRIPT_FLUSH'; -import * as SCRIPT_KILL from './SCRIPT_KILL'; -import * as SCRIPT_LOAD from './SCRIPT_LOAD'; -import * as SDIFF from './SDIFF'; -import * as SDIFFSTORE from './SDIFFSTORE'; -import * as SET from './SET'; -import * as SETBIT from './SETBIT'; -import * as SETEX from './SETEX'; -import * as SETNX from './SETNX'; -import * as SETRANGE from './SETRANGE'; -import * as SHUTDOWN from './SHUTDOWN'; -import * as SINTER from './SINTER'; -import * as SINTERSTORE from './SINTERSTORE'; -import * as SISMEMBER from './SISMEMBER'; -import * as SMEMBERS from './SMEMBERS'; -import * as SMISMEMBER from './SMISMEMBER'; -import * as SMOVE from './SMOVE'; -import * as SORT from './SORT'; -import * as SPOP from './SPOP'; -import * as SRANDMEMBER_COUNT from './SRANDMEMBER_COUNT'; -import * as SRANDMEMBER from './SRANDMEMBER'; -import * as SREM from './SREM'; -import * as SSCAN from './SSCAN'; -import * as STRLEN from './STRLEN'; -import * as SUNION from './SUNION'; -import * as SUNIONSTORE from './SUNIONSTORE'; -import * as SWAPDB from './SWAPDB'; -import * as TIME from './TIME'; -import * as TOUCH from './TOUCH'; -import * as TTL from './TTL'; -import * as TYPE from './TYPE'; -import * as UNLINK from './UNLINK'; -import * as UNWATCH from './UNWATCH'; -import * as WAIT from './WAIT'; -import * as WATCH from './WATCH'; -import * as XACK from './XACK'; -import * as XADD from './XADD'; -import * as XAUTOCLAIM_JUSTID from './XAUTOCLAIM_JUSTID'; -import * as XAUTOCLAIM from './XAUTOCLAIM'; -import * as XCLAIM from './XCLAIM'; -import * as XCLAIM_JUSTID from './XCLAIM_JUSTID'; -import * as XDEL from './XDEL'; -import * as XGROUP_CREATE from './XGROUP_CREATE'; -import * as XGROUP_CREATECONSUMER from './XGROUP_CREATECONSUMER'; -import * as XGROUP_DELCONSUMER from './XGROUP_DELCONSUMER'; -import * as XGROUP_DESTROY from './XGROUP_DESTROY'; -import * as XGROUP_SETID from './XGROUP_SETID'; -import * as XINFO_CONSUMERS from './XINFO_CONSUMERS'; -import * as XINFO_GROUPS from './XINFO_GROUPS'; -import * as XINFO_STREAM from './XINFO_STREAM'; -import * as XLEN from './XLEN'; -import * as XPENDING_RANGE from './XPENDING_RANGE'; -import * as XPENDING from './XPENDING'; -import * as XRANGE from './XRANGE'; -import * as XREAD from './XREAD'; -import * as XREADGROUP from './XREADGROUP'; -import * as XREVRANGE from './XREVRANGE'; -import * as XTRIM from './XTRIM'; -import * as ZADD from './ZADD'; -import * as ZCARD from './ZCARD'; -import * as ZCOUNT from './ZCOUNT'; -import * as ZDIFF_WITHSCORES from './ZDIFF_WITHSCORES'; -import * as ZDIFF from './ZDIFF'; -import * as ZDIFFSTORE from './ZDIFFSTORE'; -import * as ZINCRBY from './ZINCRBY'; -import * as ZINTER_WITHSCORES from './ZINTER_WITHSCORES'; -import * as ZINTER from './ZINTER'; -import * as ZINTERSTORE from './ZINTERSTORE'; -import * as ZLEXCOUNT from './ZLEXCOUNT'; -import * as ZMSCORE from './ZMSCORE'; -import * as ZPOPMAX_COUNT from './ZPOPMAX_COUNT'; -import * as ZPOPMAX from './ZPOPMAX'; -import * as ZPOPMIN_COUNT from './ZPOPMIN_COUNT'; -import * as ZPOPMIN from './ZPOPMIN'; -import * as ZRANDMEMBER_COUNT_WITHSCORES from './ZRANDMEMBER_COUNT_WITHSCORES'; -import * as ZRANDMEMBER_COUNT from './ZRANDMEMBER_COUNT'; -import * as ZRANDMEMBER from './ZRANDMEMBER'; -import * as ZRANGE_WITHSCORES from './ZRANGE_WITHSCORES'; -import * as ZRANGE from './ZRANGE'; -import * as ZRANGEBYLEX from './ZRANGEBYLEX'; -import * as ZRANGEBYSCORE_WITHSCORES from './ZRANGEBYSCORE_WITHSCORES'; -import * as ZRANGEBYSCORE from './ZRANGEBYSCORE'; -import * as ZRANGESTORE from './ZRANGESTORE'; -import * as ZRANK from './ZRANK'; -import * as ZREM from './ZREM'; -import * as ZREMRANGEBYLEX from './ZREMRANGEBYLEX'; -import * as ZREMRANGEBYRANK from './ZREMRANGEBYRANK'; -import * as ZREMRANGEBYSCORE from './ZREMRANGEBYSCORE'; -import * as ZREVRANK from './ZREVRANK'; -import * as ZSCAN from './ZSCAN'; -import * as ZSCORE from './ZSCORE'; -import * as ZUNION_WITHSCORES from './ZUNION_WITHSCORES'; -import * as ZUNION from './ZUNION'; -import * as ZUNIONSTORE from './ZUNIONSTORE'; +import { RedisScriptConfig, SHA1 } from '../lua-script'; -export default { - ACL_CAT, - aclCat: ACL_CAT, - ACL_DELUSER, - aclDelUser: ACL_DELUSER, - ACL_GENPASS, - aclGenPass: ACL_GENPASS, - ACL_GETUSER, - aclGetUser: ACL_GETUSER, - ACL_LIST, - aclList: ACL_LIST, - ACL_LOAD, - aclLoad: ACL_LOAD, - ACL_LOG_RESET, - aclLogReset: ACL_LOG_RESET, - ACL_LOG, - aclLog: ACL_LOG, - ACL_SAVE, - aclSave: ACL_SAVE, - ACL_SETUSER, - aclSetUser: ACL_SETUSER, - ACL_USERS, - aclUsers: ACL_USERS, - ACL_WHOAMI, - aclWhoAmI: ACL_WHOAMI, - APPEND, - append: APPEND, - ASKING, - asking: ASKING, - AUTH, - auth: AUTH, - BGREWRITEAOF, - bgRewriteAof: BGREWRITEAOF, - BGSAVE, - bgSave: BGSAVE, - BITCOUNT, - bitCount: BITCOUNT, - BITFIELD, - bitField: BITFIELD, - BITOP, - bitOp: BITOP, - BITPOS, - bitPos: BITPOS, - BLMOVE, - blMove: BLMOVE, - BLPOP, - blPop: BLPOP, - BRPOP, - brPop: BRPOP, - BRPOPLPUSH, - brPopLPush: BRPOPLPUSH, - BZPOPMAX, - bzPopMax: BZPOPMAX, - BZPOPMIN, - bzPopMin: BZPOPMIN, - CLIENT_ID, - clientId: CLIENT_ID, - CLIENT_INFO, - clientInfo: CLIENT_INFO, - CLUSTER_ADDSLOTS, - clusterAddSlots: CLUSTER_ADDSLOTS, - CLUSTER_FLUSHSLOTS, - clusterFlushSlots: CLUSTER_FLUSHSLOTS, - CLUSTER_INFO, - clusterInfo: CLUSTER_INFO, - CLUSTER_NODES, - clusterNodes: CLUSTER_NODES, - CLUSTER_MEET, - clusterMeet: CLUSTER_MEET, - CLUSTER_RESET, - clusterReset: CLUSTER_RESET, - CLUSTER_SETSLOT, - clusterSetSlot: CLUSTER_SETSLOT, - CLUSTER_SLOTS, - clusterSlots: CLUSTER_SLOTS, - COMMAND_COUNT, - commandCount: COMMAND_COUNT, - COMMAND_GETKEYS, - commandGetKeys: COMMAND_GETKEYS, - COMMAND_INFO, - commandInfo: COMMAND_INFO, - COMMAND, - command: COMMAND, - CONFIG_GET, - configGet: CONFIG_GET, - CONFIG_RESETASTAT, - configResetStat: CONFIG_RESETASTAT, - CONFIG_REWRITE, - configRewrite: CONFIG_REWRITE, - CONFIG_SET, - configSet: CONFIG_SET, - COPY, - copy: COPY, - DBSIZE, - dbSize: DBSIZE, - DECR, - decr: DECR, - DECRBY, - decrBy: DECRBY, - DEL, - del: DEL, - DISCARD, - discard: DISCARD, - DUMP, - dump: DUMP, - ECHO, - echo: ECHO, - EVAL, - eval: EVAL, - EVALSHA, - evalSha: EVALSHA, - EXISTS, - exists: EXISTS, - EXPIRE, - expire: EXPIRE, - EXPIREAT, - expireAt: EXPIREAT, - FAILOVER, - failover: FAILOVER, - FLUSHALL, - flushAll: FLUSHALL, - FLUSHDB, - flushDb: FLUSHDB, - GEOADD, - geoAdd: GEOADD, - GEODIST, - geoDist: GEODIST, - GEOHASH, - geoHash: GEOHASH, - GEOPOS, - geoPos: GEOPOS, - GEOSEARCH_WITH, - geoSearchWith: GEOSEARCH_WITH, - GEOSEARCH, - geoSearch: GEOSEARCH, - GEOSEARCHSTORE, - geoSearchStore: GEOSEARCHSTORE, - GET_BUFFER, - getBuffer: GET_BUFFER, - GET, - get: GET, - GETBIT, - getBit: GETBIT, - GETDEL, - getDel: GETDEL, - GETEX, - getEx: GETEX, - GETRANGE, - getRange: GETRANGE, - GETSET, - getSet: GETSET, - HDEL, - hDel: HDEL, - HELLO, - hello: HELLO, - HEXISTS, - hExists: HEXISTS, - HGET, - hGet: HGET, - HGETALL, - hGetAll: HGETALL, - HINCRBY, - hIncrBy: HINCRBY, - HINCRBYFLOAT, - hIncrByFloat: HINCRBYFLOAT, - HKEYS, - hKeys: HKEYS, - HLEN, - hLen: HLEN, - HMGET, - hmGet: HMGET, - HRANDFIELD_COUNT_WITHVALUES, - hRandFieldCountWithValues: HRANDFIELD_COUNT_WITHVALUES, - HRANDFIELD_COUNT, - hRandFieldCount: HRANDFIELD_COUNT, - HRANDFIELD, - hRandField: HRANDFIELD, - HSCAN, - hScan: HSCAN, - HSET, - hSet: HSET, - HSETNX, - hSetNX: HSETNX, - HSTRLEN, - hStrLen: HSTRLEN, - HVALS, - hVals: HVALS, - INCR, - incr: INCR, - INCRBY, - incrBy: INCRBY, - INCRBYFLOAT, - incrByFloat: INCRBYFLOAT, - INFO, - info: INFO, - KEYS, - keys: KEYS, - LASTSAVE, - lastSave: LASTSAVE, - LINDEX, - lIndex: LINDEX, - LINSERT, - lInsert: LINSERT, - LLEN, - lLen: LLEN, - LMOVE, - lMove: LMOVE, - LOLWUT, - LPOP_COUNT, - lPopCount: LPOP_COUNT, - LPOP, - lPop: LPOP, - LPOS_COUNT, - lPosCount: LPOS_COUNT, - LPOS, - lPos: LPOS, - LPUSH, - lPush: LPUSH, - LPUSHX, - lPushX: LPUSHX, - LRANGE, - lRange: LRANGE, - LREM, - lRem: LREM, - LSET, - lSet: LSET, - LTRIM, - lTrim: LTRIM, - MEMOERY_DOCTOR, - memoryDoctor: MEMOERY_DOCTOR, - 'MEMORY_MALLOC-STATS': MEMORY_MALLOC_STATS, - memoryMallocStats: MEMORY_MALLOC_STATS, - MEMORY_PURGE, - memoryPurge: MEMORY_PURGE, - MEMORY_STATS, - memoryStats: MEMORY_STATS, - MEMORY_USAGE, - memoryUsage: MEMORY_USAGE, - MGET, - mGet: MGET, - MIGRATE, - migrate: MIGRATE, - MODULE_LIST, - moduleList: MODULE_LIST, - MODULE_LOAD, - moduleLoad: MODULE_LOAD, - MODULE_UNLOAD, - moduleUnload: MODULE_UNLOAD, - MOVE, - move: MOVE, - MSET, - mSet: MSET, - MSETNX, - mSetNX: MSETNX, - PERSIST, - persist: PERSIST, - PEXPIRE, - pExpire: PEXPIRE, - PEXPIREAT, - pExpireAt: PEXPIREAT, - PFADD, - pfAdd: PFADD, - PFCOUNT, - pfCount: PFCOUNT, - PFMERGE, - pfMerge: PFMERGE, - PING, - ping: PING, - PSETEX, - pSetEx: PSETEX, - PTTL, - pTTL: PTTL, - PUBLISH, - publish: PUBLISH, - PUBSUB_CHANNELS, - pubSubChannels: PUBSUB_CHANNELS, - PUBSUB_NUMPAT, - pubSubNumPat: PUBSUB_NUMPAT, - PUBSUB_NUMSUB, - pubSubNumSub: PUBSUB_NUMSUB, - RANDOMKEY, - randomKey: RANDOMKEY, - READONLY, - readonly: READONLY, - READWRITE, - readwrite: READWRITE, - RENAME, - rename: RENAME, - RENAMENX, - renameNX: RENAMENX, - REPLICAOF, - replicaOf: REPLICAOF, - 'RESTORE-ASKING': RESTORE_ASKING, - restoreAsking: RESTORE_ASKING, - ROLE, - role: ROLE, - RPOP_COUNT, - rPopCount: RPOP_COUNT, - RPOP, - rPop: RPOP, - RPOPLPUSH, - rPopLPush: RPOPLPUSH, - RPUSH, - rPush: RPUSH, - RPUSHX, - rPushX: RPUSHX, - SADD, - sAdd: SADD, - SAVE, - save: SAVE, - SCAN, - scan: SCAN, - SCARD, - sCard: SCARD, - SCRIPT_DEBUG, - scriptDebug: SCRIPT_DEBUG, - SCRIPT_EXISTS, - scriptExists: SCRIPT_EXISTS, - SCRIPT_FLUSH, - scriptFlush: SCRIPT_FLUSH, - SCRIPT_KILL, - scriptKill: SCRIPT_KILL, - SCRIPT_LOAD, - scriptLoad: SCRIPT_LOAD, - SDIFF, - sDiff: SDIFF, - SDIFFSTORE, - sDiffStore: SDIFFSTORE, - SINTER, - sInter: SINTER, - SINTERSTORE, - sInterStore: SINTERSTORE, - SET, - set: SET, - SETBIT, - setBit: SETBIT, - SETEX, - setEx: SETEX, - SETNX, - setNX: SETNX, - SETRANGE, - setRange: SETRANGE, - SHUTDOWN, - shutdown: SHUTDOWN, - SISMEMBER, - sIsMember: SISMEMBER, - SMEMBERS, - sMembers: SMEMBERS, - SMISMEMBER, - smIsMember: SMISMEMBER, - SMOVE, - sMove: SMOVE, - SORT, - sort: SORT, - SPOP, - sPop: SPOP, - SRANDMEMBER_COUNT, - sRandMemberCount: SRANDMEMBER_COUNT, - SRANDMEMBER, - sRandMember: SRANDMEMBER, - SREM, - sRem: SREM, - SSCAN, - sScan: SSCAN, - STRLEN, - strLen: STRLEN, - SUNION, - sUnion: SUNION, - SUNIONSTORE, - sUnionStore: SUNIONSTORE, - SWAPDB, - swapDb: SWAPDB, - TIME, - time: TIME, - TOUCH, - touch: TOUCH, - TTL, - ttl: TTL, - TYPE, - type: TYPE, - UNLINK, - unlink: UNLINK, - UNWATCH, - unwatch: UNWATCH, - WAIT, - wait: WAIT, - WATCH, - watch: WATCH, - XACK, - xAck: XACK, - XADD, - xAdd: XADD, - XAUTOCLAIM_JUSTID, - xAutoClaimJustId: XAUTOCLAIM_JUSTID, - XAUTOCLAIM, - xAutoClaim: XAUTOCLAIM, - XCLAIM, - xClaim: XCLAIM, - XCLAIM_JUSTID, - xClaimJustId: XCLAIM_JUSTID, - XDEL, - xDel: XDEL, - XGROUP_CREATE, - xGroupCreate: XGROUP_CREATE, - XGROUP_CREATECONSUMER, - xGroupCreateConsumer: XGROUP_CREATECONSUMER, - XGROUP_DELCONSUMER, - xGroupDelConsumer: XGROUP_DELCONSUMER, - XGROUP_DESTROY, - xGroupDestroy: XGROUP_DESTROY, - XGROUP_SETID, - xGroupSetId: XGROUP_SETID, - XINFO_CONSUMERS, - xInfoConsumers: XINFO_CONSUMERS, - XINFO_GROUPS, - xInfoGroups: XINFO_GROUPS, - XINFO_STREAM, - xInfoStream: XINFO_STREAM, - XLEN, - xLen: XLEN, - XPENDING_RANGE, - xPendingRange: XPENDING_RANGE, - XPENDING, - xPending: XPENDING, - XRANGE, - xRange: XRANGE, - XREAD, - xRead: XREAD, - XREADGROUP, - xReadGroup: XREADGROUP, - XREVRANGE, - xRevRange: XREVRANGE, - XTRIM, - xTrim: XTRIM, - ZADD, - zAdd: ZADD, - ZCARD, - zCard: ZCARD, - ZCOUNT, - zCount: ZCOUNT, - ZDIFF_WITHSCORES, - zDiffWithScores: ZDIFF_WITHSCORES, - ZDIFF, - zDiff: ZDIFF, - ZDIFFSTORE, - zDiffStore: ZDIFFSTORE, - ZINCRBY, - zIncrBy: ZINCRBY, - ZINTER_WITHSCORES, - zInterWithScores: ZINTER_WITHSCORES, - ZINTER, - zInter: ZINTER, - ZINTERSTORE, - zInterStore: ZINTERSTORE, - ZLEXCOUNT, - zLexCount: ZLEXCOUNT, - ZMSCORE, - zmScore: ZMSCORE, - ZPOPMAX_COUNT, - zPopMaxCount: ZPOPMAX_COUNT, - ZPOPMAX, - zPopMax: ZPOPMAX, - ZPOPMIN_COUNT, - zPopMinCount: ZPOPMIN_COUNT, - ZPOPMIN, - zPopMin: ZPOPMIN, - ZRANDMEMBER_COUNT_WITHSCORES, - zRandMemberCountWithScores: ZRANDMEMBER_COUNT_WITHSCORES, - ZRANDMEMBER_COUNT, - zRandMemberCount: ZRANDMEMBER_COUNT, - ZRANDMEMBER, - zRandMember: ZRANDMEMBER, - ZRANGE_WITHSCORES, - zRangeWithScores: ZRANGE_WITHSCORES, - ZRANGE, - zRange: ZRANGE, - ZRANGEBYLEX, - zRangeByLex: ZRANGEBYLEX, - ZRANGEBYSCORE_WITHSCORES, - zRangeByScoreWithScores: ZRANGEBYSCORE_WITHSCORES, - ZRANGEBYSCORE, - zRangeByScore: ZRANGEBYSCORE, - ZRANGESTORE, - zRangeStore: ZRANGESTORE, - ZRANK, - zRank: ZRANK, - ZREM, - zRem: ZREM, - ZREMRANGEBYLEX, - zRemRangeByLex: ZREMRANGEBYLEX, - ZREMRANGEBYRANK, - zRemRangeByRank: ZREMRANGEBYRANK, - ZREMRANGEBYSCORE, - zRemRangeByScore: ZREMRANGEBYSCORE, - ZREVRANK, - zRevRank: ZREVRANK, - ZSCAN, - zScan: ZSCAN, - ZSCORE, - zScore: ZSCORE, - ZUNION_WITHSCORES, - zUnionWithScores: ZUNION_WITHSCORES, - ZUNION, - zUnion: ZUNION, - ZUNIONSTORE, - zUnionStore: ZUNIONSTORE -}; +export type RedisCommandRawReply = string | number | Buffer | Array | null | undefined; -export type RedisReply = string | number | Buffer | Array | null | undefined; - -export type TransformArgumentsReply = Array & { preserve?: unknown }; +export type RedisCommandArguments = Array & { preserve?: unknown }; export interface RedisCommand { FIRST_KEY_INDEX?: number | ((...args: Array) => string); IS_READ_ONLY?: boolean; - transformArguments(this: void, ...args: Array): TransformArgumentsReply; + transformArguments(this: void, ...args: Array): RedisCommandArguments; BUFFER_MODE?: boolean; - transformReply?(this: void, reply: RedisReply, preserved?: unknown): any; + transformReply?(this: void, reply: RedisCommandRawReply, preserved?: unknown): any; } -export type RedisCommandReply = C['transformReply'] extends (...args: any) => infer T ? T : RedisReply; +export type RedisCommandReply = C['transformReply'] extends (...args: any) => infer T ? T : RedisCommandRawReply; export interface RedisCommands { [command: string]: RedisCommand; @@ -785,4 +25,14 @@ export interface RedisModule { export interface RedisModules { [module: string]: RedisModule; } -// export type RedisModules = Record; + +export type RedisScript = RedisScriptConfig & SHA1; + +export interface RedisScripts { + [script: string]: RedisScript; +} + +export interface RedisPlugins { + modules?: M; + scripts?: S; +} diff --git a/lib/lua-script.ts b/lib/lua-script.ts index be16f9b913..3089d468d6 100644 --- a/lib/lua-script.ts +++ b/lib/lua-script.ts @@ -1,7 +1,7 @@ import { createHash } from 'crypto'; import { RedisCommand } from './commands'; -export interface RedisLuaScriptConfig extends RedisCommand { +export interface RedisScriptConfig extends RedisCommand { SCRIPT: string; NUMBER_OF_KEYS: number; } @@ -10,13 +10,7 @@ export interface SHA1 { SHA1: string; } -export type RedisLuaScript = RedisLuaScriptConfig & SHA1; - -export interface RedisLuaScripts { - [script: string]: RedisLuaScript; -} - -export function defineScript(script: RedisLuaScriptConfig): typeof script & SHA1 { +export function defineScript(script: RedisScriptConfig): typeof script & SHA1 { return { ...script, SHA1: scriptSha1(script.SCRIPT) diff --git a/lib/multi-command.spec.ts b/lib/multi-command.spec.ts index 52ecfb94b1..7e9667cd51 100644 --- a/lib/multi-command.spec.ts +++ b/lib/multi-command.spec.ts @@ -1,126 +1,97 @@ import { strict as assert } from 'assert'; import RedisMultiCommand from './multi-command'; import { WatchError } from './errors'; -import { spy } from 'sinon'; -import { SQUARE_SCRIPT } from './client.spec'; +import { SQUARE_SCRIPT } from './client/index.spec'; describe('Multi Command', () => { + it('generateChainId', () => { + assert.equal( + typeof RedisMultiCommand.generateChainId(), + 'symbol' + ); + }); + + it('addCommand', () => { + const multi = new RedisMultiCommand(); + multi.addCommand(['PING']); + + assert.deepEqual( + multi.queue[0].args, + ['PING'] + ); + }); + + it('addScript', () => { + const multi = new RedisMultiCommand(); + + multi.addScript(SQUARE_SCRIPT, ['1']); + assert.equal( + multi.scriptsInUse.has(SQUARE_SCRIPT.SHA1), + true + ); + assert.deepEqual( + multi.queue[0].args, + ['EVAL', SQUARE_SCRIPT.SCRIPT, '0', '1'] + ); + + multi.addScript(SQUARE_SCRIPT, ['2']); + assert.equal( + multi.scriptsInUse.has(SQUARE_SCRIPT.SHA1), + true + ); + assert.deepEqual( + multi.queue[1].args, + ['EVALSHA', SQUARE_SCRIPT.SHA1, '0', '2'] + ); + }); + describe('exec', () => { - it('simple', async () => { - const multi = RedisMultiCommand.create((queue, symbol) => { - assert.deepEqual( - queue.map(({ args }) => args), - [ - ['MULTI'], - ['PING'], - ['EXEC'], - ] - ); - - assert.equal( - typeof symbol, - 'symbol' - ); - - return Promise.resolve(['QUEUED', 'QUEUED', ['PONG']]); - }); - - multi.ping(); - - assert.deepEqual( - await multi.exec(), - ['PONG'] + it('undefined', () => { + assert.equal( + new RedisMultiCommand().exec(), + undefined ); }); - it('executing an empty queue should resolve without executing on the server', async () => { - const executor = spy(); + it('Array', () => { + const multi = new RedisMultiCommand(); + multi.addCommand(['PING']); assert.deepEqual( - await RedisMultiCommand.create(executor).exec(), - [] + multi.exec(), + [ + { args: ['MULTI'] }, + { args: ['PING'], transformReply: undefined }, + { args: ['EXEC'] } + ] ); - - assert.ok(executor.notCalled); }); + }); + describe('handleExecReplies', () => { it('WatchError', () => { - return assert.rejects( - RedisMultiCommand.create(() => Promise.resolve([null])).ping().exec(), + assert.throws( + () => new RedisMultiCommand().handleExecReplies([null]), WatchError ); }); - it('execAsPipeline', async () => { - const multi = RedisMultiCommand.create(queue => { - assert.deepEqual( - queue.map(({ args }) => args), - [['PING']] - ); - - return Promise.resolve(['PONG']); - }); - - multi.ping(); - + it('with replies', () => { + const multi = new RedisMultiCommand(); + multi.addCommand(['PING']); assert.deepEqual( - await multi.exec(true), + multi.handleExecReplies(['OK', 'QUEUED', ['PONG']]), ['PONG'] ); }); }); - describe('execAsPipeline', () => { - it('simple', async () => { - const multi = RedisMultiCommand.create(queue => { - assert.deepEqual( - queue.map(({ args }) => args), - [['PING']] - ); - - return Promise.resolve(['PONG']); - }); - - multi.ping(); - - assert.deepEqual( - await multi.execAsPipeline(), - ['PONG'] - ); - }); - - it('executing an empty queue should resolve without executing on the server', async () => { - const executor = spy(); - - assert.deepEqual( - await RedisMultiCommand.create(executor).execAsPipeline(), - [] - ); - - assert.ok(executor.notCalled); - }); - - it('with scripts', async () => { - const MultiWithScript = RedisMultiCommand.extend({ - scripts: { - square: SQUARE_SCRIPT - } - }); - - assert.deepEqual( - await new MultiWithScript(queue => { - assert.deepEqual( - queue.map(({ args }) => args), - [ - ['EVAL', SQUARE_SCRIPT.SCRIPT, '0', '2'], - ['EVALSHA', SQUARE_SCRIPT.SHA1, '0', '3'], - ] - ); - - return Promise.resolve([4, 9]); - }).square(2).square(3).execAsPipeline(), - [4, 9] - ); - }); + it('transformReplies', () => { + const multi = new RedisMultiCommand(); + multi.addCommand(['PING'], (reply: string) => reply.substring(0, 2)); + assert.deepEqual( + multi.transformReplies(['PONG']), + ['PO'] + ); }); }); diff --git a/lib/multi-command.ts b/lib/multi-command.ts index a329a5dbf1..d66974a5a2 100644 --- a/lib/multi-command.ts +++ b/lib/multi-command.ts @@ -1,135 +1,36 @@ -import COMMANDS, { TransformArgumentsReply } from './commands'; -import { RedisCommand, RedisModules, RedisReply } from './commands'; -import { RedisLuaScript, RedisLuaScripts } from './lua-script'; -import { RedisClientOptions } from './client'; -import { extendWithModulesAndScripts, extendWithDefaultCommands } from './commander'; +import { RedisCommand, RedisCommandArguments, RedisCommandRawReply, RedisScript } from './commands'; import { WatchError } from './errors'; -type RedisMultiCommandSignature = (...args: Parameters) => RedisMultiCommandType; - -type WithCommands = { - [P in keyof typeof COMMANDS]: RedisMultiCommandSignature<(typeof COMMANDS)[P], M, S> -}; - -type WithModules = { - [P in keyof M]: { - [C in keyof M[P]]: RedisMultiCommandSignature; - }; -}; - -type WithScripts = { - [P in keyof S]: RedisMultiCommandSignature -}; - -export type RedisMultiCommandType = - RedisMultiCommand & WithCommands & WithModules & WithScripts; - -export interface MultiQueuedCommand { - args: TransformArgumentsReply; - preservedArguments?: unknown; +export interface RedisMultiQueuedCommand { + args: RedisCommandArguments; transformReply?: RedisCommand['transformReply']; } -export type RedisMultiExecutor = (queue: Array, chainId?: symbol) => Promise>; +export default class RedisMultiCommand { + static generateChainId(): symbol { + return Symbol('RedisMultiCommand Chain Id'); + } -export default class RedisMultiCommand { - static extend( - clientOptions?: RedisClientOptions - ): new (...args: ConstructorParameters) => RedisMultiCommandType { - return extendWithModulesAndScripts({ - BaseClass: RedisMultiCommand, - modules: clientOptions?.modules, - modulesCommandsExecutor: RedisMultiCommand.prototype.commandsExecutor, - scripts: clientOptions?.scripts, - scriptsExecutor: RedisMultiCommand.prototype.scriptsExecutor + readonly queue: Array = []; + + readonly scriptsInUse = new Set(); + + addCommand(args: RedisCommandArguments, transformReply?: RedisCommand['transformReply']): void { + this.queue.push({ + args, + transformReply }); } - static create( - executor: RedisMultiExecutor, - clientOptions?: RedisClientOptions - ): RedisMultiCommandType { - return new this(executor, clientOptions); - } - - readonly #executor: RedisMultiExecutor; - - readonly #clientOptions: RedisClientOptions | undefined; - - readonly #queue: Array = []; - - readonly #scriptsInUse = new Set(); - - readonly #v4: Record = {}; - - get v4(): Record { - if (!this.#clientOptions?.legacyMode) { - throw new Error('client is not in "legacy mode"'); - } - - return this.#v4; - } - - constructor(executor: RedisMultiExecutor, clientOptions?: RedisClientOptions) { - this.#executor = executor; - this.#clientOptions = clientOptions; - this.#legacyMode(); - } - - #legacyMode(): void { - if (!this.#clientOptions?.legacyMode) return; - - this.#v4.addCommand = this.addCommand.bind(this); - (this as any).addCommand = (...args: Array): this => { - this.#queue.push({ - args: args.flat() as Array - }); - return this; - } - this.#v4.exec = this.exec.bind(this); - (this as any).exec = (callback?: (err: Error | null, replies?: Array) => unknown): void => { - this.#v4.exec() - .then((reply: Array) => { - if (!callback) return; - - callback(null, reply); - }) - .catch((err: Error) => { - if (!callback) { - // this.emit('error', err); - return; - } - - callback(err); - }); - }; - - for (const name of Object.keys(COMMANDS)) { - this.#defineLegacyCommand(name); - } - } - - #defineLegacyCommand(name: string): void { - (this as any).#v4[name] = (this as any)[name].bind(this.#v4); - (this as any)[name] = (...args: Array): void => (this as any).addCommand(name, args); - } - - commandsExecutor(command: RedisCommand, args: Array): this { - return this.addCommand( - command.transformArguments(...args), - command.transformReply - ); - } - - scriptsExecutor(script: RedisLuaScript, args: Array): this { - const transformedArguments: TransformArgumentsReply = []; - if (this.#scriptsInUse.has(script.SHA1)) { + addScript(script: RedisScript, args: Array): RedisCommandArguments { + const transformedArguments: RedisCommandArguments = []; + if (this.scriptsInUse.has(script.SHA1)) { transformedArguments.push( 'EVALSHA', script.SHA1 ); } else { - this.#scriptsInUse.add(script.SHA1); + this.scriptsInUse.add(script.SHA1); transformedArguments.push( 'EVAL', script.SCRIPT @@ -144,62 +45,39 @@ export default class RedisMultiCommand> { - if (execAsPipeline) { - return this.execAsPipeline(); - } else if (!this.#queue.length) { - return []; + exec(): undefined | Array { + if (!this.queue.length) { + return; } - const queue = this.#queue.splice(0), - rawReplies = await this.#executor([ - { args: ['MULTI'] }, - ...queue, - { args: ['EXEC'] } - ], Symbol('[RedisMultiCommand] Chain ID')), - execReply = rawReplies[rawReplies.length - 1] as (null | Array); + return [ + { args: ['MULTI'] }, + ...this.queue, + { args: ['EXEC'] } + ]; + } + handleExecReplies(rawReplies: Array): Array { + const execReply = rawReplies[rawReplies.length - 1] as (null | Array); if (execReply === null) { throw new WatchError(); } - return this.#transformReplies(execReply, queue); + return this.transformReplies(execReply); } - async execAsPipeline(): Promise> { - if (!this.#queue.length) { - return []; - } - - const queue = this.#queue.splice(0); - return this.#transformReplies( - await this.#executor(queue), - queue - ); - } - - #transformReplies(rawReplies: Array, queue: Array): Array { + transformReplies(rawReplies: Array): Array { return rawReplies.map((reply, i) => { - const { transformReply, preservedArguments } = queue[i]; - return transformReply ? transformReply(reply, preservedArguments) : reply; + const { transformReply, args } = this.queue[i]; + return transformReply ? transformReply(reply, args.preserve) : reply; }); } } - -extendWithDefaultCommands(RedisMultiCommand, RedisMultiCommand.prototype.commandsExecutor); diff --git a/lib/test-utils.ts b/lib/test-utils.ts index bc3c051460..978940ff93 100644 --- a/lib/test-utils.ts +++ b/lib/test-utils.ts @@ -2,15 +2,13 @@ import { strict as assert } from 'assert'; import RedisClient, { RedisClientOptions, RedisClientType } from './client'; import { execSync, spawn } from 'child_process'; import { once } from 'events'; -import { RedisSocketOptions } from './socket'; import which from 'which'; import { SinonSpy } from 'sinon'; import RedisCluster, { RedisClusterOptions, RedisClusterType } from './cluster'; import { promises as fs } from 'fs'; import { Context as MochaContext } from 'mocha'; import { promiseTimeout } from './utils'; -import { RedisModules } from './commands'; -import { RedisLuaScripts } from './lua-script'; +import { RedisModules, RedisScripts } from './commands'; type RedisVersion = [major: number, minor: number, patch: number]; @@ -54,13 +52,13 @@ export enum TestRedisServers { PASSWORD } -export const TEST_REDIS_SERVERS: Record> = {}; +export const TEST_REDIS_SERVERS: Record> = {}; export enum TestRedisClusters { OPEN } -export const TEST_REDIS_CLUSTERES: Record> = {}; +export const TEST_REDIS_CLUSTERES: Record> = {}; let port = 6379; diff --git a/package-lock.json b/package-lock.json index bb840cc6dd..6a7fa380af 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,20 +16,21 @@ }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@tsconfig/node12": "^1.0.9", "@types/mocha": "^9.0.0", - "@types/node": "^16.9.6", - "@types/sinon": "^10.0.3", + "@types/node": "^16.10.3", + "@types/sinon": "^10.0.4", "@types/which": "^2.0.1", "@types/yallist": "^4.0.1", - "mocha": "^9.1.1", + "mocha": "^9.1.2", "nyc": "^15.1.0", "release-it": "^14.11.6", "sinon": "^11.1.2", "source-map-support": "^0.5.20", - "ts-node": "^10.2.1", - "typedoc": "0.21.9", - "typedoc-github-wiki-theme": "^0.5.1", - "typedoc-plugin-markdown": "3.10.4", + "ts-node": "^10.3.0", + "typedoc": "^0.22.5", + "typedoc-github-wiki-theme": "^0.6.0", + "typedoc-plugin-markdown": "^3.11.3", "typescript": "^4.4.3", "which": "^2.0.2" }, @@ -38,9 +39,9 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", + "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", "dev": true, "dependencies": { "@babel/highlight": "^7.14.5" @@ -59,20 +60,20 @@ } }, "node_modules/@babel/core": { - "version": "7.15.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.5.tgz", - "integrity": "sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.8.tgz", + "integrity": "sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.4", + "@babel/code-frame": "^7.15.8", + "@babel/generator": "^7.15.8", "@babel/helper-compilation-targets": "^7.15.4", - "@babel/helper-module-transforms": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.8", "@babel/helpers": "^7.15.4", - "@babel/parser": "^7.15.5", + "@babel/parser": "^7.15.8", "@babel/template": "^7.15.4", "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4", + "@babel/types": "^7.15.6", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -89,12 +90,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.4.tgz", - "integrity": "sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.8.tgz", + "integrity": "sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g==", "dev": true, "dependencies": { - "@babel/types": "^7.15.4", + "@babel/types": "^7.15.6", "jsesc": "^2.5.1", "source-map": "^0.5.0" }, @@ -183,9 +184,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.7.tgz", - "integrity": "sha512-ZNqjjQG/AuFfekFTY+7nY4RgBSklgTu970c7Rj3m/JOhIu5KPBUuTA9AY6zaKcUvk4g6EbDXdBnhi35FAssdSw==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz", + "integrity": "sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg==", "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.15.4", @@ -370,9 +371,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.7.tgz", - "integrity": "sha512-rycZXvQ+xS9QyIcJ9HXeDWf1uxqlbVFAUq0Rq0dbc50Zb/+wUe/ehyfzGfm9KZZF0kBejYgxltBXocP+gKdL2g==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.8.tgz", + "integrity": "sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -438,9 +439,9 @@ } }, "node_modules/@cspotcode/source-map-support": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.6.1.tgz", - "integrity": "sha512-DX3Z+T5dt1ockmPdobJS/FAsQPW4V4SrWEhD2iYQT2Cb2tQsiMnYxrcUH9By/Z3B+v0S5LMBkQtV/XOBbpLEOg==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", + "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", "dev": true, "dependencies": { "@cspotcode/source-map-consumer": "0.8.0" @@ -653,18 +654,18 @@ } }, "node_modules/@octokit/openapi-types": { - "version": "10.6.1", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-10.6.1.tgz", - "integrity": "sha512-53YKy8w8+sHQhUONhTiYt6MqNqPolejYr6rK/3VOevpORAIYGQEX2pmXnnhgdSsjHy176e5ZBgVt0ppOGziS7g==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-11.2.0.tgz", + "integrity": "sha512-PBsVO+15KSlGmiI8QAzaqvsNlZlrDlyAJYcrXBCvVUxCp7VnXjkwPoFHgjEJXx3WF9BAwkA6nfCUA7i9sODzKA==", "dev": true }, "node_modules/@octokit/plugin-paginate-rest": { - "version": "2.16.5", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.16.5.tgz", - "integrity": "sha512-2PfRGymdBypqRes4Xelu0BAZZRCV/Qg0xgo8UB10UKoghCM+zg640+T5WkRsRD0edwfLBPP3VsJgDyDTG4EIYg==", + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.17.0.tgz", + "integrity": "sha512-tzMbrbnam2Mt4AhuyCHvpRkS0oZ5MvwwcQPYGtMv4tUa5kkzG58SVB0fcsLulOZQeRnOgdkZWkRUiyBlh0Bkyw==", "dev": true, "dependencies": { - "@octokit/types": "^6.31.0" + "@octokit/types": "^6.34.0" }, "peerDependencies": { "@octokit/core": ">=2" @@ -680,12 +681,12 @@ } }, "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "5.11.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.11.3.tgz", - "integrity": "sha512-E19gqHqfP3uJa2/hx6Abhx2NrVP5tsNbst2/AeqGxlGM+eL4N8fRbzhd+NEIsGAB4y3R7e9kVE0y8OOghlXUXw==", + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.13.0.tgz", + "integrity": "sha512-uJjMTkN1KaOIgNtUPMtIXDOjx6dGYysdIFhgA52x4xSadQCz3b/zJexvITDVpANnfKPW/+E0xkOvLntqMYpviA==", "dev": true, "dependencies": { - "@octokit/types": "^6.31.1", + "@octokit/types": "^6.34.0", "deprecation": "^2.3.1" }, "peerDependencies": { @@ -693,9 +694,9 @@ } }, "node_modules/@octokit/request": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.1.tgz", - "integrity": "sha512-Ls2cfs1OfXaOKzkcxnqw5MR6drMA/zWX/LIS/p8Yjdz7QKTPQLMsB3R+OvoxE6XnXeXEE2X7xe4G4l4X0gRiKQ==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.2.tgz", + "integrity": "sha512-je66CvSEVf0jCpRISxkUcCa0UkxmFs6eGDRSbfJtAVwbLH5ceqF+YEyC8lj8ystKyZTy8adWr0qmkY52EfOeLA==", "dev": true, "dependencies": { "@octokit/endpoint": "^6.0.1", @@ -730,12 +731,12 @@ } }, "node_modules/@octokit/types": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.31.1.tgz", - "integrity": "sha512-xkF46eaYcpT8ieO78mZWhMq3bt37zIsP5BUkN+zWgX+mTYDB7jOtUP1MOxcSF8hhJhsjjlB1YDgQAhX0z0oqPw==", + "version": "6.34.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.34.0.tgz", + "integrity": "sha512-s1zLBjWhdEI2zwaoSgyOFoKSl109CUcVBCc7biPJ3aAf6LGLU6szDvi31JPU7bxfla2lqfhjbbg/5DdFNxOwHw==", "dev": true, "dependencies": { - "@octokit/openapi-types": "^10.6.1" + "@octokit/openapi-types": "^11.2.0" } }, "node_modules/@sindresorhus/is": { @@ -855,9 +856,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "16.10.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.2.tgz", - "integrity": "sha512-zCclL4/rx+W5SQTzFs9wyvvyCwoK9QtBpratqz2IYJ3O8Umrn0m3nsTv0wQBk9sRGpvUe9CwPDrQFB10f1FIjQ==", + "version": "16.10.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.3.tgz", + "integrity": "sha512-ho3Ruq+fFnBrZhUYI46n/bV2GjwzSkwuT4dTf0GkuNFmnb8nq4ny2z9JEVemFi6bdEJanHLlYfy9c6FN9B9McQ==", "dev": true }, "node_modules/@types/parse-json": { @@ -1199,16 +1200,16 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.1.tgz", - "integrity": "sha512-aLD0ZMDSnF4lUt4ZDNgqi5BUn9BZ7YdQdI/cYlILrhdSSZJLU9aNZoD5/NBmM4SK34APB2e83MOsRt1EnkuyaQ==", + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.3.tgz", + "integrity": "sha512-59IqHJV5VGdcJZ+GZ2hU5n4Kv3YiASzW6Xk5g9tf5a/MAzGeFwgGWU39fVzNIOVcgB3+Gp+kiQu0HEfTVU/3VQ==", "dev": true, "dependencies": { - "caniuse-lite": "^1.0.30001259", - "electron-to-chromium": "^1.3.846", + "caniuse-lite": "^1.0.30001264", + "electron-to-chromium": "^1.3.857", "escalade": "^3.1.1", - "nanocolors": "^0.1.5", - "node-releases": "^1.1.76" + "node-releases": "^1.1.77", + "picocolors": "^0.2.1" }, "bin": { "browserslist": "cli.js" @@ -1340,9 +1341,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001261", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001261.tgz", - "integrity": "sha512-vM8D9Uvp7bHIN0fZ2KQ4wnmYFpJo/Etb4Vwsuc+ka0tfGDHvOPrFm6S/7CCNLSOkAUjenT2HnUPESdOIL91FaA==", + "version": "1.0.30001265", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001265.tgz", + "integrity": "sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw==", "dev": true, "funding": { "type": "opencollective", @@ -1444,9 +1445,9 @@ } }, "node_modules/cli-spinners": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz", - "integrity": "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", "dev": true, "engines": { "node": ">=6" @@ -1789,9 +1790,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.3.854", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.854.tgz", - "integrity": "sha512-00/IIC1mFPkq32MhUJyLdcTp7+wsKK2G3Sb65GSas9FKJQGYkDcZ4GwJkkxf5YyM3ETvl6n+toV8OmtXl4IA/g==", + "version": "1.3.864", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.864.tgz", + "integrity": "sha512-v4rbad8GO6/yVI92WOeU9Wgxc4NA0n4f6P1FvZTY+jyY7JHEhw3bduYu60v3Q1h81Cg6eo4ApZrFPuycwd5hGw==", "dev": true }, "node_modules/emoji-regex": { @@ -2840,9 +2841,9 @@ "dev": true }, "node_modules/istanbul-lib-coverage": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.1.tgz", - "integrity": "sha512-GvCYYTxaCPqwMjobtVcVKvSHtAGe48MNhGjpK8LtVF8K0ISX7hCKl85LgtuaSneWVyQmaGcW3iXVV3GaZSLpmQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", "dev": true, "engines": { "node": ">=8" @@ -2943,9 +2944,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.3.tgz", + "integrity": "sha512-0i77ZFLsb9U3DHi22WzmIngVzfoyxxbQcZRqlF3KoKmCJGq9nhFHoGi8FqBztN2rE8w6hURnZghetn0xpkVb6A==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -3164,9 +3165,9 @@ "dev": true }, "node_modules/marked": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.4.tgz", - "integrity": "sha512-jBo8AOayNaEcvBhNobg6/BLhdsK3NvnKWJg33MAAPbvTWiG4QBn9gpW1+7RssrKu4K1dKlN+0goVQwV41xEfOA==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.7.tgz", + "integrity": "sha512-ctKqbnLuNbsHbI26cfMyOlKgXGfl1orOv1AvWWDX7AkgfMOwCWvmuYc+mVLeWhQ9W6hdWVBynOs96VkcscKo0Q==", "dev": true, "bin": { "marked": "bin/marked" @@ -3315,12 +3316,6 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, - "node_modules/nanocolors": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.1.12.tgz", - "integrity": "sha512-2nMHqg1x5PU+unxX7PGY7AuYxl2qDx7PSrTRjizr8sxdd3l/3hBuWWaki62qmtYm2U5i4Z5E7GbjlyDFhs9/EQ==", - "dev": true - }, "node_modules/nanoid": { "version": "3.1.25", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", @@ -3398,9 +3393,9 @@ } }, "node_modules/node-releases": { - "version": "1.1.76", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.76.tgz", - "integrity": "sha512-9/IECtNr8dXNmPWmFXepT0/7o5eolGesHUa3mtr0KlgnCvnZxwh2qensKL42JJY2vQKC3nIBXetFAqR+PW1CmA==", + "version": "1.1.77", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz", + "integrity": "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==", "dev": true }, "node_modules/normalize-path": { @@ -4062,6 +4057,12 @@ "node": ">=8" } }, + "node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "node_modules/picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", @@ -4159,15 +4160,6 @@ "node": ">=8" } }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/protocols": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.8.tgz", @@ -4613,9 +4605,9 @@ } }, "node_modules/rxjs": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.3.0.tgz", - "integrity": "sha512-p2yuGIg9S1epc3vrjKf6iVb3RCaAYjYskkO+jHIaV0IjOPlJop4UnodOoFb2xeNwlguqLYvGw1b1McillYb5Gw==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.4.0.tgz", + "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", "dev": true, "dependencies": { "tslib": "~2.1.0" @@ -5015,12 +5007,12 @@ "dev": true }, "node_modules/ts-node": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.2.1.tgz", - "integrity": "sha512-hCnyOyuGmD5wHleOQX6NIjJtYVIO8bPP8F2acWkB4W06wdlkgyvJtubO/I9NkI88hCFECbsEgoLc0VNkYmcSfw==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.3.0.tgz", + "integrity": "sha512-RYIy3i8IgpFH45AX4fQHExrT8BxDeKTdC83QFJkNzkvt8uFB6QJ8XMyhynYiKMLxt9a7yuXaDBZNOYS3XjDcYw==", "dev": true, "dependencies": { - "@cspotcode/source-map-support": "0.6.1", + "@cspotcode/source-map-support": "0.7.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", @@ -5040,9 +5032,6 @@ "ts-node-transpile-only": "dist/bin-transpile.js", "ts-script": "dist/bin-script-deprecated.js" }, - "engines": { - "node": ">=12.0.0" - }, "peerDependencies": { "@swc/core": ">=1.2.50", "@swc/wasm": ">=1.2.50", @@ -5101,19 +5090,16 @@ } }, "node_modules/typedoc": { - "version": "0.21.9", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.21.9.tgz", - "integrity": "sha512-VRo7aII4bnYaBBM1lhw4bQFmUcDQV8m8tqgjtc7oXl87jc1Slbhfw2X5MccfcR2YnEClHDWgsiQGgNB8KJXocA==", + "version": "0.22.5", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.5.tgz", + "integrity": "sha512-KFrWGU1iKiTGw0RcyjLNYDmhd7uICU14HgBNPmFKY/sT4Pm/fraaLyWyisst9vGTUAKxqibqoDITR7+ZcAkhHg==", "dev": true, "dependencies": { - "glob": "^7.1.7", - "handlebars": "^4.7.7", + "glob": "^7.2.0", "lunr": "^2.3.9", - "marked": "^3.0.2", - "minimatch": "^3.0.0", - "progress": "^2.0.3", - "shiki": "^0.9.8", - "typedoc-default-themes": "^0.12.10" + "marked": "^3.0.4", + "minimatch": "^3.0.4", + "shiki": "^0.9.11" }, "bin": { "typedoc": "bin/typedoc" @@ -5125,35 +5111,46 @@ "typescript": "4.0.x || 4.1.x || 4.2.x || 4.3.x || 4.4.x" } }, - "node_modules/typedoc-default-themes": { - "version": "0.12.10", - "resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.12.10.tgz", - "integrity": "sha512-fIS001cAYHkyQPidWXmHuhs8usjP5XVJjWB8oZGqkTowZaz3v7g3KDZeeqE82FBrmkAnIBOY3jgy7lnPnqATbA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/typedoc-github-wiki-theme": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/typedoc-github-wiki-theme/-/typedoc-github-wiki-theme-0.5.1.tgz", - "integrity": "sha512-ED2Uc3WUjbv6xIdCkpMz3yBtcEciJnAhDQdRWLYgw4K+FKY0T3PzbI+ssNsBVgwDnYQP/XuaqfZkeQ3EQsOm9g==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/typedoc-github-wiki-theme/-/typedoc-github-wiki-theme-0.6.0.tgz", + "integrity": "sha512-uHhR7PwAZ4JgO0KzlLocWSvMqKsSZ/wxUQYGKskIepzsotPAQcAWnSSnGi6gdkSw8UAfIIppdD7H1AmI39962w==", "dev": true, "peerDependencies": { - "typedoc": ">=0.20.0", - "typedoc-plugin-markdown": ">=3.4.0" + "typedoc": ">=0.22.0", + "typedoc-plugin-markdown": ">=3.11.0" } }, "node_modules/typedoc-plugin-markdown": { - "version": "3.10.4", - "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.10.4.tgz", - "integrity": "sha512-if9w7S9fXLg73AYi/EoRSEhTOZlg3I8mIP8YEmvzSE33VrNXC9/hA0nVcLEwFVJeQY7ay6z67I6kW0KIv7LjeA==", + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.11.3.tgz", + "integrity": "sha512-rWiHbEIe0oZetDIsBR24XJVxGOJ91kDcHoj2KhFKxCLoJGX659EKBQkHne9QJ4W2stGhu1fRgFyQaouSBnxukA==", "dev": true, "dependencies": { "handlebars": "^4.7.7" }, "peerDependencies": { - "typedoc": ">=0.21.2" + "typedoc": ">=0.22.0" + } + }, + "node_modules/typedoc/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/typescript": { @@ -5602,9 +5599,9 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", + "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", "dev": true, "requires": { "@babel/highlight": "^7.14.5" @@ -5617,20 +5614,20 @@ "dev": true }, "@babel/core": { - "version": "7.15.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.5.tgz", - "integrity": "sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.8.tgz", + "integrity": "sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og==", "dev": true, "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.4", + "@babel/code-frame": "^7.15.8", + "@babel/generator": "^7.15.8", "@babel/helper-compilation-targets": "^7.15.4", - "@babel/helper-module-transforms": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.8", "@babel/helpers": "^7.15.4", - "@babel/parser": "^7.15.5", + "@babel/parser": "^7.15.8", "@babel/template": "^7.15.4", "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4", + "@babel/types": "^7.15.6", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -5640,12 +5637,12 @@ } }, "@babel/generator": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.4.tgz", - "integrity": "sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.8.tgz", + "integrity": "sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g==", "dev": true, "requires": { - "@babel/types": "^7.15.4", + "@babel/types": "^7.15.6", "jsesc": "^2.5.1", "source-map": "^0.5.0" } @@ -5710,9 +5707,9 @@ } }, "@babel/helper-module-transforms": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.7.tgz", - "integrity": "sha512-ZNqjjQG/AuFfekFTY+7nY4RgBSklgTu970c7Rj3m/JOhIu5KPBUuTA9AY6zaKcUvk4g6EbDXdBnhi35FAssdSw==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz", + "integrity": "sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.15.4", @@ -5857,9 +5854,9 @@ } }, "@babel/parser": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.7.tgz", - "integrity": "sha512-rycZXvQ+xS9QyIcJ9HXeDWf1uxqlbVFAUq0Rq0dbc50Zb/+wUe/ehyfzGfm9KZZF0kBejYgxltBXocP+gKdL2g==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.8.tgz", + "integrity": "sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==", "dev": true }, "@babel/template": { @@ -5907,9 +5904,9 @@ "dev": true }, "@cspotcode/source-map-support": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.6.1.tgz", - "integrity": "sha512-DX3Z+T5dt1ockmPdobJS/FAsQPW4V4SrWEhD2iYQT2Cb2tQsiMnYxrcUH9By/Z3B+v0S5LMBkQtV/XOBbpLEOg==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", + "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", "dev": true, "requires": { "@cspotcode/source-map-consumer": "0.8.0" @@ -6080,18 +6077,18 @@ } }, "@octokit/openapi-types": { - "version": "10.6.1", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-10.6.1.tgz", - "integrity": "sha512-53YKy8w8+sHQhUONhTiYt6MqNqPolejYr6rK/3VOevpORAIYGQEX2pmXnnhgdSsjHy176e5ZBgVt0ppOGziS7g==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-11.2.0.tgz", + "integrity": "sha512-PBsVO+15KSlGmiI8QAzaqvsNlZlrDlyAJYcrXBCvVUxCp7VnXjkwPoFHgjEJXx3WF9BAwkA6nfCUA7i9sODzKA==", "dev": true }, "@octokit/plugin-paginate-rest": { - "version": "2.16.5", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.16.5.tgz", - "integrity": "sha512-2PfRGymdBypqRes4Xelu0BAZZRCV/Qg0xgo8UB10UKoghCM+zg640+T5WkRsRD0edwfLBPP3VsJgDyDTG4EIYg==", + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.17.0.tgz", + "integrity": "sha512-tzMbrbnam2Mt4AhuyCHvpRkS0oZ5MvwwcQPYGtMv4tUa5kkzG58SVB0fcsLulOZQeRnOgdkZWkRUiyBlh0Bkyw==", "dev": true, "requires": { - "@octokit/types": "^6.31.0" + "@octokit/types": "^6.34.0" } }, "@octokit/plugin-request-log": { @@ -6102,19 +6099,19 @@ "requires": {} }, "@octokit/plugin-rest-endpoint-methods": { - "version": "5.11.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.11.3.tgz", - "integrity": "sha512-E19gqHqfP3uJa2/hx6Abhx2NrVP5tsNbst2/AeqGxlGM+eL4N8fRbzhd+NEIsGAB4y3R7e9kVE0y8OOghlXUXw==", + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.13.0.tgz", + "integrity": "sha512-uJjMTkN1KaOIgNtUPMtIXDOjx6dGYysdIFhgA52x4xSadQCz3b/zJexvITDVpANnfKPW/+E0xkOvLntqMYpviA==", "dev": true, "requires": { - "@octokit/types": "^6.31.1", + "@octokit/types": "^6.34.0", "deprecation": "^2.3.1" } }, "@octokit/request": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.1.tgz", - "integrity": "sha512-Ls2cfs1OfXaOKzkcxnqw5MR6drMA/zWX/LIS/p8Yjdz7QKTPQLMsB3R+OvoxE6XnXeXEE2X7xe4G4l4X0gRiKQ==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.2.tgz", + "integrity": "sha512-je66CvSEVf0jCpRISxkUcCa0UkxmFs6eGDRSbfJtAVwbLH5ceqF+YEyC8lj8ystKyZTy8adWr0qmkY52EfOeLA==", "dev": true, "requires": { "@octokit/endpoint": "^6.0.1", @@ -6149,12 +6146,12 @@ } }, "@octokit/types": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.31.1.tgz", - "integrity": "sha512-xkF46eaYcpT8ieO78mZWhMq3bt37zIsP5BUkN+zWgX+mTYDB7jOtUP1MOxcSF8hhJhsjjlB1YDgQAhX0z0oqPw==", + "version": "6.34.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.34.0.tgz", + "integrity": "sha512-s1zLBjWhdEI2zwaoSgyOFoKSl109CUcVBCc7biPJ3aAf6LGLU6szDvi31JPU7bxfla2lqfhjbbg/5DdFNxOwHw==", "dev": true, "requires": { - "@octokit/openapi-types": "^10.6.1" + "@octokit/openapi-types": "^11.2.0" } }, "@sindresorhus/is": { @@ -6265,9 +6262,9 @@ "dev": true }, "@types/node": { - "version": "16.10.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.2.tgz", - "integrity": "sha512-zCclL4/rx+W5SQTzFs9wyvvyCwoK9QtBpratqz2IYJ3O8Umrn0m3nsTv0wQBk9sRGpvUe9CwPDrQFB10f1FIjQ==", + "version": "16.10.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.3.tgz", + "integrity": "sha512-ho3Ruq+fFnBrZhUYI46n/bV2GjwzSkwuT4dTf0GkuNFmnb8nq4ny2z9JEVemFi6bdEJanHLlYfy9c6FN9B9McQ==", "dev": true }, "@types/parse-json": { @@ -6530,16 +6527,16 @@ "dev": true }, "browserslist": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.1.tgz", - "integrity": "sha512-aLD0ZMDSnF4lUt4ZDNgqi5BUn9BZ7YdQdI/cYlILrhdSSZJLU9aNZoD5/NBmM4SK34APB2e83MOsRt1EnkuyaQ==", + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.3.tgz", + "integrity": "sha512-59IqHJV5VGdcJZ+GZ2hU5n4Kv3YiASzW6Xk5g9tf5a/MAzGeFwgGWU39fVzNIOVcgB3+Gp+kiQu0HEfTVU/3VQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001259", - "electron-to-chromium": "^1.3.846", + "caniuse-lite": "^1.0.30001264", + "electron-to-chromium": "^1.3.857", "escalade": "^3.1.1", - "nanocolors": "^0.1.5", - "node-releases": "^1.1.76" + "node-releases": "^1.1.77", + "picocolors": "^0.2.1" } }, "buffer": { @@ -6625,9 +6622,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001261", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001261.tgz", - "integrity": "sha512-vM8D9Uvp7bHIN0fZ2KQ4wnmYFpJo/Etb4Vwsuc+ka0tfGDHvOPrFm6S/7CCNLSOkAUjenT2HnUPESdOIL91FaA==", + "version": "1.0.30001265", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001265.tgz", + "integrity": "sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw==", "dev": true }, "chalk": { @@ -6701,9 +6698,9 @@ } }, "cli-spinners": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz", - "integrity": "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", "dev": true }, "cli-width": { @@ -6967,9 +6964,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.854", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.854.tgz", - "integrity": "sha512-00/IIC1mFPkq32MhUJyLdcTp7+wsKK2G3Sb65GSas9FKJQGYkDcZ4GwJkkxf5YyM3ETvl6n+toV8OmtXl4IA/g==", + "version": "1.3.864", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.864.tgz", + "integrity": "sha512-v4rbad8GO6/yVI92WOeU9Wgxc4NA0n4f6P1FvZTY+jyY7JHEhw3bduYu60v3Q1h81Cg6eo4ApZrFPuycwd5hGw==", "dev": true }, "emoji-regex": { @@ -7713,9 +7710,9 @@ "dev": true }, "istanbul-lib-coverage": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.1.tgz", - "integrity": "sha512-GvCYYTxaCPqwMjobtVcVKvSHtAGe48MNhGjpK8LtVF8K0ISX7hCKl85LgtuaSneWVyQmaGcW3iXVV3GaZSLpmQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", "dev": true }, "istanbul-lib-hook": { @@ -7796,9 +7793,9 @@ } }, "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.3.tgz", + "integrity": "sha512-0i77ZFLsb9U3DHi22WzmIngVzfoyxxbQcZRqlF3KoKmCJGq9nhFHoGi8FqBztN2rE8w6hURnZghetn0xpkVb6A==", "dev": true, "requires": { "html-escaper": "^2.0.0", @@ -7971,9 +7968,9 @@ "dev": true }, "marked": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.4.tgz", - "integrity": "sha512-jBo8AOayNaEcvBhNobg6/BLhdsK3NvnKWJg33MAAPbvTWiG4QBn9gpW1+7RssrKu4K1dKlN+0goVQwV41xEfOA==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.7.tgz", + "integrity": "sha512-ctKqbnLuNbsHbI26cfMyOlKgXGfl1orOv1AvWWDX7AkgfMOwCWvmuYc+mVLeWhQ9W6hdWVBynOs96VkcscKo0Q==", "dev": true }, "merge-stream": { @@ -8084,12 +8081,6 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, - "nanocolors": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.1.12.tgz", - "integrity": "sha512-2nMHqg1x5PU+unxX7PGY7AuYxl2qDx7PSrTRjizr8sxdd3l/3hBuWWaki62qmtYm2U5i4Z5E7GbjlyDFhs9/EQ==", - "dev": true - }, "nanoid": { "version": "3.1.25", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", @@ -8151,9 +8142,9 @@ } }, "node-releases": { - "version": "1.1.76", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.76.tgz", - "integrity": "sha512-9/IECtNr8dXNmPWmFXepT0/7o5eolGesHUa3mtr0KlgnCvnZxwh2qensKL42JJY2vQKC3nIBXetFAqR+PW1CmA==", + "version": "1.1.77", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz", + "integrity": "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==", "dev": true }, "normalize-path": { @@ -8669,6 +8660,12 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", @@ -8738,12 +8735,6 @@ "fromentries": "^1.2.0" } }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, "protocols": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.8.tgz", @@ -9065,9 +9056,9 @@ } }, "rxjs": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.3.0.tgz", - "integrity": "sha512-p2yuGIg9S1epc3vrjKf6iVb3RCaAYjYskkO+jHIaV0IjOPlJop4UnodOoFb2xeNwlguqLYvGw1b1McillYb5Gw==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.4.0.tgz", + "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", "dev": true, "requires": { "tslib": "~2.1.0" @@ -9374,12 +9365,12 @@ "dev": true }, "ts-node": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.2.1.tgz", - "integrity": "sha512-hCnyOyuGmD5wHleOQX6NIjJtYVIO8bPP8F2acWkB4W06wdlkgyvJtubO/I9NkI88hCFECbsEgoLc0VNkYmcSfw==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.3.0.tgz", + "integrity": "sha512-RYIy3i8IgpFH45AX4fQHExrT8BxDeKTdC83QFJkNzkvt8uFB6QJ8XMyhynYiKMLxt9a7yuXaDBZNOYS3XjDcYw==", "dev": true, "requires": { - "@cspotcode/source-map-support": "0.6.1", + "@cspotcode/source-map-support": "0.7.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", @@ -9429,38 +9420,45 @@ } }, "typedoc": { - "version": "0.21.9", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.21.9.tgz", - "integrity": "sha512-VRo7aII4bnYaBBM1lhw4bQFmUcDQV8m8tqgjtc7oXl87jc1Slbhfw2X5MccfcR2YnEClHDWgsiQGgNB8KJXocA==", + "version": "0.22.5", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.5.tgz", + "integrity": "sha512-KFrWGU1iKiTGw0RcyjLNYDmhd7uICU14HgBNPmFKY/sT4Pm/fraaLyWyisst9vGTUAKxqibqoDITR7+ZcAkhHg==", "dev": true, "requires": { - "glob": "^7.1.7", - "handlebars": "^4.7.7", + "glob": "^7.2.0", "lunr": "^2.3.9", - "marked": "^3.0.2", - "minimatch": "^3.0.0", - "progress": "^2.0.3", - "shiki": "^0.9.8", - "typedoc-default-themes": "^0.12.10" + "marked": "^3.0.4", + "minimatch": "^3.0.4", + "shiki": "^0.9.11" + }, + "dependencies": { + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } }, - "typedoc-default-themes": { - "version": "0.12.10", - "resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.12.10.tgz", - "integrity": "sha512-fIS001cAYHkyQPidWXmHuhs8usjP5XVJjWB8oZGqkTowZaz3v7g3KDZeeqE82FBrmkAnIBOY3jgy7lnPnqATbA==", - "dev": true - }, "typedoc-github-wiki-theme": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/typedoc-github-wiki-theme/-/typedoc-github-wiki-theme-0.5.1.tgz", - "integrity": "sha512-ED2Uc3WUjbv6xIdCkpMz3yBtcEciJnAhDQdRWLYgw4K+FKY0T3PzbI+ssNsBVgwDnYQP/XuaqfZkeQ3EQsOm9g==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/typedoc-github-wiki-theme/-/typedoc-github-wiki-theme-0.6.0.tgz", + "integrity": "sha512-uHhR7PwAZ4JgO0KzlLocWSvMqKsSZ/wxUQYGKskIepzsotPAQcAWnSSnGi6gdkSw8UAfIIppdD7H1AmI39962w==", "dev": true, "requires": {} }, "typedoc-plugin-markdown": { - "version": "3.10.4", - "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.10.4.tgz", - "integrity": "sha512-if9w7S9fXLg73AYi/EoRSEhTOZlg3I8mIP8YEmvzSE33VrNXC9/hA0nVcLEwFVJeQY7ay6z67I6kW0KIv7LjeA==", + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.11.3.tgz", + "integrity": "sha512-rWiHbEIe0oZetDIsBR24XJVxGOJ91kDcHoj2KhFKxCLoJGX659EKBQkHne9QJ4W2stGhu1fRgFyQaouSBnxukA==", "dev": true, "requires": { "handlebars": "^4.7.7" diff --git a/package.json b/package.json index b2ceadbdd1..48c5018c13 100644 --- a/package.json +++ b/package.json @@ -34,20 +34,21 @@ }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@tsconfig/node12": "^1.0.9", "@types/mocha": "^9.0.0", - "@types/node": "^16.9.6", - "@types/sinon": "^10.0.3", + "@types/node": "^16.10.3", + "@types/sinon": "^10.0.4", "@types/which": "^2.0.1", "@types/yallist": "^4.0.1", - "mocha": "^9.1.1", + "mocha": "^9.1.2", "nyc": "^15.1.0", "release-it": "^14.11.6", "sinon": "^11.1.2", "source-map-support": "^0.5.20", - "ts-node": "^10.2.1", - "typedoc": "0.21.9", - "typedoc-github-wiki-theme": "^0.5.1", - "typedoc-plugin-markdown": "3.10.4", + "ts-node": "^10.3.0", + "typedoc": "^0.22.5", + "typedoc-github-wiki-theme": "^0.6.0", + "typedoc-plugin-markdown": "^3.11.3", "typescript": "^4.4.3", "which": "^2.0.2" }, diff --git a/tsconfig.json b/tsconfig.json index deebc9f125..1f76310034 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,11 +1,6 @@ { + "extends": "@tsconfig/node12/tsconfig.json", "compilerOptions": { - "strict": true, - "target": "ES2019", - "lib": ["ES2019", "ES2020.BigInt", "ES2020.String", "ES2020.Symbol.WellKnown"], - "module": "CommonJS", - "moduleResolution": "Node", - "esModuleInterop": true, "outDir": "./dist", "declaration": true, "useDefineForClassFields": true, @@ -27,6 +22,7 @@ "./index.ts", "./lib" ], + "entryPointStrategy": "expand", "exclude": [ "./lib/ts-declarations", "./lib/test-utils.ts"