diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index 9b181d43149..00000000000 --- a/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: ⚠️ Bug report -labels: needs-triage ---- - -### Issue - -> Describe your issue here - ---- - -### Environment - - - - **Node.js Version**: `VERSION_HERE` - - - - **Redis Server Version**: `VERSION_HERE` - - - - **Platform**: `PLATFORM_HERE` diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md new file mode 100644 index 00000000000..a7fae8eeb11 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -0,0 +1,15 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: Bug +assignees: '' +--- + + + +**Environment:** + - **Node.js Version**: + - **Redis Server Version**: + - **Node Redis Version**: + - **Platform**: diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md new file mode 100644 index 00000000000..0645d6e1a83 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.md @@ -0,0 +1,7 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: Bug +assignees: '' +--- diff --git a/.npmignore b/.npmignore index fa2d8841124..e3fc1a7731d 100644 --- a/.npmignore +++ b/.npmignore @@ -1,12 +1,13 @@ .vscode/ .idea/ node_modules/ -.nyc_output +.nyc_output/ coverage/ dump.rdb documentation/ CONTRIBUTING.md tsconfig.json +.deepsource.toml .nycrc.json benchmark/ .github/ diff --git a/README.md b/README.md index c5f0ea1a1c9..c768b691d71 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ The above code connects to localhost on port 6379. To connect to a different hos ```typescript createClient({ - url: 'redis://alice:foobared@awesome.redis.server:6380', + url: 'redis://alice:foobared@awesome.redis.server:6380' }); ``` @@ -78,7 +78,7 @@ Modifiers to commands are specified using a JavaScript object: ```typescript await client.set('key', 'value', { EX: 10, - NX: true, + NX: true }); ``` @@ -181,12 +181,9 @@ for await (const key of client.scanIterator()) { This works with `HSCAN`, `SSCAN`, and `ZSCAN` too: ```typescript -for await (const member of client.hScanIterator('hash')) { -} -for await (const { field, value } of client.sScanIterator('set')) { -} -for await (const { member, score } of client.zScanIterator('sorted-set')) { -} +for await (const member of client.hScanIterator('hash')) {} +for await (const { field, value } of client.sScanIterator('set')) {} +for await (const { member, score } of client.zScanIterator('sorted-set')) {} ``` You can override the default options by providing a configuration object: @@ -204,7 +201,8 @@ client.scanIterator({ Define new functions using [Lua scripts](https://redis.io/commands/eval) which execute on the Redis server: ```typescript -import { createClient, defineScript } from 'redis'; +import { createClient } from 'redis'; +import { defineScript } from 'redis/lua-script'; (async () => { const client = createClient({ @@ -218,9 +216,9 @@ import { createClient, defineScript } from 'redis'; }, transformReply(reply: number): number { return reply; - }, - }), - }, + } + }) + } }); await client.connect(); @@ -241,14 +239,12 @@ import { createCluster } from 'redis'; const cluster = createCluster({ rootNodes: [ { - host: '10.0.0.1', - port: 30001, + url: 'redis://10.0.0.1:30001' }, { - host: '10.0.0.2', - port: 30002, - }, - ], + url: 'redis://10.0.0.2:30002' + } + ] }); cluster.on('error', (err) => console.log('Redis Cluster Error', err)); @@ -274,7 +270,7 @@ Of course, if you don't do something with your Promises you're certain to get [u ```typescript await Promise.all([ client.set('Tm9kZSBSZWRpcw==', 'users:1'), - client.sAdd('users:1:tokens', 'Tm9kZSBSZWRpcw=='), + client.sAdd('users:1:tokens', 'Tm9kZSBSZWRpcw==') ]); ``` diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000000..0839a123c96 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,16 @@ +# Security Policy + +## Supported Versions + +Node Redis is generally backwards compatible with very few exceptions, so we recommend users to always use the latest version to experience stability, performance and security. + +| Version | Supported | +| ------- | ------------------ | +| 4.0.x | :white_check_mark: | +| 3.1.x | :white_check_mark: | +| < 3.1 | :x: | + +## Reporting a Vulnerability + +If you believe you’ve discovered a serious vulnerability, please contact the Node Redis core team at redis@redis.io. We will evaluate your report and if necessary issue a fix and an advisory. If the issue was previously undisclosed, +we’ll also mention your name in the credits. diff --git a/benchmark/package-lock.json b/benchmark/package-lock.json index a16a420f8cb..4afaf8c305c 100644 --- a/benchmark/package-lock.json +++ b/benchmark/package-lock.json @@ -4,40 +4,42 @@ "requires": true, "packages": { "": { + "name": "benchmark", "license": "ISC", "dependencies": { - "@probe.gl/bench": "^3.4.0", - "benny": "^3.6.15", + "benny": "3.6.15", "v3": "npm:redis@3.1.2", "v4": "file:../" } }, "..": { "name": "redis", - "version": "4.0.0-next.5", + "version": "4.0.0-rc.2", "license": "MIT", "dependencies": { "cluster-key-slot": "1.1.0", + "generic-pool": "3.8.2", "redis-parser": "3.0.0", "yallist": "4.0.0" }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@tsconfig/node12": "^1.0.9", "@types/mocha": "^9.0.0", - "@types/node": "^16.4.5", - "@types/sinon": "^10.0.2", + "@types/node": "^16.10.3", + "@types/sinon": "^10.0.4", "@types/which": "^2.0.1", "@types/yallist": "^4.0.1", - "mocha": "^9.0.3", + "mocha": "^9.1.2", "nyc": "^15.1.0", - "release-it": "^14.10.1", + "release-it": "^14.11.6", "sinon": "^11.1.2", - "source-map-support": "^0.5.19", - "ts-node": "^10.1.0", - "typedoc": "^0.21.4", - "typedoc-github-wiki-theme": "^0.5.1", - "typedoc-plugin-markdown": "^3.10.4", - "typescript": "^4.3.5", + "source-map-support": "^0.5.20", + "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" }, "engines": { @@ -81,34 +83,6 @@ "fast-deep-equal": "^3.1.1" } }, - "node_modules/@babel/runtime": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz", - "integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==", - "dependencies": { - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@probe.gl/bench": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@probe.gl/bench/-/bench-3.4.0.tgz", - "integrity": "sha512-S7iNPz5G3zEfEP0S4SAMvtj+dwP7EWfVBaA8Cy5CVIgM1lnpUbXvqoAJxlVEedNC32Icxwq65XQheufy1Zzmug==", - "dependencies": { - "@babel/runtime": "^7.0.0", - "probe.gl": "3.4.0" - } - }, - "node_modules/@probe.gl/stats": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@probe.gl/stats/-/stats-3.4.0.tgz", - "integrity": "sha512-Gl37r9qGuiKadIvTZdSZvzCNOttJYw6RcY1oT0oDuB8r2uhuZAdSMQRQTy9FTinp6MY6O9wngGnV6EpQ8wSBAw==", - "dependencies": { - "@babel/runtime": "^7.0.0" - } - }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -124,9 +98,9 @@ } }, "node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { "node": ">=8" } @@ -223,9 +197,9 @@ } }, "node_modules/denque": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", - "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", + "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", "engines": { "node": ">=0.10" } @@ -255,9 +229,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", @@ -366,9 +340,9 @@ "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" }, "node_modules/prettier": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.2.tgz", - "integrity": "sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==", + "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" }, @@ -376,15 +350,6 @@ "node": ">=10.13.0" } }, - "node_modules/probe.gl": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/probe.gl/-/probe.gl-3.4.0.tgz", - "integrity": "sha512-9CLByZATuhuG/Viq3ckfWU+dAhb7dMmjzsyCy4s7ds9ueTejcVRENxL197/XacOK/AN61YrEERB0QnouB0Qc0Q==", - "dependencies": { - "@babel/runtime": "^7.0.0", - "@probe.gl/stats": "3.4.0" - } - }, "node_modules/redis-commands": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", @@ -409,11 +374,6 @@ "node": ">=4" } }, - "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" - }, "node_modules/restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -427,9 +387,9 @@ } }, "node_modules/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", + "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==" }, "node_modules/slice-ansi": { "version": "4.0.0", @@ -453,24 +413,24 @@ "integrity": "sha512-IYsheLg6dasD3zT/w9+8Iq9tcIQqqu91ZIpJOnIEM25C3X/g4Tl8mhXwW2ZQpbrsJISr9+wizEYgsibN5/b32Q==" }, "node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, "node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" @@ -570,31 +530,6 @@ "fast-deep-equal": "^3.1.1" } }, - "@babel/runtime": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz", - "integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@probe.gl/bench": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@probe.gl/bench/-/bench-3.4.0.tgz", - "integrity": "sha512-S7iNPz5G3zEfEP0S4SAMvtj+dwP7EWfVBaA8Cy5CVIgM1lnpUbXvqoAJxlVEedNC32Icxwq65XQheufy1Zzmug==", - "requires": { - "@babel/runtime": "^7.0.0", - "probe.gl": "3.4.0" - } - }, - "@probe.gl/stats": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@probe.gl/stats/-/stats-3.4.0.tgz", - "integrity": "sha512-Gl37r9qGuiKadIvTZdSZvzCNOttJYw6RcY1oT0oDuB8r2uhuZAdSMQRQTy9FTinp6MY6O9wngGnV6EpQ8wSBAw==", - "requires": { - "@babel/runtime": "^7.0.0" - } - }, "ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -604,9 +539,9 @@ } }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "4.3.0", @@ -679,9 +614,9 @@ "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==" }, "denque": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", - "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==" + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", + "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==" }, "emoji-regex": { "version": "8.0.0", @@ -705,9 +640,9 @@ } }, "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" }, "is-fullwidth-code-point": { "version": "3.0.0", @@ -783,18 +718,9 @@ "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" }, "prettier": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.2.tgz", - "integrity": "sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==" - }, - "probe.gl": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/probe.gl/-/probe.gl-3.4.0.tgz", - "integrity": "sha512-9CLByZATuhuG/Viq3ckfWU+dAhb7dMmjzsyCy4s7ds9ueTejcVRENxL197/XacOK/AN61YrEERB0QnouB0Qc0Q==", - "requires": { - "@babel/runtime": "^7.0.0", - "@probe.gl/stats": "3.4.0" - } + "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", @@ -814,11 +740,6 @@ "redis-errors": "^1.0.0" } }, - "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" - }, "restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -829,9 +750,9 @@ } }, "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", + "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==" }, "slice-ansi": { "version": "4.0.0", @@ -849,21 +770,21 @@ "integrity": "sha512-IYsheLg6dasD3zT/w9+8Iq9tcIQqqu91ZIpJOnIEM25C3X/g4Tl8mhXwW2ZQpbrsJISr9+wizEYgsibN5/b32Q==" }, "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } }, "type-fest": { @@ -891,23 +812,25 @@ "version": "file:..", "requires": { "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@tsconfig/node12": "^1.0.9", "@types/mocha": "^9.0.0", - "@types/node": "^16.4.5", - "@types/sinon": "^10.0.2", + "@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", - "mocha": "^9.0.3", + "generic-pool": "3.8.2", + "mocha": "^9.1.2", "nyc": "^15.1.0", "redis-parser": "3.0.0", - "release-it": "^14.10.1", + "release-it": "^14.11.6", "sinon": "^11.1.2", - "source-map-support": "^0.5.19", - "ts-node": "^10.1.0", - "typedoc": "^0.21.4", - "typedoc-github-wiki-theme": "^0.5.1", - "typedoc-plugin-markdown": "^3.10.4", - "typescript": "^4.3.5", + "source-map-support": "^0.5.20", + "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 5226a5b0c89..ab874090c4b 100644 --- a/benchmark/package.json +++ b/benchmark/package.json @@ -10,7 +10,7 @@ "author": "", "license": "ISC", "dependencies": { - "benny": "^3.6.15", + "benny": "3.6.15", "v3": "npm:redis@3.1.2", "v4": "file:../" } diff --git a/index.ts b/index.ts index 408cbe3b996..fb448f989c7 100644 --- a/index.ts +++ b/index.ts @@ -6,5 +6,3 @@ export const createClient = RedisClient.create; export const commandOptions = RedisClient.commandOptions; export const createCluster = RedisCluster.create; - -export { defineScript } from './lib/lua-script'; 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 ef87184193f..791c7638bad 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 00000000000..c34f34be4fa --- /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 2cf6ea4964e..e98814d0582 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 79% rename from lib/client.ts rename to lib/client/index.ts index 93afee1ff1a..1a5384f509f 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, { 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 } 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 = - (...args: Parameters | [options: CommandOptions, ...rest: Parameters]) => Promise>; +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<{}, {}> { @@ -145,7 +147,9 @@ export default class RedisClient { - const duplicate = this.duplicate(); + const duplicate = this.duplicate({ + isolationPoolOptions: undefined + }); await duplicate.connect(); return duplicate; }, @@ -267,29 +271,33 @@ export default class RedisClient { - return new (Object.getPrototypeOf(this).constructor)(this.#options); + duplicate(overrides?: Partial>): RedisClientType { + return new (Object.getPrototypeOf(this).constructor)({ + ...this.#options, + ...overrides + }); } async connect(): Promise { await this.#socket.connect(); } - async commandsExecutor(command: RedisCommand, args: Array): Promise> { + async commandsExecutor(command: RedisCommand, args: Array): Promise> { const { args: redisArgs, options } = transformCommandArguments(command, args); - return command.transformReply( + return transformCommandReply( + command, await this.#sendCommand(redisArgs, options, command.BUFFER_MODE), - redisArgs.preserve, + redisArgs.preserve ); } - sendCommand(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(); } @@ -308,16 +316,17 @@ export default class RedisClient): Promise> { + async scriptsExecutor(script: RedisScript, args: Array): Promise> { const { args: redisArgs, options } = transformCommandArguments(script, args); - return script.transformReply( + return transformCommandReply( + script, await this.executeScript(script, redisArgs, options, script.BUFFER_MODE), redisArgs.preserve ); } - async executeScript(script: RedisLuaScript, args: TransformArgumentsReply, options?: ClientCommandOptions, bufferMode?: boolean): Promise> { + async executeScript(script: RedisScript, args: RedisCommandArguments, options?: ClientCommandOptions, bufferMode?: boolean): Promise> { try { return await this.#sendCommand([ 'EVALSHA', @@ -339,8 +348,6 @@ export default class RedisClient; async SELECT(options: CommandOptions, db: number): Promise; async SELECT(options?: any, db?: any): Promise { @@ -427,14 +434,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({ @@ -506,5 +513,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 8bc94c5ba07..ca48ad4d542 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 77% rename from lib/cluster-slots.ts rename to lib/cluster/cluster-slots.ts index a5155cc53db..63834d4b4ca 100644 --- a/lib/cluster-slots.ts +++ b/lib/cluster/cluster-slots.ts @@ -1,17 +1,15 @@ import calculateSlot from 'cluster-key-slot'; -import RedisClient, { RedisClientType } from './client'; -import { RedisSocketOptions } from './socket'; -import { RedisClusterMasterNode, RedisClusterReplicaNode } from './commands/CLUSTER_NODES'; -import { RedisClusterOptions } from './cluster'; -import { RedisModules } from './commands'; -import { RedisLuaScripts } from './lua-script'; - -export interface ClusterNode { +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 { id: string; client: RedisClientType; } -interface SlotNodes { +interface SlotNodes { master: ClusterNode; replicas: Array>; clientIterator: IterableIterator> | undefined; @@ -19,41 +17,41 @@ 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; } async connect(): Promise { for (const rootNode of this.#options.rootNodes) { - if (await this.#discoverNodes(rootNode)) return; + if (await this.#discoverNodes(this.#clientOptionsDefaults(rootNode))) return; } throw new Error('None of the root nodes is available'); } async discover(startWith: RedisClientType): Promise { - if (await this.#discoverNodes(startWith.options?.socket)) return; + if (await this.#discoverNodes(startWith.options)) return; for (const { client } of this.#nodeByUrl.values()) { if (client === startWith) continue; - if (await this.#discoverNodes(client.options?.socket)) return; + if (await this.#discoverNodes(client.options)) return; } throw new Error('None of the cluster nodes is available'); } - async #discoverNodes(socketOptions?: RedisSocketOptions): Promise { - const client = RedisClient.create({ - socket: socketOptions - }); + async #discoverNodes(clientOptions?: RedisClusterClientOptions): Promise { + const client = new this.#Client(clientOptions); await client.connect(); @@ -101,6 +99,18 @@ export default class RedisClusterSlots, promises: Array>): ClusterNode { const url = `${nodeData.host}:${nodeData.port}`; clientsInUse.add(url); @@ -109,13 +119,15 @@ export default class RedisClusterSlots { it('sendCommand', async () => { const cluster = RedisCluster.create({ - rootNodes: TEST_REDIS_CLUSTERES[TestRedisClusters.OPEN], + ...TEST_REDIS_CLUSTERES[TestRedisClusters.OPEN], useReplicas: true }); 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'); @@ -31,18 +31,17 @@ describe('Cluster', () => { itWithCluster(TestRedisClusters.OPEN, 'multi', async cluster => { const key = 'key'; assert.deepEqual( - await cluster.multi(key) - .ping() + await cluster.multi() .set(key, 'value') .get(key) .exec(), - ['PONG', 'OK', 'value'] + ['OK', 'value'] ); }); it('scripts', async () => { const cluster = RedisCluster.create({ - rootNodes: TEST_REDIS_CLUSTERES[TestRedisClusters.OPEN], + ...TEST_REDIS_CLUSTERES[TestRedisClusters.OPEN], scripts: { add: defineScript({ NUMBER_OF_KEYS: 0, diff --git a/lib/cluster.ts b/lib/cluster/index.ts similarity index 61% rename from lib/cluster.ts rename to lib/cluster/index.ts index 4be0e268207..aeaabecae35 100644 --- a/lib/cluster.ts +++ b/lib/cluster/index.ts @@ -1,25 +1,35 @@ -import { RedisCommand, RedisModules, TransformArgumentsReply } from './commands'; -import RedisClient, { ClientCommandOptions, RedisClientType, WithPlugins } from './client'; -import { RedisSocketOptions } from './socket'; +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 } 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 interface RedisClusterOptions { - rootNodes: Array; +export type RedisClusterClientOptions = Omit, 'modules' | 'scripts'>; + +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') { @@ -29,7 +39,7 @@ export default class RedisCluster(options?: RedisClusterOptions): RedisClusterType { + static create(options?: RedisClusterOptions): RedisClusterType { return new (extendWithModulesAndScripts({ BaseClass: RedisCluster, modules: options?.modules, @@ -39,32 +49,36 @@ 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(overrides?: Partial>): RedisClusterType { + return new (Object.getPrototypeOf(this).constructor)({ + ...this.#options, + ...overrides + }); } async connect(): Promise { return this.#slots.connect(); } - async commandsExecutor(command: RedisCommand, args: Array): Promise> { + async commandsExecutor(command: RedisCommand, args: Array): Promise> { const { args: redisArgs, options } = transformCommandArguments(command, args); - const reply = command.transformReply( + return transformCommandReply( + command, await this.sendCommand( - RedisCluster.#extractFirstKey(command, args, redisArgs), + RedisCluster.extractFirstKey(command, args, redisArgs), command.IS_READ_ONLY, redisArgs, options, @@ -72,18 +86,16 @@ export default class RedisCluster( firstKey: string | Buffer | undefined, isReadonly: boolean | undefined, - args: TransformArgumentsReply, + args: RedisCommandArguments, options?: ClientCommandOptions, bufferMode?: boolean, redirections = 0 - ): Promise> { + ): Promise> { const client = this.#slots.getClient(firstKey, isReadonly); try { @@ -100,10 +112,11 @@ export default class RedisCluster): Promise> { + async scriptsExecutor(script: RedisScript, args: Array): Promise> { const { args: redisArgs, options } = transformCommandArguments(script, args); - const reply = script.transformReply( + return transformCommandReply( + script, await this.executeScript( script, args, @@ -112,19 +125,17 @@ export default class RedisCluster, - redisArgs: TransformArgumentsReply, + redisArgs: RedisCommandArguments, options?: ClientCommandOptions, redirections = 0 - ): Promise> { + ): Promise> { const client = this.#slots.getClient( - RedisCluster.#extractFirstKey(script, originalArgs, redisArgs), + RedisCluster.extractFirstKey(script, originalArgs, redisArgs), script.IS_READ_ONLY ); @@ -169,20 +180,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 +204,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 78823516448..5871c2f235b 100644 --- a/lib/commander.ts +++ b/lib/commander.ts @@ -1,37 +1,32 @@ -import COMMANDS, { RedisCommand, RedisModules, 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) { @@ -106,3 +101,15 @@ export function* encodeCommand(args: TransformArgumentsReply): IterableIterator< yield DELIMITER; } } + +export function transformCommandReply( + command: RedisCommand, + rawReply: RedisCommandRawReply, + preserved: unknown +): RedisCommandReply { + if (!command.transformReply) { + return rawReply; + } + + return command.transformReply(rawReply, preserved); +} diff --git a/lib/commands/ACL_CAT.ts b/lib/commands/ACL_CAT.ts index d1620ef1584..f11be873961 100644 --- a/lib/commands/ACL_CAT.ts +++ b/lib/commands/ACL_CAT.ts @@ -1,5 +1,3 @@ -import { transformReplyStringArray } from './generic-transformers'; - export function transformArguments(categoryName?: string): Array { const args = ['ACL', 'CAT']; @@ -10,4 +8,4 @@ export function transformArguments(categoryName?: string): Array { return args; } -export const transformReply = transformReplyStringArray; +export declare function transformReply(): Array; diff --git a/lib/commands/ACL_DELUSER.ts b/lib/commands/ACL_DELUSER.ts index 85a916c4379..97f50d48945 100644 --- a/lib/commands/ACL_DELUSER.ts +++ b/lib/commands/ACL_DELUSER.ts @@ -1,8 +1,8 @@ -import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; +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); } -export const transformReply = transformReplyNumber; +export declare const transformReply: (reply: number) => number; diff --git a/lib/commands/ACL_GENPASS.ts b/lib/commands/ACL_GENPASS.ts index ec55aebdb07..6a36c396619 100644 --- a/lib/commands/ACL_GENPASS.ts +++ b/lib/commands/ACL_GENPASS.ts @@ -1,5 +1,3 @@ -import { transformReplyString } from './generic-transformers'; - export function transformArguments(bits?: number): Array { const args = ['ACL', 'GENPASS']; @@ -10,4 +8,4 @@ export function transformArguments(bits?: number): Array { return args; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/ACL_LIST.ts b/lib/commands/ACL_LIST.ts index 3f2845b907a..a2caae82c46 100644 --- a/lib/commands/ACL_LIST.ts +++ b/lib/commands/ACL_LIST.ts @@ -1,7 +1,5 @@ -import { transformReplyStringArray } from './generic-transformers'; - export function transformArguments(): Array { return ['ACL', 'LIST']; } -export const transformReply = transformReplyStringArray; +export declare function transformReply(): Array; diff --git a/lib/commands/ACL_LOAD.ts b/lib/commands/ACL_LOAD.ts index 59418614ed3..0a5ea85101d 100644 --- a/lib/commands/ACL_LOAD.ts +++ b/lib/commands/ACL_LOAD.ts @@ -1,7 +1,5 @@ -import { transformReplyString } from './generic-transformers'; - export function transformArguments(): Array { return ['ACL', 'LOAD']; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/ACL_LOG_RESET.ts b/lib/commands/ACL_LOG_RESET.ts index 30b8ccb20c7..5bfd7ae9392 100644 --- a/lib/commands/ACL_LOG_RESET.ts +++ b/lib/commands/ACL_LOG_RESET.ts @@ -1,7 +1,5 @@ -import { transformReplyString } from './generic-transformers'; - export function transformArguments(): Array { return ['ACL', 'LOG', 'RESET']; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/ACL_SAVE.ts b/lib/commands/ACL_SAVE.ts index 5b9c7b84cc3..af9abeb1d5c 100644 --- a/lib/commands/ACL_SAVE.ts +++ b/lib/commands/ACL_SAVE.ts @@ -1,7 +1,5 @@ -import { transformReplyString } from './generic-transformers'; - export function transformArguments(): Array { return ['ACL', 'SAVE']; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/ACL_SETUSER.ts b/lib/commands/ACL_SETUSER.ts index e55a8942e02..d8734f0a1ca 100644 --- a/lib/commands/ACL_SETUSER.ts +++ b/lib/commands/ACL_SETUSER.ts @@ -1,8 +1,8 @@ -import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyString } from './generic-transformers'; +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); } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/ACL_USERS.ts b/lib/commands/ACL_USERS.ts index f9e837a4347..91f391a5b73 100644 --- a/lib/commands/ACL_USERS.ts +++ b/lib/commands/ACL_USERS.ts @@ -1,7 +1,5 @@ -import { transformReplyStringArray } from './generic-transformers'; - export function transformArguments(): Array { return ['ACL', 'USERS']; } -export const transformReply = transformReplyStringArray; +export declare function transformReply(): Array; diff --git a/lib/commands/ACL_WHOAMI.ts b/lib/commands/ACL_WHOAMI.ts index 3fc70649f87..c855eeb1aa7 100644 --- a/lib/commands/ACL_WHOAMI.ts +++ b/lib/commands/ACL_WHOAMI.ts @@ -1,7 +1,5 @@ -import { transformReplyString } from './generic-transformers'; - export function transformArguments(): Array { return ['ACL', 'WHOAMI']; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/APPEND.ts b/lib/commands/APPEND.ts index f64e835113c..a162dc1381c 100644 --- a/lib/commands/APPEND.ts +++ b/lib/commands/APPEND.ts @@ -1,9 +1,7 @@ -import { transformReplyString } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string, value: string): Array { return ['APPEND', key, value]; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/ASKING.ts b/lib/commands/ASKING.ts index 3f836131ac1..8071ec20180 100644 --- a/lib/commands/ASKING.ts +++ b/lib/commands/ASKING.ts @@ -1,7 +1,5 @@ -import { transformReplyString } from './generic-transformers'; - export function transformArguments(): Array { return ['ASKING']; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/AUTH.ts b/lib/commands/AUTH.ts index 750f0f54354..eb2449208a8 100644 --- a/lib/commands/AUTH.ts +++ b/lib/commands/AUTH.ts @@ -1,5 +1,3 @@ -import { transformReplyString } from './generic-transformers'; - export interface AuthOptions { username?: string; password: string; @@ -13,4 +11,4 @@ export function transformArguments({username, password}: AuthOptions): Array { return ['BGREWRITEAOF']; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/BGSAVE.ts b/lib/commands/BGSAVE.ts index f09f906ade7..fba9e37ed76 100644 --- a/lib/commands/BGSAVE.ts +++ b/lib/commands/BGSAVE.ts @@ -1,5 +1,3 @@ -import { transformReplyString } from './generic-transformers'; - interface BgSaveOptions { SCHEDULE?: true; } @@ -14,4 +12,4 @@ export function transformArguments(options?: BgSaveOptions): Array { return args; } -export const transformReply = transformReplyString; \ No newline at end of file +export declare function transformReply(): string; diff --git a/lib/commands/BITCOUNT.ts b/lib/commands/BITCOUNT.ts index 1aececc377e..320d8f3acb7 100644 --- a/lib/commands/BITCOUNT.ts +++ b/lib/commands/BITCOUNT.ts @@ -1,5 +1,3 @@ -import { transformReplyNumber } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export const IS_READ_ONLY = true; @@ -22,4 +20,4 @@ export function transformArguments(key: string, range?: BitCountRange): Array; diff --git a/lib/commands/BITOP.ts b/lib/commands/BITOP.ts index bb965da6dfa..af31f42f1dc 100644 --- a/lib/commands/BITOP.ts +++ b/lib/commands/BITOP.ts @@ -1,12 +1,12 @@ -import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; +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); } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/BITPOS.ts b/lib/commands/BITPOS.ts index bebc45b03c3..86f539f2dda 100644 --- a/lib/commands/BITPOS.ts +++ b/lib/commands/BITPOS.ts @@ -1,4 +1,4 @@ -import { BitValue, transformReplyNumber } from './generic-transformers'; +import { BitValue } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -18,4 +18,4 @@ export function transformArguments(key: string, bit: BitValue, start?: number, e return args; } -export const transformReply = transformReplyNumber; \ No newline at end of file +export declare function transformReply(): number; diff --git a/lib/commands/BLMOVE.ts b/lib/commands/BLMOVE.ts index 74a2eed4aa5..461a146e7a3 100644 --- a/lib/commands/BLMOVE.ts +++ b/lib/commands/BLMOVE.ts @@ -1,4 +1,3 @@ -import { transformReplyStringNull } from './generic-transformers'; import { LMoveSide } from './LMOVE'; export const FIRST_KEY_INDEX = 1; @@ -20,4 +19,4 @@ export function transformArguments( ]; } -export const transformReply = transformReplyStringNull; +export declare function transformReply(): string | null; diff --git a/lib/commands/BLPOP.ts b/lib/commands/BLPOP.ts index 1061f5e113a..15c52722941 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 93ded4dbf1a..602ce9c7913 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/BRPOPLPUSH.ts b/lib/commands/BRPOPLPUSH.ts index f6a3bc1b8a6..3f6aed35be1 100644 --- a/lib/commands/BRPOPLPUSH.ts +++ b/lib/commands/BRPOPLPUSH.ts @@ -1,9 +1,7 @@ -import { transformReplyNumberNull } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(source: string, destination: string, timeout: number): Array { return ['BRPOPLPUSH', source, destination, timeout.toString()]; } -export const transformReply = transformReplyNumberNull; +export declare function transformReply(): number | null; diff --git a/lib/commands/BZPOPMAX.spec.ts b/lib/commands/BZPOPMAX.spec.ts index c4bcc321b29..090dfba096d 100644 --- a/lib/commands/BZPOPMAX.spec.ts +++ b/lib/commands/BZPOPMAX.spec.ts @@ -2,7 +2,6 @@ import { strict as assert } from 'assert'; import { TestRedisServers, itWithClient } from '../test-utils'; import { transformArguments, transformReply } from './BZPOPMAX'; import { commandOptions } from '../../index'; -import { describe } from 'mocha'; describe('BZPOPMAX', () => { describe('transformArguments', () => { diff --git a/lib/commands/BZPOPMAX.ts b/lib/commands/BZPOPMAX.ts index 3db9ca42cbb..eb6647ce9e3 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 9106ae770da..75b092e543b 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/CLIENT_ID.ts b/lib/commands/CLIENT_ID.ts index baeab148eba..a57e392ade6 100644 --- a/lib/commands/CLIENT_ID.ts +++ b/lib/commands/CLIENT_ID.ts @@ -1,9 +1,7 @@ -import { transformReplyNumber } from './generic-transformers'; - export const IS_READ_ONLY = true; export function transformArguments(): Array { return ['CLIENT', 'ID']; } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/CLUSTER_ADDSLOTS.ts b/lib/commands/CLUSTER_ADDSLOTS.ts index 594eae77c75..e458b8aab91 100644 --- a/lib/commands/CLUSTER_ADDSLOTS.ts +++ b/lib/commands/CLUSTER_ADDSLOTS.ts @@ -1,5 +1,3 @@ -import { transformReplyString } from './generic-transformers'; - export function transformArguments(slots: number | Array): Array { const args = ['CLUSTER', 'ADDSLOTS']; @@ -12,4 +10,4 @@ export function transformArguments(slots: number | Array): Array return args; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/CLUSTER_FLUSHSLOTS.ts b/lib/commands/CLUSTER_FLUSHSLOTS.ts index 28fbcc1fab1..285c9fd26fe 100644 --- a/lib/commands/CLUSTER_FLUSHSLOTS.ts +++ b/lib/commands/CLUSTER_FLUSHSLOTS.ts @@ -1,7 +1,5 @@ -import { transformReplyString } from './generic-transformers'; - export function transformArguments(): Array { return ['CLUSTER', 'FLUSHSLOTS']; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/CLUSTER_GETKEYSINSLOT.ts b/lib/commands/CLUSTER_GETKEYSINSLOT.ts index c5719848cf5..67c5cbafb77 100644 --- a/lib/commands/CLUSTER_GETKEYSINSLOT.ts +++ b/lib/commands/CLUSTER_GETKEYSINSLOT.ts @@ -1,7 +1,5 @@ -import { transformReplyString } from './generic-transformers'; - export function transformArguments(slot: number, count: number): Array { return ['CLUSTER', 'GETKEYSINSLOT', slot.toString(), count.toString()]; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/CLUSTER_INFO.spec.ts b/lib/commands/CLUSTER_INFO.spec.ts index ce41151b67f..a4def45cb79 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_MEET.ts b/lib/commands/CLUSTER_MEET.ts index 19da150356c..54a0bf708a8 100644 --- a/lib/commands/CLUSTER_MEET.ts +++ b/lib/commands/CLUSTER_MEET.ts @@ -1,7 +1,5 @@ -import { transformReplyString } from './generic-transformers'; - export function transformArguments(ip: string, port: number): Array { return ['CLUSTER', 'MEET', ip, port.toString()]; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/CLUSTER_NODES.spec.ts b/lib/commands/CLUSTER_NODES.spec.ts index 1f0e9dd425a..2b3881d8cd0 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_RESET.ts b/lib/commands/CLUSTER_RESET.ts index ec27b45eeb7..3e7c5bb52fb 100644 --- a/lib/commands/CLUSTER_RESET.ts +++ b/lib/commands/CLUSTER_RESET.ts @@ -1,5 +1,3 @@ -import { transformReplyString } from './generic-transformers'; - export type ClusterResetModes = 'HARD' | 'SOFT'; export function transformArguments(mode?: ClusterResetModes): Array { @@ -12,4 +10,4 @@ export function transformArguments(mode?: ClusterResetModes): Array { return args; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/CLUSTER_SETSLOT.ts b/lib/commands/CLUSTER_SETSLOT.ts index c665b349622..591b5fb9632 100644 --- a/lib/commands/CLUSTER_SETSLOT.ts +++ b/lib/commands/CLUSTER_SETSLOT.ts @@ -1,5 +1,3 @@ -import { transformReplyString } from './generic-transformers'; - export enum ClusterSlotStates { IMPORTING = 'IMPORTING', MIGRATING = 'MIGRATING', @@ -17,4 +15,4 @@ export function transformArguments(slot: number, state: ClusterSlotStates, nodeI return args; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/CLUSTER_SLOTS.ts b/lib/commands/CLUSTER_SLOTS.ts index b4672e731ac..afe1ebc83dd 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.spec.ts b/lib/commands/COMMAND.spec.ts new file mode 100644 index 00000000000..1f036dadc17 --- /dev/null +++ b/lib/commands/COMMAND.spec.ts @@ -0,0 +1,30 @@ +import { strict as assert } from 'assert'; +import { itWithClient, TestRedisServers } from '../test-utils'; +import { transformArguments } from './COMMAND'; +import { CommandCategories, CommandFlags } from './generic-transformers'; + +describe('COMMAND', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments(), + ['COMMAND'] + ); + }); + + itWithClient(TestRedisServers.OPEN, 'client.command', async client => { + assert.deepEqual( + (await client.command()).find(command => command.name === 'ping'), + { + name: 'ping', + arity: -1, + flags: new Set([CommandFlags.STALE, CommandFlags.FAST]), + firstKeyIndex: 0, + lastKeyIndex: 0, + step: 0, + categories: new Set([CommandCategories.FAST, CommandCategories.CONNECTION]) + } + ); + }, { + minimumRedisVersion: [6] + }); +}); diff --git a/lib/commands/COMMAND.ts b/lib/commands/COMMAND.ts new file mode 100644 index 00000000000..b6ee50b2f4c --- /dev/null +++ b/lib/commands/COMMAND.ts @@ -0,0 +1,12 @@ +import { RedisCommandArguments } from '.'; +import { CommandRawReply, CommandReply, transformCommandReply } from './generic-transformers'; + +export const IS_READ_ONLY = true; + +export function transformArguments(): RedisCommandArguments { + return ['COMMAND']; +} + +export function transformReply(reply: Array): Array { + return reply.map(transformCommandReply); +} diff --git a/lib/commands/COMMAND_COUNT.spec.ts b/lib/commands/COMMAND_COUNT.spec.ts new file mode 100644 index 00000000000..23e83c71cec --- /dev/null +++ b/lib/commands/COMMAND_COUNT.spec.ts @@ -0,0 +1,19 @@ +import { strict as assert } from 'assert'; +import { TestRedisServers, itWithClient } from '../test-utils'; +import { transformArguments } from './COMMAND_COUNT'; + +describe('COMMAND COUNT', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments(), + ['COMMAND', 'COUNT'] + ); + }); + + itWithClient(TestRedisServers.OPEN, 'client.commandCount', async client => { + assert.equal( + typeof await client.commandCount(), + 'number' + ); + }); +}); diff --git a/lib/commands/COMMAND_COUNT.ts b/lib/commands/COMMAND_COUNT.ts new file mode 100644 index 00000000000..5b8283bcc66 --- /dev/null +++ b/lib/commands/COMMAND_COUNT.ts @@ -0,0 +1,9 @@ +import { RedisCommandArguments } from '.'; + +export const IS_READ_ONLY = true; + +export function transformArguments(): RedisCommandArguments { + return ['COMMAND', 'COUNT']; +} + +declare function transformReply(): number; diff --git a/lib/commands/COMMAND_GETKEYS.spec.ts b/lib/commands/COMMAND_GETKEYS.spec.ts new file mode 100644 index 00000000000..f2630db9afa --- /dev/null +++ b/lib/commands/COMMAND_GETKEYS.spec.ts @@ -0,0 +1,19 @@ +import { strict as assert } from 'assert'; +import { TestRedisServers, itWithClient } from '../test-utils'; +import { transformArguments } from './COMMAND_GETKEYS'; + +describe('COMMAND GETKEYS', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments(['GET', 'key']), + ['COMMAND', 'GETKEYS', 'GET', 'key'] + ); + }); + + itWithClient(TestRedisServers.OPEN, 'client.commandGetKeys', async client => { + assert.deepEqual( + await client.commandGetKeys(['GET', 'key']), + ['key'] + ); + }); +}); diff --git a/lib/commands/COMMAND_GETKEYS.ts b/lib/commands/COMMAND_GETKEYS.ts new file mode 100644 index 00000000000..caf342088fb --- /dev/null +++ b/lib/commands/COMMAND_GETKEYS.ts @@ -0,0 +1,9 @@ +import { RedisCommandArguments } from '.'; + +export const IS_READ_ONLY = true; + +export function transformArguments(args: Array): RedisCommandArguments { + return ['COMMAND', 'GETKEYS', ...args]; +} + +declare function transformReply(): Array; diff --git a/lib/commands/COMMAND_INFO.spec.ts b/lib/commands/COMMAND_INFO.spec.ts new file mode 100644 index 00000000000..59a61f6680a --- /dev/null +++ b/lib/commands/COMMAND_INFO.spec.ts @@ -0,0 +1,30 @@ +import { strict as assert } from 'assert'; +import { itWithClient, TestRedisServers } from '../test-utils'; +import { transformArguments } from './COMMAND_INFO'; +import { CommandCategories, CommandFlags } from './generic-transformers'; + +describe('COMMAND INFO', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments(['PING']), + ['COMMAND', 'INFO', 'PING'] + ); + }); + + itWithClient(TestRedisServers.OPEN, 'client.commandInfo', async client => { + assert.deepEqual( + await client.commandInfo(['PING']), + [{ + name: 'ping', + arity: -1, + flags: new Set([CommandFlags.STALE, CommandFlags.FAST]), + firstKeyIndex: 0, + lastKeyIndex: 0, + step: 0, + categories: new Set([CommandCategories.FAST, CommandCategories.CONNECTION]) + }] + ); + }, { + minimumRedisVersion: [6] + }); +}); diff --git a/lib/commands/COMMAND_INFO.ts b/lib/commands/COMMAND_INFO.ts new file mode 100644 index 00000000000..6f84d0edaf9 --- /dev/null +++ b/lib/commands/COMMAND_INFO.ts @@ -0,0 +1,12 @@ +import { RedisCommandArguments } from '.'; +import { CommandRawReply, CommandReply, transformCommandReply } from './generic-transformers'; + +export const IS_READ_ONLY = true; + +export function transformArguments(commands: Array): RedisCommandArguments { + return ['COMMAND', 'INFO', ...commands]; +} + +export function transformReply(reply: Array): Array { + return reply.map(command => command ? transformCommandReply(command) : null); +} diff --git a/lib/commands/CONFIG_RESETSTAT.ts b/lib/commands/CONFIG_RESETSTAT.ts index 3c87b08d88b..aba54bc3c7b 100644 --- a/lib/commands/CONFIG_RESETSTAT.ts +++ b/lib/commands/CONFIG_RESETSTAT.ts @@ -1,7 +1,5 @@ -import { transformReplyString } from './generic-transformers'; - export function transformArguments(): Array { return ['CONFIG', 'RESETSTAT']; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/CONFIG_REWRITE.ts b/lib/commands/CONFIG_REWRITE.ts index 06247517128..67984adf300 100644 --- a/lib/commands/CONFIG_REWRITE.ts +++ b/lib/commands/CONFIG_REWRITE.ts @@ -1,7 +1,5 @@ -import { transformReplyString } from './generic-transformers'; - export function transformArguments(): Array { return ['CONFIG', 'REWRITE']; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/CONFIG_SET.ts b/lib/commands/CONFIG_SET.ts index 894a95cb1cc..ec09e4469fa 100644 --- a/lib/commands/CONFIG_SET.ts +++ b/lib/commands/CONFIG_SET.ts @@ -1,7 +1,5 @@ -import { transformReplyString } from './generic-transformers'; - export function transformArguments(parameter: string, value: string): Array { return ['CONFIG', 'SET', parameter, value]; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/DBSIZE.spec.ts b/lib/commands/DBSIZE.spec.ts index 87e3c154534..36f591dbd29 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/DBSIZE.ts b/lib/commands/DBSIZE.ts index 72933930f70..6b442ec33a2 100644 --- a/lib/commands/DBSIZE.ts +++ b/lib/commands/DBSIZE.ts @@ -1,9 +1,7 @@ -import { transformReplyNumber } from './generic-transformers'; - export const IS_READ_ONLY = true; export function transformArguments(): Array { return ['DBSIZE']; } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/DECR.ts b/lib/commands/DECR.ts index cac6e07f053..e30d2aaf29c 100644 --- a/lib/commands/DECR.ts +++ b/lib/commands/DECR.ts @@ -1,9 +1,7 @@ -import { transformReplyNumber } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string): Array { return ['DECR', key]; } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/DECRBY.ts b/lib/commands/DECRBY.ts index cc163cbe824..561eb9491c4 100644 --- a/lib/commands/DECRBY.ts +++ b/lib/commands/DECRBY.ts @@ -1,9 +1,7 @@ -import { transformReplyNumber } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string, decrement: number): Array { return ['DECRBY', key, decrement.toString()]; } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/DEL.ts b/lib/commands/DEL.ts index f96b6988f1c..02ef553f647 100644 --- a/lib/commands/DEL.ts +++ b/lib/commands/DEL.ts @@ -1,8 +1,8 @@ -import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; +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); } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/DISCARD.ts b/lib/commands/DISCARD.ts index b5aaf45cc8d..444f800db80 100644 --- a/lib/commands/DISCARD.ts +++ b/lib/commands/DISCARD.ts @@ -1,7 +1,5 @@ -import { transformReplyString } from './generic-transformers'; - export function transformArguments(): Array { return ['DISCARD']; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/DUMP.ts b/lib/commands/DUMP.ts index 1c72110f21f..de85b889bb9 100644 --- a/lib/commands/DUMP.ts +++ b/lib/commands/DUMP.ts @@ -1,7 +1,5 @@ -import { transformReplyString } from './generic-transformers'; - export function transformArguments(key: string): Array { return ['DUMP', key]; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/ECHO.spec.ts b/lib/commands/ECHO.spec.ts index 4a1bf8fe378..d91b7373950 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/ECHO.ts b/lib/commands/ECHO.ts index 007b8f27646..75a91d4ac91 100644 --- a/lib/commands/ECHO.ts +++ b/lib/commands/ECHO.ts @@ -1,9 +1,7 @@ -import { transformReplyString } from './generic-transformers'; - export const IS_READ_ONLY = true; export function transformArguments(message: string): Array { return ['ECHO', message]; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/EVAL.ts b/lib/commands/EVAL.ts index 89645df9f3e..f269815b7ec 100644 --- a/lib/commands/EVAL.ts +++ b/lib/commands/EVAL.ts @@ -3,7 +3,3 @@ import { EvalOptions, pushEvalArguments } from './generic-transformers'; export function transformArguments(script: string, options?: EvalOptions): Array { return pushEvalArguments(['EVAL', script], options); } - -export function transformReply(reply: unknown): unknown { - return reply; -} diff --git a/lib/commands/EVALSHA.ts b/lib/commands/EVALSHA.ts index a81595bc4c0..105784cf5f8 100644 --- a/lib/commands/EVALSHA.ts +++ b/lib/commands/EVALSHA.ts @@ -3,7 +3,3 @@ import { EvalOptions, pushEvalArguments } from './generic-transformers'; export function transformArguments(sha1: string, options?: EvalOptions): Array { return pushEvalArguments(['EVALSHA', sha1], options); } - -export function transformReply(reply: unknown): unknown { - return reply; -} diff --git a/lib/commands/EXISTS.ts b/lib/commands/EXISTS.ts index 00d10b9eebc..aac164fc953 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/FAILOVER.ts b/lib/commands/FAILOVER.ts index 11ccb32a5cf..c31dbc063de 100644 --- a/lib/commands/FAILOVER.ts +++ b/lib/commands/FAILOVER.ts @@ -1,5 +1,3 @@ -import { transformReplyString } from './generic-transformers'; - interface FailoverOptions { TO?: { host: string; @@ -32,4 +30,4 @@ export function transformArguments(options?: FailoverOptions): Array { return args; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/FLUSHALL.ts b/lib/commands/FLUSHALL.ts index 4be3474f7e2..967096bb9bd 100644 --- a/lib/commands/FLUSHALL.ts +++ b/lib/commands/FLUSHALL.ts @@ -1,5 +1,3 @@ -import { transformReplyString } from './generic-transformers'; - export enum RedisFlushModes { ASYNC = 'ASYNC', SYNC = 'SYNC' @@ -15,4 +13,4 @@ export function transformArguments(mode?: RedisFlushModes): Array { return args; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/FLUSHDB.ts b/lib/commands/FLUSHDB.ts index a85c0933c4c..5b8060df9eb 100644 --- a/lib/commands/FLUSHDB.ts +++ b/lib/commands/FLUSHDB.ts @@ -1,5 +1,4 @@ import { RedisFlushModes } from './FLUSHALL'; -import { transformReplyString } from './generic-transformers'; export function transformArguments(mode?: RedisFlushModes): Array { const args = ['FLUSHDB']; @@ -11,4 +10,4 @@ export function transformArguments(mode?: RedisFlushModes): Array { return args; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/GEOADD.ts b/lib/commands/GEOADD.ts index 1236563d541..7f5ac5533e3 100644 --- a/lib/commands/GEOADD.ts +++ b/lib/commands/GEOADD.ts @@ -1,4 +1,4 @@ -import { GeoCoordinates, transformReplyNumber } from './generic-transformers'; +import { GeoCoordinates } from './generic-transformers'; interface GeoMember extends GeoCoordinates { member: string; @@ -46,4 +46,4 @@ export function transformArguments(key: string, toAdd: GeoMember | Array { }); }); - itWithClient(TestRedisServers.OPEN, 'client.geoDist', async client => { - assert.equal( - await client.geoDist('key', '1', '2'), - null - ); + describe('client.geoDist', () => { + itWithClient(TestRedisServers.OPEN, 'null', async client => { + assert.equal( + await client.geoDist('key', '1', '2'), + null + ); + }); + + itWithClient(TestRedisServers.OPEN, 'with value', async client => { + const [, dist] = await Promise.all([ + client.geoAdd('key', [{ + member: '1', + longitude: 1, + latitude: 1 + }, { + member: '2', + longitude: 2, + latitude: 2 + }]), + client.geoDist('key', '1', '2') + ]); + + assert.equal( + dist, + 157270.0561 + ); + }); }); itWithCluster(TestRedisClusters.OPEN, 'cluster.geoDist', async cluster => { diff --git a/lib/commands/GEOHASH.ts b/lib/commands/GEOHASH.ts index a95ae443408..8613f37fa43 100644 --- a/lib/commands/GEOHASH.ts +++ b/lib/commands/GEOHASH.ts @@ -1,12 +1,12 @@ -import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyStringArray } from './generic-transformers'; +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); } -export const transformReply = transformReplyStringArray; +export declare function transformReply(): Array; diff --git a/lib/commands/GEOPOS.ts b/lib/commands/GEOPOS.ts index 893048cf6da..95f33d9e3a8 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.ts b/lib/commands/GEOSEARCH.ts index 3872f11c6cb..5453a2ae1b1 100644 --- a/lib/commands/GEOSEARCH.ts +++ b/lib/commands/GEOSEARCH.ts @@ -1,4 +1,4 @@ -import { GeoSearchFrom, GeoSearchBy, GeoSearchOptions, pushGeoSearchArguments, transformReplyStringArray } from './generic-transformers'; +import { GeoSearchFrom, GeoSearchBy, GeoSearchOptions, pushGeoSearchArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -13,4 +13,4 @@ export function transformArguments( return pushGeoSearchArguments(['GEOSEARCH'], key, from, by, options); } -export const transformReply = transformReplyStringArray; +export declare function transformReply(): Array; diff --git a/lib/commands/GEOSEARCH_WITH.spec.ts b/lib/commands/GEOSEARCH_WITH.spec.ts index a400fb965c6..922c00d7194 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 ef19ca5dfc9..cd461c9677f 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 541790e54e4..0e89a4e6a74 100644 --- a/lib/commands/GET.ts +++ b/lib/commands/GET.ts @@ -1,12 +1,11 @@ -import { TransformArgumentsReply } from '.'; -import { transformReplyStringNull } from './generic-transformers'; +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]; } -export const transformReply = transformReplyStringNull; +export declare function transformReply(): string | null; diff --git a/lib/commands/GETBIT.ts b/lib/commands/GETBIT.ts index c7e878f75a8..1e5fd884251 100644 --- a/lib/commands/GETBIT.ts +++ b/lib/commands/GETBIT.ts @@ -1,4 +1,4 @@ -import { transformReplyBit } from './generic-transformers'; +import { BitValue } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -8,4 +8,4 @@ export function transformArguments(key: string, offset: number): Array { return ['GETBIT', key, offset.toString()]; } -export const transformReply = transformReplyBit; +export declare function transformReply(): BitValue; diff --git a/lib/commands/GETDEL.ts b/lib/commands/GETDEL.ts index 218e057637d..de99cc6357b 100644 --- a/lib/commands/GETDEL.ts +++ b/lib/commands/GETDEL.ts @@ -1,9 +1,7 @@ -import { transformReplyStringNull } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string): Array { return ['GETDEL', key]; } -export const transformReply = transformReplyStringNull; +export declare function transformReply(): string | null; diff --git a/lib/commands/GETEX.ts b/lib/commands/GETEX.ts index 214dae5c7ab..cd4f283eee3 100644 --- a/lib/commands/GETEX.ts +++ b/lib/commands/GETEX.ts @@ -1,5 +1,5 @@ -import { TransformArgumentsReply } from '.'; -import { transformEXAT, transformPXAT, transformReplyStringNull } from './generic-transformers'; +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) { @@ -33,4 +33,4 @@ export function transformArguments(key: string, mode: GetExModes): TransformArgu return args; } -export const transformReply = transformReplyStringNull; +export declare function transformReply(): string | null; diff --git a/lib/commands/GETRANGE.ts b/lib/commands/GETRANGE.ts index 9488dd53d5e..babb0a6a7c2 100644 --- a/lib/commands/GETRANGE.ts +++ b/lib/commands/GETRANGE.ts @@ -1,5 +1,3 @@ -import { transformReplyString } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export const IS_READ_ONLY = true; @@ -8,4 +6,4 @@ export function transformArguments(key: string, start: number, end: number): Arr return ['GETRANGE', key, start.toString(), end.toString()]; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/GETSET.ts b/lib/commands/GETSET.ts index 1b9b9d6bc75..4d3516866fb 100644 --- a/lib/commands/GETSET.ts +++ b/lib/commands/GETSET.ts @@ -1,9 +1,7 @@ -import { transformReplyStringNull } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string, value: string): Array { return ['GETSET', key, value]; } -export const transformReply = transformReplyStringNull; +export declare function transformReply(): string | null; diff --git a/lib/commands/GET_BUFFER.ts b/lib/commands/GET_BUFFER.ts index 9d281961130..2f08ecb708a 100644 --- a/lib/commands/GET_BUFFER.ts +++ b/lib/commands/GET_BUFFER.ts @@ -1,7 +1,5 @@ -import { transformReplyBufferNull } from './generic-transformers'; - export { FIRST_KEY_INDEX, IS_READ_ONLY, transformArguments } from './GET'; export const BUFFER_MODE = true; -export const transformReply = transformReplyBufferNull; +export declare function transformReply(): Buffer | null; diff --git a/lib/commands/HDEL.ts b/lib/commands/HDEL.ts index 4785b0e67f9..58d057ebf10 100644 --- a/lib/commands/HDEL.ts +++ b/lib/commands/HDEL.ts @@ -1,10 +1,10 @@ -import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; +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); } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/HELLO.ts b/lib/commands/HELLO.ts index efb96890fcd..86dae2a1d71 100644 --- a/lib/commands/HELLO.ts +++ b/lib/commands/HELLO.ts @@ -12,7 +12,7 @@ export function transformArguments(options?: HelloOptions): Array { if (options) { args.push(options.protover.toString()); - if (options?.auth) { + if (options.auth) { args.push('AUTH', options.auth.username, options.auth.password); } diff --git a/lib/commands/HINCRBY.ts b/lib/commands/HINCRBY.ts index 192dac456e1..8f0e99d41f4 100644 --- a/lib/commands/HINCRBY.ts +++ b/lib/commands/HINCRBY.ts @@ -1,9 +1,7 @@ -import { transformReplyNumber } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string, field: string, increment: number): Array { return ['HINCRBY', key, field, increment.toString()]; } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/HINCRBYFLOAT.ts b/lib/commands/HINCRBYFLOAT.ts index 10c949b8d93..262a7d5d6b0 100644 --- a/lib/commands/HINCRBYFLOAT.ts +++ b/lib/commands/HINCRBYFLOAT.ts @@ -1,9 +1,7 @@ -import { transformReplyNumber } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string, field: string, increment: number): Array { return ['HINCRBYFLOAT', key, field, increment.toString()]; } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/HKEYS.ts b/lib/commands/HKEYS.ts index d79d2c1d134..358f08fc762 100644 --- a/lib/commands/HKEYS.ts +++ b/lib/commands/HKEYS.ts @@ -1,9 +1,7 @@ -import { transformReplyStringArray } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string): Array { return ['HKEYS', key]; } -export const transformReply = transformReplyStringArray; +export declare function transformReply(): Array; diff --git a/lib/commands/HLEN.ts b/lib/commands/HLEN.ts index ba7ccc3aed9..5c717ad7c54 100644 --- a/lib/commands/HLEN.ts +++ b/lib/commands/HLEN.ts @@ -1,9 +1,7 @@ -import { transformReplyNumber } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string): Array { return ['HLEN', key]; } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/HMGET.ts b/lib/commands/HMGET.ts index 9f26eeba640..7ca3a55b69c 100644 --- a/lib/commands/HMGET.ts +++ b/lib/commands/HMGET.ts @@ -1,12 +1,12 @@ -import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyStringArray } from './generic-transformers'; +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); } -export const transformReply = transformReplyStringArray; +export declare function transformReply(): Array; diff --git a/lib/commands/HRANDFIELD.ts b/lib/commands/HRANDFIELD.ts index e0c6ee392d5..24ca9b83d56 100644 --- a/lib/commands/HRANDFIELD.ts +++ b/lib/commands/HRANDFIELD.ts @@ -1,9 +1,7 @@ -import { transformReplyStringNull } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string): Array { return ['HRANDFIELD', key]; } -export const transformReply = transformReplyStringNull; \ No newline at end of file +export declare function transformReply(): string | null; diff --git a/lib/commands/HRANDFIELD_COUNT.ts b/lib/commands/HRANDFIELD_COUNT.ts index d615b86ee8b..c0a8b1d449f 100644 --- a/lib/commands/HRANDFIELD_COUNT.ts +++ b/lib/commands/HRANDFIELD_COUNT.ts @@ -1,4 +1,3 @@ -import { transformReplyStringArray } from './generic-transformers'; import { transformArguments as transformHRandFieldArguments } from './HRANDFIELD'; export { FIRST_KEY_INDEX } from './HRANDFIELD'; @@ -10,4 +9,4 @@ export function transformArguments(key: string, count: number): Array { ]; } -export const transformReply = transformReplyStringArray; +export declare function transformReply(): Array; diff --git a/lib/commands/HSET.spec.ts b/lib/commands/HSET.spec.ts index 601e7f967e1..e8dfe7865d3 100644 --- a/lib/commands/HSET.spec.ts +++ b/lib/commands/HSET.spec.ts @@ -26,12 +26,10 @@ describe('HSET', () => { }); it('Object', () => { - it('Array', () => { - assert.deepEqual( - transformArguments('key', { field: 'value' }), - ['HSET', 'key', 'field', 'value'] - ); - }); + assert.deepEqual( + transformArguments('key', { field: 'value' }), + ['HSET', 'key', 'field', 'value'] + ); }); }); diff --git a/lib/commands/HSET.ts b/lib/commands/HSET.ts index cbd46061ad8..1d4acd6c018 100644 --- a/lib/commands/HSET.ts +++ b/lib/commands/HSET.ts @@ -1,5 +1,4 @@ -import { TransformArgumentsReply } from '.'; -import { transformReplyString } from './generic-transformers'; +import { RedisCommandArguments } from '.'; type HSETObject = Record; @@ -15,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') { @@ -47,4 +46,4 @@ function pushObject(args: Array, object: HSETObject): void { } } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/HSTRLEN.ts b/lib/commands/HSTRLEN.ts index 4181cde8517..d0138eb3ec9 100644 --- a/lib/commands/HSTRLEN.ts +++ b/lib/commands/HSTRLEN.ts @@ -1,9 +1,7 @@ -import { transformReplyNumber } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string, field: string): Array { return ['HSTRLEN', key, field]; } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/HVALS.ts b/lib/commands/HVALS.ts index 7f924623cf3..cb17fdb29be 100644 --- a/lib/commands/HVALS.ts +++ b/lib/commands/HVALS.ts @@ -1,9 +1,7 @@ -import { transformReplyStringArray } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string): Array { return ['HVALS', key]; } -export const transformReply = transformReplyStringArray; +export declare function transformReply(): Array; diff --git a/lib/commands/INCR.ts b/lib/commands/INCR.ts index 00747f0f7e2..f7b81013258 100644 --- a/lib/commands/INCR.ts +++ b/lib/commands/INCR.ts @@ -1,9 +1,7 @@ -import { transformReplyNumber } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string): Array { return ['INCR', key]; } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/INCRBY.ts b/lib/commands/INCRBY.ts index 8fd31d03380..8f2a4406bf9 100644 --- a/lib/commands/INCRBY.ts +++ b/lib/commands/INCRBY.ts @@ -1,9 +1,7 @@ -import { transformReplyNumber } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string, increment: number): Array { return ['INCRBY', key, increment.toString()]; } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/INCRBYFLOAT.ts b/lib/commands/INCRBYFLOAT.ts index 38912cbdc94..a5f99820cb3 100644 --- a/lib/commands/INCRBYFLOAT.ts +++ b/lib/commands/INCRBYFLOAT.ts @@ -1,9 +1,7 @@ -import { transformReplyString } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string, increment: number): Array { return ['INCRBYFLOAT', key, increment.toString()]; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/INFO.ts b/lib/commands/INFO.ts index 437b5e5b83b..8ab24221b26 100644 --- a/lib/commands/INFO.ts +++ b/lib/commands/INFO.ts @@ -1,5 +1,3 @@ -import { transformReplyString } from './generic-transformers'; - export const IS_READ_ONLY = true; export function transformArguments(section?: string): Array { @@ -12,4 +10,4 @@ export function transformArguments(section?: string): Array { return args; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/LASTSAVE.spec.ts b/lib/commands/LASTSAVE.spec.ts index 1b13bed5d20..b8d801f70b5 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/LINDEX.ts b/lib/commands/LINDEX.ts index 0237a4705b1..9a89b41da55 100644 --- a/lib/commands/LINDEX.ts +++ b/lib/commands/LINDEX.ts @@ -1,5 +1,3 @@ -import { transformReplyNumberNull } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export const IS_READ_ONLY = true; @@ -8,4 +6,4 @@ export function transformArguments(key: string, element: string): Array return ['LINDEX', key, element]; } -export const transformReply = transformReplyNumberNull; +export declare function transformReply(): number | null; diff --git a/lib/commands/LINSERT.ts b/lib/commands/LINSERT.ts index 40bd4e3d4df..b1d377f92aa 100644 --- a/lib/commands/LINSERT.ts +++ b/lib/commands/LINSERT.ts @@ -1,5 +1,3 @@ -import { transformReplyNumber } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; type LInsertPosition = 'BEFORE' | 'AFTER'; @@ -19,4 +17,4 @@ export function transformArguments( ]; } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/LLEN.ts b/lib/commands/LLEN.ts index 61aae604c97..49ac1d1916c 100644 --- a/lib/commands/LLEN.ts +++ b/lib/commands/LLEN.ts @@ -1,5 +1,3 @@ -import { transformReplyNumber } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export const IS_READ_ONLY = true; @@ -8,4 +6,4 @@ export function transformArguments(key: string): Array { return ['LLEN', key]; } -export const transformReply = transformReplyNumber; \ No newline at end of file +export declare function transformReply(): number; diff --git a/lib/commands/LMOVE.ts b/lib/commands/LMOVE.ts index 1e99297d812..111e758a0a4 100644 --- a/lib/commands/LMOVE.ts +++ b/lib/commands/LMOVE.ts @@ -1,5 +1,3 @@ -import { transformReplyStringNull } from './generic-transformers'; - export type LMoveSide = 'LEFT' | 'RIGHT'; export const FIRST_KEY_INDEX = 1; @@ -19,4 +17,4 @@ export function transformArguments( ]; } -export const transformReply = transformReplyStringNull; +export declare function transformReply(): string | null; diff --git a/lib/commands/LOLWUT.spec.ts b/lib/commands/LOLWUT.spec.ts index 8e77b85b599..8f4478aecc7 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/LOLWUT.ts b/lib/commands/LOLWUT.ts index f0cd20d4471..cfe01adbcf2 100644 --- a/lib/commands/LOLWUT.ts +++ b/lib/commands/LOLWUT.ts @@ -1,5 +1,3 @@ -import { transformReplyString } from './generic-transformers'; - export const IS_READ_ONLY = true; export function transformArguments(version?: number, ...optionalArguments: Array): Array { @@ -16,4 +14,4 @@ export function transformArguments(version?: number, ...optionalArguments: Array return args; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/LPOP.ts b/lib/commands/LPOP.ts index 30595a5491a..9bf340e07c9 100644 --- a/lib/commands/LPOP.ts +++ b/lib/commands/LPOP.ts @@ -1,9 +1,7 @@ -import { transformReplyStringNull } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string): Array { return ['LPOP', key]; } -export const transformReply = transformReplyStringNull; +export declare function transformReply(): string | null; diff --git a/lib/commands/LPOP_COUNT.ts b/lib/commands/LPOP_COUNT.ts index 432d2c47c09..828b0251ff6 100644 --- a/lib/commands/LPOP_COUNT.ts +++ b/lib/commands/LPOP_COUNT.ts @@ -1,9 +1,7 @@ -import { transformReplyStringArrayNull } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string, count: number): Array { return ['LPOP', key, count.toString()]; } -export const transformReply = transformReplyStringArrayNull; +export declare function transformReply(): Array | null; diff --git a/lib/commands/LPOS.ts b/lib/commands/LPOS.ts index fc160dbcbb8..3371f01d67e 100644 --- a/lib/commands/LPOS.ts +++ b/lib/commands/LPOS.ts @@ -1,5 +1,3 @@ -import { transformReplyNumberNull } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export const IS_READ_ONLY = true; @@ -23,4 +21,4 @@ export function transformArguments(key: string, element: string, options?: LPosO return args; } -export const transformReply = transformReplyNumberNull; +export declare function transformReply(): number | null; diff --git a/lib/commands/LPOS_COUNT.ts b/lib/commands/LPOS_COUNT.ts index 2a1d3068583..b5a60317eae 100644 --- a/lib/commands/LPOS_COUNT.ts +++ b/lib/commands/LPOS_COUNT.ts @@ -1,4 +1,3 @@ -import { transformReplyNumberArray } from './generic-transformers'; import { LPosOptions } from './LPOS'; export { FIRST_KEY_INDEX, IS_READ_ONLY } from './LPOS'; @@ -19,4 +18,4 @@ export function transformArguments(key: string, element: string, count: number, return args; } -export const transformReply = transformReplyNumberArray; +export declare function transformReply(): Array; diff --git a/lib/commands/LPUSH.ts b/lib/commands/LPUSH.ts index 7416d4946ea..b9644344772 100644 --- a/lib/commands/LPUSH.ts +++ b/lib/commands/LPUSH.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; +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 const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/LPUSHX.ts b/lib/commands/LPUSHX.ts index f89623ace3a..5f92d84d3b0 100644 --- a/lib/commands/LPUSHX.ts +++ b/lib/commands/LPUSHX.ts @@ -1,10 +1,10 @@ -import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; +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); } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/LRANGE.ts b/lib/commands/LRANGE.ts index cbed9a75ded..7ea97ec4f43 100644 --- a/lib/commands/LRANGE.ts +++ b/lib/commands/LRANGE.ts @@ -1,5 +1,3 @@ -import { transformReplyStringArray } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export const IS_READ_ONLY = true; @@ -13,4 +11,4 @@ export function transformArguments(key: string, start: number, stop: number): Ar ]; } -export const transformReply = transformReplyStringArray; +export declare function transformReply(): Array; diff --git a/lib/commands/LREM.ts b/lib/commands/LREM.ts index 5eabbc9194e..b43f8a28427 100644 --- a/lib/commands/LREM.ts +++ b/lib/commands/LREM.ts @@ -1,5 +1,3 @@ -import { transformReplyNumber } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string, count: number, element: string): Array { @@ -11,4 +9,4 @@ export function transformArguments(key: string, count: number, element: string): ]; } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/LSET.ts b/lib/commands/LSET.ts index 0e910dd6a1c..1511fb9751e 100644 --- a/lib/commands/LSET.ts +++ b/lib/commands/LSET.ts @@ -1,5 +1,3 @@ -import { transformReplyString } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string, index: number, element: string): Array { @@ -11,4 +9,4 @@ export function transformArguments(key: string, index: number, element: string): ]; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/LTRIM.ts b/lib/commands/LTRIM.ts index 3ccfa751af6..018afd90a15 100644 --- a/lib/commands/LTRIM.ts +++ b/lib/commands/LTRIM.ts @@ -1,5 +1,3 @@ -import { transformReplyString } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string, start: number, stop: number): Array { @@ -11,4 +9,4 @@ export function transformArguments(key: string, start: number, stop: number): Ar ] } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/MEMORY_DOCTOR.spec.ts b/lib/commands/MEMORY_DOCTOR.spec.ts index da883deeb77..1b4d16fa0db 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_DOCTOR.ts b/lib/commands/MEMORY_DOCTOR.ts index 0d02bf93360..95a37246ffa 100644 --- a/lib/commands/MEMORY_DOCTOR.ts +++ b/lib/commands/MEMORY_DOCTOR.ts @@ -1,7 +1,5 @@ -import { transformReplyString } from './generic-transformers'; - export function transformArguments(): Array { return ['MEMORY', 'DOCTOR']; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/MEMORY_MALLOC-STATS.spec.ts b/lib/commands/MEMORY_MALLOC-STATS.spec.ts index 2750ebdf7a0..034b94f7c66 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_MALLOC-STATS.ts b/lib/commands/MEMORY_MALLOC-STATS.ts index 7dd997c48b1..3977e3a1de4 100644 --- a/lib/commands/MEMORY_MALLOC-STATS.ts +++ b/lib/commands/MEMORY_MALLOC-STATS.ts @@ -1,7 +1,5 @@ -import { transformReplyString } from './generic-transformers'; - export function transformArguments(): Array { return ['MEMORY', 'MALLOC-STATS']; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/MEMORY_PURGE.spec.ts b/lib/commands/MEMORY_PURGE.spec.ts index ac9198ccfc8..97ca6feebf6 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_PURGE.ts b/lib/commands/MEMORY_PURGE.ts index 7aaeee7e6aa..cfa38179273 100644 --- a/lib/commands/MEMORY_PURGE.ts +++ b/lib/commands/MEMORY_PURGE.ts @@ -1,7 +1,5 @@ -import { transformReplyString } from './generic-transformers'; - export function transformArguments(): Array { return ['MEMORY', 'PURGE']; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/MEMORY_USAGE.spec.ts b/lib/commands/MEMORY_USAGE.spec.ts index 7487e7e4ffc..90dff62c674 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/MEMORY_USAGE.ts b/lib/commands/MEMORY_USAGE.ts index 0868b162268..959cdb0a0c4 100644 --- a/lib/commands/MEMORY_USAGE.ts +++ b/lib/commands/MEMORY_USAGE.ts @@ -1,5 +1,3 @@ -import { transformReplyNumberNull } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export const IS_READ_ONLY = true; @@ -18,4 +16,4 @@ export function transformArguments(key: string, options?: MemoryUsageOptions): A return args; } -export const transformReply = transformReplyNumberNull; +export declare function transformReply(): number | null; diff --git a/lib/commands/MGET.ts b/lib/commands/MGET.ts index fdf5b3dde85..6d5b9073d49 100644 --- a/lib/commands/MGET.ts +++ b/lib/commands/MGET.ts @@ -1,5 +1,3 @@ -import { transformReplyStringNullArray } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export const IS_READ_ONLY = true; @@ -8,4 +6,4 @@ export function transformArguments(keys: Array): Array { return ['MGET', ...keys]; } -export const transformReply = transformReplyStringNullArray; +export declare function transformReply(): Array; diff --git a/lib/commands/MIGRATE.ts b/lib/commands/MIGRATE.ts index 14dbe741be2..4d2795123a8 100644 --- a/lib/commands/MIGRATE.ts +++ b/lib/commands/MIGRATE.ts @@ -1,5 +1,4 @@ import { AuthOptions } from './AUTH'; -import { transformReplyString } from './generic-transformers'; interface MigrateOptions { COPY?: true; @@ -62,4 +61,4 @@ export function transformArguments( return args; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/MODULE_LIST.ts b/lib/commands/MODULE_LIST.ts index 53ad14b68eb..d75b2428308 100644 --- a/lib/commands/MODULE_LIST.ts +++ b/lib/commands/MODULE_LIST.ts @@ -1,7 +1,5 @@ -import { transformReplyString } from './generic-transformers'; - export function transformArguments(): Array { return ['MODULE', 'LIST']; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/MODULE_LOAD.ts b/lib/commands/MODULE_LOAD.ts index cd2347af24c..b44b4b57ce6 100644 --- a/lib/commands/MODULE_LOAD.ts +++ b/lib/commands/MODULE_LOAD.ts @@ -1,5 +1,3 @@ -import { transformReplyString } from './generic-transformers'; - export function transformArguments(path: string, moduleArgs?: Array): Array { const args = ['MODULE', 'LOAD', path]; @@ -10,4 +8,4 @@ export function transformArguments(path: string, moduleArgs?: Array): Ar return args; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/MODULE_UNLOAD.ts b/lib/commands/MODULE_UNLOAD.ts index 3737784f000..d5927778fe6 100644 --- a/lib/commands/MODULE_UNLOAD.ts +++ b/lib/commands/MODULE_UNLOAD.ts @@ -1,7 +1,5 @@ -import { transformReplyString } from './generic-transformers'; - export function transformArguments(name: string): Array { return ['MODULE', 'UNLOAD', name]; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/MSET.ts b/lib/commands/MSET.ts index d51790caeed..d3e290df70f 100644 --- a/lib/commands/MSET.ts +++ b/lib/commands/MSET.ts @@ -1,5 +1,3 @@ -import { transformReplyString } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(toSet: Array<[string, string]> | Array | Record): Array { @@ -16,4 +14,4 @@ export function transformArguments(toSet: Array<[string, 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 52963697adf..ec6c0906041 100644 --- a/lib/commands/PFCOUNT.ts +++ b/lib/commands/PFCOUNT.ts @@ -1,10 +1,10 @@ -import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; +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); } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/PFMERGE.ts b/lib/commands/PFMERGE.ts index c4ba11877f7..e934062b3fe 100644 --- a/lib/commands/PFMERGE.ts +++ b/lib/commands/PFMERGE.ts @@ -1,10 +1,10 @@ -import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyString } from './generic-transformers'; +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); } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/PING.spec.ts b/lib/commands/PING.spec.ts index 87d9359a36d..43b683f192d 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/PING.ts b/lib/commands/PING.ts index 36e92a08cfe..1e9aa957bf3 100644 --- a/lib/commands/PING.ts +++ b/lib/commands/PING.ts @@ -1,7 +1,5 @@ -import { transformReplyString } from './generic-transformers'; - export function transformArguments(): Array { return ['PING']; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/PSETEX.ts b/lib/commands/PSETEX.ts index 101030d2e63..a0bd4f5c229 100644 --- a/lib/commands/PSETEX.ts +++ b/lib/commands/PSETEX.ts @@ -1,5 +1,3 @@ -import { transformReplyString } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string, milliseconds: number, value: string): Array { @@ -11,4 +9,4 @@ export function transformArguments(key: string, milliseconds: number, value: str ]; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/PTTL.ts b/lib/commands/PTTL.ts index 8356c75bbd9..c1bc18323d5 100644 --- a/lib/commands/PTTL.ts +++ b/lib/commands/PTTL.ts @@ -1,5 +1,3 @@ -import { transformReplyNumber } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export const IS_READ_ONLY = true; @@ -8,4 +6,4 @@ export function transformArguments(key: string): Array { return ['PTTL', key]; } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/PUBLISH.ts b/lib/commands/PUBLISH.ts index 51387a6803f..eda5234df20 100644 --- a/lib/commands/PUBLISH.ts +++ b/lib/commands/PUBLISH.ts @@ -1,7 +1,5 @@ -import { transformReplyNumber } from './generic-transformers'; - export function transformArguments(channel: string, message: string): Array { return ['PUBLISH', channel, message]; } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/PUBSUB_CHANNELS.spec.ts b/lib/commands/PUBSUB_CHANNELS.spec.ts index 5ff9db60df8..9e148bc7fda 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_CHANNELS.ts b/lib/commands/PUBSUB_CHANNELS.ts index aa7a0749fc6..86a144ede8e 100644 --- a/lib/commands/PUBSUB_CHANNELS.ts +++ b/lib/commands/PUBSUB_CHANNELS.ts @@ -1,5 +1,3 @@ -import { transformReplyStringArray } from './generic-transformers'; - export const IS_READ_ONLY = true; export function transformArguments(pattern?: string): Array { @@ -12,4 +10,4 @@ export function transformArguments(pattern?: string): Array { return args; } -export const transformReply = transformReplyStringArray; +export declare function transformReply(): Array; diff --git a/lib/commands/PUBSUB_NUMPAT.spec.ts b/lib/commands/PUBSUB_NUMPAT.spec.ts index 49a39eedae0..55eef6a97de 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_NUMPAT.ts b/lib/commands/PUBSUB_NUMPAT.ts index 966a8d237c7..15be6aa1b18 100644 --- a/lib/commands/PUBSUB_NUMPAT.ts +++ b/lib/commands/PUBSUB_NUMPAT.ts @@ -1,9 +1,7 @@ -import { transformReplyString } from './generic-transformers'; - export const IS_READ_ONLY = true; export function transformArguments(): Array { return ['PUBSUB', 'NUMPAT']; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/PUBSUB_NUMSUB.spec.ts b/lib/commands/PUBSUB_NUMSUB.spec.ts index 403732f8f9d..ef44faf2c0b 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/READONLY.ts b/lib/commands/READONLY.ts index 00fbe4e4351..db7db881628 100644 --- a/lib/commands/READONLY.ts +++ b/lib/commands/READONLY.ts @@ -1,7 +1,5 @@ -import { transformReplyString } from './generic-transformers'; - export function transformArguments(): Array { return ['READONLY']; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/READWRITE.ts b/lib/commands/READWRITE.ts index 16f95604407..60dc865e89e 100644 --- a/lib/commands/READWRITE.ts +++ b/lib/commands/READWRITE.ts @@ -1,7 +1,5 @@ -import { transformReplyString } from './generic-transformers'; - export function transformArguments(): Array { return ['READWRITE']; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/RENAME.ts b/lib/commands/RENAME.ts index 0f9582677f1..f2affada60b 100644 --- a/lib/commands/RENAME.ts +++ b/lib/commands/RENAME.ts @@ -1,9 +1,7 @@ -import { transformReplyString } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string, newKey: string): Array { return ['RENAME', key, newKey]; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/REPLICAOF.ts b/lib/commands/REPLICAOF.ts index 0b56bd74dc6..bd452e0f371 100644 --- a/lib/commands/REPLICAOF.ts +++ b/lib/commands/REPLICAOF.ts @@ -1,7 +1,5 @@ -import { transformReplyString } from './generic-transformers'; - export function transformArguments(host: string, port: number): Array { return ['REPLICAOF', host, port.toString()]; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/RESTORE-ASKING.ts b/lib/commands/RESTORE-ASKING.ts index 4d178cb1f0b..d53d8541cd7 100644 --- a/lib/commands/RESTORE-ASKING.ts +++ b/lib/commands/RESTORE-ASKING.ts @@ -1,7 +1,5 @@ -import { transformReplyString } from './generic-transformers'; - export function transformArguments(): Array { return ['RESTORE-ASKING']; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/RPOP.ts b/lib/commands/RPOP.ts index daccbf5d42d..96735dea8b9 100644 --- a/lib/commands/RPOP.ts +++ b/lib/commands/RPOP.ts @@ -1,9 +1,7 @@ -import { transformReplyStringNull } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string): Array { return ['RPOP', key]; } -export const transformReply = transformReplyStringNull; +export declare function transformReply(): string | null; diff --git a/lib/commands/RPOPLPUSH.ts b/lib/commands/RPOPLPUSH.ts index db388906d3e..23f1ff08766 100644 --- a/lib/commands/RPOPLPUSH.ts +++ b/lib/commands/RPOPLPUSH.ts @@ -1,9 +1,7 @@ -import { transformReplyNumberNull } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(source: string, destination: string): Array { return ['RPOPLPUSH', source, destination]; } -export const transformReply = transformReplyNumberNull; +export declare function transformReply(): number | null; diff --git a/lib/commands/RPOP_COUNT.ts b/lib/commands/RPOP_COUNT.ts index 205704274f7..f7f3463a3ee 100644 --- a/lib/commands/RPOP_COUNT.ts +++ b/lib/commands/RPOP_COUNT.ts @@ -1,9 +1,7 @@ -import { transformReplyStringArrayNull } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string, count: number): Array { return ['RPOP', key, count.toString()]; } -export const transformReply = transformReplyStringArrayNull; +export declare function transformReply(): Array | null; diff --git a/lib/commands/RPUSH.ts b/lib/commands/RPUSH.ts index 665094f47a5..575177755cc 100644 --- a/lib/commands/RPUSH.ts +++ b/lib/commands/RPUSH.ts @@ -1,10 +1,10 @@ -import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; +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); } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/RPUSHX.ts b/lib/commands/RPUSHX.ts index fe1f969f3f6..bacc60d404b 100644 --- a/lib/commands/RPUSHX.ts +++ b/lib/commands/RPUSHX.ts @@ -1,10 +1,10 @@ -import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; +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); } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/SADD.ts b/lib/commands/SADD.ts index a432ccfef59..05e5a6858f7 100644 --- a/lib/commands/SADD.ts +++ b/lib/commands/SADD.ts @@ -1,10 +1,10 @@ -import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; +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); } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/SAVE.ts b/lib/commands/SAVE.ts index 38a397892f8..e88575f0a5c 100644 --- a/lib/commands/SAVE.ts +++ b/lib/commands/SAVE.ts @@ -1,7 +1,5 @@ -import { transformReplyString } from './generic-transformers'; - export function transformArguments(): Array { return ['SAVE']; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/SCARD.ts b/lib/commands/SCARD.ts index 8a90bd3b029..0d3ce49b6b2 100644 --- a/lib/commands/SCARD.ts +++ b/lib/commands/SCARD.ts @@ -1,9 +1,7 @@ -import { transformReplyNumber } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string): Array { return ['SCARD', key]; } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/SCRIPT_DEBUG.spec.ts b/lib/commands/SCRIPT_DEBUG.spec.ts index 9096605143a..9d2ad1af266 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_DEBUG.ts b/lib/commands/SCRIPT_DEBUG.ts index e93443a5860..e9e1e909d59 100644 --- a/lib/commands/SCRIPT_DEBUG.ts +++ b/lib/commands/SCRIPT_DEBUG.ts @@ -1,7 +1,5 @@ -import { transformReplyString } from './generic-transformers'; - export function transformArguments(mode: 'YES' | 'SYNC' | 'NO'): Array { return ['SCRIPT', 'DEBUG', mode]; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/SCRIPT_EXISTS.spec.ts b/lib/commands/SCRIPT_EXISTS.spec.ts index d03521a5c60..b23380c7579 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 47a7f456e9b..ee89f955e50 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 c1321676ebe..c77accb50a9 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_FLUSH.ts b/lib/commands/SCRIPT_FLUSH.ts index 83bc9e2b5d8..2c220e9e3d1 100644 --- a/lib/commands/SCRIPT_FLUSH.ts +++ b/lib/commands/SCRIPT_FLUSH.ts @@ -1,5 +1,3 @@ -import { transformReplyString } from './generic-transformers'; - export function transformArguments(mode?: 'ASYNC' | 'SYNC'): Array { const args = ['SCRIPT', 'FLUSH']; @@ -10,4 +8,4 @@ export function transformArguments(mode?: 'ASYNC' | 'SYNC'): Array { return args; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/SCRIPT_KILL.ts b/lib/commands/SCRIPT_KILL.ts index 5c175b74d6c..c0a53da8681 100644 --- a/lib/commands/SCRIPT_KILL.ts +++ b/lib/commands/SCRIPT_KILL.ts @@ -1,7 +1,5 @@ -import { transformReplyString } from './generic-transformers'; - export function transformArguments(): Array { return ['SCRIPT', 'KILL']; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/SCRIPT_LOAD.spec.ts b/lib/commands/SCRIPT_LOAD.spec.ts index 46490f35c8a..1d7da3e9c2d 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/SCRIPT_LOAD.ts b/lib/commands/SCRIPT_LOAD.ts index 378fbf1e76a..7cb28c1ec7f 100644 --- a/lib/commands/SCRIPT_LOAD.ts +++ b/lib/commands/SCRIPT_LOAD.ts @@ -1,7 +1,5 @@ -import { transformReplyString } from './generic-transformers'; - export function transformArguments(script: string): Array { return ['SCRIPT', 'LOAD', script]; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/SDIFF.ts b/lib/commands/SDIFF.ts index 4d5aaea1a06..7c1e4fc34a9 100644 --- a/lib/commands/SDIFF.ts +++ b/lib/commands/SDIFF.ts @@ -1,10 +1,10 @@ -import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyStringArray } from './generic-transformers'; +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); } -export const transformReply = transformReplyStringArray; +export declare function transformReply(): Array; diff --git a/lib/commands/SDIFFSTORE.ts b/lib/commands/SDIFFSTORE.ts index 69883d4124c..9cca24beb61 100644 --- a/lib/commands/SDIFFSTORE.ts +++ b/lib/commands/SDIFFSTORE.ts @@ -1,10 +1,10 @@ -import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; +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); } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/SET.ts b/lib/commands/SET.ts index 03853b3f7d6..b19a1b2c5c2 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 33b2ff1a838..7b0812a55ba 100644 --- a/lib/commands/SETBIT.ts +++ b/lib/commands/SETBIT.ts @@ -1,10 +1,10 @@ -import { TransformArgumentsReply } from '.'; -import { BitValue, transformReplyBit } from './generic-transformers'; +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()]; } -export const transformReply = transformReplyBit; +export declare function transformReply(): BitValue; diff --git a/lib/commands/SETEX.ts b/lib/commands/SETEX.ts index 320278c9264..89c6e06a3f2 100644 --- a/lib/commands/SETEX.ts +++ b/lib/commands/SETEX.ts @@ -1,9 +1,8 @@ -import { TransformArgumentsReply } from '.'; -import { transformReplyString } from './generic-transformers'; +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, @@ -12,4 +11,4 @@ export function transformArguments(key: string | Buffer, seconds: number, value: ]; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/SETRANGE.ts b/lib/commands/SETRANGE.ts index a303487ddd4..fa15c41db9d 100644 --- a/lib/commands/SETRANGE.ts +++ b/lib/commands/SETRANGE.ts @@ -1,9 +1,7 @@ -import { transformReplyNumber } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string, offset: number, value: string): Array { return ['SETRANGE', key, offset.toString(), value]; } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/SHUTDOWN.ts b/lib/commands/SHUTDOWN.ts index 0dd2cf3a5b3..1990d05a2ed 100644 --- a/lib/commands/SHUTDOWN.ts +++ b/lib/commands/SHUTDOWN.ts @@ -1,5 +1,3 @@ -import { transformReplyVoid } from './generic-transformers'; - export function transformArguments(mode?: 'NOSAVE' | 'SAVE'): Array { const args = ['SHUTDOWN']; @@ -10,4 +8,4 @@ export function transformArguments(mode?: 'NOSAVE' | 'SAVE'): Array { return args; } -export const transformReply = transformReplyVoid; +export declare function transformReply(): void; diff --git a/lib/commands/SINTER.ts b/lib/commands/SINTER.ts index 43869652370..5d74e761f0e 100644 --- a/lib/commands/SINTER.ts +++ b/lib/commands/SINTER.ts @@ -1,10 +1,10 @@ -import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyStringArray } from './generic-transformers'; +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); } -export const transformReply = transformReplyStringArray; +export declare function transformReply(): Array; diff --git a/lib/commands/SINTERSTORE.ts b/lib/commands/SINTERSTORE.ts index 5ad1b11cbac..40f31a8b7a3 100644 --- a/lib/commands/SINTERSTORE.ts +++ b/lib/commands/SINTERSTORE.ts @@ -1,10 +1,10 @@ -import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyStringArray } from './generic-transformers'; +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); } -export const transformReply = transformReplyStringArray; +export declare function transformReply(): Array; diff --git a/lib/commands/SMEMBERS.ts b/lib/commands/SMEMBERS.ts index d7e75daaa3e..71b479f9d8e 100644 --- a/lib/commands/SMEMBERS.ts +++ b/lib/commands/SMEMBERS.ts @@ -1,9 +1,7 @@ -import { transformReplyStringArray } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string): Array { return ['SMEMBERS', key]; } -export const transformReply = transformReplyStringArray; +export declare function transformReply(): Array; diff --git a/lib/commands/SPOP.ts b/lib/commands/SPOP.ts index a389fed5cc5..84845230d41 100644 --- a/lib/commands/SPOP.ts +++ b/lib/commands/SPOP.ts @@ -1,5 +1,3 @@ -import { transformReplyStringArray } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string, count?: number): Array { @@ -12,4 +10,4 @@ export function transformArguments(key: string, count?: number): Array { return args; } -export const transformReply = transformReplyStringArray; +export declare function transformReply(): Array; diff --git a/lib/commands/SRANDMEMBER.ts b/lib/commands/SRANDMEMBER.ts index 2e8cd539273..c477a5691d7 100644 --- a/lib/commands/SRANDMEMBER.ts +++ b/lib/commands/SRANDMEMBER.ts @@ -1,9 +1,7 @@ -import { transformReplyStringNull } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string): Array { return ['SRANDMEMBER', key]; } -export const transformReply = transformReplyStringNull; +export declare function transformReply(): string | null; diff --git a/lib/commands/SRANDMEMBER_COUNT.ts b/lib/commands/SRANDMEMBER_COUNT.ts index b7fa8ebeb3a..89d9b8c4aef 100644 --- a/lib/commands/SRANDMEMBER_COUNT.ts +++ b/lib/commands/SRANDMEMBER_COUNT.ts @@ -1,4 +1,3 @@ -import { transformReplyStringArray } from './generic-transformers'; import { transformArguments as transformSRandMemberArguments } from './SRANDMEMBER'; export { FIRST_KEY_INDEX } from './SRANDMEMBER'; @@ -10,4 +9,4 @@ export function transformArguments(key: string, count: number): Array { ]; } -export const transformReply = transformReplyStringArray; +export declare function transformReply(): Array; diff --git a/lib/commands/SREM.ts b/lib/commands/SREM.ts index 4ae33245d29..9a37ac9bf99 100644 --- a/lib/commands/SREM.ts +++ b/lib/commands/SREM.ts @@ -1,10 +1,10 @@ -import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; +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); } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/STRLEN.ts b/lib/commands/STRLEN.ts index d8112ce7d1f..208d9d73fb8 100644 --- a/lib/commands/STRLEN.ts +++ b/lib/commands/STRLEN.ts @@ -1,5 +1,3 @@ -import { transformReplyNumber } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export const IS_READ_ONLY = true; @@ -8,4 +6,4 @@ export function transformArguments(key: string): Array { return ['STRLEN', key]; } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/SUNION.ts b/lib/commands/SUNION.ts index 705bff29927..ae8b02b481d 100644 --- a/lib/commands/SUNION.ts +++ b/lib/commands/SUNION.ts @@ -1,12 +1,12 @@ -import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyStringArray } from './generic-transformers'; +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); } -export const transformReply = transformReplyStringArray; +export declare function transformReply(): Array; diff --git a/lib/commands/SUNIONSTORE.ts b/lib/commands/SUNIONSTORE.ts index af717f627df..f259769f49a 100644 --- a/lib/commands/SUNIONSTORE.ts +++ b/lib/commands/SUNIONSTORE.ts @@ -1,10 +1,10 @@ -import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; +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); } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/SWAPDB.ts b/lib/commands/SWAPDB.ts index f0d4dacf3fc..7f13d6b008e 100644 --- a/lib/commands/SWAPDB.ts +++ b/lib/commands/SWAPDB.ts @@ -1,7 +1,5 @@ -import { transformReplyString } from './generic-transformers'; - export function transformArguments(index1: number, index2: number): Array { return ['SWAPDB', index1.toString(), index2.toString()]; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/TOUCH.ts b/lib/commands/TOUCH.ts index abff4160392..a3dc31e8568 100644 --- a/lib/commands/TOUCH.ts +++ b/lib/commands/TOUCH.ts @@ -1,10 +1,10 @@ -import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; +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); } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/TTL.ts b/lib/commands/TTL.ts index aa8462dfea3..4ae31245aa0 100644 --- a/lib/commands/TTL.ts +++ b/lib/commands/TTL.ts @@ -1,5 +1,3 @@ -import { transformReplyNumber } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export const IS_READ_ONLY = true; @@ -8,4 +6,4 @@ export function transformArguments(key: string): Array { return ['TTL', key]; } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/TYPE.ts b/lib/commands/TYPE.ts index 4f27b29d2b6..283701b6e9f 100644 --- a/lib/commands/TYPE.ts +++ b/lib/commands/TYPE.ts @@ -1,5 +1,3 @@ -import { transformReplyString } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export const IS_READ_ONLY = true; @@ -8,4 +6,4 @@ export function transformArguments(key: string): Array { return ['TYPE', key]; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/UNLINK.ts b/lib/commands/UNLINK.ts index 4647a976e42..467b4172e0f 100644 --- a/lib/commands/UNLINK.ts +++ b/lib/commands/UNLINK.ts @@ -1,10 +1,10 @@ -import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; +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); } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/UNWATCH.spec.ts b/lib/commands/UNWATCH.spec.ts index 238ffdc59b3..07059310cbc 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/UNWATCH.ts b/lib/commands/UNWATCH.ts index d0ede556f3a..ce42e7697bf 100644 --- a/lib/commands/UNWATCH.ts +++ b/lib/commands/UNWATCH.ts @@ -1,7 +1,5 @@ -import { transformReplyString } from './generic-transformers'; - export function transformArguments(): Array { return ['UNWATCH']; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/WAIT.ts b/lib/commands/WAIT.ts index 214fb356688..dff51ed9680 100644 --- a/lib/commands/WAIT.ts +++ b/lib/commands/WAIT.ts @@ -1,9 +1,7 @@ -import { transformReplyNumber } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(numberOfReplicas: number, timeout: number): Array { return ['WAIT', numberOfReplicas.toString(), timeout.toString()]; } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/WATCH.ts b/lib/commands/WATCH.ts index e644ab0f462..f66429b507e 100644 --- a/lib/commands/WATCH.ts +++ b/lib/commands/WATCH.ts @@ -1,8 +1,8 @@ -import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyString } from './generic-transformers'; +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); } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/XACK.ts b/lib/commands/XACK.ts index a6de28151eb..0d21a0ec085 100644 --- a/lib/commands/XACK.ts +++ b/lib/commands/XACK.ts @@ -1,10 +1,10 @@ -import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; +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); } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/XADD.ts b/lib/commands/XADD.ts index 0500a2fde65..7bc263b2400 100644 --- a/lib/commands/XADD.ts +++ b/lib/commands/XADD.ts @@ -1,8 +1,7 @@ -import { TuplesObject, transformReplyString } from './generic-transformers'; +import { TuplesObject } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; - interface XAddOptions { NOMKSTREAM?: true; TRIM?: { @@ -45,4 +44,4 @@ export function transformArguments(key: string, id: string, message: TuplesObjec return args; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/XCLAIM_JUSTID.ts b/lib/commands/XCLAIM_JUSTID.ts index dcf274ed821..ab74c89420c 100644 --- a/lib/commands/XCLAIM_JUSTID.ts +++ b/lib/commands/XCLAIM_JUSTID.ts @@ -1,4 +1,3 @@ -import { transformReplyStringArray } from './generic-transformers'; import { transformArguments as transformArgumentsXClaim } from './XCLAIM'; export { FIRST_KEY_INDEX } from './XCLAIM'; @@ -10,4 +9,4 @@ export function transformArguments(...args: Parameters; diff --git a/lib/commands/XDEL.ts b/lib/commands/XDEL.ts index 083ea77ef0f..892b9a0de5b 100644 --- a/lib/commands/XDEL.ts +++ b/lib/commands/XDEL.ts @@ -1,10 +1,10 @@ -import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; +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); } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/XGROUP_CREATE.ts b/lib/commands/XGROUP_CREATE.ts index 167197b263c..c2d7f157615 100644 --- a/lib/commands/XGROUP_CREATE.ts +++ b/lib/commands/XGROUP_CREATE.ts @@ -1,5 +1,3 @@ -import { transformReplyString } from './generic-transformers'; - export const FIRST_KEY_INDEX = 2; interface XGroupCreateOptions { @@ -16,4 +14,4 @@ export function transformArguments(key: string, group: string, id: string, optio return args; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/XGROUP_DELCONSUMER.ts b/lib/commands/XGROUP_DELCONSUMER.ts index 91a36f91a30..dc9de7bb577 100644 --- a/lib/commands/XGROUP_DELCONSUMER.ts +++ b/lib/commands/XGROUP_DELCONSUMER.ts @@ -1,9 +1,7 @@ -import { transformReplyNumber } from './generic-transformers'; - export const FIRST_KEY_INDEX = 2; export function transformArguments(key: string, group: string, consumer: string): Array { return ['XGROUP', 'DELCONSUMER', key, group, consumer]; } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/XGROUP_SETID.ts b/lib/commands/XGROUP_SETID.ts index ce4a13086d3..2d4e30d9c94 100644 --- a/lib/commands/XGROUP_SETID.ts +++ b/lib/commands/XGROUP_SETID.ts @@ -1,9 +1,7 @@ -import { transformReplyString } from './generic-transformers'; - export const FIRST_KEY_INDEX = 2; export function transformArguments(key: string, group: string, id: string): Array { return ['XGROUP', 'SETID', key, group, id]; } -export const transformReply = transformReplyString; +export declare function transformReply(): string; diff --git a/lib/commands/XLEN.ts b/lib/commands/XLEN.ts index d7ba033e612..1cadd61952b 100644 --- a/lib/commands/XLEN.ts +++ b/lib/commands/XLEN.ts @@ -1,5 +1,3 @@ -import { transformReplyNumber } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export const IS_READ_ONLY = true; @@ -8,4 +6,4 @@ export function transformArguments(key: string): Array { return ['XLEN', key]; } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/XREAD.spec.ts b/lib/commands/XREAD.spec.ts index e7bf127a90a..501571bfbeb 100644 --- a/lib/commands/XREAD.spec.ts +++ b/lib/commands/XREAD.spec.ts @@ -1,8 +1,24 @@ import { strict as assert } from 'assert'; import { TestRedisServers, itWithClient, itWithCluster, TestRedisClusters } from '../test-utils'; -import { transformArguments } from './XREAD'; +import { FIRST_KEY_INDEX, transformArguments } from './XREAD'; describe('XREAD', () => { + describe('FIRST_KEY_INDEX', () => { + it('single stream', () => { + assert.equal( + FIRST_KEY_INDEX({ key: 'key', id: '' }), + 'key' + ); + }); + + it('multiple streams', () => { + assert.equal( + FIRST_KEY_INDEX([{ key: '1', id: '' }, { key: '2', id: '' }]), + '1' + ); + }); + }); + describe('transformArguments', () => { it('single stream', () => { assert.deepEqual( @@ -13,13 +29,13 @@ describe('XREAD', () => { ['XREAD', 'STREAMS', 'key', '0'] ); }); - + it('multiple streams', () => { assert.deepEqual( transformArguments([{ key: '1', id: '0' - }, { + }, { key: '2', id: '0' }]), diff --git a/lib/commands/XREADGROUP.spec.ts b/lib/commands/XREADGROUP.spec.ts index 8f7693c333b..8cb3147bfe7 100644 --- a/lib/commands/XREADGROUP.spec.ts +++ b/lib/commands/XREADGROUP.spec.ts @@ -1,8 +1,24 @@ import { strict as assert } from 'assert'; import { TestRedisServers, itWithClient, itWithCluster, TestRedisClusters } from '../test-utils'; -import { transformArguments } from './XREADGROUP'; +import { FIRST_KEY_INDEX, transformArguments } from './XREADGROUP'; describe('XREADGROUP', () => { + describe('FIRST_KEY_INDEX', () => { + it('single stream', () => { + assert.equal( + FIRST_KEY_INDEX('', '', { key: 'key', id: '' }), + 'key' + ); + }); + + it('multiple streams', () => { + assert.equal( + FIRST_KEY_INDEX('', '', [{ key: '1', id: '' }, { key: '2', id: '' }]), + '1' + ); + }); + }); + describe('transformArguments', () => { it('single stream', () => { assert.deepEqual( @@ -78,13 +94,27 @@ describe('XREADGROUP', () => { }); }); - describe('client.xReadGroup', () => { - itWithClient(TestRedisServers.OPEN, 'null', async client => { + itWithClient(TestRedisServers.OPEN, 'null', async client => { + const [, readGroupReply] = await Promise.all([ + client.xGroupCreate('key', 'group', '$', { + MKSTREAM: true + }), + client.xReadGroup('group', 'consumer', { + key: 'key', + id: '>' + }) + ]); + + assert.equal(readGroupReply, null); + }); + + describe('cluster.xReadGroup', () => { + itWithCluster(TestRedisClusters.OPEN, 'null', async cluster => { const [, readGroupReply] = await Promise.all([ - client.xGroupCreate('key', 'group', '$', { + cluster.xGroupCreate('key', 'group', '$', { MKSTREAM: true }), - client.xReadGroup('group', 'consumer', { + cluster.xReadGroup('group', 'consumer', { key: 'key', id: '>' }) @@ -93,7 +123,7 @@ describe('XREADGROUP', () => { assert.equal(readGroupReply, null); }); - itWithClient(TestRedisServers.OPEN, 'with a message', async client => { + itWithCluster(TestRedisClusters.OPEN, 'with a message', async client => { const [, id, readGroupReply] = await Promise.all([ client.xGroupCreate('key', 'group', '$', { MKSTREAM: true @@ -120,18 +150,4 @@ describe('XREADGROUP', () => { }]); }); }); - - itWithCluster(TestRedisClusters.OPEN, 'cluster.xReadGroup', async cluster => { - const [, readGroupReply] = await Promise.all([ - cluster.xGroupCreate('key', 'group', '$', { - MKSTREAM: true - }), - cluster.xReadGroup('group', 'consumer', { - key: 'key', - id: '>' - }) - ]); - - assert.equal(readGroupReply, null); - }); }); diff --git a/lib/commands/XTRIM.ts b/lib/commands/XTRIM.ts index 8175ba70df3..520c38847b8 100644 --- a/lib/commands/XTRIM.ts +++ b/lib/commands/XTRIM.ts @@ -1,5 +1,3 @@ -import { transformReplyNumber } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; interface XTrimOptions { @@ -23,4 +21,4 @@ export function transformArguments(key: string, strategy: 'MAXLEN' | 'MINID', th return args; } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/ZCARD.ts b/lib/commands/ZCARD.ts index f6e4ea5f6cd..9c76c485bf9 100644 --- a/lib/commands/ZCARD.ts +++ b/lib/commands/ZCARD.ts @@ -1,5 +1,3 @@ -import { transformReplyNumber } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export const IS_READ_ONLY = true; @@ -8,4 +6,4 @@ export function transformArguments(key: string): Array { return ['ZCARD', key]; } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/ZCOUNT.ts b/lib/commands/ZCOUNT.ts index fd73c384489..a18ba0fd790 100644 --- a/lib/commands/ZCOUNT.ts +++ b/lib/commands/ZCOUNT.ts @@ -1,4 +1,4 @@ -import { transformArgumentNumberInfinity, transformReplyNumber } from './generic-transformers'; +import { transformArgumentNumberInfinity } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -13,4 +13,4 @@ export function transformArguments(key: string, min: number, max: number): Array ]; } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/ZDIFF.ts b/lib/commands/ZDIFF.ts index 7154947fea7..a45bf01a526 100644 --- a/lib/commands/ZDIFF.ts +++ b/lib/commands/ZDIFF.ts @@ -1,12 +1,12 @@ -import { TransformArgumentsReply } from '.'; -import { pushVerdictArgument, transformReplyStringArray } from './generic-transformers'; +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); } -export const transformReply = transformReplyStringArray; +export declare function transformReply(): Array; diff --git a/lib/commands/ZDIFFSTORE.ts b/lib/commands/ZDIFFSTORE.ts index f91d4c869ba..9c782b8a5ab 100644 --- a/lib/commands/ZDIFFSTORE.ts +++ b/lib/commands/ZDIFFSTORE.ts @@ -1,10 +1,10 @@ -import { TransformArgumentsReply } from '.'; -import { pushVerdictArgument, transformReplyNumber } from './generic-transformers'; +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); } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/ZDIFF_WITHSCORES.ts b/lib/commands/ZDIFF_WITHSCORES.ts index 84126853361..49707563546 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 91d7982a8e7..629515b57f9 100644 --- a/lib/commands/ZINTER.ts +++ b/lib/commands/ZINTER.ts @@ -1,5 +1,5 @@ -import { TransformArgumentsReply } from '.'; -import { pushVerdictArgument, transformReplyStringArray } from './generic-transformers'; +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) { @@ -21,10 +21,10 @@ export function transformArguments(keys: Array | string, options?: ZInte } if (options?.AGGREGATE) { - args.push('AGGREGATE', options?.AGGREGATE); + args.push('AGGREGATE', options.AGGREGATE); } return args; } -export const transformReply = transformReplyStringArray; +export declare function transformReply(): Array; diff --git a/lib/commands/ZINTERSTORE.ts b/lib/commands/ZINTERSTORE.ts index 6e79e423cb0..e0916e5b14a 100644 --- a/lib/commands/ZINTERSTORE.ts +++ b/lib/commands/ZINTERSTORE.ts @@ -1,5 +1,5 @@ -import { TransformArgumentsReply } from '.'; -import { pushVerdictArgument, transformReplyNumber } from './generic-transformers'; +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) { @@ -19,10 +19,10 @@ export function transformArguments(destination: string, keys: Array | st } if (options?.AGGREGATE) { - args.push('AGGREGATE', options?.AGGREGATE); + args.push('AGGREGATE', options.AGGREGATE); } return args; } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/ZINTER_WITHSCORES.ts b/lib/commands/ZINTER_WITHSCORES.ts index f4287d1a684..f75a506de73 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/ZLEXCOUNT.ts b/lib/commands/ZLEXCOUNT.ts index 2ba50dda73e..2e70fdee91d 100644 --- a/lib/commands/ZLEXCOUNT.ts +++ b/lib/commands/ZLEXCOUNT.ts @@ -1,5 +1,3 @@ -import { transformReplyNumber } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export const IS_READ_ONLY = true; @@ -13,4 +11,4 @@ export function transformArguments(key: string, min: string, max: string): Array ]; } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/ZMSCORE.ts b/lib/commands/ZMSCORE.ts index 373adac3cf0..2790f712316 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/ZRANDMEMBER.ts b/lib/commands/ZRANDMEMBER.ts index 27bb7cefa50..13bb05598b7 100644 --- a/lib/commands/ZRANDMEMBER.ts +++ b/lib/commands/ZRANDMEMBER.ts @@ -1,5 +1,3 @@ -import { transformReplyStringNull } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export const IS_READ_ONLY = true; @@ -8,4 +6,4 @@ export function transformArguments(key: string): Array { return ['ZRANDMEMBER', key]; } -export const transformReply = transformReplyStringNull; +export declare function transformReply(): string | null; diff --git a/lib/commands/ZRANDMEMBER_COUNT.ts b/lib/commands/ZRANDMEMBER_COUNT.ts index f7eef456d05..1b7b8fea994 100644 --- a/lib/commands/ZRANDMEMBER_COUNT.ts +++ b/lib/commands/ZRANDMEMBER_COUNT.ts @@ -1,4 +1,3 @@ -import { transformReplyStringArray } from './generic-transformers'; import { transformArguments as transformZRandMemberArguments } from './ZRANDMEMBER'; export { FIRST_KEY_INDEX, IS_READ_ONLY } from './ZRANDMEMBER'; @@ -10,4 +9,4 @@ export function transformArguments(key: string, count: number): Array { ]; } -export const transformReply = transformReplyStringArray; +export declare function transformReply(): Array; diff --git a/lib/commands/ZRANGE.spec.ts b/lib/commands/ZRANGE.spec.ts index 72d83931ff4..7347ed0ad09 100644 --- a/lib/commands/ZRANGE.spec.ts +++ b/lib/commands/ZRANGE.spec.ts @@ -11,6 +11,13 @@ describe('ZRANGE', () => { ); }); + it('using strings', () => { + assert.deepEqual( + transformArguments('src', '0', '1'), + ['ZRANGE', 'src', '0', '1'] + ); + }); + it('with BYSCORE', () => { assert.deepEqual( transformArguments('src', 0, 1, { diff --git a/lib/commands/ZRANGE.ts b/lib/commands/ZRANGE.ts index 9037210d69f..391c5ca893e 100644 --- a/lib/commands/ZRANGE.ts +++ b/lib/commands/ZRANGE.ts @@ -1,4 +1,4 @@ -import { transformArgumentNumberInfinity, transformReplyStringArray } from './generic-transformers'; +import { transformArgumentNumberInfinity } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -42,4 +42,4 @@ export function transformArguments(key: string, min: string | number, max: strin return args; } -export const transformReply = transformReplyStringArray; +export declare function transformReply(): Array; diff --git a/lib/commands/ZRANGEBYLEX.spec.ts b/lib/commands/ZRANGEBYLEX.spec.ts new file mode 100644 index 00000000000..7f687509548 --- /dev/null +++ b/lib/commands/ZRANGEBYLEX.spec.ts @@ -0,0 +1,33 @@ +import { strict as assert } from 'assert'; +import { TestRedisServers, itWithClient } from '../test-utils'; +import { transformArguments } from './ZRANGEBYLEX'; + +describe('ZRANGEBYLEX', () => { + describe('transformArguments', () => { + it('simple', () => { + assert.deepEqual( + transformArguments('src', '-', '+'), + ['ZRANGEBYLEX', 'src', '-', '+'] + ); + }); + + it('with LIMIT', () => { + assert.deepEqual( + transformArguments('src', '-', '+', { + LIMIT: { + offset: 0, + count: 1 + } + }), + ['ZRANGEBYLEX', 'src', '-', '+', 'LIMIT', '0', '1'] + ); + }); + }); + + itWithClient(TestRedisServers.OPEN, 'client.zRangeByLex', async client => { + assert.deepEqual( + await client.zRangeByLex('src', '-', '+'), + [] + ); + }); +}); diff --git a/lib/commands/ZRANGEBYLEX.ts b/lib/commands/ZRANGEBYLEX.ts new file mode 100644 index 00000000000..7e2e7613b00 --- /dev/null +++ b/lib/commands/ZRANGEBYLEX.ts @@ -0,0 +1,35 @@ +import { RedisCommandArguments } from '.'; +import { transformArgumentNumberInfinity } from './generic-transformers'; + +export const FIRST_KEY_INDEX = 1; + +export const IS_READ_ONLY = true; + +export interface ZRangeByLexOptions { + LIMIT?: { + offset: number; + count: number; + }; +} + +export function transformArguments( + key: string, + min: number | string, + max: number | string, + options?: ZRangeByLexOptions +): RedisCommandArguments { + const args = [ + 'ZRANGEBYLEX', + key, + typeof min === 'string' ? min : transformArgumentNumberInfinity(min), + typeof max === 'string' ? max : transformArgumentNumberInfinity(max) + ]; + + if (options?.LIMIT) { + args.push('LIMIT', options.LIMIT.offset.toString(), options.LIMIT.count.toString()); + } + + return args; +} + +export declare function transformReply(): Array; diff --git a/lib/commands/ZRANGEBYSCORE.spec.ts b/lib/commands/ZRANGEBYSCORE.spec.ts new file mode 100644 index 00000000000..0419b232563 --- /dev/null +++ b/lib/commands/ZRANGEBYSCORE.spec.ts @@ -0,0 +1,33 @@ +import { strict as assert } from 'assert'; +import { TestRedisServers, itWithClient } from '../test-utils'; +import { transformArguments } from './ZRANGEBYSCORE'; + +describe('ZRANGEBYSCORE', () => { + describe('transformArguments', () => { + it('simple', () => { + assert.deepEqual( + transformArguments('src', 0, 1), + ['ZRANGEBYSCORE', 'src', '0', '1'] + ); + }); + + it('with LIMIT', () => { + assert.deepEqual( + transformArguments('src', 0, 1, { + LIMIT: { + offset: 0, + count: 1 + } + }), + ['ZRANGEBYSCORE', 'src', '0', '1', 'LIMIT', '0', '1'] + ); + }); + }); + + itWithClient(TestRedisServers.OPEN, 'client.zRangeByScore', async client => { + assert.deepEqual( + await client.zRangeByScore('src', 0, 1), + [] + ); + }); +}); diff --git a/lib/commands/ZRANGEBYSCORE.ts b/lib/commands/ZRANGEBYSCORE.ts new file mode 100644 index 00000000000..48dd8a415c6 --- /dev/null +++ b/lib/commands/ZRANGEBYSCORE.ts @@ -0,0 +1,35 @@ +import { RedisCommandArguments } from '.'; +import { transformArgumentNumberInfinity } from './generic-transformers'; + +export const FIRST_KEY_INDEX = 1; + +export const IS_READ_ONLY = true; + +export interface ZRangeByScoreOptions { + LIMIT?: { + offset: number; + count: number; + }; +} + +export function transformArguments( + key: string, + min: number | string, + max: number | string, + options?: ZRangeByScoreOptions +): RedisCommandArguments { + const args = [ + 'ZRANGEBYSCORE', + key, + typeof min === 'string' ? min : transformArgumentNumberInfinity(min), + typeof max === 'string' ? max : transformArgumentNumberInfinity(max) + ]; + + if (options?.LIMIT) { + args.push('LIMIT', options.LIMIT.offset.toString(), options.LIMIT.count.toString()); + } + + return args; +} + +export declare function transformReply(): Array; diff --git a/lib/commands/ZRANGEBYSCORE_WITHSCORES.spec.ts b/lib/commands/ZRANGEBYSCORE_WITHSCORES.spec.ts new file mode 100644 index 00000000000..84d1aeb0aad --- /dev/null +++ b/lib/commands/ZRANGEBYSCORE_WITHSCORES.spec.ts @@ -0,0 +1,33 @@ +import { strict as assert } from 'assert'; +import { TestRedisServers, itWithClient } from '../test-utils'; +import { transformArguments } from './ZRANGEBYSCORE_WITHSCORES'; + +describe('ZRANGEBYSCORE WITHSCORES', () => { + describe('transformArguments', () => { + it('simple', () => { + assert.deepEqual( + transformArguments('src', 0, 1), + ['ZRANGEBYSCORE', 'src', '0', '1', 'WITHSCORES'] + ); + }); + + it('with LIMIT', () => { + assert.deepEqual( + transformArguments('src', 0, 1, { + LIMIT: { + offset: 0, + count: 1 + } + }), + ['ZRANGEBYSCORE', 'src', '0', '1', 'LIMIT', '0', '1', 'WITHSCORES'] + ); + }); + }); + + itWithClient(TestRedisServers.OPEN, 'client.zRangeByScoreWithScores', async client => { + assert.deepEqual( + await client.zRangeByScoreWithScores('src', 0, 1), + [] + ); + }); +}); diff --git a/lib/commands/ZRANGEBYSCORE_WITHSCORES.ts b/lib/commands/ZRANGEBYSCORE_WITHSCORES.ts new file mode 100644 index 00000000000..f6f7f993cbc --- /dev/null +++ b/lib/commands/ZRANGEBYSCORE_WITHSCORES.ts @@ -0,0 +1,19 @@ +import { RedisCommandArguments } from '.'; +import { transformReplySortedSetWithScores } from './generic-transformers'; +import { ZRangeByScoreOptions, transformArguments as transformZRangeByScoreArguments } from './ZRANGEBYSCORE'; + +export { FIRST_KEY_INDEX, IS_READ_ONLY } from './ZRANGEBYSCORE'; + +export function transformArguments( + key: string, + min: number | string, + max: number | string, + options?: ZRangeByScoreOptions +): RedisCommandArguments { + return [ + ...transformZRangeByScoreArguments(key, min, max, options), + 'WITHSCORES' + ]; +} + +export const transformReply = transformReplySortedSetWithScores; diff --git a/lib/commands/ZRANGESTORE.spec.ts b/lib/commands/ZRANGESTORE.spec.ts index 30dee7c0b5b..54055656409 100644 --- a/lib/commands/ZRANGESTORE.spec.ts +++ b/lib/commands/ZRANGESTORE.spec.ts @@ -1,6 +1,6 @@ import { strict as assert } from 'assert'; import { TestRedisServers, itWithClient, describeHandleMinimumRedisVersion } from '../test-utils'; -import { transformArguments } from './ZRANGESTORE'; +import { transformArguments, transformReply } from './ZRANGESTORE'; describe('ZRANGESTORE', () => { describeHandleMinimumRedisVersion([6, 2]); @@ -68,6 +68,15 @@ describe('ZRANGESTORE', () => { }); }); + describe('transformReply', () => { + it('should throw TypeError when reply is not a number', () => { + assert.throws( + () => (transformReply as any)([]), + TypeError + ); + }); + }); + itWithClient(TestRedisServers.OPEN, 'client.zRangeStore', async client => { await client.zAdd('src', { score: 0.5, diff --git a/lib/commands/ZRANK.ts b/lib/commands/ZRANK.ts index 84f9c7d4a9e..e060ccf6f8c 100644 --- a/lib/commands/ZRANK.ts +++ b/lib/commands/ZRANK.ts @@ -1,5 +1,3 @@ -import { transformReplyNumberNull } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export const IS_READ_ONLY = true; @@ -8,4 +6,4 @@ export function transformArguments(key: string, member: string): Array { return ['ZRANK', key, member]; } -export const transformReply = transformReplyNumberNull; +export declare function transformReply(): number | null; diff --git a/lib/commands/ZREM.ts b/lib/commands/ZREM.ts index 8419291f2fd..332289b3fdb 100644 --- a/lib/commands/ZREM.ts +++ b/lib/commands/ZREM.ts @@ -1,10 +1,10 @@ -import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; +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); } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/ZREMRANGEBYLEX.ts b/lib/commands/ZREMRANGEBYLEX.ts index aaf92992f98..1f17d6b986e 100644 --- a/lib/commands/ZREMRANGEBYLEX.ts +++ b/lib/commands/ZREMRANGEBYLEX.ts @@ -1,9 +1,7 @@ -import { transformReplyNumber } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string, min: string, max: string): Array { return ['ZREMRANGEBYLEX', key, min, max]; } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/ZREMRANGEBYRANK.ts b/lib/commands/ZREMRANGEBYRANK.ts index 89bf63d8e34..550a56e8a85 100644 --- a/lib/commands/ZREMRANGEBYRANK.ts +++ b/lib/commands/ZREMRANGEBYRANK.ts @@ -1,9 +1,7 @@ -import { transformReplyNumber } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string, start: number, stop: number): Array { return ['ZREMRANGEBYRANK', key, start.toString(), stop.toString()]; } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/ZREMRANGEBYSCORE.ts b/lib/commands/ZREMRANGEBYSCORE.ts index 64d14a4eb41..e0186fcb64e 100644 --- a/lib/commands/ZREMRANGEBYSCORE.ts +++ b/lib/commands/ZREMRANGEBYSCORE.ts @@ -1,9 +1,7 @@ -import { transformReplyNumber } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string, min: number, max: number): Array { return ['ZREMRANGEBYSCORE', key, min.toString(), max.toString()]; } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/ZREVRANK.ts b/lib/commands/ZREVRANK.ts index 7d4c4ce2ab5..808d9e45dc3 100644 --- a/lib/commands/ZREVRANK.ts +++ b/lib/commands/ZREVRANK.ts @@ -1,5 +1,3 @@ -import { transformReplyNumberNull } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export const IS_READ_ONLY = true; @@ -8,4 +6,4 @@ export function transformArguments(key: string, member: string): Array { return ['ZREVRANK', key, member]; } -export const transformReply = transformReplyNumberNull; +export declare function transformReply(): number | null; diff --git a/lib/commands/ZUNION.ts b/lib/commands/ZUNION.ts index 87158b8425a..2163978470c 100644 --- a/lib/commands/ZUNION.ts +++ b/lib/commands/ZUNION.ts @@ -1,5 +1,5 @@ -import { TransformArgumentsReply } from '.'; -import { pushVerdictArgument, transformReplyStringArray } from './generic-transformers'; +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) { @@ -24,4 +24,4 @@ export function transformArguments(keys: Array | string, options?: ZUnio return args; } -export const transformReply = transformReplyStringArray; +export declare function transformReply(): Array; diff --git a/lib/commands/ZUNIONSTORE.ts b/lib/commands/ZUNIONSTORE.ts index 4ebbdbd8591..406f0430c52 100644 --- a/lib/commands/ZUNIONSTORE.ts +++ b/lib/commands/ZUNIONSTORE.ts @@ -1,5 +1,5 @@ -import { TransformArgumentsReply } from '.'; -import { pushVerdictArgument, transformReplyNumber } from './generic-transformers'; +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) { @@ -22,4 +22,4 @@ export function transformArguments(destination: string, keys: Array | st return args; } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/ZUNION_WITHSCORES.ts b/lib/commands/ZUNION_WITHSCORES.ts index 2215dad9749..d361fd432b0 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.spec.ts b/lib/commands/generic-transformers.spec.ts index 9ac72bb1b25..bdc3ee938cd 100644 --- a/lib/commands/generic-transformers.spec.ts +++ b/lib/commands/generic-transformers.spec.ts @@ -21,7 +21,10 @@ import { pushStringTuplesArguments, pushVerdictArguments, pushVerdictArgument, - pushOptionalVerdictArgument + pushOptionalVerdictArgument, + transformCommandReply, + CommandFlags, + CommandCategories } from './generic-transformers'; describe('Generic Transformers', () => { @@ -300,6 +303,13 @@ describe('Generic Transformers', () => { ); }); + it('with COUNT', () => { + assert.deepEqual( + pushGeoCountArgument([], 1), + ['COUNT', '1'] + ); + }); + it('with ANY', () => { assert.deepEqual( pushGeoCountArgument([], { @@ -619,4 +629,27 @@ describe('Generic Transformers', () => { ); }); }); + + it('transformCommandReply', () => { + assert.deepEqual( + transformCommandReply([ + 'ping', + -1, + [CommandFlags.STALE, CommandFlags.FAST], + 0, + 0, + 0, + [CommandCategories.FAST, CommandCategories.CONNECTION] + ]), + { + name: 'ping', + arity: -1, + flags: new Set([CommandFlags.STALE, CommandFlags.FAST]), + firstKeyIndex: 0, + lastKeyIndex: 0, + step: 0, + categories: new Set([CommandCategories.FAST, CommandCategories.CONNECTION]) + } + ); + }); }); diff --git a/lib/commands/generic-transformers.ts b/lib/commands/generic-transformers.ts index bbc12ee113e..a531e86b432 100644 --- a/lib/commands/generic-transformers.ts +++ b/lib/commands/generic-transformers.ts @@ -1,40 +1,4 @@ -import { TransformArgumentsReply } from '.'; - -export function transformReplyNumber(reply: number): number { - return reply; -} - -export function transformReplyNumberNull(reply: number | null): number | null { - return reply; -} - -export function transformReplyNumberArray(reply: Array): Array { - return reply; -} - -export function transformReplyNumberNullArray(reply: Array): Array { - return reply; -} - -export function transformReplyString(reply: string): string { - return reply; -} - -export function transformReplyStringNull(reply: string | null): string | null { - return reply; -} - -export function transformReplyStringArray(reply: Array): Array { - return reply; -} - -export function transformReplyStringArrayNull(reply: Array | null): Array | null { - return reply; -} - -export function transformReplyStringNullArray(reply: Array): Array { - return reply; -} +import { RedisCommandArguments } from '.'; export function transformReplyBoolean(reply: number): boolean { return reply === 1; @@ -46,16 +10,6 @@ export function transformReplyBooleanArray(reply: Array): Array export type BitValue = 0 | 1; -export function transformReplyBit(reply: BitValue): BitValue { - return reply; -} - -export function transformReplyBufferNull(reply: Buffer | null): Buffer | null { - return reply; -} - -export function transformReplyVoid(): void {} - export interface ScanOptions { MATCH?: string; COUNT?: number; @@ -250,12 +204,10 @@ export function pushGeoSearchArguments( args.push('BYBOX', by.width.toString(), by.height.toString()); } - if (by.unit) { - args.push(by.unit); - } + args.push(by.unit); if (options?.SORT) { - args.push(options?.SORT); + args.push(options.SORT); } pushGeoCountArgument(args, options?.COUNT); @@ -356,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 { @@ -366,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 { @@ -376,10 +328,86 @@ 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); return pushVerdictArgument(args, value); } + +export enum CommandFlags { + WRITE = 'write', // command may result in modifications + READONLY = 'readonly', // command will never modify keys + DENYOOM = 'denyoom', // reject command if currently out of memory + ADMIN = 'admin', // server admin command + PUBSUB = 'pubsub', // pubsub-related command + NOSCRIPT = 'noscript', // deny this command from scripts + RANDOM = 'random', // command has random results, dangerous for scripts + SORT_FOR_SCRIPT = 'sort_for_script', // if called from script, sort output + LOADING = 'loading', // allow command while database is loading + STALE = 'stale', // allow command while replica has stale data + SKIP_MONITOR = 'skip_monitor', // do not show this command in MONITOR + ASKING = 'asking', // cluster related - accept even if importing + FAST = 'fast', // command operates in constant or log(N) time. Used for latency monitoring. + MOVABLEKEYS = 'movablekeys' // keys have no pre-determined position. You must discover keys yourself. +} + +export enum CommandCategories { + KEYSPACE = '@keyspace', + READ = '@read', + WRITE = '@write', + SET = '@set', + SORTEDSET = '@sortedset', + LIST = '@list', + HASH = '@hash', + STRING = '@string', + BITMAP = '@bitmap', + HYPERLOGLOG = '@hyperloglog', + GEO = '@geo', + STREAM = '@stream', + PUBSUB = '@pubsub', + ADMIN = '@admin', + FAST = '@fast', + SLOW = '@slow', + BLOCKING = '@blocking', + DANGEROUS = '@dangerous', + CONNECTION = '@connection', + TRANSACTION = '@transaction', + SCRIPTING = '@scripting' +} + +export type CommandRawReply = [ + name: string, + arity: number, + flags: Array, + firstKeyIndex: number, + lastKeyIndex: number, + step: number, + categories: Array +]; + +export type CommandReply = { + name: string, + arity: number, + flags: Set, + firstKeyIndex: number, + lastKeyIndex: number, + step: number, + categories: Set +}; + +export function transformCommandReply( + this: void, + [name, arity, flags, firstKeyIndex, lastKeyIndex, step, categories]: CommandRawReply +): CommandReply { + return { + name, + arity, + flags: new Set(flags), + firstKeyIndex, + lastKeyIndex, + step, + categories: new Set(categories) + }; +} diff --git a/lib/commands/index.ts b/lib/commands/index.ts index 89581090e58..f88d777c892 100644 --- a/lib/commands/index.ts +++ b/lib/commands/index.ts @@ -1,756 +1,19 @@ -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 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 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, - 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, - 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 : RedisCommandRawReply; + export interface RedisCommands { [command: string]: RedisCommand; } @@ -762,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 be16f9b9133..3089d468d65 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 52ecfb94b1c..7e9667cd518 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', () => { - describe('exec', () => { - it('simple', async () => { - const multi = RedisMultiCommand.create((queue, symbol) => { - assert.deepEqual( - queue.map(({ args }) => args), - [ - ['MULTI'], - ['PING'], - ['EXEC'], - ] - ); + it('generateChainId', () => { + assert.equal( + typeof RedisMultiCommand.generateChainId(), + 'symbol' + ); + }); - assert.equal( - typeof symbol, - 'symbol' - ); + it('addCommand', () => { + const multi = new RedisMultiCommand(); + multi.addCommand(['PING']); - return Promise.resolve(['QUEUED', 'QUEUED', ['PONG']]); - }); + assert.deepEqual( + multi.queue[0].args, + ['PING'] + ); + }); - multi.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'] + ); + }); - assert.deepEqual( - await multi.exec(), - ['PONG'] + describe('exec', () => { + 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 a329a5dbf19..d66974a5a21 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 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 - }); - } - - 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(); +export default class RedisMultiCommand { + static generateChainId(): symbol { + return Symbol('RedisMultiCommand Chain Id'); } - #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); - } - } + readonly queue: Array = []; - #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); - } + readonly scriptsInUse = new Set(); - commandsExecutor(command: RedisCommand, args: Array): this { - return this.addCommand( - command.transformArguments(...args), - command.transformReply - ); + addCommand(args: RedisCommandArguments, transformReply?: RedisCommand['transformReply']): void { + this.queue.push({ + args, + 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 713a1a3434a..978940ff93d 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, { RedisClusterType } from './cluster'; +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; @@ -248,9 +246,13 @@ async function spawnPasswordServer(): Promise { } async function spawnOpenCluster(): Promise { - TEST_REDIS_CLUSTERES[TestRedisClusters.OPEN] = (await spawnGlobalRedisCluster(TestRedisClusters.OPEN, 3)).map(port => ({ - port - })); + TEST_REDIS_CLUSTERES[TestRedisClusters.OPEN] = { + rootNodes: (await spawnGlobalRedisCluster(TestRedisClusters.OPEN, 3)).map(port => ({ + socket: { + port + } + })) + }; } before(function () { @@ -314,9 +316,7 @@ export function itWithCluster( it(title, async function () { if (handleMinimumRedisVersion(this, options?.minimumRedisVersion)) return; - const cluster = RedisCluster.create({ - rootNodes: TEST_REDIS_CLUSTERES[type] - }); + const cluster = RedisCluster.create(TEST_REDIS_CLUSTERES[type]); await cluster.connect(); @@ -337,7 +337,9 @@ export function itWithDedicatedCluster(title: string, fn: (cluster: RedisCluster const spawnResults = await spawnRedisCluster(null, 3), cluster = RedisCluster.create({ rootNodes: [{ - port: spawnResults[0].port + socket: { + port: spawnResults[0].port + } }] }); diff --git a/package-lock.json b/package-lock.json index 9fcd62b5996..f47208d6c9d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "redis", - "version": "4.0.0-rc.2", + "version": "4.0.0-rc.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "redis", - "version": "4.0.0-rc.2", + "version": "4.0.0-rc.3", "license": "MIT", "dependencies": { "cluster-key-slot": "1.1.0", @@ -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.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-10.0.0.tgz", - "integrity": "sha512-k1iO2zKuEjjRS1EJb4FwSLk+iF6EGp+ZV0OMRViQoWhQ1fZTk9hg1xccZII5uyYoiqcbC73MRBmT45y1vp2PPg==", + "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.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.16.0.tgz", - "integrity": "sha512-8YYzALPMvEZ35kgy5pdYvQ22Roz+BIuEaedO575GwE2vb/ACDqQn0xQrTJR4tnZCJn7pi8+AWPVjrFDaERIyXQ==", + "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.26.0" + "@octokit/types": "^6.34.0" }, "peerDependencies": { "@octokit/core": ">=2" @@ -680,12 +681,12 @@ } }, "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "5.10.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.10.4.tgz", - "integrity": "sha512-Dh+EAMCYR9RUHwQChH94Skl0lM8Fh99auT8ggck/xTzjJrwVzvsd0YH68oRPqp/HxICzmUjLfaQ9sy1o1sfIiA==", + "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.28.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.26.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.26.0.tgz", - "integrity": "sha512-RDxZBAFMtqs1ZPnbUu1e7ohPNfoNhTiep4fErY7tZs995BeHu369Vsh5woMIaFbllRWEZBfvTCS4hvDnMPiHrA==", + "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.0.0" + "@octokit/openapi-types": "^11.2.0" } }, "node_modules/@sindresorhus/is": { @@ -855,9 +856,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "16.7.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.7.10.tgz", - "integrity": "sha512-S63Dlv4zIPb8x6MMTgDq5WWRJQe56iBEY0O3SOFA9JrRienkOVDXSXBjjJw6HTNQYSE2JI6GMCR6LVbIMHJVvA==", + "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": { @@ -876,9 +877,9 @@ } }, "node_modules/@types/sinon": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.3.tgz", - "integrity": "sha512-XUaFuUOQ3A/r6gS1qCU/USMleascaqGeQpGR1AZ5JdRtBPlzijRzKsik1TuGzvdtPA0mdq42JqaJmJ+Afg1LJg==", + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.4.tgz", + "integrity": "sha512-fOYjrxQv8zJsqOY6V6ecP4eZhQBxtY80X0er1VVnUIAIZo74jHm8e1vguG5Yt4Iv8W2Wr7TgibB8MfRe32k9pA==", "dev": true, "dependencies": { "@sinonjs/fake-timers": "^7.1.0" @@ -937,62 +938,12 @@ } }, "node_modules/ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", - "dev": true, - "dependencies": { - "string-width": "^3.0.0" - } - }, - "node_modules/ansi-align/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-align/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/ansi-align/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ansi-align/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-align/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "dev": true, "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" + "string-width": "^4.1.0" } }, "node_modules/ansi-colors": { @@ -1249,16 +1200,16 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.0.tgz", - "integrity": "sha512-g2BJ2a0nEYvEFQC208q8mVAhfNwpZ5Mu8BwgtCdZKO3qx98HChmeg448fPdUzld8aFmfLgVh7yymqV+q1lJZ5g==", + "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.30001254", - "colorette": "^1.3.0", - "electron-to-chromium": "^1.3.830", + "caniuse-lite": "^1.0.30001264", + "electron-to-chromium": "^1.3.857", "escalade": "^3.1.1", - "node-releases": "^1.1.75" + "node-releases": "^1.1.77", + "picocolors": "^0.2.1" }, "bin": { "browserslist": "cli.js" @@ -1390,9 +1341,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001259", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001259.tgz", - "integrity": "sha512-V7mQTFhjITxuk9zBpI6nYsiTXhcPe05l+364nZjK7MFK/E7ibvYBSAXr4YcA6oPR8j3ZLM/LN+lUqUVAQEUZFg==", + "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", @@ -1494,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" @@ -1569,12 +1520,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", - "dev": true - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -1671,9 +1616,9 @@ } }, "node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -1845,9 +1790,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.3.827", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.827.tgz", - "integrity": "sha512-ye+4uQOY/jbjRutMcE/EmOcNwUeo1qo9aKL2tPyb09cU3lmxNeyDF4RWiemmkknW+p29h7dyDqy02higTxc9/A==", + "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": { @@ -2679,9 +2624,9 @@ } }, "node_modules/is-core-module": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", - "integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.7.0.tgz", + "integrity": "sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -2724,9 +2669,9 @@ } }, "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "dependencies": { "is-extglob": "^2.1.1" @@ -2999,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", @@ -3220,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" @@ -3317,16 +3262,16 @@ "dev": true }, "node_modules/mocha": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.1.tgz", - "integrity": "sha512-0wE74YMgOkCgBUj8VyIDwmLUjTsS13WV1Pg7l0SHea2qzZzlq7MDnfbPsHKcELBRk3+izEVkRofjmClpycudCA==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.2.tgz", + "integrity": "sha512-ta3LtJ+63RIBP03VBjMGtSqbe6cWXRejF9SyM9Zyli1CKZJZ+vfCTj3oW24V7wAphMJdpOFLoMI3hjJ1LWbs0w==", "dev": true, "dependencies": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", "chokidar": "3.5.2", - "debug": "4.3.1", + "debug": "4.3.2", "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", @@ -3337,12 +3282,11 @@ "log-symbols": "4.1.0", "minimatch": "3.0.4", "ms": "2.1.3", - "nanoid": "3.1.23", + "nanoid": "3.1.25", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", "which": "2.0.2", - "wide-align": "1.1.3", "workerpool": "6.1.5", "yargs": "16.2.0", "yargs-parser": "20.2.4", @@ -3373,9 +3317,9 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.1.23", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", - "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", + "version": "3.1.25", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", + "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", "dev": true, "bin": { "nanoid": "bin/nanoid.cjs" @@ -3425,9 +3369,9 @@ } }, "node_modules/node-fetch": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.4.tgz", - "integrity": "sha512-aD1fO+xtLiSCc9vuD+sYMxpIuQyhHscGSkBEo2o5LTV/3bTEAYvdUii29n8LlO5uLCmWdGP7uVUVXFo5SRdkLA==", + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz", + "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==", "dev": true, "dependencies": { "whatwg-url": "^5.0.0" @@ -3449,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": { @@ -4113,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", @@ -4210,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", @@ -4475,23 +4416,6 @@ "node": ">=10" } }, - "node_modules/release-it/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/release-it/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -4504,12 +4428,6 @@ "node": ">=10" } }, - "node_modules/release-it/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "node_modules/release-it/node_modules/semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -4687,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" @@ -4782,9 +4700,9 @@ } }, "node_modules/shiki": { - "version": "0.9.10", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.10.tgz", - "integrity": "sha512-xeM7Oc6hY+6iW5O/T5hor8ul7mEprzyl5y4r5zthEHToQNw7MIhREMgU3r2gKDB0NaMLNrkcEQagudCdzE13Lg==", + "version": "0.9.11", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.11.tgz", + "integrity": "sha512-tjruNTLFhU0hruCPoJP0y+B9LKOmcqUhTpxn7pcJB3fa+04gFChuEmxmrUfOJ7ZO6Jd+HwMnDHgY3lv3Tqonuw==", "dev": true, "dependencies": { "jsonc-parser": "^3.0.0", @@ -4807,9 +4725,9 @@ } }, "node_modules/signal-exit": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.4.tgz", - "integrity": "sha512-rqYhcAnZ6d/vTPGghdrw7iumdcbXpsk1b8IG/rz+VWV51DM0p7XCtMoJ3qhPLIbp3tvyt3pKRbaaEMZYpHto8Q==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", + "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==", "dev": true }, "node_modules/sinon": { @@ -4950,26 +4868,26 @@ ] }, "node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, "node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" @@ -5089,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", @@ -5114,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", @@ -5175,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" @@ -5199,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": { @@ -5433,58 +5356,6 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "node_modules/wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2" - } - }, - "node_modules/wide-align/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", @@ -5728,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" @@ -5743,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", @@ -5766,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" } @@ -5836,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", @@ -5983,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": { @@ -6033,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" @@ -6206,18 +6077,18 @@ } }, "@octokit/openapi-types": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-10.0.0.tgz", - "integrity": "sha512-k1iO2zKuEjjRS1EJb4FwSLk+iF6EGp+ZV0OMRViQoWhQ1fZTk9hg1xccZII5uyYoiqcbC73MRBmT45y1vp2PPg==", + "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.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.16.0.tgz", - "integrity": "sha512-8YYzALPMvEZ35kgy5pdYvQ22Roz+BIuEaedO575GwE2vb/ACDqQn0xQrTJR4tnZCJn7pi8+AWPVjrFDaERIyXQ==", + "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.26.0" + "@octokit/types": "^6.34.0" } }, "@octokit/plugin-request-log": { @@ -6228,19 +6099,19 @@ "requires": {} }, "@octokit/plugin-rest-endpoint-methods": { - "version": "5.10.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.10.4.tgz", - "integrity": "sha512-Dh+EAMCYR9RUHwQChH94Skl0lM8Fh99auT8ggck/xTzjJrwVzvsd0YH68oRPqp/HxICzmUjLfaQ9sy1o1sfIiA==", + "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.28.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", @@ -6275,12 +6146,12 @@ } }, "@octokit/types": { - "version": "6.28.1", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.28.1.tgz", - "integrity": "sha512-XlxDoQLFO5JnFZgKVQTYTvXRsQFfr/GwDUU108NJ9R5yFPkA2qXhTJjYuul3vE4eLXP40FA2nysOu2zd6boE+w==", + "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.2.2" + "@octokit/openapi-types": "^11.2.0" } }, "@sindresorhus/is": { @@ -6391,9 +6262,9 @@ "dev": true }, "@types/node": { - "version": "16.9.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.6.tgz", - "integrity": "sha512-YHUZhBOMTM3mjFkXVcK+WwAcYmyhe1wL4lfqNtzI0b3qAy7yuSetnM7QJazgE5PFmgVTNGiLOgRFfJMqW7XpSQ==", + "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": { @@ -6412,9 +6283,9 @@ } }, "@types/sinon": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.3.tgz", - "integrity": "sha512-XUaFuUOQ3A/r6gS1qCU/USMleascaqGeQpGR1AZ5JdRtBPlzijRzKsik1TuGzvdtPA0mdq42JqaJmJ+Afg1LJg==", + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.4.tgz", + "integrity": "sha512-fOYjrxQv8zJsqOY6V6ecP4eZhQBxtY80X0er1VVnUIAIZo74jHm8e1vguG5Yt4Iv8W2Wr7TgibB8MfRe32k9pA==", "dev": true, "requires": { "@sinonjs/fake-timers": "^7.1.0" @@ -6461,52 +6332,12 @@ } }, "ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "dev": true, "requires": { - "string-width": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } + "string-width": "^4.1.0" } }, "ansi-colors": { @@ -6696,16 +6527,16 @@ "dev": true }, "browserslist": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.0.tgz", - "integrity": "sha512-g2BJ2a0nEYvEFQC208q8mVAhfNwpZ5Mu8BwgtCdZKO3qx98HChmeg448fPdUzld8aFmfLgVh7yymqV+q1lJZ5g==", + "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.30001254", - "colorette": "^1.3.0", - "electron-to-chromium": "^1.3.830", + "caniuse-lite": "^1.0.30001264", + "electron-to-chromium": "^1.3.857", "escalade": "^3.1.1", - "node-releases": "^1.1.75" + "node-releases": "^1.1.77", + "picocolors": "^0.2.1" } }, "buffer": { @@ -6791,9 +6622,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001259", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001259.tgz", - "integrity": "sha512-V7mQTFhjITxuk9zBpI6nYsiTXhcPe05l+364nZjK7MFK/E7ibvYBSAXr4YcA6oPR8j3ZLM/LN+lUqUVAQEUZFg==", + "version": "1.0.30001265", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001265.tgz", + "integrity": "sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw==", "dev": true }, "chalk": { @@ -6867,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": { @@ -6924,12 +6755,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", - "dev": true - }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -7011,9 +6836,9 @@ "dev": true }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dev": true, "requires": { "ms": "2.1.2" @@ -7139,9 +6964,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.827", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.827.tgz", - "integrity": "sha512-ye+4uQOY/jbjRutMcE/EmOcNwUeo1qo9aKL2tPyb09cU3lmxNeyDF4RWiemmkknW+p29h7dyDqy02higTxc9/A==", + "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": { @@ -7737,9 +7562,9 @@ } }, "is-core-module": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", - "integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.7.0.tgz", + "integrity": "sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ==", "dev": true, "requires": { "has": "^1.0.3" @@ -7764,9 +7589,9 @@ "dev": true }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "requires": { "is-extglob": "^2.1.1" @@ -7968,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", @@ -8143,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": { @@ -8213,16 +8038,16 @@ "dev": true }, "mocha": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.1.tgz", - "integrity": "sha512-0wE74YMgOkCgBUj8VyIDwmLUjTsS13WV1Pg7l0SHea2qzZzlq7MDnfbPsHKcELBRk3+izEVkRofjmClpycudCA==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.2.tgz", + "integrity": "sha512-ta3LtJ+63RIBP03VBjMGtSqbe6cWXRejF9SyM9Zyli1CKZJZ+vfCTj3oW24V7wAphMJdpOFLoMI3hjJ1LWbs0w==", "dev": true, "requires": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", "chokidar": "3.5.2", - "debug": "4.3.1", + "debug": "4.3.2", "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", @@ -8233,12 +8058,11 @@ "log-symbols": "4.1.0", "minimatch": "3.0.4", "ms": "2.1.3", - "nanoid": "3.1.23", + "nanoid": "3.1.25", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", "which": "2.0.2", - "wide-align": "1.1.3", "workerpool": "6.1.5", "yargs": "16.2.0", "yargs-parser": "20.2.4", @@ -8258,9 +8082,9 @@ "dev": true }, "nanoid": { - "version": "3.1.23", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", - "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", + "version": "3.1.25", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", + "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", "dev": true }, "neo-async": { @@ -8300,9 +8124,9 @@ } }, "node-fetch": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.4.tgz", - "integrity": "sha512-aD1fO+xtLiSCc9vuD+sYMxpIuQyhHscGSkBEo2o5LTV/3bTEAYvdUii29n8LlO5uLCmWdGP7uVUVXFo5SRdkLA==", + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz", + "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==", "dev": true, "requires": { "whatwg-url": "^5.0.0" @@ -8318,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": { @@ -8836,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", @@ -8905,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", @@ -9101,15 +8925,6 @@ "yargs-parser": "20.2.9" }, "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -9119,12 +8934,6 @@ "yallist": "^4.0.0" } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -9247,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" @@ -9324,9 +9133,9 @@ } }, "shiki": { - "version": "0.9.10", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.10.tgz", - "integrity": "sha512-xeM7Oc6hY+6iW5O/T5hor8ul7mEprzyl5y4r5zthEHToQNw7MIhREMgU3r2gKDB0NaMLNrkcEQagudCdzE13Lg==", + "version": "0.9.11", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.11.tgz", + "integrity": "sha512-tjruNTLFhU0hruCPoJP0y+B9LKOmcqUhTpxn7pcJB3fa+04gFChuEmxmrUfOJ7ZO6Jd+HwMnDHgY3lv3Tqonuw==", "dev": true, "requires": { "jsonc-parser": "^3.0.0", @@ -9346,9 +9155,9 @@ } }, "signal-exit": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.4.tgz", - "integrity": "sha512-rqYhcAnZ6d/vTPGghdrw7iumdcbXpsk1b8IG/rz+VWV51DM0p7XCtMoJ3qhPLIbp3tvyt3pKRbaaEMZYpHto8Q==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", + "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==", "dev": true }, "sinon": { @@ -9456,23 +9265,23 @@ } }, "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } }, "strip-bom": { @@ -9556,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", @@ -9611,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" @@ -9806,48 +9622,6 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, "widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", diff --git a/package.json b/package.json index b2ceadbdd16..7f8720f47bf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redis", - "version": "4.0.0-rc.2", + "version": "4.0.0-rc.3", "description": "A high performance Redis client.", "keywords": [ "database", @@ -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 deebc9f1252..1f76310034d 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"